diff --git a/.gitignore b/.gitignore index a920879bb..7bfea35e2 100644 --- a/.gitignore +++ b/.gitignore @@ -45,3 +45,4 @@ version.properties paligo-styles/style.css* migrations.json +*.iml diff --git a/angular.json b/angular.json index 74f43eddd..e025a6a56 100644 --- a/angular.json +++ b/angular.json @@ -1,4 +1,7 @@ { + "cli": { + "analytics": "d22ff5ae-c863-4253-83e3-0a969e4bb5fe" + }, "version": 1, "projects": { "common-ui": { diff --git a/apps/red-ui/src/app/i18n/language.service.ts b/apps/red-ui/src/app/i18n/language.service.ts index 4f4331ae7..906ac365b 100644 --- a/apps/red-ui/src/app/i18n/language.service.ts +++ b/apps/red-ui/src/app/i18n/language.service.ts @@ -25,6 +25,7 @@ export class LanguageService { } else { defaultLang = 'en'; } + console.log(defaultLang); document.documentElement.lang = defaultLang; this._translateService.setDefaultLang(defaultLang); this._translateService.use(defaultLang).toPromise().then(); diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.html b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.html index a056d7d3c..ea0944da4 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.html +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-dictionary-dialog/add-edit-dictionary-dialog.component.html @@ -7,16 +7,16 @@
{attribute} ersetzt.",
+ "file-attributes": "Dieser Platzhalter wird durch den Wert des Dateiattributs {attribute} ersetzt.",
+ "general": {
+ "date": {
+ "d-m-y": "Dieser Platzhalter wird durch das Erstellungsdatum des Berichts in der üblichen Tag-Monat-Jahr-Notation (TT.MM.JJJJ) ersetzt, zB 15.10.2021.",
+ "m-d-y": "Dieser Platzhalter wird durch das Erstellungsdatum des Berichts im amerikanischen rein numerischen Datumsformat (MM/dd/yyyy) ersetzt, zB 15.10.2021.",
+ "y-m-d": "Dieser Platzhalter wird durch das Erstellungsdatum des Berichts im internationalen ISO 8601-Format (yyyy-MM-dd) ersetzt, zB 2021-10-15."
+ },
+ "dossier": {
+ "name": "Dieser Platzhalter wird durch den Namen des Dossiers ersetzt, in dem die geschwärzten Dateien gespeichert sind."
+ },
+ "file": {
+ "name": "Dieser Platzhalter wird durch den Dateinamen ersetzt."
+ },
+ "redaction": {
+ "excerpt": "Dieser Platzhalter wird durch einen Textausschnitt ersetzt, der die Schwärzung enthält.",
+ "justification": "Dieser Platzhalter wird durch die Begründung der Schwärzung ersetzt. Es ist eine Kombination aus dem Rechtsverweis (justificationParagraph) und dem Begründungstext (justificationReason).",
+ "justification-paragraph": "Dieser Platzhalter wird durch den Rechtshinweis der Begründung der Redaktion ersetzt.",
+ "justification-reason": "Dieser Platzhalter wird durch den Begründungstext der Schwärzung ersetzt.",
+ "page": "Dieser Platzhalter wird durch die Seitenzahl der Redaktion ersetzt.",
+ "paragraph": "Dieser Platzhalter wird durch den Absatz ersetzt, der die Schwärzung enthält."
+ },
+ "time": {
+ "h-m": "Dieser Platzhalter wird durch den Zeitpunkt ersetzt, zu dem der Bericht erstellt wurde."
+ }
+ }
+ },
+ "document-setup-description": "Ein kurzer Text, der erläutert, was Platzhalter sind und wie Sie sie in Ihrer Berichtsvorlage einsetzen können. Es ist bekannt, dass ein Leser vom lesbaren Inhalt einer Seite abgelenkt wird, wenn er sich das Layout ansieht.",
+ "document-setup-heading": "Dokumenten-Konfiguration",
+ "invalid-upload": "Ungültiges Upload-Format ausgewählt! Unterstützt werden Dokumente im .xlsx- und im .docx-Format",
+ "multi-file-report": "(Mehrere Dateien)",
+ "report-documents": "Dokumente für den Bericht",
+ "table-header": {
+ "description": "Beschreibung",
+ "placeholders": "Platzhalter"
+ },
+ "title": "Berichte",
+ "upload-document": "Ein Dokument hochladen"
},
- "reset-filters": "Filter zurücksetzen",
+ "reset-filters": "Zurücksetzen",
"reset-password-dialog": {
"actions": {
- "cancel": "",
- "save": ""
+ "cancel": "Abbrechen",
+ "save": "Speichern"
},
"form": {
- "password": ""
+ "password": "Temporäres Passwort"
},
- "header": ""
+ "header": "Temporäres Passwort für {userName} festlegen"
},
"roles": {
- "inactive": "",
- "manager-admin": "",
- "no-role": "",
- "red-admin": "",
- "red-manager": "",
- "red-user": "",
- "red-user-admin": "",
- "regular": ""
+ "inactive": "Inaktiv",
+ "manager-admin": "Manager & Admin",
+ "no-role": "Keine Rolle definiert",
+ "red-admin": "Anwendungsadministrator",
+ "red-manager": "Manager",
+ "red-user": "Benutzer",
+ "red-user-admin": "Benutzer-Admin",
+ "regular": "Regulär",
+ "INACTIVE": "Inaktiv",
+ "MANAGER_ADMIN": "Manager & Admin",
+ "NO_ROLE": "Keine Rolle definiert",
+ "RED_ADMIN": "Anwendungsadministrator",
+ "RED_MANAGER": "Manager",
+ "RED_USER": "Benutzer",
+ "RED_USER_ADMIN": "Benutzer-Admin",
+ "REGULAR": "Regelmäßig"
},
- "rule-editor": "Regeleditor",
+ "rule-editor": "Regel-Editor",
"rules-screen": {
"error": {
- "generic": "Etwas ist schief gelaufen ... Regelaktualisierung fehlgeschlagen!"
+ "generic": "Es ist ein Fehler aufgetreten ... Die Regeln konnten nicht aktualisiert werden!"
},
- "revert-changes": "Zurückkehren",
+ "revert-changes": "Anmeldedaten speichern",
"save-changes": "Änderungen speichern",
"success": {
- "generic": "Regeln aktualisiert!"
+ "generic": "Die Regeln wurden aktualisiert!"
+ },
+ "action": {
+ "download": "Regeln herunterladen",
+ "upload": "Upload-Regeln"
}
},
"search-screen": {
"cols": {
- "document": "",
- "dossier": "",
- "pages": "",
- "status": ""
+ "document": "Dokument",
+ "dossier": "Dossier",
+ "pages": "Seiten",
+ "status": "Status"
},
"filters": {
- "by-dossier": "",
- "search-placeholder": "Dossier..."
+ "by-dossier": "Nach Dossier filtern",
+ "search-placeholder": "Dossiername..."
},
- "missing": "",
- "must-contain": "",
- "no-data": "",
- "table-header": ""
+ "missing": "Fehlt",
+ "must-contain": "Muss enthalten",
+ "no-data": "Geben Sie einen Suchbegriff in die Suchleiste, um nach Dokumenten oder Inhalten von Dokumenten zu suchen.",
+ "table-header": "{length} {length, plural, one{Suchergebnis} other{Suchergebnisse}}"
},
"search": {
- "entire-platform": "",
- "placeholder": "",
- "this-dossier": ""
+ "entire-platform": "ganze Plattform",
+ "placeholder": "Nach Dokumenten oder Dokumenteninhalt suchen",
+ "this-dossier": "in diesem Dossier",
+ "header-label": "Gesamte Plattform durchsuchen"
},
"smtp-auth-config": {
"actions": {
- "cancel": "Stornieren",
- "save": "Anmeldeinformationen speichern"
+ "cancel": "Abbrechen",
+ "save": "Anmeldedaten speichern"
},
"form": {
"password": "Passwort",
- "username": "Nutzername",
- "username-placeholder": "Login Benutzername"
+ "username": "Benutzername",
+ "username-placeholder": "Login-Benutzername"
},
- "title": "Aktivieren Sie die Authentifizierung"
+ "title": "Authentifizierung aktivieren"
},
"time": {
- "days": "",
- "hours": "",
- "less-than-an-hour": "",
- "no-time-left": ""
- },
- "yesterday": "",
- "exact-date": "",
- "months": {
- "jan": "",
- "feb": "",
- "mar": "",
- "apr": "",
- "may": "",
- "jun": "",
- "jul": "",
- "aug": "",
- "sep": "",
- "oct": "",
- "nov": "",
- "dec": ""
+ "days": "{days} {days, plural, one{Tag} other{Tage}}",
+ "hours": "{hours} {hours, plural, one{Stunde} other{Stunden}}",
+ "less-than-an-hour": "< 1 Stunde",
+ "no-time-left": "Frist für Wiederherstellung verstrichen"
},
"top-bar": {
"navigation-items": {
@@ -1265,58 +1609,59 @@
"dossiers": "Aktives Dossier",
"my-account": {
"children": {
- "admin": "Die Einstellungen",
+ "admin": "Einstellungen",
"downloads": "Meine Downloads",
"language": {
- "de": "Deutsche",
+ "de": "Deutsch",
"en": "Englisch",
"label": "Sprache"
},
- "logout": "Ausloggen",
+ "logout": "Abmelden",
"my-profile": "Mein Profil",
- "trash": ""
+ "trash": "Papierkorb"
}
}
}
},
"trash": {
"action": {
- "delete": "",
- "restore": ""
+ "delete": "Endgültig löschen",
+ "restore": "Wiederherstellen"
},
"bulk": {
- "delete": "",
- "restore": ""
+ "delete": "Ausgewählte Dossiert endgültig löschen",
+ "restore": "Ausgewählte Dossiers wiederherstellen"
},
- "label": "",
+ "label": "Papierkorb",
"no-data": {
- "title": ""
+ "title": "Es wurde noch kein Dossier angelegt."
},
"no-match": {
- "title": ""
+ "title": "Die ausgewählten Filter treffen auf kein Dossier zu."
},
"table-col-names": {
- "deleted-on": "",
- "name": "",
- "owner": "",
- "time-to-restore": ""
+ "deleted-on": "Gelöscht am",
+ "name": "Name",
+ "owner": "Eigentümer",
+ "time-to-restore": "Verbleibende Zeit für Wiederherstellung"
},
"table-header": {
- "title": ""
+ "title": "{length} {length, plural, one{gelöschtes Dossier} other{gelöschte Dossiers}}"
}
},
- "type": "Art",
+ "type": "Typ",
+ "unknown": "Unbekannt",
"upload-status": {
"dialog": {
"actions": {
"cancel": "Upload abbrechen",
- "re-upload": "Wiederholen Sie den Upload"
+ "re-upload": "Upload erneut versuchen"
},
"title": "Datei-Uploads ({len})"
},
"error": {
- "file-size": "Datei zu groß. Das Limit ist {size} MB.",
- "generic": "Datei konnte nicht hochgeladen werden."
+ "file-size": "Datei zu groß. Die maximal zulässige Größe beträgt {size} MB.",
+ "generic": "Fehler beim Hochladen des Dokuments"
}
},
"user-listing": {
@@ -1330,27 +1675,27 @@
"delete-disabled": "Sie können Ihr eigenes Konto nicht löschen."
},
"no-match": {
- "title": "Keine Benutzer stimmen mit Ihren aktuellen Filtern überein."
+ "title": "Die ausgewählten Filter treffen auf keinen Benutzer zu."
},
- "search": "Suche...",
+ "search": "Suche ...",
"table-col-names": {
"active": "Aktiv",
- "email": "Email",
+ "email": "E-Mail-Adresse",
"name": "Name",
"roles": "Rollen"
},
"table-header": {
- "title": "{length} Benutzer"
+ "title": "{length} {length, plural, one{user} other{users}}"
}
},
"user-management": "Benutzerverwaltung",
"user-profile": {
"actions": {
- "change-password": "",
+ "change-password": "Passwort ändern",
"save": "Profil speichern"
},
"form": {
- "email": "Email",
+ "email": "E-Mail",
"first-name": "Vorname",
"last-name": "Nachname"
},
@@ -1361,31 +1706,141 @@
"users": "Benutzer im Arbeitsbereich"
},
"collapse": "Details ausblenden",
- "expand": "Zeige Details",
+ "expand": "Details anzeigen",
"title": "Benutzer"
},
+ "view-mode": {
+ "list": "Liste",
+ "view-as": "Ansicht als:",
+ "workflow": "Arbeitsablauf"
+ },
"watermark": "Wasserzeichen",
"watermark-screen": {
"action": {
- "change-success": "Wasserzeichen aktualisiert!",
- "delete-success": "Wasserzeichen gelöscht.",
- "error": "Wasserzeichen konnte nicht aktualisiert werden",
- "revert": "Zurückkehren",
+ "change-success": "Das Wasserzeichen wurde aktualisiert!",
+ "delete-success": "Das Wasserzeichen wurde gelöscht.",
+ "error": "Fehler beim Aktualisieren des Wasserzeichens",
+ "revert": "Rückgängig machen",
"save": "Änderungen speichern"
},
"form": {
"color": "Farbe",
"font-size": "Schriftgröße",
"font-type": "Schriftart",
- "opacity": "Opazität",
- "orientation": "Orientierung",
+ "opacity": "Deckkraft",
+ "orientation": "Ausrichtung",
"text-placeholder": "Text eingeben"
},
"title": "Wasserzeichen"
},
- "annotation-engines": {
- "dictionary": "",
- "ner": "",
- "rule": ""
- }
+ "yesterday": "Gestern",
+ "app-name": "DDA-R",
+ "APPROVED": "Genehmigt",
+ "assign-approver-owner": {
+ "dialog": {
+ "cancel": "Schließen",
+ "save": "Speichern",
+ "single-user": "Genehmiger",
+ "title": "Genehmiger verwalten"
+ }
+ },
+ "assign-reviewer-owner": {
+ "dialog": {
+ "cancel": "Abbrechen",
+ "save": "Speichern",
+ "single-user": "Reviewer",
+ "title": "Reviewer für Dokument auswählen"
+ }
+ },
+ "change-legal-basis": "Änderung der Rechtsgrundlage ausstehend",
+ "comment": "Kommentar",
+ "dossier-dictionary-dialog": {
+ "cancel": "abbrechen",
+ "save-changes": "Änderungen speichern",
+ "title": "Dossier-Wörterbuch"
+ },
+ "dossier-member-guard": {
+ "access-denied": "Sie haben keinen Zugriff auf diese Seite."
+ },
+ "efsa": "EFSA-Genehmigung",
+ "ERROR": "Neuanalyse erforderlich",
+ "EXCLUDED": "Ausgeschlossen",
+ "finished": "Beendet",
+ "FULLREPROCESS": "Wird analysiert",
+ "group": {
+ "hints": "Hinweis-Wörterbücher",
+ "redactions": "Schwärzungs-Wörterbücher"
+ },
+ "OCR_PROCESSING": "OCR-Analyse",
+ "pending-analysis": "Reanalyse ausstehend",
+ "PROCESSING": "Wird analysiert",
+ "report": {
+ "action": {
+ "efsa": "Mit EFSA-Vorlage herunterladen",
+ "label": "Schwärzungsbericht herunterladen",
+ "syngenta": "Mit Syngenta-Vorlage herunterladen"
+ },
+ "unavailable": "Der Schwärzungsbericht ist erst verfügbar, wenn alle Dateien genehmigt wurden.",
+ "unavailable-single": "Der Schwärzungsbericht ist erst verfügbar, wenn diese Datei genehmigt wurde."
+ },
+ "REPROCESS": "Wird analysiert",
+ "settings": "Einstellungen",
+ "skipped": "Übersprungen",
+ "smtp-config-screen": {
+ "actions": {
+ "save": "Konfiguration speichern",
+ "test-connection": "Test-Verbindung"
+ },
+ "form": {
+ "auth": "Authentifizierung aktivieren",
+ "change-credentials": "Zugangsdaten ändern",
+ "envelope-from": "Ausgangsadresse",
+ "envelope-from-hint": "Infotext zum Feld „Ausgangsadresse“.",
+ "envelope-from-placeholder": "Absender-E-Mail",
+ "from": "Von",
+ "from-display-name": "Name für Absender",
+ "from-display-name-hint": "Infotext zum Namen für den Absender.",
+ "from-display-name-placeholder": "Anzeigename zu Absender-E-Mail-Adresse",
+ "from-placeholder": "E-Mail-Adresse des Absenders",
+ "host": "Host",
+ "host-placeholder": "SMTP-Host",
+ "port": "Port",
+ "reply-to": "Antwortadresse",
+ "reply-to-display-name": "Name zu Antwortadresse",
+ "reply-to-display-name-placeholder": "Anzeigename zur Antwort-E-Mail",
+ "reply-to-placeholder": "E-Mail-Adresse für Antwort",
+ "ssl": "SSL aktivieren",
+ "starttls": "StartTLS aktivieren"
+ },
+ "general": {
+ "form": {
+ "forgot-password": "„Passwort vergessen“-Link auf der Login-Seite anzeigen"
+ },
+ "title": "Allgemeine Einstellungen"
+ },
+ "subtitle": "SMTP (Simple Mail Transfer Protocol) ermöglicht es Ihnen, Ihre E-Mails über die angegebenen Servereinstellungen zu versenden.",
+ "test": {
+ "error": "Die Test-E-Mail konnte nicht gesendet werden! Bitte überprüfen Sie die E-Mail-Adresse.",
+ "success": "Die Test-E-Mail wurde erfolgreich versendet!"
+ },
+ "title": "SMTP-Konto konfigurieren"
+ },
+ "sorting": {
+ "alphabetically": "Alphabetisch",
+ "custom": "Benutzerdefiniert",
+ "number-of-analyses": "Anzahl der Analysen",
+ "number-of-pages": "Anzahl der Seiten",
+ "oldest": "Älteste",
+ "recent": "Neueste"
+ },
+ "stream-download": {
+ "abort": "Es läuft gerade ein Download. Wenn Sie dieses Fenster schließen, wird er abgebrochen.",
+ "error": "Fehler beim Herunterladen der Datei {{filename}}. Bitte versuchen Sie es noch einmal ..."
+ },
+ "submitted": "Gesendet",
+ "suggestion": "Vorschlag für eine Schwärzung",
+ "UNASSIGNED": "Nicht zugewiesen",
+ "UNDER_APPROVAL": "In Genehmigung",
+ "UNDER_REVIEW": "In Review",
+ "UNPROCESSED": "Nicht analysiert"
}
diff --git a/docker/common/nginx/nginx.conf b/docker/common/nginx/nginx.conf
index 178d9e7f0..2e591afd5 100644
--- a/docker/common/nginx/nginx.conf
+++ b/docker/common/nginx/nginx.conf
@@ -1,5 +1,4 @@
server {
-
listen 8080;
proxy_hide_header WWW-Authenticate;
port_in_redirect off;
@@ -7,6 +6,8 @@ server {
root /usr/share/nginx/html;
# SSL stuff for cloudflare proxy-ing - ignores SSL certificate and uses SNI
+ add_header Content-Security-Policy "default-src 'self';";
+
proxy_ssl_verify off;
proxy_read_timeout 1m;
proxy_ssl_server_name on;
diff --git a/docker/red-ui/Dockerfile b/docker/red-ui/Dockerfile
index b099b8d23..9dd0db290 100644
--- a/docker/red-ui/Dockerfile
+++ b/docker/red-ui/Dockerfile
@@ -46,5 +46,7 @@ RUN chmod g+r -R /usr/share/nginx/html
## Change permissions to enable openShift functionality
RUN chmod -R g+rwx /var/cache/nginx /var/run /var/log/nginx /usr/share /etc/nginx
+USER 1001
+
COPY docker/red-ui/docker-entrypoint.sh /
CMD ["/docker-entrypoint.sh"]
diff --git a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts
index b26199467..a93bcec16 100644
--- a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts
+++ b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts
@@ -4,7 +4,7 @@ import { IDictionary } from './dictionary';
export class Dictionary implements IDictionary, IListable {
readonly addToDictionaryAction: boolean;
readonly caseInsensitive: boolean;
- readonly description?: string;
+ readonly description: string;
readonly dossierTemplateId?: string;
entries: List;
readonly hexColor?: string;
@@ -17,7 +17,7 @@ export class Dictionary implements IDictionary, IListable {
constructor(dictionary: IDictionary, readonly virtual = false) {
this.addToDictionaryAction = !!dictionary.addToDictionaryAction;
this.caseInsensitive = !!dictionary.caseInsensitive;
- this.description = dictionary.description;
+ this.description = dictionary.description ?? '';
this.dossierTemplateId = dictionary.dossierTemplateId;
this.entries = dictionary.entries ?? [];
this.hexColor = dictionary.hexColor;
diff --git a/libs/red-domain/src/lib/file-attributes/field.ts b/libs/red-domain/src/lib/file-attributes/field.ts
new file mode 100644
index 000000000..52c1d8a94
--- /dev/null
+++ b/libs/red-domain/src/lib/file-attributes/field.ts
@@ -0,0 +1,11 @@
+import { IListable } from '@iqser/common-ui';
+import { FileAttributeConfigType } from '@red/domain';
+
+export interface IField extends IListable {
+ id: string;
+ csvColumn: string;
+ name: string;
+ type: FileAttributeConfigType;
+ readonly: boolean;
+ primaryAttribute: boolean;
+}
diff --git a/libs/red-domain/src/lib/file-attributes/index.ts b/libs/red-domain/src/lib/file-attributes/index.ts
index ee91c20a8..0380a37e4 100644
--- a/libs/red-domain/src/lib/file-attributes/index.ts
+++ b/libs/red-domain/src/lib/file-attributes/index.ts
@@ -2,3 +2,4 @@ export * from './file-attribute-config';
export * from './file-attribute-config.model';
export * from './file-attributes';
export * from './file-attributes-config';
+export * from './field';
diff --git a/libs/red-domain/src/lib/search/index.ts b/libs/red-domain/src/lib/search/index.ts
index 78ecaf160..536d4fccf 100644
--- a/libs/red-domain/src/lib/search/index.ts
+++ b/libs/red-domain/src/lib/search/index.ts
@@ -2,3 +2,5 @@ export * from './matched-document';
export * from './matched-section';
export * from './search.request';
export * from './search.response';
+export * from './search-list-item';
+export * from './search-input';
diff --git a/libs/red-domain/src/lib/search/search-input.ts b/libs/red-domain/src/lib/search/search-input.ts
new file mode 100644
index 000000000..597b6391f
--- /dev/null
+++ b/libs/red-domain/src/lib/search/search-input.ts
@@ -0,0 +1,6 @@
+import { List } from '@iqser/common-ui';
+
+export interface ISearchInput {
+ readonly query: string;
+ readonly dossierIds?: List;
+}
diff --git a/libs/red-domain/src/lib/search/search-list-item.ts b/libs/red-domain/src/lib/search/search-list-item.ts
new file mode 100644
index 000000000..c1b2b700b
--- /dev/null
+++ b/libs/red-domain/src/lib/search/search-list-item.ts
@@ -0,0 +1,12 @@
+import { IListable, List } from '@iqser/common-ui';
+
+export interface ISearchListItem extends IListable {
+ readonly dossierId: string;
+ readonly filename: string;
+ readonly unmatched: List | null;
+ readonly highlights: Record