feat(cms): Release Archive medium tab strip (ALL · CUTS · SESSIONS · MIXES), retire navigate-away cards

Replace the navigate-away ReleaseArchiveBrowser cards and the redundant top-level Releases
toggle with an in-page MudTabs strip under the Releases mode: ALL (CmsAllReleasesGrid) plus
one enum-driven tab per ReleaseMedium. Sessions/Mixes browsers gain an Embedded flag that
suppresses standalone page chrome when hosted as tab content; CmsCutBrowser is the new
Cut-filtered grid. /tracks/sessions, /tracks/mixes, /tracks/archive stay reachable by URL.
This commit is contained in:
daniel-c-harvey
2026-06-13 22:02:28 -04:00
parent 3f1230fd2d
commit 20084ace4f
7 changed files with 179 additions and 124 deletions
@@ -0,0 +1,31 @@
@inherits CmsMediumBrowserBase<CmsCutBrowser.CutRow>
@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>
@code {
protected override ReleaseMedium Medium => ReleaseMedium.Cut;
protected override string MediumNoun => "cuts";
protected override CutRow ToRow(ReleaseDto release) => new() { Release = release };
public sealed class CutRow
{
public required ReleaseDto Release { get; set; }
}
}