Documentation Index
Fetch the complete documentation index at: https://docs.snakysec.com/llms.txt
Use this file to discover all available pages before exploring further.
UX Audit — Cartographie complète SaaS SnakySec MSSP
Phase 1 — Inventaire exhaustif des pages, routes et points d’entrée
Stack : Next.js 16 App Router · React 19 · shadcn/ui · next-intl (FR/EN)
Champs analysés : platform/src/app/**/page.tsx + platform/src/app/**/layout.tsx + platform/src/components/**
Vue d’ensemble — chiffres clés
| Zone | Pages | Layouts | Sidebars |
|---|
| Dashboard MSSP_ADMIN | 30 | 1 (/dashboard/layout.tsx) | Sidebar (5 entrées + Documents collapsible + Settings) |
| Portal client | 6 | 1 (/portal/layout.tsx) | PortalSidebar (5 entrées) |
| DR Runbook (sous-section dashboard) | 2 | 1 (/dashboard/help/dr/layout.tsx) | DrDocsSidebar (sections dynamiques) |
| Auth & Root | 2 | 1 (root) | — |
| Total pages | 40 | 4 | 3 |
Arbre de navigation — vue hiérarchique
/ → redirect /dashboard
/login → auth Entra SSO (multi-tenant ou platform fallback)
│
├── /dashboard ★ MSSP_ADMIN home
│ ├── /clients
│ │ ├── /new (wizard entry — créer client)
│ │ └── /[id]
│ │ ├── / (overview client + tabs Overview/History/Findings)
│ │ ├── /edit (formulaire client complet)
│ │ ├── /onboarding → redirect step
│ │ │ └── /[step] (wizard 8 étapes — Identity/Preflight/Credentials/Test/Scope/Schedule/Users/Done)
│ │ ├── /secrets (Vault secrets management)
│ │ ├── /findings (table éditable des findings)
│ │ ├── /remediation (workspace DnD findings + actions + deadlines + milestones)
│ │ ├── /remediation-plan (vue exécutive plan + roadmap 6 mois)
│ │ ├── /trajectory (12 mois CMMI + score trends)
│ │ ├── /documents (hub conformité 4 docs PDF)
│ │ └── /controls/[controlId] (détail contrôle + mappings + history)
│ │
│ ├── /audits
│ │ └── /[id]
│ │ ├── / (audit detail + control table + reports panel)
│ │ └── /diff?vs=<id> (diff N vs N-1 par contrôle)
│ │
│ ├── /alerts (feed + mark as read)
│ │
│ ├── /integrations (CISO Assistant connection test)
│ │
│ ├── /documents (hub catalog)
│ │ ├── /governance (PSSI, charte IT, risk policy, BCP)
│ │ ├── /access (IAM, password, PAM, on/offboarding)
│ │ ├── /incidents (incident proc, breach notif, CSIRT, post-mortem)
│ │ ├── /monitoring (rapports d'audit PDF/Excel/HTML, KPI)
│ │ ├── /onboarding (DPA, prerequisites, pricing, NDA)
│ │ ├── /technical (classification, control coverage, backup, patch)
│ │ └── /compliance (RGPD, NIS2, ISO 27001, DPIA — roadmap only)
│ │
│ ├── /settings (hub liens)
│ │ ├── /users (table utilisateurs + role select inline)
│ │ │ └── /[id]/permissions (matrice grants par permission)
│ │ ├── /roles (CRUD rôles custom + matrice 60 perms)
│ │ ├── /access-review (campagnes de revue d'accès)
│ │ ├── /api-keys (CRUD clés API)
│ │ ├── /audit-log (logs + intégrité Ed25519 + anchors)
│ │ └── /notifications (préférences emails utilisateur)
│ │
│ └── /help/dr (DR Runbook — INTERNAL_DOCS_VIEW only)
│ └── /[...slug] (markdown viewer dynamique)
│
└── /portal ★ Client portal (CLIENT_USER + impersonate)
├── / (overview + KPI + recent audits)
├── /audits
│ └── /[id] (détail audit lecture seule)
├── /findings (lecture seule)
├── /remediation (vue plan client + downloads PDF)
└── /documents (hub conformité 4 docs côté client)
Section 1 — Dashboard MSSP_ADMIN
Layout commun
platform/src/app/dashboard/layout.tsx
<SessionGuard> — invalide la session JWT si refresh Entra échoue
<TamperingBanner> — bandeau rouge si chaîne audit log compromise
<Sidebar> (cf. components/sidebar.tsx) : 5 entrées top + Documents collapsible (7 sous-items) + Settings + Sign Out
<Header> (cf. components/header.tsx) : Sheet mobile, titre, <LanguageSwitcher>, cloche notifications → /dashboard/alerts, dropdown user (Settings + Sign Out)
| Clé i18n | Route | Icône |
|---|
nav.dashboard (Tableau de bord) | /dashboard | LayoutDashboard |
nav.clients (Clients) | /dashboard/clients | Building2 |
nav.audits (Audits) | /dashboard/audits | Shield |
nav.alerts (Alertes) | /dashboard/alerts | AlertTriangle |
nav.integrations (Intégrations) | /dashboard/integrations | Blocks |
nav.documents (Documents) — collapsible | /dashboard/documents | FolderOpen |
common.settings (Paramètres) | /dashboard/settings | Settings |
| Clé i18n | Route | Badge |
|---|
nav.documentsOverview | /dashboard/documents | — |
nav.governance | /dashboard/documents/governance | — |
nav.access | /dashboard/documents/access | — |
nav.incidents | /dashboard/documents/incidents | — |
nav.monitoring | /dashboard/documents/monitoring | — |
nav.onboarding | /dashboard/documents/onboarding | — |
nav.technical | /dashboard/documents/technical | — |
nav.compliance | /dashboard/documents/compliance | roadmap (amber) |
/dashboard
- Page : Tableau de bord global MSSP
- Composants nav : Sidebar, Header
- Filtres :
<DashboardFilters> (client picker + period 7d/30d/90d) — labels EN
- Actions :
- 8 KPI cards (clients actifs, score moyen, alertes, audits récents, total findings, open, in progress, remediated)
- Tabs
<DashboardTabs> Overview / Analytics
- Cards “Recent Alerts” → lien
viewAll /dashboard/alerts
- Cards “Recent Audits” → lien
viewAll /dashboard/audits
- Charts : ComplianceTrend, StatusDistribution, SeverityBreakdown, ProductAreaRadar, ClientComparison
- Points d’entrée : sidebar “Tableau de bord” (default after login),
/ redirect, breadcrumbs
/dashboard/clients
- Page : Liste des clients (cards grid)
- Composants nav : Sidebar, Header
- Actions :
- Bouton header
addClient → /dashboard/clients/new
- Card client cliquable →
/dashboard/clients/[id] ou /dashboard/clients/[id]/onboarding (si onboardingStatus !== COMPLETED)
<ImpersonateClientButton> (“Voir comme ce client”) → POST /api/portal/impersonate puis push /portal
- Points d’entrée : sidebar “Clients”, breadcrumbs, action depuis dashboard cards
/dashboard/clients/new
- Page : Création initiale client (form minimal name/slug/domain/tenantId)
- Composants nav : back arrow →
/dashboard/clients, PAS de breadcrumb
- Actions :
- POST
/api/v1/clients puis PATCH (domain) puis push /dashboard/clients/[id]/onboarding/1
- Points d’entrée : Bouton “Add client” sur
/dashboard/clients, lien dans /dashboard/documents empty state
/dashboard/clients/[id]
- Page : Vue d’ensemble client (Overview / Audit history / Findings tabs)
- Composants nav : Breadcrumb (Tableau de bord > Clients > nom), back arrow
- Actions header (8 boutons sur la même ligne) :
<Button asChild> Edit → /dashboard/clients/[id]/edit
- Credentials →
/dashboard/clients/[id]/secrets
- Findings →
/dashboard/clients/[id]/findings
- Remediation →
/dashboard/clients/[id]/remediation
<GuideFilterDialog variant="dashboard"> — Guide PDF filter dialog
- Trajectory →
/dashboard/clients/[id]/trajectory
- CISO Assistant (conditional) → external URL
<TriggerAuditButton> → modal launch audit (framework + product areas)
- Banners : onboarding incomplete (resume button), active audit (loading link →
/dashboard/audits/[id])
- Tabs : Overview / History / Findings
- Tab Overview : feature badges, CISO sub-card, Configuration sub-card
- Tab History : table audits → liens
/dashboard/audits/[id] + <AuditActions variant="dropdown"> per row
- Tab Findings : list inline (severity + control + status badges)
- Points d’entrée : card sur
/dashboard/clients, breadcrumbs depuis sous-routes, table Recent Audits du dashboard
/dashboard/clients/[id]/edit
- Page : Formulaire complet édition client (general/features/CISO/cron/retention)
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Actions : PUT
/api/v1/clients/[id], “Cancel” → router.back()
- Labels : Mix EN/FR (Form labels EN, descriptions FR)
- Points d’entrée : bouton Edit sur
/dashboard/clients/[id]
/dashboard/clients/[id]/onboarding
- Page : Resume route — redirect serveur uniquement vers
/onboarding/[step]
- Pas d’UI
/dashboard/clients/[id]/onboarding/[step]
- Page : Wizard 8 étapes
- Composants nav :
<OnboardingShell> avec stepper sidebar (260px) à gauche, contenu à droite
- Étapes :
- Identity (
<IdentityStep>)
- Preflight (
<PreflightStep>)
- Credentials (
<CredentialsStep>)
- Test Connection (
<TestConnectionStep>)
- Scope (
<ScopeStep>)
- Schedule (
<ScheduleStep>)
- Users (
<UsersStep>)
- Done (
<DoneStep>)
- Garde-fous : redirect
/dashboard/clients/[id] si COMPLETED, redirect au max-step atteignable si jump avant
- Points d’entrée : POST
/api/v1/clients redirect après création, banner sur client overview, card sur /dashboard/clients (onboarding badge)
/dashboard/clients/[id]/secrets
- Page : Gestion secrets Vault par client
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Actions : Dialog Add Secret (predefined keys CLIENT_ID/TENANT_ID + free input), Trash icon delete with
confirm()
- Points d’entrée : bouton “Credentials” sur
/dashboard/clients/[id]
/dashboard/clients/[id]/findings
- Page : Table éditable findings (status + assignee + due date)
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Actions : Status filter tabs (5 buttons), inline Select status, Input assignee onBlur, Input date onChange — toutes appellent PATCH
/api/v1/clients/[id]/findings
- Points d’entrée : bouton “Findings” sur
/dashboard/clients/[id], lien depuis tab Findings du client overview (implicite)
- Page : Workspace DnD complet remédiation (findings/actions/deadlines/milestones)
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Composant principal :
<RemediationWorkspace> avec dnd-kit, Tabs Findings/Milestones/Deadlines, dialogs pour création
- Points d’entrée : bouton “Remediation” sur
/dashboard/clients/[id]
- Page : Vue plan exécutif (read-only) — pas le workspace
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Actions : Bouton “Download PDF” →
/api/v1/clients/[id]/documents/remediation-plan
- Composant principal :
<RemediationPlanView> (phases, timeline, milestones, gradient hero)
- Points d’entrée : Lien “Voir tout (X findings)” depuis
/dashboard/clients/[id]/documents. Pas de bouton header sur /dashboard/clients/[id] — accessible uniquement via le hub documents client.
/dashboard/clients/[id]/trajectory
- Page : Dashboard CMMI 12 mois (score trends, fundamentals, comparisons)
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Composant principal :
<TrajectoryDashboard>
- Points d’entrée : bouton “Trajectory” sur
/dashboard/clients/[id]
/dashboard/clients/[id]/documents
- Page : Hub conformité client (posture stats + 4 cartes documents PSSI/Access/Incident/Remediation)
- Composants nav : Breadcrumb 4 niveaux + back arrow
- Actions :
- 4 cards
<GrcDocumentCards> avec bouton “Télécharger PDF” par doc → /api/v1/clients/[id]/documents/[type]
- Lien “Voir tout (N findings)” →
/dashboard/clients/[id]/remediation-plan
- Lien “Lancer un audit” (dans empty state) →
/dashboard/clients/[id]
- Points d’entrée : Aucun lien direct dans la sidebar ou le client overview header. Accessible uniquement via breadcrumb manuel ou navigation profonde.
/dashboard/clients/[id]/controls/[controlId]
- Page : Détail contrôle individuel (description, remediation, mappings réglementaires, DICT, history)
- Composants nav : Breadcrumb 4 niveaux + back arrow →
/dashboard/clients/[id]
- Actions : Liens externes vers
/dashboard/audits/[id] pour chaque évaluation history
- Auth :
Permission.AUDIT_VIEW scoped au client
- Points d’entrée : Cellule controlId clickable dans
<ControlResultsTable> (audit detail + portal audit detail). Pas de chemin direct depuis la sidebar.
/dashboard/audits
- Page : Liste paginée audits (table)
- Composants nav : Sidebar, Header
- Filtres :
<AuditFilters> (status + client) — labels EN uniquement (All statuses, Pending, Running, etc.)
- Actions :
- Cellule client →
/dashboard/clients/[id]
- Cellule date →
/dashboard/audits/[id]
<AuditActions variant="dropdown"> per row (cancel/retry/sync/pipeline/PDF/Excel/HTML/delete)
- Pagination Previous/Next
- Points d’entrée : sidebar “Audits”, “viewAll” depuis dashboard, breadcrumbs
/dashboard/audits/[id]
- Page : Détail run audit
- Composants nav : Breadcrumb 3 niveaux + back arrow →
/dashboard/audits
- Actions header :
<AuditActions variant="buttons"> (cancel/retry/sync/pipeline/PDF/Excel/HTML/delete) — série de boutons individuels
<CompareSelector> → /dashboard/audits/[id]/diff?vs=<other>
- Composants :
- 7 summary cards (passed/failed/manual/N-A/not_assessed/no_perm/error)
<AuditLiveMonitor> (SSE) si status actif
<DictRadar> chart
<AuditReportsPanel> (tracking + certification Ed25519)
<CisoSyncButton> si CISO enabled
<ControlResultsTable> (TanStack table 50 rows/page) avec expand row + Review form
- Points d’entrée : table audits, recent audits dashboard, lien depuis client history tab, lien depuis control detail history
/dashboard/audits/[id]/diff
- Page : Diff audit N vs N-1
- Composants nav : Breadcrumb 4 niveaux + back arrow →
/dashboard/audits/[id]
- Actions :
<AuditDiffControlSheet> per row (Sheet detail)
- Sections : Régressions / Améliorations / Evidence-only / Status changes / Added / Removed
- Points d’entrée :
<CompareSelector> sur audit detail (uniquement)
/dashboard/alerts
- Page : Feed alertes (50 récentes)
- Composants nav : Sidebar, Header
- Actions :
<AlertFeed> mark as read inline
- Points d’entrée : sidebar “Alertes”, icône cloche dans header, lien
viewAll dashboard, action “lien client”
/dashboard/integrations
- Page : Test connexion CISO Assistant
- Composants nav : Sidebar, Header
- Actions :
testConnection, “Open” external link, “Retry” button
- Card placeholder “More integrations coming soon”
- Points d’entrée : sidebar “Intégrations”
/dashboard/documents
- Page : Hub catalog 7 catégories
- Composants nav : Sidebar, Header
- Actions : Card par catégorie →
/dashboard/documents/[category]. Empty state si pas de client → lien /dashboard/clients/new
- Stats bar : Disponibles / Roadmap / Clients actifs / Audits complétés
- Points d’entrée : sidebar “Documents” (collapsible header)
/dashboard/documents/[category] (governance, access, incidents, monitoring, onboarding, technical, compliance)
- Page : Catalog par catégorie
- Composants nav : Sidebar (sous-item actif),
<DocumentCategoryPage> interne fournit ses propres breadcrumbs (Documents > Title)
- Actions : Sélection client →
<ReportDownloadButton> ou redirect view
- Points d’entrée : sidebar Documents collapsed, hub
/dashboard/documents
/dashboard/settings
- Page : Hub settings (cards)
- Composants nav : Sidebar (Settings actif), Header
- Cards :
- Users →
/dashboard/settings/users
- Roles →
/dashboard/settings/roles
- Access Review →
/dashboard/settings/access-review
- API Keys →
/dashboard/settings/api-keys
- Audit Log →
/dashboard/settings/audit-log
- Notifications email (hardcoded FR title hors i18n loop) →
/dashboard/settings/notifications
- DR Runbook (conditional INTERNAL_DOCS_VIEW, hardcoded FR) →
/dashboard/help/dr
- Points d’entrée : sidebar Settings, header dropdown user, breadcrumbs
/dashboard/settings/users
- Page : Table utilisateurs avec Select role inline
- Composants nav : back arrow →
/dashboard/settings, PAS de breadcrumb
- Actions : Select MSSP_ADMIN/ANALYST/CLIENT_USER inline (PATCH
/api/v1/users), icon button → /dashboard/settings/users/[id]/permissions
- Labels : FR hardcoded (pas de i18n)
/dashboard/settings/users/[id]/permissions
- Page : Matrice grants par groupe de permissions
- Composants nav : back arrow (déduit du
<GrantsContent>)
- Composant :
<GrantsContent> server-fetched user header
/dashboard/settings/roles
- Page : CRUD rôles custom + matrice 60 perms
- Composant :
<RolesContent>
/dashboard/settings/access-review
- Page : Campagnes de revue d’accès
- Composant :
<AccessReviewContent>
/dashboard/settings/api-keys
- Page : CRUD clés API
- Composants nav : back arrow →
/dashboard/settings, PAS de breadcrumb
- Actions : Dialog Create (name + expiresInDays), Copy newKey, Trash revoke avec
confirm()
/dashboard/settings/audit-log
- Page : Logs (3 tabs Logs/Intégrité/Anchors)
- Composants nav : back arrow →
/dashboard/settings, PAS de breadcrumb
- Actions : Filtres (action/outcome/severity/actor/resource/from/to), bouton Réinitialiser, 2 boutons CSV (“CSV” et “CSV + before/after”), Load more cursor pagination, click row →
<LogDetailSheet>
- Tabs : Logs / Intégrité (
<ChainIntegrityTab>) / Anchors (<AnchorsTab>)
/dashboard/settings/notifications
- Page : Préférences emails utilisateur
- Composants nav : Aucun back arrow ni breadcrumb explicite (juste
<NotificationsSettingsForm>)
- Actions : Form 7 toggles (alertScoreDegraded, alertNewCriticalFinding, etc.) — exclut les “Toujours envoyés (security floor)“
/dashboard/help/dr
- Page : Hub DR Runbook (6 cards section)
- Layout dédié :
<DrDocsLayout> avec <DrDocsSidebar> (sections dynamiques markdown)
- Composants nav : Sidebar (
Sidebar du dashboard), Header — mais SEUL le layout DR ajoute un sub-sidebar gauche DrDocsSidebar, donc on a 2 sidebars empilées
- Actions : 6 cards (governance/runbooks/incident/compliance/tests/index) + 5 quick links
- Permission :
Permission.INTERNAL_DOCS_VIEW
- Points d’entrée : Card DR Runbook sur
/dashboard/settings
/dashboard/help/dr/[...slug]
- Page : Viewer markdown DR doc
- Composants nav : link “Retour à l’index DR” →
/dashboard/help/dr, pas de breadcrumb
- Actions : Affiche bandeau rouge si doc restreint, log audit
internal_docs.view
- Points d’entrée :
<DrDocsSidebar> ou cards/quick links sur /dashboard/help/dr
Section 2 — Portal client
Layout commun
platform/src/app/portal/layout.tsx
<PortalSidebar> (5 entrées simples — labels EN hardcoded)
<Header> (réutilisé du dashboard, détecte pathname.startsWith("/portal") pour portalTitle)
<PortalImpersonationBanner> si admin en mode impersonate
| Label EN | Route | Icône |
|---|
| Overview | /portal | LayoutDashboard |
| Audits | /portal/audits | Shield |
| Findings | /portal/findings | AlertTriangle |
| Remediation | /portal/remediation | Target |
| Documents | /portal/documents | FileText |
Footer : “Logout” (hardcoded EN, pas via i18n)
/portal
- Page : Vue d’ensemble client
- Mode : 3 modes (
client_user / admin_no_selection / impersonate)
- Mode admin_no_selection :
<PortalClientPicker> cards
- Mode normal : 4 KPI cards + table recent audits avec lien
viewAll → /portal/audits
- Points d’entrée : sidebar Overview, redirect après impersonate
/portal/audits
- Page : Liste audits (50 max, simple table)
- Composants nav : PortalSidebar
- Actions : Lien “Voir” →
/portal/audits/[id] (uniquement si COMPLETED/PARTIAL_COMPLETE)
- Points d’entrée : sidebar Audits, viewAll dashboard portal
/portal/audits/[id]
- Page : Détail audit (lecture seule)
- Composants nav : PortalSidebar — pas de back arrow ni breadcrumb
- Actions :
<DownloadReportButton>, <DictRadar>, <ControlResultsTable> (lecture seule, canReview=false)
- Note : Cards summary labels en EN (Passed/Failed/Manual Review/Compliance) hardcoded
- Points d’entrée : Lien “Voir” depuis
/portal/audits
/portal/findings
- Page : Table findings (lecture seule, 100 max)
- Composants nav : PortalSidebar
- Actions : Aucune (read-only)
- Points d’entrée : sidebar Findings
- Page : Vue remediation client
- Composants nav : PortalSidebar — pas de breadcrumb
- Actions :
<GuideFilterDialog variant="portal">
- Bouton “Download milestones PDF” →
/api/v1/clients/[id]/documents/milestones-plan
- Bouton “Download PDF” →
/api/v1/clients/[id]/documents/remediation-plan
- Composant principal :
<RemediationPlanView> (même que côté MSSP)
- Points d’entrée : sidebar Remediation
/portal/documents
- Page : Hub conformité client (4 cards GRC + posture stats)
- Composants nav : PortalSidebar — pas de breadcrumb
- Actions : 4 cards
<GrcDocumentCards> (PSSI / Access / Incident / Remediation)
- Note : Strings hardcoded FR (titre “Documents de conformité”, description, etc.) — pas via i18n
- Points d’entrée : sidebar Documents
Section 3 — Wizard Onboarding (sous-section dashboard mais flow distinct)
| Step | Composant | Description |
|---|
| 1 | <IdentityStep> | Identity / Slug / Domain / TenantId (peut amender les champs créés à /clients/new) |
| 2 | <PreflightStep> | Vérifications préalables (License, services M365) |
| 3 | <CredentialsStep> | App registration credentials (client ID + cert/secret) — pré-remplit Vault |
| 4 | <TestConnectionStep> | Test Graph + Exchange Online |
| 5 | <ScopeStep> | Toggles featureEntra/Intune/Defender/Purview/Sharepoint/Teams |
| 6 | <ScheduleStep> | Cron expression + timezone + enabled |
| 7 | <UsersStep> | Provisioning des CLIENT_USER + ClientUserAccess |
| 8 | <DoneStep> | Récap + bouton “Lancer premier audit” + redirect overview |
Stepper UI (<OnboardingShell>) : sidebar 260px à gauche, contenu droite. Chaque step est cliquable s’il est ≤ maxReachableStep(status), sinon Lock icon affiché.
Garde-fous :
- Si onboarding COMPLETED, redirect vers
/dashboard/clients/[id]
- Si jump avant max-step, redirect au max-step
OnboardingResumePage (/onboarding) bare route → redirect au step persistant
Section 4 — Help DR (sous-section dashboard, layout dédié)
Layout DR
platform/src/app/dashboard/help/dr/layout.tsx
<DrDocsSidebar> second sidebar latérale (sections dynamiques générées depuis docs/dr/*.md)
- Permission gate :
Permission.INTERNAL_DOCS_VIEW
Pages
/dashboard/help/dr — hub avec 6 cartes de section + 5 quick links incident/restore
/dashboard/help/dr/[...slug] — viewer markdown sanitizé (DOMPurify) + bandeau diffusion restreinte conditionnel
Section 5 — Auth & Root
- Page : Server-side redirect →
/dashboard
- Pas d’UI
/login
- Page : Form de login multi-tenant
- Layout : Hors
dashboard/layout.tsx (utilise root layout uniquement)
- Logique : Résout
Client.domain depuis hostname → secrets Vault SSO ou platform fallback
- Composant :
<LoginForm> côté client (button Entra SSO)
- Sentinel slug :
__platform__ pour MSSP admin sans client en DB
Tableau récapitulatif — points d’entrée par page
| Route | Sidebar | Breadcrumb | Header link | Card hub | Backref interne |
|---|
/dashboard | Oui (Tableau de bord) | — | — | — | / redirect, post-login |
/dashboard/clients | Oui | — | — | — | recent audits dashboard |
/dashboard/clients/new | — | Non (back arrow) | — | — | bouton “Add”, empty state docs hub |
/dashboard/clients/[id] | — | Oui | — | Card sur /dashboard/clients | recent audits, audits table |
/dashboard/clients/[id]/edit | — | Oui | — | — | bouton header client |
/dashboard/clients/[id]/onboarding | — | — | — | — | redirect post create, banner client overview |
/dashboard/clients/[id]/onboarding/[step] | — | — (stepper UI) | — | — | wizard nav |
/dashboard/clients/[id]/secrets | — | Oui | — | — | bouton header client |
/dashboard/clients/[id]/findings | — | Oui | — | — | bouton header client |
/dashboard/clients/[id]/remediation | — | Oui | — | — | bouton header client |
/dashboard/clients/[id]/remediation-plan | — | Oui | — | — | uniquement lien depuis docs hub client |
/dashboard/clients/[id]/trajectory | — | Oui | — | — | bouton header client |
/dashboard/clients/[id]/documents | — | Oui | — | — | aucun lien header client, accès oblique |
/dashboard/clients/[id]/controls/[controlId] | — | Oui | — | — | cellule controlId dans tables audit |
/dashboard/audits | Oui | — | — | — | viewAll dashboard, breadcrumbs |
/dashboard/audits/[id] | — | Oui | — | — | table audits, recent runs, history tab client |
/dashboard/audits/[id]/diff | — | Oui | — | — | <CompareSelector> audit detail |
/dashboard/alerts | Oui | — | Bell icon | — | viewAll dashboard |
/dashboard/integrations | Oui | — | — | — | — |
/dashboard/documents | Oui (collapsible header) | — | — | Card “DocumentsOverview” sub-nav | empty state clients |
/dashboard/documents/governance | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/access | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/incidents | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/monitoring | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/onboarding | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/technical | Oui (sous-item) | (interne page) | — | Card hub docs | — |
/dashboard/documents/compliance | Oui (sous-item, badge roadmap) | (interne page) | — | Card hub docs | — |
/dashboard/settings | Oui | — | Header dropdown user | — | — |
/dashboard/settings/users | — | Non (back arrow) | — | Card sur settings hub | — |
/dashboard/settings/users/[id]/permissions | — | (interne page) | — | — | icon dans table users |
/dashboard/settings/roles | — | (interne page) | — | Card sur settings hub | — |
/dashboard/settings/access-review | — | (interne page) | — | Card sur settings hub | — |
/dashboard/settings/api-keys | — | Non (back arrow) | — | Card sur settings hub | — |
/dashboard/settings/audit-log | — | Non (back arrow) | — | Card sur settings hub | — |
/dashboard/settings/notifications | — | Non (rien) | — | Card sur settings hub | — |
/dashboard/help/dr | — | — (sidebar DR) | — | Card conditionnelle settings hub | — |
/dashboard/help/dr/[...slug] | — | Lien retour index | — | — | DrDocsSidebar |
/portal | Oui Portal | — | — | — | redirect impersonate |
/portal/audits | Oui Portal | — | — | — | viewAll portal home |
/portal/audits/[id] | — | Non | — | — | lien “Voir” portal/audits |
/portal/findings | Oui Portal | — | — | — | — |
/portal/remediation | Oui Portal | — | — | — | — |
/portal/documents | Oui Portal | — | — | — | — |
/login | — | — | — | — | redirect not authenticated |
/ | — | — | — | — | post-deploy bare URL |
Routes API ayant une UI dérivée (downloads / actions trigger)
Ces endpoints n’ont pas de page propre mais sont déclenchés depuis les boutons UI :
| API | Déclenché depuis | UI affectée |
|---|
POST /api/v1/audits/trigger | <TriggerAuditButton> modal | toast + refresh client overview |
GET /api/v1/audits/[id]/report{,/excel,/html} | <AuditActions> PDF/Excel/HTML | blob download |
POST /api/v1/audits/[id]/retry | <AuditActions> Retry | toast + refresh |
POST /api/v1/audits/[id]/sync | <AuditActions> Sync | toast + refresh |
PATCH /api/v1/audits/[id] (action: cancel) | <AuditActions> Cancel | toast + refresh |
DELETE /api/v1/audits/[id] | <AuditActions> Delete | toast + refresh |
GET /api/v1/clients/[id]/documents/[type] | <GrcDocumentCards> button + <RemediationPlanPage> button + portal /remediation 2 boutons | blob download |
GET /api/v1/audit-log?format=csv | <AuditLogContent> boutons CSV / CSV+before/after | navigation directe (window.location) |
POST /api/portal/impersonate | <ImpersonateClientButton> + <PortalClientPicker> | redirect /portal |
DELETE /api/portal/impersonate | <PortalImpersonationBanner> “Quitter” | redirect /dashboard |
POST /api/v1/api-keys | dialog /dashboard/settings/api-keys | display new key once |
Notes méthodologiques
- Toutes les routes ci-dessus sont issues de fichiers
page.tsx réels sous platform/src/app/.
- Les permissions et gardes-fous (
requirePermission, getPortalClientIds, requireClientAccess) sont mentionnés quand explicites dans le code mais n’altèrent pas l’arbre de navigation.
- Les composants partagés clés référencés :
<Sidebar>, <PortalSidebar>, <Header>, <DrDocsSidebar>, <OnboardingShell>, <AuditActions>, <GrcDocumentCards>, <RemediationPlanView>, <RemediationWorkspace>, <TriggerAuditButton>, <GuideFilterDialog>, <ImpersonateClientButton>, <PortalImpersonationBanner>, <ControlResultsTable>.
- Les sous-routes documents catégorie utilisent toutes le même
<DocumentCategoryPage> factorisé (platform/src/app/dashboard/documents/_components/document-category-page.tsx) — leurs breadcrumbs sont rendus localement à l’intérieur du composant via le pattern “Documents > [Title]” en simple lien (pas un vrai <Breadcrumb> shadcn).