From 301ffb92042fd0d0dec46620758469b75941d820 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 24 May 2022 00:10:33 +0300 Subject: [PATCH 01/45] RED-4085: System preferences --- apps/red-ui/src/app/app.module.ts | 2 + .../src/app/modules/admin/admin.module.ts | 2 + .../general-config-form.component.ts | 14 ----- .../general-config-screen.component.html | 3 ++ .../general-config-screen.component.ts | 10 ++-- .../system-preferences-form.component.html | 18 +++++++ .../system-preferences-form.component.scss | 0 .../system-preferences-form.component.ts | 51 +++++++++++++++++++ .../red-ui/src/app/services/config.service.ts | 9 ---- .../services/entity-services/trash.service.ts | 8 +-- .../services/system-preferences.service.ts | 29 +++++++++++ .../system-preferences-translations.ts | 20 ++++++++ .../app/utils/configuration.initializer.ts | 4 +- apps/red-ui/src/assets/i18n/de.json | 13 +++++ apps/red-ui/src/assets/i18n/en.json | 13 +++++ libs/red-domain/src/lib/shared/app-config.ts | 3 -- libs/red-domain/src/lib/shared/index.ts | 1 + .../src/lib/shared/system-preferences.ts | 5 ++ 18 files changed, 170 insertions(+), 35 deletions(-) create mode 100644 apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.html create mode 100644 apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.scss create mode 100644 apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.ts create mode 100644 apps/red-ui/src/app/services/system-preferences.service.ts create mode 100644 apps/red-ui/src/app/translations/system-preferences-translations.ts create mode 100644 libs/red-domain/src/lib/shared/system-preferences.ts diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 07c42e3e1..40bb58e12 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -51,6 +51,7 @@ import { MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/tooltip'; import { LoggerModule, NgxLoggerLevel, TOKEN_LOGGER_CONFIG, TOKEN_LOGGER_RULES_SERVICE } from 'ngx-logger'; import { LoggerRulesService } from '@services/logger-rules.service'; import { ILoggerConfig } from '@red/domain'; +import { SystemPreferencesService } from '@services/system-preferences.service'; export function httpLoaderFactory(httpClient: HttpClient, configService: ConfigService): PruningTranslationLoader { return new PruningTranslationLoader(httpClient, '/assets/i18n/', `.json?version=${configService.values.FRONTEND_APP_VERSION}`); @@ -167,6 +168,7 @@ const components = [AppComponent, AuthErrorComponent, NotificationsComponent, Sp KeycloakService, Title, ConfigService, + SystemPreferencesService, FeaturesService, GeneralSettingsService, LanguageService, diff --git a/apps/red-ui/src/app/modules/admin/admin.module.ts b/apps/red-ui/src/app/modules/admin/admin.module.ts index de6e99167..89a4a2435 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -43,6 +43,7 @@ import { ConfirmDeleteDossierStateDialogComponent } from './dialogs/confirm-dele import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component'; import { CloneDossierTemplateDialogComponent } from './dialogs/clone-dossier-template-dialog/clone-dossier-template-dialog.component'; import { AdminSideNavComponent } from './admin-side-nav/admin-side-nav.component'; +import { SystemPreferencesFormComponent } from './screens/general-config/system-preferences-form/system-preferences-form.component'; const dialogs = [ AddEditDossierTemplateDialogComponent, @@ -84,6 +85,7 @@ const components = [ BaseEntityScreenComponent, GeneralConfigFormComponent, SmtpFormComponent, + SystemPreferencesFormComponent, ...dialogs, ...screens, diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-form/general-config-form.component.ts b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-form/general-config-form.component.ts index 70b032385..10f31632e 100644 --- a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-form/general-config-form.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-form/general-config-form.component.ts @@ -24,20 +24,6 @@ export class GeneralConfigFormComponent extends BaseFormComponent implements OnI this.form = this._getForm(); } - get generalConfigurationChanged(): boolean { - if (!this._initialConfiguration) { - return true; - } - - for (const key of Object.keys(this.form.getRawValue())) { - if (this._initialConfiguration[key] !== this.form.get(key).value) { - return true; - } - } - - return false; - } - async ngOnInit(): Promise { await this._loadData(); } diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.html index af303ea03..e15bc83d6 100644 --- a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.html @@ -24,6 +24,9 @@
+
+ +
diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts index 94b036eca..020d1b125 100644 --- a/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/general-config-screen.component.ts @@ -3,6 +3,7 @@ import { UserService } from '@services/user.service'; import { GeneralConfigFormComponent } from './general-config-form/general-config-form.component'; import { SmtpFormComponent } from './smtp-form/smtp-form.component'; import { BaseFormComponent } from '@iqser/common-ui'; +import { SystemPreferencesFormComponent } from './system-preferences-form/system-preferences-form.component'; @Component({ selector: 'redaction-general-config-screen', @@ -13,6 +14,7 @@ export class GeneralConfigScreenComponent extends BaseFormComponent implements A readonly currentUser = this._userService.currentUser; @ViewChild(GeneralConfigFormComponent) generalConfigFormComponent: GeneralConfigFormComponent; + @ViewChild(SystemPreferencesFormComponent) systemPreferencesFormComponent: SystemPreferencesFormComponent; @ViewChild(SmtpFormComponent) smtpFormComponent: SmtpFormComponent; children: BaseFormComponent[]; @@ -20,10 +22,6 @@ export class GeneralConfigScreenComponent extends BaseFormComponent implements A super(); } - ngAfterViewInit() { - this.children = [this.generalConfigFormComponent, this.smtpFormComponent]; - } - get changed(): boolean { for (const child of this.children) { if (child.changed) { @@ -42,6 +40,10 @@ export class GeneralConfigScreenComponent extends BaseFormComponent implements A return true; } + ngAfterViewInit() { + this.children = [this.generalConfigFormComponent, this.systemPreferencesFormComponent, this.smtpFormComponent]; + } + async save(): Promise { for (const child of this.children) { if (child.changed) { diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.html b/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.html new file mode 100644 index 000000000..892cb080c --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.html @@ -0,0 +1,18 @@ +
+
+
+
+
+
+
+ + +
+
+
+
+ +
+
diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.scss b/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.scss new file mode 100644 index 000000000..e69de29bb diff --git a/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.ts b/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.ts new file mode 100644 index 000000000..4defe8ca9 --- /dev/null +++ b/apps/red-ui/src/app/modules/admin/screens/general-config/system-preferences-form/system-preferences-form.component.ts @@ -0,0 +1,51 @@ +import { Component } from '@angular/core'; +import { FormBuilder, FormGroup, Validators } from '@angular/forms'; +import { SystemPreferences } from '@red/domain'; +import { BaseFormComponent, KeysOf, LoadingService } from '@iqser/common-ui'; +import { firstValueFrom } from 'rxjs'; +import { SystemPreferencesService } from '@services/system-preferences.service'; +import { systemPreferencesTranslations } from '@translations/system-preferences-translations'; + +@Component({ + selector: 'redaction-system-preferences-form', + templateUrl: './system-preferences-form.component.html', + styleUrls: ['./system-preferences-form.component.scss'], +}) +export class SystemPreferencesFormComponent extends BaseFormComponent { + readonly translations = systemPreferencesTranslations; + readonly keys: KeysOf[] = [ + 'softDeleteCleanupTime', + 'downloadCleanupDownloadFilesHours', + 'downloadCleanupNotDownloadFilesHours', + ]; + private _initialConfiguration: SystemPreferences; + + constructor( + private readonly _loadingService: LoadingService, + private readonly _systemPreferencesService: SystemPreferencesService, + private readonly _formBuilder: FormBuilder, + ) { + super(); + this.form = this._getForm(); + this._loadData(); + } + + async save(): Promise { + this._loadingService.start(); + await firstValueFrom(this._systemPreferencesService.update(this.form.getRawValue())); + this._loadData(); + this._loadingService.stop(); + } + + private _getForm(): FormGroup { + const controlsConfig = {}; + this.keys.forEach(key => (controlsConfig[key] = [this._systemPreferencesService.values[key], Validators.required])); + return this._formBuilder.group(controlsConfig); + } + + private _loadData() { + this._initialConfiguration = this._systemPreferencesService.values; + this.form.patchValue(this._initialConfiguration, { emitEvent: false }); + this.initialFormValue = this.form.getRawValue(); + } +} diff --git a/apps/red-ui/src/app/services/config.service.ts b/apps/red-ui/src/app/services/config.service.ts index 3ba92c7bd..ce80e5511 100644 --- a/apps/red-ui/src/app/services/config.service.ts +++ b/apps/red-ui/src/app/services/config.service.ts @@ -28,15 +28,6 @@ export class ConfigService { return this._values; } - loadAppConfig(): Observable { - return this._httpClient.get('/app-config').pipe( - tap(config => { - console.log('[REDACTION] Loaded config: ', config); - this._values = { ...this._values, ...config }; - }), - ); - } - loadLocalConfig(): Observable { return this._httpClient.get('/assets/config/config.json').pipe( tap(config => { diff --git a/apps/red-ui/src/app/services/entity-services/trash.service.ts b/apps/red-ui/src/app/services/entity-services/trash.service.ts index d888d42bf..8fbf43c5f 100644 --- a/apps/red-ui/src/app/services/entity-services/trash.service.ts +++ b/apps/red-ui/src/app/services/entity-services/trash.service.ts @@ -4,13 +4,13 @@ import { Dossier, File, IDossier, IFile, TrashDossier, TrashFile, TrashItem } fr import { catchError, switchMap, take, tap } from 'rxjs/operators'; import { forkJoin, map, Observable, of } from 'rxjs'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { ConfigService } from '../config.service'; import { PermissionsService } from '../permissions.service'; import { ActiveDossiersService } from '../dossiers/active-dossiers.service'; import { UserService } from '../user.service'; import { flatMap } from 'lodash-es'; import { DossierStatsService } from '../dossiers/dossier-stats.service'; import { FilesService } from '../files/files.service'; +import { SystemPreferencesService } from '@services/system-preferences.service'; @Injectable({ providedIn: 'root', @@ -19,7 +19,7 @@ export class TrashService extends EntitiesService { constructor( protected readonly _injector: Injector, private readonly _toaster: Toaster, - private readonly _configService: ConfigService, + private readonly _systemPreferencesService: SystemPreferencesService, private readonly _permissionsService: PermissionsService, private readonly _activeDossiersService: ActiveDossiersService, private readonly _userService: UserService, @@ -64,7 +64,7 @@ export class TrashService extends EntitiesService { dossier => new TrashDossier( dossier, - this._configService.values.softDeleteCleanupTime, + this._systemPreferencesService.values.softDeleteCleanupTime, this._permissionsService.canRestoreDossier(dossier), this._permissionsService.canHardDeleteDossier(dossier), ), @@ -82,7 +82,7 @@ export class TrashService extends EntitiesService { return new TrashFile( file, dossier.dossierTemplateId, - this._configService.values.softDeleteCleanupTime, + this._systemPreferencesService.values.softDeleteCleanupTime, this._permissionsService.canRestoreFile(file, dossier), this._permissionsService.canHardDeleteFile(file, dossier), ); diff --git a/apps/red-ui/src/app/services/system-preferences.service.ts b/apps/red-ui/src/app/services/system-preferences.service.ts new file mode 100644 index 000000000..b48c18ca8 --- /dev/null +++ b/apps/red-ui/src/app/services/system-preferences.service.ts @@ -0,0 +1,29 @@ +import { Injectable, Injector } from '@angular/core'; +import { GenericService } from '@iqser/common-ui'; +import { SystemPreferences } from '@red/domain'; +import { Observable, switchMap } from 'rxjs'; +import { tap } from 'rxjs/operators'; + +@Injectable({ + providedIn: 'root', +}) +export class SystemPreferencesService extends GenericService { + values: SystemPreferences; + + constructor(protected readonly _injector: Injector) { + super(_injector, 'app-config'); + } + + loadPreferences(): Observable { + return this.get().pipe( + tap((config: SystemPreferences) => { + console.log('[REDACTION] Loaded config: ', config); + this.values = config; + }), + ); + } + + update(value: SystemPreferences): Observable { + return this._post(value).pipe(switchMap(() => this.loadPreferences())); + } +} diff --git a/apps/red-ui/src/app/translations/system-preferences-translations.ts b/apps/red-ui/src/app/translations/system-preferences-translations.ts new file mode 100644 index 000000000..d2aaf0f93 --- /dev/null +++ b/apps/red-ui/src/app/translations/system-preferences-translations.ts @@ -0,0 +1,20 @@ +import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { SystemPreferences } from '@red/domain'; +import { KeysOf } from '@iqser/common-ui'; + +export const systemPreferencesTranslations: Record<'label' | 'placeholder', Record, string>> = { + label: { + softDeleteCleanupTime: _('general-config-screen.system-preferences.labels.soft-delete-cleanup-time'), + downloadCleanupDownloadFilesHours: _('general-config-screen.system-preferences.labels.download-cleanup-download-files-hours'), + downloadCleanupNotDownloadFilesHours: _( + 'general-config-screen.system-preferences.labels.download-cleanup-not-download-files-hours', + ), + }, + placeholder: { + softDeleteCleanupTime: _('general-config-screen.system-preferences.placeholders.soft-delete-cleanup-time'), + downloadCleanupDownloadFilesHours: _('general-config-screen.system-preferences.placeholders.download-cleanup-download-files-hours'), + downloadCleanupNotDownloadFilesHours: _( + 'general-config-screen.system-preferences.placeholders.download-cleanup-not-download-files-hours', + ), + }, +} as const; diff --git a/apps/red-ui/src/app/utils/configuration.initializer.ts b/apps/red-ui/src/app/utils/configuration.initializer.ts index c73f33ce9..e60a1cdf6 100644 --- a/apps/red-ui/src/app/utils/configuration.initializer.ts +++ b/apps/red-ui/src/app/utils/configuration.initializer.ts @@ -8,6 +8,7 @@ import { LanguageService } from '@i18n/language.service'; import { UserPreferenceService } from '@services/user-preference.service'; import { UserService } from '@services/user.service'; import { FeaturesService } from '@services/features.service'; +import { SystemPreferencesService } from '@services/system-preferences.service'; function lastDossierTemplateRedirect(baseHref: string, userPreferenceService: UserPreferenceService) { const url = window.location.href.split('/').filter(s => s.length > 0); @@ -22,6 +23,7 @@ export function configurationInitializer( keycloakService: KeycloakService, title: Title, configService: ConfigService, + systemPreferencesService: SystemPreferencesService, featuresService: FeaturesService, generalSettingsService: GeneralSettingsService, languageService: LanguageService, @@ -39,7 +41,7 @@ export function configurationInitializer( switchMap(user => (!user.hasAnyREDRoles ? throwError('Not user has no red roles') : of({}))), mergeMap(() => generalSettingsService.getGeneralConfigurations()), tap(configuration => configService.updateDisplayName(configuration.displayName)), - switchMap(() => configService.loadAppConfig()), + switchMap(() => systemPreferencesService.loadPreferences()), switchMap(() => userPreferenceService.reload()), catchError(e => { console.log('[Redaction] Initialization error:', e); diff --git a/apps/red-ui/src/assets/i18n/de.json b/apps/red-ui/src/assets/i18n/de.json index a067e33ca..b7fe82feb 100644 --- a/apps/red-ui/src/assets/i18n/de.json +++ b/apps/red-ui/src/assets/i18n/de.json @@ -1444,6 +1444,19 @@ "title": "Allgemeine Einstellungen" }, "subtitle": "SMTP (Simple Mail Transfer Protocol) ermöglicht es Ihnen, Ihre E-Mails über die angegebenen Servereinstellungen zu versenden.", + "system-preferences": { + "labels": { + "download-cleanup-download-files-hours": "", + "download-cleanup-not-download-files-hours": "", + "soft-delete-cleanup-time": "" + }, + "placeholders": { + "download-cleanup-download-files-hours": "", + "download-cleanup-not-download-files-hours": "", + "soft-delete-cleanup-time": "" + }, + "title": "" + }, "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!" diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 1895f5b49..d83700599 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1444,6 +1444,19 @@ "title": "General Configurations" }, "subtitle": "SMTP (Simple Mail Transfer Protocol) enables you to send your emails through the specified server settings.", + "system-preferences": { + "labels": { + "download-cleanup-download-files-hours": "Cleanup time for downloaded files (hours)", + "download-cleanup-not-download-files-hours": "Cleanup time for not downloaded files (hours)", + "soft-delete-cleanup-time": "Soft delete cleanup time (hours)" + }, + "placeholders": { + "download-cleanup-download-files-hours": "(hours)", + "download-cleanup-not-download-files-hours": "(hours)", + "soft-delete-cleanup-time": "(hours)" + }, + "title": "System Preferences" + }, "test": { "error": "Test email could not be sent! Please revise the email address.", "success": "Test email was sent successfully!" diff --git a/libs/red-domain/src/lib/shared/app-config.ts b/libs/red-domain/src/lib/shared/app-config.ts index 3c13e3db7..32b81a77d 100644 --- a/libs/red-domain/src/lib/shared/app-config.ts +++ b/libs/red-domain/src/lib/shared/app-config.ts @@ -20,7 +20,4 @@ export interface AppConfig { RECENT_PERIOD_IN_HOURS: number; SELECTION_MODE: string; MANUAL_BASE_URL: string; - softDeleteCleanupTime?: number; - downloadCleanupDownloadFilesHours?: number; - downloadCleanupNotDownloadFilesHours?: number; } diff --git a/libs/red-domain/src/lib/shared/index.ts b/libs/red-domain/src/lib/shared/index.ts index 670578d71..f66679007 100644 --- a/libs/red-domain/src/lib/shared/index.ts +++ b/libs/red-domain/src/lib/shared/index.ts @@ -12,3 +12,4 @@ export * from './logger-config'; export * from './admin-side-nav-types'; export * from './charts'; export * from './app-config'; +export * from './system-preferences'; diff --git a/libs/red-domain/src/lib/shared/system-preferences.ts b/libs/red-domain/src/lib/shared/system-preferences.ts new file mode 100644 index 000000000..a0ff4c902 --- /dev/null +++ b/libs/red-domain/src/lib/shared/system-preferences.ts @@ -0,0 +1,5 @@ +export interface SystemPreferences { + softDeleteCleanupTime: number; + downloadCleanupDownloadFilesHours: number; + downloadCleanupNotDownloadFilesHours: number; +} From 3f49953759a2fb4571e268dd89bcec0e877615ad Mon Sep 17 00:00:00 2001 From: Atlassian Bamboo Date: Mon, 23 May 2022 23:13:09 +0200 Subject: [PATCH 02/45] chore(release) --- package.json | 2 +- paligo-theme.tar.gz | Bin 3296 -> 3296 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index cb06a9e84..909e196e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "redaction", - "version": "3.496.0", + "version": "3.497.0", "private": true, "license": "MIT", "scripts": { diff --git a/paligo-theme.tar.gz b/paligo-theme.tar.gz index 2a4ff7fcfc07811ab7fc929b2b640e03ef317234..00ba9b910943f24dcbd53128ec3240086ebadc2a 100644 GIT binary patch delta 2320 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

a@e0 z7Ufa?<9{eI@=5BHkX1_k1R}@JlsZ>p1cD=efC?epkgg8~r0?*_#7j#K_-VKi$VnxmA5a4gH*Ni z55SAwP=>`@t4?uT+#OC$4rZ9!h>7#1K*5#I-+%8Y9x|js-mc+d_k>Ig9%h0^RobWl z)1W6$GL8&+%6{)OSe08j`1Yxsat~}oxMDQYPK4CczF~@VArCDE$J*+(hQ15eBA$Mi zct_-`mibA4+$G8|@)Mn=m&gbzbq&C5#f4ogA(Vk2@eL(+;u?+GvAvV=FzQ41yK(;B zb$^D`kZ)p+G|sb)YTQ*1cqf6hD|MlL@-6up=M1KsE-S;vg>$2v|B6kMq^JO~rYuPn z;hGGwo4whh9D^D*Uo;B)bGQMWiqaob@kd;LQ1?lqlti}~tr_23A;6{zbE0S7!w^!H zka!jf`~deZ;unTa^um1aFL%V}HGH&3fSu^g<|^SO?;5bs{wCnJz865^VMA zGI0+<5+iq2B~6E~p0q=ir0`GygzB5JLrv|@y`}c|do=d+WdzV$#aT-JM>vbF0{c^B zi39U%l>n4_68ZM6N4))%NVgwcGO0J(=+T$dq_H>dG>t^M(fNzY4!crAu2gUMIeiAKcIvG4vF-8BuqnX^WPg0Eai;K_7-H|ow-*q1EYK?8 z8$XVJJ(>(8S8B{Rm}IkZtDEioPJbqi2IvWAm2({!vH(mZIA)x6K${$_*}-iW*`j?J zp5<$PP`P68^WUU-(D5-{Xi?i|-C8*cP&nBWASa`?6Oeo7b_)JeZj#Jk$CIv$sPJdp z2~oRGUi{EI&AZ((7&G$<#{iut-_sbvdrEMwYfpFMVnFBdYZZ@Rq+=53Nqss7r?( Date: Tue, 24 May 2022 02:18:47 +0300 Subject: [PATCH 03/45] RED-3796: Dashboard logo tooltip & breadcrumb item --- .../app/components/base-screen/base-screen.component.html | 2 +- apps/red-ui/src/app/services/breadcrumbs.service.ts | 8 +++++--- apps/red-ui/src/assets/i18n/de.json | 1 + apps/red-ui/src/assets/i18n/en.json | 1 + 4 files changed, 8 insertions(+), 4 deletions(-) diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.html b/apps/red-ui/src/app/components/base-screen/base-screen.component.html index 2f6675b9e..006247efa 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.html +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.html @@ -7,7 +7,7 @@ -