在实施 #3311(裁决选项 C:area 可见性派生自「区域内是否存在可见 item」)时发现的同型问题,超出该单 scope(裁决与执行单都只覆盖 packages/layout 的 AppSchemaRenderer.AreaSwitcher),按 Prime Directive #10 单独记录。
现状
packages/app-shell/src/layout/AppSidebar.tsx 与 packages/app-shell/src/layout/UnifiedSidebar.tsx 各自内联了一份区域切换器逻辑:
const areas: any[] = activeApp?.areas || [] 后直接 areas.map(...) 渲染全部区域;
- 活动区域初值取
areas[0].id,不看区域内 item 是否可见。
这两份实现从未有过 area 级过滤(rc.1 时代也没有),所以 #3315 对它们不是回归;但用户侧观感与 #3311 修掉的问题完全相同:某区域内 item 全被 gate(visible / requiredPermissions / capability gate)时,区域仍出现在切换器里,点进去是空的;若第一个区域全被 gate,用户还会被默认落在空区域上。
建议修法
#3311 的 PR 已把派生谓词导出为 @object-ui/layout 的 hasVisibleNavigationItems(items, options)(与 NavigationItemRenderer 的 item 级守卫逐条对齐:visible 表达式、requiredPermissions、requiresObject / requiresService、action 项的 dispatcher 存在性;separator 不算内容,group 只经由子项计数)。两个 app-shell 侧边栏直接采用同一谓词即可:
- 切换器只列出
hasVisibleNavigationItems(area.navigation, …) 为真的区域;
- 活动区域只在可见区域中选举(默认第一个可见区域;当前活动区域被 gate 掉后重新选举);
- 顺带清理
areas: any[] —— 应为 NavigationArea[]。
不引入任何 authorable key(#3311 裁决明确:enforce-or-remove 之后不得复活 area 级声明式 gating)。
相关
⚠️ 未指派 —— 记录待排期。
Generated by Claude Code
在实施 #3311(裁决选项 C:area 可见性派生自「区域内是否存在可见 item」)时发现的同型问题,超出该单 scope(裁决与执行单都只覆盖
packages/layout的AppSchemaRenderer.AreaSwitcher),按 Prime Directive #10 单独记录。现状
packages/app-shell/src/layout/AppSidebar.tsx与packages/app-shell/src/layout/UnifiedSidebar.tsx各自内联了一份区域切换器逻辑:const areas: any[] = activeApp?.areas || []后直接areas.map(...)渲染全部区域;areas[0].id,不看区域内 item 是否可见。这两份实现从未有过 area 级过滤(rc.1 时代也没有),所以 #3315 对它们不是回归;但用户侧观感与 #3311 修掉的问题完全相同:某区域内 item 全被 gate(
visible/requiredPermissions/ capability gate)时,区域仍出现在切换器里,点进去是空的;若第一个区域全被 gate,用户还会被默认落在空区域上。建议修法
#3311 的 PR 已把派生谓词导出为
@object-ui/layout的hasVisibleNavigationItems(items, options)(与NavigationItemRenderer的 item 级守卫逐条对齐:visible表达式、requiredPermissions、requiresObject/requiresService、action 项的 dispatcher 存在性;separator 不算内容,group 只经由子项计数)。两个 app-shell 侧边栏直接采用同一谓词即可:hasVisibleNavigationItems(area.navigation, …)为真的区域;areas: any[]—— 应为NavigationArea[]。不引入任何 authorable key(#3311 裁决明确:enforce-or-remove 之后不得复活 area 级声明式 gating)。
相关
NavigationArea的 area 级visible/requiredPermissions退役前提也不成立 ——AppSchemaRenderer.AreaSwitcher一直在按它过滤 #3311(裁决与 layout 侧实现)Generated by Claude Code