refactor: move the portal home into its own overzicht context (RD-03)
The dashboard page lived inside registratie, a context with no permitted outbound edges. Two of its sections do cross-context navigation: action links to herregistratie/intake/brief/concepts, and an admin links section that imported ADMIN_LINKS directly from the app shell. Move the page and these two navigation sections into a new overzicht context. Declare overzicht: ['registratie'] as the one sanctioned edge, so the four data sections that stay in registratie/ui/dashboard/ remain reachable. The route stays at /dashboard: it is a user-visible URL and four e2e specs assert it, so only the import path and class name change. beheer-links.section.ts now injects HEADER_ADMIN_LINKS, the same token the site header uses, instead of importing the app shell's nav config directly. Used npm run gen:context and corrected its three known-wrong outputs: the overzicht: [] edge, the scaffolded overzicht.page.ts (the real page is the moved dashboard.page.ts), and the scaffolded path: 'overzicht' route. Verified the boundary is enforced, not decorative: a temporary import of a herregistratie file into overzicht.page.ts makes dep:check fail, as expected, then reverted. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,9 +14,11 @@ export const routes: Routes = [
|
||||
loadComponent: () => import('@auth/ui/login.page').then((m) => m.LoginPage),
|
||||
},
|
||||
{
|
||||
// Path stays 'dashboard' on purpose: it is a user-visible URL and four e2e
|
||||
// specs assert it. The context is `overzicht`; only the path string differs.
|
||||
path: 'dashboard',
|
||||
canActivate: [authGuard],
|
||||
loadComponent: () => import('@registratie/ui/dashboard.page').then((m) => m.DashboardPage),
|
||||
loadComponent: () => import('@overzicht/ui/overzicht.page').then((m) => m.OverzichtPage),
|
||||
},
|
||||
{
|
||||
path: 'registratie',
|
||||
|
||||
+3
-2
@@ -3,7 +3,7 @@ import { HeadingComponent } from '@shared/ui/heading/heading.component';
|
||||
import { ApplicationListComponent } from '@shared/ui/application-list/application-list.component';
|
||||
import { ApplicationLinkComponent } from '@shared/ui/application-link/application-link.component';
|
||||
import { AccessStore } from '@shared/application/access.store';
|
||||
import { ADMIN_LINKS } from '../../../shell/nav.config';
|
||||
import { HEADER_ADMIN_LINKS } from '@shared/layout/site-header/nav-config';
|
||||
|
||||
/** Section: "Beheer" — the admin pages the current principal may reach, capability-
|
||||
gated (never role-derived), the same source + filter the site header uses.
|
||||
@@ -31,5 +31,6 @@ import { ADMIN_LINKS } from '../../../shell/nav.config';
|
||||
})
|
||||
export class BeheerLinksSection {
|
||||
private access = inject(AccessStore);
|
||||
protected adminLinks = computed(() => ADMIN_LINKS.filter((l) => this.access.can(l.cap)));
|
||||
private rawAdminLinks = inject(HEADER_ADMIN_LINKS);
|
||||
protected adminLinks = computed(() => this.rawAdminLinks.filter((l) => this.access.can(l.cap)));
|
||||
}
|
||||
+10
-9
@@ -1,17 +1,18 @@
|
||||
import { Component } from '@angular/core';
|
||||
import { PageShellComponent } from '@shared/layout/page-shell/page-shell.component';
|
||||
import { MijnAanvragenSection } from './dashboard/mijn-aanvragen.section';
|
||||
import { WatMoetIkRegelenSection } from './dashboard/wat-moet-ik-regelen.section';
|
||||
import { MijnRegistratieSection } from './dashboard/mijn-registratie.section';
|
||||
import { SpecialismenSection } from './dashboard/specialismen.section';
|
||||
import { WatWiltUDoenSection } from './dashboard/wat-wilt-u-doen.section';
|
||||
import { BeheerLinksSection } from './dashboard/beheer-links.section';
|
||||
import { MijnAanvragenSection } from '@registratie/ui/dashboard/mijn-aanvragen.section';
|
||||
import { WatMoetIkRegelenSection } from '@registratie/ui/dashboard/wat-moet-ik-regelen.section';
|
||||
import { MijnRegistratieSection } from '@registratie/ui/dashboard/mijn-registratie.section';
|
||||
import { SpecialismenSection } from '@registratie/ui/dashboard/specialismen.section';
|
||||
import { WatWiltUDoenSection } from './wat-wilt-u-doen.section';
|
||||
import { BeheerLinksSection } from './beheer-links.section';
|
||||
|
||||
/** Page: "Mijn overzicht" — the portal home, following the NL Design System "Mijn
|
||||
omgeving" pattern. Composition only: each section below answers its own data
|
||||
question (own store, own async state) — see `ui/dashboard/*.section.ts`. */
|
||||
question (own store, own async state) — four sections stay in `registratie/ui/dashboard/`
|
||||
(they render registratie data), two live here (cross-context navigation). */
|
||||
@Component({
|
||||
selector: 'app-dashboard-page',
|
||||
selector: 'app-overzicht-page',
|
||||
imports: [
|
||||
PageShellComponent,
|
||||
MijnAanvragenSection,
|
||||
@@ -39,4 +40,4 @@ import { BeheerLinksSection } from './dashboard/beheer-links.section';
|
||||
</app-page-shell>
|
||||
`,
|
||||
})
|
||||
export class DashboardPage {}
|
||||
export class OverzichtPage {}
|
||||
@@ -6,6 +6,7 @@
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@overzicht/*": ["src/app/overzicht/*"],
|
||||
"@shared/*": ["../../libs/shared/src/*"],
|
||||
"@beheer/*": ["../../libs/beheer/src/*"],
|
||||
"@auth/*": ["src/app/auth/*"],
|
||||
|
||||
Reference in New Issue
Block a user