CMS Phase 9 Wave 3: Release Archive tab, medium selector, Session/Mix browsers
Renames Genre tab to Release Archive with switch-free medium card group (Enum.GetValues-driven). Adds MediumFields single dispatch + CutFields/SessionFields/ MixFields per-medium sections embedded by all five upload/edit forms. BatchUpload enforces single-track invariant for Session/Mix. Adds CmsSessionBrowser (hero-image upload) and CmsMixBrowser (waveform status + per-row Generate trigger). ICmsReleaseService/CmsReleaseService wraps api/release endpoints. Note: medium selector is forward-compat only — API write path pending.
This commit is contained in:
@@ -0,0 +1,37 @@
|
||||
@using DeepDrftModels.Enums
|
||||
@inject NavigationManager Navigation
|
||||
|
||||
@* Release Archive: one card per ReleaseMedium, driven off Enum.GetValues + a display-metadata table.
|
||||
No hardcoded three-arm switch in markup — adding a medium surfaces a new card automatically and only
|
||||
needs one new entry in MediumCards below. Card idiom mirrors CmsGenreBrowser (MudCard + swatch). *@
|
||||
<MudGrid Spacing="3" Class="mt-2">
|
||||
@foreach (var medium in Enum.GetValues<ReleaseMedium>())
|
||||
{
|
||||
var info = MediumCards[medium];
|
||||
<MudItem xs="12" sm="6" md="4">
|
||||
<MudCard Elevation="1"
|
||||
Style="cursor: pointer;"
|
||||
@onclick="@(() => Navigation.NavigateTo(info.Route))">
|
||||
<div class="@($"cms-medium-swatch cms-medium-swatch--{info.SwatchModifier}")"></div>
|
||||
<MudCardContent>
|
||||
<MudText Typo="Typo.h6">@info.Label</MudText>
|
||||
<MudText Typo="Typo.body2" Class="mud-text-secondary">@info.Descriptor</MudText>
|
||||
</MudCardContent>
|
||||
</MudCard>
|
||||
</MudItem>
|
||||
}
|
||||
</MudGrid>
|
||||
|
||||
@code {
|
||||
private sealed record MediumCardInfo(string Label, string Descriptor, string SwatchModifier, string Route);
|
||||
|
||||
// The one place medium → display + navigation target lives. A future medium adds one entry here;
|
||||
// the markup above is untouched. The enum→record dictionary is a switch, data-structured (§3.1).
|
||||
private static readonly IReadOnlyDictionary<ReleaseMedium, MediumCardInfo> MediumCards =
|
||||
new Dictionary<ReleaseMedium, MediumCardInfo>
|
||||
{
|
||||
[ReleaseMedium.Cut] = new("Cuts", "Studio singles, EPs, and albums", "cut", "/tracks/albums"),
|
||||
[ReleaseMedium.Session] = new("Sessions", "Single-track live recordings", "session", "/tracks/sessions"),
|
||||
[ReleaseMedium.Mix] = new("Mixes", "Single-track DJ mixes", "mix", "/tracks/mixes"),
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user