fix(cms): fix grid cell vertical stacking; add per-track regenerate buttons

MixBrowser WaveformCell: wrap icon+button in MudStack Row. SessionBrowser
HeroCell: split into two SpecialActionColumns (thumb + button). AlbumBrowser
track table: always show regenerate button for Profile and High-res.
This commit is contained in:
daniel-c-harvey
2026-06-17 15:15:23 -04:00
parent 007033e7e8
commit fc32791cea
3 changed files with 57 additions and 42 deletions
@@ -128,36 +128,38 @@ else
<MudTd DataLabel="#">@track.TrackNumber</MudTd> <MudTd DataLabel="#">@track.TrackNumber</MudTd>
<MudTd DataLabel="Track Name">@track.TrackName</MudTd> <MudTd DataLabel="Track Name">@track.TrackName</MudTd>
<MudTd DataLabel="Profile"> <MudTd DataLabel="Profile">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="1">
@if (HasProfile(track.EntryKey)) @if (HasProfile(track.EntryKey))
{ {
<MudTooltip Text="Profile generated">
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" /> <MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" />
</MudTooltip>
} }
else <MudTooltip Text="@(HasProfile(track.EntryKey) ? "Regenerate profile" : "Generate profile")">
{
<MudTooltip Text="Generate profile">
<MudIconButton Icon="@Icons.Material.Filled.GraphicEq" <MudIconButton Icon="@Icons.Material.Filled.GraphicEq"
Size="Size.Small" Size="Size.Small"
Color="Color.Secondary" Color="Color.Secondary"
Disabled="@_generating.Contains(track.EntryKey)" Disabled="@_generating.Contains(track.EntryKey)"
OnClick="@(() => GenerateProfileAsync(track))" /> OnClick="@(() => GenerateProfileAsync(track))" />
</MudTooltip> </MudTooltip>
} </MudStack>
</MudTd> </MudTd>
<MudTd DataLabel="High-res"> <MudTd DataLabel="High-res">
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="1">
@if (HasHighRes(track.EntryKey)) @if (HasHighRes(track.EntryKey))
{ {
<MudTooltip Text="High-res datum generated">
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" /> <MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" />
</MudTooltip>
} }
else <MudTooltip Text="@(HasHighRes(track.EntryKey) ? "Regenerate high-res datum" : "Generate high-res datum")">
{
<MudTooltip Text="Generate high-res datum">
<MudIconButton Icon="@Icons.Material.Filled.Waves" <MudIconButton Icon="@Icons.Material.Filled.Waves"
Size="Size.Small" Size="Size.Small"
Color="Color.Secondary" Color="Color.Secondary"
Disabled="@_generatingHighRes.Contains(track.EntryKey)" Disabled="@_generatingHighRes.Contains(track.EntryKey)"
OnClick="@(() => GenerateHighResAsync(track))" /> OnClick="@(() => GenerateHighResAsync(track))" />
</MudTooltip> </MudTooltip>
} </MudStack>
</MudTd> </MudTd>
@* Per-track info tooltip (restored from the retired CmsTrackGrid's @* Per-track info tooltip (restored from the retired CmsTrackGrid's
.cms-track-info monospace block): EntryKey + OriginalFileName. *@ .cms-track-info monospace block): EntryKey + OriginalFileName. *@
@@ -94,6 +94,7 @@ else
@{ var row = RowFor(release); } @{ var row = RowFor(release); }
@if (row is not null) @if (row is not null)
{ {
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="1">
@if (row.HasWaveform) @if (row.HasWaveform)
{ {
<MudTooltip Text="Waveform generated"> <MudTooltip Text="Waveform generated">
@@ -121,6 +122,7 @@ else
<span>@(row.HasWaveform ? "Regenerate" : "Generate")</span> <span>@(row.HasWaveform ? "Regenerate" : "Generate")</span>
} }
</MudButton> </MudButton>
</MudStack>
} }
</text>; </text>;
@@ -85,13 +85,16 @@ else
protected override void OnInitialized() protected override void OnInitialized()
{ {
_specialColumns = new[] { new SpecialActionColumn("Hero", HeroCell) }; _specialColumns = new[]
{
new SpecialActionColumn("Hero", HeroThumbCell),
new SpecialActionColumn("", HeroButtonCell),
};
base.OnInitialized(); base.OnInitialized();
} }
// Per-row cell for the dedicated "Hero" column: thumbnail preview plus set/replace upload button with // Per-row cell for the "Hero" thumbnail column: just the image preview div.
// progress. Recovers the typed SessionRow via RowFor; skips rendering for a release not on the page. private RenderFragment<ReleaseDto> HeroThumbCell => release =>@<text>
private RenderFragment<ReleaseDto> HeroCell => release =>@<text>
@{ var row = RowFor(release); } @{ var row = RowFor(release); }
@if (row is not null) @if (row is not null)
{ {
@@ -103,6 +106,14 @@ else
{ {
<div class="cms-album-thumb cms-album-thumb--fallback"></div> <div class="cms-album-thumb cms-album-thumb--fallback"></div>
} }
}
</text>;
// Per-row cell for the "Hero Image" upload button column: set/replace upload button with progress.
private RenderFragment<ReleaseDto> HeroButtonCell => release =>@<text>
@{ var row = RowFor(release); }
@if (row is not null)
{
<MudFileUpload T="IBrowserFile" <MudFileUpload T="IBrowserFile"
Accept="image/*" Accept="image/*"
FilesChanged="@(file => UploadHeroAsync(row, file))" FilesChanged="@(file => UploadHeroAsync(row, file))"