feat(cms): bring per-medium tab grids to ALL-tab parity (§8.C)

Render the rich CmsAlbumBrowser filtered per medium in the CUTS/SESSIONS/MIXES
tabs via an optional RowActions slot; retire the thin CmsMediumTable. Session
hero and Mix waveform actions preserved; ALL tab and TrackList unchanged.
This commit is contained in:
daniel-c-harvey
2026-06-13 22:33:31 -04:00
parent 4b9e6531fd
commit 3ef98aa3ff
8 changed files with 151 additions and 191 deletions
@@ -2,27 +2,20 @@
@using DeepDrftModels.DTOs
@using DeepDrftModels.Enums
@* Cut-filtered release grid for the Release Archive's CUTS tab (Phase 9 §8.A). Derived from the same
CmsMediumBrowserBase pattern the Session/Mix browsers use, so a fourth medium would follow the same
shape with no parallel path. Cuts carry no medium-specific row action (no hero, no waveform), so the
ActionContent slot renders nothing — every row still gets the shared Edit affordance from
CmsMediumTable. Embedded as tab content only; it has no standalone @page route. *@
<CmsMediumTable TRow="CutRow"
Rows="Rows"
Loading="Loading"
ReleaseAccessor="@(row => row.Release)"
ThumbUrl="@(key => ThumbUrl(key))"
TitleHeader="Cut"
EmptyMessage="No cuts found.">
<ActionContent Context="row">
</ActionContent>
</CmsMediumTable>
@* CUTS tab content (Phase 9 §8.A/§8.C): the rich CmsAlbumBrowser grid filtered to Cut releases, so the
tab carries expand-tracks, delete, the Type chip, and per-row edit identically to the ALL tab — no
forked grid. Cuts have no medium-specific row action, so no RowActions slot is supplied; the grid
renders its shared edit/delete only. Embedded as tab content only; no standalone @page route. *@
<CmsAlbumBrowser Releases="Releases"
IsLoading="Loading"
OnReleasesChanged="ReloadAsync" />
@code {
protected override ReleaseMedium Medium => ReleaseMedium.Cut;
protected override string MediumNoun => "cuts";
protected override CutRow ToRow(ReleaseDto release) => new() { Release = release };
protected override ReleaseDto ReleaseOf(CutRow row) => row.Release;
public sealed class CutRow
{