跨端对齐:授权栏 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:
@ -406,6 +406,7 @@ func GetMailByID(ctx context.Context, id uuid.UUID) (*models.Mail, error) {
|
||||
var m models.Mail
|
||||
var alias *string
|
||||
var ccJSON []byte
|
||||
var permOptsJSON []byte
|
||||
var renameAlias, renameReason *string
|
||||
err := db.DB.QueryRowContext(ctx,
|
||||
`SELECT m.mail_id, m.session_id, m.parent_mail_id,
|
||||
@ -413,6 +414,7 @@ func GetMailByID(ctx context.Context, id uuid.UUID) (*models.Mail, error) {
|
||||
m.cc_list, m.subject, m.body, m.mail_type, COALESCE(m.permission_result,'') AS permission_result,
|
||||
COALESCE(m.permission_kind,'') AS permission_kind,
|
||||
COALESCE(m.permission_multi_select,0) AS permission_multi_select,
|
||||
COALESCE(m.permission_options,'[]') AS permission_options,
|
||||
m.status, m.created_at, s.session_alias, s.workspace, m.rename_alias, m.rename_reason,
|
||||
EXISTS (SELECT 1 FROM users u WHERE u.username = m.from_name) AS from_human,
|
||||
EXISTS (SELECT 1 FROM users u WHERE u.username = m.to_name) AS to_human
|
||||
@ -422,12 +424,30 @@ func GetMailByID(ctx context.Context, id uuid.UUID) (*models.Mail, error) {
|
||||
).Scan(&m.ID, &m.SessionID, &m.ParentMailID,
|
||||
&m.FromName, &m.FromWorkspace, &m.ToName, &m.ToWorkspace,
|
||||
&ccJSON, &m.Subject, &m.Body, &m.MailType, &m.PermResult,
|
||||
&m.PermissionKind, &m.PermissionMulti,
|
||||
&m.PermissionKind, &m.PermissionMulti, &permOptsJSON,
|
||||
&m.Status, &m.CreatedAt, &alias, &m.SessionWorkspace, &renameAlias, &renameReason,
|
||||
&m.FromHuman, &m.ToHuman)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
/*
|
||||
* ★★ 2026-09-23 补:`permission_options` 从 INSERT 起就写进 `mails` 表,
|
||||
* 但**从来没有任何读路径选过它** ⇒ 详情端点永远返回空数组。
|
||||
*
|
||||
* WebUI 的 `MailView.tsx` 决策面板读 `mail.permission_options ?? []`,
|
||||
* 于是提问型的预设选项在两端**全部落空**(审批型靠 `['同意','拒绝']`
|
||||
* 兜底蒙混过去,提问型是直接没有)。
|
||||
*
|
||||
* 修法与 `cc_list` 同款:JSON 列 → 字节 → `json.Unmarshal` 进 `[]string`,
|
||||
* 空则保底 `[]`(与前端 `?? []` 同义,但**在服务端**完成,
|
||||
* 免得每个读方各写一遍兜底)。
|
||||
*/
|
||||
if len(permOptsJSON) > 0 && string(permOptsJSON) != "[]" {
|
||||
json.Unmarshal(permOptsJSON, &m.PermOptions)
|
||||
}
|
||||
if m.PermOptions == nil {
|
||||
m.PermOptions = []string{}
|
||||
}
|
||||
if len(ccJSON) > 0 {
|
||||
json.Unmarshal(ccJSON, &m.CCList)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user