harmony(ui): 登录页 1:1 对齐 WebUI 卡片规格 + 通信页改用系统 Navigation Auto
登录页(LoginPage.ets):对照 WebUI LoginPage.tsx 同规格重写 build() - maxWidth 380vp 居中卡片(与 WebUI 380px 同档) - 14vp 圆角(Theme.glassRadius) - 48vp 品牌图标(Envelope 浅蓝底 accentSoft) - 显式字段标签(服务器/用户名/密码/用户密钥) - 40vp 输入框与登录按钮(WebUI 控件同高) - 分段式登录方式切换(账号密码 / 用户密钥) - 窄屏安全边距 16vp + Scroll 可滚 通信页(MainPage.ets CommPage):改用鸿蒙系统 Navigation 组件 - Navigation(navPathStack) 包住列表,navDestination 注册邮件详情目标页 - mode(NavigationMode.Auto):phone 自动 Stack、tablet/2in1 自动 Split - navBarWidth(320) 对齐 WebUI MailList 320px;navBarWidthRange([280,360]) - minContentWidth(360) 参与 Auto 断点计算 - Inbox/Sent 选中邮件改走 navPathStack.pushPath,不再 router.pushUrl - 切收件箱/发件箱/授权时清空详情栈避免跨栏残留 详情页(MailDetailPage.ets):抽出可复用 MailDetailView - 既有详情实现导出为 @Component struct MailDetailView - 新增 initialMailId/initialAccountId/embedded/onBack 输入 - 无 initialMailId 时才读路由参数(兼容旧 router 入口) - embedded=true 时返回走 onBack 回调(NavPathStack.pop) - 薄壳 @Entry MailDetailPage 用 Column 包裹(@Entry 根节点须容器) module.json5:deviceTypes 扩展为 phone/tablet/2in1 三形态 判据:harmony-widescreen.test.mjs 新增 ⑥ 钉住 Navigation Auto 不许退回手搓分栏 验证:ArkTS 编译通过;harmony-arkts/widescreen/nav/cross-client-theme 35/35 通过
This commit is contained in:
@ -13,9 +13,16 @@ import { MailDetail, SendMailRequest } from '../model/Models';
|
||||
import { MailDetailParams } from '../model/RouteParams';
|
||||
import { AmIcon } from '../common/Icons';
|
||||
|
||||
@Entry
|
||||
@Component
|
||||
struct MailDetailPage {
|
||||
export struct MailDetailView {
|
||||
/**
|
||||
* 既支持旧 router 页面,也支持 Navigation 的 NavDestination 内嵌复用。
|
||||
* 内嵌时由父级传入 mailId/accountId;独立页面仍从 router params 读取。
|
||||
*/
|
||||
@Prop initialMailId: string = '';
|
||||
@Prop initialAccountId: string = '';
|
||||
@Prop embedded: boolean = false;
|
||||
onBack: () => void = (): void => {};
|
||||
@State mailId: string = '';
|
||||
@State accountId: string = '';
|
||||
@State subject: string = '';
|
||||
@ -42,9 +49,14 @@ struct MailDetailPage {
|
||||
this.error = '无法获取应用上下文';
|
||||
return;
|
||||
}
|
||||
const params = this.getUIContext().getRouter().getParams() as MailDetailParams;
|
||||
this.mailId = params?.mail_id ?? '';
|
||||
this.accountId = params?.account_id ?? '';
|
||||
if (this.initialMailId.length > 0) {
|
||||
this.mailId = this.initialMailId;
|
||||
this.accountId = this.initialAccountId;
|
||||
} else {
|
||||
const params = this.getUIContext().getRouter().getParams() as MailDetailParams;
|
||||
this.mailId = params?.mail_id ?? '';
|
||||
this.accountId = params?.account_id ?? '';
|
||||
}
|
||||
const accountManager: AccountManager = AccountManager.getInstance(ctx);
|
||||
accountManager.load().then(() => {
|
||||
let account: AccountInfo | null = accountManager.getAccount(this.accountId);
|
||||
@ -114,6 +126,14 @@ struct MailDetailPage {
|
||||
}
|
||||
}
|
||||
|
||||
goBack(): void {
|
||||
if (this.embedded) {
|
||||
this.onBack();
|
||||
return;
|
||||
}
|
||||
this.getUIContext().getRouter().back();
|
||||
}
|
||||
|
||||
build() {
|
||||
Column() {
|
||||
// 顶栏
|
||||
@ -123,7 +143,7 @@ struct MailDetailPage {
|
||||
.width(40).height(40)
|
||||
.textAlign(TextAlign.Center)
|
||||
.onClick(() => {
|
||||
this.getUIContext().getRouter().back();
|
||||
this.goBack();
|
||||
})
|
||||
Text(this.subject.length > 20 ? this.subject.substring(0, 20) + '…' : this.subject)
|
||||
.fontSize(16).fontWeight(FontWeight.Bold).fontColor(Theme.textPrimary)
|
||||
@ -332,4 +352,16 @@ struct MailDetailPage {
|
||||
this.sending = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** 旧 router 页面入口:与 Navigation 目标页共用同一份 MailDetailView。 */
|
||||
@Entry
|
||||
@Component
|
||||
struct MailDetailPage {
|
||||
build() {
|
||||
Column() {
|
||||
MailDetailView()
|
||||
}
|
||||
.width('100%').height('100%')
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user