Archived dossiers filters

This commit is contained in:
Adina Țeudan 2022-03-15 20:57:13 +02:00
parent 8ee37a8211
commit 49032cc959
2 changed files with 110 additions and 2 deletions

View File

@ -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<Dossier> {
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);
}
}

View File

@ -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<Dossier>[] {
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<string>();
const allDistinctDossierTemplates = new Set<string>();
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));
}
}