feat(layout): Plan 2.5 P4 — WorkspaceSwitcher no-sub + SidebarNav APP_NAVIGATION
Per RFC-WS-PRIMEVUE-PLAN-2-5 §4 AD-2.5-W1 and AD-2.5-B1, §5.4 Fix 4. Changes: - WorkspaceSwitcher: sub field removed from template, WorkspaceDisplay type, and buildDisplay derivation. Stories did not carry sub args (auto-derived from seeded org.role); no WithSub story existed. New regression spec (WorkspaceSwitcher.spec.ts) locks the no-sub render. - SidebarNav: now consumes APP_NAVIGATION from src/config/navigation.ts as the single source of truth (shared with breadcrumb derivation in useNavBreadcrumb). The groups: V2NavGroup[] prop is removed; render walks top-level NavItems (branch nodes render label-heading + children; leaf nodes render as rows; items without routeName render as non-clickable dormant placeholders). Previous nav data source: groups prop fed by useV2Nav(orgNavItems) in OrganizerLayoutV2. - APP_NAVIGATION expanded with 7 entries to preserve visual sidebar continuity (Evenementen at top-level + Beheer branch with 5 children). All new entries use routeName: undefined until the corresponding v2 page lands (TODOs noted per entry); only Dashboard maps to v2-dashboard. - AppSidebar: groups prop removed; passes only :collapsed to SidebarNav. - OrganizerLayoutV2: useV2Nav(orgNavItems) plumbing retired; the layout now renders <AppSidebar /> with no nav-data wiring. - Tests: AppSidebar.spec drops the "passes groups prop to SidebarNav" assertion; OrganizerLayoutV2.spec drops the "forwards orgNavItems" assertion. New WorkspaceSwitcher no-sub regression spec (+2 tests). - Storybook: SidebarNav.stories and AppSidebar.stories updated to no longer thread navFixture/groups; WithActiveItem pushes v2-dashboard. Position of WorkspaceSwitcher (Fix 3), workspace dropdown panel (Fix 5), and AppBreadcrumb wiring (Fix 2) remain unchanged in P4 — both lands in P5. The legacy useBreadcrumb composable also remains untouched until P5 (atomic with AppTopbar refactor). Orphans flagged for follow-up cleanup (intentionally not deleted in P4): useV2Nav composable + spec, V2NavGroup/V2NavItem types, sidebarNavActive helper + spec, navFixture in stories/v2/_helpers.ts. Suite delta: 575 → 575 (+2 WorkspaceSwitcher no-sub spec, -1 AppSidebar groups-prop assertion, -1 OrganizerLayoutV2 groups-forward assertion). vue-tsc clean. Scoped ESLint clean (0 errors). Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,13 +1,13 @@
|
||||
import type { Meta, StoryObj } from '@storybook/vue3-vite'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { navFixture } from '@/stories/v2/_helpers'
|
||||
import SidebarNav from '@/components-v2/layout/SidebarNav.vue'
|
||||
|
||||
/**
|
||||
* SidebarNav needs no Pinia, but vue-router is installed app-wide in
|
||||
* preview.ts (the component uses useRoute + RouterLink). The
|
||||
* WithActiveItem story pushes the `events` route in setup so the
|
||||
* Evenementen item renders in its active state.
|
||||
* SidebarNav now reads APP_NAVIGATION from `@/config/navigation` directly
|
||||
* (AD-2.5-B1 / Plan 2.5 P4). The previous `groups` prop is gone — stories
|
||||
* only vary the `collapsed` axis and the active route. vue-router is
|
||||
* installed app-wide in preview.ts; the WithActiveItem story pushes the
|
||||
* `v2-dashboard` route so the Dashboard item renders in its active state.
|
||||
*/
|
||||
const meta: Meta<typeof SidebarNav> = {
|
||||
title: 'v2 Shell/SidebarNav',
|
||||
@@ -22,7 +22,7 @@ export default meta
|
||||
type Story = StoryObj<typeof SidebarNav>
|
||||
|
||||
export const Expanded: Story = {
|
||||
args: { groups: navFixture, collapsed: false },
|
||||
args: { collapsed: false },
|
||||
render: args => ({
|
||||
components: { SidebarNav },
|
||||
setup() {
|
||||
@@ -30,14 +30,14 @@ export const Expanded: Story = {
|
||||
},
|
||||
template: `
|
||||
<div class="w-64 bg-[var(--p-content-background)]">
|
||||
<SidebarNav :groups="args.groups" :collapsed="args.collapsed" />
|
||||
<SidebarNav :collapsed="args.collapsed" />
|
||||
</div>
|
||||
`,
|
||||
}),
|
||||
}
|
||||
|
||||
export const Collapsed: Story = {
|
||||
args: { groups: navFixture, collapsed: true },
|
||||
args: { collapsed: true },
|
||||
render: args => ({
|
||||
components: { SidebarNav },
|
||||
setup() {
|
||||
@@ -45,26 +45,26 @@ export const Collapsed: Story = {
|
||||
},
|
||||
template: `
|
||||
<div class="w-16 bg-[var(--p-content-background)]">
|
||||
<SidebarNav :groups="args.groups" :collapsed="args.collapsed" />
|
||||
<SidebarNav :collapsed="args.collapsed" />
|
||||
</div>
|
||||
`,
|
||||
}),
|
||||
}
|
||||
|
||||
export const WithActiveItem: Story = {
|
||||
args: { groups: navFixture, collapsed: false },
|
||||
args: { collapsed: false },
|
||||
render: args => ({
|
||||
components: { SidebarNav },
|
||||
setup() {
|
||||
const router = useRouter()
|
||||
|
||||
router.push({ name: 'events' })
|
||||
router.push({ name: 'v2-dashboard' })
|
||||
|
||||
return { args }
|
||||
},
|
||||
template: `
|
||||
<div class="w-64 bg-[var(--p-content-background)]">
|
||||
<SidebarNav :groups="args.groups" :collapsed="args.collapsed" />
|
||||
<SidebarNav :collapsed="args.collapsed" />
|
||||
</div>
|
||||
`,
|
||||
}),
|
||||
|
||||
Reference in New Issue
Block a user