@* 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(); } }