feat(harmony): P2b+P3 —— 「收件箱」改成「通信」(内部三栏 + 徽标 + 悬浮加号),发件箱与授权栏落地
用户:「收件发件授权改为一个导航项,通过内部导航区分,然后新建作为他们内部的一个悬浮的圆形加号」。 所以这一期不是"再加两个页面",而是对齐信息架构。 ## 鸿蒙侧 - 底部第一项 **收件箱 → 通信**(`CommPage`),内部三栏 收件箱 / 发件箱 / 授权; 页签下划线式(不是浮动白胶囊 —— WebUI 侧用户原话「通信页面的二级页面与其他位置极其割裂」)。 - **徽标**:收件箱红(未读)、授权橙(**待决策**)、发件箱无;0 不显示,>99 写 `99+`。 合并成一个导航项后,底部看不到"授权有 3 个在等我",这个信息不能丢 —— 它比未读更急。 - **悬浮圆形加号**挂到通信页这一层(三个栏都要能新建);`⚙` 也搬上来(否则切栏就够不到设置)。 - **收件箱不再混权限邮件**(`splitByPermission`),未读按筛后算 —— WebUI 实测过"一个会话 17 封权限邮件挤掉另外两个会话"。 - **发件箱**:`GET /me/mail/sent`,与收件箱同构(同一套折叠/行),行上主角是**收件人**; 空态有说明(主句与 WebUI 逐字一致「暂无邮件」+ 一句"这里放什么")。 - **授权栏**(P3 主体):`GET /permission/pending`(不从收件箱筛)+ `POST /permission/decide`。 拒绝**可填备注且备注真的送出**;请求**过期**时当场说清「审批不会让那次调用继续」。 - 顺手删掉死代码:收件箱里「写邮件」的 `bindSheet`(`composeVisible` 从未置 true,谁也打不开)。 ## 判据(harmony-logic 19 → 28 条) 页签键/顺序从 WebUI 源码抽取比对(`uiStore.ts` 的 `CommTab` + `CommTabs.tsx` 的 `TABS`); 页签状态机(键↔下标往返、脏键/越界/非整数 → 回收件箱);徽标规则(数字来源、0 不显示、 99+ 上限、红/橙与 WebUI 类名对应);分家语义(决策过的不再算待决策、空串与 null 同义); 三栏空态互不相同且主句与 WebUI 一致;接线(三个 pane 真的渲染、加号是圆形且在通信页、 "先分家再折叠"、接口路径与决策体三字段、拒绝传备注、过期分支)。 判据抓到一个**真 bug**:`commTabFromIndex` 只判范围,`1.5` → `COMM_TABS[1.5]` = `undefined` (表现"点哪都不亮")。已加 `Number.isInteger`。 变异验证(六种):授权徽标看未读 / 权限邮件不分出去 / 类型名拼错 / 决策过仍算待决策 / 收件箱不分家 / 发件箱空态去掉说明 —— 全部判红。 ## 排序说明 **日历暂时没有入口**:P6 的内容(网格 + 事件读写 + 滑动翻页)还没做, 先放一个点进去空着的入口比暂时没有更糟 —— 有意排序,记在 §7.15 以免被当成漏做。 ## 验证 / 未验 `hvigorw assembleHap` BUILD SUCCESSFUL;`npm test` 退出码 0(10 个判据文件全绿 + vitest 258/258)。 **未验**:页签/徽标/悬浮加号在真机上的观感与点击 —— 需设备或模拟器(模拟器要人在命令行启动)。
This commit is contained in:
@ -557,3 +557,50 @@ SDK 里写着:`@ohos.promptAction.d.ts` 的全局 `showToast` 标 `@deprecated
|
||||
|
||||
(同一批整理里还没做的:全局 `animateTo` 也要走 `getUIContext().animateTo(...)`,
|
||||
放到动效那一期一起改 —— 那一期本来就是"自定义 transition → 系统 `curves`"。)
|
||||
|
||||
### 7.15 P2b + P3 主体:把「收件箱」这一项改成「通信」(内部三栏 + 徽标)
|
||||
|
||||
用户(2026-09-14):「收件发件授权改为一个导航项,通过内部导航区分,然后新建作为他们
|
||||
内部的一个悬浮的圆形加号」。所以这一期不是"再加两个页面",而是**对齐信息架构**:
|
||||
|
||||
- 底部第一项从 **收件箱** 变成 **通信**(`CommPage`),内部三栏 **收件箱 / 发件箱 / 授权**;
|
||||
- 页签带**徽标**:收件箱红(未读)、授权橙(**待决策**)、发件箱无;>99 写 `99+`;
|
||||
- 选中态用**下划线**(不是浮动白胶囊)—— WebUI 侧用户原话是「通信页面的二级页面与其他位置极其割裂」;
|
||||
- **悬浮圆形加号**挂到通信页这一层(三个栏都要能新建),`⚙` 也搬到这一层
|
||||
(否则切到发件箱/授权就够不到设置);
|
||||
- **收件箱不再混权限邮件**:按 `splitByPermission` 分家,未读也按筛过之后算 ——
|
||||
WebUI 侧实测过"一个会话的 17 封权限邮件挤掉另外两个会话"。
|
||||
|
||||
**P3 主体(授权栏)**:`GET /permission/pending`(不从收件箱筛,理由见 §5.2①)、
|
||||
`POST /permission/decide`。两件如实说的事:**拒绝可填备注且备注必须送出**;
|
||||
**请求过期**时当场说明「审批不会让那次调用继续」—— 否则人会以为 Agent 接着跑了。
|
||||
|
||||
**顺带清掉一处死代码**:收件箱里那个「写邮件」`bindSheet` 的 `composeVisible`
|
||||
从来没被置为 true(**谁也打不开**),随新建入口改成悬浮加号一并删除。
|
||||
|
||||
**日历为什么还没有入口**:它的内容(P6:网格 + 事件读写 + 左右滑动翻页)还没做。
|
||||
先放一个点进去空着的入口,比暂时没有入口更糟 —— 所以等内容一起上。
|
||||
这是**有意排序**,不是漏做(记在这里以免被当成遗漏)。
|
||||
|
||||
**判据**(`harmony-logic.test.mjs`,28 条):
|
||||
|
||||
| 判据 | 说明 |
|
||||
|---|---|
|
||||
| 页签键与顺序 | 从 WebUI 的 `uiStore.ts` 抽出 `CommTab` 联合类型、从 `CommTabs.tsx` 抽出 `TABS` 标签,比**键集合与顺序**(两边不一致时"恢复上次页签"会悄悄退回) |
|
||||
| 页签状态机 | 键↔下标往返;认不出的键/越界下标/非整数 → 回收件箱(不落在空白 pane 上) |
|
||||
| 徽标 | 收件箱看未读、授权看**待决策**(不是权限邮件总数)、发件箱无;0 不显示;>99 写 `99+`;红/橙与 WebUI 的 `bg-red-600`/`bg-orange-700` 对应 |
|
||||
| 分家 | 权限邮件不进收件箱;**决策过的不再算待决策**(空串与 null 都算未决策);收件箱未读不含授权栏 |
|
||||
| 空态 | 主句与 WebUI 的「暂无邮件」逐字一致;三栏各有一句"为什么是空的",且三句互不相同 |
|
||||
| 接线 | 底部第一项是「通信」;三个 pane 都真的渲染;悬浮加号是圆形且在通信页这一层;收件箱"先分家再折叠";接口路径/决策体三个字段;拒绝要传 `noteText`;过期分支必须说清后果 |
|
||||
|
||||
**变异验证**:授权徽标改成看未读 → 红;权限邮件不分出去 → 红;类型名拼错
|
||||
(权限邮件全混进收件箱)→ 红;决策过的仍算待决策 → 红;收件箱不再分家 → 红 2 条;
|
||||
发件箱空态去掉说明 → 红。
|
||||
|
||||
**判据自己抓到的真 bug**:`commTabFromIndex` 原来只判范围,`1.5` 会走到
|
||||
`COMM_TABS[1.5]` → `undefined`(表现是"点哪都不亮")。范围检查挡不住非整数,
|
||||
已加 `Number.isInteger`。
|
||||
|
||||
**未验**:底部/内部页签在真机上的观感、悬浮加号的位置、徽标与文字的排版 ——
|
||||
仍然只有真机(或模拟器,需人在命令行启动)能看。已验证:构建成功、28 条判据全绿、
|
||||
六种变异都能判红。
|
||||
|
||||
Reference in New Issue
Block a user