Files
PLDpro.Web/Components/Pages/DmsDetail.razor
Erik cae77ef1e3
All checks were successful
Build & Deploy PLDpro.Web Test to 192.168.1.100 / build-and-deploy (push) Successful in 1m15s
DMS Layout mit Fehlern
2026-02-09 21:50:24 +01:00

159 lines
5.4 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
@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
<PageTitle>Dokument</PageTitle>
@if (_loading)
{
<MudStack AlignItems=AlignItems.Center Justify=Justify.Center Class="pa-6">
<MudProgressCircular Indeterminate="true" />
</MudStack>
}
else if (_doc is null)
{
<MudPaper Class="pa-4">
<MudAlert Severity="Severity.Error">
Dokument nicht gefunden.
</MudAlert>
<MudButton Variant="Variant.Outlined" OnClick="Back" Class="mt-3">Zurück</MudButton>
</MudPaper>
}
else
{
<MudStack Spacing="2">
<!-- Kopfzeile -->
<MudStack Row="true" AlignItems=AlignItems.Center Spacing="2">
<MudText Typo="Typo.h5">@_doc.FileName</MudText>
<MudSpacer />
<MudButton Variant="Variant.Outlined"
StartIcon="@Icons.Material.Filled.ArrowBack"
OnClick="Back">
Zurück
</MudButton>
</MudStack>
<MudGrid>
<!-- Vorschau (Platzhalter) -->
<MudItem xs="12" md="7">
<MudPaper Class="pa-3" Elevation="1">
<MudText Typo="Typo.subtitle1">Vorschau</MudText>
<MudDivider Class="my-2" />
<MudAlert Severity="Severity.Info">
PDFVorschau Platzhalter später PDF.js/Viewer integrieren.
</MudAlert>
</MudPaper>
</MudItem>
<!-- Details & Aktionen -->
<MudItem xs="12" md="5">
<MudPaper Class="pa-3" Elevation="1">
<MudText Typo="Typo.subtitle1">Details</MudText>
<MudDivider Class="my-2" />
<!-- Nicht-generische Tabelle -->
<MudSimpleTable Dense="true">
<thead>
<tr>
<th>Feld</th>
<th>Wert</th>
</tr>
</thead>
<tbody>
<tr><td>Bucket</td><td>@_doc.Bucket</td></tr>
<tr><td>Key</td><td>@_doc.Key</td></tr>
<tr><td>Dateiname</td><td>@_doc.FileName</td></tr>
<tr><td>Pfad</td><td>@_doc.PathPrefix</td></tr>
<tr><td>Größe</td><td>@(_doc.Size?.ToString("N0")) Bytes</td></tr>
<tr><td>Geändert</td><td>@_doc.LastModified</td></tr>
</tbody>
</MudSimpleTable>
<MudStack Row="true" Spacing="1" Class="mt-3">
<MudButton Color="Color.Primary"
Variant="Variant.Filled"
StartIcon="@Icons.Material.Filled.Download"
OnClick="Download">
Download
</MudButton>
<MudButton Color="Color.Error"
Variant="Variant.Text"
StartIcon="@Icons.Material.Filled.Delete"
OnClick="Delete">
Löschen
</MudButton>
</MudStack>
</MudPaper>
</MudItem>
</MudGrid>
</MudStack>
}
@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 '<b>{_doc.FileName}</b>' 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);
}
}
}
}