All checks were successful
Build & Deploy PLDpro.Web Test to 192.168.1.100 / build-and-deploy (push) Successful in 1m15s
159 lines
5.4 KiB
Plaintext
159 lines
5.4 KiB
Plaintext
@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">
|
||
PDF‑Vorschau 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);
|
||
}
|
||
}
|
||
}
|
||
} |