fix(cms): stabilize _specialColumns allocation and refresh stale comments

Allocate _specialColumns once in OnInitialized; update RowActions references to SpecialColumns in the medium browsers and base class.
This commit is contained in:
daniel-c-harvey
2026-06-15 11:26:21 -04:00
parent 5941f1f23a
commit 31084b09a4
4 changed files with 29 additions and 17 deletions
@@ -13,7 +13,7 @@ namespace DeepDrftManager.Components.Pages.Tracks;
/// it (§8.C parity — reuse, don't fork). This base owns the loading flag, the medium-filtered load, the
/// per-release row projection, and a cover-thumbnail helper; subclasses supply the <see cref="Medium"/>,
/// an error noun, and their bespoke per-row action (Session hero upload, Mix waveform generate) via the
/// rich grid's <c>RowActions</c> slot, looking their action-state row up with <see cref="RowFor"/>.
/// rich grid's <c>SpecialColumns</c> column model, looking their action-state row up with <see cref="RowFor"/>.
/// </summary>
/// <typeparam name="TRow">The subclass's row model wrapping a <see cref="ReleaseDto"/> plus its
/// medium-specific action state (upload/generate flags). The rich grid renders from the bare
@@ -42,8 +42,8 @@ public abstract class CmsMediumBrowserBase<TRow> : ComponentBase where TRow : cl
// it never sees TRow. Rebuilt on every (re)load so the grid re-projects against a fresh reference.
protected IReadOnlyList<ReleaseDto> Releases { get; private set; } = Array.Empty<ReleaseDto>();
// release.Id → action-state row, so a RowActions fragment (which the grid hands a ReleaseDto) can
// recover its TRow. Rebuilt alongside Rows so a refresh never leaves a stale row behind.
// release.Id → action-state row, so a SpecialColumns cell delegate (which the grid hands a ReleaseDto)
// can recover its TRow. Rebuilt alongside Rows so a refresh never leaves a stale row behind.
private Dictionary<long, TRow> _rowsById = new();
protected override async Task OnInitializedAsync() => await LoadAsync();