Make release Medium writable via upload + meta-edit; resolve detail-page track by releaseId not album title

This commit is contained in:
daniel-c-harvey
2026-06-13 11:34:45 -04:00
parent ea018beb3e
commit 8b62915083
15 changed files with 314 additions and 28 deletions
@@ -55,9 +55,10 @@
<MudGrid>
<MudItem xs="12" md="5">
@* TODO: When medium write path lands, collapse to single-track slot here for Session/Mix
(matching BatchUpload's @if (_medium == ReleaseMedium.Cut) guard). Until then,
BatchEdit's track list is unrestricted because _medium is read-only on the edit form. *@
@* The medium write path persists _medium on save (9.5.B). BatchEdit still shows the full
multi-track list for every medium; collapsing to a single-track slot for Session/Mix
(matching BatchUpload's @if (_medium == ReleaseMedium.Cut) guard) is deferred form-shape
work, not part of the write-path wiring. *@
<BatchTrackList Tracks="_tracks"
@bind-SelectedIndex="_selectedIndex"
Disabled="_saving"
@@ -131,9 +132,9 @@
private ReleaseType _releaseType = ReleaseType.Single;
private ReleaseMedium _medium = ReleaseMedium.Cut;
// The medium selector drives ReleaseType visibility. NOTE: the metadata update endpoint
// (PUT api/track/meta) has no medium field, so a medium change is not persisted on save today —
// the selector reflects/adjusts local form shape only. Persisting medium-on-edit is an API change.
// The medium selector drives ReleaseType visibility and is persisted on save: every UpdateAsync /
// UploadTrackAsync call below passes _medium, and PUT api/track/meta resets ReleaseType to its
// default server-side for a non-Cut medium.
private void OnMediumChanged(ReleaseMedium medium) => _medium = medium;
protected override async Task OnInitializedAsync()
@@ -373,6 +374,7 @@
releaseDate,
imagePathForUpdate,
_releaseType,
_medium,
trackNumber);
if (!updateResult.Success)
@@ -407,7 +409,8 @@
row.WavFile.Name,
createdByUserId,
_releaseType,
trackNumber);
trackNumber,
_medium);
if (!uploadResult.Success || uploadResult.Value is null)
{
@@ -433,6 +436,7 @@
releaseDate,
linkPath,
_releaseType,
_medium,
trackNumber);
if (!linkResult.Success)
@@ -320,6 +320,7 @@
string.IsNullOrWhiteSpace(_releaseDate) ? null : (DateOnly?)DateOnly.ParseExact(_releaseDate, "yyyy-MM-dd"),
imgPath,
_releaseType,
_medium,
trackNumber);
if (!linkResult.Success)
@@ -210,6 +210,7 @@
releaseDate,
string.IsNullOrEmpty(_form.ImagePath) ? "" : _form.ImagePath,
_form.ReleaseType,
_form.Medium,
_form.TrackNumber);
if (updated.Success)
{
@@ -298,8 +299,8 @@
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.
// Drives ReleaseType visibility via MediumFields and is persisted on save (PUT api/track/meta
// carries Medium). A non-Cut medium resets ReleaseType to its default server-side.
public ReleaseMedium Medium { get; set; } = ReleaseMedium.Cut;
public int TrackNumber { get; set; } = 1;