From 49032cc95972cda4a0f4d29b19f758ebcb64c5c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Adina=20=C8=9Aeudan?= Date: Tue, 15 Mar 2022 20:57:13 +0200 Subject: [PATCH] Archived dossiers filters --- .../archived-dossiers-screen.component.ts | 10 ++ .../archive/services/config.service.ts | 102 +++++++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts index 2def15694..b8883d9f1 100644 --- a/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts +++ b/apps/red-ui/src/app/modules/archive/screens/archived-dossiers-screen/archived-dossiers-screen.component.ts @@ -4,6 +4,7 @@ import { DefaultListingServicesTmp, EntitiesService, ListingComponent } from '@i import { ArchivedDossiersService } from '@services/dossiers/archived-dossiers.service'; import { Dossier } from '@red/domain'; import { ConfigService } from '../../services/config.service'; +import { tap } from 'rxjs/operators'; @Component({ selector: 'redaction-archived-dossiers-screen', @@ -23,4 +24,13 @@ export class ArchivedDossiersScreenComponent extends ListingComponent { constructor(protected readonly _injector: Injector, private readonly _configService: ConfigService) { super(_injector); } + + ngOnInit(): void { + this.addSubscription = this.entitiesService.all$.pipe(tap(() => this._computeAllFilters())).subscribe(); + } + + private _computeAllFilters() { + const filterGroups = this._configService.filterGroups(this.entitiesService.all); + this.filterService.addFilterGroups(filterGroups); + } } diff --git a/apps/red-ui/src/app/modules/archive/services/config.service.ts b/apps/red-ui/src/app/modules/archive/services/config.service.ts index dc503650e..227fecad7 100644 --- a/apps/red-ui/src/app/modules/archive/services/config.service.ts +++ b/apps/red-ui/src/app/modules/archive/services/config.service.ts @@ -1,10 +1,20 @@ import { Injectable } from '@angular/core'; -import { TableColumnConfig } from '@iqser/common-ui'; -import { Dossier } from '@red/domain'; +import { IFilterGroup, keyChecker, NestedFilter, TableColumnConfig } from '@iqser/common-ui'; +import { Dossier, User } from '@red/domain'; import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker'; +import { dossierMemberChecker, dossierTemplateChecker } from '@utils/index'; +import { UserService } from '@services/user.service'; +import { TranslateService } from '@ngx-translate/core'; +import { DossierTemplatesService } from '@services/entity-services/dossier-templates.service'; @Injectable() export class ConfigService { + constructor( + private readonly _userService: UserService, + private readonly _translateService: TranslateService, + private readonly _dossierTemplatesService: DossierTemplatesService, + ) {} + get tableConfig(): TableColumnConfig[] { return [ { label: _('archived-dossiers-listing.table-col-names.name'), sortByKey: 'searchKey', width: '2fr' }, @@ -13,4 +23,92 @@ export class ConfigService { { label: _('archived-dossiers-listing.table-col-names.dossier-state'), class: 'flex-end', width: '2fr' }, ]; } + + get _currentUser(): User { + return this._userService.currentUser; + } + + filterGroups(entities: Dossier[]) { + const allDistinctPeople = new Set(); + const allDistinctDossierTemplates = new Set(); + + const filterGroups: IFilterGroup[] = []; + + entities?.forEach(entry => { + entry.memberIds.forEach(f => allDistinctPeople.add(f)); + allDistinctDossierTemplates.add(entry.dossierTemplateId); + }); + + const peopleFilters = [...allDistinctPeople].map( + userId => + new NestedFilter({ + id: userId, + label: this._userService.getNameForId(userId), + }), + ); + + filterGroups.push({ + slug: 'peopleFilters', + label: this._translateService.instant('filters.people'), + icon: 'red:user', + filters: peopleFilters, + checker: dossierMemberChecker, + }); + + const dossierTemplateFilters = [...allDistinctDossierTemplates].map( + id => + new NestedFilter({ + id: id, + label: this._dossierTemplatesService.find(id)?.name || '-', + }), + ); + + filterGroups.push({ + slug: 'dossierTemplateFilters', + label: this._translateService.instant('filters.dossier-templates'), + icon: 'red:template', + hide: dossierTemplateFilters.length <= 1, + filters: dossierTemplateFilters, + checker: dossierTemplateChecker, + }); + + filterGroups.push({ + slug: 'quickFilters', + filters: this._quickFilters(entities), + checker: (dw: Dossier, filter: NestedFilter) => filter.checked && filter.checker(dw), + }); + + const dossierFilters = entities.map( + dossier => + new NestedFilter({ + id: dossier.dossierName, + label: dossier.dossierName, + }), + ); + filterGroups.push({ + slug: 'dossierNameFilter', + label: this._translateService.instant('dossier-listing.filters.label'), + icon: 'red:folder', + filters: dossierFilters, + filterceptionPlaceholder: this._translateService.instant('dossier-listing.filters.search'), + checker: keyChecker('dossierName'), + }); + + return filterGroups; + } + + _myDossiersChecker = (dw: Dossier) => dw.ownerId === this._currentUser.id; + + private _quickFilters(entities: Dossier[]): NestedFilter[] { + const myDossiersLabel = this._translateService.instant('dossier-listing.quick-filters.my-dossiers'); + return [ + { + id: 'my-dossiers', + label: myDossiersLabel, + checker: this._myDossiersChecker, + disabled: entities.filter(this._myDossiersChecker).length === 0, + helpModeKey: 'dossiers_quickfilter_my_dossiers', + }, + ].map(filter => new NestedFilter(filter)); + } }