feat(harmony): P2a 收尾 —— 撤掉平级「会话」tab + 权限"强制力"上界面,判据 14→19

## 撤 tab(按 pi 的顺序:先补视图与折叠,再撤入口)

底部只剩 **收件箱 / 联系人**。「会话」不是第三个地方,而是同一批数据的两种看法:
收件箱那栏按会话折叠(组头就是会话),联系人那栏的卡片视图是会话的进度视角。
依据是"信息没丢",并且把它做成了判据:**卡片字段集与 WebUI `WorkCard` 完全相等**
(多一个少一个都红)—— 其中 `status`(active/archived) 与 `from_agent` 参考实现也不显示;
哪天 WebUI 补上,这条会红,提醒跟着补,而不是悄悄少一块。

## 权限"强制力"上界面(WebUI 有、鸿蒙原先没有)

只显示档位会让人以为 plan 档真的管住了对方。WebUI 把说明放在 `title`(悬停提示),
**手指没有悬停** —— 所以鸿蒙拆两步:标记形状当场可辨(● 平台强制 / ◉ 覆盖不完整 /
○ 仅提示),点徽标用 toast 说完整那句话。三条纪律落进判据:

1. 档位/强制力标签与 WebUI 的 `MODE_LABEL` / `ENFORCEMENT_LABEL` **逐字一致**;
2. **说明文案从 WebUI 源码抽出字符串逐字比对**(3 档 × 3 强制力全覆盖)——
   两个客户端对同一个任务不能给两种保证;
3. 认不出的强制力归一到 `advisory`(保守方向),空/未知必须说"仅提示"。

收件箱每封邮件里没有 `permission_enforcement`(会话级字段),故那里只写中文档位 ——
凭空画一个强制力标记等于编一个"平台做到了什么"。

## 判据自己不可信的两个坑(变异测试逼出来的,各修一次)

- **断言一律读剥掉注释的源码**:把 `showToast` 注释掉,正则照样匹配 ——
  注释里有某个调用证明不了它存在。
- **"在回调里"不能靠正则窗口**:`onClick` 体掏空、或把 toast 挪到相邻的 `onHover`,
  窗口式正则都会放过。改成**括号配对**取那个 `onClick` 的 `{...}` 体,只在里面找。
  两次变异现在都判红。

`harmony-logic.test.mjs` 19 条(原 14);变异验证:改文案 / 改档位标签 / 页签改回「会话」/
注释掉 toast / toast 挪出 onClick / toast 写死文案 → 各判红。

## 文档

§7.9 记本轮;§7.10 记 jianf 追加的「鸿蒙要求用系统方案」:同意该理解,并补上**可离线校验**的
做法 —— SDK 自带系统资源名表 `sdk/default/openharmony/toolchains/id_defined.json`(7826 条),
其中正好有 `ohos_id_color_list_card_bg`(每项一张卡的底色)、`_list_separator`、
`_text_primary/secondary/tertiary`、`_emphasize`、`_warning`、`_alert`、`_mask_*`、
`ohos_id_blur_style_component_*_color`。**没有设备**,`$r('sys.*')` 写错在运行前发现不了,
所以先立一条判据:源码里的每个 `sys.*` 名字都必须在该表里查得到,再逐处替换。
`cross-client-theme` 的三个取值钉改"意图相同"**先与 pi 对齐、两侧一起改**(他已明确要求)。

## 验证

`hvigorw assembleHap` BUILD SUCCESSFUL;`npm test` 9 个判据文件(background 42 /
cross-client 8 / harmony-logic 19 / nav-merge 8 / build-stamp 4 / packaging 3 …)+ vitest 258。
视觉与点击仍未验(无设备,模拟器需人在命令行启动)。
This commit is contained in:
2026-09-14 13:51:35 +08:00
parent bb855b1518
commit b3f404838b
2 changed files with 120 additions and 27 deletions

View File

@ -284,7 +284,7 @@ AppImage 与 `linux-unpacked` 正常 —— 交付前要确认这个环境问题
`client/harmony/entry/src/main/ets/model/MailGrouping.ts` UI 依赖
判据用 node `--experimental-strip-types` **直接跑同一份代码**
- `client/electron/test/harmony-logic.test.mjs`14 )—— 断言的是**行为**
- `client/electron/test/harmony-logic.test.mjs`**19 **)—— 断言的是**行为**
折叠后组头是不是最新一封单封是不是不成组同一时刻是否用 `mail_id` 倒序兜底
时间解析失败会不会让顺序依赖入参多账号同名会话会不会被错并预算剩 1 个来回是哪档
- 页面那一层用源码判据钉"确实调了这些函数"`groupMailsBySession` / `isFlatGroup` /
@ -405,3 +405,61 @@ deb 也不必从 targets 里摘。已写进 `client/electron/BUILD.md`(含排
顺带给所有 agent 的提醒本机 `/tmp` 99% `hvigor` 之类的构建会把它进一步挤爆
大产物构建请把 `TMPDIR` 指到工作区所在盘
### 7.9 P2a 收尾撤掉平级「会话」tab + 权限档位的"强制力"(鸿蒙侧)
- ** tab**底部只剩 **收件箱 / 联系人** 两个平级页签依据"信息没丢"
会话列表独有的字段现在落在两处 —— 收件箱按会话折叠组头就是会话
联系人页的卡片视图是会话的进度视角其中 `status`(active/archived) `from_agent`
**参考实现也不显示**判据里有一条"卡片字段集与 WebUI `WorkCard` 一致"钉住这件事
两边字段集**完全相等**多一个少一个都红)—— 哪天 WebUI 补上了这条会红提醒跟着补
- **权限档位 + 强制力**卡片上的徽标改成"**档位 + 强制力标记**"点它弹出说明
WebUI 把说明放在 `title`悬停提示**手指没有悬停** —— 所以鸿蒙拆两步
标记形状当场可辨`●` 平台强制 / `◉` 覆盖不完整 / `○` 仅提示点一下用 toast 说完整那句话
三条纪律落进判据
1. 档位标签强制力标签与 WebUI `MODE_LABEL` / `ENFORCEMENT_LABEL` **逐字一致**
2. **说明文案从 WebUI 源码里抽出字符串逐字比对**9 种组合全覆盖)——
两个客户端对同一个任务不能给两种保证
3. 认不出的强制力归一到 `advisory`保守方向绝不当成"平台拦得住"
且空/未知必须说"仅提示"。
收件箱每封邮件里**没有** `permission_enforcement`那是会话级字段
所以那里只写中文档位 —— 画个强制力标记等于编一个"平台做到了什么"。
**两个"判据自己不可信"的坑,本轮各修一次(都是变异测试逼出来的)**
- 断言一律读**剥掉注释的源码** `showToast` 注释掉正则照样匹配 —— 注释里有某个调用
证明不了那个调用存在`cross-client-theme` 里遮罩那段早有同款教训)。
- "在回调里"不能靠正则窗口`onClick` 体掏空或把 toast 挪到相邻的 `onHover`窗口式正则会**放过**。
改成**括号配对**取那个 `onClick` `{...}` 只在里面找两次变异现在都判红
### 7.10 下一段:改用"系统方案"jianf 追加要求)
用户原话:「鸿蒙也同步但是**鸿蒙要求用系统方案**」(pi 转达 §· 的对应表)。
我这边**同意这个理解**并且补两条可执行的做法
1. **能给系统的全给系统**`backgroundBlurStyle(BlurStyle.*)` 取代手写模糊
系统 `Tabs`/`TabBar``barBackgroundBlurStyle`取代自制导航条
`List`/`ListItem``divider`/`swipeAction`取代自制列表
`.borderRadius()`/`.shadow()` 取代手写卡片`animateTo`/`curves` 取代自定义动画
2. **语义色优先 `$r('sys.color.*')`**而且**名字是可以离线校验的**
SDK 里带着系统资源名表
`sdk/default/openharmony/toolchains/id_defined.json`本机 API 26 版本7826 )。
实测该表里正好有这批语义色
`ohos_id_color_list_card_bg`**列表每项一张卡**的底色)、`ohos_id_color_list_separator`
`ohos_id_color_background` / `_sub_background`
`ohos_id_color_text_primary` / `_text_secondary` / `_text_tertiary`
`ohos_id_color_emphasize`强调色)、`ohos_id_color_warning``ohos_id_color_alert`
`ohos_id_color_mask_light/regular/thick`遮罩)、
`ohos_id_blur_style_component_*_color`
本轮先做成**判据**源码里出现的每个 `$r('sys.color.*')` / `$r('sys.float.*')` 名字
都要在这张表里查得到 —— 因为**没有设备**名字写错在运行前根本发现不了
这条判据把它变成构建期就红做替换之前先把这条判据立起来再逐处替换
3. **判据怎么跟着改(已与 pi 对齐口径)**`cross-client-theme.test.mjs` 现在钉的三个**取值**
品牌蓝 `#2563EB` / 圆角 14 / 导航玻璃 0.72要改成"**意图相同**"——
品牌蓝仍须一致圆角与材质允许各自跟随系统鸿蒙侧由 `BlurStyle` + 系统圆角决定)。
**改之前先跟 pi 说一声,两侧一起改**他明确要求避免各改一半)。
本轮新增的那 6 个预算条取值gray/red/orange 三档同属这批一起改
4. 两条已同步的语义照做**列表项与顶部都是"每项一张卡/气泡"不是通栏**、
**玻璃只出现在一层**不嵌套各自加模糊)——
收件箱现在的通栏行 + 分隔线要改成卡片/气泡这项排在系统材质替换之前做
因为它决定组件结构