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:
daniel-c-harvey
2026-06-12 23:07:15 -04:00
parent 5f7eaed112
commit 2f47efeb46
22 changed files with 970 additions and 45 deletions
@@ -63,14 +63,7 @@
Label="Genre"
Variant="Variant.Outlined" />
<MudSelect @bind-Value="_form.ReleaseType"
Label="Release Type"
Variant="Variant.Outlined">
@foreach (var releaseType in Enum.GetValues<ReleaseType>())
{
<MudSelectItem Value="releaseType">@releaseType</MudSelectItem>
}
</MudSelect>
<MediumFields @bind-Medium="_form.Medium" @bind-ReleaseType="_form.ReleaseType" Disabled="_busy" />
<MudNumericField @bind-Value="_form.TrackNumber"
Label="Track Number"
@@ -304,6 +297,10 @@
public string? ImagePath { get; set; }
public DateTime? ReleaseDate { get; set; }
public ReleaseType ReleaseType { get; set; } = ReleaseType.Single;
// Drives ReleaseType visibility via MediumFields. NOTE: not persisted — PUT api/track/meta has
// no medium field, so a medium change on edit is form-shape only until the API grows one.
public ReleaseMedium Medium { get; set; } = ReleaseMedium.Cut;
public int TrackNumber { get; set; } = 1;
public static TrackEditForm From(TrackDto track) => new()
@@ -317,6 +314,7 @@
? d.ToDateTime(TimeOnly.MinValue)
: null,
ReleaseType = track.Release?.ReleaseType ?? ReleaseType.Single,
Medium = track.Release?.Medium ?? ReleaseMedium.Cut,
TrackNumber = track.TrackNumber
};
}