diff --git a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.html b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.html
index 500e7f372..259d1af20 100644
--- a/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.html
+++ b/apps/red-ui/src/app/modules/dossier-overview/components/dossier-details/dossier-details.component.html
@@ -48,7 +48,11 @@
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 85f3bebd8..3539b3133 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
@@ -6,6 +6,7 @@ import {
DossierAttributeWithValue,
DossierStats,
IDossierRequest,
+ ProcessingTypes,
StatusSorter,
User,
} from '@red/domain';
@@ -85,27 +86,31 @@ export class DossierDetailsComponent {
#calculateStatusConfig(stats: DossierStats): ProgressBarConfigModel[] {
return [
{
+ id: ProcessingTypes.pending,
label: _('processing-status.pending'),
total: stats.numberOfFiles,
count: stats.processingStats.pending,
icon: 'red:reanalyse',
},
{
+ id: ProcessingTypes.ocr,
label: _('processing-status.ocr'),
total: stats.numberOfFiles,
count: stats.processingStats.ocr,
icon: 'iqser:ocr',
},
{
+ id: ProcessingTypes.processing,
label: _('processing-status.processing'),
total: stats.numberOfFiles,
count: stats.processingStats.processing,
icon: 'red:reanalyse',
},
{
+ id: ProcessingTypes.processed,
label: _('processing-status.processed'),
total: stats.numberOfFiles,
- count: stats.processingStats.proccesed,
+ count: stats.processingStats.processed,
icon: 'red:ready-for-approval',
},
].filter(config => config.count > 0);
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 7ea4cf40a..832b3e914 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
@@ -11,7 +11,7 @@ import {
TableColumnConfig,
WorkflowConfig,
} from '@iqser/common-ui';
-import { Dossier, File, IFileAttributeConfig, StatusSorter, WorkflowFileStatus, WorkflowFileStatuses } from '@red/domain';
+import { Dossier, File, IFileAttributeConfig, ProcessingType, StatusSorter, WorkflowFileStatus, WorkflowFileStatuses } from '@red/domain';
import { workflowFileStatusTranslations } from '@translations/file-status-translations';
import { PermissionsService } from '@services/permissions.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@@ -170,6 +170,7 @@ export class ConfigService {
const allDistinctPeople = new Set
();
const allDistinctAddedDates = new Set();
const allDistinctNeedsWork = new Set();
+ const allDistinctProcessingTypes = new Set();
const dynamicFilters = new Map>();
@@ -205,6 +206,8 @@ export class ConfigService {
allDistinctNeedsWork.add('comment');
}
+ allDistinctProcessingTypes.add(file.processingType);
+
// extract values for dynamic filters
fileAttributeConfigs.forEach(config => {
if (config.filterable) {
@@ -287,6 +290,14 @@ export class ConfigService {
matchAll: true,
});
+ const processingTypesFilters = [...allDistinctProcessingTypes].map(item => new NestedFilter({ id: item, label: item }));
+ filterGroups.push({
+ slug: 'processingTypeFilters',
+ filters: processingTypesFilters,
+ checker: (file: File, filter: INestedFilter) => file.processingType === filter.id,
+ hide: true,
+ });
+
dynamicFilters.forEach((filterValue: Set, filterKey: string) => {
const id = filterKey.split(':')[0];
const key = filterKey.split(':')[1];
@@ -334,9 +345,7 @@ export class ConfigService {
}
_recentlyModifiedChecker = (file: File) =>
- dayjs(file.lastUpdated)
- .add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS as number, 'hours')
- .isAfter(dayjs());
+ dayjs(file.lastUpdated).add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS, 'hours').isAfter(dayjs());
_assignedToMeChecker = (file: File) => file.assignee === this._userService.currentUser.id;
diff --git a/libs/common-ui b/libs/common-ui
index 6a1625828..f9e248833 160000
--- a/libs/common-ui
+++ b/libs/common-ui
@@ -1 +1 @@
-Subproject commit 6a1625828d76d76a624845376f6aa564cc02c026
+Subproject commit f9e24883381ddbf93df5074ec1c176973db44ed1
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 1aa89a44e..f6821b4c4 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,34 +1,17 @@
import { IDossierStats } from './dossier-stats';
import { FileCountPerProcessingStatus, FileCountPerWorkflowStatus } from './types';
-import { isProcessingStatuses, ProcessingFileStatus, ProcessingFileStatuses } from '../files';
+import { isProcessingStatuses, OCR_STATES, PENDING_STATES, PROCESSED_STATES, PROCESSING_STATES, ProcessingFileStatus } from '../files';
-const PENDING_STATES: ProcessingFileStatus[] = [
- ProcessingFileStatuses.ANALYSE,
- ProcessingFileStatuses.ERROR,
- ProcessingFileStatuses.FULLREPROCESS,
- ProcessingFileStatuses.REPROCESS,
- ProcessingFileStatuses.UNPROCESSED,
-];
+export const ProcessingTypes = {
+ pending: 'pending',
+ ocr: 'ocr',
+ processing: 'processing',
+ processed: 'processed',
+} as const;
-const PROCESSING_STATES: ProcessingFileStatus[] = [
- ProcessingFileStatuses.IMAGE_ANALYZING,
- ProcessingFileStatuses.INDEXING,
- ProcessingFileStatuses.NER_ANALYZING,
- ProcessingFileStatuses.PROCESSING,
- ProcessingFileStatuses.SURROUNDING_TEXT_PROCESSING,
- ProcessingFileStatuses.FULL_PROCESSING,
-];
+export type ProcessingType = keyof typeof ProcessingTypes;
-const PROCESSED_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.PROCESSED];
-
-const OCR_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.OCR_PROCESSING];
-
-interface ProcessingStats {
- pending: number;
- ocr: number;
- processing: number;
- proccesed: number;
-}
+export type ProcessingStats = Record;
export class DossierStats implements IDossierStats {
readonly dossierId: string;
@@ -71,7 +54,7 @@ export class DossierStats implements IDossierStats {
get #processingStats(): ProcessingStats {
return {
pending: this.#getTotal(PENDING_STATES),
- proccesed: this.#getTotal(PROCESSED_STATES),
+ processed: this.#getTotal(PROCESSED_STATES),
processing: this.#getTotal(PROCESSING_STATES),
ocr: this.#getTotal(OCR_STATES),
};
diff --git a/libs/red-domain/src/lib/files/file.model.ts b/libs/red-domain/src/lib/files/file.model.ts
index 30d02bb63..54f4ad208 100644
--- a/libs/red-domain/src/lib/files/file.model.ts
+++ b/libs/red-domain/src/lib/files/file.model.ts
@@ -3,6 +3,9 @@ import { StatusSorter } from '../shared';
import {
isFullProcessingStatuses,
isProcessingStatuses,
+ OCR_STATES,
+ PENDING_STATES,
+ PROCESSING_STATES,
ProcessingFileStatus,
ProcessingFileStatuses,
WorkflowFileStatus,
@@ -11,6 +14,7 @@ import {
import { IFile } from './file';
import { FileAttributes } from '../file-attributes';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers';
+import { ProcessingType, ProcessingTypes } from '../dossier-stats';
export class File extends Entity implements IFile {
readonly added?: string;
@@ -73,6 +77,8 @@ export class File extends Entity implements IFile {
readonly canBeOpened: boolean;
readonly canBeOCRed: boolean;
+ readonly processingType: ProcessingType;
+
constructor(file: IFile, readonly reviewerName: string) {
super(file);
this.added = file.added;
@@ -138,6 +144,8 @@ export class File extends Entity implements IFile {
this.fileAttributes =
file.fileAttributes && file.fileAttributes.attributeIdToValue ? file.fileAttributes : { attributeIdToValue: {} };
+
+ this.processingType = this.#processingType;
}
get deleted(): boolean {
@@ -157,6 +165,19 @@ export class File extends Entity implements IFile {
return this.canBeOpened ? `/main/${this.dossierTemplateId}/${routerPath}/${this.dossierId}/file/${this.fileId}` : undefined;
}
+ get #processingType(): ProcessingType {
+ if (PENDING_STATES.includes(this.processingStatus)) {
+ return ProcessingTypes.pending;
+ }
+ if (PROCESSING_STATES.includes(this.processingStatus)) {
+ return ProcessingTypes.processing;
+ }
+ if (OCR_STATES.includes(this.processingStatus)) {
+ return ProcessingTypes.ocr;
+ }
+ return ProcessingTypes.processed;
+ }
+
isPageExcluded(page: number): boolean {
return this.excludedPages.includes(page);
}
diff --git a/libs/red-domain/src/lib/files/types.ts b/libs/red-domain/src/lib/files/types.ts
index 11b758caa..ab6879e37 100644
--- a/libs/red-domain/src/lib/files/types.ts
+++ b/libs/red-domain/src/lib/files/types.ts
@@ -66,3 +66,24 @@ export interface StatusBarConfig {
}
export type StatusBarConfigs = List;
+
+export const PENDING_STATES: ProcessingFileStatus[] = [
+ ProcessingFileStatuses.ANALYSE,
+ ProcessingFileStatuses.ERROR,
+ ProcessingFileStatuses.FULLREPROCESS,
+ ProcessingFileStatuses.REPROCESS,
+ ProcessingFileStatuses.UNPROCESSED,
+];
+
+export const PROCESSING_STATES: ProcessingFileStatus[] = [
+ ProcessingFileStatuses.IMAGE_ANALYZING,
+ ProcessingFileStatuses.INDEXING,
+ ProcessingFileStatuses.NER_ANALYZING,
+ ProcessingFileStatuses.PROCESSING,
+ ProcessingFileStatuses.SURROUNDING_TEXT_PROCESSING,
+ ProcessingFileStatuses.FULL_PROCESSING,
+];
+
+export const PROCESSED_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.PROCESSED];
+
+export const OCR_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.OCR_PROCESSING];