Files
EnvelopeGenerator/EnvelopeGenerator.ReceiverUI/EnvelopeGenerator.ReceiverUI.Client/Components/Envelope/EnvelopeInfoCard.razor
OlgunR 7aa9853756 Add reusable UI components and toast notification system
- 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
2026-03-23 12:37:14 +01:00

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;
}