跨端对齐:授权栏 navigator_only + 组件按页拆分 + 服务器补 permission_options
用户两项裁定落地(均为 ask_user 明确选择):
① 授权栏口径 = navigator_only(照 WebUI 架构)
· 新建 pages/PermissionPanel.ets —— 详情页的决策面板,
对应 MailView.tsx:693 的 PermissionPanel(审批型 / 主动提问 / 已处理 三态)
· 决策入口从授权栏移到 MailDetailPage;MailDetailPage 原来只显示一个
「权限请求」小标签、根本没有决策入口(比 WebUI 少一整块,且反了:
栏里能决策、点进详情反而不能)
· PermissionTab 删掉内联「同意/拒绝」+ 备注框 + decide():
整卡可点 → onOpenMail(对齐 WebUI PermissionList.tsx:81 的 pick())
· PermissionRequest 补 source_account_id(客户端侧记来源,跳详情要定位网关)
② 服务器补 permission_options —— 修一条真实的、跨端共有的缺口
· mails.permission_options 从 INSERT 起就写进去,但**从来没有任何读路径
选过它** ⇒ 详情端点永远返回空。WebUI 的决策面板读 mail.permission_options,
所以提问型的预设选项**两端全部落空**(审批型靠 ['同意','拒绝'] 兜底蒙混)
· GetMailByID 补选该列 + JSON 反序列化(与 cc_list 同款)
③ 组件按页封装(用户要求「以便与 WebUI 一一对应」)
MainPage.ets 4592 → 3192 行
· pages/PermissionTab.ets 720 行 ↔ PermissionList.tsx
· pages/ContactsTab.ets 796 行 ↔ ContactPanel.tsx
· pages/NavDestinations.ets 181 行 ↔ Navigation 壳
· pages/NavShared.ets 65 行 ↔ 跨栏共用件
④ 判据跟着组件搬家(否则静默失效,不是红)
harmony-logic 的 pageCode / harmony-nav 的 navSrc 改为显式文件名单;
harmony-appearance 的 PANE_SOURCES 补 ContactsTab;harmony-contacts 三个
test 并入 ContactsTab;harmony-logic 的决策断言改指 PermissionPanel,
并新增「授权栏不许再有内联决策」两条(navigator_only 的正形状)。
animation-audit:共享元素转场判据从「同文件共址」改为「按 id 找驱动」。
旧形状把 in/out 端必须在同一文件当成代理,而两端**天然在两处**;
抽出写信页(NavDestinations 持有 in 端)后误报。新判据仍要求每个 id
都有 Motion.morph 驱动 —— 变异实测:把驱动换成裸 animateTo 仍判红。
判据:files=34 checks=556 red=1(仅 build-stamp,产物待重构建)
This commit is contained in:
@ -152,6 +152,36 @@ const PAIRS = [
|
||||
latestMailId: g.latest?.mail_id ?? null,
|
||||
mailIds: (g.mails ?? []).map(m => m.mail_id),
|
||||
unreadCount: g.unreadCount
|
||||
})),
|
||||
/*
|
||||
* ★★ 2026-09-23 新增:`groupPermissions` 的双边投影。
|
||||
*
|
||||
* ── 为什么必须加这一条 ──
|
||||
* 上面那段注释(原文)说 "`groupPermissions` 不是改名了……
|
||||
* **已决策的授权记录在鸿蒙上完全看不到**",然后把
|
||||
* `harmony-permission-history` 登记进 `gaps`。2026-09-21 鸿蒙补上了
|
||||
* 这个函数,`gaps` 清空了 —— 但**从没有人把两边的 `groupPermissions`
|
||||
* 真正比过一次**:`gaps: []` 只意味着"名字都在",
|
||||
* 不意味着"行为一致"。
|
||||
*
|
||||
* 实际后果:我刚要对比时才发现,两边都在算 `path`,
|
||||
* 而鸿蒙那边是**硬编码空串**(`g.path = ''`,理由写着"MailLike 没这个字段"),
|
||||
* electron 是真取 `latest.session_workspace`。
|
||||
* ⇒ 鸿蒙的授权栏**永远显示不出 `agent@path`**。
|
||||
* 这不是"少一个导出",是**同一个函数两边算得不一样** ——
|
||||
* 而现有判据的形状只能抓前者。
|
||||
*
|
||||
* ⇒ 投影里**保留 `path`**(不归一掉),并补上用例(见下面 cases)。
|
||||
* 它现在是这条判据的守具:谁再把它写成空串,这里会红。
|
||||
*/
|
||||
groupPermissions: (v) => (v ?? []).map(g => ({
|
||||
sessionId: g.sessionId ?? g.session_id,
|
||||
alias: g.alias,
|
||||
agentName: g.agentName,
|
||||
path: g.path,
|
||||
pending: (g.pending ?? []).map(m => m.mail_id),
|
||||
settled: (g.settled ?? []).map(m => m.mail_id),
|
||||
latestMailId: g.latest?.mail_id ?? null
|
||||
}))
|
||||
},
|
||||
cases: [
|
||||
@ -174,7 +204,28 @@ const PAIRS = [
|
||||
['拆分:空列表', 'splitByPermission', [[]]],
|
||||
['未决权限计数', 'countPendingPermissions', [[mkMail({ mail_type: 'permission_request' })]]],
|
||||
['未决权限计数(已决策)', 'countPendingPermissions',
|
||||
[[mkMail({ mail_type: 'permission_request', permission_result: 'allow' })]]]
|
||||
[[mkMail({ mail_type: 'permission_request', permission_result: 'allow' })]]],
|
||||
/*
|
||||
* ── groupPermissions:两边逐字段算得一样吗 ──
|
||||
*
|
||||
* 用例特意覆盖 `path`(会话工作目录):
|
||||
* 这是它与 WebUI 真分叉过的那个字段(鸿蒙曾硬编码空串)。
|
||||
* 若只拿"有权限请求"的普通用例测,两组都不报 path 差异也看不出来。
|
||||
*/
|
||||
['权限分组:单会话待决', 'groupPermissions',
|
||||
[[mkMail({ mail_id: 'p1', mail_type: 'permission_request' })]]],
|
||||
['权限分组:待决 + 已决策同会话', 'groupPermissions',
|
||||
[[mkMail({ mail_id: 'p1', mail_type: 'permission_request' }),
|
||||
mkMail({ mail_id: 'p2', mail_type: 'permission_request', permission_result: 'allow' })]]],
|
||||
['★ 权限分组:path 取会话的 workspace', 'groupPermissions',
|
||||
[[mkMail({ mail_id: 'p1', mail_type: 'permission_request',
|
||||
session_workspace: '/home/program/agentmail' })]]],
|
||||
['★ 权限分组:workspace 缺失时 path 为空(不是 undefined)', 'groupPermissions',
|
||||
[[mkMail({ mail_id: 'p1', mail_type: 'permission_request',
|
||||
session_workspace: undefined })]]],
|
||||
['权限分组:非权限邮件被过滤', 'groupPermissions',
|
||||
[[mkMail({ mail_id: 'm1' }), mkMail({ mail_id: 'p1', mail_type: 'permission_request' })]]],
|
||||
['权限分组:空列表', 'groupPermissions', [[]]]
|
||||
]
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user