- {{ item.dossierName }}
+
+ {{ dossier.dossierName }}
- {{ item.dossierTemplateName }}
+ {{ dossier.dossierTemplateName }}
- {{ item.dossier.filesLength }}
+ {{ dossier.filesLength }}
- {{ item.dossier.totalNumberOfPages }}
+ {{ dossier.totalNumberOfPages }}
- {{ item.dossier.memberCount }}
+ {{ dossier.memberCount }}
- {{ item.dossier.date | date: 'mediumDate' }}
+ {{ dossier.date | date: 'mediumDate' }}
-
+
- {{ item.dossier.dueDate | date: 'mediumDate' }}
+ {{ dossier.dueDate | date: 'mediumDate' }}
-
+
-
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts
index 9c472511e..d203fb223 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts
+++ b/apps/red-ui/src/app/modules/dossier/screens/dossier-listing-screen/dossier-listing-screen.component.ts
@@ -29,20 +29,13 @@ import {
import { PermissionsService } from '@services/permissions.service';
import { CdkVirtualScrollViewport } from '@angular/cdk/scrolling';
-interface ListItem {
- readonly dossierName: string;
- readonly routerLink: string;
- readonly dossierTemplateName: string;
- readonly dossier: DossierWrapper;
-}
-
@Component({
templateUrl: './dossier-listing-screen.component.html',
styleUrls: ['./dossier-listing-screen.component.scss'],
providers: [...DefaultListingServices]
})
export class DossierListingScreenComponent
- extends ListingComponent
+ extends ListingComponent
implements OnInit, AfterViewInit, OnDestroy, OnAttach, OnDetach
{
readonly itemSize = 85;
@@ -58,7 +51,7 @@ export class DossierListingScreenComponent
type: 'primary'
}
];
- readonly tableColumnConfigs: readonly TableColumnConfig[] = [
+ readonly tableColumnConfigs: readonly TableColumnConfig[] = [
{
label: _('dossier-listing.table-col-names.name'),
sortByKey: 'dossierName'
@@ -102,7 +95,7 @@ export class DossierListingScreenComponent
}
private get _activeDossiersCount(): number {
- return this.entitiesService.all.filter(p => p.dossier.status === Dossier.StatusEnum.ACTIVE).length;
+ return this.entitiesService.all.filter(p => p.status === Dossier.StatusEnum.ACTIVE).length;
}
private get _inactiveDossiersCount(): number {
@@ -178,17 +171,8 @@ export class DossierListingScreenComponent
}
private _loadEntitiesFromState() {
- const entities = this._appStateService.allDossiers.map(dossier => this._toListItem(dossier));
- this.entitiesService.setEntities(entities);
- }
-
- private _toListItem(dossier: DossierWrapper): ListItem {
- return {
- dossierName: dossier.dossierName,
- routerLink: '/main/dossiers/' + dossier.dossierId.toString(),
- dossierTemplateName: this._getDossierTemplate(dossier.dossierTemplateId).name,
- dossier
- };
+ console.log(this._appStateService.allDossiers);
+ this.entitiesService.setEntities(this._appStateService.allDossiers);
}
private _computeAllFilters() {
@@ -199,18 +183,18 @@ export class DossierListingScreenComponent
this.entitiesService.all?.forEach(entry => {
// all people
- entry.dossier.memberIds.forEach(f => allDistinctPeople.add(f));
+ entry.memberIds.forEach(f => allDistinctPeople.add(f));
// Needs work
- entry.dossier.files.forEach(file => {
+ entry.files.forEach(file => {
allDistinctFileStatus.add(file.status);
if (file.analysisRequired) allDistinctNeedsWork.add('analysis');
- if (entry.dossier.hintsOnly) allDistinctNeedsWork.add('hint');
- if (entry.dossier.hasRedactions) allDistinctNeedsWork.add('redaction');
- if (entry.dossier.hasSuggestions) allDistinctNeedsWork.add('suggestion');
- if (entry.dossier.hasNone) allDistinctNeedsWork.add('none');
+ if (entry.hintsOnly) allDistinctNeedsWork.add('hint');
+ if (entry.hasRedactions) allDistinctNeedsWork.add('redaction');
+ if (entry.hasSuggestions) allDistinctNeedsWork.add('suggestion');
+ if (entry.hasNone) allDistinctNeedsWork.add('none');
});
- allDistinctDossierTemplates.add(entry.dossier.dossierTemplateId);
+ allDistinctDossierTemplates.add(entry.dossierTemplateId);
});
const statusFilters = [...allDistinctFileStatus].map(status => ({
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html
index 666eac854..af0569a66 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html
+++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.html
@@ -177,8 +177,6 @@
[excludePages]="excludePages"
[fileData]="fileData"
[hideSkipped]="hideSkipped"
- [primaryFilters]="primaryFilters"
- [secondaryFilters]="secondaryFilters"
[selectedAnnotations]="selectedAnnotations"
[viewer]="activeViewer"
>
@@ -194,3 +192,11 @@
[viewer]="activeViewer"
>
+
+
+
+
+
+ {{ filter.key | humanize: false }}
+
+
diff --git a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts
index c877dfceb..8ce1df12c 100644
--- a/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts
+++ b/apps/red-ui/src/app/modules/dossier/screens/file-preview-screen/file-preview-screen.component.ts
@@ -1,9 +1,9 @@
-import { ChangeDetectorRef, Component, HostListener, NgZone, OnDestroy, OnInit, ViewChild } from '@angular/core';
+import { ChangeDetectorRef, Component, HostListener, NgZone, OnDestroy, OnInit, TemplateRef, ViewChild } from '@angular/core';
import { ActivatedRoute, ActivatedRouteSnapshot, NavigationExtras, Router } from '@angular/router';
import { AppStateService } from '@state/app-state.service';
import { Annotations, WebViewerInstance } from '@pdftron/webviewer';
import { PdfViewerComponent } from '../../components/pdf-viewer/pdf-viewer.component';
-import { AutoUnsubscribe, CircleButtonTypes, Debounce, NestedFilter, processFilters } from '@iqser/common-ui';
+import { AutoUnsubscribe, CircleButtonTypes, Debounce, FilterService, NestedFilter, processFilters } from '@iqser/common-ui';
import { MatDialogRef, MatDialogState } from '@angular/material/dialog';
import { ManualRedactionEntryWrapper } from '@models/file/manual-redaction-entry.wrapper';
import { AnnotationWrapper } from '@models/file/annotation.wrapper';
@@ -41,7 +41,8 @@ const ALL_HOTKEY_ARRAY = ['Escape', 'F', 'f'];
@Component({
templateUrl: './file-preview-screen.component.html',
- styleUrls: ['./file-preview-screen.component.scss']
+ styleUrls: ['./file-preview-screen.component.scss'],
+ providers: [FilterService]
})
export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnInit, OnDestroy, OnAttach, OnDetach {
readonly circleButtonTypes = CircleButtonTypes;
@@ -55,8 +56,6 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
fileData: FileDataModel;
annotationData: AnnotationData;
selectedAnnotations: AnnotationWrapper[];
- primaryFilters: NestedFilter[];
- secondaryFilters: NestedFilter[];
canPerformAnnotationActions: boolean;
hideSkipped = false;
displayPDFViewer = false;
@@ -67,6 +66,11 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private _lastPage: string;
private _reloadFileOnReanalysis = false;
@ViewChild('fileWorkloadComponent') private _workloadComponent: FileWorkloadComponent;
+ @ViewChild('annotationFilterTemplate', {
+ read: TemplateRef,
+ static: true
+ })
+ private readonly _filterTemplate: TemplateRef;
constructor(
readonly appStateService: AppStateService,
@@ -87,6 +91,7 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
private readonly _ngZone: NgZone,
private readonly _fileManagementControllerService: FileManagementControllerService,
private readonly _loadingService: LoadingService,
+ private readonly _filterService: FilterService,
private readonly _translateService: TranslateService
) {
super();
@@ -269,11 +274,16 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
this.userPreferenceService.areDevFeaturesEnabled
);
const annotationFilters = this._annotationProcessingService.getAnnotationFilter(this.annotations);
- this.primaryFilters = processFilters(this.primaryFilters, annotationFilters);
- this.secondaryFilters = processFilters(this.secondaryFilters, AnnotationProcessingService.secondaryAnnotationFilters);
- this._workloadComponent?.filtersChanged({
- primary: this.primaryFilters,
- secondary: this.secondaryFilters
+ const primaryFilters = this._filterService.getGroup('primaryFilters')?.filters;
+ this._filterService.addFilterGroup({
+ slug: 'primaryFilters',
+ filterTemplate: this._filterTemplate,
+ filters: processFilters(primaryFilters, annotationFilters)
+ });
+ const secondaryFilters = this._filterService.getGroup('secondaryFilters')?.filters;
+ this._filterService.addFilterGroup({
+ slug: 'secondaryFilters',
+ filters: processFilters(secondaryFilters, AnnotationProcessingService.secondaryAnnotationFilters)
});
console.log('[REDACTION] Process time: ' + (new Date().getTime() - processStartTime) + 'ms');
console.log(
@@ -625,8 +635,10 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
}
private _handleDeltaAnnotationFilters(currentPageAnnotations: AnnotationWrapper[], newPageAnnotations: AnnotationWrapper[]) {
- const hasAnyFilterSet =
- this.primaryFilters.find(f => f.checked || f.indeterminate) || this.secondaryFilters.find(f => f.checked || f.indeterminate);
+ const primaryFilterGroup = this._filterService.getGroup('primaryFilters');
+ const primaryFilters = primaryFilterGroup.filters;
+ const secondaryFilters = this._filterService.getGroup('secondaryFilters').filters;
+ const hasAnyFilterSet = [...primaryFilters, ...secondaryFilters].find(f => f.checked || f.indeterminate);
if (!hasAnyFilterSet) {
return;
@@ -634,10 +646,10 @@ export class FilePreviewScreenComponent extends AutoUnsubscribe implements OnIni
const oldPageSpecificFilters = this._annotationProcessingService.getAnnotationFilter(currentPageAnnotations);
const newPageSpecificFilters = this._annotationProcessingService.getAnnotationFilter(newPageAnnotations);
- handleFilterDelta(oldPageSpecificFilters, newPageSpecificFilters, this.primaryFilters);
- this._workloadComponent.filtersChanged({
- primary: this.primaryFilters,
- secondary: this.secondaryFilters
+ handleFilterDelta(oldPageSpecificFilters, newPageSpecificFilters, primaryFilters);
+ this._filterService.addFilterGroup({
+ ...primaryFilterGroup,
+ filters: primaryFilters
});
}
diff --git a/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.html b/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.html
index d2225de78..335429b53 100644
--- a/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.html
+++ b/apps/red-ui/src/app/modules/shared/components/filters/popup-filter/popup-filter.component.html
@@ -1,101 +1,109 @@
-
+
+
-
+
- 0" xPosition="before">
-
-