Compare commits

...

2 Commits

7 changed files with 32 additions and 44 deletions

View File

@ -1,4 +1,4 @@
import { Component, EventEmitter, Input, Output } from '@angular/core'; import { Component, computed, EventEmitter, Input, Output } from '@angular/core';
import { import {
DonutChartConfig, DonutChartConfig,
Dossier, Dossier,
@ -25,6 +25,7 @@ import { Roles } from '@users/roles';
import { getCurrentUser } from '@iqser/common-ui/lib/users'; import { getCurrentUser } from '@iqser/common-ui/lib/users';
import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering';
import { ContextComponent, getParam, shareLast } from '@iqser/common-ui/lib/utils'; import { ContextComponent, getParam, shareLast } from '@iqser/common-ui/lib/utils';
import { toObservable } from '@angular/core/rxjs-interop';
interface DossierDetailsContext { interface DossierDetailsContext {
needsWorkFilters: INestedFilter[] | undefined; needsWorkFilters: INestedFilter[] | undefined;
@ -69,9 +70,9 @@ export class DossierDetailsComponent extends ContextComponent<DossierDetailsCont
map(([stats]) => stats), map(([stats]) => stats),
); );
const statusConfig$ = dossierStats$.pipe(map(stats => this.#calculateStatusConfig(stats))); const statusConfig$ = dossierStats$.pipe(map(stats => this.#calculateStatusConfig(stats)));
const filterModels$ = toObservable(computed(() => filterService.getFilterModels('needsWorkFilters')));
super._initContext({ super._initContext({
needsWorkFilters: filterService.getFilterModels$('needsWorkFilters'), needsWorkFilters: filterModels$,
dossier: dossier$, dossier: dossier$,
dossierStats: dossierStatsWithEffects$, dossierStats: dossierStatsWithEffects$,
statusConfig: statusConfig$, statusConfig: statusConfig$,

View File

@ -24,6 +24,7 @@ import { PageRotationService } from '../../../pdf-viewer/services/page-rotation.
import { getLocalStorageDataByFileId } from '@utils/local-storage'; import { getLocalStorageDataByFileId } from '@utils/local-storage';
import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering';
import { AutoUnsubscribe, bool, Debounce, IqserEventTarget } from '@iqser/common-ui/lib/utils'; import { AutoUnsubscribe, bool, Debounce, IqserEventTarget } from '@iqser/common-ui/lib/utils';
import { toObservable } from '@angular/core/rxjs-interop';
const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape']; const COMMAND_KEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown', 'Escape'];
const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown']; const ALL_HOTKEY_ARRAY = ['ArrowLeft', 'ArrowRight', 'ArrowUp', 'ArrowDown'];
@ -117,8 +118,8 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On
} }
private get _displayedAnnotations$(): Observable<Map<number, ListItem<AnnotationWrapper>[]>> { private get _displayedAnnotations$(): Observable<Map<number, ListItem<AnnotationWrapper>[]>> {
const primary$ = this.filterService.getFilterModels$('primaryFilters'); const primary$ = toObservable(computed(() => this.filterService.getFilterModels('primaryFilters')));
const secondary$ = this.filterService.getFilterModels$('secondaryFilters'); const secondary$ = toObservable(computed(() => this.filterService.getFilterModels('secondaryFilters')));
return combineLatest([ return combineLatest([
this.fileDataService.all$, this.fileDataService.all$,
@ -360,7 +361,7 @@ export class FileWorkloadComponent extends AutoUnsubscribe implements OnInit, On
this.displayedAnnotations = this._annotationProcessingService.filterAndGroupAnnotations(annotations, primary, secondary); this.displayedAnnotations = this._annotationProcessingService.filterAndGroupAnnotations(annotations, primary, secondary);
const pagesThatDisplayAnnotations = [...this.displayedAnnotations.keys()]; const pagesThatDisplayAnnotations = [...this.displayedAnnotations.keys()];
const enabledFilters = this.filterService.enabledFlatFilters; const enabledFilters = this.filterService.enabledFlatFilters();
if (enabledFilters.some(f => f.id === 'pages-without-annotations')) { if (enabledFilters.some(f => f.id === 'pages-without-annotations')) {
if (enabledFilters.length === 1 && !onlyPageWithAnnotations) { if (enabledFilters.length === 1 && !onlyPageWithAnnotations) {
this.displayedPages = this.#allPages.filter(page => !pagesThatDisplayAnnotations.includes(page)); this.displayedPages = this.#allPages.filter(page => !pagesThatDisplayAnnotations.includes(page));

View File

@ -819,16 +819,14 @@ export class FilePreviewScreenComponent
} }
#restoreOldFilters() { #restoreOldFilters() {
combineLatest([ const primaryFilters = this._filterService.getGroup('primaryFilters');
this._filterService.getGroup$('primaryFilters').pipe(first(filterGroup => !!filterGroup?.filters.length)), const secondaryFilters = this._filterService.getGroup('secondaryFilters');
this._filterService.getGroup$('secondaryFilters').pipe(first(secondaryFilters => !!secondaryFilters?.filters.length)),
]).subscribe(([primaryFilters, secondaryFilters]) => { const localStorageFiltersString = localStorage.getItem('workload-filters') ?? '{}';
const localStorageFiltersString = localStorage.getItem('workload-filters') ?? '{}'; const localStorageFilters = JSON.parse(localStorageFiltersString)[this.fileId];
const localStorageFilters = JSON.parse(localStorageFiltersString)[this.fileId]; if (localStorageFilters) {
if (localStorageFilters) { copyLocalStorageFiltersValues(primaryFilters.filters, localStorageFilters.primaryFilters);
copyLocalStorageFiltersValues(primaryFilters.filters, localStorageFilters.primaryFilters); copyLocalStorageFiltersValues(secondaryFilters.filters, localStorageFilters.secondaryFilters);
copyLocalStorageFiltersValues(secondaryFilters.filters, localStorageFilters.secondaryFilters); }
}
});
} }
} }

View File

@ -25,6 +25,7 @@ import { DossierTemplatesService } from '@services/dossier-templates/dossier-tem
import { UserService } from '@users/user.service'; import { UserService } from '@users/user.service';
import { IFilterGroup, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering'; import { IFilterGroup, keyChecker, NestedFilter } from '@iqser/common-ui/lib/filtering';
import { SortingOrders } from '@iqser/common-ui/lib/sorting'; import { SortingOrders } from '@iqser/common-ui/lib/sorting';
import { toObservable } from '@angular/core/rxjs-interop';
@Component({ @Component({
templateUrl: './search-screen.component.html', templateUrl: './search-screen.component.html',
@ -128,10 +129,8 @@ export class SearchScreenComponent extends ListingComponent<ISearchListItem> imp
} }
private get _filtersChanged$(): Observable<[string[], WorkflowFileStatus, string, string[], boolean]> { private get _filtersChanged$(): Observable<[string[], WorkflowFileStatus, string, string[], boolean]> {
const onlyActiveDossiers$ = this.#enabledArchive const onlyActiveDossiers$ = of(this.#enabledArchive ? this.filterService.getSingleFilter('onlyActiveDossiers').checked : true);
? this.filterService.getSingleFilter('onlyActiveDossiers').pipe(map(f => !!f.checked)) const filterGroups$ = toObservable(this.filterService.filterGroups);
: of(true);
const filterGroups$ = this.filterService.filterGroups$;
return combineLatest([filterGroups$, onlyActiveDossiers$]).pipe( return combineLatest([filterGroups$, onlyActiveDossiers$]).pipe(
map(([groups, onlyActive]) => { map(([groups, onlyActive]) => {
const dossierIds: string[] = groups[0].filters.filter(v => v.checked).map(v => v.id); const dossierIds: string[] = groups[0].filters.filter(v => v.checked).map(v => v.id);

View File

@ -35,8 +35,8 @@
<div <div
(click)="val.key && selectValue(val.key)" (click)="val.key && selectValue(val.key)"
*ngFor="let val of config" *ngFor="let val of config"
[class.active]="filterChecked$(val.key) | async" [class.active]="filterChecked(val.key)"
[class.filter-disabled]="!val.key || !(filters$ | async).length" [class.filter-disabled]="!val.key || !filters().length"
[id]="val.id" [id]="val.id"
> >
<iqser-status-bar <iqser-status-bar

View File

@ -1,13 +1,14 @@
import { Component, EventEmitter, Input, OnChanges, OnInit, Optional, Output } from '@angular/core'; import { Component, computed, EventEmitter, Input, OnChanges, OnInit, Optional, Output } from '@angular/core';
import { DonutChartConfig } from '@red/domain'; import { DonutChartConfig } from '@red/domain';
import { IqserHelpModeModule } from '@iqser/common-ui'; import { IqserHelpModeModule } from '@iqser/common-ui';
import { Observable, of } from 'rxjs'; import { Observable } from 'rxjs';
import { map } from 'rxjs/operators'; import { map } from 'rxjs/operators';
import { AsyncPipe, NgForOf, NgIf } from '@angular/common'; import { AsyncPipe, NgForOf, NgIf } from '@angular/common';
import { MatSelectModule } from '@angular/material/select'; import { MatSelectModule } from '@angular/material/select';
import { FilterService, INestedFilter } from '@iqser/common-ui/lib/filtering'; import { FilterService } from '@iqser/common-ui/lib/filtering';
import { get, shareLast } from '@iqser/common-ui/lib/utils'; import { get } from '@iqser/common-ui/lib/utils';
import { StatusBarComponent } from '@iqser/common-ui/lib/shared'; import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
import { toObservable } from '@angular/core/rxjs-interop';
@Component({ @Component({
selector: 'redaction-donut-chart', selector: 'redaction-donut-chart',
@ -16,7 +17,7 @@ import { StatusBarComponent } from '@iqser/common-ui/lib/shared';
standalone: true, standalone: true,
imports: [NgForOf, NgIf, MatSelectModule, IqserHelpModeModule, StatusBarComponent, AsyncPipe], imports: [NgForOf, NgIf, MatSelectModule, IqserHelpModeModule, StatusBarComponent, AsyncPipe],
}) })
export class DonutChartComponent implements OnChanges, OnInit { export class DonutChartComponent implements OnChanges {
@Input() subtitles: string[]; @Input() subtitles: string[];
@Input() config: DonutChartConfig[] = []; @Input() config: DonutChartConfig[] = [];
@Input() radius = 85; @Input() radius = 85;
@ -34,7 +35,7 @@ export class DonutChartComponent implements OnChanges, OnInit {
cx = 0; cx = 0;
cy = 0; cy = 0;
size = 0; size = 0;
filters$: Observable<INestedFilter[]>; readonly filters = computed(() => this.filterService?.getFilterModels(this.filterKey) ?? []);
constructor(@Optional() readonly filterService: FilterService) { constructor(@Optional() readonly filterService: FilterService) {
// TODO: move this component to a separate module, split into smaller components, improve filters // TODO: move this component to a separate module, split into smaller components, improve filters
@ -52,15 +53,6 @@ export class DonutChartComponent implements OnChanges, OnInit {
return this.totalType === 'sum' ? this.dataTotal : this.config.length; return this.totalType === 'sum' ? this.dataTotal : this.config.length;
} }
ngOnInit() {
const filterModels$ = this.filterService?.getFilterModels$(this.filterKey).pipe(
map(filters => filters ?? []),
shareLast(),
);
this.filters$ = filterModels$ ?? of([]);
}
ngOnChanges(): void { ngOnChanges(): void {
this.calculateChartData(); this.calculateChartData();
this.cx = this.radius + this.strokeWidth / 2; this.cx = this.radius + this.strokeWidth / 2;
@ -68,11 +60,8 @@ export class DonutChartComponent implements OnChanges, OnInit {
this.size = this.strokeWidth + this.radius * 2; this.size = this.strokeWidth + this.radius * 2;
} }
filterChecked$(key: string): Observable<boolean> { filterChecked(key: string): boolean {
return this.filters$.pipe( return !!this.filters().find(filter => filter.id === key)?.checked;
get(filter => filter.id === key),
map(filter => !!filter?.checked),
);
} }
getFormattedValue(value: number): string { getFormattedValue(value: number): string {

@ -1 +1 @@
Subproject commit a4e425d3739d6145325a8fe347d9fcae1e12a662 Subproject commit 41d19013adcfc678987d06b4c3e53f8bec7a67f8