Spaces: lifecycle UI polish — consequence dialog + name confirm, deactivated group, in-space banner #407

Merged
Cordy merged 7 commits from space-ui into main 2026-09-03 02:26:06 +00:00
Owner

Closes the #286 UI polish round (mockups A2/B2/C, operator-approved 2026-09-03).

Delete dialog (A2): consequence rows with icons (contents→trash, name tombstone, holds shield), space name in the title in normal type, and a type-the-name-to-confirm input gating the danger button — matching the admin inventory's confirmation. The recoverability copy is now dynamic and honest: it names the live retention window, or — when the automatic sweep is off, the default — states that nothing is removed automatically. Backed by a new neverPurge field on GET /api/v1/spaces/{name}/state (SpacesAPI.NeverPurge closure wired from TrashAutoPurge in both main.go branches).

Spaces listing (B2): deactivated is stamped on /spaces listing rows (fillSpaceStates, in-memory spacestore lookups — only owners/admins ever receive such rows). Deactivated spaces sink below an amber "Deactivated" divider, dimmed, amber chip (data-t="spoff"), sub-line "Hidden from members · you keep view-only access", and the footer counts them. The row visibly moving down is the deactivation feedback.

Inside a deactivated space (C): the listing response gains spaceDeactivated; the breadcrumb's "View only" chip gets an amber "Deactivated" sibling, and a one-line banner explains the state with an inline Reactivate button.

i18n ×4 (new keys follow the escape convention); TestFillSpaceStates covers the enrichment incl. nil-safety and path gating; vet/build/targeted tests/webcheck/web tests green on the runner.

Closes the #286 UI polish round (mockups A2/B2/C, operator-approved 2026-09-03). **Delete dialog (A2):** consequence rows with icons (contents→trash, name tombstone, holds shield), space name in the title in normal type, and a type-the-name-to-confirm input gating the danger button — matching the admin inventory's confirmation. The recoverability copy is now dynamic and honest: it names the live retention window, or — when the automatic sweep is off, the default — states that nothing is removed automatically. Backed by a new `neverPurge` field on `GET /api/v1/spaces/{name}/state` (`SpacesAPI.NeverPurge` closure wired from `TrashAutoPurge` in both main.go branches). **Spaces listing (B2):** `deactivated` is stamped on `/spaces` listing rows (`fillSpaceStates`, in-memory spacestore lookups — only owners/admins ever receive such rows). Deactivated spaces sink below an amber "Deactivated" divider, dimmed, amber chip (`data-t="spoff"`), sub-line "Hidden from members · you keep view-only access", and the footer counts them. The row visibly moving down is the deactivation feedback. **Inside a deactivated space (C):** the listing response gains `spaceDeactivated`; the breadcrumb's "View only" chip gets an amber "Deactivated" sibling, and a one-line banner explains the state with an inline **Reactivate** button. i18n ×4 (new keys follow the escape convention); `TestFillSpaceStates` covers the enrichment incl. nil-safety and path gating; vet/build/targeted tests/webcheck/web tests green on the runner.
Cordy merged commit 42f7cb1bfb into main 2026-09-03 02:26:06 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
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: Cordy/Cairn#407
No description provided.