RED-4217: Filter files by processing type

This commit is contained in:
Adina Țeudan 2022-06-24 00:21:22 +03:00
parent fd59e3b56d
commit 82cce6cbbd
7 changed files with 77 additions and 34 deletions

View File

@ -48,7 +48,11 @@
</div> </div>
<div *ngIf="statusConfig$ | async as statusConfig" class="mt-24"> <div *ngIf="statusConfig$ | async as statusConfig" class="mt-24">
<iqser-progress-bar *ngFor="let config of statusConfig" [config]="config"></iqser-progress-bar> <iqser-progress-bar
*ngFor="let config of statusConfig"
[config]="config"
filterKey="processingTypeFilters"
></iqser-progress-bar>
</div> </div>
<div *ngIf="stats.hasFiles && needsWorkFilters$ | async as filters" class="mt-32 legend pb-32" iqserHelpMode="dashboard_in_dossier"> <div *ngIf="stats.hasFiles && needsWorkFilters$ | async as filters" class="mt-32 legend pb-32" iqserHelpMode="dashboard_in_dossier">

View File

@ -6,6 +6,7 @@ import {
DossierAttributeWithValue, DossierAttributeWithValue,
DossierStats, DossierStats,
IDossierRequest, IDossierRequest,
ProcessingTypes,
StatusSorter, StatusSorter,
User, User,
} from '@red/domain'; } from '@red/domain';
@ -85,27 +86,31 @@ export class DossierDetailsComponent {
#calculateStatusConfig(stats: DossierStats): ProgressBarConfigModel[] { #calculateStatusConfig(stats: DossierStats): ProgressBarConfigModel[] {
return [ return [
{ {
id: ProcessingTypes.pending,
label: _('processing-status.pending'), label: _('processing-status.pending'),
total: stats.numberOfFiles, total: stats.numberOfFiles,
count: stats.processingStats.pending, count: stats.processingStats.pending,
icon: 'red:reanalyse', icon: 'red:reanalyse',
}, },
{ {
id: ProcessingTypes.ocr,
label: _('processing-status.ocr'), label: _('processing-status.ocr'),
total: stats.numberOfFiles, total: stats.numberOfFiles,
count: stats.processingStats.ocr, count: stats.processingStats.ocr,
icon: 'iqser:ocr', icon: 'iqser:ocr',
}, },
{ {
id: ProcessingTypes.processing,
label: _('processing-status.processing'), label: _('processing-status.processing'),
total: stats.numberOfFiles, total: stats.numberOfFiles,
count: stats.processingStats.processing, count: stats.processingStats.processing,
icon: 'red:reanalyse', icon: 'red:reanalyse',
}, },
{ {
id: ProcessingTypes.processed,
label: _('processing-status.processed'), label: _('processing-status.processed'),
total: stats.numberOfFiles, total: stats.numberOfFiles,
count: stats.processingStats.proccesed, count: stats.processingStats.processed,
icon: 'red:ready-for-approval', icon: 'red:ready-for-approval',
}, },
].filter(config => config.count > 0); ].filter(config => config.count > 0);

View File

@ -11,7 +11,7 @@ import {
TableColumnConfig, TableColumnConfig,
WorkflowConfig, WorkflowConfig,
} from '@iqser/common-ui'; } 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 { workflowFileStatusTranslations } from '@translations/file-status-translations';
import { PermissionsService } from '@services/permissions.service'; import { PermissionsService } from '@services/permissions.service';
import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
@ -170,6 +170,7 @@ export class ConfigService {
const allDistinctPeople = new Set<string>(); const allDistinctPeople = new Set<string>();
const allDistinctAddedDates = new Set<string>(); const allDistinctAddedDates = new Set<string>();
const allDistinctNeedsWork = new Set<string>(); const allDistinctNeedsWork = new Set<string>();
const allDistinctProcessingTypes = new Set<ProcessingType>();
const dynamicFilters = new Map<string, Set<string>>(); const dynamicFilters = new Map<string, Set<string>>();
@ -205,6 +206,8 @@ export class ConfigService {
allDistinctNeedsWork.add('comment'); allDistinctNeedsWork.add('comment');
} }
allDistinctProcessingTypes.add(file.processingType);
// extract values for dynamic filters // extract values for dynamic filters
fileAttributeConfigs.forEach(config => { fileAttributeConfigs.forEach(config => {
if (config.filterable) { if (config.filterable) {
@ -287,6 +290,14 @@ export class ConfigService {
matchAll: true, 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<string>, filterKey: string) => { dynamicFilters.forEach((filterValue: Set<string>, filterKey: string) => {
const id = filterKey.split(':')[0]; const id = filterKey.split(':')[0];
const key = filterKey.split(':')[1]; const key = filterKey.split(':')[1];
@ -334,9 +345,7 @@ export class ConfigService {
} }
_recentlyModifiedChecker = (file: File) => _recentlyModifiedChecker = (file: File) =>
dayjs(file.lastUpdated) dayjs(file.lastUpdated).add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS, 'hours').isAfter(dayjs());
.add(this._appConfigService.values.RECENT_PERIOD_IN_HOURS as number, 'hours')
.isAfter(dayjs());
_assignedToMeChecker = (file: File) => file.assignee === this._userService.currentUser.id; _assignedToMeChecker = (file: File) => file.assignee === this._userService.currentUser.id;

@ -1 +1 @@
Subproject commit 6a1625828d76d76a624845376f6aa564cc02c026 Subproject commit f9e24883381ddbf93df5074ec1c176973db44ed1

View File

@ -1,34 +1,17 @@
import { IDossierStats } from './dossier-stats'; import { IDossierStats } from './dossier-stats';
import { FileCountPerProcessingStatus, FileCountPerWorkflowStatus } from './types'; 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[] = [ export const ProcessingTypes = {
ProcessingFileStatuses.ANALYSE, pending: 'pending',
ProcessingFileStatuses.ERROR, ocr: 'ocr',
ProcessingFileStatuses.FULLREPROCESS, processing: 'processing',
ProcessingFileStatuses.REPROCESS, processed: 'processed',
ProcessingFileStatuses.UNPROCESSED, } as const;
];
const PROCESSING_STATES: ProcessingFileStatus[] = [ export type ProcessingType = keyof typeof ProcessingTypes;
ProcessingFileStatuses.IMAGE_ANALYZING,
ProcessingFileStatuses.INDEXING,
ProcessingFileStatuses.NER_ANALYZING,
ProcessingFileStatuses.PROCESSING,
ProcessingFileStatuses.SURROUNDING_TEXT_PROCESSING,
ProcessingFileStatuses.FULL_PROCESSING,
];
const PROCESSED_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.PROCESSED]; export type ProcessingStats = Record<ProcessingType, number>;
const OCR_STATES: ProcessingFileStatus[] = [ProcessingFileStatuses.OCR_PROCESSING];
interface ProcessingStats {
pending: number;
ocr: number;
processing: number;
proccesed: number;
}
export class DossierStats implements IDossierStats { export class DossierStats implements IDossierStats {
readonly dossierId: string; readonly dossierId: string;
@ -71,7 +54,7 @@ export class DossierStats implements IDossierStats {
get #processingStats(): ProcessingStats { get #processingStats(): ProcessingStats {
return { return {
pending: this.#getTotal(PENDING_STATES), pending: this.#getTotal(PENDING_STATES),
proccesed: this.#getTotal(PROCESSED_STATES), processed: this.#getTotal(PROCESSED_STATES),
processing: this.#getTotal(PROCESSING_STATES), processing: this.#getTotal(PROCESSING_STATES),
ocr: this.#getTotal(OCR_STATES), ocr: this.#getTotal(OCR_STATES),
}; };

View File

@ -3,6 +3,9 @@ import { StatusSorter } from '../shared';
import { import {
isFullProcessingStatuses, isFullProcessingStatuses,
isProcessingStatuses, isProcessingStatuses,
OCR_STATES,
PENDING_STATES,
PROCESSING_STATES,
ProcessingFileStatus, ProcessingFileStatus,
ProcessingFileStatuses, ProcessingFileStatuses,
WorkflowFileStatus, WorkflowFileStatus,
@ -11,6 +14,7 @@ import {
import { IFile } from './file'; import { IFile } from './file';
import { FileAttributes } from '../file-attributes'; import { FileAttributes } from '../file-attributes';
import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers'; import { ARCHIVE_ROUTE, DOSSIERS_ROUTE } from '../dossiers';
import { ProcessingType, ProcessingTypes } from '../dossier-stats';
export class File extends Entity<IFile> implements IFile { export class File extends Entity<IFile> implements IFile {
readonly added?: string; readonly added?: string;
@ -73,6 +77,8 @@ export class File extends Entity<IFile> implements IFile {
readonly canBeOpened: boolean; readonly canBeOpened: boolean;
readonly canBeOCRed: boolean; readonly canBeOCRed: boolean;
readonly processingType: ProcessingType;
constructor(file: IFile, readonly reviewerName: string) { constructor(file: IFile, readonly reviewerName: string) {
super(file); super(file);
this.added = file.added; this.added = file.added;
@ -138,6 +144,8 @@ export class File extends Entity<IFile> implements IFile {
this.fileAttributes = this.fileAttributes =
file.fileAttributes && file.fileAttributes.attributeIdToValue ? file.fileAttributes : { attributeIdToValue: {} }; file.fileAttributes && file.fileAttributes.attributeIdToValue ? file.fileAttributes : { attributeIdToValue: {} };
this.processingType = this.#processingType;
} }
get deleted(): boolean { get deleted(): boolean {
@ -157,6 +165,19 @@ export class File extends Entity<IFile> implements IFile {
return this.canBeOpened ? `/main/${this.dossierTemplateId}/${routerPath}/${this.dossierId}/file/${this.fileId}` : undefined; 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 { isPageExcluded(page: number): boolean {
return this.excludedPages.includes(page); return this.excludedPages.includes(page);
} }

View File

@ -66,3 +66,24 @@ export interface StatusBarConfig {
} }
export type StatusBarConfigs = List<StatusBarConfig>; export type StatusBarConfigs = List<StatusBarConfig>;
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];