diff --git a/src/lib/dialog/iqser-dialog-component.directive.ts b/src/lib/dialog/iqser-dialog-component.directive.ts index 9a2e4f2..0f41d3e 100644 --- a/src/lib/dialog/iqser-dialog-component.directive.ts +++ b/src/lib/dialog/iqser-dialog-component.directive.ts @@ -3,6 +3,7 @@ import { MAT_DIALOG_DATA, MatDialog, MatDialogRef } from '@angular/material/dial import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { hasFormChanged, IqserEventTarget } from '../utils'; import { FormGroup } from '@angular/forms'; +import { IconButtonTypes } from '../buttons'; const DIALOG_CONTAINER = 'mat-dialog-container'; const DATA_TYPE_SYMBOL = Symbol.for('DATA_TYPE'); @@ -16,6 +17,7 @@ export abstract class IqserDialogComponent readonly [DATA_TYPE_SYMBOL]!: DataType; readonly [RETURN_TYPE_SYMBOL]!: ReturnType; + readonly iconButtonTypes = IconButtonTypes; readonly dialogRef = inject(MatDialogRef); readonly data = inject(MAT_DIALOG_DATA); readonly dialog = inject(MatDialog); diff --git a/src/lib/filtering/filter-card/filter-card.component.ts b/src/lib/filtering/filter-card/filter-card.component.ts index 9b97328..b70fb55 100644 --- a/src/lib/filtering/filter-card/filter-card.component.ts +++ b/src/lib/filtering/filter-card/filter-card.component.ts @@ -85,39 +85,21 @@ export class FilterCardComponent implements OnInit { } filterCheckboxClicked(nestedFilter: INestedFilter, filterGroup: IFilterGroup, parent?: INestedFilter): void { - if (filterGroup.singleSelect) { - this.deactivateFilters(nestedFilter.id); - } + this.filterService.filterCheckboxClicked({ + nestedFilter, + filterGroup, + parent, + primaryFiltersSlug: this.primaryFiltersSlug, + fileId: this.fileId, + }); + } - // eslint-disable-next-line no-param-reassign - nestedFilter.checked = !nestedFilter.checked; - - if (parent) { - handleCheckedValue(parent); - } else { - // eslint-disable-next-line no-param-reassign - if (nestedFilter.indeterminate) { - nestedFilter.checked = false; - } - // eslint-disable-next-line no-param-reassign - nestedFilter.indeterminate = false; - // eslint-disable-next-line no-return-assign,no-param-reassign - nestedFilter.children?.forEach(f => (f.checked = !!nestedFilter.checked)); - } - - this.filterService.refresh(); - this.#updateFiltersInLocalStorage(); + deactivateFilters() { + this.filterService.deactivateFilters({ primaryFiltersSlug: this.primaryFiltersSlug }); } activatePrimaryFilters(): void { - this._setFilters(this.primaryFiltersSlug, true); - } - - deactivateFilters(exceptedFilterId?: string): void { - this._setFilters(this.primaryFiltersSlug, false, exceptedFilterId); - if (this.secondaryFiltersSlug) { - this._setFilters(this.secondaryFiltersSlug, false, exceptedFilterId); - } + this.filterService.setFilters(this.primaryFiltersSlug, true); } toggleFilterExpanded(nestedFilter: INestedFilter): void { @@ -125,36 +107,4 @@ export class FilterCardComponent implements OnInit { nestedFilter.expanded = !nestedFilter.expanded; this.filterService.refresh(); } - - private _setFilters(filterGroup: string, checked = false, exceptedFilterId?: string) { - const filters = this.filterService.getGroup(filterGroup)?.filters; - filters?.forEach(f => { - if (f.id !== exceptedFilterId) { - // eslint-disable-next-line no-param-reassign - f.checked = checked; - // eslint-disable-next-line no-param-reassign - f.indeterminate = false; - // eslint-disable-next-line no-return-assign,no-param-reassign - f.children?.forEach(ff => (ff.checked = checked)); - } - }); - this.filterService.refresh(); - } - - #updateFiltersInLocalStorage(): void { - if (this.fileId) { - const primaryFilters = this.filterService.getGroup('primaryFilters'); - const secondaryFilters = this.filterService.getGroup('secondaryFilters'); - - const filters: LocalStorageFilters = { - primaryFilters: extractFilterValues(primaryFilters?.filters), - secondaryFilters: extractFilterValues(secondaryFilters?.filters), - }; - - const workloadFiltersString = localStorage.getItem('workload-filters') ?? '{}'; - const workloadFilters = JSON.parse(workloadFiltersString); - workloadFilters[this.fileId] = filters; - localStorage.setItem('workload-filters', JSON.stringify(workloadFilters)); - } - } } diff --git a/src/lib/filtering/filter.service.ts b/src/lib/filtering/filter.service.ts index f5c4f80..2969051 100644 --- a/src/lib/filtering/filter.service.ts +++ b/src/lib/filtering/filter.service.ts @@ -1,13 +1,28 @@ import { Injectable } from '@angular/core'; import { BehaviorSubject, Observable, Subject } from 'rxjs'; import { map, startWith, switchMap } from 'rxjs/operators'; -import { processFilters, toFlatFilters } from './filter-utils'; +import { extractFilterValues, handleCheckedValue, processFilters, toFlatFilters } from './filter-utils'; import { IFilterGroup } from './models/filter-group.model'; import { INestedFilter } from './models/nested-filter.model'; import { get, shareDistinctLast, shareLast, some } from '../utils'; import { NestedFilter } from './models/nested-filter'; import { Filter } from './models/filter'; import { IFilter } from './models/filter.model'; +import { LocalStorageFilters } from './filter-card/filter-card.component'; + +export interface CheckboxClickedParams { + nestedFilter: INestedFilter; + filterGroup: IFilterGroup; + parent?: INestedFilter; + fileId?: string; + primaryFiltersSlug: string; +} + +export interface DeactivateFiltersParams { + primaryFiltersSlug: string; + secondaryFiltersSlug?: string; + exceptedFilterId?: string; +} @Injectable() export class FilterService { @@ -196,4 +211,71 @@ export class FilterService { this.addSingleFilter(filter); } } + + setFilters(filterGroup: string, checked = false, exceptedFilterId?: string) { + const filters = this.getGroup(filterGroup)?.filters; + filters?.forEach(f => { + if (f.id !== exceptedFilterId) { + // eslint-disable-next-line no-param-reassign + f.checked = checked; + // eslint-disable-next-line no-param-reassign + f.indeterminate = false; + // eslint-disable-next-line no-return-assign,no-param-reassign + f.children?.forEach(ff => (ff.checked = checked)); + } + }); + this.refresh(); + } + + deactivateFilters(params: DeactivateFiltersParams) { + const { primaryFiltersSlug, secondaryFiltersSlug, exceptedFilterId } = params; + this.setFilters(primaryFiltersSlug, false, exceptedFilterId); + if (secondaryFiltersSlug) { + this.setFilters(secondaryFiltersSlug, false, exceptedFilterId); + } + } + + filterCheckboxClicked(params: CheckboxClickedParams) { + const { filterGroup, nestedFilter, parent, fileId, primaryFiltersSlug } = params; + + if (filterGroup.singleSelect) { + this.deactivateFilters({ primaryFiltersSlug, exceptedFilterId: nestedFilter.id }); + } + + // eslint-disable-next-line no-param-reassign + nestedFilter.checked = !nestedFilter.checked; + + if (parent) { + handleCheckedValue(parent); + } else { + // eslint-disable-next-line no-param-reassign + if (nestedFilter.indeterminate) { + nestedFilter.checked = false; + } + // eslint-disable-next-line no-param-reassign + nestedFilter.indeterminate = false; + // eslint-disable-next-line no-return-assign,no-param-reassign + nestedFilter.children?.forEach(f => (f.checked = !!nestedFilter.checked)); + } + + this.refresh(); + this.#updateFiltersInLocalStorage(fileId); + } + + #updateFiltersInLocalStorage(fileId?: string) { + if (fileId) { + const primaryFilters = this.getGroup('primaryFilters'); + const secondaryFilters = this.getGroup('secondaryFilters'); + + const filters: LocalStorageFilters = { + primaryFilters: extractFilterValues(primaryFilters?.filters), + secondaryFilters: extractFilterValues(secondaryFilters?.filters), + }; + + const workloadFiltersString = localStorage.getItem('workload-filters') ?? '{}'; + const workloadFilters = JSON.parse(workloadFiltersString); + workloadFilters[fileId] = filters; + localStorage.setItem('workload-filters', JSON.stringify(workloadFilters)); + } + } }