diff --git a/src/lib/filtering/filters.module.ts b/src/lib/filtering/filters.module.ts index 49a32da..1e516e2 100644 --- a/src/lib/filtering/filters.module.ts +++ b/src/lib/filtering/filters.module.ts @@ -7,14 +7,15 @@ import { IqserButtonsModule } from '../buttons'; import { PopupFilterComponent } from './popup-filter/popup-filter.component'; import { QuickFiltersComponent } from './quick-filters/quick-filters.component'; import { IqserIconsModule } from '../icons'; +import { IqserInputsModule } from '../inputs'; const matModules = [MatCheckboxModule, MatMenuModule]; -const modules = [TranslateModule, IqserButtonsModule]; +const modules = [TranslateModule, IqserButtonsModule, IqserIconsModule, IqserInputsModule]; const components = [QuickFiltersComponent, PopupFilterComponent]; @NgModule({ declarations: [...components], exports: [...components], - imports: [CommonModule, IqserIconsModule, ...matModules, ...modules] + imports: [CommonModule, ...matModules, ...modules] }) export class IqserFiltersModule {} diff --git a/src/lib/filtering/models/filter-group.model.ts b/src/lib/filtering/models/filter-group.model.ts index d1d6789..8deb35a 100644 --- a/src/lib/filtering/models/filter-group.model.ts +++ b/src/lib/filtering/models/filter-group.model.ts @@ -7,6 +7,8 @@ export interface FilterGroup { readonly label?: string; readonly icon?: string; readonly filterTemplate?: TemplateRef; + /** Enables a search bar above each filter popup that will filter filters */ + readonly filterceptionPlaceholder?: string; readonly hide?: boolean; readonly checker?: (...args: unknown[]) => boolean; readonly matchAll?: boolean; diff --git a/src/lib/filtering/popup-filter/popup-filter.component.html b/src/lib/filtering/popup-filter/popup-filter.component.html index 335429b..a45e63b 100644 --- a/src/lib/filtering/popup-filter/popup-filter.component.html +++ b/src/lib/filtering/popup-filter/popup-filter.component.html @@ -23,27 +23,22 @@ xPosition="before" > -
-
-
-
-
-
-
+ + +
-
- -
+
+ - - {{ filter?.label }} - + + {{ filter?.label }} + - -
-
- - -
-
 
- + +
+
+
+
+
+
+
+
+ + +
+
+ + +
+ +
 
+ + + + + + +
+ +
+
+ - -
-
-
- - - - - -
+
- - +
+
diff --git a/src/lib/filtering/popup-filter/popup-filter.component.scss b/src/lib/filtering/popup-filter/popup-filter.component.scss index 1a48d2f..d569c5d 100644 --- a/src/lib/filtering/popup-filter/popup-filter.component.scss +++ b/src/lib/filtering/popup-filter/popup-filter.component.scss @@ -5,7 +5,7 @@ display: flex; justify-content: space-between; padding: 8px 16px 16px 16px; - width: 350px; + min-width: 350px; .actions { display: flex; @@ -39,3 +39,7 @@ height: 100%; } } + +iqser-input-with-action { + padding: 0 8px 8px 8px; +} diff --git a/src/lib/filtering/popup-filter/popup-filter.component.ts b/src/lib/filtering/popup-filter/popup-filter.component.ts index 98a6cf6..325c38c 100644 --- a/src/lib/filtering/popup-filter/popup-filter.component.ts +++ b/src/lib/filtering/popup-filter/popup-filter.component.ts @@ -7,6 +7,8 @@ import { handleCheckedValue } from '../filter-utils'; import { FilterService } from '../filter.service'; import { FilterGroup } from '../models/filter-group.model'; import { NestedFilter } from '../models/nested-filter.model'; +import { SearchService } from '../../search'; +import { Filter } from '..'; const areExpandable = (nestedFilter: NestedFilter) => !!nestedFilter?.children?.length; const atLeastOneIsExpandable = pipe( @@ -27,7 +29,8 @@ const atLeastOneIsExpandable = pipe( clickAction: 'noop', color: 'primary' } - } + }, + SearchService ] }) export class PopupFilterComponent implements OnInit { @@ -43,8 +46,11 @@ export class PopupFilterComponent implements OnInit { primaryFilterGroup$!: Observable; secondaryFilterGroup$!: Observable; + primaryFilters$!: Observable; - constructor(readonly filterService: FilterService) {} + constructor(readonly filterService: FilterService, readonly searchService: SearchService) { + this.searchService.setSearchKey('label'); + } private get _hasActiveFilters$() { return combineLatest([this.primaryFilterGroup$, this.secondaryFilterGroup$]).pipe( @@ -55,8 +61,9 @@ export class PopupFilterComponent implements OnInit { } ngOnInit(): void { - this.primaryFilterGroup$ = this.filterService.getGroup$(this.primaryFiltersSlug); - this.secondaryFilterGroup$ = this.filterService.getGroup$(this.secondaryFiltersSlug); + this.primaryFilterGroup$ = this.filterService.getGroup$(this.primaryFiltersSlug).pipe(shareReplay(2)); + this.primaryFilters$ = this._primaryFilters$; + this.secondaryFilterGroup$ = this.filterService.getGroup$(this.secondaryFiltersSlug).pipe(shareReplay(3)); this.hasActiveFilters$ = this._hasActiveFilters$; this.atLeastOneFilterIsExpandable$ = atLeastOneIsExpandable(this.primaryFilterGroup$); @@ -115,4 +122,10 @@ export class PopupFilterComponent implements OnInit { }); this.filterService.refresh(); } + + private get _primaryFilters$(): Observable { + return combineLatest([this.primaryFilterGroup$, this.searchService.valueChanges$]).pipe( + map(([group]) => this.searchService.searchIn(group?.filters ?? [])) + ); + } }