Board settings move out of /admin and onto the board #193

Closed
opened 2026-09-18 17:12:51 +00:00 by Grandiras · 2 comments
Owner

Part of #190; needs the roles step (#192) first. /admin/columns, /admin/tags and /admin/access edit one board, and after #192 the person entitled to do that is that board's admin, not the deployment's. They cannot stay behind the super-admin policy.

  • They become the board's own settings: /board/{id}/settings/{columns,tags,access}, plus rename and delete, which live on /admin/boards today. Gated by the board role, not by a policy — the same reason BoardAccess is not one: it is per row, not per page. Somebody on the board who is not its admin gets the board.denied treatment, not a redirect to a board they did not ask for.
  • /admin is what is left, and it is the super-admin's: the invite list (members, requests, invites). What /admin/boards becomes — a list of every board as metadata, with delete — is parked with the ban and delete design in #190; until then it can simply go, since creating a board moves to the home page and everything else on it moves here.
  • The nav follows. The Admin flyout is for the super-admin only. A board admin gets one "Board settings" entry while on a board they run. ActiveSection/AdminHref in NavHeader exist to carry the board across the five admin routes; with three of those routes board-scoped by path, most of that machinery should reduce rather than grow. Components/Admin/BoardScope.razor likely stops being needed — the board is in the URL and in the header.

Migrating

  • /admin/columns/{id}, /admin/tags/{id}, /admin/access/{id} redirect to the new address for the same board.
  • The bare forms meant "the default board". Redirect them to the first board this viewer administers, or home if there is none — and say so in the docs, because it is the one place this app substitutes a board, and it only does it for a URL that never named one.
  • LastPage needs nothing: the old paths it may have remembered redirect like any other.

docs/boards-and-permissions.md, docs/ui.md (the account menu, the admin flyout) and the route list in docs/orientation.md all change; DocumentationTests will catch the routes and the Covers: paths but not the prose. The Lunacy canvas has frames for every admin page — they move with this.

Part of #190; needs the roles step (#192) first. `/admin/columns`, `/admin/tags` and `/admin/access` edit one board, and after #192 the person entitled to do that is that board's admin, not the deployment's. They cannot stay behind the super-admin policy. - **They become the board's own settings**: `/board/{id}/settings/{columns,tags,access}`, plus rename and delete, which live on `/admin/boards` today. Gated by the board role, not by a policy — the same reason `BoardAccess` is not one: it is per row, not per page. Somebody on the board who is not its admin gets the `board.denied` treatment, not a redirect to a board they did not ask for. - **`/admin` is what is left, and it is the super-admin's**: the invite list (members, requests, invites). What `/admin/boards` becomes — a list of every board as metadata, with delete — is parked with the ban and delete design in #190; until then it can simply go, since creating a board moves to the home page and everything else on it moves here. - **The nav follows.** The Admin flyout is for the super-admin only. A board admin gets one "Board settings" entry while on a board they run. `ActiveSection`/`AdminHref` in `NavHeader` exist to carry the board across the five admin routes; with three of those routes board-scoped by path, most of that machinery should reduce rather than grow. `Components/Admin/BoardScope.razor` likely stops being needed — the board is in the URL and in the header. ## Migrating - `/admin/columns/{id}`, `/admin/tags/{id}`, `/admin/access/{id}` redirect to the new address for the same board. - The bare forms meant "the default board". Redirect them to the first board this viewer administers, or home if there is none — and say so in the docs, because it is the one place this app substitutes a board, and it only does it for a URL that never named one. - `LastPage` needs nothing: the old paths it may have remembered redirect like any other. `docs/boards-and-permissions.md`, `docs/ui.md` (the account menu, the admin flyout) and the route list in `docs/orientation.md` all change; `DocumentationTests` will catch the routes and the `Covers:` paths but not the prose. The Lunacy canvas has frames for every admin page — they move with this.
Collaborator

🤖 On it — the reply will link the full session transcript.

🤖 On it — the reply will link the full session transcript. <!-- opencode-run:task -->
Collaborator

Core flows work. Now testing the denial path, delete flow, and phone menu:

The run reported an error after replying: This operation was aborted

→ Opened PR: #202


⏱ 45m 3s · 197 steps · $1.1916 · tokens: 1693.0k in / 77.7k out (+29958.4k cache-read) · Go: 5h 56% · wk 47% · mo 25%

📜 Full session transcript

Core flows work. Now testing the denial path, delete flow, and phone menu: _The run reported an error after replying: This operation was aborted_ → Opened PR: https://git.grandiras.net/Grandiras/Ponente/pulls/202 --- ⏱ 45m 3s · 197 steps · $1.1916 · tokens: 1693.0k in / 77.7k out (+29958.4k cache-read) · Go: 5h 56% · wk 47% · mo 25% 📜 [Full session transcript](https://git.grandiras.net/Grandiras/opencode-bot/src/branch/opencode-logs/transcripts/Grandiras/Ponente/issue-193/run-2026-09-18T19-40-30-927Z.md) <!-- opencode-session:ses_f49f719d3ffeslH2A6Cfv3KBEg -->
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Grandiras/Ponente#193
No description provided.