Files
descrybe/docs/plan-permissions/08-admin-ui.md
T
greeneclipse 8580c996c3 Initial commit of Descrybe v2 without local scratch artifacts.
Drop one-shot tmp/axe scripts and agent i18n scratch so the Gitea tree is deployable.
2026-08-09 22:47:43 +02:00

3.5 KiB

08 — Admin UI: plan features & global section switches (agent 8/10)

Superseded for the admin-roles wave: see ../admin-roles-support/08-permissions-ui.md (agent 8/20) — profiles, Legacy/A1 one-click, real APIs, shell tokens.

Owns: Admin frontend only — package feature checklist + global section masters.
Entry: /admin/billingPermissions tab (nav: Platform billing).
Design system: Same cards/tabs/badges/checkboxes as existing admin billing & settings.


UI entry paths

Path Role
/admin/billing Platform billing admin (gate: requirePlatformAdmin)
Tab Permissions Plan feature matrix + global section controls
Plans table → Edit features Jumps to Permissions tab
AdminNav → Platform billing apps/web/src/lib/components/AdminNav.svelte

Source files

File Intent
apps/web/src/routes/admin/billing/+page.svelte Hosts Permissions tab
apps/web/src/lib/components/admin/PlanPermissionsPanel.svelte Checklist UI
apps/web/src/lib/admin-plan-permissions.ts Admin API client + defaults
apps/web/src/lib/plan-feature-catalog.ts Catalog from 01-feature-keys.json

Features delivered

  1. Per-plan checklist — all catalog keys grouped by section; toggle each feature.
  2. Enable all / Disable all — for the selected plan.
  3. Global section controls — enable/disable a section for all plans; optional “section + features”.
  4. Default vs custom — badges: Default ladder / Default · custom flag (Enterprise) / Custom deal / Client deal + is_custom / Standard.
  5. Saved state — optimistic toggle with revert on error; clear loading (“Saving…”) and success/error alerts.
  6. API wiring — contract paths from 03-permission-contract.md; stub/in-session fallback when agent 5 routes are 404/501.

i18n: admin surfaces use plain English (no __() in existing admin pages) — matched that pattern.


API contract used (agent 5 / agent 3)

Method Path Use
GET /api/admin/plans List plans; read features / resolved_features when present
POST /api/admin/plans Upsert plan including features override map
GET /api/admin/feature-gates Global sections + features masters
PUT /api/admin/feature-gates Replace global maps
PUT /api/admin/feature-gates/sections/{section} Body { enabled, apply_features? }
POST /api/admin/plans/{id}/features/enable-all Convenience (optional; falls back to upsert all-true)
POST /api/admin/plans/{id}/features/disable-all Convenience (optional; falls back to upsert all-false)

ASSUMPTION: Until agent 5 mounts feature fields/gates, UI shows client-side default matrix (contract §4) and keeps toggles in-session when APIs return 404/501. Info banner explains stub mode.


Manual verify

  1. Sign in as platform admin → /admin/billing.
  2. Open Permissions.
  3. Select Free vs a custom plan — badges and default checklist differ.
  4. Toggle one feature; Enable all / Disable all.
  5. Flip a global section; try “Disable section + features”.
  6. When backend ready: reload page and confirm persisted state.

Blockers / notes for siblings

  • Agent 5 must return features / resolved_features on admin plans and mount /api/admin/feature-gates*.
  • Agent 4 must add plans.features + platform_feature_gates.
  • Agent 9 consumes effective features for dashboard gating (not this UI).