@* ActionPanel: Fixierte Button-Leiste am unteren Bildschirmrand.
Entspricht dem
in ShowEnvelope.cshtml.
Wird angezeigt wenn der Empfänger das Dokument sieht (Status = ShowDocument).
Bei ReadOnly-Dokumenten wird nichts angezeigt.
Die Buttons lösen EventCallbacks aus. Die Eltern-Komponente (EnvelopePage)
entscheidet, was passiert (API-Call etc.).
Der ConfirmDialog wird über eine Referenz aufgerufen:
var confirmed = await _confirmDialog.ShowAsync("Titel", "Text");
WARUM EventCallbacks statt direkte API-Calls?
- Die Komponente bleibt "dumm" (keine Services, kein API-Wissen)
- Die Eltern-Page kann den gleichen Button-Click anders behandeln
- Einfacher zu testen *@
@if (!ReadOnly)
{
@* position-fixed: Bleibt am unteren Rand auch beim Scrollen.
Gleiche Positionierung wie im Web-Projekt. *@
@* Zurücksetzen-Button: Setzt alle Signaturen zurück.
Im Web-Projekt ist das der graue Button mit dem
Pfeil-gegen-den-Uhrzeigersinn-Icon. *@
@* Ablehnen-Button: Öffnet ConfirmDialog, dann EventCallback.
Im Web-Projekt ist das der rote Button mit dem X-Icon. *@
@* Unterschreiben-Button: Öffnet ConfirmDialog, dann EventCallback.
Im Web-Projekt ist das der grüne Button mit dem Briefumschlag-Icon. *@
}
@* ConfirmDialog: Wird nur gerendert wenn nötig (wenn ShowAsync aufgerufen wird).
Die Referenz (_confirmDialog) erlaubt uns, ShowAsync von den Button-Handlern aufzurufen. *@
@code {
// ── Parameter ──
/// Bei ReadOnly wird das gesamte Panel ausgeblendet
[Parameter]
public bool ReadOnly { get; set; }
/// Wird ausgelöst wenn der Benutzer "Unterschreiben" bestätigt
[Parameter]
public EventCallback OnSign { get; set; }
/// Wird ausgelöst wenn der Benutzer "Ablehnen" bestätigt
[Parameter]
public EventCallback OnReject { get; set; }
/// Wird ausgelöst wenn der Benutzer "Zurücksetzen" klickt
[Parameter]
public EventCallback OnRefresh { get; set; }
// ── Referenz auf den ConfirmDialog ──
///
/// Referenz auf die ConfirmDialog-Komponente.
///
/// WAS IST @ref?
/// Mit @ref speichert Blazor eine Referenz auf eine Kind-Komponente.
/// Dann kann man Methoden darauf aufrufen: _confirmDialog.ShowAsync(...)
/// Das ist wie document.getElementById() in JavaScript, nur typsicher.
///
private ConfirmDialog _confirmDialog = default!;
// ── Button-Handler ──
///
/// Unterschreiben: Erst bestätigen, dann Event auslösen.
/// Der ConfirmDialog zeigt "Möchten Sie das Dokument unterschreiben?"
/// Nur wenn der Benutzer "Ja" klickt, wird OnSign ausgelöst.
///
private async Task HandleSign()
{
var confirmed = await _confirmDialog.ShowAsync(
"Unterschreiben",
"Möchten Sie das Dokument wirklich unterschreiben? Diese Aktion kann nicht rückgängig gemacht werden.",
confirmText: "Unterschreiben",
confirmColor: "success");
if (confirmed)
await OnSign.InvokeAsync();
}
///
/// Ablehnen: Erst bestätigen, dann Event auslösen.
/// Roter Button im ConfirmDialog, weil Ablehnen destruktiv ist.
///
private async Task HandleReject()
{
var confirmed = await _confirmDialog.ShowAsync(
"Ablehnen",
"Möchten Sie das Dokument wirklich ablehnen? Diese Aktion kann nicht rückgängig gemacht werden.",
confirmText: "Ablehnen",
confirmColor: "danger");
if (confirmed)
await OnReject.InvokeAsync();
}
///
/// Zurücksetzen: Kein ConfirmDialog nötig, weil es nicht destruktiv ist.
/// Setzt nur die Signatur-Positionen zurück, der Empfänger kann danach
/// erneut signieren.
///
private async Task HandleRefresh()
{
await OnRefresh.InvokeAsync();
}
}