- Introduce ActionPanel, EnvelopeInfoCard, TfaForm, ConfirmDialog, StatusPage, and Toast components for modular, presentational UI - Add ToastService for pub/sub toast notifications; register in DI - Refactor AccessCodeForm for improved UX and parameterization - Enhance MainLayout with Toast integration and better error handling - Standardize and extend app.css for new components and responsive design - All new components are "dumb" (no service/API knowledge), using EventCallbacks for parent interaction - ConfirmDialog supports awaitable user confirmation via TaskCompletionSource
121 lines
4.2 KiB
Plaintext
121 lines
4.2 KiB
Plaintext
@* EnvelopeInfoCard: Zeigt die Umschlag-Infos oberhalb des PDF-Viewers.
|
|
Entspricht dem Card-Bereich in ShowEnvelope.cshtml im Web-Projekt.
|
|
|
|
Wird angezeigt wenn der Empfänger erfolgreich authentifiziert ist
|
|
und das Dokument sehen darf.
|
|
|
|
"Dumme" Komponente: Keine Services, nur Parameter → Anzeige. *@
|
|
|
|
<div class="card mb-3">
|
|
@* ── Card Header: Logo + Fortschrittsbalken ──
|
|
Im Web-Projekt gibt es hier das signFLOW-Logo und darunter
|
|
"2/3 Signatures". Wir zeigen den Fortschritt nur wenn es
|
|
KEIN ReadOnly-Dokument ist (ReadOnly = nur lesen, nicht signieren). *@
|
|
<div class="card-header bg-white">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<strong class="text-primary">signFLOW</strong>
|
|
|
|
@if (!ReadOnly && SignatureTotal > 0)
|
|
{
|
|
<div class="d-flex align-items-center gap-2">
|
|
<div class="progress" style="width: 120px; height: 8px;">
|
|
<div class="progress-bar bg-success"
|
|
role="progressbar"
|
|
style="width: @ProgressPercent%"
|
|
aria-valuenow="@SignaturesDone"
|
|
aria-valuemin="0"
|
|
aria-valuemax="@SignatureTotal">
|
|
</div>
|
|
</div>
|
|
<small class="text-muted">@SignaturesDone/@SignatureTotal</small>
|
|
</div>
|
|
}
|
|
|
|
@if (ReadOnly)
|
|
{
|
|
<span class="badge bg-secondary">Nur Ansicht</span>
|
|
}
|
|
</div>
|
|
</div>
|
|
|
|
@* ── Card Body: Titel, Nachricht, Sender-Info ── *@
|
|
<div class="card-body">
|
|
@* Titel des Umschlags *@
|
|
<h5 class="card-title">@Title</h5>
|
|
|
|
@* Nachricht des Absenders — im Web-Projekt wird das mit Marked.js
|
|
als Markdown gerendert. Hier erstmal als Plain Text.
|
|
Markdown-Rendering kommt in Phase 6 (Feinschliff). *@
|
|
@if (!string.IsNullOrEmpty(Message))
|
|
{
|
|
<p class="card-text">@Message</p>
|
|
}
|
|
|
|
@* Sender-Info: Wer hat es gesendet, wann?
|
|
Im Web-Projekt steht hier:
|
|
"Gesendet am 15.03.2026 von Max Mustermann (max@firma.de)" *@
|
|
<p class="card-text">
|
|
<small class="text-muted">
|
|
@if (!string.IsNullOrEmpty(SenderName) && !string.IsNullOrEmpty(SenderEmail))
|
|
{
|
|
<span>
|
|
Gesendet
|
|
@if (SentDate is not null)
|
|
{
|
|
<span>am @SentDate.Value.ToString("dd.MM.yyyy")</span>
|
|
}
|
|
von @SenderName
|
|
(<a href="mailto:@SenderEmail">@SenderEmail</a>)
|
|
</span>
|
|
}
|
|
</small>
|
|
</p>
|
|
</div>
|
|
</div>
|
|
|
|
@code {
|
|
// ── Parameter ──
|
|
|
|
/// <summary>Titel des Umschlags (z.B. "Vertragsdokument")</summary>
|
|
[Parameter, EditorRequired]
|
|
public string Title { get; set; } = string.Empty;
|
|
|
|
/// <summary>Nachricht des Absenders</summary>
|
|
[Parameter]
|
|
public string? Message { get; set; }
|
|
|
|
/// <summary>Name des Absenders (z.B. "Max Mustermann")</summary>
|
|
[Parameter]
|
|
public string? SenderName { get; set; }
|
|
|
|
/// <summary>E-Mail des Absenders</summary>
|
|
[Parameter]
|
|
public string? SenderEmail { get; set; }
|
|
|
|
/// <summary>Datum an dem der Umschlag gesendet wurde</summary>
|
|
[Parameter]
|
|
public DateTime? SentDate { get; set; }
|
|
|
|
/// <summary>Ob das Dokument nur zum Lesen ist (kein Signieren)</summary>
|
|
[Parameter]
|
|
public bool ReadOnly { get; set; }
|
|
|
|
/// <summary>Anzahl bereits geleisteter Unterschriften</summary>
|
|
[Parameter]
|
|
public int SignaturesDone { get; set; }
|
|
|
|
/// <summary>Gesamtanzahl benötigter Unterschriften</summary>
|
|
[Parameter]
|
|
public int SignatureTotal { get; set; }
|
|
|
|
// ── Berechnete Werte ──
|
|
|
|
/// <summary>
|
|
/// Fortschritt in Prozent für den Balken.
|
|
/// Vermeidet Division durch Null.
|
|
/// </summary>
|
|
private int ProgressPercent =>
|
|
SignatureTotal > 0
|
|
? (int)((double)SignaturesDone / SignatureTotal * 100)
|
|
: 0;
|
|
} |