Compare commits

...

79 Commits

Author SHA1 Message Date
Developer 02
73eb270237 refactor(privacy-policy.css); minified 2024-09-23 09:20:38 +02:00
Developer 02
222684cfc8 feat(footer): Zu _Layout.cshtml hinzugefügt. CSS-Trennungen bearbeitet. 2024-09-21 00:10:50 +02:00
Developer 02
3974d2123e refactor(privacy-policy): Umbenennung zur Berücksichtigung von Kulturinformationen. 2024-09-20 17:09:44 +02:00
Developer 02
b837a63b34 refactor(cookie-policy): Unnötiges html entfernen. 2024-09-20 17:02:23 +02:00
Developer 02
461316713a feat(privacy-policy): erstellt in html mit einem separaten css in Deutsch und Englisch 2024-09-20 17:01:00 +02:00
Developer 02
185af3210b core(EnvelopeGenerator.Web): Paket-, Assembly- und Dateiversionen wurden auf 2.0.0.0 aktualisiert. 2024-09-20 15:33:29 +02:00
Developer 02
e4620b5469 refactor (_CookieConsentPartial): Mit Bootstrap bearbeiten:
- Aktualisierte Cookie-Zustimmungsmeldung hinzugefügt
2024-09-20 15:30:14 +02:00
Developer 02
5c4acd17a0 fix(cookie): Fehlerhaften Consent-Cookie-Button entfernt und durch von Microsoft empfohlene Struktur ersetzt
- Den fehlerhaften Consent-Cookie-Button entfernt und die von Microsoft empfohlene Struktur integriert, um die Compliance und Funktionalität zu verbessern.
2024-09-20 13:07:32 +02:00
Developer 02
fc171e5b89 fix(html): Ungültige <div>-Tags aus cshtml entfernt
- Überflüssige <div>-Tags, die während des Merge-Prozesses entstanden sind, entfernt, um die korrekte HTML-Struktur sicherzustellen.
2024-09-20 11:24:59 +02:00
Developer 02
662faf2512 merge: feat/signFlow-gen in Master zusammenführen 2024-09-20 11:16:08 +02:00
Developer 02
2fb8af9a4f chore(api): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und UserManager.Infrastructure in den API-Schichten auf Version 2.0.0.0 erhöht.
2024-09-20 11:05:00 +02:00
Developer 02
017d03713b refactor(dbcontext): DbContext aktualisiert, um IUserManagerDbContext zu implementieren und neue DbSets hinzuzufügen
- Implementierung des `IUserManagerDbContext` Interface in `EGDbContext`.
- Neue `DbSet`-Eigenschaften für `GroupOfUser`, `Group`, `ModuleOfUser`, `Module`, `User` und `UserRep` hinzugefügt.
- Neue DbSets im Konstruktor injiziert.
- Namespace-Importe aktualisiert, um zusätzliche Entitäten für die neuen DbSets einzubeziehen.
2024-09-20 09:46:21 +02:00
Developer 02
5f5180d937 chore(application): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und `UserManager.Infrastructure` in der Application-Schicht auf Version 2.0.0.0 erhöht.
- DbSet-Eigenschaften aus dem DbContext injiziert.
2024-09-20 09:39:14 +02:00
Developer 02
6b3e6cd6f5 chore(infrastructure): Core-Bibliotheken und UserManager.Infrastructure auf 2.0.0.0 aktualisiert
- Core-Bibliotheken und UserManager.Infrastructure im Infrastructure-Layer auf Version 2.0.0.0 erhöht.
- DbSet-Eigenschaften aus DbContext injiziert.
2024-09-20 01:16:47 +02:00
Developer 02
f95f3c7b1b refactor(dbcontext): DbSet-Erstellung in DbContext verschieben und DbSet-Eigenschaften hinzufügen
- Ersetzt die Erstellung von DbSet pro Entität durch DbSet-Eigenschaften in `EGDbContext`.
- Hinzugefügt DbSet-Eigenschaften für `UserReceiver`, `Config`, `EnvelopeReceiver` und `Envelope`.
- Aktualisierter `EGDbContext`-Konstruktor zur Initialisierung der DbSet-Eigenschaften mittels der `Set<T>`-Methode.
2024-09-19 15:06:33 +02:00
Developer 02
316b62083c feat(core): IUnique-Schnittstelle hinzufügen und Core.Infrastructure aktualisieren
- `IUnique`-Schnittstelle zu allen Entitäten im Domain-Projekt hinzugefügt.
- `Core.Infrastructure` auf Version 2.0.0.0 im Infrastructure-Layer aktualisiert.
- Domain-Projekt mit `Core.Abstraction` für verbesserte Abstraktion erweitert.
2024-09-19 14:48:34 +02:00
Developer 02
530b63f299 fix: Logo korrigiert 2024-09-19 11:27:17 +02:00
Developer 02
2f228de163 feat: Annotationen für Unterschrift, Ort und Datum neu angeordnet 2024-09-19 10:42:25 +02:00
Developer 02
e5e64b25fe merge 2024-09-19 10:38:39 +02:00
Developer 02
2d5dde177c feat: Anordnung der Annotationen für Unterschrift, Stadt und Datum 2024-09-18 00:10:16 +02:00
Developer 02
ce0ad4ba61 fix: Fix bug where access code wasn't requested when flag was false
- Modified logic to ensure a new access code is requested only if it hasn't been previously requested for the specific envelope and receiver combination.
- Prevents unnecessary access code requests, improving system efficiency.
2024-09-17 16:42:45 +02:00
Developer 02
ebd7c5d6a4 feat: Logo-Modell in den App-Einstellungen für CURSOR-AG konfiguriert 2024-09-17 15:47:44 +02:00
Developer 02
341da273c9 feat: Logo-Konfiguration und -Stile für digitale Daten aktualisiert
- `appsettings` mit neuen Logo-Klassen `dd-show-logo` und `dd-locked-logo` aktualisiert.
- `logo.css` angepasst, um die neuen Logo-Dimensionen und responsive Stile hinzuzufügen.
- Alte Klassen `cursor-logo` und `cursor-img` wurden durch `dd-locked-logo` und `dd-show-logo` ersetzt.
2024-09-17 15:36:05 +02:00
Developer 02
73d2a43a95 fix: CSSPath aus Logo entfernt, um CSS-Injection-Sicherheitslücke zu vermeiden
- Die Eigenschaft `CSSPath` wurde aus der `Logo`-Klasse entfernt, um potenzielle CSS-Injection-Risiken zu verhindern.
- Alle logo-bezogenen Stile in einer einheitlichen `logo.css` Datei standardisiert.
2024-09-17 15:01:58 +02:00
Developer 02
eee18889d6 feat: Logo-Bild in EnvelopeLocked.cshtml über Appsettings und Logo-Modell konfiguriert 2024-09-17 14:55:17 +02:00
Developer 02
590d7fb717 feat: Logo-Bild in ShowEnvelope.cshtml über appsettings konfiguriert 2024-09-17 14:50:23 +02:00
Developer 02
dd28ef7ab6 feat: Logo-Konfiguration zu Program.cs und _ViewImports.cshtml hinzugefügt 2024-09-17 14:41:31 +02:00
Developer 02
36fb033adc feat: Hinzugefügt Logo-Konfiguration für verschiedene Kunden 2024-09-17 14:10:27 +02:00
Developer 02
4275f25f4a fix: Logo auf "Digital Data" aktualisieren 2024-09-17 13:52:52 +02:00
Developer 02
30b5633498 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-17 13:35:07 +02:00
Developer 02
00545fdc50 chore: Auto-update min.css after merge 2024-09-17 11:31:25 +02:00
Developer 02
d80e511b08 chore: Auto-update min.css after merge 2024-09-17 11:22:03 +02:00
Developer 02
7313355a83 merge: Integrate customer/CURSOR-Software-AG into master 2024-09-17 11:18:56 +02:00
Developer 02
66466dc865 fix: Sichtbarkeit des Zugangscodes-Formulars im Hochformatmodus auf Mobilgeräten
Das Problem behoben, bei dem das Zugangscodes-Formular im Hochformatmodus auf Mobilgeräten nicht sichtbar war. Die CSS-Stile wurden angepasst, um sicherzustellen, dass das Formular unabhängig von der Geräteausrichtung ordnungsgemäß angezeigt wird.
2024-09-17 11:09:21 +02:00
Developer 02
8cd8df4b02 feat: Unterschriftsdatum unter das Unterschriftsfeld verschoben 2024-09-17 10:17:16 +02:00
Developer01
d6bcb8c43d MS Bisl design und Funktionalität 2024-09-12 16:59:06 +02:00
Developer01
2aa2064a67 Merge branch 'master' of http://git.dd:3000/AppStd/EnvelopeGenerator 2024-09-11 14:52:03 +02:00
Developer01
f403d12073 MS Rebuild und diverses Customizing 2024-09-11 14:51:48 +02:00
Developer 02
b66c2f67da feat: Hinzufügen einer erweiterten Ansicht für die Tabelle im Envelope Generator
- In der Tabelle für Umschläge wurde ein versteckter Abschnitt unter den Zeilen hinzugefügt.
- Beim Klicken auf eine Zeile wird nun ein Detailbereich angezeigt, der Informationen zu Empfänger und Historie des Umschlags zeigt.
2024-09-09 17:30:36 +02:00
Developer 02
d084a4cd81 feat(component): initialisieren des HistoryTableComponent 2024-09-07 01:48:04 +02:00
Developer 02
5d2bf56493 feat(service): Unterstützung von Query-Parametern im HistoryService hinzugefügt
- Methode `getHistory` hinzugefügt, um das Abrufen von History-Daten mit optionalen Query-Parametern wie `envelopeId`, `referenceType`, `userReference`, `withSender` und `withReceiver` zu ermöglichen.
- Methode `getHistoryAsync` implementiert, um History-Daten mit async/await abzurufen.
- `Options`-Interface eingeführt, um optionale Query-Parameter für History-Anfragen zu definieren.
2024-09-07 01:41:19 +02:00
Developer 02
cd88f5c833 refactor(controller): Optimierung der Handhabung von Referenztypen im HistoryController
- `GetAllAsync`-Methode angepasst, um `withSender` oder `withReceiver` automatisch basierend auf dem `ReferenceType` zu setzen.
- Unnötigen `status`-Query-Parameter entfernt, um die API zu vereinfachen.
2024-09-07 01:32:09 +02:00
Developer 02
ab41e25071 feat: Referenztypen zwischen Backend und Frontend standardisieren
- `GetReferenceTypes`-Endpunkt im `HistoryController` hinzugefügt, um Key-Value-Paare des `ReferenceType`-Enums im camelCase-Format bereitzustellen.
- `ConfigurationService` in Angular erweitert, um die `ReferenceType`-Werte vom neuen API-Endpunkt abzurufen und zu speichern.
2024-09-07 01:12:50 +02:00
Developer 02
eb775da7d4 feat(service): HistoryService für API-Interaktionen erstellen 2024-09-07 00:37:54 +02:00
Developer 02
7bc2695da4 feat(controller): add GetAllAsync endpoint to HistoryController
- Added a new `GetAllAsync` method to HistoryController to retrieve envelope histories.
- Included query parameters for filtering by envelopeId, userReference, referenceType, status, and boolean flags for sender and receiver.
- Implemented validation of `referenceType` with `ReferenceType` enum, throwing an error for invalid values.
2024-09-07 00:08:55 +02:00
Developer 02
75fff426bc feat(HistoryController): HistoryController mit Logging und Envelope History Service Integration hinzugefügt 2024-09-06 16:43:42 +02:00
Developer 02
4172df4d78 refactor(EnvelopeTableComponent): onToggleExpandedRow Methode asynchron gemacht, um die Daten mit async/await zu handhaben 2024-09-06 16:38:15 +02:00
Developer 02
01856b61ef feat(EnvelopeReceiverService): Status-Filteroption zu ReadByUserAsync hinzugefügt, um die Ergebnisse nach Status zu filtern 2024-09-06 16:31:49 +02:00
Developer 02
2e32559132 feat(ReceiverStatusTableComponent): Schema für die Tabellenansicht hinzugefügt, einschließlich Name, Email und Zugangscode 2024-09-06 15:42:03 +02:00
Developer 02
9adb49df78 Refaktorisierung von EnvelopeReceiverService und EnvelopeReceiverController
- Methode `ReadSecretByUuidAsync` zu `EnvelopeReceiverService` hinzugefügt, um Geheimnisse anhand der UUID abzurufen.
- Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverService` verbessert, einschließlich besserer Handhabung von Sicherheitsvorfällen und Datenintegritätsproblemen.
- `VerifyAccessCodeAsync` aktualisiert, um explizite Nachrichten für Sicherheitsvorfälle und Datenintegritätsprobleme zu enthalten.
- `EnvelopeReceiverController` aktualisiert, um einen neuen Endpunkt `GetSecretAsync` zum Abrufen von Geheimnissen anhand der UUID einzuführen.
- Fehlerbehandlung und Protokollierung in den Methoden von `EnvelopeReceiverController` verbessert.
- Endpunkte angepasst, um die neue Methode `ReadSecretByUuidAsync` in der Servicelogik zu nutzen.
2024-09-06 15:19:18 +02:00
Developer 02
18e21b0a8e feat: Füge EnvelopeReceiverSecretDto zur Handhabung von Zugangscodes hinzu 2024-09-06 14:06:03 +02:00
Developer 02
e1d7d0e141 feat(EnvelopeTableComponent): Methode onToggleExpandedRow hinzugefügt, um Empfänger anhand der Umschlag-UUID abzurufen und anzuzeigen 2024-09-06 13:52:47 +02:00
Developer 02
cfa40e640b feat(EnvelopeReceiverService): Methode getReceiverByEnvelope hinzugefügt, um Empfänger nach Umschlag-UUID abzurufen 2024-09-06 13:11:53 +02:00
Developer 02
cb0a45bc17 feat(EnvelopeReceiverController): füge Methode GetReceiverByEnvelopeAsync hinzu 2024-09-06 13:00:13 +02:00
Developer 02
c7b6e5bf24 feat(EnvelopeReceiverService): füge Methode ReadReceiverByEnvelopeAsync hinzu
- Neue Methode `ReadReceiverByEnvelopeAsync` zur `EnvelopeReceiverService`-Klasse hinzugefügt, um Empfänger anhand der Umschlag-UUID abzurufen.
- Die `EnvelopeReceiverService`-Klasse wurde angepasst, um das Mapping auf `ReceiverReadDto` für die neue Methode zu ermöglichen.
- Die Using-Anweisungen wurden aktualisiert, um das erforderliche DTO (`EnvelopeGenerator.Application.DTOs.Receiver`) für die neue Funktionalität einzubinden.
2024-09-06 12:45:03 +02:00
Developer 02
a9ca1b71eb feat(repository): ReadReceiverByEnvelope Methode zum EnvelopeReceiverRepository hinzugefügt
- Neue Methode ReadReceiverByEnvelope hinzugefügt, um Empfänger zu ermitteln, die mit einem bestimmten Umschlag (identifiziert durch UUID) verknüpft sind.
2024-09-06 12:08:42 +02:00
Developer 02
97f07bc72d feat(envelope): ReceiverStatusTable-Komponente unter Envelope-Tabelle hinzugefügt und Backend-Unterstützung integriert
- ReceiverStatusTableComponent als Unterkomponente der EnvelopeTable erstellt, um Empfängerstatus anzuzeigen.
- ReceiverStatusTable in EnvelopeTable mit Tabs und dynamischem Datenladen integriert.
- EnvelopeTable angepasst, um Empfängerdaten über den EnvelopeReceiverService abzurufen und in ReceiverStatusTable anzuzeigen.
- Backend aktualisiert, um das Abrufen von Umschlägen nach Benutzer zu unterstützen:
  - `ReadByUserAsync`-Methode im Envelope-Repository hinzugefügt, um Umschläge für einen bestimmten Benutzer abzufragen.
  - Servicemethode implementiert, um die abgefragten Umschläge in DTOs zu konvertieren und das Ergebnis zurückzugeben.
2024-09-06 11:32:39 +02:00
Developer 02
8753875d93 chore(envelope): ReceiverStatusTableComponent entfernt 2024-09-06 11:32:22 +02:00
Developer 02
3692aa80a4 feat(services): Hinzufügen des EnvelopeService zur Verarbeitung von API-Anfragen 2024-09-05 11:53:22 +02:00
Developer 02
b8b09ded5d refactor(api): Vereinfachung der GetCurrentAsync-Methode im EnvelopeController 2024-09-05 10:35:35 +02:00
Developer 02
5b8d8b9e55 refactor(api): Aktualisierung von ControllerExtensions zur Nutzung von ClaimsPrincipal anstelle von ControllerBase
- Refactoring der Erweiterungsmethoden, sodass sie auf `ClaimsPrincipal` anstatt auf `ControllerBase` basieren.
- Alle Verweise und Verwendungen dieser Erweiterungsmethoden im gesamten Code aktualisiert.
- Dies verbessert die Flexibilität und entkoppelt das Abrufen von Benutzeransprüchen von den Controllern.
2024-09-05 10:24:00 +02:00
Developer 02
e3fbf4fc77 feat(api): Hinzufügen des EnvelopeControllers mit GetCurrentAsync-Methode zur Umschlagabfrage
- Implementierung des `EnvelopeController` in der Route `api/envelope` mit der Methode `GetCurrentAsync`, um Umschläge basierend auf der Benutzer-ID abzurufen.
- Fehlerbehandlung hinzugefügt, wenn die Benutzer-ID keine Ganzzahl ist, mit einem möglichen Problem bei der Erstellung der Claims-Liste.
2024-09-05 10:15:36 +02:00
Developer 02
8d680992b7 refactor: Selector von EnvelopeTableComponent umbenannt und ReceiverStatusTable integriert
- Selector von `EnvelopeTableComponent` von `app-envelope-table` auf `envelope-table` umbenannt für Konsistenz.
- `<receiver-status-table>` in die `EnvelopeTableComponent` integriert, um Empfängerstatusdaten anzuzeigen.
2024-09-04 16:55:58 +02:00
Developer 02
01247f73f4 refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert 2024-09-04 16:34:39 +02:00
Developer 02
6a7a3dcb90 refactor: Bibliotheksreferenzen nach Umstrukturierung der Tabellenkomponenten aktualisiert
- Referenzen für einige Bibliotheken angepasst, um die neue Verzeichnisstruktur unter `/tables` zu unterstützen.
- Importpfade entsprechend der Verschiebung der Tabellenkomponenten aktualisiert.
2024-09-04 16:20:06 +02:00
Developer 02
2fbfbb4eb6 feat: ReceiverStatusTable erstellt und Tabellen unter /tables organisiert
- Neue `ReceiverStatusTable`-Komponente zur Anzeige von Empfängerstatus-Daten erstellt.
- Alle bestehenden Tabellenkomponenten unter das Verzeichnis `/tables` verschoben, um die Projektstruktur zu verbessern und die Wartbarkeit zu erhöhen.
2024-09-04 16:16:50 +02:00
Developer 02
f88b5d2733 feat: Erweiterbare Zeilen in EnvelopeTableComponent aktiviert und mat-tab-Komponente integriert
- Aktiviert die Unterstützung für erweiterbare Zeilen in der `EnvelopeTableComponent` durch Setzen der `isExpandable`-Option auf `true`.
- Integriert die `mat-tab-group`-Komponente innerhalb der erweiterten Zeilen für eine bessere Darstellung von Tab-Inhalten.
- Hinzugefügt: Zwei Tabs ("Emfänger" und "History") für die Anzeige von zusätzlichen Informationen in den erweiterten Zeilen.
2024-09-04 15:14:10 +02:00
Developer 02
363358aaa1 feat: Implementieren und integrieren von wiederverwendbaren Angular Material-Tabellenkomponenten
- Erstellen der `DDTable`-Komponente für dynamische Angular Material-Tabellen mit Unterstützung für erweiterbare Zeilen, Filterung, Sortierung und Pagination.
- Ersetzen der bestehenden Tabellenimplementierung in `EnvelopeTableComponent` durch die `DDTable`-Komponente für verbesserte Funktionalität und Wartbarkeit.
- Aktualisieren der `EnvelopeTableComponent`, um `DDTable` für die Anzeige von Umschlagdaten zu verwenden, einschließlich Filter- und Paginierungsoptionen.
- Implementieren von `ClearableInputComponent` für eine verbesserte Filtererfahrung.
- Anpassen des Datenabrufs und -handlings, um die Integration von `DDTable` zu berücksichtigen.
- Verbessern der `EnvelopeTableComponent` mit ordnungsgemäßen Animationstriggern für erweiterbare Zeilen.
2024-09-04 14:58:48 +02:00
Developer 02
7444eeba2a feat(envelope): Envelopes-Datenquelle und Initialisierung angepasst
- `EnvelopeTypeService` und `EnvelopeTypeController` hinzugefügt, um Envelope-Typen im Cache zu speichern und bereitzustellen.
- `ConfigurationService` erstellt und mit `APP_INITIALIZER` konfiguriert, um Envelope-Typen bei der Anwendungserstellung zu laden.
- `EnvelopeTableComponent` aktualisiert, um Envelope-Typen aus der Konfiguration zu verwenden, anstatt hartkodierte Werte zu nutzen.
2024-09-02 14:48:20 +02:00
Developer 02
e9d686a4c1 fix(receiver-table): Problem mit automatischer Anredezuweisung für den ersten hinzugefügten Empfänger behoben
- Bedingung in der Funktion `receiver_filter` aktualisiert, um den Indexwert korrekt zu überprüfen.
2024-09-02 10:48:24 +02:00
Developer 02
939ba1bb47 feat: Sortierung der Tabelle hinzugefügt 2024-08-30 23:38:02 +02:00
Developer 02
d5de868eb9 feat: added filter and paginator 2024-08-30 23:25:22 +02:00
Developer 02
6e3bb6c3a0 feat: Enhance receiver input and table components
- Updated `ReceiverInputComponent` to support optional index parameter in the `filter` function to manage email input logic more effectively.
- Added `last_used_name` functionality in `ReceiverTableComponent` to auto-fill names based on the last used email name.
- Implemented email duplication prevention logic in `ReceiverTableComponent` to ensure unique email inputs.
- Refactored component lifecycle methods and data handling for improved performance and user experience.
2024-08-30 22:25:13 +02:00
Developer 02
d347ec420c feat: ReadAllAsync-Methode zur ReceiverRepository hinzugefügt
- `ReadAllAsync`-Methode hinzugefügt, um alle `Receiver`-Entitäten asynchron zurückzugeben.
- Stellt sicher, dass alle Empfänger abgerufen werden, während die vorhandene Abfragelogik mit `ReadBy` erhalten bleibt.
2024-08-30 11:58:00 +02:00
Developer 02
a011b677ea refactor: EnvelopeReceiver-Klasse refaktoriert, um eine Endlosschleife zu verhindern und die Datenabfrage zu verbessern
- `EnvelopeReceiver` in `EnvelopeReceiver` und `EnvelopeReceiverBase` aufgeteilt, um zirkuläre Abhängigkeiten zu vermeiden.
- `EnvelopeReceiverBasicDto` für vereinfachte Datenübertragungsobjekte erstellt.
- `ReceiverRepository` aktualisiert, um den zuletzt verwendeten Empfängernamen durch das Laden aktueller `EnvelopeReceiver`-Daten einzubeziehen.
- `ReceiverReadDto` angepasst, um `LastUsedName` zu erhalten und `EnvelopeReceivers` für die JSON-Serialisierung zu ignorieren.
2024-08-30 11:27:36 +02:00
Developer 02
8831436809 feat(controller): add endpoint to retrieve last used receiver name by email
- Implemented `Get` endpoint in `EnvelopeReceiverController` to fetch the last used receiver's name by email.
- Added handling for successful and failed responses, including proper status codes and logging.
2024-08-29 17:15:00 +02:00
Developer 02
1ededc1f64 feat(service): add ReadLastUsedReceiverNameByMail method to IEnvelopeReceiverService and EnvelopeReceiverService
- Added `ReadLastUsedReceiverNameByMail` method to `IEnvelopeReceiverService` interface.
- Implemented `ReadLastUsedReceiverNameByMail` method in `EnvelopeReceiverService` to retrieve the last used receiver's name by email and handle results with `DataResult`.
2024-08-29 16:57:45 +02:00
Developer 02
183c94fd0a Merge branch 'master' into feat/signFlow-gen 2024-08-29 16:49:30 +02:00
Developer 02
a0a5568d93 feat(repository): Methode ReadLastByReceiver zu IEnvelopeReceiverRepository und EnvelopeReceiverRepository hinzugefügt
- Methode `ReadLastByReceiver` zum Interface `IEnvelopeReceiverRepository` hinzugefügt.
- Methode `ReadLastByReceiver` in `EnvelopeReceiverRepository` implementiert, um den letzten `EnvelopeReceiver` anhand der E-Mail-Adresse abzurufen.
2024-08-29 16:04:19 +02:00
158 changed files with 2142 additions and 988 deletions

View File

@@ -5,7 +5,7 @@ using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IConfigService : IBasicCRUDService<ConfigDto, Config, int> public interface IConfigService : IReadService<ConfigDto, Config, int>
{ {
Task<DataResult<ConfigDto>> ReadFirstAsync(); Task<DataResult<ConfigDto>> ReadFirstAsync();

View File

@@ -3,7 +3,6 @@ using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts

View File

@@ -1,6 +1,6 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts; using DigitalData.EmailProfilerDispatcher.Abstraction.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Common; using EnvelopeGenerator.Common;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts

View File

@@ -1,15 +1,18 @@
using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
{ {
public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDto, EnvelopeReceiver, object> public interface IEnvelopeReceiverService : IBasicCRUDService<EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)>
{ {
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false);
Task<DataResult<IEnumerable<EnvelopeReceiverSecretDto>>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true);
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true);
Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true); Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true);
@@ -25,5 +28,7 @@ namespace EnvelopeGenerator.Application.Contracts
Task<DataResult<bool>> IsExisting(string envelopeReceiverId); Task<DataResult<bool>> IsExisting(string envelopeReceiverId);
Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses); Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses);
Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail);
} }
} }

View File

@@ -2,7 +2,6 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
{ {
@@ -11,5 +10,7 @@ namespace EnvelopeGenerator.Application.Contracts
Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false); Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false);
Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false); Task<DataResult<EnvelopeDto>> ReadByUuidAsync(string uuid, bool withDocuments = false, bool withHistory = false, bool withDocumentReceiverElement = false, bool withUser = false, bool withAll = false);
Task<DataResult<IEnumerable<EnvelopeDto>>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[]ignore_statuses);
} }
} }

View File

@@ -1,7 +1,6 @@
using DigitalData.Core.Abstractions.Application; using DigitalData.Core.Abstractions.Application;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts;
namespace EnvelopeGenerator.Application.Contracts namespace EnvelopeGenerator.Application.Contracts
{ {

View File

@@ -1,4 +1,7 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record ConfigDto( public record ConfigDto(
string DocumentPath, string DocumentPath,
@@ -8,5 +11,10 @@
string ExportPath, string ExportPath,
string DocumentPathDmz, string DocumentPathDmz,
string ExportPathDmz, string ExportPathDmz,
string DocumentPathMoveAftsend); string DocumentPathMoveAftsend) : IUnique<int>
{
[JsonIgnore]
[Obsolete("Configuration does not have an ID; it represents a single table in the database.")]
public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single row in the database.");
};
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record DocumentReceiverElementDto( public record DocumentReceiverElementDto(
int Id, int Id,
@@ -18,5 +20,5 @@
DateTime? ChangedWhen, DateTime? ChangedWhen,
double Top, double Top,
double Left double Left
); ): IUnique<int>;
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record DocumentStatusDto( public record DocumentStatusDto(
int Id, int Id,
@@ -8,5 +10,5 @@
DateTime? StatusChangedWhen, DateTime? StatusChangedWhen,
string Value, string Value,
DateTime AddedWhen, DateTime AddedWhen,
DateTime? ChangedWhen); DateTime? ChangedWhen) : IUnique<int>;
} }

View File

@@ -1,8 +1,10 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record EmailTemplateDto( public record EmailTemplateDto(
int Id, int Id,
string Name, string Name,
string Body, string Body,
string Subject); string Subject) : IUnique<int>;
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record EnvelopeCertificateDto( public record EnvelopeCertificateDto(
int Id, int Id,
@@ -8,5 +10,5 @@
int CreatorId, int CreatorId,
string CreatorName, string CreatorName,
string CreatorEmail, string CreatorEmail,
int EnvelopeStatus); int EnvelopeStatus) : IUnique<int>;
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record EnvelopeDocumentDto public record EnvelopeDocumentDto
( (
@@ -6,5 +8,5 @@
int EnvelopeId, int EnvelopeId,
DateTime AddedWhen, DateTime AddedWhen,
IEnumerable<DocumentReceiverElementDto>? Elements IEnumerable<DocumentReceiverElementDto>? Elements
); ) : IUnique<int>;
} }

View File

@@ -1,10 +1,11 @@
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes; using DigitalData.Core.Abstractions;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using DigitalData.UserManager.Application.DTOs.User; using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Application.DTOs namespace EnvelopeGenerator.Application.DTOs
{ {
public record EnvelopeDto() public record EnvelopeDto() : IUnique<int>
{ {
public int Id { get; set; } public int Id { get; set; }

View File

@@ -1,4 +1,5 @@
using DigitalData.Core.DTO; using DigitalData.Core.Abstractions;
using DigitalData.Core.DTO;
using DigitalData.UserManager.Application.DTOs.User; using DigitalData.UserManager.Application.DTOs.User;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
@@ -10,10 +11,11 @@ namespace EnvelopeGenerator.Application.DTOs.EnvelopeHistory
int EnvelopeId, int EnvelopeId,
string UserReference, string UserReference,
int Status, int Status,
string? StatusName,
DateTime AddedWhen, DateTime AddedWhen,
DateTime? ActionDate, DateTime? ActionDate,
UserCreateDto? Sender, UserCreateDto? Sender,
ReceiverReadDto? Receiver, ReceiverReadDto? Receiver,
ReferenceType ReferenceType, ReferenceType ReferenceType,
string? Comment = null) : BaseDTO<long>(Id); string? Comment = null) : BaseDTO<long>(Id), IUnique<long>;
} }

View File

@@ -0,0 +1,29 @@
using DigitalData.Core.Abstractions;
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverBasicDto() : IUnique<(int Envelope, int Receiver)>
{
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
public int EnvelopeId { get; init; }
public int ReceiverId { get; init; }
public int Sequence { get; init; }
[TemplatePlaceholder("[NAME_RECEIVER]")]
public string? Name { get; init; }
public string? JobTitle { get; init; }
public string? CompanyName { get; init; }
public string? PrivateMessage { get; init; }
public DateTime AddedWhen { get; init; }
public DateTime? ChangedWhen { get; init; }
}
}

View File

@@ -0,0 +1,11 @@
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverDto() : EnvelopeReceiverBasicDto()
{
public EnvelopeDto? Envelope { get; set; }
public ReceiverReadDto? Receiver { get; set; }
}
}

View File

@@ -0,0 +1,4 @@
namespace EnvelopeGenerator.Application.DTOs.EnvelopeReceiver
{
public record EnvelopeReceiverSecretDto(string? AccessCode) : EnvelopeReceiverDto;
}

View File

@@ -1,31 +0,0 @@
using DigitalData.EmailProfilerDispatcher.Abstraction.Attributes;
using EnvelopeGenerator.Application.DTOs.Receiver;
namespace EnvelopeGenerator.Application.DTOs
{
public record EnvelopeReceiverDto()
{
public int EnvelopeId { get; set; }
public int ReceiverId { get; set; }
public int Sequence { get; set; }
[TemplatePlaceholder("[NAME_RECEIVER]")]
public string? Name { get; set; }
public string? JobTitle { get; set; }
public string? CompanyName { get; set; }
public string? PrivateMessage { get; set; }
public DateTime AddedWhen { get; set; }
public DateTime? ChangedWhen { get; set; }
public EnvelopeDto? Envelope { get; set; }
public ReceiverReadDto? Receiver { get; set; }
}
}

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record EnvelopeTypeDto( public record EnvelopeTypeDto(
int Id, int Id,
@@ -15,5 +17,5 @@
bool? SendReminderEmails, bool? SendReminderEmails,
int? FirstReminderDays, int? FirstReminderDays,
int? ReminderIntervalDays, int? ReminderIntervalDays,
int? ContractType); int? ContractType) : IUnique<int>;
} }

View File

@@ -1,4 +1,6 @@
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using System.Text.Json.Serialization;
namespace EnvelopeGenerator.Application.DTOs.Receiver namespace EnvelopeGenerator.Application.DTOs.Receiver
{ {
@@ -7,5 +9,11 @@ namespace EnvelopeGenerator.Application.DTOs.Receiver
string EmailAddress, string EmailAddress,
string Signature, string Signature,
DateTime AddedWhen DateTime AddedWhen
) : BaseDTO<int>(Id); ) : BaseDTO<int>(Id)
{
[JsonIgnore]
public IEnumerable<EnvelopeReceiverBasicDto>? EnvelopeReceivers { get; init; }
public string? LastUsedName => EnvelopeReceivers?.LastOrDefault()?.Name;
};
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs.Receiver using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs.Receiver
{ {
public record ReceiverUpdateDto(); public record ReceiverUpdateDto(int Id) : IUnique<int>;
} }

View File

@@ -1,4 +1,6 @@
namespace EnvelopeGenerator.Application.DTOs using DigitalData.Core.Abstractions;
namespace EnvelopeGenerator.Application.DTOs
{ {
public record UserReceiverDto( public record UserReceiverDto(
int Id, int Id,
@@ -7,5 +9,5 @@
string Name, string Name,
string CompanyName, string CompanyName,
string JobTitle, string JobTitle,
DateTime AddedWhen); DateTime AddedWhen) : IUnique<int>;
} }

View File

@@ -12,13 +12,13 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="AutoMapper" Version="13.0.1" /> <PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="DigitalData.Core.Abstractions" Version="1.0.1.1" /> <PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.Application" Version="1.0.0" /> <PackageReference Include="DigitalData.Core.Application" Version="2.0.0" />
<PackageReference Include="DigitalData.Core.DTO" Version="1.0.0" /> <PackageReference Include="DigitalData.Core.DTO" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="1.0.0" /> <PackageReference Include="DigitalData.EmailProfilerDispatcher" Version="2.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" /> <PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.18" />
<PackageReference Include="UserManager.Application" Version="1.0.0" /> <PackageReference Include="UserManager.Application" Version="2.0.0" />
<PackageReference Include="UserManager.Infrastructure" Version="1.0.0" /> <PackageReference Include="UserManager.Infrastructure" Version="2.0.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

View File

@@ -1,6 +1,7 @@
using AutoMapper; using AutoMapper;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
@@ -21,6 +22,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles
CreateMap<EnvelopeHistory, EnvelopeHistoryDto>(); CreateMap<EnvelopeHistory, EnvelopeHistoryDto>();
CreateMap<EnvelopeHistory, EnvelopeHistoryCreateDto>(); CreateMap<EnvelopeHistory, EnvelopeHistoryCreateDto>();
CreateMap<EnvelopeReceiver, EnvelopeReceiverDto>(); CreateMap<EnvelopeReceiver, EnvelopeReceiverDto>();
CreateMap<EnvelopeReceiver, EnvelopeReceiverSecretDto>();
CreateMap<EnvelopeType, EnvelopeTypeDto>(); CreateMap<EnvelopeType, EnvelopeTypeDto>();
CreateMap<Receiver, ReceiverReadDto>(); CreateMap<Receiver, ReceiverReadDto>();
CreateMap<Receiver, ReceiverCreateDto>(); CreateMap<Receiver, ReceiverCreateDto>();
@@ -43,6 +45,7 @@ namespace EnvelopeGenerator.Application.MappingProfiles
CreateMap<ReceiverCreateDto, Receiver>(); CreateMap<ReceiverCreateDto, Receiver>();
CreateMap<ReceiverUpdateDto, Receiver>(); CreateMap<ReceiverUpdateDto, Receiver>();
CreateMap<UserReceiverDto, UserReceiver>(); CreateMap<UserReceiverDto, UserReceiver>();
CreateMap<EnvelopeReceiverBase, EnvelopeReceiverBasicDto>();
} }
} }
} }

View File

@@ -3,15 +3,13 @@ using DigitalData.Core.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class ConfigService : BasicCRUDService<IConfigRepository, ConfigDto, Config, int>, IConfigService public class ConfigService : ReadService<IConfigRepository, ConfigDto, Config, int>, IConfigService
{ {
private static readonly Guid DefaultConfigCacheId = Guid.NewGuid(); private static readonly Guid DefaultConfigCacheId = Guid.NewGuid();
@@ -28,7 +26,7 @@ namespace EnvelopeGenerator.Application.Services
var config = await _repository.ReadFirstAsync(); var config = await _repository.ReadFirstAsync();
return config is null return config is null
? Result.Fail<ConfigDto>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, "There is no configuration in DB.") ? Result.Fail<ConfigDto>().Notice(LogLevel.Error, Flag.DataIntegrityIssue, "There is no configuration in DB.")
: Result.Success(_mapper.MapOrThrow<ConfigDto>(config)); : Result.Success(_mapper.Map<ConfigDto>(config));
} }
/// <summary> /// <summary>

View File

@@ -2,10 +2,8 @@
using DigitalData.Core.Application; using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {

View File

@@ -2,10 +2,8 @@
using DigitalData.Core.Application; using DigitalData.Core.Application;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {

View File

@@ -1,11 +1,9 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -26,7 +24,7 @@ namespace EnvelopeGenerator.Application.Services
? Result.Fail<EmailTemplateDto>() ? Result.Fail<EmailTemplateDto>()
.Message(Key.InnerServiceError) .Message(Key.InnerServiceError)
.Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"EmailTemplateType '{type}' is not found in DB. Please, define required e-mail template.") .Notice(LogLevel.Error, Flag.DataIntegrityIssue, $"EmailTemplateType '{type}' is not found in DB. Please, define required e-mail template.")
: Result.Success(_mapper.MapOrThrow<EmailTemplateDto>(temp)); : Result.Success(_mapper.Map<EmailTemplateDto>(temp));
} }
} }
} }

View File

@@ -1,11 +1,9 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
using EnvelopeGenerator.Application.Resources;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.DTOs.EnvelopeHistory; using EnvelopeGenerator.Application.DTOs.EnvelopeHistory;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
@@ -14,7 +12,7 @@ namespace EnvelopeGenerator.Application.Services
{ {
public class EnvelopeHistoryService : CRUDService<IEnvelopeHistoryRepository, EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>, IEnvelopeHistoryService public class EnvelopeHistoryService : CRUDService<IEnvelopeHistoryRepository, EnvelopeHistoryCreateDto, EnvelopeHistoryDto, EnvelopeHistoryDto, EnvelopeHistory, long>, IEnvelopeHistoryService
{ {
public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) public EnvelopeHistoryService(IEnvelopeHistoryRepository repository, IMapper mapper)
: base(repository, mapper) : base(repository, mapper)
{ {
} }
@@ -53,7 +51,7 @@ namespace EnvelopeGenerator.Application.Services
public async Task<IEnumerable<EnvelopeHistoryDto>> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false) public async Task<IEnumerable<EnvelopeHistoryDto>> ReadAsync(int? envelopeId = null, string? userReference = null, ReferenceType? referenceType = null, int? status = null, bool withSender = false, bool withReceiver = false)
{ {
var histDTOs = _mapper.MapOrThrow<IEnumerable<EnvelopeHistoryDto>>( var histDTOs = _mapper.Map<IEnumerable<EnvelopeHistoryDto>>(
await _repository.ReadAsync( await _repository.ReadAsync(
envelopeId: envelopeId, envelopeId: envelopeId,
userReference: userReference, userReference: userReference,

View File

@@ -5,7 +5,7 @@ using DigitalData.EmailProfilerDispatcher.Abstraction.DTOs.EmailOut;
using DigitalData.EmailProfilerDispatcher.Abstraction.Services; using DigitalData.EmailProfilerDispatcher.Abstraction.Services;
using DigitalData.UserManager.Application; using DigitalData.UserManager.Application;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Common; using EnvelopeGenerator.Common;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
@@ -14,7 +14,7 @@ using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class EnvelopeMailService : EmailOutService, IEnvelopeMailService public class EnvelopeMailService : EmailOutService, IEnvelopeMailService
{ {
private readonly IEmailTemplateService _tempService; private readonly IEmailTemplateService _tempService;
private readonly IEnvelopeReceiverService _envRcvService; private readonly IEnvelopeReceiverService _envRcvService;

View File

@@ -2,7 +2,7 @@
using DigitalData.Core.Application; using DigitalData.Core.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs.EnvelopeReceiver;
using EnvelopeGenerator.Application.Resources; using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
@@ -11,7 +11,7 @@ using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class EnvelopeReceiverService : BasicCRUDService<IEnvelopeReceiverRepository, EnvelopeReceiverDto, EnvelopeReceiver, object>, IEnvelopeReceiverService public class EnvelopeReceiverService : BasicCRUDService<IEnvelopeReceiverRepository, EnvelopeReceiverDto, EnvelopeReceiver, (int Envelope, int Receiver)>, IEnvelopeReceiverService
{ {
private readonly IStringLocalizer<Resource> _localizer; private readonly IStringLocalizer<Resource> _localizer;
@@ -24,13 +24,19 @@ namespace EnvelopeGenerator.Application.Services
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true) public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadBySignatureAsync(string signature, bool withEnvelope = false, bool withReceiver = true)
{ {
var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver); var env_rcvs = await _repository.ReadBySignatureAsync(signature: signature, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(_mapper.MapOrThrow<IEnumerable<EnvelopeReceiverDto>>(env_rcvs)); return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
} }
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false) public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUuidAsync(string uuid, bool withEnvelope = true, bool withReceiver = false)
{ {
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver); var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(_mapper.MapOrThrow<IEnumerable<EnvelopeReceiverDto>>(env_rcvs)); return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverDto>>(env_rcvs));
}
public async Task<DataResult<IEnumerable<EnvelopeReceiverSecretDto>>> ReadSecretByUuidAsync(string uuid, bool withEnvelope = false, bool withReceiver = true)
{
var env_rcvs = await _repository.ReadByUuidAsync(uuid: uuid, withEnvelope: withEnvelope, withReceiver: withReceiver);
return Result.Success(_mapper.Map<IEnumerable<EnvelopeReceiverSecretDto>>(env_rcvs));
} }
public async Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true) public async Task<DataResult<EnvelopeReceiverDto>> ReadByUuidSignatureAsync(string uuid, string signature, bool withEnvelope = true, bool withReceiver = true)
@@ -40,7 +46,7 @@ namespace EnvelopeGenerator.Application.Services
return Result.Fail<EnvelopeReceiverDto>() return Result.Fail<EnvelopeReceiverDto>()
.Message(Key.EnvelopeReceiverNotFound); .Message(Key.EnvelopeReceiverNotFound);
return Result.Success(_mapper.MapOrThrow<EnvelopeReceiverDto>(env_rcv)); return Result.Success(_mapper.Map<EnvelopeReceiverDto>(env_rcv));
} }
public async Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true) public async Task<DataResult<EnvelopeReceiverDto>> ReadByEnvelopeReceiverIdAsync(string envelopeReceiverId, bool withEnvelope = true, bool withReceiver = true)
@@ -119,8 +125,14 @@ namespace EnvelopeGenerator.Application.Services
public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses) public async Task<DataResult<IEnumerable<EnvelopeReceiverDto>>> ReadByUsernameAsync(string username, int? min_status = null, int? max_status = null, params int[] ignore_statuses)
{ {
var er_list = await _repository.ReadByUsernameAsync(username: username, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses); var er_list = await _repository.ReadByUsernameAsync(username: username, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses);
var dto_list = _mapper.MapOrThrow<IEnumerable<EnvelopeReceiverDto>>(er_list); var dto_list = _mapper.Map<IEnumerable<EnvelopeReceiverDto>>(er_list);
return Result.Success(dto_list); return Result.Success(dto_list);
} }
public async Task<DataResult<string?>> ReadLastUsedReceiverNameByMail(string mail)
{
var er = await _repository.ReadLastByReceiver(mail);
return er is null ? Result.Fail<string?>().Notice(LogLevel.None, Flag.NotFound) : Result.Success(er.Name);
}
} }
} }

View File

@@ -3,27 +3,22 @@ using DigitalData.Core.Application;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class EnvelopeService : BasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>, IEnvelopeService public class EnvelopeService : BasicCRUDService<IEnvelopeRepository, EnvelopeDto, Envelope, int>, IEnvelopeService
{ {
private readonly ILogger _logger; public EnvelopeService(IEnvelopeRepository repository, IMapper mapper)
public EnvelopeService(IEnvelopeRepository repository, IMapper mapper, ILogger<EnvelopeService> logger)
: base(repository, mapper) : base(repository, mapper)
{ {
_logger = logger;
} }
public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false) public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadAllWithAsync(bool documents = false, bool history = false, bool documentReceiverElement = false)
{ {
var envelopes = await _repository.ReadAllWithAsync(documents: documents, history: history, documentReceiverElement: documentReceiverElement); var envelopes = await _repository.ReadAllWithAsync(documents: documents, history: history, documentReceiverElement: documentReceiverElement);
var readDto = _mapper.MapOrThrow<IEnumerable<EnvelopeDto>>(envelopes); var readDto = _mapper.Map<IEnumerable<EnvelopeDto>>(envelopes);
return Result.Success(readDto); return Result.Success(readDto);
} }
@@ -34,7 +29,14 @@ namespace EnvelopeGenerator.Application.Services
if (envelope is null) if (envelope is null)
return Result.Fail<EnvelopeDto>(); return Result.Fail<EnvelopeDto>();
var readDto = _mapper.MapOrThrow<EnvelopeDto>(envelope); var readDto = _mapper.Map<EnvelopeDto>(envelope);
return Result.Success(readDto);
}
public async Task<DataResult<IEnumerable<EnvelopeDto>>> ReadByUserAsync(int userId, int? min_status = null, int? max_status = null, params int[] ignore_statuses)
{
var users = await _repository.ReadByUserAsync(userId: userId, min_status: min_status, max_status: max_status, ignore_statuses: ignore_statuses);
var readDto = _mapper.Map<IEnumerable<EnvelopeDto>>(users);
return Result.Success(readDto); return Result.Success(readDto);
} }
} }

View File

@@ -1,19 +1,30 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources; using Microsoft.Extensions.Caching.Memory;
using DigitalData.Core.DTO;
using Microsoft.Extensions.Logging;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class EnvelopeTypeService : BasicCRUDService<IEnvelopeTypeRepository, EnvelopeTypeDto, EnvelopeType, int>, IEnvelopeTypeService public class EnvelopeTypeService : BasicCRUDService<IEnvelopeTypeRepository, EnvelopeTypeDto, EnvelopeType, int>, IEnvelopeTypeService
{ {
public EnvelopeTypeService(IEnvelopeTypeRepository repository, IMapper mapper) private static readonly Guid CacheKey = Guid.NewGuid();
private readonly IMemoryCache _cache;
public EnvelopeTypeService(IEnvelopeTypeRepository repository, IMapper mapper, IMemoryCache cache)
: base(repository, mapper) : base(repository, mapper)
{ {
_cache = cache;
} }
public override async Task<DataResult<IEnumerable<EnvelopeTypeDto>>> ReadAllAsync()
=> await _cache.GetOrCreateAsync(CacheKey, async entry => await base.ReadAllAsync())
?? Result.Fail<IEnumerable<EnvelopeTypeDto>>().Notice(LogLevel.Error, Flag.NotFound, "No cached envelope types are available in the database. If you have added any envelope types after the server started, please restart the server.");
} }
} }

View File

@@ -1,10 +1,8 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources;
using EnvelopeGenerator.Application.DTOs.Receiver; using EnvelopeGenerator.Application.DTOs.Receiver;
using DigitalData.Core.DTO; using DigitalData.Core.DTO;
@@ -12,7 +10,7 @@ namespace EnvelopeGenerator.Application.Services
{ {
public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>, IReceiverService public class ReceiverService : CRUDService<IReceiverRepository, ReceiverCreateDto, ReceiverReadDto, ReceiverUpdateDto, Receiver, int>, IReceiverService
{ {
public ReceiverService(IReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) public ReceiverService(IReceiverRepository repository, IMapper mapper)
: base(repository, mapper) : base(repository, mapper)
{ {
} }
@@ -24,7 +22,7 @@ namespace EnvelopeGenerator.Application.Services
if (rcv is null) if (rcv is null)
return Result.Fail<ReceiverReadDto>(); return Result.Fail<ReceiverReadDto>();
return Result.Success(_mapper.MapOrThrow<ReceiverReadDto>(rcv)); return Result.Success(_mapper.Map<ReceiverReadDto>(rcv));
} }
public async Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null) public async Task<Result> DeleteByAsync(string? emailAddress = null, string? signature = null)

View File

@@ -1,17 +1,15 @@
using AutoMapper; using AutoMapper;
using DigitalData.Core.Application; using DigitalData.Core.Application;
using Microsoft.Extensions.Localization;
using EnvelopeGenerator.Application.Contracts; using EnvelopeGenerator.Application.Contracts;
using EnvelopeGenerator.Application.DTOs; using EnvelopeGenerator.Application.DTOs;
using EnvelopeGenerator.Domain.Entities; using EnvelopeGenerator.Domain.Entities;
using EnvelopeGenerator.Infrastructure.Contracts; using EnvelopeGenerator.Infrastructure.Contracts;
using EnvelopeGenerator.Application.Resources;
namespace EnvelopeGenerator.Application.Services namespace EnvelopeGenerator.Application.Services
{ {
public class UserReceiverService : BasicCRUDService<IUserReceiverRepository, UserReceiverDto, UserReceiver, int>, IUserReceiverService public class UserReceiverService : BasicCRUDService<IUserReceiverRepository, UserReceiverDto, UserReceiver, int>, IUserReceiverService
{ {
public UserReceiverService(IUserReceiverRepository repository, IStringLocalizer<Resource> localizer, IMapper mapper) public UserReceiverService(IUserReceiverRepository repository, IMapper mapper)
: base(repository, mapper) : base(repository, mapper)
{ {
} }

View File

@@ -26,6 +26,7 @@
MessageCompletionSent = 3005 MessageCompletionSent = 3005
End Enum End Enum
'TODO: standardize in xwiki
Public Enum ReferenceType Public Enum ReferenceType
Receiver Receiver
Sender Sender

View File

@@ -63,19 +63,17 @@
<Reference Include="DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" /> <Reference Include="DevExpress.XtraEditors.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a" />
<Reference Include="DevExpress.XtraGauges.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" /> <Reference Include="DevExpress.XtraGauges.v21.2.Core, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DevExpress.XtraReports.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" /> <Reference Include="DevExpress.XtraReports.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a, processorArchitecture=MSIL" />
<Reference Include="DigitalData.Modules.Base, Version=1.3.4.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="DigitalData.Modules.Base">
<SpecificVersion>False</SpecificVersion> <HintPath>..\..\2_DLL Projekte\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
<HintPath>..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Config"> <Reference Include="DigitalData.Modules.Config">
<HintPath>..\..\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath> <HintPath>..\..\2_DLL Projekte\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Database"> <Reference Include="DigitalData.Modules.Database">
<HintPath>..\..\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath> <HintPath>..\..\2_DLL Projekte\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Logging, Version=2.6.2.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="DigitalData.Modules.Logging">
<SpecificVersion>False</SpecificVersion> <HintPath>..\..\2_DLL Projekte\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
<HintPath>..\..\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
</Reference> </Reference>
<Reference Include="GdPicture.NET.14"> <Reference Include="GdPicture.NET.14">
<HintPath>D:\ProgramFiles\GdPicture.NET 14\Redist\GdPicture.NET (.NET Framework 4.5)\GdPicture.NET.14.dll</HintPath> <HintPath>D:\ProgramFiles\GdPicture.NET 14\Redist\GdPicture.NET (.NET Framework 4.5)\GdPicture.NET.14.dll</HintPath>

View File

@@ -33,7 +33,7 @@ Namespace Jobs
Private PDFMerger As PDFMerger Private PDFMerger As PDFMerger
Private ReportCreator As ReportCreator Private ReportCreator As ReportCreator
Private ReadOnly CompleteWaitTime As Integer = 5 Private ReadOnly CompleteWaitTime As Integer = 1
Private ParentFolderUID As String = "" Private ParentFolderUID As String = ""
Private myTempFiles As TempFiles Private myTempFiles As TempFiles

View File

@@ -31,5 +31,5 @@ Imports System.Runtime.InteropServices
' indem Sie "*" wie unten gezeigt eingeben: ' indem Sie "*" wie unten gezeigt eingeben:
' <Assembly: AssemblyVersion("1.0.*")> ' <Assembly: AssemblyVersion("1.0.*")>
<Assembly: AssemblyVersion("1.9.1.0")> <Assembly: AssemblyVersion("1.9.2.0")>
<Assembly: AssemblyFileVersion("1.9.1.0")> <Assembly: AssemblyFileVersion("1.9.2.0")>

View File

@@ -34,6 +34,16 @@ Public Class ActionService
Return True Return True
End Function End Function
Public Function Resend_Receiver(pEnvelope As Envelope, pmail As String) As Boolean
If HistoryService.SetEnvelopeStatus(pEnvelope, Constants.EnvelopeStatus.EnvelopeQueued, pEnvelope.User.Email) = False Then
Return False
End If
Dim oSendResult As Boolean = False
For Each oReceiver In pEnvelope.Receivers
EmailService.SendDocumentReceivedEmail(pEnvelope, oReceiver)
Next
Return oSendResult
End Function
Public Function ResendReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean Public Function ResendReceiver(pEnvelope As Envelope, pReceiver As EnvelopeReceiver) As Boolean
EmailService.SendDocumentReceivedEmail(pEnvelope, pReceiver) EmailService.SendDocumentReceivedEmail(pEnvelope, pReceiver)
End Function End Function

View File

@@ -186,6 +186,9 @@
<data name="Invalid Email Address" xml:space="preserve"> <data name="Invalid Email Address" xml:space="preserve">
<value>Receiver {0} has an invalid Email Address.</value> <value>Receiver {0} has an invalid Email Address.</value>
</data> </data>
<data name="Invitation successfully resend" xml:space="preserve">
<value>Invitation has been send once again!</value>
</data>
<data name="Missing Documents" xml:space="preserve"> <data name="Missing Documents" xml:space="preserve">
<value>Missing Documents</value> <value>Missing Documents</value>
</data> </data>

View File

@@ -186,6 +186,9 @@
<data name="Invalid Email Address" xml:space="preserve"> <data name="Invalid Email Address" xml:space="preserve">
<value>Empfänger {0} hat keine gültige Email Addresse.</value> <value>Empfänger {0} hat keine gültige Email Addresse.</value>
</data> </data>
<data name="Invitation successfully resend" xml:space="preserve">
<value>Die Einladung wurde nochmal versendet!</value>
</data>
<data name="Missing Documents" xml:space="preserve"> <data name="Missing Documents" xml:space="preserve">
<value>Fehlendes Dokument</value> <value>Fehlendes Dokument</value>
</data> </data>

View File

@@ -271,6 +271,15 @@ Namespace My.Resources
End Get End Get
End Property End Property
'''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Die Einladung wurde nochmal versendet! ähnelt.
'''</summary>
Public Shared ReadOnly Property Invitation_successfully_resend() As String
Get
Return ResourceManager.GetString("Invitation successfully resend", resourceCulture)
End Get
End Property
'''<summary> '''<summary>
''' Sucht eine lokalisierte Zeichenfolge, die Fehlendes Dokument ähnelt. ''' Sucht eine lokalisierte Zeichenfolge, die Fehlendes Dokument ähnelt.
'''</summary> '''</summary>

View File

@@ -1,43 +1,41 @@
using System.ComponentModel; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_CONFIG", Schema = "dbo")] [Table("TBSIG_CONFIG", Schema = "dbo")]
public class Config public class Config : IUnique<int>
{ {
[Column("DOCUMENT_PATH", TypeName = "nvarchar(256)")] [Column("DOCUMENT_PATH", TypeName = "nvarchar(256)")]
public string DocumentPath { get; set; } public string? DocumentPath { get; init; }
[Column("SENDING_PROFILE", TypeName = "int")] [Column("SENDING_PROFILE", TypeName = "int")]
[Required] [Required]
[DatabaseGenerated(DatabaseGeneratedOption.None)] // Assuming SENDING_PROFILE is manually entered or controlled by the application logic public required int SendingProfile { get; init; }
[DefaultValue(0)] // This sets the default value for SENDING_PROFILE
public int SendingProfile { get; set; }
[Column("SIGNATURE_HOST", TypeName = "nvarchar(128)")] [Column("SIGNATURE_HOST", TypeName = "nvarchar(128)")]
public string SignatureHost { get; set; } public string? SignatureHost { get; init; }
[Column("EXTERNAL_PROGRAM_NAME", TypeName = "nvarchar(30)")] [Column("EXTERNAL_PROGRAM_NAME", TypeName = "nvarchar(30)")]
public string ExternalProgramName { get; set; } public string? ExternalProgramName { get; init; }
[Column("EXPORT_PATH", TypeName = "nvarchar(256)")] [Column("EXPORT_PATH", TypeName = "nvarchar(256)")]
public string ExportPath { get; set; } public string? ExportPath { get; init; }
[Column("DOCUMENT_PATH_DMZ", TypeName = "nvarchar(512)")] [Column("DOCUMENT_PATH_DMZ", TypeName = "nvarchar(512)")]
[Required] [Required]
[DefaultValue("")] // This sets the default value for DOCUMENT_PATH_DMZ public string? DocumentPathDmz { get; init; }
public string DocumentPathDmz { get; set; }
[Column("EXPORT_PATH_DMZ", TypeName = "nvarchar(512)")] [Column("EXPORT_PATH_DMZ", TypeName = "nvarchar(512)")]
[Required] [Required]
[DefaultValue("")] // This sets the default value for EXPORT_PATH_DMZ public required string ExportPathDmz { get; init; }
public string ExportPathDmz { get; set; }
[Column("DOCUMENT_PATH_MOVE_AFTSEND", TypeName = "nvarchar(512)")] [Column("DOCUMENT_PATH_MOVE_AFTSEND", TypeName = "nvarchar(512)")]
[Required] [Required]
[DefaultValue("")] // This sets the default value for DOCUMENT_PATH_MOVE_AFTSEND public required string DocumentPathMoveAftsend { get; init; }
public string DocumentPathMoveAftsend { get; set; }
[Obsolete("Configuration does not have an ID; it represents a single table in the database.")]
public int Id => throw new InvalidOperationException("This configuration does not support an ID as it represents a single table in the database.");
} }
} }

View File

@@ -1,11 +1,12 @@
using System.ComponentModel; using DigitalData.Core.Abstractions;
using System.ComponentModel;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_DOCUMENT_RECEIVER_ELEMENT", Schema = "dbo")] [Table("TBSIG_DOCUMENT_RECEIVER_ELEMENT", Schema = "dbo")]
public class DocumentReceiverElement public class DocumentReceiverElement : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_DOCUMENT_STATUS", Schema = "dbo")] [Table("TBSIG_DOCUMENT_STATUS", Schema = "dbo")]
public class DocumentStatus public class DocumentStatus : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -27,7 +28,7 @@ namespace EnvelopeGenerator.Domain.Entities
public DateTime? StatusChangedWhen { get; set; } public DateTime? StatusChangedWhen { get; set; }
[Column("VALUE", TypeName = "nvarchar(max)")] [Column("VALUE", TypeName = "nvarchar(max)")]
public string Value { get; set; } public string? Value { get; set; }
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_EMAIL_TEMPLATE", Schema = "dbo")] [Table("TBSIG_EMAIL_TEMPLATE", Schema = "dbo")]
public class EmailTemplate public class EmailTemplate : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -12,12 +13,12 @@ namespace EnvelopeGenerator.Domain.Entities
public int Id { get; set; } public int Id { get; set; }
[Column("NAME", TypeName = "nvarchar(64)")] [Column("NAME", TypeName = "nvarchar(64)")]
public string Name { get; set; } public string? Name { get; set; }
[Column("BODY", TypeName = "nvarchar(max)")] [Column("BODY", TypeName = "nvarchar(max)")]
public string Body { get; set; } public string? Body { get; set; }
[Column("SUBJECT", TypeName = "nvarchar(512)")] [Column("SUBJECT", TypeName = "nvarchar(512)")]
public string Subject { get; set; } public string? Subject { get; set; }
} }
} }

View File

@@ -1,12 +1,12 @@
using EnvelopeGenerator.Common; using DigitalData.Core.Abstractions;
using EnvelopeGenerator.Common.My.Resources; using EnvelopeGenerator.Common;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE", Schema = "dbo")] [Table("TBSIG_ENVELOPE", Schema = "dbo")]
public class Envelope public class Envelope : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -26,11 +26,11 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")] [Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")]
public string Uuid { get; set; } public required string Uuid { get; init; }
[Required] [Required]
[Column("MESSAGE", TypeName = "nvarchar(max)")] [Column("MESSAGE", TypeName = "nvarchar(max)")]
public string Message { get; set; } public string? Message { get; set; }
[Column("EXPIRES_WHEN", TypeName = "datetime")] [Column("EXPIRES_WHEN", TypeName = "datetime")]
public DateTime? ExpiresWhen { get; set; } public DateTime? ExpiresWhen { get; set; }
@@ -46,13 +46,13 @@ namespace EnvelopeGenerator.Domain.Entities
public DateTime? ChangedWhen { get; set; } public DateTime? ChangedWhen { get; set; }
[Column("TITLE", TypeName = "nvarchar(128)")] [Column("TITLE", TypeName = "nvarchar(128)")]
public string Title { get; set; } public string? Title { get; set; }
[Column("CONTRACT_TYPE")] [Column("CONTRACT_TYPE")]
public int? ContractType { get; set; } public int? ContractType { get; set; }
[Column("LANGUAGE", TypeName = "nvarchar(5)")] [Column("LANGUAGE", TypeName = "nvarchar(5)")]
public string Language { get; set; } public required string Language { get; set; }
[Column("SEND_REMINDER_EMAILS")] [Column("SEND_REMINDER_EMAILS")]
public bool? SendReminderEmails { get; set; } public bool? SendReminderEmails { get; set; }

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE_CERTIFICATE", Schema = "dbo")] [Table("TBSIG_ENVELOPE_CERTIFICATE", Schema = "dbo")]
public class EnvelopeCertificate public class EnvelopeCertificate : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -17,11 +18,11 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")] [Column("ENVELOPE_UUID", TypeName = "nvarchar(36)")]
public string EnvelopeUuid { get; set; } public required string EnvelopeUuid { get; set; }
[Required] [Required]
[Column("ENVELOPE_SUBJECT", TypeName = "nvarchar(512)")] [Column("ENVELOPE_SUBJECT", TypeName = "nvarchar(512)")]
public string EnvelopeSubject { get; set; } public required string EnvelopeSubject { get; set; }
[Required] [Required]
[Column("CREATOR_ID")] [Column("CREATOR_ID")]
@@ -29,11 +30,11 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("CREATOR_NAME", TypeName = "nvarchar(128)")] [Column("CREATOR_NAME", TypeName = "nvarchar(128)")]
public string CreatorName { get; set; } public required string CreatorName { get; set; }
[Required] [Required]
[Column("CREATOR_EMAIL", TypeName = "nvarchar(128)")] [Column("CREATOR_EMAIL", TypeName = "nvarchar(128)")]
public string CreatorEmail { get; set; } public required string CreatorEmail { get; set; }
[Required] [Required]
[Column("ENVELOPE_STATUS")] [Column("ENVELOPE_STATUS")]

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE_DOCUMENT", Schema = "dbo")] [Table("TBSIG_ENVELOPE_DOCUMENT", Schema = "dbo")]
public class EnvelopeDocument public class EnvelopeDocument : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -17,18 +18,18 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("FILENAME", TypeName = "nvarchar(256)")] [Column("FILENAME", TypeName = "nvarchar(256)")]
public string Filename { get; set; } public required string Filename { get; set; }
[Required] [Required]
[Column("FILEPATH", TypeName = "nvarchar(256)")] [Column("FILEPATH", TypeName = "nvarchar(256)")]
public string Filepath { get; set; } public required string Filepath { get; set; }
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; } public required DateTime AddedWhen { get; set; }
[Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")] [Column("FILENAME_ORIGINAL", TypeName = "nvarchar(256)")]
public string FilenameOriginal { get; set; } public required string FilenameOriginal { get; set; }
public IEnumerable<DocumentReceiverElement>? Elements { get; set; } public IEnumerable<DocumentReceiverElement>? Elements { get; set; }
} }

View File

@@ -1,4 +1,5 @@
using DigitalData.UserManager.Domain.Entities; using DigitalData.Core.Abstractions;
using DigitalData.UserManager.Domain.Entities;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using static EnvelopeGenerator.Common.Constants; using static EnvelopeGenerator.Common.Constants;
@@ -6,7 +7,7 @@ using static EnvelopeGenerator.Common.Constants;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE_HISTORY", Schema = "dbo")] [Table("TBSIG_ENVELOPE_HISTORY", Schema = "dbo")]
public class EnvelopeHistory public class EnvelopeHistory : IUnique<long>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -19,7 +20,7 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("USER_REFERENCE", TypeName = "nvarchar(128)")] [Column("USER_REFERENCE", TypeName = "nvarchar(128)")]
public string UserReference { get; set; } public required string UserReference { get; init; }
[Required] [Required]
[Column("STATUS")] [Column("STATUS")]
@@ -43,11 +44,17 @@ namespace EnvelopeGenerator.Domain.Entities
public virtual Receiver? Receiver { get; set; } public virtual Receiver? Receiver { get; set; }
[NotMapped] [NotMapped]
public ReferenceType ReferenceType => (Status / 3) switch public ReferenceType ReferenceType => (Status / 1000) switch
{ {
1 => ReferenceType.Sender, 1 => ReferenceType.Sender,
2 or 3 => ReferenceType.Receiver, 2 or 3 => ReferenceType.Receiver,
_ => ReferenceType.Unknown, _ => ReferenceType.Unknown,
}; };
[NotMapped]
public string? StatusName
=> (Enum.IsDefined(typeof(EnvelopeStatus), Status))
? Enum.GetName(typeof(EnvelopeStatus), Status)
: null;
} }
} }

View File

@@ -1,45 +1,10 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema;
using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")] [Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")]
public class EnvelopeReceiver public class EnvelopeReceiver : EnvelopeReceiverBase
{ {
[Key]
[Column("ENVELOPE_ID")]
public int EnvelopeId { get; set; }
[Key]
[Column("RECEIVER_ID")]
public int ReceiverId { get; set; }
[Required]
[Column("SEQUENCE")]
public int Sequence { get; set; }
[Column("NAME", TypeName = "nvarchar(128)")]
public string? Name { get; set; }
[Column("JOB_TITLE", TypeName = "nvarchar(128)")]
public string? JobTitle { get; set; }
[Column("COMPANY_NAME", TypeName = "nvarchar(128)")]
public string? CompanyName { get; set; }
[Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")]
public string? PrivateMessage { get; set; }
[Column("ACCESS_CODE", TypeName = "nvarchar(64)")]
public string? AccessCode { get; set; }
[Required]
[Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; }
[Column("CHANGED_WHEN", TypeName = "datetime")]
public DateTime? ChangedWhen { get; set; }
[ForeignKey("EnvelopeId")] [ForeignKey("EnvelopeId")]
public Envelope? Envelope { get; set; } public Envelope? Envelope { get; set; }

View File

@@ -0,0 +1,46 @@
using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities
{
[Table("TBSIG_ENVELOPE_RECEIVER", Schema = "dbo")]
public class EnvelopeReceiverBase : IUnique<(int Envelope, int Receiver)>
{
[Key]
[Column("ENVELOPE_ID")]
public int EnvelopeId { get; set; }
[Key]
[Column("RECEIVER_ID")]
public int ReceiverId { get; set; }
[Required]
[Column("SEQUENCE")]
public int Sequence { get; set; }
[Column("NAME", TypeName = "nvarchar(128)")]
public string? Name { get; set; }
[Column("JOB_TITLE", TypeName = "nvarchar(128)")]
public string? JobTitle { get; set; }
[Column("COMPANY_NAME", TypeName = "nvarchar(128)")]
public string? CompanyName { get; set; }
[Column("PRIVATE_MESSAGE", TypeName = "nvarchar(max)")]
public string? PrivateMessage { get; set; }
[Column("ACCESS_CODE", TypeName = "nvarchar(64)")]
public string? AccessCode { get; set; }
[Required]
[Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; }
[Column("CHANGED_WHEN", TypeName = "datetime")]
public DateTime? ChangedWhen { get; set; }
public (int Envelope, int Receiver) Id => (Envelope: EnvelopeId, Receiver: ReceiverId);
}
}

View File

@@ -1,12 +1,11 @@
using System; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
using EnvelopeGenerator.Domain.Entities;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_ENVELOPE_TYPE", Schema = "dbo")] [Table("TBSIG_ENVELOPE_TYPE", Schema = "dbo")]
public class EnvelopeType public class EnvelopeType : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -15,10 +14,10 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("TITLE", TypeName = "nvarchar(128)")] [Column("TITLE", TypeName = "nvarchar(128)")]
public string Title { get; set; } public required string Title { get; set; }
[Column("LANGUAGE", TypeName = "nvarchar(5)")] [Column("LANGUAGE", TypeName = "nvarchar(5)")]
public string Language { get; set; } public string? Language { get; set; }
[Column("EXPIRES_DAYS")] [Column("EXPIRES_DAYS")]
public int? ExpiresDays { get; set; } public int? ExpiresDays { get; set; }

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_RECEIVER", Schema = "dbo")] [Table("TBSIG_RECEIVER", Schema = "dbo")]
public class Receiver public class Receiver : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -22,5 +23,7 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; } public DateTime AddedWhen { get; set; }
public IEnumerable<EnvelopeReceiver>? EnvelopeReceivers { get; init; }
} }
} }

View File

@@ -1,10 +1,11 @@
using System.ComponentModel.DataAnnotations; using DigitalData.Core.Abstractions;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations.Schema;
namespace EnvelopeGenerator.Domain.Entities namespace EnvelopeGenerator.Domain.Entities
{ {
[Table("TBSIG_USER_RECEIVER", Schema = "dbo")] [Table("TBSIG_USER_RECEIVER", Schema = "dbo")]
public class UserReceiver public class UserReceiver : IUnique<int>
{ {
[Key] [Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)] [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
@@ -21,16 +22,16 @@ namespace EnvelopeGenerator.Domain.Entities
[Required] [Required]
[Column("NAME", TypeName = "nvarchar(128)")] [Column("NAME", TypeName = "nvarchar(128)")]
public string Name { get; set; } public required string Name { get; set; }
[Column("COMPANY_NAME", TypeName = "nvarchar(128)")] [Column("COMPANY_NAME", TypeName = "nvarchar(128)")]
public string CompanyName { get; set; } public string? CompanyName { get; set; }
[Column("JOB_TITLE", TypeName = "nvarchar(128)")] [Column("JOB_TITLE", TypeName = "nvarchar(128)")]
public string JobTitle { get; set; } public string? JobTitle { get; set; }
[Required] [Required]
[Column("ADDED_WHEN", TypeName = "datetime")] [Column("ADDED_WHEN", TypeName = "datetime")]
public DateTime AddedWhen { get; set; } public required DateTime AddedWhen { get; init; }
} }
} }

View File

@@ -7,6 +7,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="DigitalData.Core.Abstractions" Version="2.0.0" />
<PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="1.0.0" /> <PackageReference Include="DigitalData.EmailProfilerDispatcher.Abstraction" Version="1.0.0" />
<PackageReference Include="UserManager.Domain" Version="1.0.0" /> <PackageReference Include="UserManager.Domain" Version="1.0.0" />
</ItemGroup> </ItemGroup>

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -41,7 +41,10 @@
<StartupObject>EnvelopeGenerator.Form.My.MyApplication</StartupObject> <StartupObject>EnvelopeGenerator.Form.My.MyApplication</StartupObject>
</PropertyGroup> </PropertyGroup>
<PropertyGroup> <PropertyGroup>
<ApplicationIcon>DD_signFLOW_icon_256.ico</ApplicationIcon> <ApplicationIcon>DD_signFLOW_ICON.ico</ApplicationIcon>
</PropertyGroup>
<PropertyGroup>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<Reference Include="Accessibility" /> <Reference Include="Accessibility" />
@@ -75,14 +78,20 @@
<Reference Include="DigitalData.Modules.Base"> <Reference Include="DigitalData.Modules.Base">
<HintPath>..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath> <HintPath>..\..\DDModules\Base\bin\Debug\DigitalData.Modules.Base.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Config"> <Reference Include="DigitalData.Modules.Config, Version=1.2.2.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\2_DLL Projekte\DDModules\Config\bin\Debug\DigitalData.Modules.Config.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Database"> <Reference Include="DigitalData.Modules.Database, Version=2.3.5.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\2_DLL Projekte\DDModules\Database\bin\Debug\DigitalData.Modules.Database.dll</HintPath>
</Reference> </Reference>
<Reference Include="DigitalData.Modules.Logging"> <Reference Include="DigitalData.Modules.Logging, Version=2.6.3.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\..\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath> <SpecificVersion>False</SpecificVersion>
<HintPath>..\..\2_DLL Projekte\DDModules\Logging\bin\Debug\DigitalData.Modules.Logging.dll</HintPath>
</Reference>
<Reference Include="DigitalData.Modules.Messaging">
<HintPath>..\..\2_DLL Projekte\DDModules\Messaging\bin\Debug\DigitalData.Modules.Messaging.dll</HintPath>
</Reference> </Reference>
<Reference Include="EnvelopeGenerator.Common, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="EnvelopeGenerator.Common, Version=1.8.0.0, Culture=neutral, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
@@ -180,6 +189,7 @@
<Compile Include="My Project\AssemblyInfo.vb" /> <Compile Include="My Project\AssemblyInfo.vb" />
<EmbeddedResource Include="frmEnvelopeEditor.en.resx"> <EmbeddedResource Include="frmEnvelopeEditor.en.resx">
<DependentUpon>frmEnvelopeEditor.vb</DependentUpon> <DependentUpon>frmEnvelopeEditor.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="frmEnvelopeEditor.resx"> <EmbeddedResource Include="frmEnvelopeEditor.resx">
<DependentUpon>frmEnvelopeEditor.vb</DependentUpon> <DependentUpon>frmEnvelopeEditor.vb</DependentUpon>
@@ -194,6 +204,7 @@
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="frmFieldEditor.en.resx"> <EmbeddedResource Include="frmFieldEditor.en.resx">
<DependentUpon>frmFieldEditor.vb</DependentUpon> <DependentUpon>frmFieldEditor.vb</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource> </EmbeddedResource>
<EmbeddedResource Include="frmFieldEditor.resx"> <EmbeddedResource Include="frmFieldEditor.resx">
<DependentUpon>frmFieldEditor.vb</DependentUpon> <DependentUpon>frmFieldEditor.vb</DependentUpon>
@@ -244,6 +255,7 @@
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="DD_signFLOW_ICON.ico" />
<Content Include="DD_signFLOW_icon_256.ico" /> <Content Include="DD_signFLOW_icon_256.ico" />
<Content Include="DD_signFLOW_Preloader.png" /> <Content Include="DD_signFLOW_Preloader.png" />
<Content Include="MailLicense.xml"> <Content Include="MailLicense.xml">

View File

@@ -14,10 +14,10 @@
<value>True</value> <value>True</value>
</setting> </setting>
<setting name="DefaultAppSkin" serializeAs="String"> <setting name="DefaultAppSkin" serializeAs="String">
<value>Skin/The Bezier</value> <value>Skin/Office 2019 White</value>
</setting> </setting>
<setting name="DefaultPalette" serializeAs="String"> <setting name="DefaultPalette" serializeAs="String">
<value>VS 2019 Blue</value> <value></value>
</setting> </setting>
<setting name="TouchUI" serializeAs="String"> <setting name="TouchUI" serializeAs="String">
<value></value> <value></value>

View File

@@ -398,7 +398,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlGroup4.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlGroup5}) Me.LayoutControlGroup4.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlGroup5})
Me.LayoutControlGroup4.Name = "LayoutControlGroup4" Me.LayoutControlGroup4.Name = "LayoutControlGroup4"
Me.LayoutControlGroup4.Padding = New DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0) Me.LayoutControlGroup4.Padding = New DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0)
Me.LayoutControlGroup4.Size = New System.Drawing.Size(251, 526) Me.LayoutControlGroup4.Size = New System.Drawing.Size(251, 530)
Me.LayoutControlGroup4.TextVisible = False Me.LayoutControlGroup4.TextVisible = False
' '
'LayoutControlGroup5 'LayoutControlGroup5
@@ -406,7 +406,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlGroup5.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem5}) Me.LayoutControlGroup5.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlItem5})
Me.LayoutControlGroup5.Location = New System.Drawing.Point(0, 0) Me.LayoutControlGroup5.Location = New System.Drawing.Point(0, 0)
Me.LayoutControlGroup5.Name = "LayoutControlGroup5" Me.LayoutControlGroup5.Name = "LayoutControlGroup5"
Me.LayoutControlGroup5.Size = New System.Drawing.Size(251, 526) Me.LayoutControlGroup5.Size = New System.Drawing.Size(251, 530)
resources.ApplyResources(Me.LayoutControlGroup5, "LayoutControlGroup5") resources.ApplyResources(Me.LayoutControlGroup5, "LayoutControlGroup5")
' '
'LayoutControlItem5 'LayoutControlItem5
@@ -414,7 +414,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlItem5.Control = Me.GridDocuments Me.LayoutControlItem5.Control = Me.GridDocuments
Me.LayoutControlItem5.Location = New System.Drawing.Point(0, 0) Me.LayoutControlItem5.Location = New System.Drawing.Point(0, 0)
Me.LayoutControlItem5.Name = "LayoutControlItem5" Me.LayoutControlItem5.Name = "LayoutControlItem5"
Me.LayoutControlItem5.Size = New System.Drawing.Size(227, 477) Me.LayoutControlItem5.Size = New System.Drawing.Size(227, 485)
Me.LayoutControlItem5.TextSize = New System.Drawing.Size(0, 0) Me.LayoutControlItem5.TextSize = New System.Drawing.Size(0, 0)
Me.LayoutControlItem5.TextVisible = False Me.LayoutControlItem5.TextVisible = False
' '
@@ -578,7 +578,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlItem2.Control = Me.GridReceivers Me.LayoutControlItem2.Control = Me.GridReceivers
Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 0) Me.LayoutControlItem2.Location = New System.Drawing.Point(0, 0)
Me.LayoutControlItem2.Name = "LayoutControlItem2" Me.LayoutControlItem2.Name = "LayoutControlItem2"
Me.LayoutControlItem2.Size = New System.Drawing.Size(875, 200) Me.LayoutControlItem2.Size = New System.Drawing.Size(875, 204)
Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0) Me.LayoutControlItem2.TextSize = New System.Drawing.Size(0, 0)
Me.LayoutControlItem2.TextVisible = False Me.LayoutControlItem2.TextVisible = False
' '
@@ -611,7 +611,7 @@ Partial Public Class frmEnvelopeEditor
Me.Root.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlGroup1}) Me.Root.Items.AddRange(New DevExpress.XtraLayout.BaseLayoutItem() {Me.LayoutControlGroup1})
Me.Root.Name = "Root" Me.Root.Name = "Root"
Me.Root.Padding = New DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0) Me.Root.Padding = New DevExpress.XtraLayout.Utils.Padding(0, 0, 0, 0)
Me.Root.Size = New System.Drawing.Size(899, 259) Me.Root.Size = New System.Drawing.Size(899, 263)
Me.Root.TextVisible = False Me.Root.TextVisible = False
' '
'LayoutControlGroup1 'LayoutControlGroup1
@@ -620,7 +620,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlGroup1.Location = New System.Drawing.Point(0, 0) Me.LayoutControlGroup1.Location = New System.Drawing.Point(0, 0)
Me.LayoutControlGroup1.Name = "LayoutControlGroup1" Me.LayoutControlGroup1.Name = "LayoutControlGroup1"
Me.LayoutControlGroup1.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10) Me.LayoutControlGroup1.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
Me.LayoutControlGroup1.Size = New System.Drawing.Size(899, 259) Me.LayoutControlGroup1.Size = New System.Drawing.Size(899, 263)
resources.ApplyResources(Me.LayoutControlGroup1, "LayoutControlGroup1") resources.ApplyResources(Me.LayoutControlGroup1, "LayoutControlGroup1")
' '
'LayoutControlItem3 'LayoutControlItem3
@@ -629,7 +629,7 @@ Partial Public Class frmEnvelopeEditor
Me.LayoutControlItem3.Location = New System.Drawing.Point(0, 0) Me.LayoutControlItem3.Location = New System.Drawing.Point(0, 0)
Me.LayoutControlItem3.Name = "LayoutControlItem3" Me.LayoutControlItem3.Name = "LayoutControlItem3"
Me.LayoutControlItem3.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10) Me.LayoutControlItem3.Padding = New DevExpress.XtraLayout.Utils.Padding(10, 10, 10, 10)
Me.LayoutControlItem3.Size = New System.Drawing.Size(873, 208) Me.LayoutControlItem3.Size = New System.Drawing.Size(873, 216)
resources.ApplyResources(Me.LayoutControlItem3, "LayoutControlItem3") resources.ApplyResources(Me.LayoutControlItem3, "LayoutControlItem3")
Me.LayoutControlItem3.TextLocation = DevExpress.Utils.Locations.Top Me.LayoutControlItem3.TextLocation = DevExpress.Utils.Locations.Top
Me.LayoutControlItem3.TextSize = New System.Drawing.Size(49, 13) Me.LayoutControlItem3.TextSize = New System.Drawing.Size(49, 13)

View File

@@ -384,6 +384,6 @@
</value> </value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Sign Flow - Envelope-Editor</value> <value>signFLOW - Envelope-Editor</value>
</data> </data>
</root> </root>

View File

@@ -126,7 +126,7 @@
<value>0, 132</value> <value>0, 132</value>
</data> </data>
<data name="GridDocuments.Location" type="System.Drawing.Point, System.Drawing"> <data name="GridDocuments.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 39</value> <value>14, 35</value>
</data> </data>
<data name="colFilename.Caption" xml:space="preserve"> <data name="colFilename.Caption" xml:space="preserve">
<value>Dateiname</value> <value>Dateiname</value>
@@ -439,10 +439,10 @@
<value>1164, 132</value> <value>1164, 132</value>
</data> </data>
<data name="RibbonStatusBar1.Location" type="System.Drawing.Point, System.Drawing"> <data name="RibbonStatusBar1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 658</value> <value>0, 662</value>
</data> </data>
<data name="RibbonStatusBar1.Size" type="System.Drawing.Size, System.Drawing"> <data name="RibbonStatusBar1.Size" type="System.Drawing.Size, System.Drawing">
<value>1164, 26</value> <value>1164, 22</value>
</data> </data>
<data name="&gt;&gt;RibbonStatusBar1.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonStatusBar1.Name" xml:space="preserve">
<value>RibbonStatusBar1</value> <value>RibbonStatusBar1</value>
@@ -469,7 +469,7 @@
<value>2</value> <value>2</value>
</data> </data>
<data name="GridDocuments.Size" type="System.Drawing.Size, System.Drawing"> <data name="GridDocuments.Size" type="System.Drawing.Size, System.Drawing">
<value>223, 473</value> <value>223, 481</value>
</data> </data>
<data name="GridDocuments.TabIndex" type="System.Int32, mscorlib"> <data name="GridDocuments.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@@ -496,7 +496,7 @@
<value>Ihre Dokumente</value> <value>Ihre Dokumente</value>
</data> </data>
<data name="LayoutControl3.Size" type="System.Drawing.Size, System.Drawing"> <data name="LayoutControl3.Size" type="System.Drawing.Size, System.Drawing">
<value>251, 526</value> <value>251, 530</value>
</data> </data>
<data name="LayoutControl3.TabIndex" type="System.Int32, mscorlib"> <data name="LayoutControl3.TabIndex" type="System.Int32, mscorlib">
<value>1</value> <value>1</value>
@@ -541,7 +541,7 @@
<value>334, 17</value> <value>334, 17</value>
</metadata> </metadata>
<data name="GridReceivers.Location" type="System.Drawing.Point, System.Drawing"> <data name="GridReceivers.Location" type="System.Drawing.Point, System.Drawing">
<value>14, 39</value> <value>14, 35</value>
</data> </data>
<data name="colColor.Caption" xml:space="preserve"> <data name="colColor.Caption" xml:space="preserve">
<value> </value> <value> </value>
@@ -635,7 +635,7 @@
<value>Combo</value> <value>Combo</value>
</data> </data>
<data name="GridReceivers.Size" type="System.Drawing.Size, System.Drawing"> <data name="GridReceivers.Size" type="System.Drawing.Size, System.Drawing">
<value>871, 196</value> <value>871, 200</value>
</data> </data>
<data name="GridReceivers.TabIndex" type="System.Int32, mscorlib"> <data name="GridReceivers.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@@ -728,13 +728,13 @@
<value>0</value> <value>0</value>
</data> </data>
<data name="txtMessage.Location" type="System.Drawing.Point, System.Drawing"> <data name="txtMessage.Location" type="System.Drawing.Point, System.Drawing">
<value>23, 64</value> <value>23, 60</value>
</data> </data>
<data name="txtMessage.Properties.Appearance.Font" type="System.Drawing.Font, System.Drawing"> <data name="txtMessage.Properties.Appearance.Font" type="System.Drawing.Font, System.Drawing">
<value>Segoe UI, 9.75pt</value> <value>Segoe UI, 9.75pt</value>
</data> </data>
<data name="txtMessage.Size" type="System.Drawing.Size, System.Drawing"> <data name="txtMessage.Size" type="System.Drawing.Size, System.Drawing">
<value>853, 172</value> <value>853, 180</value>
</data> </data>
<data name="txtMessage.TabIndex" type="System.Int32, mscorlib"> <data name="txtMessage.TabIndex" type="System.Int32, mscorlib">
<value>2</value> <value>2</value>
@@ -764,7 +764,7 @@
<value>Ihre Nachricht</value> <value>Ihre Nachricht</value>
</data> </data>
<data name="LayoutControl1.Size" type="System.Drawing.Size, System.Drawing"> <data name="LayoutControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>899, 259</value> <value>899, 263</value>
</data> </data>
<data name="LayoutControl1.TabIndex" type="System.Int32, mscorlib"> <data name="LayoutControl1.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@@ -794,7 +794,7 @@
<value>0, 0, 0, 0</value> <value>0, 0, 0, 0</value>
</data> </data>
<data name="PanelControl2.Size" type="System.Drawing.Size, System.Drawing"> <data name="PanelControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>903, 263</value> <value>903, 267</value>
</data> </data>
<data name="PanelControl2.TabIndex" type="System.Int32, mscorlib"> <data name="PanelControl2.TabIndex" type="System.Int32, mscorlib">
<value>1</value> <value>1</value>
@@ -827,7 +827,7 @@
<value>1</value> <value>1</value>
</data> </data>
<data name="SplitContainerControl2.Size" type="System.Drawing.Size, System.Drawing"> <data name="SplitContainerControl2.Size" type="System.Drawing.Size, System.Drawing">
<value>903, 526</value> <value>903, 530</value>
</data> </data>
<data name="SplitContainerControl2.TabIndex" type="System.Int32, mscorlib"> <data name="SplitContainerControl2.TabIndex" type="System.Int32, mscorlib">
<value>0</value> <value>0</value>
@@ -860,7 +860,7 @@
<value>1</value> <value>1</value>
</data> </data>
<data name="SplitContainerControl1.Size" type="System.Drawing.Size, System.Drawing"> <data name="SplitContainerControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1164, 526</value> <value>1164, 530</value>
</data> </data>
<data name="SplitContainerControl1.TabIndex" type="System.Int32, mscorlib"> <data name="SplitContainerControl1.TabIndex" type="System.Int32, mscorlib">
<value>1</value> <value>1</value>
@@ -878,7 +878,7 @@
<value>0</value> <value>0</value>
</data> </data>
<metadata name="FrmEditorBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="FrmEditorBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>792, 17</value> <value>17, 54</value>
</metadata> </metadata>
<metadata name="EnvelopeDocumentBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"> <metadata name="EnvelopeDocumentBindingSource.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>557, 17</value> <value>557, 17</value>
@@ -948,7 +948,7 @@
<value>CenterScreen</value> <value>CenterScreen</value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Sign Flow - Umschlag-Editor</value> <value>signFLOW - Umschlag-Editor</value>
</data> </data>
<data name="&gt;&gt;SplashScreenManager1.Name" xml:space="preserve"> <data name="&gt;&gt;SplashScreenManager1.Name" xml:space="preserve">
<value>SplashScreenManager1</value> <value>SplashScreenManager1</value>

View File

@@ -299,6 +299,6 @@
</value> </value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Sign Flow - Signature-Editor</value> <value>signFLOW - Signature-Editor</value>
</data> </data>
</root> </root>

View File

@@ -538,7 +538,7 @@
<value>CenterScreen</value> <value>CenterScreen</value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Sign Flow - Signatur-Editor</value> <value>signFLOW - Signatur-Editor</value>
</data> </data>
<data name="&gt;&gt;BarButtonItem1.Name" xml:space="preserve"> <data name="&gt;&gt;BarButtonItem1.Name" xml:space="preserve">
<value>BarButtonItem1</value> <value>BarButtonItem1</value>

View File

@@ -60,6 +60,8 @@ Partial Class frmMain
Me.BarCheckItem1 = New DevExpress.XtraBars.BarCheckItem() Me.BarCheckItem1 = New DevExpress.XtraBars.BarCheckItem()
Me.bsitmInfo = New DevExpress.XtraBars.BarStaticItem() Me.bsitmInfo = New DevExpress.XtraBars.BarStaticItem()
Me.bbtnitmEB = New DevExpress.XtraBars.BarButtonItem() Me.bbtnitmEB = New DevExpress.XtraBars.BarButtonItem()
Me.bbtnitmInfoMail = New DevExpress.XtraBars.BarButtonItem()
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage() Me.RibbonPage1 = New DevExpress.XtraBars.Ribbon.RibbonPage()
Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageEnvelopeActions = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup() Me.RibbonPageGroup1 = New DevExpress.XtraBars.Ribbon.RibbonPageGroup()
@@ -85,8 +87,6 @@ Partial Class frmMain
Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn() Me.GridColumn7 = New DevExpress.XtraGrid.Columns.GridColumn()
Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components) Me.RefreshTimer = New System.Windows.Forms.Timer(Me.components)
Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog() Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog()
Me.bbtnitmInfoMail = New DevExpress.XtraBars.BarButtonItem()
Me.BarButtonItem2 = New DevExpress.XtraBars.BarButtonItem()
CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1, System.ComponentModel.ISupportInitialize).BeginInit()
CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit() CType(Me.SplitContainerControl1.Panel1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SplitContainerControl1.Panel1.SuspendLayout() Me.SplitContainerControl1.Panel1.SuspendLayout()
@@ -410,6 +410,20 @@ Partial Class frmMain
Me.bbtnitmEB.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmEB.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage) Me.bbtnitmEB.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmEB.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.bbtnitmEB.Name = "bbtnitmEB" Me.bbtnitmEB.Name = "bbtnitmEB"
' '
'bbtnitmInfoMail
'
resources.ApplyResources(Me.bbtnitmInfoMail, "bbtnitmInfoMail")
Me.bbtnitmInfoMail.Id = 15
Me.bbtnitmInfoMail.ImageOptions.SvgImage = CType(resources.GetObject("bbtnitmInfoMail.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.bbtnitmInfoMail.Name = "bbtnitmInfoMail"
'
'BarButtonItem2
'
resources.ApplyResources(Me.BarButtonItem2, "BarButtonItem2")
Me.BarButtonItem2.Id = 16
Me.BarButtonItem2.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.BarButtonItem2.Name = "BarButtonItem2"
'
'RibbonPage1 'RibbonPage1
' '
Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageGroup2}) Me.RibbonPage1.Groups.AddRange(New DevExpress.XtraBars.Ribbon.RibbonPageGroup() {Me.RibbonPageEnvelopeActions, Me.RibbonPageGroup1, Me.RibbonPageGroup2})
@@ -600,20 +614,6 @@ Partial Class frmMain
' '
resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1") resources.ApplyResources(Me.SaveFileDialog1, "SaveFileDialog1")
' '
'bbtnitmInfoMail
'
resources.ApplyResources(Me.bbtnitmInfoMail, "bbtnitmInfoMail")
Me.bbtnitmInfoMail.Id = 15
Me.bbtnitmInfoMail.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage"), DevExpress.Utils.Svg.SvgImage)
Me.bbtnitmInfoMail.Name = "bbtnitmInfoMail"
'
'BarButtonItem2
'
resources.ApplyResources(Me.BarButtonItem2, "BarButtonItem2")
Me.BarButtonItem2.Id = 16
Me.BarButtonItem2.ImageOptions.SvgImage = CType(resources.GetObject("BarButtonItem2.ImageOptions.SvgImage1"), DevExpress.Utils.Svg.SvgImage)
Me.BarButtonItem2.Name = "BarButtonItem2"
'
'frmMain 'frmMain
' '
resources.ApplyResources(Me, "$this") resources.ApplyResources(Me, "$this")

View File

@@ -123,7 +123,7 @@
</data> </data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" /> <assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="SplitContainerControl1.Location" type="System.Drawing.Point, System.Drawing"> <data name="SplitContainerControl1.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 162</value> <value>0, 160</value>
</data> </data>
<data name="XtraTabControlMain.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms"> <data name="XtraTabControlMain.Dock" type="System.Windows.Forms.DockStyle, System.Windows.Forms">
<value>Fill</value> <value>Fill</value>
@@ -714,7 +714,7 @@
<data name="bbtnitmInfoMail.Caption" xml:space="preserve"> <data name="bbtnitmInfoMail.Caption" xml:space="preserve">
<value>Support Mail</value> <value>Support Mail</value>
</data> </data>
<data name="BarButtonItem2.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="bbtnitmInfoMail.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -734,9 +734,9 @@
</value> </value>
</data> </data>
<data name="BarButtonItem2.Caption" xml:space="preserve"> <data name="BarButtonItem2.Caption" xml:space="preserve">
<value>BarButtonItem2</value> <value>Einladung erneut versenden</value>
</data> </data>
<data name="BarButtonItem2.ImageOptions.SvgImage1" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="BarButtonItem2.ImageOptions.SvgImage" type="DevExpress.Utils.Svg.SvgImage, DevExpress.Data.v21.2" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40 AAEAAAD/////AQAAAAAAAAAMAgAAAFlEZXZFeHByZXNzLkRhdGEudjIxLjIsIFZlcnNpb249MjEuMi40
LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl LjAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49Yjg4ZDE3NTRkNzAwZTQ5YQUBAAAAHURl
@@ -777,13 +777,13 @@
<value>Einstellungen</value> <value>Einstellungen</value>
</data> </data>
<data name="RibbonControl.Size" type="System.Drawing.Size, System.Drawing"> <data name="RibbonControl.Size" type="System.Drawing.Size, System.Drawing">
<value>1090, 162</value> <value>1090, 160</value>
</data> </data>
<data name="RibbonStatusBar.Location" type="System.Drawing.Point, System.Drawing"> <data name="RibbonStatusBar.Location" type="System.Drawing.Point, System.Drawing">
<value>0, 656</value> <value>0, 660</value>
</data> </data>
<data name="RibbonStatusBar.Size" type="System.Drawing.Size, System.Drawing"> <data name="RibbonStatusBar.Size" type="System.Drawing.Size, System.Drawing">
<value>1090, 26</value> <value>1090, 22</value>
</data> </data>
<data name="&gt;&gt;RibbonStatusBar.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonStatusBar.Name" xml:space="preserve">
<value>RibbonStatusBar</value> <value>RibbonStatusBar</value>
@@ -810,7 +810,7 @@
<value>2</value> <value>2</value>
</data> </data>
<data name="GridEnvelopes.Size" type="System.Drawing.Size, System.Drawing"> <data name="GridEnvelopes.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 455</value> <value>1088, 467</value>
</data> </data>
<data name="GridEnvelopes.TabIndex" type="System.Int32, mscorlib"> <data name="GridEnvelopes.TabIndex" type="System.Int32, mscorlib">
<value>2</value> <value>2</value>
@@ -828,7 +828,7 @@
<value>0</value> <value>0</value>
</data> </data>
<data name="XtraTabPage1.Size" type="System.Drawing.Size, System.Drawing"> <data name="XtraTabPage1.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 455</value> <value>1088, 467</value>
</data> </data>
<data name="XtraTabPage1.Text" xml:space="preserve"> <data name="XtraTabPage1.Text" xml:space="preserve">
<value>Offene Umschläge</value> <value>Offene Umschläge</value>
@@ -846,7 +846,7 @@
<value>0</value> <value>0</value>
</data> </data>
<data name="XtraTabControlMain.Size" type="System.Drawing.Size, System.Drawing"> <data name="XtraTabControlMain.Size" type="System.Drawing.Size, System.Drawing">
<value>1090, 484</value> <value>1090, 490</value>
</data> </data>
<data name="XtraTabControlMain.TabIndex" type="System.Int32, mscorlib"> <data name="XtraTabControlMain.TabIndex" type="System.Int32, mscorlib">
<value>3</value> <value>3</value>
@@ -990,7 +990,7 @@
<value>195</value> <value>195</value>
</data> </data>
<data name="GridCompleted.Size" type="System.Drawing.Size, System.Drawing"> <data name="GridCompleted.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 455</value> <value>1088, 467</value>
</data> </data>
<data name="GridCompleted.TabIndex" type="System.Int32, mscorlib"> <data name="GridCompleted.TabIndex" type="System.Int32, mscorlib">
<value>3</value> <value>3</value>
@@ -1008,7 +1008,7 @@
<value>0</value> <value>0</value>
</data> </data>
<data name="XtraTabPage2.Size" type="System.Drawing.Size, System.Drawing"> <data name="XtraTabPage2.Size" type="System.Drawing.Size, System.Drawing">
<value>1088, 455</value> <value>1088, 467</value>
</data> </data>
<data name="XtraTabPage2.Text" xml:space="preserve"> <data name="XtraTabPage2.Text" xml:space="preserve">
<value>Abgeschlossene Umschläge</value> <value>Abgeschlossene Umschläge</value>
@@ -1068,7 +1068,7 @@
<value>1</value> <value>1</value>
</data> </data>
<data name="SplitContainerControl1.Size" type="System.Drawing.Size, System.Drawing"> <data name="SplitContainerControl1.Size" type="System.Drawing.Size, System.Drawing">
<value>1090, 494</value> <value>1090, 500</value>
</data> </data>
<data name="SplitContainerControl1.TabIndex" type="System.Int32, mscorlib"> <data name="SplitContainerControl1.TabIndex" type="System.Int32, mscorlib">
<value>5</value> <value>5</value>
@@ -1097,6 +1097,9 @@
<metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"> <metadata name="$this.Localizable" type="System.Boolean, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>True</value> <value>True</value>
</metadata> </metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>263</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing"> <data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>6, 13</value> <value>6, 13</value>
</data> </data>
@@ -1105,89 +1108,90 @@
</data> </data>
<data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64"> <data name="frmMain.IconOptions.Image" type="System.Drawing.Bitmap, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value> <value>
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
Bv/c01f/A4y2+8cc2/IPAAAAAElFTkSuQmCC
</value> </value>
</data> </data>
<data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms"> <data name="$this.StartPosition" type="System.Windows.Forms.FormStartPosition, System.Windows.Forms">
<value>CenterScreen</value> <value>CenterScreen</value>
</data> </data>
<data name="$this.Text" xml:space="preserve"> <data name="$this.Text" xml:space="preserve">
<value>Sign Flow</value> <value>signFLOW</value>
</data> </data>
<data name="&gt;&gt;SplashScreenManager1.Name" xml:space="preserve"> <data name="&gt;&gt;SplashScreenManager1.Name" xml:space="preserve">
<value>SplashScreenManager1</value> <value>SplashScreenManager1</value>
@@ -1369,6 +1373,18 @@
<data name="&gt;&gt;bbtnitmEB.Type" xml:space="preserve"> <data name="&gt;&gt;bbtnitmEB.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value> <value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data> </data>
<data name="&gt;&gt;bbtnitmInfoMail.Name" xml:space="preserve">
<value>bbtnitmInfoMail</value>
</data>
<data name="&gt;&gt;bbtnitmInfoMail.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;BarButtonItem2.Name" xml:space="preserve">
<value>BarButtonItem2</value>
</data>
<data name="&gt;&gt;BarButtonItem2.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;RibbonPage1.Name" xml:space="preserve"> <data name="&gt;&gt;RibbonPage1.Name" xml:space="preserve">
<value>RibbonPage1</value> <value>RibbonPage1</value>
</data> </data>
@@ -1501,18 +1517,6 @@
<data name="&gt;&gt;SaveFileDialog1.Type" xml:space="preserve"> <data name="&gt;&gt;SaveFileDialog1.Type" xml:space="preserve">
<value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value> <value>System.Windows.Forms.SaveFileDialog, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data> </data>
<data name="&gt;&gt;bbtnitmInfoMail.Name" xml:space="preserve">
<value>bbtnitmInfoMail</value>
</data>
<data name="&gt;&gt;bbtnitmInfoMail.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;BarButtonItem2.Name" xml:space="preserve">
<value>BarButtonItem2</value>
</data>
<data name="&gt;&gt;BarButtonItem2.Type" xml:space="preserve">
<value>DevExpress.XtraBars.BarButtonItem, DevExpress.XtraBars.v21.2, Version=21.2.4.0, Culture=neutral, PublicKeyToken=b88d1754d700e49a</value>
</data>
<data name="&gt;&gt;$this.Name" xml:space="preserve"> <data name="&gt;&gt;$this.Name" xml:space="preserve">
<value>frmMain</value> <value>frmMain</value>
</data> </data>

View File

@@ -11,6 +11,7 @@ Imports DigitalData.Modules.Logging
Imports EnvelopeGenerator.Common Imports EnvelopeGenerator.Common
Imports EnvelopeGenerator.Common.My Imports EnvelopeGenerator.Common.My
Imports System.Diagnostics Imports System.Diagnostics
Imports System.ComponentModel
Public Class frmMain Public Class frmMain
Private ReadOnly LogConfig As LogConfig Private ReadOnly LogConfig As LogConfig
@@ -45,7 +46,7 @@ Public Class frmMain
Controller = New EnvelopeListController(State) Controller = New EnvelopeListController(State)
Try Try
Me.LookAndFeel.UseDefaultLookAndFeel = False Me.LookAndFeel.UseDefaultLookAndFeel = False
LookAndFeel.SetSkinStyle(SkinStyle.Office2019Colorful, SkinSvgPalette.DefaultSkin) LookAndFeel.SetSkinStyle(SkinStyle.Office2019White, SkinSvgPalette.DefaultSkin)
Catch ex As Exception Catch ex As Exception
End Try End Try
@@ -204,6 +205,7 @@ Public Class frmMain
btnShowDocument.Enabled = True btnShowDocument.Enabled = True
bbtnitmEB.Enabled = False bbtnitmEB.Enabled = False
LoadEnvelopeData() LoadEnvelopeData()
txtEnvelopeIdLabel.Caption = "No Envelope selected"
End Select End Select
End Sub End Sub
@@ -228,13 +230,18 @@ Public Class frmMain
End Sub End Sub
Private Sub bbtnitmEB_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmEB.ItemClick Private Sub bbtnitmEB_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles bbtnitmEB.ItemClick
Try Try
If ViewEnvelopes.FocusedRowHandle < 0 Then If IsNothing(ViewEnvelopes.FocusedRowHandle) Then
bsitmInfo.Caption = "No row selected"
Exit Sub Exit Sub
End If End If
bsitmInfo.Caption = ""
Me.Cursor = Cursors.WaitCursor Me.Cursor = Cursors.WaitCursor
Dim oEnvelope As Envelope = ViewCompleted.GetRow(ViewCompleted.FocusedRowHandle) Dim oEnvelope As Envelope = ViewCompleted.GetRow(ViewCompleted.FocusedRowHandle)
GetResRepFileStreamByte(oEnvelope.Id) GetResRepFileStreamByte(oEnvelope.Id)
Dim oTempFolder = TempFiles.TempPath Dim oTempFolder = TempFiles.TempPath
If Not Directory.Exists(oTempFolder) Then
Directory.CreateDirectory(oTempFolder)
End If
Dim oFilename = "ViewEnvResReport" Dim oFilename = "ViewEnvResReport"
Dim oVersion As Integer = 0 Dim oVersion As Integer = 0
Dim oTempFilename = String.Concat(oTempFolder, "\", $"{oFilename}_{oEnvelope.Id}.pdf") Dim oTempFilename = String.Concat(oTempFolder, "\", $"{oFilename}_{oEnvelope.Id}.pdf")
@@ -242,19 +249,6 @@ Public Class frmMain
oVersion += 1 oVersion += 1
oTempFilename = String.Concat(oTempFolder, "\", $"{oFilename}_{oEnvelope.Id}_", oVersion.ToString, ".pdf") oTempFilename = String.Concat(oTempFolder, "\", $"{oFilename}_{oEnvelope.Id}_", oVersion.ToString, ".pdf")
Loop Loop
'If File.Exists(oTempFilename) Then
' oVersion += 1
' oTempFilename = String.Concat(oTempFolder, "\", $"ViewEnvResReport_{oEnvelope.Id}_", oVersion.ToString, ".pdf")
' Try
' File.OpenWrite(oTempFilename)
' Catch ex As Exception
' MsgBox("File might already be open?", MsgBoxStyle.Exclamation)
' Exit Sub
' End Try
' File.Delete(oTempFilename)
'End If
downloadResFile(oTempFilename) downloadResFile(oTempFilename)
Catch ex As Exception Catch ex As Exception
@@ -408,10 +402,12 @@ Public Class frmMain
If Not fileData Is Nothing Then If Not fileData Is Nothing Then
myResFileData = fileData myResFileData = fileData
Else Else
bsitmInfo.Caption = "FileStream 1 is nothing - check data!"
myResFileData = Nothing myResFileData = Nothing
End If End If
Else Else
myResFileData = Nothing myResFileData = Nothing
bsitmInfo.Caption = "FileStream 2 is nothing - check data!"
End If End If
@@ -443,6 +439,7 @@ Public Class frmMain
Private Sub downloadResFile(ByVal sFileName As String) Private Sub downloadResFile(ByVal sFileName As String)
Try Try
If Not myResFileData Is Nothing Then If Not myResFileData Is Nothing Then
Logger.Debug("working myResFileData in downloadResFile")
'Read image data into a file stream 'Read image data into a file stream
Using fs As New FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Write) Using fs As New FileStream(sFileName, FileMode.OpenOrCreate, FileAccess.Write)
fs.Write(myResFileData, 0, myResFileData.Length) fs.Write(myResFileData, 0, myResFileData.Length)
@@ -450,6 +447,7 @@ Public Class frmMain
fs.Flush() fs.Flush()
fs.Close() fs.Close()
End Using End Using
Logger.Debug($"Trying to open {sFileName}...")
'Open File 'Open File
Process.Start(sFileName) Process.Start(sFileName)
Else Else
@@ -548,6 +546,40 @@ Public Class frmMain
End Sub End Sub
Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick Private Sub BarButtonItem2_ItemClick(sender As Object, e As DevExpress.XtraBars.ItemClickEventArgs) Handles BarButtonItem2.ItemClick
Dim oView As GridView = GridEnvelopes.FocusedView
Dim selReceiver As EnvelopeReceiver
If oView.Name = ViewReceivers.Name Then
selReceiver = oView.GetRow(oView.FocusedRowHandle)
Else
MsgBox(Resources.Envelope.Please_select_a_recipient_from_the_Recipients_tab, MsgBoxStyle.Information, Text)
End If
If ViewEnvelopes.FocusedRowHandle < 0 Or IsNothing(selReceiver) Then
Exit Sub
End If
Dim oEnvelope As Envelope = ViewEnvelopes.GetRow(ViewEnvelopes.FocusedRowHandle)
Dim oController = New EnvelopeEditorController(State, oEnvelope)
Dim Documents As New BindingList(Of EnvelopeDocument)
Dim Receivers As New BindingList(Of EnvelopeReceiver)
Receivers = New BindingList(Of EnvelopeReceiver)(oController.Envelope.Receivers)
For Each oReceiver As EnvelopeReceiver In Receivers
If oReceiver.Email = selReceiver.Email Then
If oController.ActionService.ResendReceiver(oEnvelope, oReceiver) = True Then
MsgBox(Resources.Envelope.Invitation_successfully_resend, MsgBoxStyle.Information, Text)
End If
End If
Next
End Sub
Private Sub ViewEnvelopes_Click(sender As Object, e As EventArgs) Handles ViewEnvelopes.Click
If ViewEnvelopes.FocusedRowHandle < 0 Then
Exit Sub
End If
Dim oEnvelope As Envelope = ViewEnvelopes.GetRow(ViewEnvelopes.FocusedRowHandle)
txtEnvelopeIdLabel.Caption = String.Format(txtEnvelopeIdLabel.Tag, oEnvelope.Id)
End Sub End Sub
End Class End Class

View File

@@ -1,4 +1,4 @@
import { ApplicationConfig } from '@angular/core'; import { ApplicationConfig, APP_INITIALIZER } from '@angular/core';
import { provideRouter } from '@angular/router'; import { provideRouter } from '@angular/router';
import { routes } from './app.routes'; import { routes } from './app.routes';
import { provideClientHydration } from '@angular/platform-browser'; import { provideClientHydration } from '@angular/platform-browser';
@@ -8,6 +8,7 @@ import { UrlService } from './services/url.service';
import { API_URL } from './tokens/index' import { API_URL } from './tokens/index'
import { HTTP_INTERCEPTORS, provideHttpClient, withFetch } from '@angular/common/http'; import { HTTP_INTERCEPTORS, provideHttpClient, withFetch } from '@angular/common/http';
import { HttpRequestInterceptor } from './http.interceptor'; import { HttpRequestInterceptor } from './http.interceptor';
import { ConfigurationService } from './services/configuration.service';
export const appConfig: ApplicationConfig = { export const appConfig: ApplicationConfig = {
providers: [ providers: [
@@ -29,6 +30,12 @@ export const appConfig: ApplicationConfig = {
provide: HTTP_INTERCEPTORS, provide: HTTP_INTERCEPTORS,
useClass: HttpRequestInterceptor, useClass: HttpRequestInterceptor,
multi: true multi: true
},
{
provide: APP_INITIALIZER,
useFactory: (configService: ConfigurationService) => async () => await configService.ngOnInit(),
deps: [ConfigurationService],
multi: true
} }
] ]
}; };

View File

@@ -1,48 +0,0 @@
<table #table mat-table [dataSource]="data" class="mat-elevation-z8">
@for (colId of displayedColumns; track colId) {
<ng-container matColumnDef="{{colId}}">
<th mat-header-cell *matHeaderCellDef> {{schema[colId].header}} </th>
<td mat-cell *matCellDef="let element"> {{schema[colId].field(element)}} </td>
</ng-container>
}
<ng-container matColumnDef="expand">
<th mat-header-cell *matHeaderCellDef aria-label="row actions">&nbsp;</th>
<td mat-cell *matCellDef="let element">
<button mat-icon-button aria-label="expand row"
(click)="(expandedElement = expandedElement === element ? null : element); $event.stopPropagation()">
@if (expandedElement === element) {
<mat-icon>keyboard_arrow_up</mat-icon>
} @else {
<mat-icon>keyboard_arrow_down</mat-icon>
}
</button>
</td>
</ng-container>
<!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->
<ng-container matColumnDef="expandedDetail">
<td mat-cell *matCellDef="let element" [attr.colspan]="columnsToDisplayWithExpand.length">
<div class="example-element-detail" [@detailExpand]="element == expandedElement ? 'expanded' : 'collapsed'">
<div class="example-element-diagram">
<div class="example-element-position"> {{"element.position"}} </div>
<div class="example-element-symbol"> {{"element.symbol"}} </div>
<div class="example-element-name"> {{"element.name"}} </div>
<div class="example-element-weight"> {{"element.weight"}} </div>
</div>
<div class="example-element-description">
{{"element.description"}}
<span class="example-element-description-attribution"> -- Wikipedia </span>
</div>
</div>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnsToDisplayWithExpand"></tr>
<tr mat-row *matRowDef="let element; columns: columnsToDisplayWithExpand;" class="example-element-row"
[class.example-expanded-row]="expandedElement === element"
(click)="expandedElement = expandedElement === element ? null : element">
</tr>
<!--<tr mat-row *matRowDef="let row; columns: ['expandedDetail']; when: isExpandedRow" class="example-detail-row"></tr>-->
</table>

View File

@@ -1,31 +0,0 @@
.example-element-row td {
border-bottom-width: 0;
}
.example-element-detail {
overflow: hidden;
display: flex;
}
.example-element-diagram {
min-width: 80px;
border: 2px solid black;
padding: 8px;
font-weight: lighter;
margin: 8px 0;
height: 104px;
}
.example-element-symbol {
font-weight: bold;
font-size: 40px;
line-height: normal;
}
.example-element-description {
padding: 16px;
}
.example-element-description-attribution {
opacity: 0.5;
}

View File

@@ -1,74 +0,0 @@
import { Component, Input, ViewChild } from '@angular/core';
import { EnvelopeReceiverService } from '../../services/envelope-receiver.service';
import { MatTable, MatTableModule } from '@angular/material/table';
import { CommonModule } from '@angular/common'
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { animate, state, style, transition, trigger } from '@angular/animations';
@Component({
selector: 'app-envelope-table',
standalone: true,
imports: [MatTableModule, CommonModule, MatTableModule, MatButtonModule, MatIconModule],
templateUrl: './envelope-table.component.html',
animations: [
trigger('detailExpand', [
state('collapsed,void', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
styleUrl: './envelope-table.component.scss'
})
export class EnvelopeTableComponent {
@Input() data: Array<any> = []
@Input() options?: { min_status?: number; max_status?: number; ignore_status?: number[] }
@Input() displayedColumns: string[] = ['title', 'status', 'type', 'privateMessage', 'addedWhen'];
@Input() schema: Record<string, { header: string; field: (element: any) => any; }> = {
'title': {
header: 'Title',
field: (element: any) => element.envelope.title
},
'status': {
header: 'Status',
field: (element: any) => element.envelope.statusName
},
'type': {
header: 'Type',
field: (element: any) => element.envelope.contractType
},
'privateMessage': {
header: 'Private Message',
field: (element: any) => element.privateMessage
},
'addedWhen': {
header: 'Added When',
field: (element: any) => element.addedWhen
},
}
columnsToDisplayWithExpand = [...this.displayedColumns, 'expand'];
expandedElement: any | null;
@ViewChild(MatTable) table!: MatTable<any>;
constructor(private erService: EnvelopeReceiverService) { }
async ngOnInit() {
if (this.data.length === 0)
this.data = await this.erService.getEnvelopeReceiverAsync(this.options);
}
public updateTable() {
this.table.renderRows();
}
isExpandedRow(index: number, row: any): boolean {
return (row?.envelopeId === this.expandedElement?.envelopeId) && (row?.receiverId === this.expandedElement?.receiverId);
}
}

View File

@@ -37,19 +37,19 @@ export class ReceiverInputComponent implements OnInit, OnChanges {
private setupFiltering(): void { private setupFiltering(): void {
this.filteredOptions = this.control.valueChanges.pipe( this.filteredOptions = this.control.valueChanges.pipe(
startWith(''), startWith(''),
map(value => this.filter(value || '', this.options)), map(value => this.filter(value || '', this.options, this.index)),
); );
} }
control = new FormControl(''); control = new FormControl('');
filteredOptions!: Observable<string[]>; filteredOptions!: Observable<string[]>;
@Input() options: string[] = []; @Input() options: string[] = [];
@Input() filter: (value: string, options: string[]) => string[] = value => { @Input() filter: (value: string, options: string[], index?: number) => string[] = value => {
const filterValue = value.toLowerCase(); const filterValue = value.toLowerCase();
return this.options.filter(option => option.toLowerCase().includes(filterValue)); return this.options.filter(option => option.toLowerCase().includes(filterValue));
} }
@Input() index?: number;
public get text(): string { public get text(): string {
return this.control.value || ''; return this.control.value || '';

View File

@@ -1,7 +1,7 @@
<table mat-table [dataSource]="receiverData" class="mat-elevation-z8"> <table mat-table [dataSource]="receiverData" class="mat-elevation-z8">
<ng-container matColumnDef="email"> <ng-container matColumnDef="email">
<th mat-header-cell *matHeaderCellDef> Email </th> <th mat-header-cell *matHeaderCellDef> Email </th>
<td mat-cell *matCellDef="let element"> <td mat-cell *matCellDef="let element; let i = index">
<receiver-input [options]="receiver_mails" [filter]="receiver_filter"></receiver-input> <receiver-input [options]="receiver_mails" [filter]="receiver_filter"></receiver-input>
</td> </td>
</ng-container> </ng-container>

View File

@@ -0,0 +1,59 @@
@if(isFilterable) {
<mat-form-field>
<mat-label>{{filter.label}}</mat-label>
<input matInput (keyup)="applyFilter($event)" [placeholder]="filter.placeholder" #input>
</mat-form-field>
}
<table mat-table [dataSource]="dataSource" multiTemplateDataRows class="mat-elevation-z8" matSort>
@for (column of __columnsToDisplay; track column) {
<ng-container matColumnDef="{{column}}">
@if(isSortable) {
<th mat-header-cell *matHeaderCellDef mat-sort-header> {{schema[column].header}} </th>
}
@else {
<th mat-header-cell *matHeaderCellDef> {{schema[column].header}} </th>
}
<td mat-cell *matCellDef="let element"> {{schema[column].field(element)}} </td>
</ng-container>
}
<!-- Expanded Content Column - The detail row is made up of this one column that spans across all columns -->
@if(isExpandable) {
<ng-container matColumnDef="expand">
<th mat-header-cell *matHeaderCellDef aria-label="row actions">&nbsp;</th>
<td mat-cell *matCellDef="let element">
<button mat-icon-button aria-label="expand row" (click)="toggleExpandedRow(element, $event)">
@if (__expandedElement === element) {
<mat-icon>keyboard_arrow_up</mat-icon>
} @else {
<mat-icon>keyboard_arrow_down</mat-icon>
}
</button>
</td>
</ng-container>
<ng-container matColumnDef="expandedDetail">
<td mat-cell *matCellDef="let element" [attr.colspan]="__columnsToDisplayWithExpand.length">
<div class="example-element-detail" [@detailExpand]="element == __expandedElement ? 'expanded' : 'collapsed'">
@if(__expandedElement === element){
<ng-content select="[expanded]" detailed></ng-content>
}
</div>
</td>
</ng-container>
}
@if(isExpandable) {
<tr mat-header-row *matHeaderRowDef="__columnsToDisplayWithExpand"></tr>
<tr mat-row *matRowDef="let element; columns: __columnsToDisplayWithExpand;" class="example-element-row"
[class.example-expanded-row]="__expandedElement === element" (click)="toggleExpandedRow(element, $event)">
</tr>
<tr mat-row *matRowDef="let row; columns: ['expandedDetail']" class="example-detail-row"></tr>
}
@else {
<tr mat-header-row *matHeaderRowDef="__columnsToDisplay"></tr>
<tr mat-row *matRowDef="let row; columns: __columnsToDisplay;"></tr>
}
</table>
@if(paginatorSizeOptions && paginatorSizeOptions.length > 0) {
<mat-paginator [pageSizeOptions]="paginatorSizeOptions" aria-label="Select page of users"></mat-paginator>
}

View File

@@ -0,0 +1,52 @@
table {
width: 100%;
}
tr.example-detail-row {
height: 0;
}
tr.example-element-row:not(.example-expanded-row):hover {
background: whitesmoke;
}
tr.example-element-row:not(.example-expanded-row):active {
background: #efefef;
}
.example-element-row td {
border-bottom-width: 0;
}
.example-element-detail {
overflow: hidden;
display: flex;
}
.example-element-diagram {
min-width: 80px;
border: 2px solid black;
padding: 8px;
font-weight: lighter;
margin: 8px 0;
height: 104px;
}
.example-element-symbol {
font-weight: bold;
font-size: 40px;
line-height: normal;
}
.example-element-description {
padding: 16px;
}
.example-element-description-attribution {
opacity: 0.5;
}
.mat-mdc-form-field {
font-size: 14px;
width: 100%;
}

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { DDTable } from './dd-table.component';
describe('TableExpandableRowsExampleComponent', () => {
let component: DDTable;
let fixture: ComponentFixture<DDTable>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [DDTable]
})
.compileComponents();
fixture = TestBed.createComponent(DDTable);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,103 @@
import { AfterViewInit, Component, Input, ViewChild, inject } from '@angular/core';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button';
import { MatTable, MatTableDataSource, MatTableModule } from '@angular/material/table';
import { ConfigurationService } from '../../../services/configuration.service';
import { MatInputModule } from '@angular/material/input';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatSort, MatSortModule } from '@angular/material/sort';
import { MatPaginator, MatPaginatorModule } from '@angular/material/paginator';
/**
* @title Table with expandable rows
*/
@Component({
selector: 'dd-table',
styleUrl: 'dd-table.component.scss',
templateUrl: 'dd-table.component.html',
animations: [
trigger('detailExpand', [
state('collapsed,void', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
standalone: true,
imports: [
MatTableModule,
MatButtonModule,
MatIconModule,
MatFormFieldModule,
MatInputModule,
MatTableModule,
MatSort,
MatSortModule,
MatPaginator,
MatPaginatorModule
],
})
export class DDTable implements AfterViewInit {
public readonly dataSource: any = new MatTableDataSource();
@Input() public set columnsToDisplay(value: string[]) {
this.__columnsToDisplay = value;
this.__columnsToDisplayWithExpand = [...value, 'expand'];
}
@Input() public set data(value: any[]) {
this.dataSource.data = value;
}
@Input() schema: Record<string, { header: string; field: (element: any) => any; }> = {}
@Input() paginatorSizeOptions?: number[];
@Input() filter: { label: string, placeholder: string } = { label: '', placeholder: '' }
@Input() isFilterable: boolean = false;
@Input() isExpandable: boolean = false;
@Input() isSortable: boolean = false;
@Input() onToggleExpandedRow: (element: any, event: Event) => Promise<void> = async (element: any, event: Event) => { }
public get data(): any[] {
return this.dataSource.data;
}
__columnsToDisplay: string[] = [];
__columnsToDisplayWithExpand: string[] = [];
__expandedElement!: any;
config: ConfigurationService = inject(ConfigurationService);
@ViewChild(MatSort) sort!: MatSort;
@ViewChild(MatPaginator) paginator!: MatPaginator;
@ViewChild(MatTable) table!: MatTable<any>;
ngAfterViewInit(): void {
if (this.isSortable)
this.dataSource.sort = this.sort;
if (this.paginatorSizeOptions && this.paginatorSizeOptions.length > 0)
this.dataSource.paginator = this.paginator;
}
applyFilter(event: Event) {
const filterValue = (event.target as HTMLInputElement).value;
this.dataSource.filter = filterValue.trim().toLowerCase();
}
update() {
this.table.renderRows();
}
async toggleExpandedRow(element: any, event: Event): Promise<void> {
// first determine the new expanded element, thus it would be possible to use up-to-date
const newExpandedElement = this.__expandedElement === element ? null : element;
// before update the expanded element call the call-back method to show up-to-date component
await this.onToggleExpandedRow(newExpandedElement, event);
// assign expanded element
this.__expandedElement = newExpandedElement;
event.stopPropagation();
}
}

View File

@@ -0,0 +1,12 @@
<dd-table [data]="data" [columnsToDisplay]="displayedColumns" [schema]="schema"
[paginatorSizeOptions]="[5, 10, 25, 100]" [filter]="{label: 'Filter', placeholder: ''}"
[onToggleExpandedRow]="onToggleExpandedRow" [isSortable]="true" [isExpandable]="true" [isFilterable]="true">
<mat-tab-group expanded>
<mat-tab label="Emfänger">
<receiver-status-table></receiver-status-table>
</mat-tab>
<mat-tab label="History">
<history-table></history-table>
</mat-tab>
</mat-tab-group>
</dd-table>

View File

@@ -0,0 +1,59 @@
/* Structure */
table {
width: 100%;
}
.mat-mdc-form-field {
font-size: 14px;
width: 100%;
margin-top: 10px;
}
/* For expanding table */
table {
width: 100%;
}
tr.example-detail-row {
height: 0;
}
tr.example-element-row:not(.example-expanded-row):hover {
background: whitesmoke;
}
tr.example-element-row:not(.example-expanded-row):active {
background: #efefef;
}
.example-element-row td {
border-bottom-width: 0;
}
.example-element-detail {
overflow: hidden;
display: flex;
}
.example-element-diagram {
min-width: 80px;
border: 2px solid black;
padding: 8px;
font-weight: lighter;
margin: 8px 0;
height: 104px;
}
.example-element-symbol {
font-weight: bold;
font-size: 40px;
line-height: normal;
}
.example-element-description {
padding: 16px;
}
.example-element-description-attribution {
opacity: 0.5;
}

View File

@@ -0,0 +1,82 @@
import { AfterViewInit, Component, Input, ViewChild, inject, viewChild } from '@angular/core';
import { EnvelopeService } from '../../../services/envelope.service';
import { animate, state, style, transition, trigger } from '@angular/animations';
import { ConfigurationService } from '../../../services/configuration.service';
import { DDTable } from "../dd-table/dd-table.component";
import { ClearableInputComponent } from '../../clearable-input/clearable-input.component'
import { MatTabsModule } from '@angular/material/tabs';
import { ReceiverStatusTableComponent } from "../receiver-status-table/receiver-status-table.component";
import { HistoryTableComponent } from "../history-table/history-table.component";
import { EnvelopeReceiverService } from '../../../services/envelope-receiver.service';
import { HistoryService } from '../../../services/history.service';
@Component({
selector: 'envelope-table',
standalone: true,
imports: [DDTable, ClearableInputComponent, MatTabsModule, ReceiverStatusTableComponent, HistoryTableComponent],
templateUrl: './envelope-table.component.html',
animations: [
trigger('detailExpand', [
state('collapsed,void', style({ height: '0px', minHeight: '0' })),
state('expanded', style({ height: '*' })),
transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),
]),
],
styleUrl: './envelope-table.component.scss'
})
export class EnvelopeTableComponent implements AfterViewInit {
@Input() options?: { min_status?: number; max_status?: number; ignore_status?: number[] }
displayedColumns: string[] = ['title', 'status', 'type', 'addedWhen'];
schema: Record<string, { header: string; field: (element: any) => any; }> = {
'title': {
header: 'Title',
field: (element: any) => element.title
},
'status': {
header: 'Status',
field: (element: any) => element.statusName
},
'type': {
header: 'Type',
field: (element: any) => this.config.envelopeTypeTitles[element.contractType - 1]
},
'addedWhen': {
header: 'Added When',
field: (element: any) => element.addedWhen
}
}
data: any[] = [];
@ViewChild(ReceiverStatusTableComponent) rsTable!: ReceiverStatusTableComponent
@ViewChild(HistoryTableComponent) histTable!: HistoryTableComponent
onToggleExpandedRow: (envelope: any, event: Event) => Promise<void> = async (envelope, event) => {
if (envelope === null || envelope === undefined)
return;
var uuid: string = envelope.uuid;
this.rsTable.data = await this.erService.getSecretAsync(uuid);
var id: number = envelope.id;
var refType: number = this.config.referenceType.receiver;
const histories = await this.histService.getHistoryAsync({ envelopeId: id, referenceType: refType, withReceiver: true })
this.histTable.data = histories;
}
private eService: EnvelopeService = inject(EnvelopeService);
private config: ConfigurationService = inject(ConfigurationService);
private readonly erService: EnvelopeReceiverService = inject(EnvelopeReceiverService);
private readonly histService: HistoryService = inject(HistoryService);
async ngAfterViewInit() {
this.data = await this.eService.getEnvelopeAsync(this.options);
}
}

View File

@@ -0,0 +1 @@
<dd-table [data]="data" [columnsToDisplay]="columnsToDisplay" [schema]="schema" [isSortable]="true"></dd-table>

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { HistoryTableComponent } from './history-table.component';
describe('HistoryTableComponent', () => {
let component: HistoryTableComponent;
let fixture: ComponentFixture<HistoryTableComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [HistoryTableComponent]
})
.compileComponents();
fixture = TestBed.createComponent(HistoryTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,30 @@
import { Component } from '@angular/core';
import { DDTable } from '../dd-table/dd-table.component'
@Component({
selector: 'history-table',
standalone: true,
imports: [DDTable],
templateUrl: './history-table.component.html',
styleUrl: './history-table.component.scss'
})
export class HistoryTableComponent {
data: any[] = [];
schema: Record<string, { header: string; field: (element: any) => any; }> = {
"status": {
"header": "Status",
"field": hist => hist.statusName
},
"user": {
"header": "Benutzer",
"field": hist => hist.userReference
},
"date": {
"header": "Datum",
"field": hist => hist.actionDate
}
}
columnsToDisplay: string[] = ["status", "user", "date"];
}

View File

@@ -0,0 +1 @@
<dd-table [data]="data" [columnsToDisplay]="columnsToDisplay" [schema]="schema" [isSortable]="true"></dd-table>

View File

@@ -0,0 +1,23 @@
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { ReceiverStatusTableComponent } from './receiver-status-table.component';
describe('ReceiverStatusTableComponent', () => {
let component: ReceiverStatusTableComponent;
let fixture: ComponentFixture<ReceiverStatusTableComponent>;
beforeEach(async () => {
await TestBed.configureTestingModule({
imports: [ReceiverStatusTableComponent]
})
.compileComponents();
fixture = TestBed.createComponent(ReceiverStatusTableComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});

View File

@@ -0,0 +1,30 @@
import { Component } from '@angular/core';
import { DDTable } from '../dd-table/dd-table.component'
@Component({
selector: 'receiver-status-table',
standalone: true,
imports: [DDTable],
templateUrl: './receiver-status-table.component.html',
styleUrl: './receiver-status-table.component.scss'
})
export class ReceiverStatusTableComponent {
data: any[] = [];
schema: Record<string, { header: string; field: (element: any) => any; }> = {
"name": {
"header": "Email Anrede",
"field": (er) => er.name
},
"email": {
"header": "Email",
"field": (er) => er.receiver.emailAddress
},
"access_code": {
"header": "Email",
"field": (er) => er.accessCode
},
}
columnsToDisplay: string[] = ["name", "email", "access_code"];
}

View File

@@ -0,0 +1,23 @@
<table mat-table [dataSource]="receiverData" class="mat-elevation-z8">
<ng-container matColumnDef="email">
<th mat-header-cell *matHeaderCellDef> Email </th>
<td mat-cell *matCellDef="let element; let i = index">
<receiver-input [options]="receiver_mails" [filter]="receiver_filter" [index]="i"></receiver-input>
</td>
</ng-container>
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Anrede Email </th>
<td mat-cell *matCellDef="let element">
<clearable-input [label]="'Anrede Email'" [value]="element.name"></clearable-input>
</td>
</ng-container>
<ng-container matColumnDef="accessCode">
<th mat-header-cell *matHeaderCellDef> Zugriffscode </th>
<td mat-cell *matCellDef="let element"> {{element.accessCode}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
</table>

View File

@@ -1,15 +1,15 @@
import { Component, OnInit, QueryList, ViewChild, ViewChildren } from '@angular/core'; import { Component, OnInit, QueryList, ViewChildren } from '@angular/core';
import { FormsModule, ReactiveFormsModule, FormControl } from '@angular/forms'; import { FormsModule, ReactiveFormsModule } from '@angular/forms';
import { MatInputModule } from '@angular/material/input'; import { MatInputModule } from '@angular/material/input';
import { MatTableModule } from '@angular/material/table'; import { MatTableModule } from '@angular/material/table';
import { AsyncPipe } from '@angular/common'; import { AsyncPipe } from '@angular/common';
import { MatAutocompleteModule } from '@angular/material/autocomplete'; import { MatAutocompleteModule } from '@angular/material/autocomplete';
import { MatFormFieldModule } from '@angular/material/form-field'; import { MatFormFieldModule } from '@angular/material/form-field';
import { ReceiverService } from '../../services/receiver.service' import { ReceiverService } from '../../../services/receiver.service'
import { ReceiverInputComponent } from '../receiver-input/receiver-input.component'; import { ReceiverInputComponent } from '../../receiver-input/receiver-input.component';
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { ClearableInputComponent } from '../clearable-input/clearable-input.component' import { ClearableInputComponent } from '../../clearable-input/clearable-input.component'
import { v4 as uuidv4 } from 'uuid'; import { v4 as uuidv4 } from 'uuid';
@Component({ @Component({
@@ -34,24 +34,41 @@ export class ReceiverTableComponent implements OnInit {
constructor(private receiverService: ReceiverService) { } constructor(private receiverService: ReceiverService) { }
async ngOnInit() { async ngOnInit() {
this.receiver_mails = await this.receiverService.getReceiverAsync().then((receivers: any[]) => receivers.map(r => r.emailAddress)); const receivers = await this.receiverService.getReceiverAsync();
this.receiver_mails = receivers.map((r: any) => r.emailAddress);
this.last_used_name = receivers.reduce((acc: any, r: any) => {
acc[r.emailAddress] = r.lastUsedName;
return acc;
}, {} as { [key: string]: string | null });
} }
receiver_filter: (value: string, options: string[]) => string[] = (value, options) => { receiver_filter: (value: string, options: string[], index?: number) => string[] = (value, options, index) => {
const filterValue = value.toLowerCase(); const filterValue = value.toLowerCase();
// set the name if it is used before
const name = this.last_used_name[value];
if (name && index != null && index != undefined) {
this.receiverData.at(index)!.name = name
}
// !!! do not allow email duplication !!!
var similarMails = this.receiver_mails.filter(m => m.toLocaleLowerCase() === value.toLocaleLowerCase() && m !== value)
if (similarMails.length > 0 && index != undefined) {
this.receiverInputs[index].text = similarMails[0];
}
// if added into last row // if added into last row
if (value.length > 0 && (this.receiverInputs.at(-1)?.lenght ?? 0) > 0) { if (value.length > 0 && (this.receiverInputs.at(-1)?.lenght ?? 0) > 0) {
this.receiverData.at(-1)!.accessCode = generateAccessCode(); this.receiverData.at(-1)!.accessCode = generateAccessCode();
this.receiverData.push({ email: "", name: "", accessCode: "" }); this.receiverData.push({ email: "", name: "", accessCode: "" });
this.update(); this.update();
} }
else if (value.length == 0) { // delete the row with out mail
for (var i = 0; i < this.receiverInputs.length - 1; i++) { else if (value.length === 0 && this.receiverInputs.length - 1 !== index) {
if (this.receiverInputs[i].lenght === 0) { if (this.receiverInputs.length > 1 && this.receiverInputs[index!]?.lenght === 0) {
this.receiverData.splice(i, 1); this.receiverData.splice(index!, 1);
this.update(); this.update();
}
} }
} }
@@ -59,6 +76,7 @@ export class ReceiverTableComponent implements OnInit {
} }
receiver_mails: string[] = []; receiver_mails: string[] = [];
last_used_name: { [key: string]: string | null } = {};
@ViewChildren(ReceiverInputComponent) receiverInputsQueryList!: QueryList<ReceiverInputComponent>; @ViewChildren(ReceiverInputComponent) receiverInputsQueryList!: QueryList<ReceiverInputComponent>;
get receiverInputs(): ReceiverInputComponent[] { get receiverInputs(): ReceiverInputComponent[] {

View File

@@ -5,7 +5,7 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatStepperModule } from '@angular/material/stepper'; import { MatStepperModule } from '@angular/material/stepper';
import { MatButtonModule } from '@angular/material/button'; import { MatButtonModule } from '@angular/material/button';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { ReceiverTableComponent } from "../../components/receiver-table/receiver-table.component"; import { ReceiverTableComponent } from "../../components/tables/receiver-table/receiver-table.component";
import { MatIconModule } from '@angular/material/icon'; import { MatIconModule } from '@angular/material/icon';
@Component({ @Component({

View File

@@ -1,10 +1,10 @@
<div id="table"> <div id="table">
<mat-tab-group> <mat-tab-group>
<mat-tab label="Offene Umschläge"> <mat-tab label="Offene Umschläge">
<app-envelope-table [options]="{max_status: Status.EnvelopePartlySigned}"></app-envelope-table> <envelope-table [options]="{max_status: Status.EnvelopePartlySigned}"></envelope-table>
</mat-tab> </mat-tab>
<mat-tab label="Abgeschlossene Umschläge"> <mat-tab label="Abgeschlossene Umschläge">
<app-envelope-table [options]="{min_status: Status.EnvelopeCompletelySigned, ignore_status: [Status.EnvelopeDeleted]}"></app-envelope-table> <envelope-table [options]="{min_status: Status.EnvelopeCompletelySigned, ignore_status: [Status.EnvelopeDeleted]}"></envelope-table>
</mat-tab> </mat-tab>
</mat-tab-group> </mat-tab-group>
</div> </div>

View File

@@ -1,5 +1,5 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import { EnvelopeTableComponent } from "../../components/envelope-table/envelope-table.component"; import { EnvelopeTableComponent } from "../../components/tables/envelope-table/envelope-table.component";
import { MatTabsModule } from '@angular/material/tabs'; import { MatTabsModule } from '@angular/material/tabs';
import { LocalizationService } from '../../services/localization.service'; import { LocalizationService } from '../../services/localization.service';
import { Status } from '../../enums/envelope-const' import { Status } from '../../enums/envelope-const'

View File

@@ -0,0 +1,16 @@
import { TestBed } from '@angular/core/testing';
import { ConfigurationService } from './configuration.service';
describe('ConfigurationService', () => {
let service: ConfigurationService;
beforeEach(() => {
TestBed.configureTestingModule({});
service = TestBed.inject(ConfigurationService);
});
it('should be created', () => {
expect(service).toBeTruthy();
});
});

View File

@@ -0,0 +1,47 @@
import { Injectable, OnInit, inject } from '@angular/core';
import { HttpClient, HttpParams } from '@angular/common/http';
import { Observable, firstValueFrom } from 'rxjs';
import { API_URL } from '../tokens/index';
@Injectable({
providedIn: 'root'
})
export class ConfigurationService implements OnInit {
protected url: string;
private _envelopeTypes! : any[];
private _envelopeTypeTitles! : any[];
private _referenceType!: any;
constructor(private http: HttpClient) {
const api_url = inject(API_URL);
this.url = `${api_url}`;
}
async ngOnInit(): Promise<void> {
const envelopeTypes$: Observable<any[]> = this.http.get<any[]>(`${this.url}/EnvelopeType`)
envelopeTypes$.subscribe({next: res => {
this._envelopeTypes = res;
this._envelopeTypeTitles = res.map(e => e.title);
}});
this.http.get<any>(`${this.url}/History/reference-type`).subscribe({
next: res => this._referenceType = res
})
}
public get envelopeTypes() {
return this._envelopeTypes;
}
public get envelopeTypeTitles() {
return this._envelopeTypeTitles;
}
public get referenceType() {
return this._referenceType;
}
}

View File

@@ -27,8 +27,18 @@ export class EnvelopeReceiverService {
return this.http.get<any>(this.url, { params }); return this.http.get<any>(this.url, { params });
} }
getEnvelopeReceiverAsync(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Promise<any> { getEnvelopeReceiverAsync(options?: { min_status?: number; max_status?: number; ignore_status?: number[] }): Promise<any> {
return firstValueFrom(this.getEnvelopeReceiver(options)); return firstValueFrom(this.getEnvelopeReceiver(options));
} }
getSecret(uuid: string): Observable<any> {
let params = new HttpParams();
params = params.set('uuid', uuid);
return this.http.get<any>(`${this.url}/secret`, { params });
}
getSecretAsync(uuid: string): Promise<any> {
return firstValueFrom(this.getSecret(uuid));
}
} }

Some files were not shown because too many files have changed in this diff Show More