Skip to content

fix(nav): stop the domain settings page claiming the platform's "Settings" - #760

Merged
rubenvdlinde merged 1 commit into
developmentfrom
fix/adr-079-settings-surface
Aug 7, 2026
Merged

fix(nav): stop the domain settings page claiming the platform's "Settings"#760
rubenvdlinde merged 1 commit into
developmentfrom
fix/adr-079-settings-surface

Conversation

@rubenvdlinde

Copy link
Copy Markdown
Contributor

gate-63 (ADR-079) blocks every procest manifest edit, not just one PR. It reports PASS on development only because it skips when the manifest is not in the diff — so the first PR to touch src/manifest.json inherits two failures it did not cause. #758 hit exactly that.

finding
D1 page Settings is a type:settings page whose id and title claim the platform meaning of Settings, while app configuration belongs at /settings/admin/<app>
D4 a settings-foldout entry labelled Settings inside a foldout button already called Settings — the nav literally renders Settings > Settings

Renamed, not deleted — and the distinction matters

The gate's WARN suggests deleting the in-app page as a duplicate of lib/Settings/AdminSettings.php. It is not a duplicate. CaseTypesMenu routes to this same page, so it hosts the case-type management surface — the one admin-settings.spec.ts asserts renders "its management surface and add control". Deleting it would have removed a live surface to satisfy a lint.

D1's own wording allows the safe remedy: "a domain page that happens to be called settings must be renamed".

page id             Settings -> ProcestConfiguration
page title          Settings -> Configuration
section title       Settings -> Configuration
SettingsMenu label  Settings -> Configuration   (D4)

The route path /settings is deliberately unchanged — it is a bookmarkable URL, the gate keys on id/title rather than path, and pages.spec.ts navigates to it three times.

A page id is its vue-router route name, so the rename had real callers

  • src/views/DoorlooptijdDashboard.vue pushed { name: 'Settings' } from the "Go to Settings" empty-state button. Updated — otherwise that button would have navigated nowhere.
  • tests/e2e/navigation.spec.ts targets the gear foldout by testid and still passes: the foldout legitimately says "Settings". Its comment warned about colliding with the SettingsMenu entry — which is precisely the collision D4 describes and this PR removes. Comment updated to say so.

Also fixes the gate-45 finding this pulled into scope

Three skeleton loaders in DoorlooptijdDashboard.vue animate indefinitely with no prefers-reduced-motion fallback (WCAG 2.3.3). An indefinite pulse is what someone with vestibular sensitivity sets that preference to avoid. The animation is now dropped under the media query and replaced with a dimmed static state, so a skeleton still reads as "not real data yet" rather than becoming indistinguishable from a loaded card.

Verified

  • ALL 59 APPLICABLE GATES GREEN — and all 59 ran.
  • check:manifest passes (58 pages, 0 ajv errors).
  • gate-63's remaining output is the non-blocking duplicate-home WARN. That stands as a genuine question for the PO — should the in-app configuration screen exist at all? — rather than something to silence by deleting a working screen.

Unblocks #758.

…ings"

gate-63 (ADR-079) blocks EVERY procest manifest edit, not just one PR. It
reports PASS on development only because it SKIPS when the manifest is not in
the diff — so the first PR to touch src/manifest.json inherits two failures it
did not cause. procest#758 hit exactly that.

  D1  page 'Settings' is a type:settings page whose id and title claim the
      platform meaning of Settings, while app configuration belongs at
      /settings/admin/<app>.
  D4  a settings-foldout entry labelled 'Settings' inside a foldout button
      already called Settings — the nav literally renders Settings > Settings.

FIXED BY RENAMING, NOT DELETING, and the distinction matters. The gate's WARN
suggests deleting the in-app page as a duplicate of lib/Settings/AdminSettings
.php. It is not a duplicate: CaseTypesMenu routes to this same page, so it
HOSTS the case-type management surface — the one admin-settings.spec.ts
asserts renders "its management surface and add control". Deleting it would
have removed a live surface to satisfy a lint. D1's own wording allows the
safe remedy: "a domain page that happens to be called settings must be
RENAMED".

  page id     Settings -> ProcestConfiguration
  page title  Settings -> Configuration
  section     Settings -> Configuration
  SettingsMenu label  Settings -> Configuration   (D4)

THE ROUTE PATH /settings IS DELIBERATELY UNCHANGED. It is a bookmarkable URL,
the gate keys on id/title rather than path, and pages.spec.ts navigates to
/index.php/apps/procest/settings three times.

A page id IS its vue-router route name, so the rename has real callers:

  src/views/DoorlooptijdDashboard.vue pushed { name: 'Settings' } from the
  "Go to Settings" empty-state button — updated, or that button would have
  navigated nowhere.

  tests/e2e/navigation.spec.ts targets the gear foldout by testid and still
  passes: the foldout legitimately says "Settings". Its comment warned about
  colliding with the SettingsMenu entry, which is precisely the collision D4
  describes and this commit removes — comment updated to say so.

ALSO FIXES the pre-existing gate-45 finding this pulled into scope: three
skeleton loaders in DoorlooptijdDashboard.vue animate indefinitely with no
prefers-reduced-motion fallback (WCAG 2.3.3). An indefinite pulse is what
someone with vestibular sensitivity sets that preference to avoid. The
animation is now dropped under the media query and replaced with a dimmed
static state, so a skeleton still reads as "not real data yet" rather than
becoming indistinguishable from a loaded card.

Verified: ALL 59 APPLICABLE GATES GREEN, all 59 ran; check:manifest passes
(58 pages, 0 ajv errors). gate-63's remaining output is the non-blocking
duplicate-home WARN, which stands as a genuine question for the PO rather
than something to silence by deleting a working screen.
@rubenvdlinde
rubenvdlinde merged commit d566158 into development Aug 7, 2026
32 of 34 checks passed
@rubenvdlinde
rubenvdlinde deleted the fix/adr-079-settings-surface branch August 7, 2026 11:18
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

Quality Report — ConductionNL/procest @ 7d06947

Check PHP Vue Security License Tests
lint
phpcs
phpmd
psalm
phpstan
phpmetrics
eslint
stylelint
build
check-manifest
check-vue3-compile
test-l10n
composer ✅ 100/100
npm ✅ 552/552
PHPUnit
Newman ⏭️
Playwright
Hydra gates

Quality workflow — 2026-08-07 11:20 UTC

Download the full PDF report from the workflow artifacts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant