From 09f6dc88f7d525ab53df8e89fc73e4cda625a613 Mon Sep 17 00:00:00 2001 From: daniel-c-harvey Date: Mon, 15 Jun 2026 11:30:54 -0400 Subject: [PATCH] docs: record CmsAlbumBrowser special-action column promotion --- COMPLETED.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/COMPLETED.md b/COMPLETED.md index f950182..d44a3f1 100644 --- a/COMPLETED.md +++ b/COMPLETED.md @@ -6,6 +6,22 @@ Newest entries at the top. Group by phase/wave header (mirroring `PLAN.md` / `CM --- +## CMS Grid Refinements + +### `CmsAlbumBrowser` special-action column promotion + +**Landed:** 2026-06-15 on branch `cms-special-action-columns`. + +Follow-on refinement of 8.C: the `RenderFragment? RowActions` slot that 8.C introduced into `CmsAlbumBrowser` was replaced by a dedicated, header-labelled column model so that medium-specific actions (Mix waveform, Session hero) each appear in their own named grid column rather than being merged into the shared Actions cell. + +- **What:** `CmsAlbumBrowser.razor` removed the `[Parameter] public RenderFragment? RowActions { get; set; }` slot. In its place: `[Parameter] public IReadOnlyList SpecialColumns { get; set; }` (defaulting to `Array.Empty()`). `SpecialActionColumn` is a new `sealed record` (`string Header`, `RenderFragment Cell`) in `DeepDrftManager/Components/Pages/Tracks/SpecialActionColumn.cs`. The grid renders one dedicated `` per declared column (between the Tracks header and the Actions header) and one `` per row per column. Child-row colspan moves from the hardcoded `9` to a computed `ColumnCount` property (`private const int BaseColumnCount = 9; private int ColumnCount => BaseColumnCount + SpecialColumns.Count`). +- **Why:** Merging a per-medium affordance into the generic Actions cell forced the admin to parse mixed content in a single column. Promoting each to its own labelled column gives the grid a discoverable header for every action kind and makes it obvious at a glance which column is the Waveform column vs. the Actions column. +- **Shape:** `CmsMixBrowser` declares one column: `new SpecialActionColumn("Waveform", WaveformCell)` — the Mix waveform generate/regenerate button with status icon. `CmsSessionBrowser` declares one column: `new SpecialActionColumn("Hero", HeroCell)` — the Session hero thumbnail preview plus set/replace upload button. `CmsCutBrowser` and the ALL-releases grid (`CmsAllReleasesGrid`) declare none; their column count and rendering are unchanged. Both callers allocate `_specialColumns` once in `OnInitialized` (field initializers cannot reference instance members; initialization is deferred to the first lifecycle hook). No change to `CmsMediumBrowserBase.cs`, `TrackList.razor`, or any other file. + +**Completion note:** `CmsAlbumBrowser.razor` — `RowActions` parameter removed; `SpecialColumns` parameter added; `BaseColumnCount = 9` constant + `ColumnCount` computed property added; header and row loops updated to `foreach (var column in SpecialColumns)`. `SpecialActionColumn.cs` (new file, `DeepDrftManager/Components/Pages/Tracks/`): `public sealed record SpecialActionColumn(string Header, RenderFragment Cell)`. `CmsMixBrowser.razor` — `RowActions` fragment replaced with `_specialColumns` field (allocated in `OnInitialized`) passed via `SpecialColumns="_specialColumns"`. `CmsSessionBrowser.razor` — same pattern. `CmsCutBrowser.razor` and `CmsAllReleasesGrid.razor` — no change (declare no special columns). No automated tests (no bUnit harness in DeepDrftTests; consistent with all prior Wave 8 / post-Phase-9 CMS tracks). + +--- + ## Phase 9 — Release Medium Types ### 9.7 Wave 7 — Domain Invariant Hardening: per-medium track cardinality