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 d8313b689..4159358d7 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 @@ -9,6 +9,7 @@ import { ListingModes, NestedFilter, TableColumnConfig, + WorkflowColumn, WorkflowConfig, } from '@iqser/common-ui'; import { @@ -65,56 +66,60 @@ export class ConfigService { } workflowConfig(dossier: Dossier): WorkflowConfig { + const { NEW, UNDER_REVIEW, UNDER_APPROVAL, APPROVED } = WorkflowFileStatuses; + + const newColumn: WorkflowColumn = { + label: workflowFileStatusTranslations[NEW], + key: NEW, + enterFn: files => this._bulkActionsService.setToNew(files), + enterPredicate: files => this._permissionsService.canSetToNew(files, dossier), + color: '#D3D5DA', + entities: new BehaviorSubject([]), + }; + + const underReviewColumn: WorkflowColumn = { + label: workflowFileStatusTranslations[UNDER_REVIEW], + enterFn: async files => { + const statuses: WorkflowFileStatus[] = [UNDER_APPROVAL, APPROVED]; + if (statuses.includes(files[0].workflowStatus)) { + await this._bulkActionsService.backToUnderReview(files); + } else { + await this._bulkActionsService.assignToMe(files); + } + }, + enterPredicate: files => + this._permissionsService.canSetUnderReviewInWorkflow(files, dossier) || + this._permissionsService.canAssignToSelf(files, dossier) || + this._permissionsService.canAssignUser(files, dossier), + key: UNDER_REVIEW, + color: '#FDBD00', + entities: new BehaviorSubject([]), + }; + + const underApprovalColumn: WorkflowColumn = { + label: workflowFileStatusTranslations[UNDER_APPROVAL], + enterFn: files => this._bulkActionsService.setToUnderApproval(files), + enterPredicate: files => + this._permissionsService.canSetUnderApproval(files, dossier) || this._permissionsService.canUndoApproval(files, dossier), + key: UNDER_APPROVAL, + color: '#374C81', + entities: new BehaviorSubject([]), + }; + + const approvedColumn: WorkflowColumn = { + label: workflowFileStatusTranslations[APPROVED], + enterFn: files => this._bulkActionsService.approve(files), + enterPredicate: files => + this._permissionsService.isReadyForApproval(files, dossier) && this._permissionsService.canBeApproved(files, dossier), + key: APPROVED, + color: '#48C9F7', + entities: new BehaviorSubject([]), + }; + return { columnIdentifierFn: entity => entity.workflowStatus, itemVersionFn: (entity: File) => `${entity.lastUpdated}-${entity.numberOfAnalyses}`, - columns: [ - { - label: workflowFileStatusTranslations[WorkflowFileStatuses.NEW], - key: WorkflowFileStatuses.NEW, - enterFn: (files: File[]) => this._bulkActionsService.setToNew(files), - enterPredicate: (files: File[]) => this._permissionsService.canSetToNew(files, dossier), - color: '#D3D5DA', - entities: new BehaviorSubject([]), - }, - { - label: workflowFileStatusTranslations[WorkflowFileStatuses.UNDER_REVIEW], - enterFn: async (files: File[]) => { - if (files[0].workflowStatus === WorkflowFileStatuses.UNDER_APPROVAL) { - await this._bulkActionsService.backToUnderReview(files); - } else { - await this._bulkActionsService.assignToMe(files); - } - }, - enterPredicate: (files: File[]) => - this._permissionsService.canSetUnderReview(files, dossier) || - this._permissionsService.canAssignToSelf(files, dossier) || - this._permissionsService.canAssignUser(files, dossier), - key: WorkflowFileStatuses.UNDER_REVIEW, - color: '#FDBD00', - entities: new BehaviorSubject([]), - }, - { - label: workflowFileStatusTranslations[WorkflowFileStatuses.UNDER_APPROVAL], - enterFn: (files: File[]) => this._bulkActionsService.setToUnderApproval(files), - enterPredicate: (files: File[]) => - this._permissionsService.canSetUnderApproval(files, dossier) || - this._permissionsService.canUndoApproval(files, dossier), - key: WorkflowFileStatuses.UNDER_APPROVAL, - color: '#374C81', - entities: new BehaviorSubject([]), - }, - { - label: workflowFileStatusTranslations[WorkflowFileStatuses.APPROVED], - enterFn: (files: File[]) => this._bulkActionsService.approve(files), - enterPredicate: (files: File[]) => - this._permissionsService.isReadyForApproval(files, dossier) && - this._permissionsService.canBeApproved(files, dossier), - key: WorkflowFileStatuses.APPROVED, - color: '#48C9F7', - entities: new BehaviorSubject([]), - }, - ], + columns: [newColumn, underReviewColumn, underApprovalColumn, approvedColumn], }; } diff --git a/apps/red-ui/src/app/services/permissions.service.ts b/apps/red-ui/src/app/services/permissions.service.ts index c5285512f..72d647e15 100644 --- a/apps/red-ui/src/app/services/permissions.service.ts +++ b/apps/red-ui/src/app/services/permissions.service.ts @@ -137,6 +137,11 @@ export class PermissionsService { return files.reduce((acc, _file) => this._canSetUnderReview(_file, dossier) && acc, true); } + canSetUnderReviewInWorkflow(file: File | File[], dossier: Dossier): boolean { + const files = file instanceof File ? [file] : file; + return files.reduce((acc, _file) => this._canSetUnderReviewInWorkflow(_file, dossier) && acc, true); + } + canBeApproved(file: File | File[], dossier: Dossier): boolean { const files = file instanceof File ? [file] : file; return files.reduce((acc, _file) => this._canBeApproved(_file, dossier) && acc, true); @@ -303,12 +308,24 @@ export class PermissionsService { return dossier.isActive && file.isUnderReview && this.isAssigneeOrApprover(file, dossier); } - /** UNDER_APPROVAL => UNDER_REVIEW OR NEW => UNDER_REVIEW */ + /** UNDER_APPROVAL => UNDER_REVIEW OR NEW => UNDER_REVIEW */ private _canSetUnderReview(file: File, dossier: Dossier): boolean { - return ( - dossier.isActive && - ((file.isUnderApproval && this.isAssigneeOrApprover(file, dossier)) || (file.isNew && this.isDossierMember(dossier))) - ); + if (!dossier.isActive) { + return false; + } + + return (file.isUnderApproval && this.isAssigneeOrApprover(file, dossier)) || (file.isNew && this.isDossierMember(dossier)); + } + + /** UNDER_APPROVAL => UNDER_REVIEW OR NEW => UNDER_REVIEW OR APPROVED => UNDER_REVIEW*/ + private _canSetUnderReviewInWorkflow(file: File, dossier: Dossier): boolean { + if (!dossier.isActive) { + return false; + } + + const isApprovedOrUnderApproval = file.isApproved || file.isUnderApproval; + + return (isApprovedOrUnderApproval && this.isAssigneeOrApprover(file, dossier)) || (file.isNew && this.isDossierMember(dossier)); } /** UNDER_APPROVAL => APPROVED */