diff --git a/apps/red-ui/src/app/components/base-screen/base-screen.component.html b/apps/red-ui/src/app/components/base-screen/base-screen.component.html index 30abc60e1..bb66bc9f6 100644 --- a/apps/red-ui/src/app/components/base-screen/base-screen.component.html +++ b/apps/red-ui/src/app/components/base-screen/base-screen.component.html @@ -3,25 +3,6 @@
- - 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 4f06ac46a..b97584730 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 @@ -9,6 +9,7 @@ import { TranslateService } from '@ngx-translate/core'; import { SpotlightSearchAction } from '@components/spotlight-search/spotlight-search-action'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { distinctUntilChanged, filter, map, startWith } from 'rxjs/operators'; +import { DossiersService } from '../../modules/dossier/services/dossiers.service'; interface MenuItem { readonly name: string; @@ -54,8 +55,8 @@ export class BaseScreenComponent { { text: this._translateService.instant('search.this-dossier'), icon: 'red:enter', - hide: (): boolean => !this.appStateService.activeDossier, - action: (query): void => this._search(query, this.appStateService.activeDossier.id) + hide: (): boolean => !this.dossiersService.activeDossier, + action: (query): void => this._search(query, this.dossiersService.activeDossierId) }, { text: this._translateService.instant('search.entire-platform'), @@ -74,6 +75,7 @@ export class BaseScreenComponent { constructor( readonly appStateService: AppStateService, + readonly dossiersService: DossiersService, readonly userService: UserService, readonly userPreferenceService: UserPreferenceService, readonly titleService: Title, 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 841ea9b8c..66b7a888c 100644 --- a/apps/red-ui/src/app/components/notifications/notifications.component.ts +++ b/apps/red-ui/src/app/components/notifications/notifications.component.ts @@ -8,6 +8,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { UserService } from '@services/user.service'; import { NotificationType, NotificationTypeEnum } from '@models/notification-types'; import { notificationsTranslations } from '../../translations/notifications-translations'; +import { DossiersService } from '../../modules/dossier/services/dossiers.service'; @Component({ selector: 'redaction-notifications', @@ -23,6 +24,7 @@ export class NotificationsComponent { private readonly _userService: UserService, private readonly _notificationControllerService: NotificationControllerService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _datePipe: DatePipe ) { this._notificationControllerService.getNotifications(false).subscribe((response: NotificationResponse) => { @@ -96,12 +98,12 @@ export class NotificationsComponent { } private _getDossierName(dossierId: string | undefined) { - const dossier = this._appStateService.getDossierById(dossierId); + const dossier = this._dossiersService.find(dossierId); return dossier?.dossierName || this._translateService.instant(_('dossier')); } private _getFileName(dossierId: string | undefined, fileId: string | undefined) { - const file = this._appStateService.getFileById(dossierId, fileId); + const file = this._dossiersService.find(dossierId, fileId); return file?.filename || this._translateService.instant(_('file')); } diff --git a/apps/red-ui/src/app/models/audit-model-wrapper.model.ts b/apps/red-ui/src/app/models/audit-model-wrapper.model.ts deleted file mode 100644 index e69de29bb..000000000 diff --git a/apps/red-ui/src/app/models/audit.model.ts b/apps/red-ui/src/app/models/audit.model.ts index d653e3099..76ca7d7ad 100644 --- a/apps/red-ui/src/app/models/audit.model.ts +++ b/apps/red-ui/src/app/models/audit.model.ts @@ -7,7 +7,7 @@ export class Audit implements IAudit, IListable { readonly details?: unknown; readonly message?: string; readonly objectId?: string; - readonly recordDate?: string; + readonly recordDate: string; readonly userId?: string; constructor(audit: IAudit) { @@ -20,7 +20,7 @@ export class Audit implements IAudit, IListable { this.userId = audit.userId; } - get id() { + get id(): string { return this.recordDate; } diff --git a/apps/red-ui/src/app/models/dictionary.ts b/apps/red-ui/src/app/models/dictionary.ts index bae65a716..53f4d6350 100644 --- a/apps/red-ui/src/app/models/dictionary.ts +++ b/apps/red-ui/src/app/models/dictionary.ts @@ -9,7 +9,7 @@ export class Dictionary implements IDictionary, IListable { readonly entries?: List; readonly hexColor?: string; readonly hint: boolean; - readonly label?: string; + readonly label: string; readonly rank?: number; readonly recommendation: boolean; diff --git a/apps/red-ui/src/app/models/file/file.ts b/apps/red-ui/src/app/models/file/file.ts index 2f7d82d22..01c718e09 100644 --- a/apps/red-ui/src/app/models/file/file.ts +++ b/apps/red-ui/src/app/models/file/file.ts @@ -11,17 +11,17 @@ const processingStatuses: List = [ ] as const; export class File implements IFile, IListable { - readonly added: string; + readonly added?: string; readonly allManualRedactionsApplied: boolean; - readonly analysisDuration: number; + readonly analysisDuration?: number; readonly analysisRequired: boolean; - readonly approvalDate: string; - readonly currentReviewer: string; - readonly dictionaryVersion: number; - readonly dossierDictionaryVersion: number; + readonly approvalDate?: string; + readonly currentReviewer?: string; + readonly dictionaryVersion?: number; + readonly dossierDictionaryVersion?: number; readonly dossierId: string; readonly excluded: boolean; - readonly fileAttributes: FileAttributes; + readonly fileAttributes?: FileAttributes; readonly fileId: string; readonly filename: string; readonly hasAnnotationComments: boolean; @@ -29,22 +29,21 @@ export class File implements IFile, IListable { readonly hasImages: boolean; readonly hasRedactions: boolean; readonly hasUpdates: boolean; - readonly lastOCRTime: string; - readonly lastProcessed: string; - readonly lastReviewer: string; - readonly lastUpdated: string; - readonly lastUploaded: string; - readonly legalBasisVersion: number; - readonly numberOfAnalyses: number; - readonly numberOfPages: number; - readonly rulesVersion: number; + readonly lastOCRTime?: string; + readonly lastProcessed?: string; + readonly lastReviewer?: string; + readonly lastUpdated?: string; + readonly lastUploaded?: string; + readonly legalBasisVersion?: number; + readonly numberOfAnalyses?: number; + readonly numberOfPages?: number; + readonly rulesVersion?: number; readonly status: FileStatus; - readonly uploader: string; - readonly excludedPages: number[]; + readonly uploader?: string; + readonly excludedPages?: number[]; readonly hasSuggestions: boolean; - readonly dossierTemplateId: string; - primaryAttribute: string; + readonly primaryAttribute: string; lastOpened: boolean; readonly statusSort: number; readonly cacheIdentifier: string; @@ -62,25 +61,25 @@ export class File implements IFile, IListable { readonly isWorkable: boolean; readonly canBeOCRed: boolean; - constructor(file: IFile, public reviewerName: string, fileAttributesConfig?: FileAttributesConfig) { + constructor(file: IFile, readonly reviewerName: string, fileAttributesConfig?: FileAttributesConfig) { this.added = file.added; - this.allManualRedactionsApplied = file.allManualRedactionsApplied; + this.allManualRedactionsApplied = !!file.allManualRedactionsApplied; this.analysisDuration = file.analysisDuration; - this.analysisRequired = file.analysisRequired && !file.excluded; + this.analysisRequired = !!file.analysisRequired && !file.excluded; this.approvalDate = file.approvalDate; this.currentReviewer = file.currentReviewer; this.dictionaryVersion = file.dictionaryVersion; this.dossierDictionaryVersion = file.dossierDictionaryVersion; this.dossierId = file.dossierId; - this.excluded = file.excluded; + this.excluded = !!file.excluded; this.fileAttributes = file.fileAttributes; this.fileId = file.fileId; this.filename = file.filename; - this.hasAnnotationComments = file.hasAnnotationComments; - this.hasHints = file.hasHints; - this.hasImages = file.hasImages; - this.hasRedactions = file.hasRedactions; - this.hasUpdates = file.hasUpdates; + this.hasAnnotationComments = !!file.hasAnnotationComments; + this.hasHints = !!file.hasHints; + this.hasImages = !!file.hasImages; + this.hasRedactions = !!file.hasRedactions; + this.hasUpdates = !!file.hasUpdates; this.lastOCRTime = file.lastOCRTime; this.lastProcessed = file.lastProcessed; this.lastReviewer = file.lastReviewer; @@ -94,11 +93,12 @@ export class File implements IFile, IListable { this.rulesVersion = file.rulesVersion; this.uploader = file.uploader; this.excludedPages = file.excludedPages; - this.hasSuggestions = file.hasSuggestions; - this.dossierTemplateId = file.dossierTemplateId; + this.hasSuggestions = !!file.hasSuggestions; this.statusSort = StatusSorter[this.status]; - this.cacheIdentifier = btoa(this.lastUploaded + this.lastOCRTime); + if (this.lastUpdated && this.lastOCRTime) { + this.cacheIdentifier = btoa(this.lastUploaded + this.lastOCRTime); + } this.hintsOnly = this.hasHints && !this.hasRedactions; this.hasNone = !this.hasRedactions && !this.hasHints && !this.hasSuggestions; this.isUnassigned = !this.currentReviewer; diff --git a/apps/red-ui/src/app/models/user.ts b/apps/red-ui/src/app/models/user.ts index 24bb45dd4..75d775736 100644 --- a/apps/red-ui/src/app/models/user.ts +++ b/apps/red-ui/src/app/models/user.ts @@ -5,8 +5,8 @@ import { KeycloakProfile } from 'keycloak-js'; export class User implements IUser, IListable { readonly email: string; readonly username: string; - readonly firstName: string; - readonly lastName: string; + readonly firstName?: string; + readonly lastName?: string; readonly name: string; readonly searchKey: string; diff --git a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts index bd63dad28..8f9c5eb26 100644 --- a/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts +++ b/apps/red-ui/src/app/modules/admin/dialogs/confirm-delete-users-dialog/confirm-delete-users-dialog.component.ts @@ -1,10 +1,10 @@ import { Component, Inject } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { UserControllerService } from '@redaction/red-ui-http'; -import { AppStateService } from '@state/app-state.service'; import { LoadingService } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { User } from '@models/user'; +import { DossiersService } from '../../../dossier/services/dossiers.service'; @Component({ selector: 'redaction-confirm-delete-users-dialog', @@ -20,13 +20,13 @@ export class ConfirmDeleteUsersDialogComponent { dossiersCount: number; constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _loadingService: LoadingService, private readonly _userControllerService: UserControllerService, readonly dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly users: User[] ) { - this.dossiersCount = this._appStateService.allDossiers.filter(dw => { + this.dossiersCount = this._dossiersService.all.filter(dw => { for (const user of this.users) { if (dw.memberIds.indexOf(user.id) !== -1) { return true; diff --git a/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts b/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts index f367b2ae8..0331901d1 100644 --- a/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/document-info/document-info.component.ts @@ -5,6 +5,7 @@ import { DossiersDialogService } from '../../services/dossiers-dialog.service'; import { AutoUnsubscribe } from '@iqser/common-ui'; import { File } from '@models/file/file'; import { FileAttributesService } from '../../services/file-attributes.service'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ selector: 'redaction-document-info', @@ -13,12 +14,13 @@ import { FileAttributesService } from '../../services/file-attributes.service'; }) export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit { @Input() file: File; - @Output() closeDocumentInfoView = new EventEmitter(); + @Output() readonly closeDocumentInfoView = new EventEmitter(); fileAttributesConfig: FileAttributesConfig; constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _fileAttributesService: FileAttributesService, private readonly _dialogService: DossiersDialogService ) { @@ -26,7 +28,7 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit { } get dossier() { - return this._appStateService.getDossierById(this.file.dossierId); + return this._dossiersService.find(this.file.dossierId); } get dossierTemplateName(): string { @@ -34,10 +36,10 @@ export class DocumentInfoComponent extends AutoUnsubscribe implements OnInit { } ngOnInit(): void { - this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.file.dossierTemplateId); + this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.dossier.dossierTemplateId); this.addSubscription = this._appStateService.dossierTemplateChanged$.subscribe(() => { - this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.file.dossierTemplateId); + this.fileAttributesConfig = this._fileAttributesService.getFileAttributeConfig(this.dossier.dossierTemplateId); }); } diff --git a/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts b/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts index 7e6cdf763..b99377e82 100644 --- a/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/page-indicator/page-indicator.component.ts @@ -1,9 +1,10 @@ -import {Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges} from '@angular/core'; -import {ViewedPages, ViewedPagesControllerService} from '@redaction/red-ui-http'; -import {AppStateService} from '@state/app-state.service'; -import {PermissionsService} from '@services/permissions.service'; -import {ConfigService} from '@services/config.service'; -import {Subscription} from 'rxjs'; +import { Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges } from '@angular/core'; +import { ViewedPages, ViewedPagesControllerService } from '@redaction/red-ui-http'; +import { AppStateService } from '@state/app-state.service'; +import { PermissionsService } from '@services/permissions.service'; +import { ConfigService } from '@services/config.service'; +import { Subscription } from 'rxjs'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ selector: 'redaction-page-indicator', @@ -16,7 +17,7 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { @Input() viewedPages: ViewedPages; @Input() activeSelection = false; - @Output() pageSelected = new EventEmitter(); + @Output() readonly pageSelected = new EventEmitter(); pageReadTimeout: number = null; canMarkPagesAsViewed: boolean; @@ -25,10 +26,10 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { constructor( private readonly _viewedPagesControllerService: ViewedPagesControllerService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _configService: ConfigService, private readonly _permissionService: PermissionsService - ) { - } + ) {} get read() { return this.viewedPages?.pages?.findIndex(p => p.page === this.number) >= 0; @@ -96,15 +97,15 @@ export class PageIndicatorComponent implements OnChanges, OnInit, OnDestroy { private _markPageRead() { this._viewedPagesControllerService - .addPage({page: this.number}, this._appStateService.activeDossierId, this._appStateService.activeFileId) + .addPage({ page: this.number }, this._dossiersService.activeDossierId, this._appStateService.activeFileId) .subscribe(() => { - this.viewedPages?.pages?.push({page: this.number, fileId: this._appStateService.activeFileId}); + this.viewedPages?.pages?.push({ page: this.number, fileId: this._appStateService.activeFileId }); }); } private _markPageUnread() { this._viewedPagesControllerService - .removePage(this._appStateService.activeDossierId, this._appStateService.activeFileId, this.number) + .removePage(this._dossiersService.activeDossierId, this._appStateService.activeFileId, this.number) .subscribe(() => { this.viewedPages?.pages?.splice( this.viewedPages?.pages?.findIndex(p => p.page === this.number), diff --git a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts index be438a273..fbdeb4479 100644 --- a/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts +++ b/apps/red-ui/src/app/modules/dossier/components/team-members-manager/team-members-manager.component.ts @@ -1,11 +1,11 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { IDossier } from '@redaction/red-ui-http'; -import { AppStateService } from '@state/app-state.service'; +import { DossierRequest, IDossier } from '@redaction/red-ui-http'; import { UserService } from '@services/user.service'; import { Toaster } from '@iqser/common-ui'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { Dossier } from '@state/model/dossier'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ selector: 'redaction-team-members-manager', @@ -28,7 +28,7 @@ export class TeamMembersManagerComponent implements OnInit { readonly userService: UserService, private readonly _toaster: Toaster, private readonly _formBuilder: FormBuilder, - private readonly _appStateService: AppStateService + private readonly _dossiersService: DossiersService ) {} get selectedOwnerId(): string { @@ -52,22 +52,17 @@ export class TeamMembersManagerComponent implements OnInit { } async saveMembers() { - let result; - try { - const ownerId = this.selectedOwnerId; - const memberIds = this.selectedMembersList; - const approverIds = this.selectedApproversList; - const dw = { - ...this.dossier, - memberIds, - approverIds, - ownerId - }; - result = await this._appStateService.createOrUpdateDossier(dw); + const dossier = { + ...this.dossier, + memberIds: this.selectedMembersList, + approverIds: this.selectedApproversList, + ownerId: this.selectedOwnerId + } as DossierRequest; + + const result = await this._dossiersService.createOrUpdate(dossier).toPromise(); + if (result) { this.save.emit(result); this._updateChanged(); - } catch (error) { - this._toaster.error(_('error.http.generic'), { params: error }); } } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html index c0c360868..88a3666fd 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html +++ b/apps/red-ui/src/app/modules/dossier/dialogs/add-dossier-dialog/add-dossier-dialog.component.html @@ -83,7 +83,7 @@ reportTemplate.templateId; constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _formBuilder: FormBuilder, private readonly _reportTemplateController: ReportTemplateControllerService, readonly dialogRef: MatDialogRef @@ -45,7 +52,7 @@ export class AddDossierDialogComponent { validators: control => control.value.reportTemplateIds?.length > 0 || control.value.downloadFileTypes?.length > 0 ? null - : {downloadPackage: true} + : { downloadPackage: true } } ); } @@ -66,18 +73,12 @@ export class AddDossierDialogComponent { return this.dossierForm.invalid; } - async saveDossier() { - const savedDossier = await this._appStateService.createOrUpdateDossier(this._formToObject()); - if (savedDossier) { - this.dialogRef.close({dossier: savedDossier}); - } - } + reportTemplateValueMapper = (reportTemplate: ReportTemplate) => reportTemplate.templateId; - async saveDossierAndAddMembers() { - const dossier: DossierRequest = this._formToObject(); - const savedDossier = await this._appStateService.createOrUpdateDossier(dossier); + async saveDossier(addMembers = false) { + const savedDossier = await this._dossiersService.createOrUpdate(this._formToObject()).toPromise(); if (savedDossier) { - this.dialogRef.close({addMembers: true, dossier: savedDossier}); + this.dialogRef.close({ dossier: savedDossier, addMembers }); } } @@ -94,7 +95,7 @@ export class AddDossierDialogComponent { downloadFileTypes: dossierTemplate.downloadFileTypes, reportTemplateIds: [] // TODO DEFAULT }, - {emitEvent: false} + { emitEvent: false } ); } else { this.availableReportTypes = []; @@ -103,7 +104,7 @@ export class AddDossierDialogComponent { downloadFileTypes: [], reportTemplateIds: [] }, - {emitEvent: false} + { emitEvent: false } ); } } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts index 3a49970ba..4f2a2dabb 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/assign-reviewer-approver-dialog/assign-reviewer-approver-dialog.component.ts @@ -8,6 +8,7 @@ import { File } from '@models/file/file'; import { Dossier } from '@state/model/dossier'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { FilesService } from '../../services/files.service'; +import { DossiersService } from '../../services/dossiers.service'; class DialogData { mode: 'approver' | 'reviewer'; @@ -29,6 +30,7 @@ export class AssignReviewerApproverDialogComponent { private readonly _toaster: Toaster, private readonly _formBuilder: FormBuilder, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _filesService: FilesService, private readonly _dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) readonly data: DialogData @@ -42,8 +44,8 @@ export class AssignReviewerApproverDialogComponent { get singleUsersSelectOptions() { return this.data.mode === 'approver' - ? this._appStateService.activeDossier.approverIds - : this._appStateService.activeDossier.memberIds; + ? this._dossiersService.activeDossier.approverIds + : this._dossiersService.activeDossier.memberIds; } get changed(): boolean { @@ -72,7 +74,7 @@ export class AssignReviewerApproverDialogComponent { await this._filesService .setReviewerFor( this.data.files.map(f => f.fileId), - this._appStateService.activeDossierId, + this._dossiersService.activeDossierId, selectedUser ) .toPromise(); @@ -81,7 +83,7 @@ export class AssignReviewerApproverDialogComponent { .setUnderApprovalFor( this.data.files.map(f => f.fileId), selectedUser, - this._appStateService.activeDossierId + this._dossiersService.activeDossierId ) .toPromise(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts index 1217bb918..624ebeda2 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/change-legal-basis-dialog/change-legal-basis-dialog.component.ts @@ -6,6 +6,7 @@ import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { LegalBasisMappingControllerService } from '@redaction/red-ui-http'; import { AppStateService } from '@state/app-state.service'; import { PermissionsService } from '@services/permissions.service'; +import { DossiersService } from '../../services/dossiers.service'; export interface LegalBasisOption { label?: string; @@ -27,6 +28,7 @@ export class ChangeLegalBasisDialogComponent implements OnInit { private readonly _translateService: TranslateService, private readonly _legalBasisMappingControllerService: LegalBasisMappingControllerService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _permissionsService: PermissionsService, private readonly _formBuilder: FormBuilder, public dialogRef: MatDialogRef, @@ -45,7 +47,7 @@ export class ChangeLegalBasisDialogComponent implements OnInit { comment: this.isDocumentAdmin ? [null] : [null, Validators.required] }); const data = await this._legalBasisMappingControllerService - .getLegalBasisMapping(this._appStateService.activeDossier.dossierTemplateId) + .getLegalBasisMapping(this._dossiersService.activeDossier.dossierTemplateId) .toPromise(); this.legalOptions = data diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts index 9625d86c1..f00ca3baf 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/document-info-dialog/document-info-dialog.component.ts @@ -5,6 +5,7 @@ import { AppStateService } from '@state/app-state.service'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { Dossier } from '@state/model/dossier'; import { FileAttributesService } from '../../services/file-attributes.service'; +import { DossiersService } from '../../services/dossiers.service'; @Component({ templateUrl: './document-info-dialog.component.html', @@ -15,17 +16,18 @@ export class DocumentInfoDialogComponent implements OnInit { file: IFile; attributes: IFileAttributeConfig[]; - private _dossier: Dossier; + private readonly _dossier: Dossier; constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _formBuilder: FormBuilder, private readonly _fileAttributesService: FileAttributesService, public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: IFile ) { this.file = this.data; - this._dossier = this._appStateService.getDossierById(this.file.dossierId); + this._dossier = this._dossiersService.find(this.file.dossierId); } async ngOnInit() { diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts index 39508e09a..6f43510c1 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/dictionary/edit-dossier-dictionary.component.ts @@ -1,5 +1,4 @@ import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { AppStateService } from '@state/app-state.service'; import { Dossier } from '@state/model/dossier'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { PermissionsService } from '@services/permissions.service'; @@ -8,6 +7,7 @@ import { DictionaryService } from '@shared/services/dictionary.service'; import { FormBuilder } from '@angular/forms'; import { CircleButtonTypes, LoadingService } from '@iqser/common-ui'; import { IDictionary } from '@redaction/red-ui-http'; +import { DossiersService } from '../../../services/dossiers.service'; @Component({ selector: 'redaction-edit-dossier-dictionary', @@ -20,10 +20,10 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa canEdit = false; readonly circleButtonTypes = CircleButtonTypes; - @ViewChild(DictionaryManagerComponent, { static: false }) private _dictionaryManager: DictionaryManagerComponent; + @ViewChild(DictionaryManagerComponent, { static: false }) private readonly _dictionaryManager: DictionaryManagerComponent; constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _dictionaryService: DictionaryService, private readonly _permissionsService: PermissionsService, private readonly _loadingService: LoadingService, @@ -42,7 +42,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa async ngOnInit() { this._loadingService.start(); - await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); + await this._dossiersService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); this._loadingService.stop(); } @@ -51,7 +51,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa await this._dictionaryService .updateType(typeValue, this.dossier.dossierTemplateId, 'dossier_redaction', this.dossier.id) .toPromise(); - await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); + await this._dossiersService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); this.updateDossier.emit(); } @@ -66,7 +66,7 @@ export class EditDossierDictionaryComponent implements EditDossierSectionInterfa false ) .toPromise(); - await this._appStateService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); + await this._dossiersService.updateDossierDictionary(this.dossier.dossierTemplateId, this.dossier.id); this.updateDossier.emit(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts index 7e0f91e9f..b1d2a77ae 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/download-package/edit-dossier-download-package.component.ts @@ -1,10 +1,10 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; import { DownloadFileType, ReportTemplate, ReportTemplateControllerService } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup } from '@angular/forms'; -import { AppStateService } from '@state/app-state.service'; import { Dossier } from '@state/model/dossier'; import { EditDossierSectionInterface } from '../edit-dossier-section.interface'; import { downloadTypesTranslations } from '../../../../../translations/download-types-translations'; +import { DossiersService } from '../../../services/dossiers.service'; @Component({ selector: 'redaction-edit-dossier-download-package', @@ -23,7 +23,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS @Output() readonly updateDossier = new EventEmitter(); constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _reportTemplateController: ReportTemplateControllerService, private readonly _formBuilder: FormBuilder ) {} @@ -87,7 +87,7 @@ export class EditDossierDownloadPackageComponent implements OnInit, EditDossierS downloadFileTypes: this.dossierForm.get('downloadFileTypes').value, reportTemplateIds: this.dossierForm.get('reportTemplateIds').value }; - await this._appStateService.createOrUpdateDossier(dossier); + await this._dossiersService.createOrUpdate(dossier).toPromise(); this.updateDossier.emit(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts index 8090b67f0..438dce15b 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/edit-dossier-dialog.component.ts @@ -12,6 +12,7 @@ import { EditDossierAttributesComponent } from './attributes/edit-dossier-attrib import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { EditDossierDeletedDocumentsComponent } from './deleted-documents/edit-dossier-deleted-documents.component'; import { AppStateService } from '@state/app-state.service'; +import { DossiersService } from '../../services/dossiers.service'; type Section = 'dossierInfo' | 'downloadPackage' | 'dossierDictionary' | 'members' | 'dossierAttributes' | 'deletedDocuments'; @@ -34,6 +35,7 @@ export class EditDossierDialogComponent { constructor( private readonly _toaster: Toaster, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _changeRef: ChangeDetectorRef, @Inject(MAT_DIALOG_DATA) private readonly _data: { @@ -106,7 +108,7 @@ export class EditDossierDialogComponent { updatedDossier() { this._toaster.success(_('edit-dossier-dialog.change-successful'), { params: { dossierName: this.dossier.dossierName } }); - this.dossier = this._appStateService.getDossierById(this.dossier.id); + this.dossier = this._dossiersService.find(this.dossier.id); this._changeRef.detectChanges(); this.afterSave(); } diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts index f43064429..03967596f 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/edit-dossier-dialog/general-info/edit-dossier-general-info.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, Input, OnInit, Output } from '@angular/core'; -import { IDossierTemplate } from '@redaction/red-ui-http'; +import { DossierRequest, IDossierTemplate } from '@redaction/red-ui-http'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; import { AppStateService } from '@state/app-state.service'; import * as moment from 'moment'; @@ -12,6 +12,7 @@ import { MatDialogRef } from '@angular/material/dialog'; import { EditDossierDialogComponent } from '../edit-dossier-dialog.component'; import { ConfirmationDialogInput, IconButtonTypes, TitleColors, Toaster } from '@iqser/common-ui'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { DossiersService } from '../../../services/dossiers.service'; @Component({ selector: 'redaction-edit-dossier-general-info', @@ -31,6 +32,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti constructor( readonly permissionsService: PermissionsService, private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _formBuilder: FormBuilder, private readonly _dialogService: DossiersDialogService, private readonly _router: Router, @@ -99,8 +101,8 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti watermarkEnabled: this.dossierForm.get('watermarkEnabled').value, dueDate: this.hasDueDate ? this.dossierForm.get('dueDate').value : undefined, dossierTemplateId: this.dossierForm.get('dossierTemplateId').value - }; - await this._appStateService.createOrUpdateDossier(dossier); + } as DossierRequest; + await this._dossiersService.createOrUpdate(dossier).toPromise(); this.updateDossier.emit(); } @@ -119,7 +121,7 @@ export class EditDossierGeneralInfoComponent implements OnInit, EditDossierSecti } }); this._dialogService.openDialog('confirm', null, data, async () => { - await this._appStateService.deleteDossier(this.dossier); + await this._dossiersService.delete(this.dossier).toPromise(); this._editDossierDialogRef.componentInstance.afterSave(); this._editDossierDialogRef.close(); this._router.navigate(['main', 'dossiers']).then(() => this._notifyDossierDeleted()); diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/force-redaction-dialog/force-redaction-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/force-redaction-dialog/force-redaction-dialog.component.ts index f89f44a36..6adba14df 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/force-redaction-dialog/force-redaction-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/force-redaction-dialog/force-redaction-dialog.component.ts @@ -1,6 +1,5 @@ import { Component, OnInit } from '@angular/core'; import { FormBuilder, FormGroup, Validators } from '@angular/forms'; -import { AppStateService } from '@state/app-state.service'; import { MatDialogRef } from '@angular/material/dialog'; import { ForceRedactionRequest, LegalBasisMappingControllerService } from '@redaction/red-ui-http'; import { Toaster } from '@iqser/common-ui'; @@ -8,6 +7,7 @@ import { TranslateService } from '@ngx-translate/core'; import { UserService } from '@services/user.service'; import { ManualAnnotationService } from '../../services/manual-annotation.service'; import { PermissionsService } from '@services/permissions.service'; +import { DossiersService } from '../../services/dossiers.service'; export interface LegalBasisOption { label?: string; @@ -26,7 +26,7 @@ export class ForceRedactionDialogComponent implements OnInit { legalOptions: LegalBasisOption[] = []; constructor( - private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _userService: UserService, private readonly _formBuilder: FormBuilder, private readonly _notificationService: Toaster, @@ -39,7 +39,7 @@ export class ForceRedactionDialogComponent implements OnInit { async ngOnInit() { this._legalBasisMappingControllerService - .getLegalBasisMapping(this._appStateService.activeDossier.dossierTemplateId) + .getLegalBasisMapping(this._dossiersService.activeDossier.dossierTemplateId) .subscribe(data => { data.map(lbm => { this.legalOptions.push({ diff --git a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts index 47ba5c066..6868bc0a6 100644 --- a/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts +++ b/apps/red-ui/src/app/modules/dossier/dialogs/manual-redaction-dialog/manual-annotation-dialog.component.ts @@ -11,6 +11,7 @@ import { ManualAnnotationService } from '../../services/manual-annotation.servic import { ManualAnnotationResponse } from '@models/file/manual-annotation-response'; import { PermissionsService } from '@services/permissions.service'; import { TypeValue } from '@models/file/type-value'; +import { DossiersService } from '../../services/dossiers.service'; export interface LegalBasisOption { label?: string; @@ -35,6 +36,7 @@ export class ManualAnnotationDialogComponent implements OnInit { constructor( private readonly _appStateService: AppStateService, + private readonly _dossiersService: DossiersService, private readonly _userService: UserService, private readonly _formBuilder: FormBuilder, private readonly _notificationService: Toaster, @@ -60,7 +62,7 @@ export class ManualAnnotationDialogComponent implements OnInit { async ngOnInit() { this._legalBasisMappingControllerService - .getLegalBasisMapping(this._appStateService.activeDossier.dossierTemplateId) + .getLegalBasisMapping(this._dossiersService.activeDossier.dossierTemplateId) .subscribe(data => { data.map(lbm => { this.legalOptions.push({ @@ -86,7 +88,7 @@ export class ManualAnnotationDialogComponent implements OnInit { comment: this.isDocumentAdmin ? [null] : [null, Validators.required] }); - for (const key of Object.keys(this._appStateService.dictionaryData[this._appStateService.activeDossier.dossierTemplateId])) { + for (const key of Object.keys(this._appStateService.dictionaryData[this._dossiersService.activeDossier.dossierTemplateId])) { const dictionaryData = this._appStateService.getDictionaryTypeValue(key); if (!dictionaryData.virtual && dictionaryData.addToDictionaryAction) { this.redactionDictionaries.push(dictionaryData); @@ -103,6 +105,14 @@ export class ManualAnnotationDialogComponent implements OnInit { ); } + format(value: string) { + return value.replace( + // eslint-disable-next-line no-control-regex,max-len + /([^\s\d-]{2,})[-\u00AD]\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]/gi, + '$1' + ); + } + private _enhanceManualRedaction(addRedactionRequest: AddRedactionRequest) { const legalOption: LegalBasisOption = this.redactionForm.get('reason').value; addRedactionRequest.type = this.redactionForm.get('dictionary').value; @@ -118,12 +128,4 @@ export class ManualAnnotationDialogComponent implements OnInit { const commentValue = this.redactionForm.get('comment').value; addRedactionRequest.comment = commentValue ? { text: commentValue } : null; } - - format(value: string) { - return value.replace( - // eslint-disable-next-line no-control-regex,max-len - /([^\s\d-]{2,})[-\u00AD]\u000D\u000A|[\u000A\u000B\u000C\u000D\u0085\u2028\u2029]/gi, - '$1' - ); - } } diff --git a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts index c4b617945..dffaa52ad 100644 --- a/apps/red-ui/src/app/modules/dossier/dossiers.module.ts +++ b/apps/red-ui/src/app/modules/dossier/dossiers.module.ts @@ -80,7 +80,6 @@ const components = [ ]; const services = [ - DossiersService, DossiersDialogService, AnnotationActionsService, ManualAnnotationService, diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.html index 8accd8635..6d727f388 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.html @@ -3,43 +3,43 @@ (action)="delete()" *ngIf="canDelete" [tooltip]="'dossier-overview.bulk.delete' | translate" - icon="red:trash" [type]="circleButtonTypes.dark" + icon="red:trash" > - + @@ -56,23 +56,23 @@ (action)="setToUnderApproval()" *ngIf="canUndoApproval" [tooltip]="'dossier-overview.under-approval' | translate" - icon="red:undo" [type]="circleButtonTypes.dark" + icon="red:undo" > diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts index 701123da9..58d55bdb5 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/bulk-actions/dossier-overview-bulk-actions.component.ts @@ -1,4 +1,4 @@ -import { Component, EventEmitter, Output } from '@angular/core'; +import { Component, EventEmitter, Input, Output } from '@angular/core'; import { AppStateService } from '../../../../../../state/app-state.service'; import { FileManagementControllerService, ReanalysisControllerService } from '@redaction/red-ui-http'; import { PermissionsService } from '../../../../../../services/permissions.service'; @@ -9,6 +9,7 @@ import { DossiersDialogService } from '../../../../services/dossiers-dialog.serv import { CircleButtonTypes, ConfirmationDialogInput, EntitiesService, LoadingService } from '@iqser/common-ui'; import { TranslateService } from '@ngx-translate/core'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { Dossier } from '@state/model/dossier'; @Component({ selector: 'redaction-dossier-overview-bulk-actions', @@ -18,6 +19,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; export class DossierOverviewBulkActionsComponent { readonly circleButtonTypes = CircleButtonTypes; + @Input() dossier: Dossier; @Output() readonly reload = new EventEmitter(); constructor( @@ -32,19 +34,12 @@ export class DossierOverviewBulkActionsComponent { private readonly _entitiesService: EntitiesService ) {} - get dossier() { - return this._appStateService?.activeDossier; - } - get selectedFiles(): File[] { return this._entitiesService.selected; } get areAllFilesSelected() { - return ( - this._appStateService.activeDossier.files.length !== 0 && - this.selectedFiles.length === this._appStateService.activeDossier.files.length - ); + return this.dossier.files.length !== 0 && this.selectedFiles.length === this.dossier.files.length; } get areSomeFilesSelected() { @@ -133,7 +128,7 @@ export class DossierOverviewBulkActionsComponent { await this._fileManagementControllerService .deleteFiles( this.selectedFiles.map(item => item.fileId), - this._appStateService.activeDossierId + this.dossier.dossierId ) .toPromise(); await this._appStateService.reloadActiveDossierFiles(); @@ -146,20 +141,16 @@ export class DossierOverviewBulkActionsComponent { setToUnderApproval() { // If more than 1 approver - show dialog and ask who to assign - if (this._appStateService.activeDossier.approverIds.length > 1) { + if (this.dossier.approverIds.length > 1) { this._assignFiles('approver', true); } else { - this._performBulkAction( - this._fileActionService.setFilesUnderApproval(this.selectedFiles, this._appStateService.activeDossier.approverIds[0]) - ); + this._performBulkAction(this._fileActionService.setFilesUnderApproval(this.selectedFiles, this.dossier.approverIds[0])); } } async reanalyse() { const fileIds = this.selectedFiles.filter(file => file.analysisRequired).map(file => file.fileId); - this._performBulkAction( - this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this._appStateService.activeDossier.id) - ); + this._performBulkAction(this._reanalysisControllerService.reanalyzeFilesForDossier(fileIds, this.dossier.id)); } ocr() { diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html index e237e4559..5201a21e5 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details-stats/dossier-details-stats.component.html @@ -1,66 +1,68 @@ -
- - {{ 'dossier-overview.dossier-details.stats.documents' | translate: { count: activeDossier.files.length } }} -
-
- - {{ 'dossier-overview.dossier-details.stats.people' | translate: { count: activeDossier.memberIds.length } }} -
-
- - {{ - 'dossier-overview.dossier-details.stats.analysed-pages' | translate: { count: activeDossier.totalNumberOfPages | number } - }} -
-
- - {{ - 'dossier-overview.dossier-details.stats.created-on' + +
+ + {{ 'dossier-overview.dossier-details.stats.documents' | translate: { count: dossier.files.length } }} +
+
+ + {{ 'dossier-overview.dossier-details.stats.people' | translate: { count: dossier.memberIds.length } }} +
+
+ + {{ + 'dossier-overview.dossier-details.stats.analysed-pages' | translate: { count: dossier.totalNumberOfPages | number } + }} +
+
+ + {{ + 'dossier-overview.dossier-details.stats.created-on' + | translate + : { + date: dossier.date | date: 'd MMM. yyyy' + } + }} + +
+
+ + {{ + 'dossier-overview.dossier-details.stats.due-date' | translate : { - date: activeDossier.date | date: 'd MMM. yyyy' + date: dossier.dueDate | date: 'd MMM. yyyy' } - }} - -
-
- - {{ - 'dossier-overview.dossier-details.stats.due-date' - | translate - : { - date: activeDossier.dueDate | date: 'd MMM. yyyy' - } - }} -
-
- - {{ dossierTemplate?.name }} -
- - - -
- {{ 'dossier-overview.dossier-details.attributes.expand' | translate: { count: dossierAttributes.length } }} + }} +
+
+ + {{ dossierTemplate(dossier).name }} +
+ - -