RED-4217: Filter files by processing type
This commit is contained in:
parent
fd59e3b56d
commit
82cce6cbbd
@ -48,7 +48,11 @@
|
||||
</div>
|
||||
|
||||
<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 *ngIf="stats.hasFiles && needsWorkFilters$ | async as filters" class="mt-32 legend pb-32" iqserHelpMode="dashboard_in_dossier">
|
||||
|
||||
@ -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);
|
||||
|
||||
@ -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<string>();
|
||||
const allDistinctAddedDates = new Set<string>();
|
||||
const allDistinctNeedsWork = new Set<string>();
|
||||
const allDistinctProcessingTypes = new Set<ProcessingType>();
|
||||
|
||||
const dynamicFilters = new Map<string, Set<string>>();
|
||||
|
||||
@ -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<string>, 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;
|
||||
|
||||
|
||||
@ -1 +1 @@
|
||||
Subproject commit 6a1625828d76d76a624845376f6aa564cc02c026
|
||||
Subproject commit f9e24883381ddbf93df5074ec1c176973db44ed1
|
||||
@ -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<ProcessingType, number>;
|
||||
|
||||
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),
|
||||
};
|
||||
|
||||
@ -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<IFile> implements IFile {
|
||||
readonly added?: string;
|
||||
@ -73,6 +77,8 @@ export class File extends Entity<IFile> 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<IFile> 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<IFile> 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);
|
||||
}
|
||||
|
||||
@ -66,3 +66,24 @@ export interface 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];
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user