Skip to content

app-shell 的 AppSidebar / UnifiedSidebar 区域切换器未采用派生可见性 —— 全被 gate 的区域仍渲染为「可见但空」 #3319

Description

@xuyushun441-sys

在实施 #3311(裁决选项 C:area 可见性派生自「区域内是否存在可见 item」)时发现的同型问题,超出该单 scope(裁决与执行单都只覆盖 packages/layoutAppSchemaRenderer.AreaSwitcher),按 Prime Directive #10 单独记录。

现状

packages/app-shell/src/layout/AppSidebar.tsxpackages/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/layouthasVisibleNavigationItems(items, options)(与 NavigationItemRenderer 的 item 级守卫逐条对齐:visible 表达式、requiredPermissionsrequiresObject / requiresService、action 项的 dispatcher 存在性;separator 不算内容,group 只经由子项计数)。两个 app-shell 侧边栏直接采用同一谓词即可:

  1. 切换器只列出 hasVisibleNavigationItems(area.navigation, …) 为真的区域;
  2. 活动区域只在可见区域中选举(默认第一个可见区域;当前活动区域被 gate 掉后重新选举);
  3. 顺带清理 areas: any[] —— 应为 NavigationArea[]

不引入任何 authorable key(#3311 裁决明确:enforce-or-remove 之后不得复活 area 级声明式 gating)。

相关

⚠️ 未指派 —— 记录待排期。


Generated by Claude Code

Metadata

Metadata

Labels

bugSomething isn't working

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions