From c78b00e21ad17aa5abf1ebf18bb468505abf3101 Mon Sep 17 00:00:00 2001 From: George Date: Mon, 17 Jul 2023 11:32:05 +0300 Subject: [PATCH] RED-6408, clone components using the old filter service in the searchscreen. --- .../search-screen-filtering/filter.service.ts | 13 +-- .../page-header/page-header.component.html | 94 +++++++++++++++++++ .../page-header/page-header.component.scss | 3 + .../page-header/page-header.component.ts | 75 +++++++++++++++ tsconfig.json | 3 +- 5 files changed, 177 insertions(+), 11 deletions(-) create mode 100644 src/lib/search-screen-filtering/page-header/page-header.component.html create mode 100644 src/lib/search-screen-filtering/page-header/page-header.component.scss create mode 100644 src/lib/search-screen-filtering/page-header/page-header.component.ts diff --git a/src/lib/search-screen-filtering/filter.service.ts b/src/lib/search-screen-filtering/filter.service.ts index 4fa57d0..1b44134 100644 --- a/src/lib/search-screen-filtering/filter.service.ts +++ b/src/lib/search-screen-filtering/filter.service.ts @@ -1,9 +1,4 @@ -import { computed, Injectable, signal } from '@angular/core'; - -const PARENT_PROPS = ['children', 'indeterminate', 'expanded'] as const; -const PARENT_FILTER_ID = 'parentFilterId'; -type ParentProps = (typeof PARENT_PROPS)[number]; -type ChildFilter = Omit & { [PARENT_FILTER_ID]: string }; +import { Injectable, signal } from '@angular/core'; interface Filter { id: string; @@ -13,7 +8,7 @@ interface Filter { checked: boolean; disabled: boolean; meta: Record | undefined; - children: Record | undefined; + children: Record> | undefined; } interface FilterGroup { name: string; @@ -22,11 +17,9 @@ interface FilterGroup { } const safeObj = (obj: T | undefined) => obj ?? ({} as T); -const getFiltersWithChildren = (filters: Filter[]) => filters.flatMap(filter => [filter, ...Object.values(safeObj(filter.children))]); -const isChild = (filter: Filter | ChildFilter): filter is ChildFilter => PARENT_FILTER_ID in filter; @Injectable() -export class FilterService { +export class SearcnScreenFilterService { readonly #filterGroups = signal | undefined>(undefined); readonly filterGroups = this.#filterGroups.asReadonly(); diff --git a/src/lib/search-screen-filtering/page-header/page-header.component.html b/src/lib/search-screen-filtering/page-header/page-header.component.html new file mode 100644 index 0000000..4952155 --- /dev/null +++ b/src/lib/search-screen-filtering/page-header/page-header.component.html @@ -0,0 +1,94 @@ + + + + + diff --git a/src/lib/search-screen-filtering/page-header/page-header.component.scss b/src/lib/search-screen-filtering/page-header/page-header.component.scss new file mode 100644 index 0000000..49cd036 --- /dev/null +++ b/src/lib/search-screen-filtering/page-header/page-header.component.scss @@ -0,0 +1,3 @@ +.actions iqser-input-with-action { + margin-right: 16px; +} diff --git a/src/lib/search-screen-filtering/page-header/page-header.component.ts b/src/lib/search-screen-filtering/page-header/page-header.component.ts new file mode 100644 index 0000000..8554272 --- /dev/null +++ b/src/lib/search-screen-filtering/page-header/page-header.component.ts @@ -0,0 +1,75 @@ +import { ChangeDetectionStrategy, Component, EventEmitter, Input, Optional, Output, TemplateRef } from '@angular/core'; +import { distinctUntilChanged, map } from 'rxjs/operators'; +import { combineLatest, Observable, of } from 'rxjs'; + +import { CircleButtonComponent, IconButtonComponent, IconButtonTypes } from '../../buttons'; +import { SearchService } from '../../search'; +import { FilterService } from '../../filtering'; +import { filterEach, List } from '../../utils'; +import { ActionConfig, ButtonConfig, IListable, SearchPosition, SearchPositions } from '../../listing'; +import { AsyncPipe, NgFor, NgTemplateOutlet } from '@angular/common'; +import { IqserTranslateModule } from '../../translations'; +import { InputWithActionComponent } from '../../inputs'; + +@Component({ + selector: 'iqser-page-header', + templateUrl: './page-header.component.html', + styleUrls: ['./page-header.component.scss'], + standalone: true, + imports: [ + NgTemplateOutlet, + AsyncPipe, + NgFor, + IqserTranslateModule, + IconButtonComponent, + InputWithActionComponent, + CircleButtonComponent, + ], + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class SearchScreenPageHeaderComponent { + readonly searchPositions = SearchPositions; + readonly iconButtonTypes = IconButtonTypes; + + @Input() pageLabel?: string; + @Input() searchInputId?: string; + @Input() showCloseButton = false; + @Input() hideResetButton = false; + @Input() actionConfigs?: List; + @Input() buttonConfigs?: List; + @Input() viewModeSelection?: TemplateRef; + @Input() searchPlaceholder?: string; + @Input() searchWidth?: number | 'full'; + @Input() helpModeKey?: 'dossier' | 'document'; + @Input() searchPosition: SearchPosition = SearchPositions.afterFilters; + @Output() readonly closeAction = new EventEmitter(); + + readonly filters$ = this.filterService?.filterGroups$.pipe(filterEach(f => !!f.icon)); + readonly showResetFilters$ = this.#showResetFilters$; + + constructor(@Optional() readonly filterService: FilterService, @Optional() readonly searchService: SearchService) {} + + get filterHelpModeKey() { + return this.helpModeKey ? `filter_${this.helpModeKey}_list` : ''; + } + + get #showResetFilters$(): Observable { + if (!this.filterService) { + return of(false); + } + + return combineLatest([this.filterService.showResetFilters$, this.searchService.valueChanges$]).pipe( + map(([showResetFilters, searchValue]) => showResetFilters || !!searchValue), + distinctUntilChanged(), + ); + } + + resetFilters(): void { + this.filterService.reset(); + this.searchService.reset(); + } + + trackByLabel(_index: number, item: K): string | undefined { + return item.label; + } +} diff --git a/tsconfig.json b/tsconfig.json index b132006..6c63472 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -22,7 +22,8 @@ "allowSyntheticDefaultImports": true, "paths": { "@biesbjerg/ngx-translate-extract-marker": ["src/lib/translations/ngx-translate-extract-marker"] - } + }, + "noUncheckedIndexedAccess": true }, "include": ["./**/*"], "angularCompilerOptions": {