From 1d9b5b4d69623e82e893f5c6ad15406557e955dd Mon Sep 17 00:00:00 2001 From: Timo Bejan Date: Fri, 31 Mar 2023 12:31:42 +0300 Subject: [PATCH 1/3] RED-6523 - multitenancy --- apps/red-ui/src/app/app-routing.module.ts | 12 ++++++--- apps/red-ui/src/app/app.module.ts | 18 +++++-------- .../base-screen/base-screen.component.html | 4 +++ .../base-screen/base-screen.component.ts | 13 +++++++--- .../src/app/guards/dossier-files-guard.ts | 4 ++- .../guards/dossier-template-exists.guard.ts | 6 +++-- apps/red-ui/src/app/guards/dossiers.guard.ts | 4 ++- .../app/guards/entity-exists-guard.service.ts | 4 ++- .../src/app/guards/watermark-exists.guard.ts | 16 ++++++++++-- .../base-entity-screen.component.ts | 5 ++-- .../watermark-screen.component.ts | 8 +++++- .../dossier-template-actions.component.ts | 12 +++++++-- .../file-preview-screen.component.ts | 4 ++- .../file-actions/file-actions.component.ts | 4 ++- .../edit-dossier-general-info.component.ts | 13 ++++++++-- .../add-dossier-dialog.component.ts | 5 ++-- .../services/file-download.service.ts | 7 +++--- .../dossiers/archived-dossiers.service.ts | 4 ++- .../app/services/router-history.service.ts | 7 ++++-- apps/red-ui/src/app/users/red-role.guard.ts | 15 +++++------ .../app/utils/configuration.initializer.ts | 15 +++++++---- apps/red-ui/src/app/utils/tenant-context.ts | 8 ------ .../src/app/utils/tenant-id-interceptor.ts | 16 ------------ .../utils/tenant-id-response-interceptor.ts | 22 ---------------- apps/red-ui/src/assets/config/config.json | 4 +-- apps/red-ui/src/assets/i18n/redact/de.json | 25 +++++++++++-------- apps/red-ui/src/assets/i18n/redact/en.json | 25 +++++++++++-------- apps/red-ui/src/assets/i18n/scm/de.json | 19 ++++++++++---- apps/red-ui/src/assets/i18n/scm/en.json | 19 ++++++++++---- libs/common-ui | 2 +- 30 files changed, 185 insertions(+), 135 deletions(-) delete mode 100644 apps/red-ui/src/app/utils/tenant-context.ts delete mode 100644 apps/red-ui/src/app/utils/tenant-id-interceptor.ts delete mode 100644 apps/red-ui/src/app/utils/tenant-id-response-interceptor.ts diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index a42c3cb55..b6820fa72 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -6,6 +6,7 @@ import { IqserAuthGuard, IqserPermissionsGuard, IqserRoutes, + TenantResolveComponent, } from '@iqser/common-ui'; import { RedRoleGuard } from '@users/red-role.guard'; import { BaseScreenComponent } from '@components/base-screen/base-screen.component'; @@ -96,11 +97,14 @@ const dossierTemplateIdRoutes: IqserRoutes = [ const routes: IqserRoutes = [ { path: '', - redirectTo: 'main', - pathMatch: 'full', + component: TenantResolveComponent, }, { - path: 'main', + path: ':tenant', + component: TenantResolveComponent, + }, + { + path: ':tenant/main', component: BaseScreenComponent, children: [ { @@ -212,7 +216,7 @@ const routes: IqserRoutes = [ ], }, { - path: 'auth-error', + path: ':tenant/auth-error', component: AuthErrorComponent, canActivate: [IqserAuthGuard], }, diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index 4da89584c..65adfd2ba 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -12,6 +12,7 @@ import { CommonUiModule, EmptyStateComponent, HiddenActionDirective, + IconButtonComponent, InputWithActionComponent, IqserAllowDirective, IqserDenyDirective, @@ -21,6 +22,7 @@ import { IqserPermissionsService, IqserTranslateModule, IqserUsersModule, + KeycloakStatusService, LanguageService, LogoComponent, MAX_RETRIES_ON_SERVER_ERROR, @@ -29,6 +31,7 @@ import { ServerErrorInterceptor, SkeletonComponent, StopPropagationDirective, + TenantsModule, ToastComponent, } from '@iqser/common-ui'; import { ToastrModule } from 'ngx-toastr'; @@ -66,13 +69,11 @@ import { AppConfig, ILoggerConfig } from '@red/domain'; import { SystemPreferencesService } from '@services/system-preferences.service'; import { PdfViewerModule } from './modules/pdf-viewer/pdf-viewer.module'; import { LicenseService } from '@services/license.service'; -import { TenantIdInterceptor } from '@utils/tenant-id-interceptor'; import { UI_CACHES } from '@utils/constants'; import { RedRoleGuard } from '@users/red-role.guard'; import { SkeletonTopBarComponent } from '@components/skeleton/skeleton-top-bar/skeleton-top-bar.component'; import { DossierSkeletonComponent } from '@components/skeleton/dossier-skeleton/dossier-skeleton.component'; import { SkeletonStatsComponent } from '@components/skeleton/skeleton-stats/skeleton-stats.component'; -import { TenantIdResponseInterceptor } from '@utils/tenant-id-response-interceptor'; const screens = [BaseScreenComponent, DownloadsListScreenComponent]; @@ -119,6 +120,7 @@ export const appModuleFactory = (config: AppConfig) => { preventDuplicates: true, resetTimeoutOnDuplicate: true, }), + TenantsModule.forRoot(), IqserTranslateModule.forRoot({ pathPrefix: config.BASE_TRANSLATIONS_DIRECTORY || '/assets/i18n/redact/' }), IqserLoadingModule.forRoot(), ServiceWorkerModule.register('ngsw-worker.js', { enabled: environment.production }), @@ -170,6 +172,7 @@ export const appModuleFactory = (config: AppConfig) => { IqserAllowDirective, IqserDenyDirective, IqserListingModule, + IconButtonComponent, ], providers: [ { @@ -181,22 +184,13 @@ export const appModuleFactory = (config: AppConfig) => { provide: ErrorHandler, useClass: GlobalErrorHandler, }, - { - provide: HTTP_INTERCEPTORS, - multi: true, - useClass: TenantIdInterceptor, - }, - { - provide: HTTP_INTERCEPTORS, - multi: true, - useClass: TenantIdResponseInterceptor, - }, { provide: APP_INITIALIZER, multi: true, useFactory: configurationInitializer, deps: [ BASE_HREF, + KeycloakStatusService, KeycloakService, ConfigService, SystemPreferencesService, 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 f9f73cfb2..f651a33a1 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 @@ -43,6 +43,10 @@ + + diff --git a/apps/red-ui/src/app/components/breadcrumbs/breadcrumbs.component.html b/apps/red-ui/src/app/components/breadcrumbs/breadcrumbs.component.html index 4aac57f95..e43777811 100644 --- a/apps/red-ui/src/app/components/breadcrumbs/breadcrumbs.component.html +++ b/apps/red-ui/src/app/components/breadcrumbs/breadcrumbs.component.html @@ -14,7 +14,7 @@ [id]="first ? 'navigateToActiveDossiers' : ''" [matTooltip]="breadcrumb.options.clamp && (breadcrumb.name$ | async)" [routerLinkActiveOptions]="breadcrumb.options.routerLinkActiveOptions || { exact: false }" - [routerLink]="breadcrumb.options.routerLink" + [routerLink]="breadcrumb.options.routerLink | tenant" class="breadcrumb" routerLinkActive="active" > @@ -30,7 +30,7 @@ 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 881b9ddc6..8ce9a49ac 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -51,6 +51,7 @@ import { IqserUploadFileModule, IqserUsersModule, RoundCheckboxComponent, + TenantPipe, } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { AuditInfoDialogComponent } from './dialogs/audit-info-dialog/audit-info-dialog.component'; @@ -121,6 +122,7 @@ const components = [ DetailsRadioComponent, IqserAllowDirective, IqserDenyDirective, + TenantPipe, ], }) export class AdminModule {} diff --git a/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.html b/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.html index 6e8758ba7..1f613032f 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.html +++ b/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.html @@ -110,7 +110,7 @@ @@ -59,7 +59,7 @@
diff --git a/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts b/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts index 41731fbe6..a80730466 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/admin/shared/components/admin-side-nav/admin-side-nav.component.ts @@ -5,7 +5,7 @@ import { adminSideNavTranslations } from '@translations/admin-side-nav-translati import { ActivatedRoute, RouterLink, RouterLinkActive } from '@angular/router'; import { AdminSideNavType, AdminSideNavTypes, ENTITY_TYPE, User } from '@red/domain'; import { ROLES } from '@users/roles'; -import { getCurrentUser, IqserHelpModeModule, IqserPermissionsService, SideNavComponent } from '@iqser/common-ui'; +import { getCurrentUser, IqserHelpModeModule, IqserPermissionsService, SideNavComponent, TenantPipe } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { NgForOf, NgIf } from '@angular/common'; @@ -21,7 +21,7 @@ interface NavItem { templateUrl: './admin-side-nav.component.html', styleUrls: ['./admin-side-nav.component.scss'], standalone: true, - imports: [TranslateModule, NgIf, IqserHelpModeModule, RouterLink, RouterLinkActive, NgForOf, SideNavComponent], + imports: [TranslateModule, NgIf, IqserHelpModeModule, RouterLink, RouterLinkActive, NgForOf, SideNavComponent, TenantPipe], }) export class AdminSideNavComponent implements OnInit { @Input() type: AdminSideNavType; diff --git a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.html b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.html index 72551498d..73574d744 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.html +++ b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.html @@ -2,25 +2,29 @@ - + {{ dossierTemplate.name }} - + {{ 'admin-side-nav.entities' | translate }} - + {{ activeDictionary.label }} diff --git a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts index 9c0c5a773..62e110ec2 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts +++ b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-breadcrumbs/dossier-template-breadcrumbs.component.ts @@ -8,13 +8,14 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m import { AsyncPipe, NgIf } from '@angular/common'; import { MatIconModule } from '@angular/material/icon'; import { TranslateModule } from '@ngx-translate/core'; +import { TenantPipe } from '@iqser/common-ui'; @Component({ selector: 'redaction-dossier-template-breadcrumbs', templateUrl: './dossier-template-breadcrumbs.component.html', styleUrls: ['./dossier-template-breadcrumbs.component.scss'], standalone: true, - imports: [NgIf, AsyncPipe, RouterLink, MatIconModule, TranslateModule, RouterLinkActive], + imports: [NgIf, AsyncPipe, RouterLink, MatIconModule, TranslateModule, RouterLinkActive, TenantPipe], }) export class DossierTemplateBreadcrumbsComponent { @Input() root = false; diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.html b/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.html index 27720cc5e..d96e0a42d 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.html +++ b/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.html @@ -1,7 +1,7 @@
-
+
{{ file.filename }}
diff --git a/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts b/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts index 8f23b68c9..f5f0111cf 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/dossier-overview.module.ts @@ -13,6 +13,7 @@ import { IqserUsersModule, StatusBarComponent, StopPropagationDirective, + TenantPipe, } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { DossierOverviewScreenComponent } from './screen/dossier-overview-screen.component'; @@ -68,6 +69,7 @@ const routes: IqserRoutes = [ HasScrollbarDirective, DynamicInputComponent, IqserAllowDirective, + TenantPipe, ], }) export class DossierOverviewModule {} diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html index 580ace65a..e123015fb 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.html @@ -36,9 +36,9 @@ @@ -64,7 +64,7 @@
diff --git a/apps/red-ui/src/app/modules/search/search.module.ts b/apps/red-ui/src/app/modules/search/search.module.ts index 160d2a5bb..1a6943185 100644 --- a/apps/red-ui/src/app/modules/search/search.module.ts +++ b/apps/red-ui/src/app/modules/search/search.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { SearchScreenComponent } from './search-screen/search-screen.component'; import { RouterModule } from '@angular/router'; -import { IqserListingModule, IqserUsersModule, StatusBarComponent, StopPropagationDirective } from '@iqser/common-ui'; +import { IqserListingModule, IqserUsersModule, StatusBarComponent, StopPropagationDirective, TenantPipe } from '@iqser/common-ui'; import { SharedModule } from '@shared/shared.module'; import { TranslateModule } from '@ngx-translate/core'; import { SearchItemTemplateComponent } from './search-item-template/search-item-template.component'; @@ -20,6 +20,7 @@ const routes = [{ path: '', component: SearchScreenComponent }]; IqserListingModule, StatusBarComponent, StopPropagationDirective, + TenantPipe, ], }) export class SearchModule {} diff --git a/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.html b/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.html index c328c4ca3..c7d6ebb58 100644 --- a/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.html +++ b/apps/red-ui/src/app/modules/trash/trash-screen/trash-table-item/trash-table-item.component.html @@ -20,7 +20,11 @@
- + {{ fileDossier.dossierName }} diff --git a/apps/red-ui/src/app/modules/trash/trash.module.ts b/apps/red-ui/src/app/modules/trash/trash.module.ts index a86df8312..aa1cfe00e 100644 --- a/apps/red-ui/src/app/modules/trash/trash.module.ts +++ b/apps/red-ui/src/app/modules/trash/trash.module.ts @@ -2,7 +2,7 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { TrashScreenComponent } from './trash-screen/trash-screen.component'; -import { CircleButtonComponent, IqserListingModule, IqserUsersModule } from '@iqser/common-ui'; +import { CircleButtonComponent, IqserListingModule, IqserUsersModule, TenantPipe } from '@iqser/common-ui'; import { TrashTableItemComponent } from './trash-screen/trash-table-item/trash-table-item.component'; import { SharedModule } from '@shared/shared.module'; import { TrashDialogService } from './services/trash-dialog.service'; @@ -20,6 +20,7 @@ const routes = [{ path: '', component: TrashScreenComponent }]; TranslateModule, IqserListingModule, CircleButtonComponent, + TenantPipe, ], providers: [TrashDialogService], }) diff --git a/apps/red-ui/src/app/utils/configuration.initializer.ts b/apps/red-ui/src/app/utils/configuration.initializer.ts index cb1655efc..2472b86cc 100644 --- a/apps/red-ui/src/app/utils/configuration.initializer.ts +++ b/apps/red-ui/src/app/utils/configuration.initializer.ts @@ -33,6 +33,7 @@ export function configurationInitializer( licenseService: LicenseService, permissionsService: IqserPermissionsService, ) { + console.log('BASE HREF: ', baseHref); const setup = keycloakStatusService.keycloakStatus$.pipe( filter(event => event === KeycloakStatus.READY || event === KeycloakStatus.NOT_ACTIVE), map(() => featuresService.loadConfig()), diff --git a/libs/common-ui b/libs/common-ui index 00d55e470..5c24018d1 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 00d55e470f99fb1defa1ae7250af793d6fe70115 +Subproject commit 5c24018d1265f53ec312ce79f03bbc7af14a53f5 From 9171efba6c43a802e05fc3825b9192bcee288aee Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Fri, 31 Mar 2023 13:39:51 +0300 Subject: [PATCH 3/3] RED-6523: update common-ui --- libs/common-ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libs/common-ui b/libs/common-ui index 5c24018d1..86b52a643 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit 5c24018d1265f53ec312ce79f03bbc7af14a53f5 +Subproject commit 86b52a643a1ffa0acd50dd59e90bf16e98999d27