@using DeepDrftModels.Enums @using Microsoft.AspNetCore.Components.Forms @if (SelectedImageFile is { } selectedImage) { Selected: @selectedImage.Name } else if (ExistingImagePreviewUrl is { } previewUrl) { Current cover art. } else { No cover art — optional. } @if (SelectedImageFile is not null) { Will upload on submit. } @code { [Parameter] public string AlbumName { get; set; } = string.Empty; [Parameter] public EventCallback AlbumNameChanged { get; set; } [Parameter] public string Artist { get; set; } = string.Empty; [Parameter] public EventCallback ArtistChanged { get; set; } [Parameter] public string Genre { get; set; } = string.Empty; [Parameter] public EventCallback GenreChanged { get; set; } [Parameter] public string Description { get; set; } = string.Empty; [Parameter] public EventCallback DescriptionChanged { get; set; } [Parameter] public string ReleaseDate { get; set; } = string.Empty; [Parameter] public EventCallback ReleaseDateChanged { get; set; } [Parameter] public ReleaseType ReleaseType { get; set; } = ReleaseType.Single; [Parameter] public EventCallback ReleaseTypeChanged { get; set; } [Parameter] public ReleaseMedium Medium { get; set; } = ReleaseMedium.Cut; [Parameter] public EventCallback MediumChanged { get; set; } [Parameter] public IBrowserFile? SelectedImageFile { get; set; } [Parameter] public EventCallback SelectedImageFileChanged { get; set; } // Session-only — the held hero-image file, threaded through MediumFields to SessionFields. // Ignored for Cut/Mix media. The parent (BatchUpload) owns it and uploads it after create. [Parameter] public IBrowserFile? HeroImageFile { get; set; } [Parameter] public EventCallback HeroImageFileChanged { get; set; } // Gates the hero file picker in SessionFields (threaded to MediumFields → SessionFields). // Set true only on the BatchUpload create path; leave false/absent on all edit paths. [Parameter] public bool AllowHeroUpload { get; set; } // BatchEdit only: when set (and no new file picked), preview the release's current cover. // The parent nulls this to drop the preview when the admin clears the existing cover. [Parameter] public string? ExistingImagePath { get; set; } [Parameter] public bool Disabled { get; set; } // Relative path — resolves against the Manager's own origin, proxied by ImageProxyController. private string? ExistingImagePreviewUrl => string.IsNullOrEmpty(ExistingImagePath) ? null : $"/api/image/{Uri.EscapeDataString(ExistingImagePath)}"; // MediumFields uses two-way @bind; bridge its bindings to this component's own // parameter/EventCallback pairs so the parent form stays the single owner of the values. private ReleaseMedium MediumBinding { get => Medium; set => MediumChanged.InvokeAsync(value); } private ReleaseType ReleaseTypeBinding { get => ReleaseType; set => ReleaseTypeChanged.InvokeAsync(value); } private Task HandleImageFileSelected(InputFileChangeEventArgs e) => SelectedImageFileChanged.InvokeAsync(e.File); private Task ClearSelectedFile() => SelectedImageFileChanged.InvokeAsync(null); }