feat(room): split About vs Manage IA + polish both pages (LC-454) #442
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/room-info-settings-redesign"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Rethinks the room admin information architecture and polishes both pages. Closes LC-454 (subtasks LC-455..459). IA was proposed and approved before building.
Information architecture (approved)
/room/{id}/info, any member): read-oriented. The "Docs" tab is renamed About (Description + Wiki); Pinned and Files unchanged; a new Preferences tab holds the personal per-room nickname. The delete-room Danger zone leaves this page./room/{id}/manage, admin/mod):GET /room/{id}/moderatorsnow 302-redirects to/managefor back-compat. The mutating action routes (POST grant, DELETE revoke, posting-policy, retention) keep their original URLs. Sections become standardized cards: Posting policy, Integrations (webhooks/email/feeds grouped), Roles & overrides, Message retention (caution card), and the Danger zone (delete room, moved here).Gating preserved (not loosened)
room_can_manage_overrides, which isenclave_can_manage(perms.rs) - so moving Delete here changes who can do it for nobody.is_room_moderator(unchanged, not folded into the stricter page gate).post_delete_roomis untouched; the type-to-confirm is client-side only (button disabled until the phrase matches + native confirm()). Save feedback is additive (new SettingsFeedback status + toast OOB to the global#lc-toast-region); no existinghx-swap-oobtarget changed.Polish
Shared
.lc-set-*cards +.btn/.inputeverywhere; one shared empty-state partial (icon + muted text) across description/wiki/pinned/files/overrides; posting-policy + nickname Saves return the settings status + toast (were silent); retention is a caution card with a state pill and a "preview only" note; unified headers; light/dark via tokens.How to test
delete this room; then it enables and submits (native confirm as a second guard).post_delete_roomunchanged.GET /room/{id}/manage403s and/moderators302s to it; the About page shows no Danger zone. Enclave owner/admin/site-admin see both. A room moderator who is not enclave-admin still reaches webhooks/email/feeds by their own routes (gate unchanged).Verification
just build-css,just check(clippy + fmt clean),just test,just test-saasall green (updated one contract assertion: the tab label "Docs" -> "About").just verifybuilt the release binary clean, but itsserver-upharness does not supply the mandatoryLETS_CHAT_BUNYIP_SSO_*startup vars, so the standalone server cannot boot to serve/loginin this sandbox (environmental, not a regression).Flagged separately (not in this PR)
Per the request: in the chat view, thread/reply rendering looks muddled - inline quoted-reply stubs and the "1 reply" pill don't clearly convey parent-reply-thread relationships. Left untouched here for a focused follow-up.
🤖 Generated with Claude Code
Room config was scattered across two chat-header pages with no clear model: "Info" mixed read content, a personal nickname setting, room metadata, and a destructive delete action; "Moderators" was really a room-admin settings page whose name undersold it. Reorganized to a read-vs-admin split (approved IA): - Info becomes read-oriented "About" (Description, Wiki on the renamed About tab; Pinned; Files) plus a new personal "Preferences" tab holding the per-room nickname. The Danger zone (delete room) leaves this page. - Moderators becomes "Manage" at /room/{id}/manage; GET /room/{id}/moderators 302-redirects there for back-compat. The mutating action routes (POST grant, DELETE revoke, posting-policy, retention) keep their original URLs. Sections become standardized cards: Posting policy, Integrations (webhooks/email/feeds grouped), Roles & overrides, Message retention (caution card), and the Danger zone (delete room) moved here. Gating preserved exactly: the Manage page stays room_can_manage_overrides (== enclave_can_manage, so moving Delete here changes who can do it for nobody); the integration routes stay is_room_moderator; post_delete_room is untouched. Polish: every section uses the .lc-set-* card vocabulary + .btn/.input; one shared empty-state partial (icon + muted text) across description/wiki/pinned/files/overrides; posting-policy and nickname Saves now return the shared SettingsFeedback status + toast (additive - no existing hx-swap-oob target changed); retention is a caution card with a state pill and a "preview only" note; the delete-room Danger zone reuses the Settings delete-account type-to-confirm friction (client-side gate in roominfo.js, button disabled until the phrase matches, native confirm() as second guard); headers unified with Settings/Transcripts; light/dark via tokens. Verified: just build-css, just check (clippy+fmt clean), just test, just test-saas all green. just verify built the release binary clean but its server-up harness does not supply the mandatory LETS_CHAT_BUNYIP_SSO_* startup vars, so the standalone server cannot boot to serve /login in this sandbox (environmental, not a regression). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>