@page "/dms/detail/{Bucket}/{*Key}" @using MudBlazor @using Pldpro.Web.UI.Models @inject Pldpro.Web.UI.Services.IDocumentClient Client @inject NavigationManager Nav @inject IDialogService Dialogs @inject ISnackbar Snackbar Dokument @if (_loading) { } else if (_doc is null) { Dokument nicht gefunden. Zurück } else { @_doc.FileName Zurück Vorschau PDF‑Vorschau Platzhalter – später PDF.js/Viewer integrieren. Details Feld Wert Bucket@_doc.Bucket Key@_doc.Key Dateiname@_doc.FileName Pfad@_doc.PathPrefix Größe@(_doc.Size?.ToString("N0")) Bytes Geändert@_doc.LastModified Download Löschen } @code { [Parameter] public string Bucket { get; set; } = default!; [Parameter] public string Key { get; set; } = default!; // Catch-all wird von Blazor decodiert private DocumentDetail? _doc; private bool _loading; protected override async Task OnParametersSetAsync() { _loading = true; try { _doc = await Client.GetAsync(Bucket, Key); } catch (Exception ex) { Snackbar.Add($"Fehler beim Laden: {ex.Message}", Severity.Error); _doc = null; } finally { _loading = false; } } private void Back() => Nav.NavigateTo("/dms/list"); private Task Download() { if (_doc is null) return Task.CompletedTask; var url = Client.GetDownloadUrl(_doc.Bucket, _doc.Key); Nav.NavigateTo(url, forceLoad: true); return Task.CompletedTask; } private async Task Delete() { if (_doc is null) return; // Du kannst alternativ ShowMessageBox verwenden, wenn du keinen eigenen ConfirmDialog nutzen willst: var confirm = await Dialogs.ShowMessageBox( title: "Dokument löschen", markupMessage: (MarkupString)$"Möchten Sie '{_doc.FileName}' endgültig löschen?", yesText: "Löschen", cancelText: "Abbrechen", options: new DialogOptions { CloseOnEscapeKey = true }); if (confirm == true) { try { await Client.DeleteAsync(_doc.Bucket, _doc.Key); Snackbar.Add("Dokument gelöscht.", Severity.Success); Nav.NavigateTo("/dms/list"); } catch (Exception ex) { Snackbar.Add($"Löschen fehlgeschlagen: {ex.Message}", Severity.Error); } } } }