From 168f748924c1e31e90ee3445b707ffd9119e2fda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Fri, 18 Feb 2022 16:31:52 +0200 Subject: [PATCH] RED-3411: Display processing stats --- .../dossier-details.component.html | 10 +++- .../dossier-details.component.scss | 4 ++ .../dossier-details.component.ts | 59 +++++++++++++++---- apps/red-ui/src/assets/i18n/en.json | 6 ++ libs/common-ui | 2 +- .../lib/dossier-stats/dossier-stats.model.ts | 45 +++++++++++++- 6 files changed, 107 insertions(+), 19 deletions(-) diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html index 183ebc0d0..d9c5384a8 100644 --- a/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html +++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-overview/components/dossier-details/dossier-details.component.html @@ -23,8 +23,8 @@ [tooltip]="'dossier-details.edit-owner' | translate" class="ml-14" icon="iqser:edit" - tooltipPosition="below" iqserHelpMode="edit_dossier_owner" + tooltipPosition="below" > @@ -38,7 +38,7 @@
+
+ +
+
; readonly dossierStats$: Observable; + chartConfig$: Observable; + statusConfig$: Observable; constructor( readonly dossiersService: DossiersService, @@ -52,23 +54,14 @@ export class DossierDetailsComponent { pluck('dossierId'), switchMap(dossierId => this._dossierStatsService.watch$(dossierId)), ); + this.chartConfig$ = this.dossierStats$.pipe(map(stats => this.#calculateChartConfig(stats))); + this.statusConfig$ = this.dossierStats$.pipe(map(stats => this.#calculateStatusConfig(stats))); } get managers() { return this._userService.managerUsers.map(manager => manager.id); } - calculateChartConfig(stats: DossierStats): DoughnutChartConfig[] { - const documentsChartData: DoughnutChartConfig[] = Object.keys(stats.fileCountPerWorkflowStatus).map(status => ({ - value: stats.fileCountPerWorkflowStatus[status], - color: status, - label: workflowFileStatusTranslations[status], - key: status, - })); - documentsChartData.sort((a, b) => StatusSorter.byStatus(a.key, b.key)); - return this.translateChartService.translateStatus(documentsChartData); - } - async assignOwner(user: User | string, dossier: Dossier) { const owner = typeof user === 'string' ? this._userService.find(user) : user; const dossierRequest: IDossierRequest = { ...dossier, ownerId: owner.id }; @@ -78,4 +71,44 @@ export class DossierDetailsComponent { const dossierName = dossier.dossierName; this._toaster.info(_('assignment.owner'), { params: { ownerName, dossierName } }); } + + #calculateChartConfig(stats: DossierStats): DoughnutChartConfig[] { + const documentsChartData: DoughnutChartConfig[] = Object.keys(stats.fileCountPerWorkflowStatus).map(status => ({ + value: stats.fileCountPerWorkflowStatus[status], + color: status, + label: workflowFileStatusTranslations[status], + key: status, + })); + documentsChartData.sort((a, b) => StatusSorter.byStatus(a.key, b.key)); + return this.translateChartService.translateStatus(documentsChartData); + } + + #calculateStatusConfig(stats: DossierStats): ProgressBarConfigModel[] { + return [ + { + label: _('processing-status.pending'), + total: stats.numberOfFiles, + count: stats.processingStats.pending, + icon: 'red:reanalyse', + }, + { + label: _('processing-status.ocr'), + total: stats.numberOfFiles, + count: stats.processingStats.ocr, + icon: 'iqser:ocr', + }, + { + label: _('processing-status.processing'), + total: stats.numberOfFiles, + count: stats.processingStats.processing, + icon: 'red:reanalyse', + }, + { + label: _('processing-status.processed'), + total: stats.numberOfFiles, + count: stats.processingStats.proccesed, + icon: 'red:ready-for-approval', + }, + ].filter(config => config.count > 0); + } } diff --git a/apps/red-ui/src/assets/i18n/en.json b/apps/red-ui/src/assets/i18n/en.json index 45aea39bb..4facffb34 100644 --- a/apps/red-ui/src/assets/i18n/en.json +++ b/apps/red-ui/src/assets/i18n/en.json @@ -1532,6 +1532,12 @@ }, "toggle-tooltips": "{active, select, true{Disable} false{Enable} other{}} annotation tooltips" }, + "processing-status": { + "ocr": "OCR", + "pending": "Pending", + "processed": "Processed", + "processing": "Processing" + }, "readonly": "Read only", "recategorize-image-dialog": { "actions": { diff --git a/libs/common-ui b/libs/common-ui index cec7a0336..12fd37dd1 160000 --- a/libs/common-ui +++ b/libs/common-ui @@ -1 +1 @@ -Subproject commit cec7a033629be8110ddb838c279fb3a6a15a9e18 +Subproject commit 12fd37dd11e4f47b0755c6b613d4efd8de140135 diff --git a/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts b/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts index b872f4709..10899e1ca 100644 --- a/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts +++ b/libs/red-domain/src/lib/dossier-stats/dossier-stats.model.ts @@ -1,6 +1,33 @@ import { IDossierStats } from './dossier-stats'; import { FileCountPerProcessingStatus, FileCountPerWorkflowStatus } from './types'; -import { isProcessingStatuses, ProcessingFileStatus } from '../files'; +import { isProcessingStatuses, ProcessingFileStatus, ProcessingFileStatuses } from '../files'; + +const PENDING_STATES: ProcessingFileStatus[] = [ + ProcessingFileStatuses.ANALYSE, + ProcessingFileStatuses.ERROR, + ProcessingFileStatuses.FULLREPROCESS, + ProcessingFileStatuses.REPROCESS, + ProcessingFileStatuses.UNPROCESSED, +]; + +const PROCESSING_STATES: ProcessingFileStatus[] = [ + ProcessingFileStatuses.IMAGE_ANALYZING, + ProcessingFileStatuses.INDEXING, + ProcessingFileStatuses.NER_ANALYZING, + ProcessingFileStatuses.PROCESSING, + ProcessingFileStatuses.SURROUNDING_TEXT_PROCESSING, +]; + +const PROCESSED_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.PROCESSED]; + +const OCR_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.OCR_PROCESSING]; + +interface ProcessingStats { + pending: number; + ocr: number; + processing: number; + proccesed: number; +} export class DossierStats implements IDossierStats { readonly dossierId: string; @@ -14,6 +41,7 @@ export class DossierStats implements IDossierStats { readonly numberOfPages: number; readonly numberOfFiles: number; readonly numberOfProcessingFiles: number; + readonly processingStats: ProcessingStats; readonly hasFiles: boolean; @@ -31,7 +59,20 @@ export class DossierStats implements IDossierStats { this.numberOfProcessingFiles = Object.entries(this.fileCountPerProcessingStatus) .filter(([key, _]) => isProcessingStatuses.includes(key as ProcessingFileStatus)) .reduce((count, [_, value]) => count + value, 0); - + this.processingStats = this.#processingStats; this.hasFiles = this.numberOfFiles > 0; } + + get #processingStats(): ProcessingStats { + return { + pending: this.#getTotal(PENDING_STATES), + proccesed: this.#getTotal(PROCESSED_STATES), + processing: this.#getTotal(PROCESSING_STATES), + ocr: this.#getTotal(OCR_STATES), + }; + } + + #getTotal(states: ProcessingFileStatus[]): number { + return states.reduce((total, state) => total + (this.fileCountPerProcessingStatus[state] || 0), 0); + } }