@implements IAsyncDisposable @inject IJSRuntime JS

@Title

@ChildContent
@if (discardPrompt) {

Ungespeicherte Eingaben

Die Änderungen wurden noch nicht gespeichert. Möchtest du weiter bearbeiten oder die Eingaben verwerfen?

}
@code { [Parameter] public string Title { get; set; } = "Dialog"; [Parameter] public RenderFragment? ChildContent { get; set; } [Parameter] public EventCallback OnCancel { get; set; } [Parameter] public bool Dirty { get; set; } [Parameter] public bool Busy { get; set; } private readonly string titleId = "dialog-" + Guid.NewGuid().ToString("N"); private ElementReference element; private DotNetObjectReference? reference; private bool discardPrompt; private bool focusPrompt; private bool disposed; protected override async Task OnAfterRenderAsync(bool firstRender) { if (firstRender) { reference = DotNetObjectReference.Create(this); await JS.InvokeVoidAsync("duempelkasDialog.open", element, reference); } if (focusPrompt) { focusPrompt = false; await JS.InvokeVoidAsync("duempelkasDialog.focus", element, discardPrompt ? "[data-discard-continue]" : "[data-initial-focus],input,select,textarea,button"); } } [JSInvokable] public async Task RequestCloseAsync() { if (Busy || disposed) return; if (Dirty && !discardPrompt) { discardPrompt = true; focusPrompt = true; await InvokeAsync(StateHasChanged); } else if (discardPrompt) { await ContinueEditing(); await InvokeAsync(StateHasChanged); } else await OnCancel.InvokeAsync(); } private Task ContinueEditing() { discardPrompt = false; focusPrompt = true; return Task.CompletedTask; } private Task Discard() => OnCancel.InvokeAsync(); public async ValueTask DisposeAsync() { disposed = true; try { await JS.InvokeVoidAsync("duempelkasDialog.close", element); } catch (Exception ex) when (ex is JSException or JSDisconnectedException or ObjectDisposedException or TaskCanceledException) { } reference?.Dispose(); } }