diff --git a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs index 822a57fe..0a1ce4a4 100644 --- a/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs +++ b/EnvelopeGenerator.Application/Common/Dto/EnvelopeDto.cs @@ -86,6 +86,41 @@ public record EnvelopeDto : IEnvelope /// public int? CertificationType { get; set; } + /// + /// + /// + public int? FinalEmailToCreator { get; set; } + + /// + /// + /// + public int? FinalEmailToReceivers { get; set; } + + /// + /// + /// + public bool? SendReminderEmails { get; set; } + + /// + /// + /// + public int? FirstReminderDays { get; set; } + + /// + /// + /// + public int? ReminderIntervalDays { get; set; } + + /// + /// + /// + public int? ExpiresWhenDays { get; set; } + + /// + /// + /// + public int? ExpiresWarningWhenDays { get; set; } + /// /// /// @@ -135,4 +170,4 @@ public record EnvelopeDto : IEnvelope /// Envelope history entries tracking actions like DocumentSigned, EnvelopeOpened, etc. /// public IEnumerable? Histories { get; set; } -} \ No newline at end of file +} diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderEditorPage.razor b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderEditorPage.razor index 99b8c824..0ca6b7fd 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderEditorPage.razor +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Pages/SenderEditorPage.razor @@ -5,6 +5,7 @@ @using EnvelopeGenerator.Application.Common.Dto @using EnvelopeGenerator.Application.Envelopes.Commands @using EnvelopeGenerator.Application.Resources +@using EnvelopeGenerator.Domain.Constants @using EnvelopeGenerator.Server.Client.Components.PdfEditor @using EnvelopeGenerator.Server.Client.Services @using Microsoft.AspNetCore.WebUtilities @@ -18,6 +19,7 @@ @inject PdfRenderService PdfRenderService @inject ReceiverService ReceiverService @inject EnvelopeService EnvelopeService +@inject EnvelopeTypeService EnvelopeTypeService @inject IStringLocalizer UiLocalizer @@ -94,6 +96,107 @@ } + + + @L("SenderEditor_EnvelopeSettings", "Envelope-Einstellungen") + @L("SenderEditor_AdvancedOptional", "Erweitert") + + + + + @L("EnvelopeType", "Umschlagtyp") + + @L("SenderEditor_SelectTemplate", "Vorlage auswählen") + @foreach (var type in _envelopeTypes) + { + @type.Title + } + + + + + @L("Language", "Sprache") + + Deutsch (de) + English (en) + Deutsch (de-DE) + English (en-US) + + + + + @L("CertificationType", "Zertifizierung") + + @L("AdvancedElectronicSignature", "Advanced Electronic Signature") + @L("ElectronicSignature", "Electronic Signature") + @L("QualifiedSignature", "Qualified Signature") + + + + + + + @L("TFAEnabled", "2FA aktiviert") + + + + @L("UseAccessCode", "Zugriffscode verwenden") + + + + + @L("FinalEmailToCreator", "Finale E-Mail an Ersteller") + + @L("No", "Nein") + @L("Yes", "Ja") + @L("YesWithAttachment", "Ja, mit Anhang") + + + + + @L("FinalEmailToReceivers", "Finale E-Mail an Empfänger") + + @L("No", "Nein") + @L("Yes", "Ja") + @L("YesWithAttachment", "Ja, mit Anhang") + + + + + + + @L("SendReminderEmails", "Erinnerungs-E-Mails senden") + + + + + @L("FirstReminderDays", "Erste Erinnerung (Tage)") + + + + + @L("ReminderIntervalDays", "Erinnerungsintervall (Tage)") + + + + + @L("ExpiresWhenDays", "Läuft ab nach (Tage)") + + + + + @L("ExpiresWarningWhenDays", "Ablaufwarnung (Tage)") + + + + + @@ -560,6 +663,20 @@ string _envelopeMessage = string.Empty; bool _titleTouched = false; + List _envelopeTypes = []; + int? _selectedEnvelopeTypeId; + string _language = "de-DE"; + bool _useAccessCode; + bool _tfaEnabled; + int _certificationType = (int)CertificationType.AdvancedElectronicSignature; + int _finalEmailToCreator = (int)FinalEmailType.No; + int _finalEmailToReceivers = (int)FinalEmailType.No; + bool _sendReminderEmails; + int _firstReminderDays; + int _reminderIntervalDays; + int _expiresWhenDays; + int _expiresWarningWhenDays; + List _receivers = []; bool _receiverPopupVisible; string _receiverDraftName = string.Empty; @@ -577,6 +694,25 @@ // ── Lifecycle ── + protected override async Task OnInitializedAsync() + { + try + { + _envelopeTypes = (await EnvelopeTypeService.GetAsync()).ToList(); + + if (!IsEditMode && _selectedEnvelopeTypeId is null && _envelopeTypes.Count > 0) + { + _selectedEnvelopeTypeId = _envelopeTypes[0].Id; + ApplyEnvelopeTypeDefaults(_envelopeTypes[0]); + } + } + catch (Exception ex) + { + Logger.LogWarning(ex, "Failed to load envelope types for sender editor."); + _envelopeTypes = []; + } + } + protected override async Task OnParametersSetAsync() { if (EnvelopeId.HasValue && EnvelopeId.Value > 0) @@ -621,6 +757,22 @@ _envelopeTitle = envelope.Title ?? string.Empty; _envelopeMessage = envelope.Message ?? string.Empty; + _selectedEnvelopeTypeId = envelope.EnvelopeTypeId; + _language = string.IsNullOrWhiteSpace(envelope.Language) ? "de-DE" : envelope.Language; + _useAccessCode = envelope.UseAccessCode; + _tfaEnabled = envelope.TFAEnabled; + if (_tfaEnabled) + _useAccessCode = true; + + _certificationType = envelope.CertificationType ?? (int)CertificationType.AdvancedElectronicSignature; + _finalEmailToCreator = envelope.FinalEmailToCreator ?? (int)FinalEmailType.No; + _finalEmailToReceivers = envelope.FinalEmailToReceivers ?? (int)FinalEmailType.No; + + _sendReminderEmails = envelope.EnvelopeType?.SendReminderEmails ?? false; + _firstReminderDays = envelope.EnvelopeType?.FirstReminderDays ?? 0; + _reminderIntervalDays = envelope.EnvelopeType?.ReminderIntervalDays ?? 0; + _expiresWhenDays = envelope.ExpiresWhenDays ?? envelope.EnvelopeType?.ExpiresDays ?? 0; + _expiresWarningWhenDays = envelope.ExpiresWarningWhenDays ?? envelope.EnvelopeType?.ExpiresWarningDays ?? 0; var envelopeReceivers = envelope.EnvelopeReceivers?.ToList() ?? []; _receivers = envelopeReceivers @@ -755,6 +907,82 @@ void CancelPlacement() => _pendingReceiverForPlacement = null; + Task OnEnvelopeTypeChanged(ChangeEventArgs e) + { + var raw = e.Value?.ToString(); + if (!int.TryParse(raw, out var id) || id <= 0) + { + _selectedEnvelopeTypeId = null; + return Task.CompletedTask; + } + + _selectedEnvelopeTypeId = id; + var selectedType = _envelopeTypes.FirstOrDefault(x => x.Id == id); + if (selectedType is not null) + ApplyEnvelopeTypeDefaults(selectedType); + + return Task.CompletedTask; + } + + void ApplyEnvelopeTypeDefaults(EnvelopeTypeDto envelopeType) + { + if (!string.IsNullOrWhiteSpace(envelopeType.Language)) + _language = envelopeType.Language; + + if (envelopeType.UseAccessCode.HasValue) + _useAccessCode = envelopeType.UseAccessCode.Value; + + if (_tfaEnabled) + _useAccessCode = true; + + if (envelopeType.CertificationType.HasValue) + _certificationType = envelopeType.CertificationType.Value; + + if (envelopeType.FinalEmailToCreator.HasValue) + _finalEmailToCreator = envelopeType.FinalEmailToCreator.Value; + + if (envelopeType.FinalEmailToReceivers.HasValue) + _finalEmailToReceivers = envelopeType.FinalEmailToReceivers.Value; + + if (envelopeType.SendReminderEmails.HasValue) + _sendReminderEmails = envelopeType.SendReminderEmails.Value; + + if (envelopeType.FirstReminderDays.HasValue) + _firstReminderDays = envelopeType.FirstReminderDays.Value; + + if (envelopeType.ReminderIntervalDays.HasValue) + _reminderIntervalDays = envelopeType.ReminderIntervalDays.Value; + + if (envelopeType.ExpiresDays.HasValue) + _expiresWhenDays = envelopeType.ExpiresDays.Value; + + if (envelopeType.ExpiresWarningDays.HasValue) + _expiresWarningWhenDays = envelopeType.ExpiresWarningDays.Value; + } + + void OnTfaChanged(ChangeEventArgs e) + { + _tfaEnabled = e.Value as bool? ?? false; + if (_tfaEnabled) + _useAccessCode = true; + } + + void OnUseAccessCodeChanged(ChangeEventArgs e) + { + if (_tfaEnabled) + { + _useAccessCode = true; + return; + } + + _useAccessCode = e.Value as bool? ?? false; + } + + void OnSendReminderEmailsChanged(ChangeEventArgs e) + { + _sendReminderEmails = e.Value as bool? ?? false; + } + // ── PDF area click → place field ── async Task OnPdfAreaClickAsync(MouseEventArgs e) { @@ -1031,9 +1259,20 @@ return new CreateEnvelopeCommand { EnvelopeId = envelopeId, + EnvelopeTypeId = _selectedEnvelopeTypeId, Title = _envelopeTitle, Message = _envelopeMessage, - TFAEnabled = false, + Language = _language, + UseAccessCode = _useAccessCode, + TFAEnabled = _tfaEnabled, + CertificationType = _certificationType, + FinalEmailToCreator = _finalEmailToCreator, + FinalEmailToReceivers = _finalEmailToReceivers, + SendReminderEmails = _sendReminderEmails, + FirstReminderDays = _firstReminderDays, + ReminderIntervalDays = _reminderIntervalDays, + ExpiresWhenDays = _expiresWhenDays, + ExpiresWarningWhenDays = _expiresWarningWhenDays, Send = send, Document = string.IsNullOrWhiteSpace(docBase64) ? null : new CreateEnvelopeDocumentDto(docBase64), Receivers = receiverCommands diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs index 0600c35f..f53e1c8d 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Program.cs @@ -41,6 +41,7 @@ builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddSingleton(); builder.Services.AddScoped(); +builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeTypeService.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeTypeService.cs new file mode 100644 index 00000000..f43c855d --- /dev/null +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server.Client/Services/EnvelopeTypeService.cs @@ -0,0 +1,22 @@ +using EnvelopeGenerator.Application.Common.Dto; +using System.Net.Http.Json; +using System.Text.Json; + +namespace EnvelopeGenerator.Server.Client.Services; + +public class EnvelopeTypeService(IHttpClientFactory clientFactory) +{ + private static readonly JsonSerializerOptions JsonOptions = new(JsonSerializerDefaults.Web); + + public async Task> GetAsync(CancellationToken cancel = default) + { + var http = clientFactory.CreateClient("EnvelopeGenerator.Server"); + var response = await http.GetAsync("/api/EnvelopeType", cancel); + + if (!response.IsSuccessStatusCode) + return []; + + var data = await response.Content.ReadFromJsonAsync>(JsonOptions, cancel); + return data ?? []; + } +} diff --git a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs index 8e1357e6..020de466 100644 --- a/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs +++ b/EnvelopeGenerator.Server/EnvelopeGenerator.Server/Program.cs @@ -345,6 +345,7 @@ try builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); + builder.Services.AddScoped(); // Business Services (Server specific) builder.Services.AddScoped();