From 269bd94cfe0c8bb8f0613803a7a5829632a301e9 Mon Sep 17 00:00:00 2001 From: Dan Percic Date: Thu, 6 Jul 2023 13:12:40 +0300 Subject: [PATCH] RED-6713: update tenants handling --- apps/red-ui/src/app/app-routing.module.ts | 12 ++--- apps/red-ui/src/app/app.module.ts | 2 +- .../base-screen/base-screen.component.ts | 15 +++--- .../notifications/notifications.component.ts | 2 +- .../tenants-menu/tenants-menu.component.html | 6 +-- .../tenants-menu/tenants-menu.component.ts | 30 ++++++------ .../user-menu/user-menu.component.html | 2 +- .../user-menu/user-menu.component.ts | 6 ++- .../guards/dossier-template-exists.guard.ts | 15 +++++- .../src/app/guards/if-logged-in.guard.ts | 47 +++++++++++++++++++ .../modules/account/account-routing.module.ts | 3 +- .../account-side-nav.component.ts | 3 +- .../notifications-screen.component.ts | 4 +- .../preferences/preferences.component.ts | 3 +- .../app/modules/admin/admin-routing.module.ts | 3 +- .../src/app/modules/admin/admin.module.ts | 2 +- .../base-entity-screen.component.ts | 7 +-- .../user-details/user-details.component.ts | 9 ++-- .../screens/audit/audit-screen.component.ts | 8 ++-- .../default-colors-screen.component.ts | 14 ++---- .../digital-signature-screen.component.ts | 3 +- ...ier-attributes-listing-screen.component.ts | 6 +-- ...dossier-states-listing-screen.component.ts | 14 ++---- ...sier-templates-listing-screen.component.ts | 2 +- .../dossier-templates-listing.module.ts | 2 +- .../entities-listing-screen.component.ts | 4 +- .../dictionary/dictionary-screen.component.ts | 10 ++-- .../entity-info/entity-info.component.ts | 6 +-- ...-attributes-csv-import-dialog.component.ts | 3 +- ...ile-attributes-listing-screen.component.ts | 28 +++++------ .../system-preferences-form.component.ts | 29 +++++++----- .../info/dossier-template-info.module.ts | 3 +- .../dossier-template-info-screen.component.ts | 2 +- .../justifications-screen.component.ts | 6 +-- .../table-item/table-item.component.ts | 5 +- .../license-storage.component.ts | 2 +- .../license-screen.component.ts | 3 +- .../permissions-screen.component.ts | 14 ++---- .../reports-screen.component.ts | 8 ++-- .../rules-screen/rules-screen.component.ts | 17 +++---- .../user-listing-screen.component.ts | 2 +- .../watermark-screen.component.ts | 31 ++++-------- .../screens/watermark/watermark.module.ts | 3 +- .../watermarks-listing-screen.component.ts | 6 +-- .../services/digital-signature.service.ts | 3 +- .../admin-side-nav.component.ts | 3 +- .../dossier-template-actions.component.ts | 10 +--- .../src/app/modules/archive/archive.module.ts | 3 +- .../archive/services/config.service.ts | 3 +- .../dashboard-screen.component.ts | 3 +- .../dossier-details.component.ts | 19 +++----- ...ossier-overview-screen-header.component.ts | 5 +- .../workflow-item/workflow-item.component.ts | 6 +-- .../dossier-overview/config.service.ts | 10 ++-- .../dossier-overview.module.ts | 2 +- .../dossier-overview-screen.component.ts | 7 +-- .../dossier-documents-status.component.ts | 3 +- .../dossiers-listing-details.component.ts | 2 +- .../dossiers-listing/config.service.ts | 11 +---- .../dossiers-listing.module.ts | 2 +- .../dossiers-listing-screen.component.ts | 13 ++--- .../annotation-details.component.ts | 8 ++-- .../annotations-list.component.ts | 9 ++-- .../components/comments/comments.component.ts | 8 ++-- .../document-info/document-info.component.ts | 2 +- .../file-workload/file-workload.component.ts | 46 ++++++++---------- .../page-indicator.component.ts | 6 +-- .../components/pages/pages.component.ts | 10 ++-- .../user-management.component.ts | 25 +++++----- .../view-switch/view-switch.component.ts | 3 +- .../file-preview/file-preview-providers.ts | 4 +- .../file-preview-screen.component.ts | 25 ++++------ .../file-preview/file-preview.module.ts | 4 +- .../services/annotation-actions.service.ts | 6 +-- .../services/annotation-processing.service.ts | 2 +- .../services/annotations-listing.service.ts | 4 +- .../services/commenting.service.ts | 2 +- .../services/file-preview-state.service.ts | 8 ++-- .../services/manual-redaction.service.ts | 3 +- .../pdf-annotation-actions.service.ts | 3 +- .../services/pdf-proxy.service.ts | 20 ++++---- .../file-preview/services/skipped.service.ts | 4 +- .../services/suggestions.service.ts | 2 +- .../modules/file-preview/utils/constants.ts | 2 +- .../services/annotation-draw.service.ts | 2 +- .../services/annotation-manager.service.ts | 7 ++- .../services/document-viewer.service.ts | 14 +++--- .../pdf-viewer/services/pdf-viewer.service.ts | 29 +++++------- .../services/readable-redactions.service.ts | 4 +- .../pdf-viewer/services/tooltips.service.ts | 2 +- .../services/viewer-header.service.ts | 7 +-- .../app/modules/pdf-viewer/utils/constants.ts | 3 +- .../app/modules/pdf-viewer/utils/functions.ts | 2 +- .../search-item-template.component.ts | 2 +- .../search-screen/search-screen.component.ts | 14 ++---- .../src/app/modules/search/search.module.ts | 3 +- .../dossiers-listing-actions.component.ts | 3 +- .../file-actions/file-actions.component.ts | 12 ++--- ...sign-reviewer-approver-dialog.component.ts | 3 +- ...edit-dossier-download-package.component.ts | 5 +- .../edit-dossier-dialog.component.ts | 14 ++---- .../edit-dossier-team.component.ts | 12 ++--- .../services/file-assign.service.ts | 3 +- .../shared-dossiers/shared-dossiers.module.ts | 2 +- .../assign-user-dropdown.component.ts | 4 +- .../dictionary-manager.component.ts | 11 ++--- .../donut-chart/donut-chart.component.ts | 12 +++-- .../dossier-name-column.component.ts | 2 +- .../watermark-selector.component.ts | 7 +-- .../dossiers-type-switch.component.ts | 2 +- .../components/editor/editor.component.ts | 12 ++--- .../expandable-file-actions.component.ts | 3 +- .../file-name-column.component.ts | 4 +- .../team-members/team-members.component.ts | 4 +- .../type-filter/type-filter.component.ts | 12 ++--- .../download-dialog.component.ts | 3 +- .../src/app/modules/shared/pipes/date.pipe.ts | 2 +- .../src/app/modules/shared/shared.module.ts | 2 +- .../trash-screen/trash-screen.component.ts | 10 +--- .../src/app/modules/trash/trash.module.ts | 3 +- .../services/file-download.service.ts | 3 +- .../services/file-upload.service.ts | 14 +++--- .../src/app/services/breadcrumbs.service.ts | 4 +- .../dashboard-stats.service.ts | 6 +-- .../dossier-templates.service.ts | 3 +- .../dossiers/dossier-changes.service.ts | 6 +-- .../app/services/dossiers/dossiers.service.ts | 7 +-- .../entity-permissions.service.ts | 6 +-- .../entity-services/default-colors.service.ts | 3 +- .../entity-services/dictionary.service.ts | 3 +- .../dossier-attributes.service.ts | 3 +- .../entity-services/dossier-states.service.ts | 8 ++-- .../file-attributes.service.ts | 7 +-- .../services/entity-services/trash.service.ts | 3 +- .../entity-services/watermark.service.ts | 5 +- .../services/files/file-management.service.ts | 5 +- .../app/services/files/files-map.service.ts | 3 +- .../src/app/services/files/files.service.ts | 3 +- .../files/redaction-import.service.ts | 3 +- .../services/files/viewed-pages.service.ts | 3 +- .../src/app/services/notifications.service.ts | 8 ++-- .../src/app/services/reanalysis.service.ts | 3 +- .../app/services/report-template.service.ts | 3 +- .../annotation-changes-translations.ts | 2 +- .../system-preferences-translations.ts | 2 +- apps/red-ui/src/app/users/red-role.guard.ts | 10 +++- apps/red-ui/src/app/users/user.service.ts | 4 +- apps/red-ui/src/app/utils/csv-utils.ts | 2 +- apps/red-ui/src/app/utils/filter-utils.ts | 2 +- apps/red-ui/src/app/utils/functions.ts | 2 +- apps/red-ui/src/app/utils/main.resolver.ts | 4 +- libs/common-ui | 2 +- .../src/lib/audit/audit.response.ts | 2 +- .../src/lib/dictionaries/dictionary.model.ts | 3 +- .../src/lib/dictionaries/dictionary.ts | 2 +- .../dashboard-stats.model.ts | 3 +- .../lib/dossier-templates/dashboard-stats.ts | 2 +- .../dossier-template.model.ts | 3 +- .../lib/dossier-templates/dossier-template.ts | 2 +- .../src/lib/dossiers/dossier.model.ts | 3 +- .../src/lib/dossiers/dossier.request.ts | 2 +- libs/red-domain/src/lib/dossiers/dossier.ts | 2 +- .../lib/downloads/download-status.model.ts | 3 +- .../src/lib/downloads/download-status.ts | 2 +- .../lib/downloads/prepare-download.request.ts | 2 +- .../lib/downloads/remove-download.request.ts | 2 +- .../src/lib/files/file-upload-result.ts | 2 +- libs/red-domain/src/lib/files/super-types.ts | 2 +- libs/red-domain/src/lib/files/types.ts | 2 +- .../src/lib/geometry/section-grid.ts | 2 +- .../src/lib/geometry/section-rectangle.ts | 2 +- .../src/lib/pages/page-exclusion.request.ts | 2 +- .../redaction-log/add-redaction.request.ts | 2 +- .../src/lib/redaction-log/change.ts | 2 +- .../red-domain/src/lib/redaction-log/types.ts | 2 +- .../src/lib/search/matched-document.ts | 2 +- .../src/lib/search/matched-section.ts | 2 +- .../red-domain/src/lib/search/search-input.ts | 2 +- .../src/lib/search/search-list-item.ts | 3 +- .../src/lib/search/search.request.ts | 2 +- .../src/lib/search/search.response.ts | 2 +- libs/red-domain/src/lib/shared/app-config.ts | 2 +- libs/red-domain/src/lib/shared/pdf.types.ts | 2 +- .../src/lib/trash/trash-dossier.model.ts | 2 +- libs/red-domain/src/lib/trash/trash.item.ts | 2 +- libs/red-domain/src/lib/users/user.model.ts | 3 +- tsconfig.json | 1 + 187 files changed, 600 insertions(+), 567 deletions(-) create mode 100644 apps/red-ui/src/app/guards/if-logged-in.guard.ts diff --git a/apps/red-ui/src/app/app-routing.module.ts b/apps/red-ui/src/app/app-routing.module.ts index 5eb70338e..16f944ec6 100644 --- a/apps/red-ui/src/app/app-routing.module.ts +++ b/apps/red-ui/src/app/app-routing.module.ts @@ -1,11 +1,8 @@ import { AuthErrorComponent } from '@components/auth-error/auth-error.component'; import { CompositeRouteGuard, - CustomRouteReuseStrategy, DEFAULT_REDIRECT_KEY, - ifLoggedIn, ifNotLoggedIn, - IqserAuthGuard, IqserPermissionsGuard, IqserRoutes, TenantSelectComponent, @@ -27,6 +24,9 @@ import { DossierFilesGuard } from '@guards/dossier-files-guard'; import { WebViewerLoadedGuard } from './modules/pdf-viewer/services/webviewer-loaded.guard'; import { Roles } from '@users/roles'; import { mainResolver } from '@utils/main.resolver'; +import { hasAnyRoleGuard, IqserAuthGuard } from '@iqser/common-ui/lib/users'; +import { CustomRouteReuseStrategy } from '@iqser/common-ui/lib/utils'; +import { ifLoggedIn } from '@guards/if-logged-in.guard'; const dossierTemplateIdRoutes: IqserRoutes = [ { @@ -182,7 +182,7 @@ const mainRoutes: IqserRoutes = [ children: dossierTemplateIdRoutes, canActivate: [CompositeRouteGuard, IqserPermissionsGuard, templateExistsWhenEnteringDossierList()], data: { - routeGuards: [IqserAuthGuard, RedRoleGuard, DossierTemplatesGuard, DashboardGuard], + routeGuards: [IqserAuthGuard, RedRoleGuard], permissions: { allow: [ Roles.any, @@ -220,7 +220,7 @@ const routes: IqserRoutes = [ }, { path: ':tenant/main', - canActivate: [ifLoggedIn], + canActivate: [ifLoggedIn()], component: BaseScreenComponent, resolve: { whateverThisMainRouteNeeds: mainResolver, @@ -230,7 +230,7 @@ const routes: IqserRoutes = [ { path: ':tenant/auth-error', component: AuthErrorComponent, - canActivate: [IqserAuthGuard], + canActivate: [hasAnyRoleGuard()], }, { path: '**', diff --git a/apps/red-ui/src/app/app.module.ts b/apps/red-ui/src/app/app.module.ts index e4d0d0f72..0feb32e33 100644 --- a/apps/red-ui/src/app/app.module.ts +++ b/apps/red-ui/src/app/app.module.ts @@ -21,7 +21,6 @@ import { IqserListingModule, IqserLoadingModule, IqserTranslateModule, - IqserUsersModule, LanguageService, LogoComponent, MAX_RETRIES_ON_SERVER_ERROR, @@ -71,6 +70,7 @@ import { SkeletonStatsComponent } from '@components/skeleton/skeleton-stats/skel import { UserMenuComponent } from '@components/user-menu/user-menu.component'; import { TenantsMenuComponent } from '@components/tenants-menu/tenants-menu.component'; import { MatDividerModule } from '@angular/material/divider'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; export const appModuleFactory = (config: AppConfig) => { @NgModule({ diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts index 3961f1bb6..086985221 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.ts +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.ts @@ -6,13 +6,14 @@ import { Title } from '@angular/platform-browser'; import { TranslateService } from '@ngx-translate/core'; import { SpotlightSearchAction } from '@components/spotlight-search/spotlight-search-action'; import { filter, map, startWith } from 'rxjs/operators'; -import { IqserPermissionsService, List, shareDistinctLast, TenantsService } from '@iqser/common-ui'; +import { IqserPermissionsService, TenantsService } from '@iqser/common-ui'; import { BreadcrumbsService } from '@services/breadcrumbs.service'; import { FeaturesService } from '@services/features.service'; import { ARCHIVE_ROUTE, DOSSIERS_ARCHIVE, DOSSIERS_ROUTE } from '@red/domain'; import { Roles } from '@users/roles'; import { REDDocumentViewer } from '../../modules/pdf-viewer/services/document-viewer.service'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { List, shareDistinctLast } from '@iqser/common-ui/lib/utils'; const isNavigationStart = event => event instanceof NavigationStart; const isSearchScreen: (url: string) => boolean = url => url.includes('/search'); @@ -22,6 +23,12 @@ const isSearchScreen: (url: string) => boolean = url => url.includes('/search'); styleUrls: ['./base-screen.component.scss'], }) export class BaseScreenComponent { + readonly #navigationStart$ = this._router.events.pipe( + filter(isNavigationStart), + map((event: NavigationStart) => event.url), + startWith(this._router.url), + shareDistinctLast(), + ); readonly roles = Roles; readonly documentViewer = inject(REDDocumentViewer); readonly currentUser = this.userService.currentUser; @@ -44,12 +51,6 @@ export class BaseScreenComponent { action: (query): void => this.#search(query, []), }, ]; - readonly #navigationStart$ = this._router.events.pipe( - filter(isNavigationStart), - map((event: NavigationStart) => event.url), - startWith(this._router.url), - shareDistinctLast(), - ); readonly isSearchScreen$ = this.#navigationStart$.pipe(map(isSearchScreen)); constructor( diff --git a/apps/red-ui/src/app/components/notifications/notifications.component.ts b/apps/red-ui/src/app/components/notifications/notifications.component.ts index 5d9a56c96..743dcda00 100644 --- a/apps/red-ui/src/app/components/notifications/notifications.component.ts +++ b/apps/red-ui/src/app/components/notifications/notifications.component.ts @@ -4,7 +4,7 @@ import { NotificationsService } from '@services/notifications.service'; import { Notification } from '@red/domain'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { Observable } from 'rxjs'; -import { isToday, shareLast, trackByFactory } from '@iqser/common-ui'; +import { isToday, shareLast, trackByFactory } from '@iqser/common-ui/lib/utils'; import dayjs, { Dayjs } from 'dayjs'; import { TranslateService } from '@ngx-translate/core'; diff --git a/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.html b/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.html index 66bf2b5f3..96ee8315f 100644 --- a/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.html +++ b/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.html @@ -1,11 +1,11 @@
- +
{{ item.key }}
{{ stored.email }} diff --git a/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.ts b/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.ts index c2cd0fc77..7e2a755d0 100644 --- a/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.ts +++ b/apps/red-ui/src/app/components/tenants-menu/tenants-menu.component.ts @@ -1,8 +1,9 @@ import { Component, inject } from '@angular/core'; -import { BASE_HREF, getConfig, getCurrentUser, IStoredTenant, KeycloakStatusService, TenantsService } from '@iqser/common-ui'; +import { getConfig, getKeycloakOptions, IStoredTenantId, KeycloakStatusService, TenantsService } from '@iqser/common-ui'; import { User } from '@red/domain'; -import { KeyValue } from '@angular/common'; import { KeycloakService } from 'keycloak-angular'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { BASE_HREF } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'app-tenants-menu', @@ -10,48 +11,49 @@ import { KeycloakService } from 'keycloak-angular'; styleUrls: ['./tenants-menu.component.scss'], }) export class TenantsMenuComponent { - readonly tenantsService = inject(TenantsService); - readonly storedTenants: Map; readonly #baseHref = inject(BASE_HREF); readonly #keycloakService = inject(KeycloakService); readonly #keycloakStatusService = inject(KeycloakStatusService); readonly #currentUser = getCurrentUser(); readonly #config = getConfig(); + readonly tenantsService = inject(TenantsService); + readonly storedTenants: { key: string; value: IStoredTenantId[] }[]; constructor() { this.storedTenants = this.#getStoredTenants(); } - trackBy(_index: number, item: KeyValue) { + trackBy(_index: number, item: { key: string; value: IStoredTenantId[] }) { return item.key; } + // TODO: this should be moved to the keycloak status service async selectTenant(tenantId?: string, email?: string) { - let tenantUrl = tenantId ? '/' + tenantId : '/'; - if (email) { - tenantUrl += '?username=' + email; + if (tenantId && tenantId !== this.tenantsService.activeTenantId) { + await this.#keycloakService.init(getKeycloakOptions(this.#baseHref, this.#config, tenantId)); } - if (tenantId === this.tenantsService.activeTenantId) { + if (tenantId) { const url = this.#keycloakService.getKeycloakInstance().createLoginUrl({ - redirectUri: this.#keycloakStatusService.createLoginUrl(), + redirectUri: this.#keycloakStatusService.createLoginUrl(tenantId), idpHint: this.#config.OAUTH_IDP_HINT, loginHint: email ?? undefined, }); return this.#keycloakService.logout(url); } - window.open(window.location.origin + this.#baseHref + tenantUrl, '_blank'); + return this.#keycloakService.logout(window.location.origin + this.#baseHref); } - #getStoredTenants(): Map { + #getStoredTenants() { const storedTenants = this.tenantsService.getStoredTenants(); const otherTenant = storedTenants.filter(t => { - const isCurrentTenant = t.tenant.tenantId === this.tenantsService.activeTenantId; + const isCurrentTenant = t.tenantId === this.tenantsService.activeTenantId; const isCurrentUser = t.email === this.#currentUser.email || t.email === this.#currentUser.username; return !(isCurrentTenant && isCurrentUser); }); - return otherTenant.groupBy(t => t.tenant.displayName); + const grouped = otherTenant.groupBy(t => t.tenantId); + return [...grouped.keys()].sort((a, b) => a.localeCompare(b)).map(key => ({ key, value: grouped.get(key) })); } } diff --git a/apps/red-ui/src/app/components/user-menu/user-menu.component.html b/apps/red-ui/src/app/components/user-menu/user-menu.component.html index 5bdf0637e..e58926fa9 100644 --- a/apps/red-ui/src/app/components/user-menu/user-menu.component.html +++ b/apps/red-ui/src/app/components/user-menu/user-menu.component.html @@ -5,7 +5,7 @@
- + {{ 'top-bar.navigation-items.my-account.children.select-tenant' | translate }} diff --git a/apps/red-ui/src/app/components/user-menu/user-menu.component.ts b/apps/red-ui/src/app/components/user-menu/user-menu.component.ts index 49690a0ce..f42a374f7 100644 --- a/apps/red-ui/src/app/components/user-menu/user-menu.component.ts +++ b/apps/red-ui/src/app/components/user-menu/user-menu.component.ts @@ -1,9 +1,11 @@ import { Component, inject } from '@angular/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { Roles } from '@users/roles'; -import { getCurrentUser, IqserPermissionsService, List, TenantsService } from '@iqser/common-ui'; +import { IqserPermissionsService, TenantsService } from '@iqser/common-ui'; import { User } from '@red/domain'; import { UserService } from '@users/user.service'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { List } from '@iqser/common-ui/lib/utils'; interface MenuItem { readonly id: string; @@ -20,10 +22,10 @@ interface MenuItem { styleUrls: ['./user-menu.component.scss'], }) export class UserMenuComponent { + readonly #permissionsService = inject(IqserPermissionsService); readonly currentUser = getCurrentUser(); readonly tenantsService = inject(TenantsService); readonly userService = inject(UserService); - readonly #permissionsService = inject(IqserPermissionsService); readonly userMenuItems: List = [ { id: 'account', diff --git a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts index ebd2b36f6..8e49a7fc0 100644 --- a/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts +++ b/apps/red-ui/src/app/guards/dossier-template-exists.guard.ts @@ -3,6 +3,9 @@ import { ActivatedRouteSnapshot, CanActivateFn, Router } from '@angular/router'; import { DOSSIER_TEMPLATE_ID } from '@red/domain'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; import { TenantsService } from '@iqser/common-ui'; +import { NGXLogger } from 'ngx-logger'; +import { firstValueFrom } from 'rxjs'; +import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; export function templateExistsWhenEnteringAdmin(): CanActivateFn { return async function (route: ActivatedRouteSnapshot): Promise { @@ -20,10 +23,18 @@ export function templateExistsWhenEnteringAdmin(): CanActivateFn { export function templateExistsWhenEnteringDossierList(): CanActivateFn { return async function (route: ActivatedRouteSnapshot) { const dossierTemplateId: string = route.paramMap.get(DOSSIER_TEMPLATE_ID); + const dashboardStatsService = inject(DashboardStatsService); + const dossierTemplatesService = inject(DossierTemplatesService); + const logger = inject(NGXLogger); + const router = inject(Router); + const tenantsService = inject(TenantsService); - const dossierTemplateStats = inject(DashboardStatsService).find(dossierTemplateId); + await firstValueFrom(dashboardStatsService.loadAll()); + await firstValueFrom(dossierTemplatesService.loadAll()); + const dossierTemplateStats = dashboardStatsService.find(dossierTemplateId); if (!dossierTemplateStats || dossierTemplateStats.isEmpty) { - await inject(Router).navigate([inject(TenantsService).activeTenantId, 'main']); + logger.warn('[ROUTES] Dossier template not found, redirecting to main'); + await router.navigate([tenantsService.activeTenantId, 'main']); return false; } return true; diff --git a/apps/red-ui/src/app/guards/if-logged-in.guard.ts b/apps/red-ui/src/app/guards/if-logged-in.guard.ts new file mode 100644 index 000000000..b7b6707a1 --- /dev/null +++ b/apps/red-ui/src/app/guards/if-logged-in.guard.ts @@ -0,0 +1,47 @@ +import { ActivatedRouteSnapshot, CanActivateFn, Router } from '@angular/router'; +import { inject } from '@angular/core'; +import { NGXLogger } from 'ngx-logger'; +import { keycloakInitializer, KeycloakStatusService, TenantsService } from '@iqser/common-ui'; +import { KeycloakService } from 'keycloak-angular'; +import { UserService } from '@users/user.service'; + +export function ifLoggedIn(): CanActivateFn { + return async (route: ActivatedRouteSnapshot) => { + const logger = inject(NGXLogger); + logger.info('[ROUTES] Check if can activate main'); + + const tenantsService = inject(TenantsService); + const keycloakService = inject(KeycloakService); + const usersService = inject(UserService); + const keycloakStatusService = inject(KeycloakStatusService); + + const keycloakInstance = keycloakService.getKeycloakInstance(); + const tenant = route.paramMap.get('tenant'); + const queryParams = new URLSearchParams(window.location.search); + const username = queryParams.get('username'); + + if (!keycloakInstance) { + if (!tenant) { + logger.error('[ROUTES] No tenant found, something is wrong...'); + return inject(Router).navigate(['/']); + } + + logger.info('[KEYCLOAK] Keycloak init...'); + await keycloakInitializer(tenant); + logger.info('[KEYCLOAK] Keycloak init done!'); + await tenantsService.selectTenant(tenant); + await usersService.initialize(); + } + + const isLoggedIn = await keycloakService.isLoggedIn(); + + if (isLoggedIn) { + logger.info('[ROUTES] Is logged in, continuing'); + return true; + } + + logger.warn('[ROUTES] Redirect to login'); + keycloakStatusService.createLoginUrlAndExecute(username); + return false; + }; +} diff --git a/apps/red-ui/src/app/modules/account/account-routing.module.ts b/apps/red-ui/src/app/modules/account/account-routing.module.ts index 75e216243..086dd3c89 100644 --- a/apps/red-ui/src/app/modules/account/account-routing.module.ts +++ b/apps/red-ui/src/app/modules/account/account-routing.module.ts @@ -1,10 +1,11 @@ import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { CompositeRouteGuard, IqserAuthGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui'; +import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui'; import { RedRoleGuard } from '@users/red-role.guard'; import { BaseAccountScreenComponent } from './base-account-screen/base-account-screen-component'; import { PreferencesComponent } from './screens/preferences/preferences.component'; import { Roles } from '@users/roles'; +import { IqserAuthGuard } from '@iqser/common-ui/lib/users'; const routes: IqserRoutes = [ { path: '', redirectTo: 'user-profile', pathMatch: 'full' }, diff --git a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts index d337c138c..c21b6346c 100644 --- a/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts +++ b/apps/red-ui/src/app/modules/account/account-side-nav/account-side-nav.component.ts @@ -1,8 +1,9 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { getCurrentUser, IqserPermissionsService } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; import { Roles } from '@users/roles'; import { User } from '@red/domain'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; interface NavItem { readonly label: string; diff --git a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts index f80144236..1e3a64e7a 100644 --- a/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts +++ b/apps/red-ui/src/app/modules/account/screens/notifications/notifications-screen/notifications-screen.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { NotificationPreferencesService } from '../../../services/notification-preferences.service'; -import { BaseFormComponent, getCurrentUser, LoadingService, Toaster } from '@iqser/common-ui'; +import { BaseFormComponent, LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { NotificationCategoriesValues, @@ -12,6 +12,7 @@ import { } from '@red/domain'; import { firstValueFrom } from 'rxjs'; import { notificationsSettingsTranslations } from '@translations/notifications-settings-translations'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ templateUrl: './notifications-screen.component.html', @@ -24,6 +25,7 @@ export class NotificationsScreenComponent extends BaseFormComponent implements O readonly notificationGroupsValues = NotificationGroupsValues; readonly translations = notificationsSettingsTranslations; readonly currentUser = getCurrentUser(); + constructor( private readonly _toaster: Toaster, private readonly _formBuilder: UntypedFormBuilder, diff --git a/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts b/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts index 3ecb9c9cf..765aeeeec 100644 --- a/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts +++ b/apps/red-ui/src/app/modules/account/screens/preferences/preferences.component.ts @@ -2,8 +2,9 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component } from '@angular/ import { PreferencesKeys, UserPreferenceService } from '@users/user-preference.service'; import { FormBuilder, FormGroup } from '@angular/forms'; import { ActivatedRoute } from '@angular/router'; -import { AsControl, BaseFormComponent, IqserPermissionsService } from '@iqser/common-ui'; +import { BaseFormComponent, IqserPermissionsService } from '@iqser/common-ui'; import { Roles } from '@users/roles'; +import { AsControl } from '@iqser/common-ui/lib/utils'; interface PreferencesForm { // preferences diff --git a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts index 4abb5739d..0f8631355 100644 --- a/apps/red-ui/src/app/modules/admin/admin-routing.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin-routing.module.ts @@ -1,5 +1,5 @@ import { NgModule } from '@angular/core'; -import { CompositeRouteGuard, IqserAuthGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui'; +import { CompositeRouteGuard, IqserPermissionsGuard, IqserRoutes } from '@iqser/common-ui'; import { RedRoleGuard } from '@users/red-role.guard'; import { EntitiesListingScreenComponent } from './screens/entities-listing/entities-listing-screen.component'; import { PendingChangesGuard } from '@guards/can-deactivate.guard'; @@ -18,6 +18,7 @@ import { entityExistsGuard } from '@guards/entity-exists-guard.service'; import { BaseEntityScreenComponent } from './base-entity-screen/base-entity-screen.component'; import { PermissionsGuard } from '@guards/permissions-guard'; import { Roles } from '@users/roles'; +import { IqserAuthGuard } from '@iqser/common-ui/lib/users'; const dossierTemplateIdRoutes: IqserRoutes = [ { 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 8ce9a49ac..e38c6febe 100644 --- a/apps/red-ui/src/app/modules/admin/admin.module.ts +++ b/apps/red-ui/src/app/modules/admin/admin.module.ts @@ -49,13 +49,13 @@ import { IqserHelpModeModule, IqserListingModule, 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'; import { DossierTemplateActionsComponent } from './shared/components/dossier-template-actions/dossier-template-actions.component'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const dialogs = [ AddEditCloneDossierTemplateDialogComponent, diff --git a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts index 75a70446f..4e5b7e28e 100644 --- a/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/base-entity-screen/base-entity-screen.component.ts @@ -4,21 +4,22 @@ import { Router } from '@angular/router'; import { firstValueFrom, Observable } from 'rxjs'; import { AdminDialogService } from '../services/admin-dialog.service'; import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { getParam, LoadingService, TenantsService } from '@iqser/common-ui'; +import { LoadingService, TenantsService } from '@iqser/common-ui'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { map } from 'rxjs/operators'; import { PermissionsService } from '@services/permissions.service'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './base-entity-screen.component.html', changeDetection: ChangeDetectionStrategy.OnPush, }) export class BaseEntityScreenComponent { - readonly disabledItems$: Observable; - readonly canDeleteEntity$: Observable; readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly #entityType = getParam(ENTITY_TYPE); + readonly disabledItems$: Observable; + readonly canDeleteEntity$: Observable; constructor( private readonly _router: Router, diff --git a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts index 8950b2780..7222506d5 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/add-edit-user-dialog/user-details/user-details.component.ts @@ -1,13 +1,14 @@ import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; import { AdminDialogService } from '../../../services/admin-dialog.service'; -import { BaseFormComponent, IProfileUpdateRequest, LoadingService, Toaster } from '@iqser/common-ui'; +import { BaseFormComponent, LoadingService, Toaster } from '@iqser/common-ui'; import { rolesTranslations } from '@translations/roles-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { User } from '@red/domain'; import { UserService } from '@users/user.service'; import { HttpStatusCode } from '@angular/common/http'; import { firstValueFrom } from 'rxjs'; +import { IProfileUpdateRequest } from '@iqser/common-ui/lib/users'; @Component({ selector: 'redaction-user-details', @@ -15,17 +16,15 @@ import { firstValueFrom } from 'rxjs'; styleUrls: ['./user-details.component.scss'], }) export class UserDetailsComponent extends BaseFormComponent implements OnChanges { + /** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */ + private readonly _ROLE_REQUIREMENTS = { RED_MANAGER: 'RED_USER', RED_ADMIN: 'RED_USER_ADMIN' }; @Input() user: User; @Output() readonly toggleResetPassword = new EventEmitter(); @Output() readonly closeDialog = new EventEmitter(); @Output() readonly cancel = new EventEmitter(); - readonly ROLES = ['RED_USER', 'RED_MANAGER', 'RED_USER_ADMIN', 'RED_ADMIN']; readonly translations = rolesTranslations; - /** e.g. a RED_ADMIN is automatically a RED_USER_ADMIN => can't disable RED_USER_ADMIN as long as RED_ADMIN is checked */ - private readonly _ROLE_REQUIREMENTS = { RED_MANAGER: 'RED_USER', RED_ADMIN: 'RED_USER_ADMIN' }; - constructor( private readonly _formBuilder: UntypedFormBuilder, private readonly _toaster: Toaster, diff --git a/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.ts index 37973b4da..14f21dce0 100644 --- a/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/audit/audit-screen.component.ts @@ -3,7 +3,6 @@ import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; import { applyIntervalConstraints } from '@utils/date-inputs-utils'; import { CircleButtonTypes, - getCurrentUser, IqserPermissionsService, ListingComponent, listingProvidersFactory, @@ -19,6 +18,7 @@ import { Dayjs } from 'dayjs'; import { RouterHistoryService } from '@services/router-history.service'; import { Roles } from '@users/roles'; import { AdminDialogService } from '../../services/admin-dialog.service'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; const PAGE_SIZE = 50; @@ -28,6 +28,8 @@ const PAGE_SIZE = 50; providers: listingProvidersFactory(AuditScreenComponent), }) export class AuditScreenComponent extends ListingComponent implements OnInit, OnDestroy { + private _previousFrom: Dayjs; + private _previousTo: Dayjs; readonly circleButtonTypes = CircleButtonTypes; readonly ALL_CATEGORIES = 'allCategories'; readonly ALL_USERS = _('audit-screen.all-users'); @@ -37,11 +39,9 @@ export class AuditScreenComponent extends ListingComponent implements OnI readonly permissionsService = inject(IqserPermissionsService); readonly roles = Roles; readonly currentUser = getCurrentUser(); - categories: string[] = []; userIds: Set; logs: IAuditResponse; - readonly tableColumnConfigs: TableColumnConfig[] = [ { label: _('audit-screen.table-col-names.message') }, { label: _('audit-screen.table-col-names.date') }, @@ -49,8 +49,6 @@ export class AuditScreenComponent extends ListingComponent implements OnI { label: _('audit-screen.table-col-names.category') }, ]; readonly tableHeaderLabel = _('audit-screen.table-header.title'); - private _previousFrom: Dayjs; - private _previousTo: Dayjs; constructor( private readonly _formBuilder: UntypedFormBuilder, diff --git a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts index f111beede..6070e9103 100644 --- a/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/default-colors/default-colors-screen.component.ts @@ -1,21 +1,15 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { DefaultColorTypes, DOSSIER_TEMPLATE_ID, User } from '@red/domain'; import { AdminDialogService } from '../../services/admin-dialog.service'; -import { - CircleButtonTypes, - getCurrentUser, - getParam, - IListable, - ListingComponent, - listingProvidersFactory, - TableColumnConfig, -} from '@iqser/common-ui'; +import { CircleButtonTypes, IListable, ListingComponent, listingProvidersFactory, TableColumnConfig } from '@iqser/common-ui'; import { defaultColorsTranslations } from '@translations/default-colors-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { combineLatest } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { getParam } from '@iqser/common-ui/lib/utils'; interface ListItem extends IListable { readonly key: string; @@ -29,6 +23,7 @@ interface ListItem extends IListable { providers: listingProvidersFactory(DefaultColorsScreenComponent), }) export class DefaultColorsScreenComponent extends ListingComponent { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly circleButtonTypes = CircleButtonTypes; readonly currentUser = getCurrentUser(); readonly roles = Roles; @@ -39,7 +34,6 @@ export class DefaultColorsScreenComponent extends ListingComponent { { label: _('default-colors-screen.table-col-names.color'), class: 'flex-center' }, ]; readonly context$; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); constructor(private readonly _dialogService: AdminDialogService, private readonly _defaultColorsService: DefaultColorsService) { super(); diff --git a/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.ts index 9034f49ee..9f866c301 100644 --- a/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/digital-signature/digital-signature-screen.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, OnInit, ViewChild } from '@angular/core'; -import { getCurrentUser, IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui'; +import { IconButtonTypes, IqserPermissionsService, LoadingService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { RouterHistoryService } from '@services/router-history.service'; import { DigitalSignatureService } from '../../services/digital-signature.service'; @@ -9,6 +9,7 @@ import { PkcsSignatureConfigurationComponent } from '../../dialogs/configure-dig import { KmsSignatureConfigurationComponent } from '../../dialogs/configure-digital-signature-dialog/form/kms-signature-configuration/kms-signature-configuration.component'; import { DigitalSignatureOptions, IKmsDigitalSignatureRequest, IPkcsDigitalSignatureRequest, User } from '@red/domain'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ selector: 'redaction-digital-signature-screen', diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts index 08396011c..6719b81c9 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-attributes-listing/dossier-attributes-listing-screen.component.ts @@ -2,8 +2,6 @@ import { Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { CircleButtonTypes, defaultDialogConfig, - getCurrentUser, - getParam, IconButtonTypes, ListingComponent, listingProvidersFactory, @@ -21,6 +19,8 @@ import { AddEditDossierAttributeDialogComponent, AddEditDossierAttributeDialogData, } from './add-edit-dossier-attribute-dialog/add-edit-dossier-attribute-dialog.component'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './dossier-attributes-listing-screen.component.html', @@ -31,6 +31,7 @@ import { }), }) export class DossierAttributesListingScreenComponent extends ListingComponent implements OnInit { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; readonly currentUser = getCurrentUser(); @@ -42,7 +43,6 @@ export class DossierAttributesListingScreenComponent extends ListingComponent; readonly canEditDossierAttributes = this.permissionsService.canEditGlobalDossierAttributes(); - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); constructor( readonly permissionsService: PermissionsService, diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component.ts index b830e8473..e4f3b1cda 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-states-listing/dossier-states-listing-screen/dossier-states-listing-screen.component.ts @@ -1,13 +1,5 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; -import { - defaultDialogConfig, - getParam, - IconButtonTypes, - ListingComponent, - listingProvidersFactory, - SortingOrders, - TableColumnConfig, -} from '@iqser/common-ui'; +import { defaultDialogConfig, IconButtonTypes, ListingComponent, listingProvidersFactory, TableColumnConfig } from '@iqser/common-ui'; import { type DonutChartConfig, DOSSIER_TEMPLATE_ID, type DossierState } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { firstValueFrom, Observable } from 'rxjs'; @@ -20,6 +12,8 @@ import { AddEditDossierStateDialogComponent, AddEditDossierStateDialogData, } from '../add-edit-dossier-state-dialog/add-edit-dossier-state-dialog.component'; +import { SortingOrders } from '@iqser/common-ui/lib/sorting'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './dossier-states-listing-screen.component.html', @@ -27,6 +21,7 @@ import { providers: listingProvidersFactory(DossierStatesListingScreenComponent), }) export class DossierStatesListingScreenComponent extends ListingComponent implements OnInit, OnDestroy { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly tableHeaderLabel = _('dossier-states-listing.table-header.title'); readonly tableColumnConfigs: TableColumnConfig[] = [ @@ -35,7 +30,6 @@ export class DossierStatesListingScreenComponent extends ListingComponent; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); constructor( private readonly _dialog: MatDialog, diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts index 9ac11e170..1b43f9e0d 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing-screen/dossier-templates-listing-screen.component.ts @@ -4,7 +4,6 @@ import { AdminDialogService } from '../../../services/admin-dialog.service'; import { DossierTemplate, User } from '@red/domain'; import { CircleButtonTypes, - getCurrentUser, IconButtonTypes, IqserPermissionsService, ListingComponent, @@ -17,6 +16,7 @@ import { RouterHistoryService } from '@services/router-history.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ templateUrl: './dossier-templates-listing-screen.component.html', diff --git a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing.module.ts b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing.module.ts index 5334b90e3..b0dc3dc8f 100644 --- a/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing.module.ts +++ b/apps/red-ui/src/app/modules/admin/screens/dossier-templates-listing/dossier-templates-listing.module.ts @@ -12,10 +12,10 @@ import { IqserHelpModeModule, IqserListingModule, IqserRoutes, - IqserUsersModule, } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { DossierTemplateActionsComponent } from '../../shared/components/dossier-template-actions/dossier-template-actions.component'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes: IqserRoutes = [{ path: '', component: DossierTemplatesListingScreenComponent }]; diff --git a/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.ts index ddebcd371..d5c8537a2 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/entities-listing/entities-listing-screen.component.ts @@ -1,7 +1,6 @@ import { Component } from '@angular/core'; import { CircleButtonTypes, - getParam, IconButtonTypes, ListingComponent, listingProvidersFactory, @@ -17,6 +16,7 @@ import { DossierTemplateStatsService } from '@services/entity-services/dossier-t import { tap } from 'rxjs/operators'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { PermissionsService } from '@services/permissions.service'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './entities-listing-screen.component.html', @@ -24,6 +24,7 @@ import { PermissionsService } from '@services/permissions.service'; providers: listingProvidersFactory(EntitiesListingScreenComponent), }) export class EntitiesListingScreenComponent extends ListingComponent { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; readonly tableHeaderLabel = _('entities-listing.table-header.title'); @@ -34,7 +35,6 @@ export class EntitiesListingScreenComponent extends ListingComponent { label: _('entities-listing.table-col-names.dictionary-entries') }, ]; readonly templateStats$: Observable; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); constructor( private readonly _loadingService: LoadingService, diff --git a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts index fc7eda515..c7cbd599b 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/entities/screens/dictionary/dictionary-screen.component.ts @@ -2,12 +2,14 @@ import { ChangeDetectionStrategy, Component, OnInit, ViewChild } from '@angular/ import { ActivatedRoute } from '@angular/router'; import { DictionaryManagerComponent } from '@shared/components/dictionary-manager/dictionary-manager.component'; import { DictionaryService } from '@services/entity-services/dictionary.service'; -import { getCurrentUser, getParam, IqserPermissionsService, List, LoadingService } from '@iqser/common-ui'; +import { IqserPermissionsService, LoadingService } from '@iqser/common-ui'; import { BehaviorSubject } from 'rxjs'; import { DICTIONARY_TO_ENTRY_TYPE_MAP, DICTIONARY_TYPE_KEY_MAP, DictionaryType, DOSSIER_TEMPLATE_ID, ENTITY_TYPE, User } from '@red/domain'; import { PermissionsService } from '@services/permissions.service'; import { Roles } from '@users/roles'; import { NGXLogger } from 'ngx-logger'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { getParam, List } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './dictionary-screen.component.html', @@ -15,15 +17,15 @@ import { NGXLogger } from 'ngx-logger'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class DictionaryScreenComponent implements OnInit { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); + @ViewChild('dictionaryManager', { static: false }) + private readonly _dictionaryManager: DictionaryManagerComponent; readonly currentUser = getCurrentUser(); readonly roles = Roles; readonly initialEntries$ = new BehaviorSubject([]); isLeavingPage = false; readonly type: DictionaryType; readonly entityType = getParam(ENTITY_TYPE); - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); - @ViewChild('dictionaryManager', { static: false }) - private readonly _dictionaryManager: DictionaryManagerComponent; constructor( route: ActivatedRoute, diff --git a/apps/red-ui/src/app/modules/admin/screens/entities/screens/entity-info/entity-info.component.ts b/apps/red-ui/src/app/modules/admin/screens/entities/screens/entity-info/entity-info.component.ts index 8c123a20d..e992f7d9c 100644 --- a/apps/red-ui/src/app/modules/admin/screens/entities/screens/entity-info/entity-info.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/entities/screens/entity-info/entity-info.component.ts @@ -5,9 +5,10 @@ import { ActivatedRoute } from '@angular/router'; import { getCurrentUser } from '@users/user.service'; import { PermissionsService } from '@services/permissions.service'; import { AddEditEntityComponent } from '@shared/components/add-edit-entity/add-edit-entity.component'; -import { IconButtonTypes, IqserEventTarget } from '@iqser/common-ui'; +import { IconButtonTypes } from '@iqser/common-ui'; import { Observable } from 'rxjs'; import { Roles } from '@users/roles'; +import { IqserEventTarget } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-entity-info', @@ -16,14 +17,13 @@ import { Roles } from '@users/roles'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class EntityInfoComponent { + @ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent; readonly currentUser = getCurrentUser(); readonly entity$: Observable; readonly dossierTemplateId: string; readonly roles = Roles; readonly iconButtonTypes = IconButtonTypes; - @ViewChild(AddEditEntityComponent) private readonly _addEditEntityComponent: AddEditEntityComponent; - constructor(route: ActivatedRoute, dictionariesMapService: DictionariesMapService, readonly permissionsService: PermissionsService) { this.dossierTemplateId = route.parent.snapshot.paramMap.get(DOSSIER_TEMPLATE_ID); const entityType = route.parent.snapshot.paramMap.get(ENTITY_TYPE); diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts index 010bdaa8a..19abe8403 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component.ts @@ -4,11 +4,12 @@ import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import * as Papa from 'papaparse'; import { firstValueFrom, Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { IconButtonTypes, ListingComponent, listingProvidersFactory, TableColumnConfig, Toaster, trackByFactory } from '@iqser/common-ui'; +import { IconButtonTypes, ListingComponent, listingProvidersFactory, TableColumnConfig, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FileAttributeConfig, FileAttributeConfigTypes, FileAttributeEncodingTypes, IField, IFileAttributesConfig } from '@red/domain'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { fileAttributeEncodingTypesTranslations } from '@translations/file-attribute-encoding-types-translations'; +import { trackByFactory } from '@iqser/common-ui/lib/utils'; export interface IFileAttributesCSVImportData { readonly csv: File; diff --git a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts index cf2f27b83..32d704f4e 100644 --- a/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/file-attributes-listing/file-attributes-listing-screen.component.ts @@ -3,8 +3,6 @@ import { AdminDialogService } from '../../services/admin-dialog.service'; import { CircleButtonTypes, defaultDialogConfig, - getCurrentUser, - getParam, IconButtonTypes, largeDialogConfig, ListingComponent, @@ -32,6 +30,8 @@ import { IFileAttributesCSVImportData, } from './file-attributes-csv-import-dialog/file-attributes-csv-import-dialog.component'; import { FileAttributesConfigurationsDialogComponent } from './file-attributes-configurations-dialog/file-attributes-configurations-dialog.component'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './file-attributes-listing-screen.component.html', @@ -39,6 +39,10 @@ import { FileAttributesConfigurationsDialogComponent } from './file-attributes-c providers: listingProvidersFactory(FileAttributesListingScreenComponent), }) export class FileAttributesListingScreenComponent extends ListingComponent implements OnInit, OnDestroy { + @ViewChild('impactedTemplates') private readonly _impactedTemplatesRef: TemplateRef; + #existingConfiguration: IFileAttributesConfig; + @ViewChild('fileInput') private _fileInput: ElementRef; + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; readonly currentUser = getCurrentUser(); @@ -59,18 +63,6 @@ export class FileAttributesListingScreenComponent extends ListingComponent; - #existingConfiguration: IFileAttributesConfig; - @ViewChild('fileInput') private _fileInput: ElementRef; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); - - private get _numberOfDisplayedAttrs(): number { - return this.entitiesService.all.filter(attr => attr.displayedInFileList).length; - } - - private get _numberOfFilterableAttrs(): number { - return this.entitiesService.all.filter(attr => attr.filterable).length; - } constructor( readonly permissionsService: PermissionsService, @@ -84,6 +76,14 @@ export class FileAttributesListingScreenComponent extends ListingComponent attr.displayedInFileList).length; + } + + private get _numberOfFilterableAttrs(): number { + return this.entitiesService.all.filter(attr => attr.filterable).length; + } + async ngOnInit() { await this.#loadData(); } 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 index 000ac9054..44f01f82a 100644 --- 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 @@ -1,10 +1,11 @@ import { Component } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms'; +import { UntypedFormBuilder, Validators } from '@angular/forms'; import { SystemPreferences } from '@red/domain'; -import { BaseFormComponent, IqserPermissionsService, KeysOf, LoadingService } from '@iqser/common-ui'; +import { BaseFormComponent, IqserPermissionsService, LoadingService } from '@iqser/common-ui'; import { SystemPreferencesService } from '@services/system-preferences.service'; import { systemPreferencesTranslations } from '@translations/system-preferences-translations'; import { Roles } from '@users/roles'; +import { KeysOf } from '@iqser/common-ui/lib/utils'; export type ValueType = 'number' | 'string' | 'boolean'; @@ -13,24 +14,24 @@ export type ValueType = 'number' | 'string' | 'boolean'; templateUrl: './system-preferences-form.component.html', }) export class SystemPreferencesFormComponent extends BaseFormComponent { + #initialConfiguration: SystemPreferences; readonly translations = systemPreferencesTranslations; readonly keys: { name: KeysOf; type: ValueType }[] = [ { name: 'softDeleteCleanupTime', type: 'number' }, { name: 'downloadCleanupNotDownloadFilesHours', type: 'number' }, { name: 'downloadCleanupDownloadFilesHours', type: 'number' }, ]; - private _initialConfiguration: SystemPreferences; constructor( private readonly _loadingService: LoadingService, private readonly _systemPreferencesService: SystemPreferencesService, private readonly _formBuilder: UntypedFormBuilder, - private readonly _permissionsService: IqserPermissionsService, + permissionsService: IqserPermissionsService, ) { super(); - this.form = this._getForm(); - this._loadData(); - if (!_permissionsService.has(Roles.appConfiguration.write)) { + this.form = this.#getForm(); + this.#loadData(); + if (!permissionsService.has(Roles.appConfiguration.write)) { this.form.disable(); } } @@ -38,19 +39,21 @@ export class SystemPreferencesFormComponent extends BaseFormComponent { async save(): Promise { this._loadingService.start(); await this._systemPreferencesService.update(this.form.getRawValue()); - this._loadData(); + this.#loadData(); this._loadingService.stop(); } - private _getForm(): UntypedFormGroup { + #getForm() { const controlsConfig = {}; - this.keys.forEach(key => (controlsConfig[key.name] = [this._systemPreferencesService.values[key.name], Validators.required])); + this.keys.forEach(key => { + controlsConfig[key.name] = [this._systemPreferencesService.values[key.name], Validators.required]; + }); return this._formBuilder.group(controlsConfig); } - private _loadData() { - this._initialConfiguration = this._systemPreferencesService.values; - this.form.patchValue(this._initialConfiguration, { emitEvent: false }); + #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/modules/admin/screens/info/dossier-template-info.module.ts b/apps/red-ui/src/app/modules/admin/screens/info/dossier-template-info.module.ts index f4ad7c25d..6c2f49351 100644 --- a/apps/red-ui/src/app/modules/admin/screens/info/dossier-template-info.module.ts +++ b/apps/red-ui/src/app/modules/admin/screens/info/dossier-template-info.module.ts @@ -3,8 +3,9 @@ import { CommonModule } from '@angular/common'; import { DossierTemplateInfoScreenComponent } from './info-screen/dossier-template-info-screen.component'; import { RouterModule } from '@angular/router'; import { SharedModule } from '@shared/shared.module'; -import { HasScrollbarDirective, IqserHelpModeModule, IqserUsersModule } from '@iqser/common-ui'; +import { HasScrollbarDirective, IqserHelpModeModule } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes = [{ path: '', component: DossierTemplateInfoScreenComponent }]; diff --git a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts index e6d940119..e50143cbe 100644 --- a/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/info/info-screen/dossier-template-info-screen.component.ts @@ -3,7 +3,7 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem import { DOSSIER_TEMPLATE_ID, type DossierTemplate, type DossierTemplateStats } from '@red/domain'; import { DossierTemplateStatsService } from '@services/entity-services/dossier-template-stats.service'; import { dossierTemplateStatusTranslations } from '@translations/dossier-template-status-translations'; -import { ContextComponent, getParam } from '@iqser/common-ui'; +import { ContextComponent, getParam } from '@iqser/common-ui/lib/utils'; interface Context { readonly dossierTemplate: DossierTemplate; diff --git a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts index 59e11f857..3206b2837 100644 --- a/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/justifications/justifications-screen/justifications-screen.component.ts @@ -2,12 +2,10 @@ import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { CircleButtonTypes, - getParam, IconButtonTypes, ListingComponent, listingProvidersFactory, LoadingService, - SortingOrders, TableColumnConfig, } from '@iqser/common-ui'; import { DOSSIER_TEMPLATE_ID, Justification } from '@red/domain'; @@ -16,6 +14,8 @@ import { JustificationsDialogService } from '../justifications-dialog.service'; import { UserPreferenceService } from '@users/user-preference.service'; import { firstValueFrom } from 'rxjs'; import { PermissionsService } from '@services/permissions.service'; +import { SortingOrders } from '@iqser/common-ui/lib/sorting'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-justifications-screen', @@ -28,6 +28,7 @@ import { PermissionsService } from '@services/permissions.service'; }), }) export class JustificationsScreenComponent extends ListingComponent implements OnInit { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; readonly tableHeaderLabel = _('justifications-listing.table-header'); @@ -37,7 +38,6 @@ export class JustificationsScreenComponent extends ListingComponent implements OnDestroy { + readonly #subscription: Subscription = new Subscription(); readonly roles = Roles; readonly currentUser = getCurrentUser(); readonly translations = permissionsTranslations; @@ -34,7 +29,6 @@ export class PermissionsScreenComponent extends ListingComponent([]); readonly availableTemplates$ = new BehaviorSubject([]); readonly currentUser = getCurrentUser(); readonly roles = Roles; - @ViewChild('fileInput') private readonly _fileInput: ElementRef; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); constructor( private readonly _reportTemplateService: ReportTemplateService, diff --git a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts index c819bdd82..ef81e18c5 100644 --- a/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/rules/rules-screen/rules-screen.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, OnInit, ViewChild } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; -import { Debounce, getParam, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; +import { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { saveAs } from 'file-saver'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { RulesService } from '../../../services/rules.service'; @@ -8,6 +8,7 @@ import { firstValueFrom } from 'rxjs'; import { DOSSIER_TEMPLATE_ID } from '@red/domain'; import { EditorThemeService } from '@services/editor-theme.service'; import { ComponentCanDeactivate } from '@guards/can-deactivate.guard'; +import { Debounce, getParam } from '@iqser/common-ui/lib/utils'; import ICodeEditor = monaco.editor.ICodeEditor; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions; @@ -18,6 +19,11 @@ import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorCon changeDetection: ChangeDetectionStrategy.OnPush, }) export class RulesScreenComponent implements OnInit, ComponentCanDeactivate { + @ViewChild('fileInput') + private _fileInput: ElementRef; + private _codeEditor: ICodeEditor; + private _decorations: string[] = []; + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly editorOptions: IStandaloneEditorConstructionOptions = { theme: 'vs', @@ -25,19 +31,10 @@ export class RulesScreenComponent implements OnInit, ComponentCanDeactivate { automaticLayout: true, readOnly: !this.permissionsService.canEditRules(), }; - initialLines: string[] = []; currentLines: string[] = []; - isLeaving = false; - @ViewChild('fileInput') - private _fileInput: ElementRef; - - private _codeEditor: ICodeEditor; - private _decorations: string[] = []; - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); - constructor( readonly permissionsService: PermissionsService, private readonly _rulesService: RulesService, diff --git a/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts index 7ab70f3bf..c002cf300 100644 --- a/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/user-listing/user-listing-screen.component.ts @@ -11,7 +11,6 @@ import { ListingComponent, listingProvidersFactory, LoadingService, - NestedFilter, SearchPositions, TableColumnConfig, } from '@iqser/common-ui'; @@ -22,6 +21,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { userTypeChecker, userTypeFilters } from '../../../../utils'; import { RouterHistoryService } from '@services/router-history.service'; import { Roles } from '@users/roles'; +import { NestedFilter } from '@iqser/common-ui/lib/filtering'; function configToFilter({ key, label }: DonutChartConfig) { return new NestedFilter({ diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts index 4a2f7c1e3..e8e87ef69 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark-screen/watermark-screen.component.ts @@ -2,20 +2,7 @@ import { ChangeDetectorRef, Component, ElementRef, inject, OnInit, ViewChild } f import WebViewer, { WebViewerInstance } from '@pdftron/webviewer'; import { HttpClient } from '@angular/common/http'; import { FormBuilder, FormGroup } from '@angular/forms'; -import { - AsControl, - BASE_HREF_FN, - Debounce, - getConfig, - getCurrentUser, - getParam, - IconButtonTypes, - IqserPermissionsService, - LoadingService, - TenantsService, - Toaster, - trackByFactory, -} from '@iqser/common-ui'; +import { getConfig, IconButtonTypes, IqserPermissionsService, LoadingService, TenantsService, Toaster } from '@iqser/common-ui'; import { AppConfig, DOSSIER_TEMPLATE_ID, @@ -42,6 +29,8 @@ import { Roles } from '@users/roles'; import { environment } from '@environments/environment'; import { tap } from 'rxjs/operators'; import { watermarkTranslations } from '@translations/watermark-translations'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { AsControl, BASE_HREF_FN, Debounce, getParam, trackByFactory } from '@iqser/common-ui/lib/utils'; export const DEFAULT_WATERMARK: Partial = { text: 'Watermark', @@ -72,6 +61,13 @@ interface WatermarkForm { styleUrls: ['./watermark-screen.component.scss'], }) export class WatermarkScreenComponent implements OnInit { + @ViewChild('viewer', { static: true }) private readonly _viewer: ElementRef; + private readonly _convertPath = inject(BASE_HREF_FN); + readonly #loaded$ = new BehaviorSubject(false); + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); + readonly #watermarkId = Number(getParam(WATERMARK_ID)); + readonly #config = getConfig(); + #watermark: Partial = {}; readonly iconButtonTypes = IconButtonTypes; readonly translations = watermarkTranslations; readonly trackBy = trackByFactory(); @@ -89,13 +85,6 @@ export class WatermarkScreenComponent implements OnInit { readonly watermarkHorizontalAlignments = Object.values(WATERMARK_HORIZONTAL_ALIGNMENTS); readonly watermarkVerticalAlignments = Object.values(WATERMARK_VERTICAL_ALIGNMENTS); currentAlignment: WatermarkAlignment; - @ViewChild('viewer', { static: true }) private readonly _viewer: ElementRef; - private readonly _convertPath = inject(BASE_HREF_FN); - readonly #loaded$ = new BehaviorSubject(false); - readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); - readonly #watermarkId = Number(getParam(WATERMARK_ID)); - readonly #config = getConfig(); - #watermark: Partial = {}; constructor( private readonly _http: HttpClient, diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark.module.ts b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark.module.ts index dc3eabe70..d169929dd 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermark.module.ts +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermark.module.ts @@ -9,11 +9,9 @@ import { HasScrollbarDirective, IconButtonComponent, IqserAllowDirective, - IqserAuthGuard, IqserHelpModeModule, IqserListingModule, IqserRoutes, - IqserUsersModule, TenantPipe, } from '@iqser/common-ui'; import { RedRoleGuard } from '@users/red-role.guard'; @@ -27,6 +25,7 @@ import { MatSliderModule } from '@angular/material/slider'; import { ColorPickerModule } from 'ngx-color-picker'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatSlideToggleModule } from '@angular/material/slide-toggle'; +import { IqserAuthGuard, IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes: IqserRoutes = [ { diff --git a/apps/red-ui/src/app/modules/admin/screens/watermark/watermarks-listing/watermarks-listing-screen.component.ts b/apps/red-ui/src/app/modules/admin/screens/watermark/watermarks-listing/watermarks-listing-screen.component.ts index b4590f6ea..8a5602b84 100644 --- a/apps/red-ui/src/app/modules/admin/screens/watermark/watermarks-listing/watermarks-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/admin/screens/watermark/watermarks-listing/watermarks-listing-screen.component.ts @@ -1,8 +1,6 @@ import { Component } from '@angular/core'; import { CircleButtonTypes, - getCurrentUser, - getParam, IconButtonTypes, IConfirmationDialogData, IqserPermissionsService, @@ -18,6 +16,8 @@ import { WatermarkService } from '@services/entity-services/watermark.service'; import { AdminDialogService } from '../../../services/admin-dialog.service'; import { WatermarksMapService } from '@services/entity-services/watermarks-map.service'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './watermarks-listing-screen.component.html', @@ -25,6 +25,7 @@ import { Roles } from '@users/roles'; providers: listingProvidersFactory(WatermarksListingScreenComponent), }) export class WatermarksListingScreenComponent extends ListingComponent { + readonly #dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; readonly currentUser = getCurrentUser(); @@ -37,7 +38,6 @@ export class WatermarksListingScreenComponent extends ListingComponent { 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 8a2fcccea..e755d7e1a 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,9 +5,10 @@ import { adminSideNavTranslations } from '@translations/admin-side-nav-translati import { ActivatedRoute, RouterLink, RouterLinkActive } from '@angular/router'; import { AdminSideNavType, AdminSideNavTypes, DOSSIER_TEMPLATE_ID, ENTITY_TYPE, User, WATERMARK_ID } from '@red/domain'; import { Roles } from '@users/roles'; -import { getCurrentUser, IqserHelpModeModule, IqserPermissionsService, SideNavComponent, TenantPipe } from '@iqser/common-ui'; +import { IqserHelpModeModule, IqserPermissionsService, SideNavComponent, TenantPipe } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { NgForOf, NgIf } from '@angular/common'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; interface NavItem { readonly label: string; diff --git a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts index 021c15f89..4b72cf055 100644 --- a/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts +++ b/apps/red-ui/src/app/modules/admin/shared/components/dossier-template-actions/dossier-template-actions.component.ts @@ -1,19 +1,13 @@ import { Component, Input, OnInit } from '@angular/core'; import { ActivatedRoute, Router } from '@angular/router'; import { AdminDialogService } from '../../../services/admin-dialog.service'; -import { - CircleButtonComponent, - CircleButtonTypes, - getCurrentUser, - IqserHelpModeModule, - LoadingService, - TenantsService, -} from '@iqser/common-ui'; +import { CircleButtonComponent, CircleButtonTypes, IqserHelpModeModule, LoadingService, TenantsService } from '@iqser/common-ui'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { firstValueFrom } from 'rxjs'; import { DOSSIER_TEMPLATE_ID, type User } from '@red/domain'; import { NgIf } from '@angular/common'; import { TranslateModule } from '@ngx-translate/core'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ selector: 'redaction-dossier-template-actions', diff --git a/apps/red-ui/src/app/modules/archive/archive.module.ts b/apps/red-ui/src/app/modules/archive/archive.module.ts index 32f4c7725..ec6dd7e41 100644 --- a/apps/red-ui/src/app/modules/archive/archive.module.ts +++ b/apps/red-ui/src/app/modules/archive/archive.module.ts @@ -4,10 +4,11 @@ import { ArchivedDossiersScreenComponent } from './screens/archived-dossiers-scr import { ArchiveRoutingModule } from './archive-routing.module'; import { TableItemComponent } from './components/table-item/table-item.component'; import { ConfigService } from './services/config.service'; -import { IqserHelpModeModule, IqserListingModule, IqserUsersModule } from '@iqser/common-ui'; +import { IqserHelpModeModule, IqserListingModule } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { SharedModule } from '@shared/shared.module'; import { SharedDossiersModule } from '../shared-dossiers/shared-dossiers.module'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; @NgModule({ declarations: [TableItemComponent, ArchivedDossiersScreenComponent], diff --git a/apps/red-ui/src/app/modules/archive/services/config.service.ts b/apps/red-ui/src/app/modules/archive/services/config.service.ts index d7b74694a..5655dbf0c 100644 --- a/apps/red-ui/src/app/modules/archive/services/config.service.ts +++ b/apps/red-ui/src/app/modules/archive/services/config.service.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; -import { IFilterGroup, keyChecker, NestedFilter, TableColumnConfig } from '@iqser/common-ui'; +import { TableColumnConfig } from '@iqser/common-ui'; import { Dossier, User } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { dossierMemberChecker, dossierMemberQuickChecker, dossierOwnerQuickChecker, dossierTemplateChecker } from '@utils/index'; import { UserService } from '@users/user.service'; import { TranslateService } from '@ngx-translate/core'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; +import { IFilterGroup, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering'; @Injectable() export class ConfigService { diff --git a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts index 7ebd51e3c..69a16dcee 100644 --- a/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts +++ b/apps/red-ui/src/app/modules/dashboard/dashboard-screen/dashboard-screen.component.ts @@ -1,8 +1,9 @@ import { Component, inject, OnInit } from '@angular/core'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; import { UserPreferenceService } from '@users/user-preference.service'; -import { getCurrentUser, trackByFactory } from '@iqser/common-ui'; +import { trackByFactory } from '@iqser/common-ui/lib/utils'; import { User } from '@red/domain'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ templateUrl: './dashboard-screen.component.html', diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts index 4b04618b6..eb401f1d0 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.ts @@ -13,16 +13,7 @@ import { } from '@red/domain'; import { TranslateChartService } from '@services/translate-chart.service'; import { UserService } from '@users/user.service'; -import { - ContextComponent, - FilterService, - getCurrentUser, - getParam, - INestedFilter, - ProgressBarConfigModel, - shareLast, - Toaster, -} from '@iqser/common-ui'; +import { ProgressBarConfigModel, Toaster } from '@iqser/common-ui'; import { workflowFileStatusTranslations } from '@translations/file-status-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { combineLatestWith, firstValueFrom } from 'rxjs'; @@ -31,6 +22,9 @@ import { map, tap } from 'rxjs/operators'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { FilesMapService } from '@services/files/files-map.service'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; +import { ContextComponent, getParam, shareLast } from '@iqser/common-ui/lib/utils'; interface DossierDetailsContext { needsWorkFilters: INestedFilter[] | undefined; @@ -45,17 +39,16 @@ interface DossierDetailsContext { styleUrls: ['./dossier-details.component.scss'], }) export class DossierDetailsComponent extends ContextComponent { + #currentChartSubtitleIndex = 0; + readonly #dossierId = getParam(DOSSIER_ID); @Input() dossierAttributes: DossierAttributeWithValue[]; @Output() readonly toggleCollapse = new EventEmitter(); - editingOwner = false; readonly roles = Roles; readonly currentUser = getCurrentUser(); readonly collapseTooltip = _('dossier-details.collapse'); readonly expandTooltip = _('dossier-details.expand'); chartConfig: DonutChartConfig[] = []; - #currentChartSubtitleIndex = 0; - readonly #dossierId = getParam(DOSSIER_ID); constructor( private readonly _toaster: Toaster, diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts index 138bf667c..41e30706e 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/screen-header/dossier-overview-screen-header.component.ts @@ -3,11 +3,8 @@ import { ActionConfig, CircleButtonTypes, EntitiesService, - List, ListingService, LoadingService, - some, - SortingService, TenantsService, Toaster, } from '@iqser/common-ui'; @@ -22,6 +19,8 @@ import { ConfigService } from '../../config.service'; import { PrimaryFileAttributeService } from '@services/primary-file-attribute.service'; import { Router } from '@angular/router'; import { Roles } from '@users/roles'; +import { SortingService } from '@iqser/common-ui/lib/sorting'; +import { List, some } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-dossier-overview-screen-header [dossier] [upload]', diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.ts b/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.ts index 525ada944..6fe2cb184 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/components/workflow-item/workflow-item.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectorRef, Component, ElementRef, Input, OnInit, Optional, ViewChild } from '@angular/core'; import { Dossier, File, IFileAttributeConfig } from '@red/domain'; -import { Debounce, HelpModeService } from '@iqser/common-ui'; +import { HelpModeService } from '@iqser/common-ui'; +import { Debounce } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-workflow-item [file] [dossier] [displayedAttributes]', @@ -8,13 +9,12 @@ import { Debounce, HelpModeService } from '@iqser/common-ui'; styleUrls: ['./workflow-item.component.scss'], }) export class WorkflowItemComponent implements OnInit { + @ViewChild('actionsWrapper', { static: true }) private _actionsWrapper: ElementRef; @Input() file: File; @Input() dossier: Dossier; @Input() displayedAttributes: IFileAttributeConfig[]; width: number; - @ViewChild('actionsWrapper', { static: true }) private _actionsWrapper: ElementRef; - constructor(private readonly _changeRef: ChangeDetectorRef, @Optional() readonly helpModeService: HelpModeService) {} ngOnInit(): void { diff --git a/apps/red-ui/src/app/modules/dossier-overview/config.service.ts b/apps/red-ui/src/app/modules/dossier-overview/config.service.ts index 560b633f6..938b32f30 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/config.service.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/config.service.ts @@ -2,16 +2,9 @@ import { Injectable, TemplateRef } from '@angular/core'; import { ActionConfig, getConfig, - getCurrentUser, - getParam, - IFilterGroup, - INestedFilter, IqserPermissionsService, - keyChecker, - List, ListingMode, ListingModes, - NestedFilter, TableColumnConfig, WorkflowColumn, WorkflowConfig, @@ -46,6 +39,9 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m import { UserPreferenceService } from '@users/user-preference.service'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { IFilterGroup, INestedFilter, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering'; +import { getParam, List } from '@iqser/common-ui/lib/utils'; @Injectable() export class ConfigService { 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 230792a1c..dc17c9be2 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 @@ -10,7 +10,6 @@ import { IqserListingModule, IqserLoadingModule, IqserRoutes, - IqserUsersModule, StatusBarComponent, StopPropagationDirective, TenantPipe, @@ -28,6 +27,7 @@ import { DossierOverviewScreenHeaderComponent } from './components/screen-header import { ViewModeSelectionComponent } from './components/view-mode-selection/view-mode-selection.component'; import { FileAttributeComponent } from './components/file-attribute/file-attribute.component'; import { SharedModule } from '@shared/shared.module'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes: IqserRoutes = [ { diff --git a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts index 4b75aebf2..9563a1cca 100644 --- a/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossier-overview/screen/dossier-overview-screen.component.ts @@ -19,16 +19,11 @@ import { CircleButtonTypes, CustomError, ErrorService, - getParam, IqserPermissionsService, ListingComponent, ListingModes, listingProvidersFactory, LoadingService, - NestedFilter, - OnAttach, - OnDetach, - shareLast, TableColumnConfig, TableComponent, WorkflowConfig, @@ -46,6 +41,8 @@ import { BulkActionsService } from '../services/bulk-actions.service'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider'; import { Roles } from '@users/roles'; +import { NestedFilter } from '@iqser/common-ui/lib/filtering'; +import { getParam, OnAttach, OnDetach, shareLast } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './dossier-overview-screen.component.html', diff --git a/apps/red-ui/src/app/modules/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts index 6a4e855f7..fc932f3ac 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/components/dossier-documents-status/dossier-documents-status.component.ts @@ -1,6 +1,7 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges } from '@angular/core'; import { DossierStats, StatusSorter } from '@red/domain'; -import { List, StatusBarConfig } from '@iqser/common-ui'; +import { StatusBarConfig } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-dossier-documents-status', diff --git a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts index 283137f18..f5acb2e40 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/components/dossiers-listing-details/dossiers-listing-details.component.ts @@ -4,7 +4,7 @@ import { Observable } from 'rxjs'; import { TranslateChartService } from '@services/translate-chart.service'; import { map } from 'rxjs/operators'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; -import { getParam } from '@iqser/common-ui'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-dossiers-listing-details', diff --git a/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts b/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts index a71840a67..277a5613f 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/config.service.ts @@ -1,13 +1,5 @@ import { Injectable, TemplateRef } from '@angular/core'; -import { - ButtonConfig, - IFilterGroup, - INestedFilter, - keyChecker, - NestedFilter, - OverlappingElements, - TableColumnConfig, -} from '@iqser/common-ui'; +import { ButtonConfig, TableColumnConfig } from '@iqser/common-ui'; import { annotationDefaultColorConfig, AnnotationShapeMap, @@ -35,6 +27,7 @@ import { DossierStatesMapService } from '@services/entity-services/dossier-state import { PermissionsService } from '@services/permissions.service'; import { SharedDialogService } from '@shared/services/dialog.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; +import { IFilterGroup, INestedFilter, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering'; @Injectable() export class ConfigService { diff --git a/apps/red-ui/src/app/modules/dossiers-listing/dossiers-listing.module.ts b/apps/red-ui/src/app/modules/dossiers-listing/dossiers-listing.module.ts index 5033d8fe1..aec7245db 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/dossiers-listing.module.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/dossiers-listing.module.ts @@ -6,7 +6,6 @@ import { IqserHelpModeModule, IqserListingModule, IqserRoutes, - IqserUsersModule, StatusBarComponent, } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; @@ -21,6 +20,7 @@ import { DossierWorkloadColumnComponent } from './components/dossier-workload-co import { DossierDocumentsStatusComponent } from './components/dossier-documents-status/dossier-documents-status.component'; import { DossierFilesGuard } from '@guards/dossier-files-guard'; import { ACTIVE_DOSSIERS_SERVICE } from '../../tokens'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes: IqserRoutes = [ { diff --git a/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts index 1ca7f7ddf..32ad8ec0e 100644 --- a/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts +++ b/apps/red-ui/src/app/modules/dossiers-listing/screen/dossiers-listing-screen.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, OnInit, TemplateRef, ViewChild } from '@angular/core'; import { Dossier, DOSSIER_TEMPLATE_ID, DossierTemplate } from '@red/domain'; import { PermissionsService } from '@services/permissions.service'; -import { ButtonConfig, ListingComponent, listingProvidersFactory, OnAttach, TableComponent } from '@iqser/common-ui'; +import { ButtonConfig, ListingComponent, listingProvidersFactory, TableComponent } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { ConfigService } from '../config.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; @@ -10,6 +10,7 @@ import { Router } from '@angular/router'; import { UserPreferenceService } from '@users/user-preference.service'; import { SharedDialogService } from '@shared/services/dialog.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; +import { OnAttach } from '@iqser/common-ui/lib/utils'; @Component({ templateUrl: './dossiers-listing-screen.component.html', @@ -18,17 +19,17 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem changeDetection: ChangeDetectionStrategy.OnPush, }) export class DossiersListingScreenComponent extends ListingComponent implements OnInit, OnAttach { - readonly tableColumnConfigs = this._configService.tableConfig; - readonly tableHeaderLabel = _('dossier-listing.table-header.title'); - readonly buttonConfigs: ButtonConfig[]; - readonly dossierTemplate: DossierTemplate; - readonly computeFilters$ = this._activeDossiersService.all$.pipe(tap(() => this._computeAllFilters())); @ViewChild('needsWorkFilterTemplate', { read: TemplateRef, static: true, }) private readonly _needsWorkFilterTemplate: TemplateRef; @ViewChild(TableComponent) private readonly _tableComponent: TableComponent; + readonly tableColumnConfigs = this._configService.tableConfig; + readonly tableHeaderLabel = _('dossier-listing.table-header.title'); + readonly buttonConfigs: ButtonConfig[]; + readonly dossierTemplate: DossierTemplate; + readonly computeFilters$ = this._activeDossiersService.all$.pipe(tap(() => this._computeAllFilters())); constructor( router: Router, diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts index d5266d823..4da630864 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotation-details/annotation-details.component.ts @@ -3,9 +3,9 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { TranslateService } from '@ngx-translate/core'; import { annotationChangesTranslations } from '@translations/annotation-changes-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; -import { KeysOf } from '@iqser/common-ui'; import { ListItem } from '@models/file/list-item'; import { MultiSelectService } from '../../services/multi-select.service'; +import { KeysOf } from '@iqser/common-ui/lib/utils'; interface Engine { readonly icon: string; @@ -41,16 +41,14 @@ const changesProperties: KeysOf[] = [ styleUrls: ['./annotation-details.component.scss'], }) export class AnnotationDetailsComponent implements OnChanges { + private readonly _translateService = inject(TranslateService); + private readonly _multiSelectService = inject(MultiSelectService); @Input() annotation: ListItem; isPopoverOpen = false; - engines: Engine[]; changesTooltip: string; noSelection: boolean; - private readonly _translateService = inject(TranslateService); - private readonly _multiSelectService = inject(MultiSelectService); - getChangesTooltip(): string | undefined { const changes = changesProperties.filter(key => this.annotation.item[key]); diff --git a/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts b/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts index bd4a8a323..bf06d514a 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/annotations-list/annotations-list.component.ts @@ -1,6 +1,6 @@ import { ChangeDetectorRef, Component, computed, ElementRef, EventEmitter, Input, OnChanges, Output } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { FilterService, HasScrollbarDirective, IqserEventTarget } from '@iqser/common-ui'; +import { HasScrollbarDirective } from '@iqser/common-ui'; import { MultiSelectService } from '../../services/multi-select.service'; import { AnnotationReferencesService } from '../../services/annotation-references.service'; import { UserPreferenceService } from '@users/user-preference.service'; @@ -9,6 +9,8 @@ import { EarmarkGroup } from '@red/domain'; import { REDAnnotationManager } from '../../../pdf-viewer/services/annotation-manager.service'; import { AnnotationsListingService } from '../../services/annotations-listing.service'; import { ListItem } from '@models/file/list-item'; +import { FilterService } from '@iqser/common-ui/lib/filtering'; +import { IqserEventTarget } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-annotations-list', @@ -16,15 +18,14 @@ import { ListItem } from '@models/file/list-item'; styleUrls: ['./annotations-list.component.scss'], }) export class AnnotationsListComponent extends HasScrollbarDirective implements OnChanges { - @Input() annotations: ListItem[]; - @Output() readonly pagesPanelActive = new EventEmitter(); - readonly #earmarkGroups = computed(() => { if (this._viewModeService.isEarmarks()) { return this.#getEarmarksGroups(); } return [] as EarmarkGroup[]; }); + @Input() annotations: ListItem[]; + @Output() readonly pagesPanelActive = new EventEmitter(); constructor( protected readonly _elementRef: ElementRef, diff --git a/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts b/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts index 617cdea00..578020003 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/comments/comments.component.ts @@ -2,12 +2,14 @@ import { ChangeDetectorRef, Component, HostBinding, Input, OnInit, ViewChild } f import type { IComment, User } from '@red/domain'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { PermissionsService } from '@services/permissions.service'; -import { ContextComponent, getCurrentUser, InputWithActionComponent, LoadingService, trackByFactory } from '@iqser/common-ui'; +import { InputWithActionComponent, LoadingService } from '@iqser/common-ui'; import { Observable } from 'rxjs'; import { CommentingService } from '../../services/commenting.service'; import { tap } from 'rxjs/operators'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; import { ManualRedactionService } from '../../services/manual-redaction.service'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { ContextComponent, trackByFactory } from '@iqser/common-ui/lib/utils'; interface CommentsContext { hiddenComments: boolean; @@ -19,12 +21,12 @@ interface CommentsContext { styleUrls: ['./comments.component.scss'], }) export class CommentsComponent extends ContextComponent implements OnInit { + @HostBinding('class.hidden') private _hidden = true; + @ViewChild(InputWithActionComponent) private readonly _input: InputWithActionComponent; @Input() annotation: AnnotationWrapper; readonly trackBy = trackByFactory(); readonly currentUser = getCurrentUser(); hiddenComments$: Observable; - @HostBinding('class.hidden') private _hidden = true; - @ViewChild(InputWithActionComponent) private readonly _input: InputWithActionComponent; constructor( readonly permissionsService: PermissionsService, diff --git a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts index 1d9e5ee07..dbe150783 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/document-info/document-info.component.ts @@ -6,7 +6,7 @@ import { FilePreviewStateService } from '../../services/file-preview-state.servi import { type FileAttributeConfigType, FileAttributeConfigTypes } from '@red/domain'; import { FilePreviewDialogService } from '../../services/file-preview-dialog.service'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; -import { ContextComponent } from '@iqser/common-ui'; +import { ContextComponent } from '@iqser/common-ui/lib/utils'; import { toSignal } from '@angular/core/rxjs-interop'; interface FileAttribute { diff --git a/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.ts b/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.ts index e5a45a15f..8461382d1 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/file-workload/file-workload.component.ts @@ -3,16 +3,7 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { AnnotationProcessingService } from '../../services/annotation-processing.service'; import { MatDialog } from '@angular/material/dialog'; import scrollIntoView from 'scroll-into-view-if-needed'; -import { - AutoUnsubscribe, - bool, - CircleButtonTypes, - Debounce, - FilterService, - IconButtonTypes, - INestedFilter, - IqserEventTarget, -} from '@iqser/common-ui'; +import { CircleButtonTypes, IconButtonTypes } from '@iqser/common-ui'; import { combineLatest, delay, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { ExcludedPagesService } from '../../services/excluded-pages.service'; @@ -31,6 +22,8 @@ import { SuggestionsService } from '../../services/suggestions.service'; import { ListItem } from '@models/file/list-item'; import { PageRotationService } from '../../../pdf-viewer/services/page-rotation.service'; import { getLocalStorageDataByFileId } from '@utils/local-storage'; +import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; +import { AutoUnsubscribe, bool, Debounce, IqserEventTarget } from '@iqser/common-ui/lib/utils'; const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape']; const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; @@ -41,9 +34,10 @@ const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; styleUrls: ['./file-workload.component.scss'], }) export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, OnDestroy { + @ViewChild('annotationsElement') private readonly _annotationsElement: ElementRef; + @ViewChild('quickNavigation') private readonly _quickNavigationElement: ElementRef; readonly iconButtonTypes = IconButtonTypes; readonly circleButtonTypes = CircleButtonTypes; - displayedAnnotations = new Map(); displayedPages: number[] = []; pagesPanelActive = true; @@ -52,8 +46,6 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On this.viewModeService.isEarmarks() ? _('file-preview.tabs.highlights.label') : _('file-preview.tabs.annotations.label'), ); readonly currentPageIsExcluded = computed(() => this.state.file().excludedPages.includes(this.pdf.currentPage())); - @ViewChild('annotationsElement') private readonly _annotationsElement: ElementRef; - @ViewChild('quickNavigation') private readonly _quickNavigationElement: ElementRef; constructor( readonly filterService: FilterService, @@ -116,20 +108,6 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On ); } - ngOnInit(): void { - setTimeout(() => { - const showExcludePages = getLocalStorageDataByFileId(this.state.file()?.id, 'show-exclude-pages') ?? false; - if (showExcludePages) { - this.excludedPagesService.show(); - } - - const showDocumentInfo = getLocalStorageDataByFileId(this.state.file()?.id, 'show-document-info') ?? false; - if (showDocumentInfo) { - this.documentInfoService.show(); - } - }); - } - get activeAnnotations(): AnnotationWrapper[] { return this.displayedAnnotations.get(this.pdf.currentPage()) || []; } @@ -170,6 +148,20 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On } } + ngOnInit(): void { + setTimeout(() => { + const showExcludePages = getLocalStorageDataByFileId(this.state.file()?.id, 'show-exclude-pages') ?? false; + if (showExcludePages) { + this.excludedPagesService.show(); + } + + const showDocumentInfo = getLocalStorageDataByFileId(this.state.file()?.id, 'show-document-info') ?? false; + if (showDocumentInfo) { + this.documentInfoService.show(); + } + }); + } + selectAllOnActivePage() { this.listingService.selectAnnotations(this.activeAnnotations); } diff --git a/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts b/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts index 4472986f9..262f9f979 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/page-indicator/page-indicator.component.ts @@ -3,12 +3,13 @@ import { PermissionsService } from '@services/permissions.service'; import { ViewedPagesService } from '@services/files/viewed-pages.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; import { PageRotationService } from '../../../pdf-viewer/services/page-rotation.service'; -import { ContextComponent, getConfig } from '@iqser/common-ui'; +import { getConfig } from '@iqser/common-ui'; import { map, tap } from 'rxjs/operators'; import { AppConfig, ViewedPage } from '@red/domain'; import { ViewedPagesMapService } from '@services/files/viewed-pages-map.service'; import { pairwise } from 'rxjs'; import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service'; +import { ContextComponent } from '@iqser/common-ui/lib/utils'; interface PageIndicatorContext { isRotated: boolean; @@ -21,14 +22,13 @@ interface PageIndicatorContext { styleUrls: ['./page-indicator.component.scss'], }) export class PageIndicatorComponent extends ContextComponent implements OnChanges, OnInit { + readonly #config = getConfig(); @Input({ required: true }) number: number; @Input() showDottedIcon = false; @Input() activeSelection = false; @Input() read = false; @Output() readonly pageSelected = new EventEmitter(); - pageReadTimeout: number = null; - readonly #config = getConfig(); constructor( private readonly _viewedPagesService: ViewedPagesService, diff --git a/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts b/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts index 287c7db81..b268b15db 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/pages/pages.component.ts @@ -1,5 +1,5 @@ import { Component, inject, Input } from '@angular/core'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { PdfViewer } from '../../../pdf-viewer/services/pdf-viewer.service'; import { MultiSelectService } from '../../services/multi-select.service'; import { AnnotationsListingService } from '../../services/annotations-listing.service'; @@ -14,13 +14,13 @@ import { ViewedPage } from '@red/domain'; styleUrls: ['./pages.component.scss'], }) export class PagesComponent { - @Input({ required: true }) pages: List; - @Input({ required: true }) displayedAnnotations: Map; - protected readonly _pdf = inject(PdfViewer); readonly #state = inject(FilePreviewStateService); - readonly viewedPages$ = inject(ViewedPagesMapService).get$(this.#state.fileId); readonly #multiSelectService = inject(MultiSelectService); readonly #listingService = inject(AnnotationsListingService); + protected readonly _pdf = inject(PdfViewer); + @Input({ required: true }) pages: List; + @Input({ required: true }) displayedAnnotations: Map; + readonly viewedPages$ = inject(ViewedPagesMapService).get$(this.#state.fileId); pageSelectedByClick($event: number): void { this._pdf.navigateTo($event); diff --git a/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts b/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts index b96e5df60..5c04bd120 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/user-management/user-management.component.ts @@ -1,6 +1,6 @@ import { Component, computed } from '@angular/core'; import { File, User } from '@red/domain'; -import { getCurrentUser, LoadingService, Toaster } from '@iqser/common-ui'; +import { LoadingService, Toaster } from '@iqser/common-ui'; import { PermissionsService } from '@services/permissions.service'; import { workflowFileStatusTranslations } from '@translations/file-status-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -9,6 +9,7 @@ import { FilesService } from '@services/files/files.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; import { FileAssignService } from '../../../shared-dossiers/services/file-assign.service'; import { moveElementInArray } from '@utils/functions'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ selector: 'redaction-user-management', @@ -16,17 +17,6 @@ import { moveElementInArray } from '@utils/functions'; styleUrls: ['./user-management.component.scss'], }) export class UserManagementComponent { - readonly translations = workflowFileStatusTranslations; - readonly statusBarConfig = computed(() => [{ length: 1, color: this.state.file().workflowStatus }]); - readonly assignTooltip = computed(() => { - const file = this.state.file(); - return file.isUnderApproval - ? _('dossier-overview.assign-approver') - : file.assignee - ? _('file-preview.change-reviewer') - : _('file-preview.assign-reviewer'); - }); - editingReviewer = false; protected readonly _canAssignToSelf = computed(() => this.permissionsService.canAssignToSelf(this.state.file(), this.state.dossier())); protected readonly _canAssignUser = computed(() => this.permissionsService.canAssignUser(this.state.file(), this.state.dossier())); protected readonly _canUnassignUser = computed(() => this.permissionsService.canUnassignUser(this.state.file(), this.state.dossier())); @@ -45,6 +35,17 @@ export class UserManagementComponent { : this.#customSort([...dossier.memberIds, ...unassignUser]); }); protected readonly _currentUserId = getCurrentUser().id; + readonly translations = workflowFileStatusTranslations; + readonly statusBarConfig = computed(() => [{ length: 1, color: this.state.file().workflowStatus }]); + readonly assignTooltip = computed(() => { + const file = this.state.file(); + return file.isUnderApproval + ? _('dossier-overview.assign-approver') + : file.assignee + ? _('file-preview.change-reviewer') + : _('file-preview.assign-reviewer'); + }); + editingReviewer = false; constructor( readonly fileAssignService: FileAssignService, diff --git a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts index a79ec3af4..3df651796 100644 --- a/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/components/view-switch/view-switch.component.ts @@ -3,11 +3,12 @@ import { ViewMode, ViewModes } from '@red/domain'; import { ViewModeService } from '../../services/view-mode.service'; import { FilePreviewStateService } from '../../services/file-preview-state.service'; import { FileDataService } from '../../services/file-data.service'; -import { BASE_HREF, ConfirmOptions, IConfirmationDialogData, Toaster } from '@iqser/common-ui'; +import { ConfirmOptions, IConfirmationDialogData, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserPreferenceService } from '@users/user-preference.service'; import { FilePreviewDialogService } from '../../services/file-preview-dialog.service'; import { Roles } from '@users/roles'; +import { BASE_HREF } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-view-switch', diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts index c9a20b8b4..32326378d 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-providers.ts @@ -7,7 +7,7 @@ import { SkippedService } from './services/skipped.service'; import { AnnotationActionsService } from './services/annotation-actions.service'; import { FilePreviewStateService } from './services/file-preview-state.service'; import { AnnotationReferencesService } from './services/annotation-references.service'; -import { EntitiesService, FilterService, ListingService, SearchService, SortingService } from '@iqser/common-ui'; +import { EntitiesService, ListingService, SearchService } from '@iqser/common-ui'; import { AnnotationProcessingService } from './services/annotation-processing.service'; import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider'; import { FileDataService } from './services/file-data.service'; @@ -15,6 +15,8 @@ import { AnnotationsListingService } from './services/annotations-listing.servic import { StampService } from './services/stamp.service'; import { PdfProxyService } from './services/pdf-proxy.service'; import { PdfAnnotationActionsService } from './services/pdf-annotation-actions.service'; +import { FilterService } from '@iqser/common-ui/lib/filtering'; +import { SortingService } from '@iqser/common-ui/lib/sorting'; export const filePreviewScreenProviders = [ FilterService, diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts index bf975f97f..0d29cf9a9 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview-screen.component.ts @@ -13,25 +13,14 @@ import { } from '@angular/core'; import { ActivatedRoute, ActivatedRouteSnapshot, NavigationExtras, Router } from '@angular/router'; import { - AutoUnsubscribe, - Bind, - bool, CircleButtonTypes, ConfirmOption, ConfirmOptions, - copyLocalStorageFiltersValues, CustomError, - Debounce, ErrorService, - FilterService, HelpModeService, IConfirmationDialogData, - List, LoadingService, - NestedFilter, - OnAttach, - OnDetach, - processFilters, TenantsService, Toaster, } from '@iqser/common-ui'; @@ -78,6 +67,8 @@ import { SuggestionsService } from './services/suggestions.service'; import { IqserDialog } from '../../../../../../libs/common-ui/src/lib/dialog/iqser-dialog.service'; import { RedactTextDialogComponent } from './dialogs/redact-text-dialog/redact-text-dialog.component'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; +import { copyLocalStorageFiltersValues, FilterService, NestedFilter, processFilters } from '@iqser/common-ui/lib/filtering'; +import { AutoUnsubscribe, Bind, bool, Debounce, List, OnAttach, OnDetach } from '@iqser/common-ui/lib/utils'; const textActions = [TextPopups.REDACT_TEXT, TextPopups.ADD_HINT, TextPopups.ADD_FALSE_POSITIVE]; @@ -90,18 +81,18 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements AfterViewInit, OnInit, OnDestroy, OnAttach, OnDetach, ComponentCanDeactivate { - readonly circleButtonTypes = CircleButtonTypes; - readonly roles = Roles; - fullScreen = false; - readonly fileId = this.state.fileId; - readonly dossierId = this.state.dossierId; - width: number; @ViewChild('annotationFilterTemplate', { read: TemplateRef, static: false, }) private readonly _filterTemplate: TemplateRef; @ViewChild('actionsWrapper', { static: false }) private readonly _actionsWrapper: ElementRef; + readonly circleButtonTypes = CircleButtonTypes; + readonly roles = Roles; + fullScreen = false; + readonly fileId = this.state.fileId; + readonly dossierId = this.state.dossierId; + width: number; constructor( readonly pdf: PdfViewer, diff --git a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts b/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts index 3fa7a5773..40509cd5b 100644 --- a/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts +++ b/apps/red-ui/src/app/modules/file-preview/file-preview.module.ts @@ -12,11 +12,9 @@ import { InputWithActionComponent, IqserAllowDirective, IqserDenyDirective, - IqserFiltersModule, IqserHelpModeModule, IqserRoutes, IqserUploadFileModule, - IqserUsersModule, LogPipe, PreventDefaultDirective, RoundCheckboxComponent, @@ -66,6 +64,8 @@ import { SharedModule } from '@shared/shared.module'; import { SharedDossiersModule } from '../shared-dossiers/shared-dossiers.module'; import { RedactTextDialogComponent } from './dialogs/redact-text-dialog/redact-text-dialog.component'; import { RemoveRedactionDialogComponent } from './dialogs/remove-redaction-dialog/remove-redaction-dialog.component'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; +import { IqserFiltersModule } from '@iqser/common-ui/lib/filtering'; const routes: IqserRoutes = [ { diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts index 53cc5bc78..c49211e79 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-actions.service.ts @@ -1,13 +1,12 @@ import { Injectable } from '@angular/core'; import { ManualRedactionService } from './manual-redaction.service'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { firstValueFrom, Observable, of } from 'rxjs'; +import { firstValueFrom, Observable } from 'rxjs'; import { getFirstRelevantTextPart } from '../../../utils'; import { Core } from '@pdftron/webviewer'; import { DictionaryEntryTypes, EarmarkOperation, - IAddRedactionRequest, ILegalBasisChangeRequest, IRecategorizationRequest, IRectangle, @@ -20,7 +19,7 @@ import { AcceptRecommendationDialogComponent, AcceptRecommendationReturnType, } from '../dialogs/accept-recommendation-dialog/accept-recommendation-dialog.component'; -import { defaultDialogConfig, isJustOne, List } from '@iqser/common-ui'; +import { defaultDialogConfig } from '@iqser/common-ui'; import { filter } from 'rxjs/operators'; import { MatDialog } from '@angular/material/dialog'; import { FilePreviewStateService } from './file-preview-state.service'; @@ -38,6 +37,7 @@ import { import { RemoveRedactionOptions } from '../dialogs/remove-redaction-dialog/remove-redaction-options'; import { IqserDialog } from '../../../../../../../libs/common-ui/src/lib/dialog/iqser-dialog.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; +import { isJustOne, List } from '@iqser/common-ui/lib/utils'; @Injectable() export class AnnotationActionsService { diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotation-processing.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotation-processing.service.ts index b32c3b2a2..316c5c548 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotation-processing.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotation-processing.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { SuperTypeSorter } from '../../../utils'; -import { Filter, handleCheckedValue, IFilter, INestedFilter, NestedFilter } from '@iqser/common-ui'; +import { Filter, handleCheckedValue, IFilter, INestedFilter, NestedFilter } from '@iqser/common-ui/lib/filtering'; import { annotationTypesTranslations } from '@translations/annotation-types-translations'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { annotationDefaultColorConfig } from '@red/domain'; diff --git a/apps/red-ui/src/app/modules/file-preview/services/annotations-listing.service.ts b/apps/red-ui/src/app/modules/file-preview/services/annotations-listing.service.ts index a33e24c33..fee463b7a 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/annotations-listing.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/annotations-listing.service.ts @@ -1,11 +1,13 @@ import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { Injectable, OnDestroy } from '@angular/core'; -import { EntitiesService, FilterService, ListingService, SearchService, SortingService } from '@iqser/common-ui'; +import { EntitiesService, ListingService, SearchService } from '@iqser/common-ui'; import { filter, tap } from 'rxjs/operators'; import { MultiSelectService } from './multi-select.service'; import { PdfViewer } from '../../pdf-viewer/services/pdf-viewer.service'; import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; import { Subscription } from 'rxjs'; +import { FilterService } from '@iqser/common-ui/lib/filtering'; +import { SortingService } from '@iqser/common-ui/lib/sorting'; @Injectable() export class AnnotationsListingService extends ListingService implements OnDestroy { diff --git a/apps/red-ui/src/app/modules/file-preview/services/commenting.service.ts b/apps/red-ui/src/app/modules/file-preview/services/commenting.service.ts index 90cd0b16d..494cfb796 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/commenting.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/commenting.service.ts @@ -1,7 +1,7 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; import { map, startWith } from 'rxjs/operators'; -import { shareDistinctLast } from '@iqser/common-ui'; +import { shareDistinctLast } from '@iqser/common-ui/lib/utils'; @Injectable() export class CommentingService { diff --git a/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts b/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts index a607f1e97..7acc03014 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/file-preview-state.service.ts @@ -3,7 +3,7 @@ import { firstValueFrom, from, merge, Observable, of, pairwise, Subject, switchM import { Dictionary, Dossier, DOSSIER_ID, DOSSIER_TEMPLATE_ID, File, FILE_ID } from '@red/domain'; import { FilesMapService } from '@services/files/files-map.service'; import { PermissionsService } from '@services/permissions.service'; -import { getParam, LoadingService, wipeCache } from '@iqser/common-ui'; +import { LoadingService, wipeCache } from '@iqser/common-ui'; import { filter, map, startWith, tap, withLatestFrom } from 'rxjs/operators'; import { FileManagementService } from '@services/files/file-management.service'; import { dossiersServiceResolver } from '@services/entity-services/dossiers.service.provider'; @@ -15,6 +15,7 @@ import { DictionariesMapService } from '@services/entity-services/dictionaries-m import { DossierDictionariesMapService } from '@services/entity-services/dossier-dictionaries-map.service'; import { toSignal } from '@angular/core/rxjs-interop'; import { ViewModeService } from './view-mode.service'; +import { getParam } from '@iqser/common-ui/lib/utils'; const ONE_MEGABYTE = 1024 * 1024; @@ -31,6 +32,8 @@ function isDownload(event: HttpEvent): event is HttpProgressEvent { @Injectable() export class FilePreviewStateService { + readonly #reloadBlob$ = new Subject(); + readonly #dossierFileChange: Signal; readonly file$: Observable; readonly file: Signal; readonly dossier: Signal; @@ -38,12 +41,9 @@ export class FilePreviewStateService { readonly isWritable: Signal; readonly dossierDictionary: Signal; readonly blob$: Observable; - readonly dossierId = getParam(DOSSIER_ID); readonly dossierTemplateId = getParam(DOSSIER_TEMPLATE_ID); readonly fileId = getParam(FILE_ID); - readonly #reloadBlob$ = new Subject(); - readonly #dossierFileChange: Signal; // readonly #routeKey = getReusableRouteKey(inject(ActivatedRoute).snapshot); // readonly isAttached = inject(CustomRouteReuseStrategy).attached$.pipe( diff --git a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts index 00b4e0fdc..6935802b5 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/manual-redaction.service.ts @@ -11,7 +11,7 @@ import type { ManualRedactionActions, } from '@red/domain'; import { type AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { GenericService, IqserPermissionsService, List, Toaster } from '@iqser/common-ui'; +import { GenericService, IqserPermissionsService, Toaster } from '@iqser/common-ui'; import { tap } from 'rxjs/operators'; import { PermissionsService } from '@services/permissions.service'; import { dictionaryActionsTranslations, manualRedactionActionsTranslations } from '@translations/annotation-actions-translations'; @@ -22,6 +22,7 @@ import { type ManualRedactionEntryType } from '@models/file/manual-redaction-ent import { NGXLogger } from 'ngx-logger'; import { Roles } from '@users/roles'; import { firstValueFrom, of } from 'rxjs'; +import { List } from '@iqser/common-ui/lib/utils'; function getResponseType(error: boolean, isConflict: boolean) { const isConflictError = isConflict ? 'conflictError' : 'error'; diff --git a/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts index 8af835fd4..410899cb4 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/pdf-annotation-actions.service.ts @@ -5,11 +5,12 @@ import { PermissionsService } from '@services/permissions.service'; import { FilePreviewStateService } from './file-preview-state.service'; import { TranslateService } from '@ngx-translate/core'; import { AnnotationActionsService } from './annotation-actions.service'; -import { BASE_HREF_FN, IqserPermissionsService } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { IHeaderElement } from '@red/domain'; import { Roles } from '@users/roles'; import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; +import { BASE_HREF_FN } from '@iqser/common-ui/lib/utils'; @Injectable() export class PdfAnnotationActionsService { diff --git a/apps/red-ui/src/app/modules/file-preview/services/pdf-proxy.service.ts b/apps/red-ui/src/app/modules/file-preview/services/pdf-proxy.service.ts index e7f53ac51..edfa6f2a0 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/pdf-proxy.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/pdf-proxy.service.ts @@ -9,7 +9,7 @@ import { } from '@models/file/manual-redaction-entry.wrapper'; import { AnnotationDrawService } from '../../pdf-viewer/services/annotation-draw.service'; import { UserPreferenceService } from '@users/user-preference.service'; -import { BASE_HREF_FN, getCurrentUser, IqserPermissionsService, isJustOne, shareDistinctLast } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; import { toPosition } from '../utils/pdf-calculation.utils'; import { MultiSelectService } from './multi-select.service'; import { FilePreviewStateService } from './file-preview-state.service'; @@ -35,11 +35,21 @@ import { PdfAnnotationActionsService } from './pdf-annotation-actions.service'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { Roles } from '@users/roles'; import { AnnotationActionsService } from './annotation-actions.service'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { BASE_HREF_FN, isJustOne, shareDistinctLast } from '@iqser/common-ui/lib/utils'; import Annotation = Core.Annotations.Annotation; import Quad = Core.Math.Quad; @Injectable() export class PdfProxyService { + private readonly _convertPath = inject(BASE_HREF_FN); + readonly #visibilityOffIcon = this._convertPath('/assets/icons/general/visibility-off.svg'); + readonly #visibilityIcon = this._convertPath('/assets/icons/general/visibility.svg'); + readonly #falsePositiveIcon = this._convertPath('/assets/icons/general/pdftron-action-false-positive.svg'); + readonly #addRedactionIcon = this._iqserPermissionsService.has(Roles.getRss) + ? this._convertPath('/assets/icons/general/pdftron-action-add-component.svg') + : this._convertPath('/assets/icons/general/pdftron-action-add-redaction.svg'); + readonly #addHintIcon = this._convertPath('/assets/icons/general/pdftron-action-add-hint.svg'); readonly annotationSelected$ = this.#annotationSelected$; readonly manualAnnotationRequested$ = new Subject(); readonly redactTextRequested$ = new Subject(); @@ -54,14 +64,6 @@ export class PdfProxyService { const isAllowed = this._permissionsService.canPerformAnnotationActions(this._state.file(), this._state.dossier()); return isAllowed && isStandard; }); - private readonly _convertPath = inject(BASE_HREF_FN); - readonly #visibilityOffIcon = this._convertPath('/assets/icons/general/visibility-off.svg'); - readonly #visibilityIcon = this._convertPath('/assets/icons/general/visibility.svg'); - readonly #falsePositiveIcon = this._convertPath('/assets/icons/general/pdftron-action-false-positive.svg'); - readonly #addRedactionIcon = this._iqserPermissionsService.has(Roles.getRss) - ? this._convertPath('/assets/icons/general/pdftron-action-add-component.svg') - : this._convertPath('/assets/icons/general/pdftron-action-add-redaction.svg'); - readonly #addHintIcon = this._convertPath('/assets/icons/general/pdftron-action-add-hint.svg'); constructor( private readonly _translateService: TranslateService, diff --git a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts index ed8be6319..eae50c4b3 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/skipped.service.ts @@ -1,11 +1,11 @@ import { effect, Injectable, Signal, signal } from '@angular/core'; -import { bool } from '@iqser/common-ui'; +import { bool } from '@iqser/common-ui/lib/utils'; import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; @Injectable() export class SkippedService { - readonly hideSkipped: Signal; readonly #hideSkipped = signal(false); + readonly hideSkipped: Signal; constructor(private readonly _annotationManager: REDAnnotationManager) { this.hideSkipped = this.#hideSkipped.asReadonly(); diff --git a/apps/red-ui/src/app/modules/file-preview/services/suggestions.service.ts b/apps/red-ui/src/app/modules/file-preview/services/suggestions.service.ts index 806c69ac2..3730ae6e0 100644 --- a/apps/red-ui/src/app/modules/file-preview/services/suggestions.service.ts +++ b/apps/red-ui/src/app/modules/file-preview/services/suggestions.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { bool } from '@iqser/common-ui'; +import { bool } from '@iqser/common-ui/lib/utils'; import { Core } from '@pdftron/webviewer'; import { REDAnnotationManager } from '../../pdf-viewer/services/annotation-manager.service'; import { UserPreferenceService } from '@users/user-preference.service'; diff --git a/apps/red-ui/src/app/modules/file-preview/utils/constants.ts b/apps/red-ui/src/app/modules/file-preview/utils/constants.ts index 2d2dc7cfd..087c3f576 100644 --- a/apps/red-ui/src/app/modules/file-preview/utils/constants.ts +++ b/apps/red-ui/src/app/modules/file-preview/utils/constants.ts @@ -1,4 +1,4 @@ -import { List, ValuesOf } from '@iqser/common-ui'; +import { List, ValuesOf } from '@iqser/common-ui/lib/utils'; export const ActionsHelpModeKeys = { redaction: 'redaction', diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts index 7599b054e..0e0ca0860 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-draw.service.ts @@ -9,7 +9,7 @@ import { IRectangle, ISectionGrid, ISectionRectangle, SuperTypes } from '@red/do import { firstValueFrom } from 'rxjs'; import { PdfViewer } from './pdf-viewer.service'; import { REDAnnotationManager } from './annotation-manager.service'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { REDDocumentViewer } from './document-viewer.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import Annotation = Core.Annotations.Annotation; diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts index 2394c07bb..3a02cb459 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/annotation-manager.service.ts @@ -1,6 +1,6 @@ import { Injectable, signal } from '@angular/core'; import { Core } from '@pdftron/webviewer'; -import type { List } from '@iqser/common-ui'; +import type { List } from '@iqser/common-ui/lib/utils'; import { AnnotationPredicate, DeleteAnnotationsOptions } from '../utils/types'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { fromEvent, Observable } from 'rxjs'; @@ -13,13 +13,12 @@ import Annotation = Core.Annotations.Annotation; @Injectable() export class REDAnnotationManager { + readonly #hidden = signal(new Set()); + #manager: AnnotationManager; annotationSelected$: Observable<[Annotation[], string]>; resizingAnnotationId?: string = undefined; - readonly #hidden = signal(new Set()); readonly hidden = this.#hidden.asReadonly(); - #manager: AnnotationManager; - get selected() { return this.#manager.getSelectedAnnotations(); } diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/document-viewer.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/document-viewer.service.ts index 9d2aabf60..65724b262 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/document-viewer.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/document-viewer.service.ts @@ -6,7 +6,7 @@ import { filter, tap } from 'rxjs/operators'; import { ActivatedRoute } from '@angular/router'; import { PdfViewer } from './pdf-viewer.service'; import { UserPreferenceService } from '@users/user-preference.service'; -import { log } from '@iqser/common-ui'; +import { log } from '@iqser/common-ui/lib/utils'; import { stopAndPrevent, stopAndPreventIfNotAllowed } from '../utils/functions'; import { RotationType, RotationTypes } from '@red/domain'; import { AnnotationToolNames } from '../utils/constants'; @@ -17,22 +17,20 @@ import Quad = Core.Math.Quad; @Injectable() export class REDDocumentViewer { - readonly loaded$: Observable; - keyUp$: Observable; - readonly selectedText: Signal; - readonly loaded: Signal; - readonly pageComplete: Signal; - #document: DocumentViewer; readonly #loaded = signal(false); readonly #pageComplete = signal(undefined); readonly #selectedText = signal(''); - readonly #logger = inject(NGXLogger); readonly #userPreferenceService = inject(UserPreferenceService); readonly #pdf = inject(PdfViewer); readonly #activatedRoute = inject(ActivatedRoute); readonly #ngZone = inject(NgZone); + readonly loaded$: Observable; + keyUp$: Observable; + readonly selectedText: Signal; + readonly loaded: Signal; + readonly pageComplete: Signal; constructor() { this.loaded = this.#loaded.asReadonly(); diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts index 31c4d6dc4..40944b5ba 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/pdf-viewer.service.ts @@ -1,6 +1,6 @@ import { DestroyRef, inject, Injectable, signal, Signal } from '@angular/core'; import WebViewer, { Core, WebViewerInstance, WebViewerOptions } from '@pdftron/webviewer'; -import { BASE_HREF_FN, ErrorService, getConfig, shareDistinctLast } from '@iqser/common-ui'; +import { ErrorService, getConfig } from '@iqser/common-ui'; import { AppConfig, File, IHeaderElement } from '@red/domain'; import { ActivatedRoute } from '@angular/router'; import { map, startWith } from 'rxjs/operators'; @@ -15,6 +15,7 @@ import { UserPreferenceService } from '@users/user-preference.service'; import { environment } from '@environments/environment'; import { takeUntilDestroyed, toObservable, toSignal } from '@angular/core/rxjs-interop'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { BASE_HREF_FN, shareDistinctLast } from '@iqser/common-ui/lib/utils'; import TextTool = Core.Tools.TextTool; import Annotation = Core.Annotations.Annotation; import TextHighlightAnnotation = Core.Annotations.TextHighlightAnnotation; @@ -23,21 +24,6 @@ import Quad = Core.Math.Quad; @Injectable() export class PdfViewer { - readonly currentPage$ = inject(ActivatedRoute).queryParamMap.pipe( - map(params => Number(params.get('page') ?? '1')), - shareDistinctLast(), - ); - readonly currentPage = toSignal(this.currentPage$); - - documentViewer: DocumentViewer; - - fileId: string; - dossierId: string; - - pageChanged$: Observable; - readonly isCompareMode: Signal; - readonly totalPages: Signal; - private readonly _convertPath = inject(BASE_HREF_FN); #instance: WebViewerInstance; readonly #licenseKey = inject(LicenseService).activeLicenseKey; @@ -55,6 +41,17 @@ export class PdfViewer { }; readonly #destroyRef = inject(DestroyRef); readonly #totalPages = signal(0); + readonly currentPage$ = inject(ActivatedRoute).queryParamMap.pipe( + map(params => Number(params.get('page') ?? '1')), + shareDistinctLast(), + ); + readonly currentPage = toSignal(this.currentPage$); + documentViewer: DocumentViewer; + fileId: string; + dossierId: string; + pageChanged$: Observable; + readonly isCompareMode: Signal; + readonly totalPages: Signal; constructor( private readonly _logger: NGXLogger, diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/readable-redactions.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/readable-redactions.service.ts index c9417bee2..d0bbfbbb7 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/readable-redactions.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/readable-redactions.service.ts @@ -1,5 +1,4 @@ import { inject, Injectable } from '@angular/core'; -import { BASE_HREF_FN } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { HeaderElements } from '../../file-preview/utils/constants'; @@ -8,15 +7,16 @@ import { REDAnnotationManager } from './annotation-manager.service'; import { AnnotationDrawService } from './annotation-draw.service'; import { BehaviorSubject, Observable } from 'rxjs'; import { Core } from '@pdftron/webviewer'; +import { BASE_HREF_FN } from '@iqser/common-ui/lib/utils'; import Annotation = Core.Annotations.Annotation; @Injectable() export class ReadableRedactionsService { - readonly active$: Observable; private readonly _convertPath = inject(BASE_HREF_FN); readonly #enableIcon = this._convertPath('/assets/icons/general/redaction-preview.svg'); readonly #disableIcon = this._convertPath('/assets/icons/general/redaction-final.svg'); readonly #active$ = new BehaviorSubject(true); + readonly active$: Observable; constructor( private readonly _pdf: PdfViewer, diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/tooltips.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/tooltips.service.ts index 945d64bbb..d4918dd23 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/tooltips.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/tooltips.service.ts @@ -3,9 +3,9 @@ import { UserPreferenceService } from '@users/user-preference.service'; import { HeaderElements } from '../../file-preview/utils/constants'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { TranslateService } from '@ngx-translate/core'; -import { BASE_HREF_FN } from '@iqser/common-ui'; import { PdfViewer } from './pdf-viewer.service'; import { REDDocumentViewer } from './document-viewer.service'; +import { BASE_HREF_FN } from '@iqser/common-ui/lib/utils'; @Injectable() export class TooltipsService { diff --git a/apps/red-ui/src/app/modules/pdf-viewer/services/viewer-header.service.ts b/apps/red-ui/src/app/modules/pdf-viewer/services/viewer-header.service.ts index 2375b1c05..30a65c431 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/services/viewer-header.service.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/services/viewer-header.service.ts @@ -2,7 +2,7 @@ import { inject, Injectable, NgZone } from '@angular/core'; import { IHeaderElement, RotationTypes } from '@red/domain'; import { HeaderElements, HeaderElementType } from '../../file-preview/utils/constants'; import { TranslateService } from '@ngx-translate/core'; -import { BASE_HREF_FN, IqserPermissionsService } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; import { TooltipsService } from './tooltips.service'; import { PageRotationService } from './page-rotation.service'; import { PdfViewer } from './pdf-viewer.service'; @@ -14,6 +14,7 @@ import { ViewerEvent, VisibilityChangedEvent } from '../utils/types'; import { ReadableRedactionsService } from './readable-redactions.service'; import { filter, map, tap } from 'rxjs/operators'; import { Roles } from '@users/roles'; +import { BASE_HREF_FN } from '@iqser/common-ui/lib/utils'; const divider: IHeaderElement = { type: 'divider', @@ -21,8 +22,6 @@ const divider: IHeaderElement = { @Injectable() export class ViewerHeaderService { - readonly events$: Observable; - toggleLoadAnnotations$: Observable; readonly #convertPath = inject(BASE_HREF_FN); readonly #iqserPermissionService = inject(IqserPermissionsService); #buttons: Map; @@ -40,6 +39,8 @@ export class ViewerHeaderService { ]); #docBeforeCompare: Blob; readonly #events$ = new Subject(); + readonly events$: Observable; + toggleLoadAnnotations$: Observable; constructor( private readonly _filesMapService: FilesMapService, diff --git a/apps/red-ui/src/app/modules/pdf-viewer/utils/constants.ts b/apps/red-ui/src/app/modules/pdf-viewer/utils/constants.ts index 18de282ff..06321a60a 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/utils/constants.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/utils/constants.ts @@ -1,6 +1,7 @@ -import { CustomError, List } from '@iqser/common-ui'; +import { CustomError } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { HeaderElements, TextPopups } from '../../file-preview/utils/constants'; +import { List } from '@iqser/common-ui/lib/utils'; export const ROTATION_BUTTONS = [HeaderElements.ROTATE_LEFT_BUTTON, HeaderElements.ROTATE_RIGHT_BUTTON]; export const ROTATION_ACTION_BUTTONS = [HeaderElements.APPLY_ROTATION, HeaderElements.DISCARD_ROTATION]; diff --git a/apps/red-ui/src/app/modules/pdf-viewer/utils/functions.ts b/apps/red-ui/src/app/modules/pdf-viewer/utils/functions.ts index 74239b114..356021ce2 100644 --- a/apps/red-ui/src/app/modules/pdf-viewer/utils/functions.ts +++ b/apps/red-ui/src/app/modules/pdf-viewer/utils/functions.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { ALLOWED_KEYBOARD_SHORTCUTS } from './constants'; diff --git a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts index 5ba409269..fff7c1e2f 100644 --- a/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts +++ b/apps/red-ui/src/app/modules/search/search-item-template/search-item-template.component.ts @@ -1,7 +1,7 @@ import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from '@angular/core'; import { workflowFileStatusTranslations } from '@translations/file-status-translations'; import { ISearchListItem } from '@red/domain'; -import { escapeHtml } from '@iqser/common-ui'; +import { escapeHtml } from '@iqser/common-ui/lib/utils'; import { getDossierRouterLink } from '@utils/router-links'; @Component({ diff --git a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts index 6bd587d2f..017076a13 100644 --- a/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts +++ b/apps/red-ui/src/app/modules/search/search-screen/search-screen.component.ts @@ -1,15 +1,5 @@ import { ChangeDetectionStrategy, Component, OnDestroy } from '@angular/core'; -import { - IFilterGroup, - keyChecker, - ListingComponent, - listingProvidersFactory, - LoadingService, - NestedFilter, - SearchPositions, - SortingOrders, - TableColumnConfig, -} from '@iqser/common-ui'; +import { ListingComponent, listingProvidersFactory, LoadingService, SearchPositions, TableColumnConfig } from '@iqser/common-ui'; import { combineLatest, Observable, of } from 'rxjs'; import { debounceTime, map, startWith, switchMap, tap } from 'rxjs/operators'; import { ActivatedRoute, Router } from '@angular/router'; @@ -33,6 +23,8 @@ import { FeaturesService } from '@services/features.service'; import { DossiersCacheService } from '@services/dossiers/dossiers-cache.service'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; import { UserService } from '@users/user.service'; +import { IFilterGroup, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering'; +import { SortingOrders } from '@iqser/common-ui/lib/sorting'; @Component({ templateUrl: './search-screen.component.html', 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 1a6943185..f6232c367 100644 --- a/apps/red-ui/src/app/modules/search/search.module.ts +++ b/apps/red-ui/src/app/modules/search/search.module.ts @@ -2,10 +2,11 @@ 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, TenantPipe } from '@iqser/common-ui'; +import { IqserListingModule, 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'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes = [{ path: '', component: SearchScreenComponent }]; diff --git a/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts index ca07bbd07..49e2b55a6 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/components/dossiers-listing-actions/dossiers-listing-actions.component.ts @@ -1,6 +1,6 @@ import { Component, Input, OnChanges } from '@angular/core'; import { PermissionsService } from '@services/permissions.service'; -import { CircleButtonTypes, getCurrentUser, IqserPermissionsService, ScrollableParentViews } from '@iqser/common-ui'; +import { CircleButtonTypes, IqserPermissionsService, ScrollableParentViews } from '@iqser/common-ui'; import type { Dossier, File, User } from '@red/domain'; import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { LongPressEvent } from '@shared/directives/long-press.directive'; @@ -8,6 +8,7 @@ import { UserPreferenceService } from '@users/user-preference.service'; import { FilesMapService } from '@services/files/files-map.service'; import { ReanalysisService } from '@services/reanalysis.service'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; @Component({ selector: 'redaction-dossiers-listing-actions [dossier]', diff --git a/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts index 7efcbda12..44690834d 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/components/file-actions/file-actions.component.ts @@ -5,10 +5,8 @@ import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { CircleButtonType, CircleButtonTypes, - getCurrentUser, IConfirmationDialogData, IqserPermissionsService, - IqserTooltipPositions, LoadingService, TenantsService, Toaster, @@ -33,6 +31,8 @@ import { Roles } from '@users/roles'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { toObservable } from '@angular/core/rxjs-interop'; import { setLocalStorageDataByFileId } from '@utils/local-storage'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { IqserTooltipPositions } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-file-actions', @@ -40,20 +40,19 @@ import { setLocalStorageDataByFileId } from '@utils/local-storage'; styleUrls: ['./file-actions.component.scss'], }) export class FileActionsComponent implements OnChanges { + @ViewChild(ExpandableFileActionsComponent) + private readonly _expandableActionsComponent: ExpandableFileActionsComponent; @Input({ required: true }) file: File; @Input({ required: true }) dossier: Dossier; @Input({ required: true }) type: 'file-preview' | 'dossier-overview-list' | 'dossier-overview-workflow'; @Input() maxWidth: number; @Input() minWidth: number; @Input() fileActionsHelpModeKey: 'document_features_in_dossier' | 'editor_document_features' = 'document_features_in_dossier'; - readonly circleButtonTypes = CircleButtonTypes; readonly currentUser = getCurrentUser(); - toggleTooltip?: string; assignTooltip?: string; buttonType?: CircleButtonType; - showSetToNew = false; showUndoApproval = false; showAssignToSelf = false; @@ -80,9 +79,6 @@ export class FileActionsComponent implements OnChanges { tooltipPosition = IqserTooltipPositions.above; buttons: Action[]; - @ViewChild(ExpandableFileActionsComponent) - private readonly _expandableActionsComponent: ExpandableFileActionsComponent; - constructor( private readonly _injector: Injector, private readonly _filesService: FilesService, diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts index 1d2b8f2d8..2ac3bf1ea 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts @@ -1,7 +1,7 @@ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { UserService } from '@users/user.service'; -import { getCurrentUser, IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; +import { IconButtonTypes, LoadingService, Toaster } from '@iqser/common-ui'; import { FormBuilder, Validators } from '@angular/forms'; import { File, User, WorkflowFileStatus, WorkflowFileStatuses } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -9,6 +9,7 @@ import { FilesService } from '@services/files/files.service'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { PermissionsService } from '@services/permissions.service'; import { moveElementInArray } from '@utils/functions'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; class DialogData { targetStatus: WorkflowFileStatus; diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts index 104924c9a..c8c1d00a3 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts @@ -8,7 +8,7 @@ import { PermissionsService } from '@services/permissions.service'; import { firstValueFrom, Observable } from 'rxjs'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { WatermarksMapService } from '@services/entity-services/watermarks-map.service'; -import { ContextComponent, shareLast } from '@iqser/common-ui'; +import { ContextComponent, shareLast } from '@iqser/common-ui/lib/utils'; import { Roles } from '@users/roles'; interface EditDossierDownloadPackageContext { @@ -24,6 +24,7 @@ export class EditDossierDownloadPackageComponent extends ContextComponent implements OnInit, EditDossierSectionInterface { + #existsWatermarks$: Observable; form: FormGroup; downloadTypes: { key: DownloadFileType; label: string }[] = ['ORIGINAL', 'PREVIEW', 'DELTA_PREVIEW', 'REDACTED'].map( (type: DownloadFileType) => ({ @@ -32,10 +33,8 @@ export class EditDossierDownloadPackageComponent }), ); availableReportTypes: IReportTemplate[] = []; - readonly roles = Roles; @Input() dossier: Dossier; - #existsWatermarks$: Observable; constructor( private readonly _dossiersService: DossiersService, diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index ece30b9ba..d787fca08 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -4,14 +4,7 @@ import { Dossier, User } from '@red/domain'; import { EditDossierGeneralInfoComponent } from './general-info/edit-dossier-general-info.component'; import { EditDossierDownloadPackageComponent } from './download-package/edit-dossier-download-package.component'; import { EditDossierSectionInterface } from './edit-dossier-section.interface'; -import { - BaseDialogComponent, - ConfirmOptions, - getCurrentUser, - IconButtonTypes, - IqserPermissionsService, - SaveOptions, -} from '@iqser/common-ui'; +import { BaseDialogComponent, ConfirmOptions, IconButtonTypes, IqserPermissionsService, SaveOptions } from '@iqser/common-ui'; import { EditDossierDictionaryComponent } from './dictionary/edit-dossier-dictionary.component'; import { EditDossierAttributesComponent } from './attributes/edit-dossier-attributes.component'; @@ -23,6 +16,7 @@ import { PermissionsService } from '@services/permissions.service'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { dossiersServiceProvider } from '@services/entity-services/dossiers.service.provider'; import { Roles } from '@users/roles'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'members' | 'dossierAttributes'; @@ -40,6 +34,8 @@ interface NavItem { providers: [dossiersServiceProvider], }) export class EditDossierDialogComponent extends BaseDialogComponent implements AfterViewInit { + readonly #currentUser = getCurrentUser(); + private _dossier: Dossier; readonly roles = Roles; navItems: NavItem[] = []; readonly iconButtonTypes = IconButtonTypes; @@ -50,8 +46,6 @@ export class EditDossierDialogComponent extends BaseDialogComponent implements A @ViewChild(EditDossierDictionaryComponent) dictionaryComponent: EditDossierDictionaryComponent; @ViewChild(EditDossierTeamComponent) membersComponent: EditDossierTeamComponent; @ViewChild(EditDossierAttributesComponent) attributesComponent: EditDossierAttributesComponent; - readonly #currentUser = getCurrentUser(); - private _dossier: Dossier; constructor( readonly iqserPermissionsService: IqserPermissionsService, diff --git a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts index e64a0671b..ad1fa12a5 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/dialogs/edit-dossier-dialog/edit-dossier-team/edit-dossier-team.component.ts @@ -8,8 +8,8 @@ import { PermissionsService } from '@services/permissions.service'; import { DossiersService } from '@services/dossiers/dossiers.service'; import { compareLists } from '@utils/functions'; import { FilesService } from '@services/files/files.service'; -import { Debounce } from '@iqser/common-ui'; import { map } from 'rxjs/operators'; +import { Debounce } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-edit-dossier-team', @@ -18,16 +18,16 @@ import { map } from 'rxjs/operators'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class EditDossierTeamComponent implements EditDossierSectionInterface, OnChanges { - form = this.#getForm(); - searchQuery = ''; - @Input() dossier: Dossier; - membersSelectOptions: string[] = []; readonly #userService = inject(UserService); readonly #dossiersService = inject(DossiersService); readonly #permissionsService = inject(PermissionsService); readonly #filesService = inject(FilesService); - readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id); + form = this.#getForm(); readonly #formValue$ = this.form.valueChanges; + searchQuery = ''; + @Input() dossier: Dossier; + membersSelectOptions: string[] = []; + readonly ownersSelectOptions = this.#userService.all.filter(u => u.isManager).map(m => m.id); readonly selectedReviewers$ = this.#formValue$.pipe(map(v => v.members.filter(m => !v.approvers.includes(m)))); readonly selectedApprovers$ = this.#formValue$.pipe(map(v => v.approvers)); diff --git a/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts b/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts index 06a9f335b..e661a3b6a 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/services/file-assign.service.ts @@ -3,9 +3,10 @@ import { Dossier, File, User, WorkflowFileStatus, WorkflowFileStatuses } from '@ import { DossiersDialogService } from './dossiers-dialog.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FilesService } from '@services/files/files.service'; -import { getCurrentUser, IConfirmationDialogData, LoadingService, Toaster } from '@iqser/common-ui'; +import { IConfirmationDialogData, LoadingService, Toaster } from '@iqser/common-ui'; import { ActiveDossiersService } from '@services/dossiers/active-dossiers.service'; import { firstValueFrom } from 'rxjs'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; const atLeastOneAssignee = (files: File[]) => files.reduce((acc, fs) => acc || !!fs.assignee, false); diff --git a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts b/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts index 6e1627e3b..247bbf31b 100644 --- a/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts +++ b/apps/red-ui/src/app/modules/shared-dossiers/shared-dossiers.module.ts @@ -22,7 +22,6 @@ import { IqserAllowDirective, IqserDenyDirective, IqserHelpModeModule, - IqserUsersModule, RoundCheckboxComponent, SideNavComponent, SmallChipComponent, @@ -31,6 +30,7 @@ import { } from '@iqser/common-ui'; import { TranslateModule } from '@ngx-translate/core'; import { DossiersListingActionsComponent } from './components/dossiers-listing-actions/dossiers-listing-actions.component'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const components = [ FileActionsComponent, diff --git a/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts b/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts index eabc22a63..c1bc526cc 100644 --- a/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/assign-user-dropdown/assign-user-dropdown.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core'; import { UserService } from '@users/user.service'; import { User } from '@red/domain'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-assign-user-dropdown', @@ -10,11 +10,11 @@ import { List } from '@iqser/common-ui'; changeDetection: ChangeDetectionStrategy.OnPush, }) export class AssignUserDropdownComponent { + private _currentUser: User | string; oldUser: User | string; @Input() options: List; @Output() readonly save = new EventEmitter(); @Output() readonly cancel = new EventEmitter(); - private _currentUser: User | string; constructor(private readonly _userService: UserService) {} diff --git a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts index 9ea29d8c1..8f35df1a1 100644 --- a/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dictionary-manager/dictionary-manager.component.ts @@ -1,5 +1,5 @@ import { ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, SimpleChanges, ViewChild } from '@angular/core'; -import { Debounce, IconButtonTypes, List, LoadingService } from '@iqser/common-ui'; +import { IconButtonTypes, LoadingService } from '@iqser/common-ui'; import { Dictionary, DICTIONARY_TYPE_KEY_MAP, DictionaryType, Dossier, DossierTemplate } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionaryService } from '@services/entity-services/dictionary.service'; @@ -8,6 +8,7 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem import { EditorComponent } from '@shared/components/editor/editor.component'; import { DictionariesMapService } from '@services/entity-services/dictionaries-map.service'; import { saveAs } from 'file-saver'; +import { Debounce, List } from '@iqser/common-ui/lib/utils'; import IModelDeltaDecoration = monaco.editor.IModelDeltaDecoration; import FindMatch = monaco.editor.FindMatch; @@ -24,6 +25,8 @@ const HELP_MODE_KEYS = { styleUrls: ['./dictionary-manager.component.scss'], }) export class DictionaryManagerComponent implements OnChanges { + private _searchDecorations: string[] = []; + readonly #currentTab = window.location.href.split('/').pop(); @Input() type: DictionaryType = 'dictionary'; @Input() entityType?: string; @Input() withFloatingActions = true; @@ -34,9 +37,7 @@ export class DictionaryManagerComponent implements OnChanges { @Input() isLeavingPage = false; @Output() readonly saveDictionary = new EventEmitter(); @ViewChild(EditorComponent) readonly editor: EditorComponent; - readonly iconButtonTypes = IconButtonTypes; - currentMatch = 0; findMatches: FindMatch[] = []; diffEditorText = ''; @@ -46,12 +47,10 @@ export class DictionaryManagerComponent implements OnChanges { selectDictionary = { label: _('dictionary-overview.compare.select-dictionary'), } as Dictionary; + #compareDictionary = this.selectDictionary; selectDossierTemplate = { name: _('dictionary-overview.compare.select-dossier-template') } as DossierTemplate; compare: false; dictionaries: List = this.#dictionaries; - private _searchDecorations: string[] = []; - readonly #currentTab = window.location.href.split('/').pop(); - #compareDictionary = this.selectDictionary; constructor( private readonly _dictionaryService: DictionaryService, diff --git a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts index 5b2c6d94a..40bbf9e92 100644 --- a/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/donut-chart/donut-chart.component.ts @@ -1,10 +1,12 @@ import { Component, EventEmitter, Input, OnChanges, OnInit, Optional, Output } from '@angular/core'; import { DonutChartConfig } from '@red/domain'; -import { FilterService, get, INestedFilter, IqserHelpModeModule, shareLast, StatusBarComponent } from '@iqser/common-ui'; +import { IqserHelpModeModule, StatusBarComponent } from '@iqser/common-ui'; import { Observable, of } from 'rxjs'; import { map } from 'rxjs/operators'; import { AsyncPipe, NgForOf, NgIf } from '@angular/common'; import { MatSelectModule } from '@angular/material/select'; +import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; +import { get, shareLast } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-donut-chart', @@ -33,6 +35,10 @@ export class DonutChartComponent implements OnChanges, OnInit { size = 0; filters$: Observable; + constructor(@Optional() readonly filterService: FilterService) { + // TODO: move this component to a separate module, split into smaller components, improve filters + } + get circumference(): number { return 2 * Math.PI * this.radius; } @@ -45,10 +51,6 @@ export class DonutChartComponent implements OnChanges, OnInit { return this.totalType === 'sum' ? this.dataTotal : this.config.length; } - constructor(@Optional() readonly filterService: FilterService) { - // TODO: move this component to a separate module, split into smaller components, improve filters - } - ngOnInit() { const filterModels$ = this.filterService?.getFilterModels$(this.filterKey).pipe( map(filters => filters ?? []), diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts index 0d0028068..c46dc98ef 100644 --- a/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dossier-name-column/dossier-name-column.component.ts @@ -1,9 +1,9 @@ import { ChangeDetectionStrategy, Component, Input } from '@angular/core'; import { DossierStats, IDossier } from '@red/domain'; import { DossierTemplatesService } from '@services/dossier-templates/dossier-templates.service'; -import { List, ScrollableParentView, ScrollableParentViews } from '@iqser/common-ui'; import dayjs from 'dayjs'; import { dateWithoutTime } from '@utils/functions'; +import { List } from '@iqser/common-ui/lib/utils'; const DUE_DATE_WARN_DAYS = 14; diff --git a/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts b/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts index bf29d44b6..14b47c44d 100644 --- a/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dossier-watermark-selector/watermark-selector.component.ts @@ -1,11 +1,12 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges } from '@angular/core'; import { BehaviorSubject, Observable } from 'rxjs'; -import { FormFieldComponent, shareLast } from '@iqser/common-ui'; +import { FormFieldComponent } from '@iqser/common-ui'; import { filter, map, tap } from 'rxjs/operators'; import { NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms'; import { Watermark } from '@red/domain'; import { WatermarksMapService } from '@services/entity-services/watermarks-map.service'; import { MatCheckboxChange } from '@angular/material/checkbox'; +import { shareLast } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-watermark-selector [dossierTemplateId] [label]', @@ -26,13 +27,13 @@ import { MatCheckboxChange } from '@angular/material/checkbox'; ], }) export class WatermarkSelectorComponent extends FormFieldComponent implements OnChanges { + #watermarks: Watermark[] = []; + readonly #dossierTemplateId$ = new BehaviorSubject(null); @Input() dossierTemplateId: string; @Input() label: string; @Input() isReadonly: boolean; readonly watermarks$: Observable; watermarksMap = new Map(); - #watermarks: Watermark[] = []; - readonly #dossierTemplateId$ = new BehaviorSubject(null); constructor(private readonly _watermarksMapService: WatermarksMapService) { super(); diff --git a/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts b/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts index b3fd3e003..3febb956a 100644 --- a/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/dossiers-type-switch/dossiers-type-switch.component.ts @@ -1,7 +1,7 @@ import { ChangeDetectionStrategy, Component, inject } from '@angular/core'; import { ARCHIVE_ROUTE, DOSSIER_TEMPLATE_ID, DOSSIERS_ROUTE } from '@red/domain'; import { DashboardStatsService } from '@services/dossier-templates/dashboard-stats.service'; -import { getParam } from '@iqser/common-ui'; +import { getParam } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-dossiers-type-switch', diff --git a/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts b/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts index 43a7dc865..97ccc3f9c 100644 --- a/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/editor/editor.component.ts @@ -1,9 +1,10 @@ import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { List, LoadingService, OnChange } from '@iqser/common-ui'; +import { LoadingService } from '@iqser/common-ui'; import { EditorThemeService } from '@services/editor-theme.service'; import { Subject } from 'rxjs'; import { debounceTime, filter, tap } from 'rxjs/operators'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; +import { List, OnChange } from '@iqser/common-ui/lib/utils'; import IStandaloneEditorConstructionOptions = monaco.editor.IStandaloneEditorConstructionOptions; import ICodeEditor = monaco.editor.ICodeEditor; import IDiffEditor = monaco.editor.IDiffEditor; @@ -29,11 +30,14 @@ const notZero = (lineChange: ILineChange) => lineChange.originalEndLineNumber != styleUrls: ['./editor.component.scss'], }) export class EditorComponent implements OnInit, OnChanges { + #initialEntriesSet = new Set(); + private _diffEditor: IDiffEditor; + private _decorations: string[] = []; + protected readonly _editorTextChanged$ = new Subject(); @Input() showDiffEditor = false; @Input() diffEditorText: string; @Input() @OnChange('revert') initialEntries: List; @Input() canEdit = false; - /** * Used as [modified] input on diff editor * Shouldn't be updated when editing in diff editor. @@ -42,10 +46,6 @@ export class EditorComponent implements OnInit, OnChanges { editorOptions: IStandaloneEditorConstructionOptions = {}; codeEditor: ICodeEditor; value: string; - protected readonly _editorTextChanged$ = new Subject(); - #initialEntriesSet = new Set(); - private _diffEditor: IDiffEditor; - private _decorations: string[] = []; constructor(private readonly _loadingService: LoadingService, private readonly _editorThemeService: EditorThemeService) { const textChanged$ = this._editorTextChanged$.pipe( diff --git a/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts b/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts index 8fcf207a8..0e802282b 100644 --- a/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/expandable-file-actions/expandable-file-actions.component.ts @@ -1,11 +1,12 @@ import { Component, Input, OnChanges, SimpleChanges, ViewChild } from '@angular/core'; import { Action, ActionTypes, Dossier, File } from '@red/domain'; -import { CircleButtonType, IqserDialog, IqserTooltipPosition, TenantsService, Toaster, trackByFactory } from '@iqser/common-ui'; +import { CircleButtonType, IqserDialog, TenantsService, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FileDownloadService } from '@upload-download/services/file-download.service'; import { PermissionsService } from '@services/permissions.service'; import { MatMenuTrigger } from '@angular/material/menu'; import { DownloadDialogComponent } from '@shared/dialogs/download-dialog/download-dialog.component'; +import { IqserTooltipPosition, trackByFactory } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-expandable-file-actions', diff --git a/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts b/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts index 797059be8..71981ce8b 100644 --- a/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/file-name-column/file-name-column.component.ts @@ -1,9 +1,9 @@ import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { PrimaryFileAttributeService } from '@services/primary-file-attribute.service'; import { FileAttributes } from '@red/domain'; -import { ContextComponent } from '@iqser/common-ui'; import { FileAttributesService } from '@services/entity-services/file-attributes.service'; import { combineLatest, map, ReplaySubject } from 'rxjs'; +import { ContextComponent } from '@iqser/common-ui/lib/utils'; interface PartialFile { readonly isError: boolean; @@ -27,9 +27,9 @@ interface FileNameColumnContext { changeDetection: ChangeDetectionStrategy.OnPush, }) export class FileNameColumnComponent extends ContextComponent implements OnInit, OnChanges { + readonly #reloadAttribute = new ReplaySubject(1); @Input() file: PartialFile; @Input() dossierTemplateId: string; - readonly #reloadAttribute = new ReplaySubject(1); constructor( private readonly _fileAttributeService: FileAttributesService, diff --git a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts index b2fdc9a8b..9272c9f73 100644 --- a/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/team-members/team-members.component.ts @@ -1,9 +1,11 @@ import { Component, ElementRef, EventEmitter, inject, Input, OnChanges, Output, ViewChild } from '@angular/core'; -import { CircleButtonTypes, getCurrentUser, List } from '@iqser/common-ui'; +import { CircleButtonTypes } from '@iqser/common-ui'; import { DossiersDialogService } from '../../../shared-dossiers/services/dossiers-dialog.service'; import { Roles } from '@users/roles'; import { User } from '@red/domain'; import { UserService } from '@users/user.service'; +import { getCurrentUser } from '@iqser/common-ui/lib/users'; +import { List } from '@iqser/common-ui/lib/utils'; @Component({ selector: 'redaction-team-members', diff --git a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts index f75245113..1df39b876 100644 --- a/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts +++ b/apps/red-ui/src/app/modules/shared/components/type-filter/type-filter.component.ts @@ -1,8 +1,8 @@ import { Component, Input, OnChanges } from '@angular/core'; -import { INestedFilter } from '@iqser/common-ui'; import { SuperTypes } from '@red/domain'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import { TranslateService } from '@ngx-translate/core'; +import { INestedFilter } from '@iqser/common-ui/lib/filtering'; @Component({ selector: 'redaction-type-filter [dossierTemplateId]', @@ -10,12 +10,6 @@ import { TranslateService } from '@ngx-translate/core'; styleUrls: ['./type-filter.component.scss'], }) export class TypeFilterComponent implements OnChanges { - @Input() filter: INestedFilter; - @Input() dossierTemplateId: string; - @Input() dossierId: string; - - label: string; - private _suggestionsKeys: string[] = [ SuperTypes.SuggestionRemove, SuperTypes.SuggestionForceRedaction, @@ -26,6 +20,10 @@ export class TypeFilterComponent implements OnChanges { 'suggestion', ]; private _needsAnalysisKeys: string[] = ['remove-only-here', 'analysis']; + @Input() filter: INestedFilter; + @Input() dossierTemplateId: string; + @Input() dossierId: string; + label: string; constructor(private readonly _defaultColorsService: DefaultColorsService, private readonly _translateService: TranslateService) {} diff --git a/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts b/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts index 6459b005d..806d188a4 100644 --- a/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts +++ b/apps/red-ui/src/app/modules/shared/dialogs/download-dialog/download-dialog.component.ts @@ -4,8 +4,9 @@ import { downloadTypesForDownloadTranslations } from '@translations/download-typ import { ReportTemplateService } from '@services/report-template.service'; import { AbstractControl, FormBuilder } from '@angular/forms'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; -import { IconButtonTypes, IqserDialogComponent, List } from '@iqser/common-ui'; +import { IconButtonTypes, IqserDialogComponent } from '@iqser/common-ui'; import { Roles } from '@users/roles'; +import { List } from '@iqser/common-ui/lib/utils'; export interface DownloadDialogData { readonly dossier: Dossier; diff --git a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts index 315d9de5d..c633e678a 100644 --- a/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts +++ b/apps/red-ui/src/app/modules/shared/pipes/date.pipe.ts @@ -1,7 +1,7 @@ import { Inject, LOCALE_ID, Pipe, PipeTransform } from '@angular/core'; import { TranslateService } from '@ngx-translate/core'; import { DatePipe as BaseDatePipe } from '@angular/common'; -import { getLeftDateTime } from '@iqser/common-ui'; +import { getLeftDateTime } from '@iqser/common-ui/lib/utils'; import dayjs from 'dayjs'; @Pipe({ diff --git a/apps/red-ui/src/app/modules/shared/shared.module.ts b/apps/red-ui/src/app/modules/shared/shared.module.ts index 4009a8470..7b57efef5 100644 --- a/apps/red-ui/src/app/modules/shared/shared.module.ts +++ b/apps/red-ui/src/app/modules/shared/shared.module.ts @@ -15,7 +15,6 @@ import { IqserAllowDirective, IqserDenyDirective, IqserHelpModeModule, - IqserUsersModule, SmallChipComponent, StopPropagationDirective, } from '@iqser/common-ui'; @@ -47,6 +46,7 @@ import { WatermarkSelectorComponent } from './components/dossier-watermark-selec import { OcrProgressBarComponent } from './components/ocr-progress-bar/ocr-progress-bar.component'; import { DownloadDialogComponent } from './dialogs/download-dialog/download-dialog.component'; import { CustomDateAdapter } from '@shared/CustomDateAdapter'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const buttons = [FileDownloadBtnComponent]; diff --git a/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts b/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts index fd09a00c3..42848bc46 100644 --- a/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts +++ b/apps/red-ui/src/app/modules/trash/trash-screen/trash-screen.component.ts @@ -1,12 +1,5 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; -import { - CircleButtonTypes, - ListingComponent, - listingProvidersFactory, - LoadingService, - SortingOrders, - TableColumnConfig, -} from '@iqser/common-ui'; +import { CircleButtonTypes, ListingComponent, listingProvidersFactory, LoadingService, TableColumnConfig } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { firstValueFrom, Observable } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; @@ -14,6 +7,7 @@ import { RouterHistoryService } from '@services/router-history.service'; import { TrashItem } from '@red/domain'; import { TrashService } from '@services/entity-services/trash.service'; import { TrashDialogService } from '../services/trash-dialog.service'; +import { SortingOrders } from '@iqser/common-ui/lib/sorting'; @Component({ templateUrl: './trash-screen.component.html', 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 aa1cfe00e..7bd88b50e 100644 --- a/apps/red-ui/src/app/modules/trash/trash.module.ts +++ b/apps/red-ui/src/app/modules/trash/trash.module.ts @@ -2,11 +2,12 @@ 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, TenantPipe } from '@iqser/common-ui'; +import { CircleButtonComponent, IqserListingModule, 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'; import { TranslateModule } from '@ngx-translate/core'; +import { IqserUsersModule } from '@iqser/common-ui/lib/users'; const routes = [{ path: '', component: TrashScreenComponent }]; diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts index 460e55592..881a61d29 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-download.service.ts @@ -3,8 +3,9 @@ import { DownloadStatus, IDownloadStatus, IDownloadStatusResponse, IPrepareDownl import { firstValueFrom, Observable } from 'rxjs'; import { ConfigService } from '@services/config.service'; import { map, tap } from 'rxjs/operators'; -import { EntitiesService, mapEach, TenantsService } from '@iqser/common-ui'; +import { EntitiesService, TenantsService } from '@iqser/common-ui'; import { NGXLogger } from 'ngx-logger'; +import { mapEach } from '@iqser/common-ui/lib/utils'; @Injectable() export class FileDownloadService extends EntitiesService { diff --git a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts index 2a85dda07..a324624e8 100644 --- a/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts +++ b/apps/red-ui/src/app/modules/upload-download/services/file-upload.service.ts @@ -6,12 +6,13 @@ import { ConfigService } from '@services/config.service'; import { TranslateService } from '@ngx-translate/core'; import { IFileUploadResult, OverwriteFileOption, OverwriteFileOptions } from '@red/domain'; import { isAcceptedFileType, isCsv, isZip } from '@utils/file-drop-utils'; -import { ErrorMessageService, GenericService, HeadersConfiguration, Toaster } from '@iqser/common-ui'; +import { ErrorMessageService, GenericService, Toaster } from '@iqser/common-ui'; import { FilesMapService } from '@services/files/files-map.service'; import { switchMap, tap, throttleTime } from 'rxjs/operators'; import { FilesService } from '@services/files/files.service'; import { UploadDownloadDialogService } from './upload-download-dialog.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { HeadersConfiguration } from '@iqser/common-ui/lib/utils'; export interface ActiveUpload { subscription: Subscription; @@ -21,15 +22,14 @@ export interface ActiveUpload { @Injectable() export class FileUploadService extends GenericService implements OnDestroy { static readonly MAX_PARALLEL_UPLOADS = 5; + #pendingUploads: FileUploadModel[] = []; + #activeUploads: ActiveUpload[] = []; + readonly #fetchFiles$ = new Subject(); + readonly #subscriptions = new Subscription(); + protected readonly _defaultModelPath = 'upload'; files: FileUploadModel[] = []; groupedFiles: { [key: string]: FileUploadModel[] } = {}; activeUploads = 0; - protected readonly _defaultModelPath = 'upload'; - #pendingUploads: FileUploadModel[] = []; - #activeUploads: ActiveUpload[] = []; - - readonly #fetchFiles$ = new Subject(); - readonly #subscriptions = new Subscription(); constructor( private readonly _filesService: FilesService, diff --git a/apps/red-ui/src/app/services/breadcrumbs.service.ts b/apps/red-ui/src/app/services/breadcrumbs.service.ts index 5233556ef..a2a2242f4 100644 --- a/apps/red-ui/src/app/services/breadcrumbs.service.ts +++ b/apps/red-ui/src/app/services/breadcrumbs.service.ts @@ -1,5 +1,5 @@ import { Injectable, Injector } from '@angular/core'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { ActivatedRouteSnapshot, IsActiveMatchOptions, NavigationEnd, Router } from '@angular/router'; import { BehaviorSubject, Observable, of } from 'rxjs'; import { filter, pluck } from 'rxjs/operators'; @@ -32,8 +32,8 @@ export type Breadcrumbs = List; providedIn: 'root', }) export class BreadcrumbsService { - readonly breadcrumbs$: Observable; readonly #store$ = new BehaviorSubject([]); + readonly breadcrumbs$: Observable; constructor( private readonly _injector: Injector, diff --git a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts index 3fab25c8c..80a7de45c 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dashboard-stats.service.ts @@ -1,9 +1,10 @@ -import { EntitiesService, mapEach } from '@iqser/common-ui'; +import { EntitiesService } from '@iqser/common-ui'; import { DashboardStats, IDashboardStats } from '@red/domain'; import { inject, Injectable } from '@angular/core'; import { Observable } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; import { DossierStatesService } from '../entity-services/dossier-states.service'; +import { mapEach } from '@iqser/common-ui/lib/utils'; const templatesSorter = (a: DashboardStats, b: DashboardStats) => { if (!a.isEmpty && b.isEmpty) { @@ -18,11 +19,10 @@ const templatesSorter = (a: DashboardStats, b: DashboardStats) => { providedIn: 'root', }) export class DashboardStatsService extends EntitiesService { + readonly #dossierStatesService = inject(DossierStatesService); protected readonly _defaultModelPath = 'dossier-template/stats'; protected readonly _entityClass = DashboardStats; - readonly #dossierStatesService = inject(DossierStatesService); - loadAll(): Observable { return this.getAll(this._defaultModelPath).pipe( mapEach(entity => new DashboardStats(entity)), diff --git a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts index 9d3fc3d8c..001ea18b3 100644 --- a/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts +++ b/apps/red-ui/src/app/services/dossier-templates/dossier-templates.service.ts @@ -1,4 +1,4 @@ -import { EntitiesService, List, mapEach, Toaster } from '@iqser/common-ui'; +import { EntitiesService, Toaster } from '@iqser/common-ui'; import { DossierTemplate, IDossierTemplate } from '@red/domain'; import { Injectable } from '@angular/core'; import { firstValueFrom, forkJoin, Observable, of } from 'rxjs'; @@ -10,6 +10,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DictionaryService } from '../entity-services/dictionary.service'; import { DefaultColorsService } from '@services/entity-services/default-colors.service'; import { WatermarkService } from '@services/entity-services/watermark.service'; +import { List, mapEach } from '@iqser/common-ui/lib/utils'; const DOSSIER_TEMPLATE_CONFLICT_MSG = _('dossier-templates-listing.error.conflict'); const GENERIC_MSG = _('dossier-templates-listing.error.generic'); diff --git a/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts b/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts index d8f0ad4a6..59ff85819 100644 --- a/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts +++ b/apps/red-ui/src/app/services/dossiers/dossier-changes.service.ts @@ -1,4 +1,4 @@ -import { GenericService, LAST_CHECKED_OFFSET, List, QueryParam, ROOT_CHANGES_KEY } from '@iqser/common-ui'; +import { GenericService, LAST_CHECKED_OFFSET, QueryParam, ROOT_CHANGES_KEY } from '@iqser/common-ui'; import { Dossier, DossierStats, IDossierChanges } from '@red/domain'; import { forkJoin, Observable, of, Subscription, throwError, timer } from 'rxjs'; import { catchError, filter, map, switchMap, take, tap } from 'rxjs/operators'; @@ -9,16 +9,16 @@ import { ArchivedDossiersService } from './archived-dossiers.service'; import { inject, Injectable, OnDestroy } from '@angular/core'; import { DashboardStatsService } from '../dossier-templates/dashboard-stats.service'; import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; +import { List } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root' }) export class DossiersChangesService extends GenericService implements OnDestroy { - protected readonly _defaultModelPath = 'dossier'; readonly #subscription = new Subscription(); - readonly #activeDossiersService = inject(ActiveDossiersService); readonly #archivedDossiersService = inject(ArchivedDossiersService); readonly #dashboardStatsService = inject(DashboardStatsService); readonly #logger = inject(NGXLogger); + protected readonly _defaultModelPath = 'dossier'; loadOnlyChanged(): Observable { const removeIfNotFound = (id: string) => diff --git a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts index deeda58bf..23393b67c 100644 --- a/apps/red-ui/src/app/services/dossiers/dossiers.service.ts +++ b/apps/red-ui/src/app/services/dossiers/dossiers.service.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/member-ordering */ -import { EntitiesService, mapEach, Toaster } from '@iqser/common-ui'; +import { EntitiesService, Toaster } from '@iqser/common-ui'; import { Dossier, DossierStats, IDossier, IDossierChanges, IDossierRequest } from '@red/domain'; import { Observable, of, Subject } from 'rxjs'; import { catchError, map, switchMap, tap } from 'rxjs/operators'; @@ -8,18 +8,19 @@ import { DossierStatsService } from './dossier-stats.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { DashboardStatsService } from '../dossier-templates/dashboard-stats.service'; +import { mapEach } from '@iqser/common-ui/lib/utils'; const CONFLICT_MSG = _('add-dossier-dialog.errors.dossier-already-exists'); const GENERIC_MSG = _('add-dossier-dialog.errors.generic'); export abstract class DossiersService extends EntitiesService { - readonly dossierFileChanges$ = new Subject(); - abstract readonly routerPath: string; protected readonly _dossierStatsService = inject(DossierStatsService); protected readonly _dashboardStatsService = inject(DashboardStatsService); protected readonly _toaster = inject(Toaster); protected readonly _entityClass = Dossier; protected abstract readonly _defaultModelPath: string; + readonly dossierFileChanges$ = new Subject(); + abstract readonly routerPath: string; createOrUpdate(dossier: IDossierRequest): Observable { const showToast = (error: HttpErrorResponse) => { diff --git a/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts index 09bd2dccf..f753cd5c0 100644 --- a/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts +++ b/apps/red-ui/src/app/services/entity-permissions/entity-permissions.service.ts @@ -1,19 +1,19 @@ import { inject, Injectable } from '@angular/core'; -import { GenericService, mapEach } from '@iqser/common-ui'; +import { GenericService } from '@iqser/common-ui'; import { IPermissionsMapping, PermissionsMapping } from '@red/domain'; import { firstValueFrom, Observable } from 'rxjs'; import { switchMap, tap } from 'rxjs/operators'; import { PermissionsConfigurationMapService } from './permissions-configuration-map.service'; import { PermissionsMapService } from './permissions-map.service'; +import { mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', }) export class EntityPermissionsService extends GenericService { - protected readonly _defaultModelPath = 'permissions'; - readonly #permissionsConfigurationMapService = inject(PermissionsConfigurationMapService); readonly #permissionsMapService = inject(PermissionsMapService); + protected readonly _defaultModelPath = 'permissions'; loadConfigFor(targetObject: string): Observable { return this._http.get(`/${this._serviceName}/${this._defaultModelPath}/${targetObject}/mapping`).pipe( diff --git a/apps/red-ui/src/app/services/entity-services/default-colors.service.ts b/apps/red-ui/src/app/services/entity-services/default-colors.service.ts index 127c15a5f..dbc5a6f7f 100644 --- a/apps/red-ui/src/app/services/entity-services/default-colors.service.ts +++ b/apps/red-ui/src/app/services/entity-services/default-colors.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; -import { EntitiesService, mapEach } from '@iqser/common-ui'; +import { EntitiesService } from '@iqser/common-ui'; import { DefaultColors, DefaultColorType, IDefaultColors } from '@red/domain'; import { forkJoin, Observable } from 'rxjs'; import { map, switchMap, tap } from 'rxjs/operators'; +import { mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts index 46277ea1c..56cfdb919 100644 --- a/apps/red-ui/src/app/services/entity-services/dictionary.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dictionary.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; import { firstValueFrom, forkJoin, Observable, throwError } from 'rxjs'; -import { EntitiesService, List, QueryParam, Toaster } from '@iqser/common-ui'; +import { EntitiesService, QueryParam, Toaster } from '@iqser/common-ui'; import { Dictionary, DictionaryEntryType, DictionaryEntryTypes, IDictionary, IUpdateDictionary, SuperTypes } from '@red/domain'; import { catchError, map, switchMap, tap } from 'rxjs/operators'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; @@ -9,6 +9,7 @@ import { DictionariesMapService } from './dictionaries-map.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { FALLBACK_COLOR } from '@utils/constants'; import { DossierDictionariesMapService } from '@services/entity-services/dossier-dictionaries-map.service'; +import { List } from '@iqser/common-ui/lib/utils'; const MIN_WORD_LENGTH = 2; diff --git a/apps/red-ui/src/app/services/entity-services/dossier-attributes.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-attributes.service.ts index 2b7ad34e6..96e5eb509 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-attributes.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-attributes.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; import { Dossier, DossierAttributeConfig, DossierAttributeWithValue, IDossierAttribute, IDossierAttributeConfig } from '@red/domain'; import { firstValueFrom, Observable } from 'rxjs'; -import { EntitiesService, List, mapEach } from '@iqser/common-ui'; +import { EntitiesService } from '@iqser/common-ui'; import { map, tap } from 'rxjs/operators'; +import { List, mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts index e50468aa4..a10efcb51 100644 --- a/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts +++ b/apps/red-ui/src/app/services/entity-services/dossier-states.service.ts @@ -1,5 +1,5 @@ import { inject, Injectable } from '@angular/core'; -import { EntitiesService, mapEach, Toaster } from '@iqser/common-ui'; +import { EntitiesService, Toaster } from '@iqser/common-ui'; import { DossierState, IDossierState } from '@red/domain'; import { EMPTY, firstValueFrom, forkJoin, Observable, switchMap } from 'rxjs'; import { DossierTemplatesService } from '../dossier-templates/dossier-templates.service'; @@ -7,6 +7,7 @@ import { catchError, defaultIfEmpty, tap } from 'rxjs/operators'; import { DossierStatesMapService } from '../entity-services/dossier-states-map.service'; import { HttpErrorResponse, HttpStatusCode } from '@angular/common/http'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { mapEach } from '@iqser/common-ui/lib/utils'; const CONFLICT_MSG = _('dossier-states-listing.error.conflict'); const GENERIC_MSG = _('dossier-states-listing.error.generic'); @@ -15,12 +16,11 @@ const GENERIC_MSG = _('dossier-states-listing.error.generic'); providedIn: 'root', }) export class DossierStatesService extends EntitiesService { - protected readonly _defaultModelPath = 'dossier-status'; - protected readonly _entityClass = DossierState; - readonly #toaster = inject(Toaster); readonly #dossierTemplatesService = inject(DossierTemplatesService); readonly #dossierStatesMapService = inject(DossierStatesMapService); + protected readonly _defaultModelPath = 'dossier-status'; + protected readonly _entityClass = DossierState; async createOrUpdate(state: IDossierState) { const showToast = (error: HttpErrorResponse) => { diff --git a/apps/red-ui/src/app/services/entity-services/file-attributes.service.ts b/apps/red-ui/src/app/services/entity-services/file-attributes.service.ts index f42f701c0..5b478953d 100644 --- a/apps/red-ui/src/app/services/entity-services/file-attributes.service.ts +++ b/apps/red-ui/src/app/services/entity-services/file-attributes.service.ts @@ -1,8 +1,9 @@ -import { EntitiesService, List } from '@iqser/common-ui'; +import { EntitiesService } from '@iqser/common-ui'; import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, of } from 'rxjs'; import { catchError, tap } from 'rxjs/operators'; import { FileAttributeConfig, FileAttributes, IFileAttributeConfig, IFileAttributesConfig } from '@red/domain'; +import { List } from '@iqser/common-ui/lib/utils'; export type FileAttributesConfigMap = Readonly>; @@ -10,10 +11,10 @@ export type FileAttributesConfigMap = Readonly { - readonly fileAttributesConfig$ = new BehaviorSubject({}); - readonly isEditingFileAttribute$ = new BehaviorSubject(false); protected readonly _defaultModelPath = 'fileAttributes'; protected readonly _entityClass = FileAttributeConfig; + readonly fileAttributesConfig$ = new BehaviorSubject({}); + readonly isEditingFileAttribute$ = new BehaviorSubject(false); /** * Get the file attributes that can be used at importing csv. 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 ea2da9f94..921c40d9f 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 @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { EntitiesService, List, mapEach, QueryParam, Toaster } from '@iqser/common-ui'; +import { EntitiesService, QueryParam, Toaster } from '@iqser/common-ui'; import { Dossier, File, IDossier, IFile, TrashDossier, TrashFile, TrashItem } from '@red/domain'; import { catchError, switchMap, take, tap } from 'rxjs/operators'; import { forkJoin, map, Observable, of } from 'rxjs'; @@ -12,6 +12,7 @@ import { DossierStatsService } from '../dossiers/dossier-stats.service'; import { FilesService } from '../files/files.service'; import { SystemPreferencesService } from '@services/system-preferences.service'; import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service'; +import { List, mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/entity-services/watermark.service.ts b/apps/red-ui/src/app/services/entity-services/watermark.service.ts index decb17bce..a88897203 100644 --- a/apps/red-ui/src/app/services/entity-services/watermark.service.ts +++ b/apps/red-ui/src/app/services/entity-services/watermark.service.ts @@ -1,9 +1,10 @@ import { inject, Injectable } from '@angular/core'; -import { GenericService, mapEach, QueryParam } from '@iqser/common-ui'; +import { GenericService, QueryParam } from '@iqser/common-ui'; import { IWatermark, Watermark } from '@red/domain'; import { firstValueFrom, forkJoin, Observable } from 'rxjs'; import { map, tap } from 'rxjs/operators'; import { WatermarksMapService } from '@services/entity-services/watermarks-map.service'; +import { mapEach } from '@iqser/common-ui/lib/utils'; interface IsUsedResponse { value: boolean; @@ -13,8 +14,8 @@ interface IsUsedResponse { providedIn: 'root', }) export class WatermarkService extends GenericService { - protected readonly _defaultModelPath = 'watermark'; readonly #watermarksMapService = inject(WatermarksMapService); + protected readonly _defaultModelPath = 'watermark'; async deleteWatermark(dossierTemplateId: string, watermarkId: number) { await firstValueFrom(super.delete(null, `${this._defaultModelPath}/${watermarkId}`)); diff --git a/apps/red-ui/src/app/services/files/file-management.service.ts b/apps/red-ui/src/app/services/files/file-management.service.ts index c742b4dea..c8462183c 100644 --- a/apps/red-ui/src/app/services/files/file-management.service.ts +++ b/apps/red-ui/src/app/services/files/file-management.service.ts @@ -1,17 +1,18 @@ -import { GenericService, HeadersConfiguration, List, QueryParam } from '@iqser/common-ui'; +import { GenericService, QueryParam } from '@iqser/common-ui'; import { inject, Injectable } from '@angular/core'; import { HttpEvent, HttpHeaders, HttpResponse } from '@angular/common/http'; import { Observable } from 'rxjs'; import { switchMap } from 'rxjs/operators'; import { FilesService } from './files.service'; import { File, IPageRotationRequest } from '@red/domain'; +import { HeadersConfiguration, List } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', }) export class FileManagementService extends GenericService { - protected readonly _defaultModelPath = ''; readonly #filesService = inject(FilesService); + protected readonly _defaultModelPath = ''; delete(files: List, dossierId: string) { const fileIds = files.map(f => f.id); diff --git a/apps/red-ui/src/app/services/files/files-map.service.ts b/apps/red-ui/src/app/services/files/files-map.service.ts index 4d7ff84e0..97b72b6e9 100644 --- a/apps/red-ui/src/app/services/files/files-map.service.ts +++ b/apps/red-ui/src/app/services/files/files-map.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@angular/core'; import { File, IFile } from '@red/domain'; -import { EntitiesMapService, NonFunctionKeys } from '@iqser/common-ui'; +import { EntitiesMapService } from '@iqser/common-ui'; +import { NonFunctionKeys } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root' }) export class FilesMapService extends EntitiesMapService { diff --git a/apps/red-ui/src/app/services/files/files.service.ts b/apps/red-ui/src/app/services/files/files.service.ts index b177c6c6c..34ffe30f2 100644 --- a/apps/red-ui/src/app/services/files/files.service.ts +++ b/apps/red-ui/src/app/services/files/files.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@angular/core'; -import { EntitiesService, isArray, List, mapEach, QueryParam } from '@iqser/common-ui'; +import { EntitiesService, isArray, QueryParam } from '@iqser/common-ui'; import { File, IFile } from '@red/domain'; import { firstValueFrom } from 'rxjs'; import { UserService } from '@users/user.service'; @@ -7,6 +7,7 @@ import { FilesMapService } from './files-map.service'; import { map, switchMap, tap } from 'rxjs/operators'; import { DossierStatsService } from '../dossiers/dossier-stats.service'; import { NGXLogger } from 'ngx-logger'; +import { List, mapEach } from '@iqser/common-ui/lib/utils'; const asList = (value: T | List): List => (isArray(value) ? value : [value]); diff --git a/apps/red-ui/src/app/services/files/redaction-import.service.ts b/apps/red-ui/src/app/services/files/redaction-import.service.ts index fc5451b62..22d3ea1cb 100644 --- a/apps/red-ui/src/app/services/files/redaction-import.service.ts +++ b/apps/red-ui/src/app/services/files/redaction-import.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; -import { GenericService, HeadersConfiguration } from '@iqser/common-ui'; +import { GenericService } from '@iqser/common-ui'; +import { HeadersConfiguration } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root' }) export class RedactionImportService extends GenericService { diff --git a/apps/red-ui/src/app/services/files/viewed-pages.service.ts b/apps/red-ui/src/app/services/files/viewed-pages.service.ts index 7db4f0875..a13f61dc0 100644 --- a/apps/red-ui/src/app/services/files/viewed-pages.service.ts +++ b/apps/red-ui/src/app/services/files/viewed-pages.service.ts @@ -1,8 +1,9 @@ import { Injectable } from '@angular/core'; -import { GenericService, mapEach } from '@iqser/common-ui'; +import { GenericService } from '@iqser/common-ui'; import { catchError, map } from 'rxjs/operators'; import { IViewedPage, IViewedPagesRequest, ViewedPage } from '@red/domain'; import { firstValueFrom, of } from 'rxjs'; +import { mapEach } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/services/notifications.service.ts b/apps/red-ui/src/app/services/notifications.service.ts index a6c54e82b..ddcf42191 100644 --- a/apps/red-ui/src/app/services/notifications.service.ts +++ b/apps/red-ui/src/app/services/notifications.service.ts @@ -1,5 +1,5 @@ import { Inject, Injectable, OnDestroy } from '@angular/core'; -import { BASE_HREF, EntitiesService, getConfig, List, mapEach, QueryParam, TenantsService } from '@iqser/common-ui'; +import { EntitiesService, getConfig, QueryParam, TenantsService } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { EMPTY, firstValueFrom, iif, merge, Observable, of, Subscription, timer } from 'rxjs'; import { AppConfig, Dossier, INotification, Notification, NotificationTypes } from '@red/domain'; @@ -10,6 +10,7 @@ import { UserService } from '@users/user.service'; import { CHANGED_CHECK_INTERVAL } from '@utils/constants'; import { DossiersCacheService } from './dossiers/dossiers-cache.service'; import dayjs from 'dayjs'; +import { BASE_HREF, List, mapEach } from '@iqser/common-ui/lib/utils'; const INCLUDE_SEEN = false; @@ -21,11 +22,10 @@ const NOTIFICATIONS_THRESHOLD = 1000; providedIn: 'root', }) export class NotificationsService extends EntitiesService implements OnDestroy { - protected readonly _defaultModelPath = 'notification'; - protected readonly _entityClass = Notification; - readonly #config = getConfig(); readonly #subscription = new Subscription(); + protected readonly _defaultModelPath = 'notification'; + protected readonly _entityClass = Notification; constructor( @Inject(BASE_HREF) private readonly _baseHref: string, diff --git a/apps/red-ui/src/app/services/reanalysis.service.ts b/apps/red-ui/src/app/services/reanalysis.service.ts index 74977606e..181ca4481 100644 --- a/apps/red-ui/src/app/services/reanalysis.service.ts +++ b/apps/red-ui/src/app/services/reanalysis.service.ts @@ -1,11 +1,12 @@ import { Injectable } from '@angular/core'; -import { GenericService, List, QueryParam, Toaster } from '@iqser/common-ui'; +import { GenericService, QueryParam, Toaster } from '@iqser/common-ui'; import { Dossier, File, IPageExclusionRequest } from '@red/domain'; import { catchError, tap } from 'rxjs/operators'; import { FilesService } from './files/files.service'; import { FilesMapService } from './files/files-map.service'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { firstValueFrom, of } from 'rxjs'; +import { List } from '@iqser/common-ui/lib/utils'; export interface ReanalyzeQueryParams { force?: boolean; diff --git a/apps/red-ui/src/app/services/report-template.service.ts b/apps/red-ui/src/app/services/report-template.service.ts index 792dad7ef..c2c835c2f 100644 --- a/apps/red-ui/src/app/services/report-template.service.ts +++ b/apps/red-ui/src/app/services/report-template.service.ts @@ -1,9 +1,10 @@ import { Injectable } from '@angular/core'; -import { GenericService, HeadersConfiguration } from '@iqser/common-ui'; +import { GenericService } from '@iqser/common-ui'; import { IPlaceholdersResponse, IReportTemplate } from '@red/domain'; import { firstValueFrom, Observable, of } from 'rxjs'; import { HttpResponse } from '@angular/common/http'; import { catchError, map } from 'rxjs/operators'; +import { HeadersConfiguration } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/translations/annotation-changes-translations.ts b/apps/red-ui/src/app/translations/annotation-changes-translations.ts index 999f8616b..cdc0a534f 100644 --- a/apps/red-ui/src/app/translations/annotation-changes-translations.ts +++ b/apps/red-ui/src/app/translations/annotation-changes-translations.ts @@ -1,6 +1,6 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { AnnotationWrapper } from '@models/file/annotation.wrapper'; -import { KeysOf } from '@iqser/common-ui'; +import { KeysOf } from '@iqser/common-ui/lib/utils'; export const annotationChangesTranslations: { [key in KeysOf]?: string } = { hasBeenResized: _('annotation-changes.resized'), diff --git a/apps/red-ui/src/app/translations/system-preferences-translations.ts b/apps/red-ui/src/app/translations/system-preferences-translations.ts index d2aaf0f93..c1a050298 100644 --- a/apps/red-ui/src/app/translations/system-preferences-translations.ts +++ b/apps/red-ui/src/app/translations/system-preferences-translations.ts @@ -1,6 +1,6 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { SystemPreferences } from '@red/domain'; -import { KeysOf } from '@iqser/common-ui'; +import { KeysOf } from '@iqser/common-ui/lib/utils'; export const systemPreferencesTranslations: Record<'label' | 'placeholder', Record, string>> = { label: { diff --git a/apps/red-ui/src/app/users/red-role.guard.ts b/apps/red-ui/src/app/users/red-role.guard.ts index f8c9d442f..8cb5a9746 100644 --- a/apps/red-ui/src/app/users/red-role.guard.ts +++ b/apps/red-ui/src/app/users/red-role.guard.ts @@ -1,17 +1,23 @@ import { inject, Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router'; -import { IqserPermissionsService, IqserRoleGuard } from '@iqser/common-ui'; +import { IqserPermissionsService } from '@iqser/common-ui'; +import { IqserRoleGuard } from '@iqser/common-ui/lib/users'; +import { UserService } from '@users/user.service'; +import { NGXLogger } from 'ngx-logger'; @Injectable({ providedIn: 'root', }) export class RedRoleGuard extends IqserRoleGuard { protected readonly _permissionsService = inject(IqserPermissionsService); + protected readonly _userService = inject(UserService); + protected readonly _logger = inject(NGXLogger); async canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Promise { const currentUser = this._userService.currentUser; if (!currentUser?.hasAnyRole) { + this._logger.warn('[GUARD] User has no roles, redirect to auth-error'); await this._router.navigate([`/${this._tenantsService.activeTenantId}/auth-error`]); this._loadingService.stop(); return false; @@ -19,6 +25,7 @@ export class RedRoleGuard extends IqserRoleGuard { // we have at least 1 RED Role -> if it's not user he must be an admin if (currentUser.isUserAdmin && !currentUser.isAdmin && state.url.includes('admin') && !state.url.includes('users')) { + this._logger.warn('[GUARD] Redirect to users page'); await this._router.navigate([`/${this._tenantsService.activeTenantId}/main/admin/users`]); return false; } @@ -40,6 +47,7 @@ export class RedRoleGuard extends IqserRoleGuard { if (!currentUser.isUser) { await this._router.navigate([`/${this._tenantsService.activeTenantId}/main/admin`]); } else { + this._logger.warn('[GUARD] Redirect to tenant route'); await this._router.navigate([`/${this._tenantsService.activeTenantId}`]); } return false; diff --git a/apps/red-ui/src/app/users/user.service.ts b/apps/red-ui/src/app/users/user.service.ts index f1a012108..aaf2a7074 100644 --- a/apps/red-ui/src/app/users/user.service.ts +++ b/apps/red-ui/src/app/users/user.service.ts @@ -1,8 +1,10 @@ import { inject, Injectable } from '@angular/core'; import { User } from '@red/domain'; -import { IIqserUser, IqserUserService, List, QueryParam } from '@iqser/common-ui'; +import { QueryParam } from '@iqser/common-ui'; import { Roles } from '@users/roles'; import { of } from 'rxjs'; +import { IIqserUser, IqserUserService } from '@iqser/common-ui/lib/users'; +import { List } from '@iqser/common-ui/lib/utils'; @Injectable({ providedIn: 'root', diff --git a/apps/red-ui/src/app/utils/csv-utils.ts b/apps/red-ui/src/app/utils/csv-utils.ts index 672960308..4f9edd3ac 100644 --- a/apps/red-ui/src/app/utils/csv-utils.ts +++ b/apps/red-ui/src/app/utils/csv-utils.ts @@ -1,5 +1,5 @@ -import { humanize } from '@iqser/common-ui'; import { saveAs } from 'file-saver'; +import { humanize } from '@iqser/common-ui/lib/utils'; function toCSVContent(lines: any[], keys: string[]) { return lines diff --git a/apps/red-ui/src/app/utils/filter-utils.ts b/apps/red-ui/src/app/utils/filter-utils.ts index c680682cf..939bde6a2 100644 --- a/apps/red-ui/src/app/utils/filter-utils.ts +++ b/apps/red-ui/src/app/utils/filter-utils.ts @@ -1,5 +1,5 @@ import { Dossier, File, User, UserType } from '@red/domain'; -import { handleCheckedValue, INestedFilter } from '@iqser/common-ui'; +import { handleCheckedValue, INestedFilter } from '@iqser/common-ui/lib/filtering'; export function handleFilterDelta(oldFilters: INestedFilter[], newFilters: INestedFilter[], allFilters: INestedFilter[]) { const newFiltersDelta = {}; diff --git a/apps/red-ui/src/app/utils/functions.ts b/apps/red-ui/src/app/utils/functions.ts index ed720c96f..b63b3aa2a 100644 --- a/apps/red-ui/src/app/utils/functions.ts +++ b/apps/red-ui/src/app/utils/functions.ts @@ -1,4 +1,4 @@ -import type { List } from '@iqser/common-ui'; +import type { List } from '@iqser/common-ui/lib/utils'; import { ITrackable } from '@iqser/common-ui'; import type { AnnotationWrapper } from '@models/file/annotation.wrapper'; import { Dayjs } from 'dayjs'; diff --git a/apps/red-ui/src/app/utils/main.resolver.ts b/apps/red-ui/src/app/utils/main.resolver.ts index 2ebc0f383..ad732fca3 100644 --- a/apps/red-ui/src/app/utils/main.resolver.ts +++ b/apps/red-ui/src/app/utils/main.resolver.ts @@ -5,7 +5,7 @@ import { UserService } from '@users/user.service'; import { SystemPreferencesService } from '@services/system-preferences.service'; import { UserPreferenceService } from '@users/user-preference.service'; import { LicenseService } from '@services/license.service'; -import { BASE_HREF, IqserPermissionsService, LoadingService, TenantsService } from '@iqser/common-ui'; +import { IqserPermissionsService, LoadingService, TenantsService } from '@iqser/common-ui'; import { FeaturesService } from '@services/features.service'; import { GeneralSettingsService } from '@services/general-settings.service'; import { tap } from 'rxjs/operators'; @@ -13,6 +13,7 @@ import { firstValueFrom } from 'rxjs'; import { Roles } from '@users/roles'; import { DossiersChangesService } from '@services/dossiers/dossier-changes.service'; import { ResolveFn } from '@angular/router'; +import { BASE_HREF } from '@iqser/common-ui/lib/utils'; function redirectToLastDossierTemplate(baseHref: string, tenant: string, lastDossierTemplate: string) { const lastUrlSegment = window.location.pathname.split('/').filter(Boolean).pop(); @@ -43,7 +44,6 @@ export const mainResolver: ResolveFn = async () => { const updatedDisplayName$ = generalConfig$.pipe(tap(config => configService.updateDisplayName(config.displayName))); await Promise.all([ - userService.initialize(), systemPreferencesService.loadPreferences(), userPreferenceService.reload(), firstValueFrom(updatedDisplayName$), diff --git a/libs/common-ui b/libs/common-ui index cc8d04065..8ac4bbfd9 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit cc8d040654ab4d3bc1e8e95368a69d495bb3b9b7 +Subproject commit 8ac4bbfd9fa98c9172bf2040c763cb934d7f00a7 diff --git a/libs/red-domain/src/lib/audit/audit.response.ts b/libs/red-domain/src/lib/audit/audit.response.ts index 31ebc9543..91c835167 100644 --- a/libs/red-domain/src/lib/audit/audit.response.ts +++ b/libs/red-domain/src/lib/audit/audit.response.ts @@ -1,5 +1,5 @@ import { IAudit } from './audit'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IAuditResponse { data: List; diff --git a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts index 8c5e2e5c1..329d8472f 100644 --- a/libs/red-domain/src/lib/dictionaries/dictionary.model.ts +++ b/libs/red-domain/src/lib/dictionaries/dictionary.model.ts @@ -1,6 +1,7 @@ -import { Entity, List } from '@iqser/common-ui'; +import { Entity } from '@iqser/common-ui'; import { IDictionary } from './dictionary'; import { DICTIONARY_TYPE_KEY_MAP, DictionaryType } from '../redaction-log'; +import { List } from '@iqser/common-ui/lib/utils'; export class Dictionary extends Entity implements IDictionary { readonly addToDictionaryAction: boolean; diff --git a/libs/red-domain/src/lib/dictionaries/dictionary.ts b/libs/red-domain/src/lib/dictionaries/dictionary.ts index bb525afe2..2a6261360 100644 --- a/libs/red-domain/src/lib/dictionaries/dictionary.ts +++ b/libs/red-domain/src/lib/dictionaries/dictionary.ts @@ -1,7 +1,7 @@ /** * Object containing a list of dictionary entries and colors of an entry type. */ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IDictionary { /** diff --git a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts index a70f48b9f..8e1ff4ace 100644 --- a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts +++ b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.model.ts @@ -1,7 +1,8 @@ -import { IListable, List } from '@iqser/common-ui'; +import { IListable } from '@iqser/common-ui'; import { CountByStatus, CountPerProcessingStatus, CountPerWorkflowStatus, IDashboardStats } from './dashboard-stats'; import { DonutChartConfig, StatusSorter } from '../shared'; import { DossierTemplateStatus, DossierTemplateStatuses } from './constants'; +import { List } from '@iqser/common-ui/lib/utils'; export class DashboardStats implements IListable, IDashboardStats { readonly dossierCountByStatus: List; diff --git a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts index cf90e0545..1118bf9ca 100644 --- a/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts +++ b/libs/red-domain/src/lib/dossier-templates/dashboard-stats.ts @@ -1,5 +1,5 @@ import { ProcessingFileStatus, WorkflowFileStatus } from '../files'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DossierTemplateStatus } from './constants'; interface Counter { diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts index 811a06cc9..6285071a3 100644 --- a/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts +++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.model.ts @@ -1,7 +1,8 @@ -import { IListable, List } from '@iqser/common-ui'; +import { IListable } from '@iqser/common-ui'; import { IDossierTemplate } from './dossier-template'; import { DownloadFileType } from '../shared'; import { DossierTemplateStatus, DossierTemplateStatuses } from './constants'; +import { List } from '@iqser/common-ui/lib/utils'; export class DossierTemplate implements IDossierTemplate, IListable { readonly createdBy: string; diff --git a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts index b92254a06..17719be09 100644 --- a/libs/red-domain/src/lib/dossier-templates/dossier-template.ts +++ b/libs/red-domain/src/lib/dossier-templates/dossier-template.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DownloadFileType } from '../shared'; import { DossierTemplateStatus } from './constants'; diff --git a/libs/red-domain/src/lib/dossiers/dossier.model.ts b/libs/red-domain/src/lib/dossiers/dossier.model.ts index c11c62a58..cc670c2fd 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.model.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.model.ts @@ -1,7 +1,8 @@ -import { IListable, List } from '@iqser/common-ui'; +import { IListable } from '@iqser/common-ui'; import { IDossier } from './dossier'; import { DownloadFileType } from '../shared'; import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from './constants'; +import { List } from '@iqser/common-ui/lib/utils'; export class Dossier implements IDossier, IListable { readonly dossierId: string; diff --git a/libs/red-domain/src/lib/dossiers/dossier.request.ts b/libs/red-domain/src/lib/dossiers/dossier.request.ts index d31e01c90..ce7d14935 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.request.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.request.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DownloadFileType } from '../shared'; /** diff --git a/libs/red-domain/src/lib/dossiers/dossier.ts b/libs/red-domain/src/lib/dossiers/dossier.ts index b99bebb6b..0c8a48f10 100644 --- a/libs/red-domain/src/lib/dossiers/dossier.ts +++ b/libs/red-domain/src/lib/dossiers/dossier.ts @@ -1,5 +1,5 @@ import { DownloadFileType } from '../shared'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IDossier { readonly approverIds: List; diff --git a/libs/red-domain/src/lib/downloads/download-status.model.ts b/libs/red-domain/src/lib/downloads/download-status.model.ts index 4b61210a8..7d42dae95 100644 --- a/libs/red-domain/src/lib/downloads/download-status.model.ts +++ b/libs/red-domain/src/lib/downloads/download-status.model.ts @@ -1,6 +1,7 @@ -import { IListable, List } from '@iqser/common-ui'; +import { IListable } from '@iqser/common-ui'; import { DownloadStatusType, IDownloadStatus } from './download-status'; import { DownloadFileType } from '../shared'; +import { List } from '@iqser/common-ui/lib/utils'; export class DownloadStatus implements IDownloadStatus, IListable { readonly storageId: string; diff --git a/libs/red-domain/src/lib/downloads/download-status.ts b/libs/red-domain/src/lib/downloads/download-status.ts index fc5b8f28a..23cf854a5 100644 --- a/libs/red-domain/src/lib/downloads/download-status.ts +++ b/libs/red-domain/src/lib/downloads/download-status.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DownloadFileType } from '../shared'; export interface IDownloadStatus { diff --git a/libs/red-domain/src/lib/downloads/prepare-download.request.ts b/libs/red-domain/src/lib/downloads/prepare-download.request.ts index 22f7295ef..daddcaa95 100644 --- a/libs/red-domain/src/lib/downloads/prepare-download.request.ts +++ b/libs/red-domain/src/lib/downloads/prepare-download.request.ts @@ -1,7 +1,7 @@ /** * Object containing information on which file and report types should be included in the download. */ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DownloadFileType } from '../shared'; export interface IPrepareDownloadRequest { diff --git a/libs/red-domain/src/lib/downloads/remove-download.request.ts b/libs/red-domain/src/lib/downloads/remove-download.request.ts index bef3953de..4a76e78fb 100644 --- a/libs/red-domain/src/lib/downloads/remove-download.request.ts +++ b/libs/red-domain/src/lib/downloads/remove-download.request.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IRemoveDownloadRequest { storageIds: List; diff --git a/libs/red-domain/src/lib/files/file-upload-result.ts b/libs/red-domain/src/lib/files/file-upload-result.ts index ff9182102..856201a94 100644 --- a/libs/red-domain/src/lib/files/file-upload-result.ts +++ b/libs/red-domain/src/lib/files/file-upload-result.ts @@ -1,7 +1,7 @@ /** * Object containing information about a successfully uploaded file. */ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IFileUploadResult { /** diff --git a/libs/red-domain/src/lib/files/super-types.ts b/libs/red-domain/src/lib/files/super-types.ts index 29ec299cc..f8794e157 100644 --- a/libs/red-domain/src/lib/files/super-types.ts +++ b/libs/red-domain/src/lib/files/super-types.ts @@ -1,4 +1,4 @@ -import { ValuesOf } from '@iqser/common-ui'; +import { ValuesOf } from '@iqser/common-ui/lib/utils'; export const SuperTypes = { TextHighlight: 'text-highlight', diff --git a/libs/red-domain/src/lib/files/types.ts b/libs/red-domain/src/lib/files/types.ts index 39341993f..7c5c081a2 100644 --- a/libs/red-domain/src/lib/files/types.ts +++ b/libs/red-domain/src/lib/files/types.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export const FILE_ID = 'fileId'; diff --git a/libs/red-domain/src/lib/geometry/section-grid.ts b/libs/red-domain/src/lib/geometry/section-grid.ts index 93d06e15f..a79532a23 100644 --- a/libs/red-domain/src/lib/geometry/section-grid.ts +++ b/libs/red-domain/src/lib/geometry/section-grid.ts @@ -1,5 +1,5 @@ import { ISectionRectangle } from './section-rectangle'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface ISectionGrid { rectanglesPerPage: Record>; diff --git a/libs/red-domain/src/lib/geometry/section-rectangle.ts b/libs/red-domain/src/lib/geometry/section-rectangle.ts index 4e0307779..f9d666b3f 100644 --- a/libs/red-domain/src/lib/geometry/section-rectangle.ts +++ b/libs/red-domain/src/lib/geometry/section-rectangle.ts @@ -1,5 +1,5 @@ import { ICellRectangle } from './cell-rectangle'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface ISectionRectangle extends ICellRectangle { numberOfParts?: number; diff --git a/libs/red-domain/src/lib/pages/page-exclusion.request.ts b/libs/red-domain/src/lib/pages/page-exclusion.request.ts index b77c01987..55f84ba16 100644 --- a/libs/red-domain/src/lib/pages/page-exclusion.request.ts +++ b/libs/red-domain/src/lib/pages/page-exclusion.request.ts @@ -1,5 +1,5 @@ import { IPageRange } from './page-range'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IPageExclusionRequest { pageRanges: List; diff --git a/libs/red-domain/src/lib/redaction-log/add-redaction.request.ts b/libs/red-domain/src/lib/redaction-log/add-redaction.request.ts index da708bad8..f7121dc86 100644 --- a/libs/red-domain/src/lib/redaction-log/add-redaction.request.ts +++ b/libs/red-domain/src/lib/redaction-log/add-redaction.request.ts @@ -1,5 +1,5 @@ import { IRectangle } from '../geometry'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { DictionaryEntryType } from './dictionary-entry-types'; export interface IAddRedactionRequest { diff --git a/libs/red-domain/src/lib/redaction-log/change.ts b/libs/red-domain/src/lib/redaction-log/change.ts index 0c7344274..8e6eb26e5 100644 --- a/libs/red-domain/src/lib/redaction-log/change.ts +++ b/libs/red-domain/src/lib/redaction-log/change.ts @@ -1,4 +1,4 @@ -import { ValuesOf } from '@iqser/common-ui'; +import { ValuesOf } from '@iqser/common-ui/lib/utils'; export interface IChange { dateTime: string; diff --git a/libs/red-domain/src/lib/redaction-log/types.ts b/libs/red-domain/src/lib/redaction-log/types.ts index 7e8965ff2..41116c670 100644 --- a/libs/red-domain/src/lib/redaction-log/types.ts +++ b/libs/red-domain/src/lib/redaction-log/types.ts @@ -1,4 +1,4 @@ -import { ValuesOf } from '@iqser/common-ui'; +import { ValuesOf } from '@iqser/common-ui/lib/utils'; export const LogEntryEngines = { DICTIONARY: 'DICTIONARY', diff --git a/libs/red-domain/src/lib/search/matched-document.ts b/libs/red-domain/src/lib/search/matched-document.ts index 6eba56b59..4d5522bc9 100644 --- a/libs/red-domain/src/lib/search/matched-document.ts +++ b/libs/red-domain/src/lib/search/matched-document.ts @@ -1,5 +1,5 @@ import { IMatchedSection } from './matched-section'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IMatchedDocument { containsAllMatchedSections?: boolean; diff --git a/libs/red-domain/src/lib/search/matched-section.ts b/libs/red-domain/src/lib/search/matched-section.ts index 2ec1893f8..db704f813 100644 --- a/libs/red-domain/src/lib/search/matched-section.ts +++ b/libs/red-domain/src/lib/search/matched-section.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface IMatchedSection { headline?: string; diff --git a/libs/red-domain/src/lib/search/search-input.ts b/libs/red-domain/src/lib/search/search-input.ts index 020d8bac9..af06fcf80 100644 --- a/libs/red-domain/src/lib/search/search-input.ts +++ b/libs/red-domain/src/lib/search/search-input.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { WorkflowFileStatus } from '../files'; export interface ISearchInput { diff --git a/libs/red-domain/src/lib/search/search-list-item.ts b/libs/red-domain/src/lib/search/search-list-item.ts index f8a815ddc..1cd7000d1 100644 --- a/libs/red-domain/src/lib/search/search-list-item.ts +++ b/libs/red-domain/src/lib/search/search-list-item.ts @@ -1,4 +1,5 @@ -import { IListable, List } from '@iqser/common-ui'; +import { IListable } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface ISearchListItem extends IListable { readonly dossierId: string; diff --git a/libs/red-domain/src/lib/search/search.request.ts b/libs/red-domain/src/lib/search/search.request.ts index a7d19af88..88462b42e 100644 --- a/libs/red-domain/src/lib/search/search.request.ts +++ b/libs/red-domain/src/lib/search/search.request.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { WorkflowFileStatus } from '../files'; export interface ISearchRequest { diff --git a/libs/red-domain/src/lib/search/search.response.ts b/libs/red-domain/src/lib/search/search.response.ts index 861d89ef9..adb4c418a 100644 --- a/libs/red-domain/src/lib/search/search.response.ts +++ b/libs/red-domain/src/lib/search/search.response.ts @@ -1,5 +1,5 @@ import { IMatchedDocument } from './matched-document'; -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; export interface ISearchResponse { matchedDocuments?: List; diff --git a/libs/red-domain/src/lib/shared/app-config.ts b/libs/red-domain/src/lib/shared/app-config.ts index 5b1728a55..343b6b097 100644 --- a/libs/red-domain/src/lib/shared/app-config.ts +++ b/libs/red-domain/src/lib/shared/app-config.ts @@ -1,4 +1,4 @@ -import { IqserAppConfig } from '@iqser/common-ui'; +import { IqserAppConfig } from '@iqser/common-ui/lib/utils'; export interface AppConfig extends IqserAppConfig { readonly ADMIN_CONTACT_NAME: string; diff --git a/libs/red-domain/src/lib/shared/pdf.types.ts b/libs/red-domain/src/lib/shared/pdf.types.ts index 2ce74eeb5..b4b41a5f8 100644 --- a/libs/red-domain/src/lib/shared/pdf.types.ts +++ b/libs/red-domain/src/lib/shared/pdf.types.ts @@ -1,4 +1,4 @@ -import { ValuesOf } from '@iqser/common-ui'; +import { ValuesOf } from '@iqser/common-ui/lib/utils'; export interface IBasicHeaderElement { readonly img?: string; diff --git a/libs/red-domain/src/lib/trash/trash-dossier.model.ts b/libs/red-domain/src/lib/trash/trash-dossier.model.ts index 2cf8d073c..e4baa3d31 100644 --- a/libs/red-domain/src/lib/trash/trash-dossier.model.ts +++ b/libs/red-domain/src/lib/trash/trash-dossier.model.ts @@ -1,4 +1,4 @@ -import { List } from '@iqser/common-ui'; +import { List } from '@iqser/common-ui/lib/utils'; import { IDossier } from '../dossiers'; import { TrashItem } from './trash.item'; diff --git a/libs/red-domain/src/lib/trash/trash.item.ts b/libs/red-domain/src/lib/trash/trash.item.ts index 68b4d025d..27256bb7c 100644 --- a/libs/red-domain/src/lib/trash/trash.item.ts +++ b/libs/red-domain/src/lib/trash/trash.item.ts @@ -1,5 +1,5 @@ -import { getLeftDateTime } from '@iqser/common-ui'; import * as dayjs from 'dayjs'; +import { getLeftDateTime } from '@iqser/common-ui/lib/utils'; export abstract class TrashItem { abstract readonly type: 'dossier' | 'file'; diff --git a/libs/red-domain/src/lib/users/user.model.ts b/libs/red-domain/src/lib/users/user.model.ts index e11761922..895743b4f 100644 --- a/libs/red-domain/src/lib/users/user.model.ts +++ b/libs/red-domain/src/lib/users/user.model.ts @@ -1,5 +1,6 @@ -import { IIqserUser, IqserUser, List } from '@iqser/common-ui'; import { KeycloakProfile } from 'keycloak-js'; +import { IIqserUser, IqserUser } from '@iqser/common-ui/lib/users'; +import { List } from '@iqser/common-ui/lib/utils'; export class User extends IqserUser { readonly isManager = this.has('RED_MANAGER'); diff --git a/tsconfig.json b/tsconfig.json index 4bd96eee4..8f7ec4bd3 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -23,6 +23,7 @@ "@guards/*": ["apps/red-ui/src/app/guards/*"], "@i18n/*": ["apps/red-ui/src/app/i18n/*"], "@iqser/common-ui": ["libs/common-ui/src/index.ts"], + "@iqser/common-ui/*": ["libs/common-ui/src/*"], "@models/*": ["apps/red-ui/src/app/models/*"], "@red/domain": ["libs/red-domain/src/index.ts"], "@services/*": ["apps/red-ui/src/app/services/*"],