4701804594
Session upload now carries a deferred hero-image input; the submit handler creates the release then POSTs the held hero to the existing resource-addressed endpoint. Hero is optional with a non-blocking warn-if-missing gate. The per-row hero upload in CmsSessionBrowser remains the replace/correct path.
52 lines
2.4 KiB
Plaintext
52 lines
2.4 KiB
Plaintext
@using Microsoft.AspNetCore.Components.Forms
|
|
|
|
@* Session-medium fields. The hero image is resource-addressed (POST api/release/{id}/session/hero-image)
|
|
and therefore cannot be uploaded until the release exists. The file is selected here, held by the
|
|
parent form, and uploaded after the create call returns a release id — the same deferred-upload
|
|
pattern AlbumHeaderFields uses for cover art ("Will upload on submit"). The hero is optional; the
|
|
parent warns (does not block) when a Session is submitted without one. *@
|
|
<MudItem xs="12">
|
|
<MudField Label="Hero Image" Variant="Variant.Outlined" InnerPadding="false">
|
|
<MudStack Spacing="3">
|
|
<MudText Typo="Typo.body2" Color="Color.Default">
|
|
Sessions are single-track live releases. The hero image is the session's primary visual identity.
|
|
</MudText>
|
|
|
|
@if (HeroImageFile is { } selectedHero)
|
|
{
|
|
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
|
<MudText Typo="Typo.body2" Color="Color.Default">Selected: @selectedHero.Name</MudText>
|
|
<MudIconButton Icon="@Icons.Material.Filled.Clear"
|
|
Color="Color.Error"
|
|
Size="Size.Small"
|
|
Disabled="Disabled"
|
|
OnClick="ClearHeroFile"
|
|
aria-label="Cancel hero image selection" />
|
|
</MudStack>
|
|
}
|
|
else
|
|
{
|
|
<MudText Typo="Typo.body2" Color="Color.Default">No hero image — optional, but recommended.</MudText>
|
|
}
|
|
|
|
<InputFile OnChange="HandleHeroFileSelected" accept="image/*" disabled="@Disabled" />
|
|
@if (HeroImageFile is not null)
|
|
{
|
|
<MudText Typo="Typo.caption">Will upload on submit.</MudText>
|
|
}
|
|
</MudStack>
|
|
</MudField>
|
|
</MudItem>
|
|
|
|
@code {
|
|
[Parameter] public IBrowserFile? HeroImageFile { get; set; }
|
|
[Parameter] public EventCallback<IBrowserFile?> HeroImageFileChanged { get; set; }
|
|
[Parameter] public bool Disabled { get; set; }
|
|
|
|
private Task HandleHeroFileSelected(InputFileChangeEventArgs e) =>
|
|
HeroImageFileChanged.InvokeAsync(e.File);
|
|
|
|
private Task ClearHeroFile() =>
|
|
HeroImageFileChanged.InvokeAsync(null);
|
|
}
|