import { AsyncPipe, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, computed, inject, input, output, TemplateRef } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; import { combineLatest, Observable, of } from 'rxjs'; import { distinctUntilChanged, map } from 'rxjs/operators'; import { CircleButtonComponent } from '../../buttons'; import { IconButtonComponent } from '../../buttons'; import { IconButtonTypes } from '../../buttons'; import { FilterService } from '../../filtering'; import { IqserFiltersModule } from '../../filtering'; import { PopupFilterComponent } from '../../filtering'; import { InputWithActionComponent } from '../../inputs/input-with-action/input-with-action.component'; import { SearchService } from '../../search'; import { filterEach } from '../../utils'; import { List } from '../../utils'; import { IListable } from '../models'; import { ActionConfig, ButtonConfig, SearchPosition, SearchPositions } from './models'; @Component({ selector: 'iqser-page-header', templateUrl: './page-header.component.html', styleUrls: ['./page-header.component.scss'], changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [ AsyncPipe, NgTemplateOutlet, PopupFilterComponent, IqserFiltersModule, IconButtonComponent, CircleButtonComponent, TranslateModule, InputWithActionComponent, ], }) export class PageHeaderComponent { readonly searchPositions = SearchPositions; readonly iconButtonTypes = IconButtonTypes; readonly filterService = inject(FilterService, { optional: true }); readonly searchService = inject>(SearchService, { optional: true }); readonly pageLabel = input(); readonly searchInputId = input(); readonly showCloseButton = input(false); readonly hideResetButton = input(false); readonly actionConfigs = input>(); readonly buttonConfigs = input>(); readonly viewModeSelection = input>(); readonly searchPlaceholder = input(); readonly searchWidth = input(); readonly helpModeKey = input<'dossier' | 'document'>(); readonly searchPosition = input(SearchPositions.afterFilters); readonly closeAction = output(); readonly filterHelpModeKey = computed(() => this.helpModeKey() ? (this.helpModeKey() === 'dossier' ? 'filter_dossier_list' : 'filter_documents') : '', ); readonly filters$ = this.filterService?.filterGroups$.pipe(filterEach(f => !!f.icon)); readonly showResetFilters$ = this.#showResetFilters$; get #showResetFilters$(): Observable { if (!this.filterService) { return of(false); } return combineLatest([this.filterService.showResetFilters$, this.searchService?.valueChanges$ ?? of(undefined)]).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; } }