[Story-735] Support access grants frontend list + revoke

Story 735Epic None25 files · +1282/−7

PR #210 · pramaan-io/pramaan-app · merged 2026-06-01

How it flows

sequenceDiagram
  autonumber
  participant browser as Browser
  participant server as Server
  participant gateway as Gateway
  browser->>server: load /settings/firm/grants
  server->>gateway: list grants (schema-validated)
  gateway->>server: grants payload
  server->>browser: list / empty / error
  browser->>browser: click revoke → confirm
  browser->>server: revoke action (firm-admin only)
  server->>gateway: revoke grant (schema-validated)
  server->>browser: list refreshes

What does NOT happen

Server action rejects non-admins before the gateway call.
Schema check blocks bad payloads before they reach the table.
Error state surfaces fetch failures — list never silently blanks.
Auth-required Playwright spec is skipped by default in CI.

Files changed (25)

File±
docs/walkthroughs/story-735-support-grants-page.png+0
docs/walkthroughs/story-735-walkthrough.html+174
src/app/[locale]/(app)/settings/firm/grants/actions.ts+38
src/app/[locale]/(app)/settings/firm/grants/page.tsx+58 −7
src/components/settings/support-grants/results.ts+3
src/components/settings/support-grants/support-grant-revoke-dialog.stories.tsx+56
src/components/settings/support-grants/support-grant-revoke-dialog.tsx ★+83
src/components/settings/support-grants/support-grant-row.tsx ★+66
src/components/settings/support-grants/support-grants-content.stories.tsx+44
src/components/settings/support-grants/support-grants-content.tsx ★+73
src/components/settings/support-grants/support-grants-empty-state.tsx+12
src/components/settings/support-grants/support-grants-error.tsx+18
src/components/settings/support-grants/support-grants-heading.tsx+20
src/components/settings/support-grants/support-grants-page.stories.tsx+51
src/components/settings/support-grants/support-grants-table.stories.tsx+36
src/components/settings/support-grants/support-grants-table.tsx+34
src/lib/support-grants/format.ts+40
src/lib/support-grants/gateway.ts+53
src/lib/support-grants/mocks.ts+28
src/lib/support-grants/types.ts+7
tests/e2e/support-grants.spec.ts+29
tests/setup.ts+24
tests/unit/support-grants-actions.test.ts+100
tests/unit/support-grants-content.test.tsx+84
tests/unit/support-grants-contract.test.ts+151