@firestitch/filter 18.2.14 → 18.2.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/app/components/filter/filter.component.d.ts +0 -1
  2. package/app/components/filters-item/week/week.component.d.ts +0 -1
  3. package/app/interfaces/config.interface.d.ts +2 -1
  4. package/app/models/items/autocomplete-chips-item.d.ts +1 -2
  5. package/app/models/items/base-date-item.d.ts +1 -2
  6. package/app/models/items/base-date-range-item.d.ts +1 -2
  7. package/app/models/items/base-item.d.ts +4 -1
  8. package/app/models/items/chips-item.d.ts +1 -4
  9. package/app/models/items/range-item.d.ts +4 -8
  10. package/app/models/items/select-item.d.ts +1 -2
  11. package/app/models/items/week-item.d.ts +1 -2
  12. package/app/services/filter-controller.service.d.ts +0 -2
  13. package/esm2022/app/components/filter/filter.component.mjs +4 -7
  14. package/esm2022/app/components/filter-chips/filter-chips.component.mjs +3 -3
  15. package/esm2022/app/components/filters-item/checkbox/checkbox.component.mjs +2 -2
  16. package/esm2022/app/components/filters-item/week/week.component.mjs +3 -6
  17. package/esm2022/app/interfaces/config.interface.mjs +1 -1
  18. package/esm2022/app/models/filter-config.mjs +5 -2
  19. package/esm2022/app/models/items/autocomplete-chips-item.mjs +3 -6
  20. package/esm2022/app/models/items/base-date-item.mjs +3 -6
  21. package/esm2022/app/models/items/base-date-range-item.mjs +3 -6
  22. package/esm2022/app/models/items/base-item.mjs +10 -9
  23. package/esm2022/app/models/items/chips-item.mjs +3 -25
  24. package/esm2022/app/models/items/range-item.mjs +7 -10
  25. package/esm2022/app/models/items/select-item.mjs +7 -7
  26. package/esm2022/app/models/items/week-item.mjs +3 -40
  27. package/esm2022/app/services/filter-controller.service.mjs +11 -21
  28. package/esm2022/app/services/saved-filter-controller.service.mjs +8 -7
  29. package/fesm2022/firestitch-filter.mjs +67 -145
  30. package/fesm2022/firestitch-filter.mjs.map +1 -1
  31. package/package.json +1 -1
@@ -1,8 +1,8 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { inject, Injectable, Component, ChangeDetectionStrategy, Input, DestroyRef, Injector, EventEmitter, Output, InjectionToken, Directive, Optional, Self, ChangeDetectorRef, ViewChild, NgZone, ElementRef, ContentChild, HostBinding, Pipe, HostListener, NgModule } from '@angular/core';
3
3
  import { FsPrompt } from '@firestitch/prompt';
4
- import { BehaviorSubject, Subject, of, forkJoin, Observable, tap as tap$1, switchMap as switchMap$1, distinctUntilChanged as distinctUntilChanged$1, merge, filter as filter$1, map as map$1, combineLatest, fromEvent, interval, takeUntil as takeUntil$1, debounceTime as debounceTime$1 } from 'rxjs';
5
- import { distinctUntilChanged, tap, switchMap, map, filter, debounceTime, finalize, takeUntil, delay, skip } from 'rxjs/operators';
4
+ import { BehaviorSubject, Subject, of, forkJoin, Observable, tap as tap$1, switchMap as switchMap$1, distinctUntilChanged as distinctUntilChanged$1, merge, filter, map as map$1, combineLatest, fromEvent, interval, takeUntil as takeUntil$1, debounceTime as debounceTime$1 } from 'rxjs';
5
+ import { distinctUntilChanged, tap, switchMap, map, debounceTime, finalize, takeUntil, filter as filter$1, delay, skip } from 'rxjs/operators';
6
6
  import { FsStore } from '@firestitch/store';
7
7
  import { NgSwitch, NgSwitchCase, NgClass, NgTemplateOutlet, NgSwitchDefault, NgIf, AsyncPipe, Location } from '@angular/common';
8
8
  import { MatIconButton, MatFabButton, MatMiniFabButton, MatButton, MatIconAnchor } from '@angular/material/button';
@@ -24,15 +24,15 @@ import * as i6 from '@firestitch/file';
24
24
  import { FsFileModule } from '@firestitch/file';
25
25
  import * as i1$2 from '@firestitch/chip';
26
26
  import { FsChipModule } from '@firestitch/chip';
27
- import { isFunction, clone, toString, isObject, isString } from 'lodash-es';
27
+ import { isFunction, clone, toString, isObject } from 'lodash-es';
28
28
  import { iso8601, format } from '@firestitch/date';
29
29
  import { isDate, isValid, parseISO } from 'date-fns';
30
- import { isEmpty, getNormalizedPath } from '@firestitch/common';
31
30
  import * as i3$2 from '@firestitch/datepicker';
32
31
  import { formatPeriodObject, FsDatePickerModule } from '@firestitch/datepicker';
33
32
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
34
33
  import * as i1$5 from '@angular/material/dialog';
35
34
  import { MatDialogRef, MatDialogModule, MatDialog } from '@angular/material/dialog';
35
+ import { getNormalizedPath } from '@firestitch/common';
36
36
  import { DrawerRef } from '@firestitch/drawer';
37
37
  import { ActivatedRoute } from '@angular/router';
38
38
  import { FsMessage } from '@firestitch/message';
@@ -166,7 +166,8 @@ class SavedFilterController {
166
166
  };
167
167
  }, {}),
168
168
  };
169
- return this._filterController.config.savedFilters.save(savedFilter)
169
+ return this._filterController.config.savedFilters
170
+ .save(savedFilter)
170
171
  .pipe(tap((_savedFilter) => {
171
172
  this.savedFilters = this.activeFilter?.id ? this.savedFilters
172
173
  .map((f) => f.id === savedFilter.id ? _savedFilter : f) : [
@@ -180,7 +181,8 @@ class SavedFilterController {
180
181
  return !!this._filterController.config.savedFilters.order;
181
182
  }
182
183
  order(savedFilters) {
183
- return this._filterController.config.savedFilters.order(savedFilters)
184
+ return this._filterController.config.savedFilters
185
+ .order(savedFilters)
184
186
  .pipe(tap(() => {
185
187
  this.savedFilters = [
186
188
  ...savedFilters,
@@ -188,7 +190,8 @@ class SavedFilterController {
188
190
  }));
189
191
  }
190
192
  delete(savedFilter) {
191
- return this._filterController.config.savedFilters.delete(savedFilter)
193
+ return this._filterController.config.savedFilters
194
+ .delete(savedFilter)
192
195
  .pipe(tap(() => {
193
196
  this.savedFilters = this.savedFilters
194
197
  .filter((f) => f.id !== savedFilter.id);
@@ -204,9 +207,7 @@ class SavedFilterController {
204
207
  if (!existingFilter) {
205
208
  throw new Error(`Saved filter cannot be activated, because it does not exists. Filter ID = ${savedFilter.id}`);
206
209
  }
207
- this._filterController.changeTransaction(() => {
208
- this._filterController.values = existingFilter.filters;
209
- });
210
+ this._filterController.values = existingFilter.filters;
210
211
  this._activeFilter$.next(existingFilter);
211
212
  }
212
213
  else {
@@ -658,7 +659,6 @@ class BaseItem {
658
659
  _value$ = new BehaviorSubject({ value: undefined, emitChange: true });
659
660
  _values$ = new BehaviorSubject(null);
660
661
  _destroy$ = new Subject();
661
- _emitChange = true;
662
662
  constructor(itemConfig, _additionalConfig, _filter) {
663
663
  this._additionalConfig = _additionalConfig;
664
664
  this._filter = _filter;
@@ -729,7 +729,7 @@ class BaseItem {
729
729
  }
730
730
  get chips$() {
731
731
  return this.value$
732
- .pipe(map(() => this.chips));
732
+ .pipe(map(() => this.chips || []));
733
733
  }
734
734
  set values(values) {
735
735
  this._values$.next(values);
@@ -738,12 +738,14 @@ class BaseItem {
738
738
  return this._values$.getValue();
739
739
  }
740
740
  get values$() {
741
- return this._values$.asObservable()
742
- .pipe(filter(() => this._emitChange));
741
+ return this._values$.asObservable();
742
+ }
743
+ get valueEvent$() {
744
+ return this._value$.asObservable();
743
745
  }
744
746
  get value$() {
745
747
  return this._value$.asObservable()
746
- .pipe(filter((event) => event.emitChange), map((event) => event.value));
748
+ .pipe(map((event) => event.value));
747
749
  }
748
750
  get value() {
749
751
  return this._value$.getValue().value;
@@ -800,11 +802,11 @@ class BaseItem {
800
802
  }), tap((values) => this.values = values || []));
801
803
  }
802
804
  initValue(value) {
803
- this.value = value === undefined ? this.defaultValue : value;
805
+ this.setValue(value === undefined ? this.defaultValue : value);
804
806
  }
805
807
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
806
808
  clear(name = null) {
807
- this.value = this.defaultValue ?? undefined;
809
+ this.setValue(this.defaultValue ?? undefined);
808
810
  }
809
811
  destroy() {
810
812
  this._destroy$.next(null);
@@ -915,11 +917,8 @@ class AutocompleteChipsItem extends BaseAutocompleteItem {
915
917
  get hasValue() {
916
918
  return Array.isArray(super.value) && super.value.length > 0;
917
919
  }
918
- get value() {
919
- return super.value || [];
920
- }
921
- set value(value) {
922
- super.value = value || [];
920
+ setValue(value, emitChange = true) {
921
+ super.setValue(Array.isArray(value) ? value : [], emitChange);
923
922
  }
924
923
  }
925
924
 
@@ -1058,33 +1057,12 @@ class ChipsItem extends BaseItem {
1058
1057
  },
1059
1058
  ] : [];
1060
1059
  }
1061
- set value(value) {
1062
- super.value = Array.isArray(value) ? value : [];
1063
- }
1064
- get value() {
1065
- return super.value;
1060
+ setValue(value, emitChange = true) {
1061
+ super.setValue(Array.isArray(value) ? value : [], emitChange);
1066
1062
  }
1067
1063
  clear() {
1068
1064
  this.value = [];
1069
1065
  }
1070
- init(value) {
1071
- return super.init(value)
1072
- .pipe(tap$1(() => {
1073
- if (!Array.isArray(this.values)) {
1074
- this.values = [];
1075
- }
1076
- if (super.value && Array.isArray(super.value) && this.values.length) {
1077
- if (Number.isInteger(super.value[0])) {
1078
- super.value = super.value.map((id) => {
1079
- return this.values.find((item) => item.value === id);
1080
- });
1081
- }
1082
- }
1083
- if (super.value === undefined) {
1084
- super.value = [];
1085
- }
1086
- }));
1087
- }
1088
1066
  }
1089
1067
 
1090
1068
  class BaseDateItem extends BaseItem {
@@ -1099,16 +1077,13 @@ class BaseDateItem extends BaseItem {
1099
1077
  this.maxYear = itemConfig.maxYear;
1100
1078
  this.mode = itemConfig.mode || ItemDateMode.Calendar;
1101
1079
  }
1102
- set value(value) {
1080
+ setValue(value, emitChange = true) {
1103
1081
  if (value) {
1104
1082
  if (!isDate(value) || !isValid(value)) {
1105
1083
  value = parseISO(value);
1106
1084
  }
1107
1085
  }
1108
- super.value = value;
1109
- }
1110
- get value() {
1111
- return super.value;
1086
+ super.setValue(value, emitChange);
1112
1087
  }
1113
1088
  }
1114
1089
 
@@ -1155,10 +1130,7 @@ class BaseDateRangeItem extends BaseItem {
1155
1130
  get hasValue() {
1156
1131
  return this.value?.from instanceof Date || this.value?.to instanceof Date;
1157
1132
  }
1158
- get value() {
1159
- return super.value;
1160
- }
1161
- set value(value) {
1133
+ setValue(value, emitChange = true) {
1162
1134
  let from = value?.from;
1163
1135
  let to = value?.to;
1164
1136
  if (value) {
@@ -1169,7 +1141,7 @@ class BaseDateRangeItem extends BaseItem {
1169
1141
  to = parseISO(to);
1170
1142
  }
1171
1143
  }
1172
- super.value = { from, to };
1144
+ super.setValue({ from, to }, emitChange);
1173
1145
  }
1174
1146
  get queryParam() {
1175
1147
  if (!this.hasValue) {
@@ -1323,18 +1295,15 @@ class RangeItem extends BaseItem {
1323
1295
  }
1324
1296
  this.value = { ...value };
1325
1297
  }
1326
- get value() {
1327
- return {
1328
- min: super.value?.min,
1329
- max: super.value?.max,
1330
- };
1331
- }
1332
- set value(value) {
1333
- super.value = value;
1334
- }
1335
1298
  get hasValue() {
1336
1299
  return this.value?.min !== undefined || super.value?.max !== undefined;
1337
1300
  }
1301
+ setValue(value, emitChange = true) {
1302
+ super.setValue({
1303
+ min: value?.min,
1304
+ max: value?.max,
1305
+ }, emitChange);
1306
+ }
1338
1307
  init(value) {
1339
1308
  return super.init(value)
1340
1309
  .pipe(tap$1(() => {
@@ -1381,14 +1350,14 @@ class SelectItem extends BaseItem {
1381
1350
  }
1382
1351
  }));
1383
1352
  }
1384
- get value() {
1353
+ setValue(value, emitChange = true) {
1385
1354
  if (this.multiple) {
1386
- return Array.isArray(super.value) ? super.value : [];
1355
+ value = Array.isArray(value) ? value : [];
1387
1356
  }
1388
- return super.value;
1389
- }
1390
- set value(value) {
1391
- super.value = value;
1357
+ else {
1358
+ value = Array.isArray(value) ? undefined : value;
1359
+ }
1360
+ super.setValue(value, emitChange);
1392
1361
  }
1393
1362
  get queryParam() {
1394
1363
  if (!this.hasValue) {
@@ -1511,47 +1480,13 @@ class WeekItem extends BaseItem {
1511
1480
  static create(config, filter) {
1512
1481
  return new WeekItem(config, null, filter);
1513
1482
  }
1514
- get value() {
1515
- let value = clone(super.value);
1516
- if (!isObject(value) ||
1517
- (isEmpty(value.from, { zero: true }) && isEmpty(value.to, { zero: true }))) {
1518
- value = undefined;
1519
- }
1520
- if (isEmpty(value, { zero: true })) {
1521
- return undefined;
1522
- }
1523
- let from = value.from;
1524
- let to = value.to;
1525
- const period = value.period;
1526
- value = {};
1527
- if (from) {
1528
- if (isString(from)) {
1529
- from = parseISO(from);
1530
- }
1531
- if (isValid(from) && isDate(from)) {
1532
- value.from = from;
1533
- }
1534
- }
1535
- if (to) {
1536
- if (isString(to)) {
1537
- to = parseISO(to);
1538
- }
1539
- if (isValid(to) && isDate(to)) {
1540
- value.to = to;
1541
- }
1542
- }
1543
- if (period) {
1544
- value.period = isString(period) ? parseInt(period, 10) : period;
1545
- }
1546
- return value;
1547
- }
1548
- set value(value) {
1483
+ setValue(value, emitChange = true) {
1549
1484
  if (value) {
1550
1485
  value.from = parseDate(value.from);
1551
1486
  value.to = parseDate(value.to);
1552
1487
  value.period = parseInt(value.period, 10) || undefined;
1553
1488
  }
1554
- super.value = value;
1489
+ super.setValue(value, emitChange);
1555
1490
  }
1556
1491
  get query() {
1557
1492
  const value = this.value;
@@ -1944,7 +1879,7 @@ class QueryParamController {
1944
1879
  this._filterController = filterController;
1945
1880
  this._enabled = this._filterController.config.queryParam;
1946
1881
  merge(this._filterController.change$, this._filterController.init$)
1947
- .pipe(filter$1(() => this.enabled), tap$1(() => this.updateQueryParams()), takeUntilDestroyed(this._destroyRef))
1882
+ .pipe(filter(() => this.enabled), tap$1(() => this.updateQueryParams()), takeUntilDestroyed(this._destroyRef))
1948
1883
  .subscribe();
1949
1884
  return of(null);
1950
1885
  }
@@ -2003,7 +1938,6 @@ class FilterController {
2003
1938
  _queryParamController = inject(QueryParamController);
2004
1939
  _keywordController = inject(KeywordController);
2005
1940
  _sortController = inject(SortController);
2006
- _emitChange = true;
2007
1941
  get items() {
2008
1942
  return Array.from(this._items.values());
2009
1943
  }
@@ -2051,20 +1985,12 @@ class FilterController {
2051
1985
  getItem(name) {
2052
1986
  return this._items.get(name);
2053
1987
  }
2054
- changeTransaction(fn) {
2055
- this._emitChange = false;
2056
- fn();
2057
- this._emitChange = true;
2058
- this._change$.next(null);
2059
- }
2060
1988
  filtersClear() {
2061
- this.changeTransaction(() => {
2062
- this.items.forEach((item) => {
2063
- item.clear();
2064
- });
2065
- this._keywordController.clear();
2066
- this._sortController.clear();
1989
+ this.items.forEach((item) => {
1990
+ item.clear();
2067
1991
  });
1992
+ this._keywordController.clear();
1993
+ this._sortController.clear();
2068
1994
  }
2069
1995
  get queryParam() {
2070
1996
  return this.items
@@ -2088,11 +2014,10 @@ class FilterController {
2088
2014
  };
2089
2015
  }
2090
2016
  set values(values) {
2091
- this.changeTransaction(() => {
2092
- this.items.forEach((item) => {
2093
- item.value = values[item.name];
2094
- });
2017
+ this.items.forEach((item) => {
2018
+ item.setValue(values[item.name], false);
2095
2019
  });
2020
+ this.change();
2096
2021
  }
2097
2022
  get values() {
2098
2023
  return this.items
@@ -2163,12 +2088,12 @@ class FilterController {
2163
2088
  }
2164
2089
  _initChanges() {
2165
2090
  merge(...this.items
2166
- .map((item) => item.value$
2167
- .pipe(map(() => item))))
2091
+ .map((item) => item.valueEvent$
2092
+ .pipe(filter$1((event) => event.emitChange), map(() => item))))
2168
2093
  .pipe(tap((item) => this._change$.next([item])), takeUntil(this._destroy$))
2169
2094
  .subscribe();
2170
2095
  this._change$
2171
- .pipe(filter(() => this._emitChange), tap((items) => {
2096
+ .pipe(tap((items) => {
2172
2097
  if (this._config.change) {
2173
2098
  this._config.change(this.query, this._sortController.getSort());
2174
2099
  }
@@ -2197,7 +2122,7 @@ class FocusControllerService {
2197
2122
  }
2198
2123
  listenFocusFor$(targetItem, targetType) {
2199
2124
  return this._focusOn
2200
- .pipe(filter((event) => !!event), filter(({ item, type }) => {
2125
+ .pipe(filter$1((event) => !!event), filter$1(({ item, type }) => {
2201
2126
  return targetItem === item && targetType === type;
2202
2127
  }), tap(() => this.clearFocus()));
2203
2128
  }
@@ -2225,14 +2150,14 @@ class FsFilterChipsComponent {
2225
2150
  item.clear(chip.name);
2226
2151
  }
2227
2152
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterChipsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2228
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FsFilterChipsComponent, isStandalone: true, selector: "fs-filter-chips", ngImport: i0, template: "@for (item of items; track item.name) {\n @let chips = item.chips$ | async;\n @if (chips.length > 0) {\n @for (chip of chips; track chip.label) {\n <fs-chip\n [removable]=\"item.showClear\"\n size=\"small\"\n (click)=\"click(item, chip)\"\n (removed)=\"remove(item, chip)\">\n {{ chip.value ? chip.label + ': ' + chip.value : chip.label }}\n </fs-chip>\n }\n }\n}", styles: [""], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FsChipModule }, { kind: "component", type: i1$2.FsChipComponent, selector: "fs-chip", inputs: ["selectable", "removable", "value", "maxWidth", "width", "backgroundColor", "borderColor", "color", "shape", "outlined", "icon", "image", "selected", "padding", "contrastColor", "size"], outputs: ["selectedToggled", "removed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2153
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: FsFilterChipsComponent, isStandalone: true, selector: "fs-filter-chips", ngImport: i0, template: "@for (item of items; track item.name) {\n @for (chip of item.chips$ | async; track chip.label) {\n <fs-chip\n [removable]=\"item.showClear\"\n size=\"small\"\n (click)=\"click(item, chip)\"\n (removed)=\"remove(item, chip)\">\n {{ chip.value ? chip.label + ': ' + chip.value : chip.label }}\n </fs-chip>\n }\n}", styles: [""], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "ngmodule", type: FsChipModule }, { kind: "component", type: i1$2.FsChipComponent, selector: "fs-chip", inputs: ["selectable", "removable", "value", "maxWidth", "width", "backgroundColor", "borderColor", "color", "shape", "outlined", "icon", "image", "selected", "padding", "contrastColor", "size"], outputs: ["selectedToggled", "removed"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
2229
2154
  }
2230
2155
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FsFilterChipsComponent, decorators: [{
2231
2156
  type: Component,
2232
2157
  args: [{ selector: 'fs-filter-chips', changeDetection: ChangeDetectionStrategy.OnPush, standalone: true, imports: [
2233
2158
  AsyncPipe,
2234
2159
  FsChipModule,
2235
- ], template: "@for (item of items; track item.name) {\n @let chips = item.chips$ | async;\n @if (chips.length > 0) {\n @for (chip of chips; track chip.label) {\n <fs-chip\n [removable]=\"item.showClear\"\n size=\"small\"\n (click)=\"click(item, chip)\"\n (removed)=\"remove(item, chip)\">\n {{ chip.value ? chip.label + ': ' + chip.value : chip.label }}\n </fs-chip>\n }\n }\n}" }]
2160
+ ], template: "@for (item of items; track item.name) {\n @for (chip of item.chips$ | async; track chip.label) {\n <fs-chip\n [removable]=\"item.showClear\"\n size=\"small\"\n (click)=\"click(item, chip)\"\n (removed)=\"remove(item, chip)\">\n {{ chip.value ? chip.label + ': ' + chip.value : chip.label }}\n </fs-chip>\n }\n}" }]
2236
2161
  }] });
2237
2162
 
2238
2163
  class FsFilterDrawerActionsComponent {
@@ -2392,7 +2317,7 @@ class FsFilterOverlayService {
2392
2317
  }
2393
2318
  _openWhenChipClicked() {
2394
2319
  this._focusController.focusOn$
2395
- .pipe(filter((v) => !!v), takeUntil(this._destroy$))
2320
+ .pipe(filter$1((v) => !!v), takeUntil(this._destroy$))
2396
2321
  .subscribe(() => {
2397
2322
  if (!this.isOpened) {
2398
2323
  this.open();
@@ -2770,7 +2695,10 @@ class FsFilterConfig {
2770
2695
  init: data.init,
2771
2696
  change: data.change,
2772
2697
  reload: data.reload,
2773
- autoReload: data.autoReload,
2698
+ autoReload: {
2699
+ ...data.autoReload,
2700
+ enabled: data.autoReload ? data.autoReload.enabled ?? true : false,
2701
+ },
2774
2702
  clear: data.clear,
2775
2703
  sortChange: data.sortChange,
2776
2704
  case: data.case ?? 'camel',
@@ -3217,9 +3145,6 @@ class FilterComponent {
3217
3145
  return this._filterController.items
3218
3146
  .filter((item) => !item.hidden);
3219
3147
  }
3220
- get autoReload() {
3221
- return !!this.config.autoReload;
3222
- }
3223
3148
  get hasFilterChips$() {
3224
3149
  return this._hasFilterChips$.asObservable();
3225
3150
  }
@@ -3424,7 +3349,7 @@ class FilterComponent {
3424
3349
  _listenEscButton() {
3425
3350
  this._zone.runOutsideAngular(() => {
3426
3351
  fromEvent(window, 'keyup')
3427
- .pipe(filter((event) => event.code === 'Escape'), takeUntil(this.closed), takeUntil(this._destroy$))
3352
+ .pipe(filter$1((event) => event.code === 'Escape'), takeUntil(this.closed), takeUntil(this._destroy$))
3428
3353
  .subscribe(() => {
3429
3354
  this._zone.run(() => {
3430
3355
  this.hideDrawer();
@@ -3454,7 +3379,7 @@ class FilterComponent {
3454
3379
  _initAutoReload() {
3455
3380
  if (this.config.autoReload) {
3456
3381
  interval(this.config.autoReload.seconds * 1000)
3457
- .pipe(filter(() => this.autoReload), takeUntil(this._destroy$))
3382
+ .pipe(filter$1(() => this.config.autoReload.enabled), takeUntil(this._destroy$))
3458
3383
  .subscribe(() => {
3459
3384
  this.reload(null);
3460
3385
  });
@@ -3485,7 +3410,7 @@ class FilterComponent {
3485
3410
  ActionsController,
3486
3411
  KeywordController,
3487
3412
  SortController,
3488
- ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }], viewQueries: [{ propertyName: "keywordInput", first: true, predicate: KeywordInputComponent, descendants: true }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"filter-container\">\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n }\n <div class=\"filter-inner-container\">\n @if (notInlineToolbar$ | async) {\n <div class=\"filter-inner-inputs\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @if (savedFilterController.enabled) {\n <fs-saved-filter-autocomplete-chips [savedFiltersController]=\"savedFilterController\"></fs-saved-filter-autocomplete-chips>\n }\n </div>\n } @else {\n <div>\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n }\n</div>\n<ng-template #filterStatusBarChips>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n @if (config.chips) {\n <fs-filter-chips class=\"filter-chips\"></fs-filter-chips>\n }\n</ng-template>\n<ng-template #filterActions>\n @if (actionsVisible$ | async) {\n <div class=\"filter-actions\">\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbar>\n @if (config.reload || config.autoReload || ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting)) {\n <div class=\"filter-toolbar\">\n @if ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"filterButtonClick($event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon [svgIcon]=\"'filterOutline'\"></mat-icon>\n }\n </a>\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n @if (config.autoReload) {\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [(ngModel)]=\"autoReload\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #heading>\n @if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-inner-inputs{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.heading{margin-right:10px}.heading h2{margin:0}.heading h2+.subheading{margin:0}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FsSavedFilterAutocompleteChipsComponent, selector: "fs-saved-filter-autocomplete-chips", inputs: ["savedFiltersController"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsClearModule }, { kind: "component", type: FsFilterChipsComponent, selector: "fs-filter-chips" }, { kind: "component", type: FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "component", type: MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: KeywordInputComponent, selector: "fs-keyword-input", inputs: ["autofocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3413
+ ], queries: [{ propertyName: "statusBar", first: true, predicate: FilterStatusBarDirective, descendants: true }], viewQueries: [{ propertyName: "keywordInput", first: true, predicate: KeywordInputComponent, descendants: true }, { propertyName: "reloadEl", first: true, predicate: ["reloadEl"], descendants: true, read: ElementRef }], ngImport: i0, template: "<div class=\"filter-container\">\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n }\n <div class=\"filter-inner-container\">\n @if (notInlineToolbar$ | async) {\n <div class=\"filter-inner-inputs\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @if (savedFilterController.enabled) {\n <fs-saved-filter-autocomplete-chips [savedFiltersController]=\"savedFilterController\"></fs-saved-filter-autocomplete-chips>\n }\n </div>\n } @else {\n <div>\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n }\n</div>\n<ng-template #filterStatusBarChips>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n @if (config.chips) {\n <fs-filter-chips class=\"filter-chips\"></fs-filter-chips>\n }\n</ng-template>\n<ng-template #filterActions>\n @if (actionsVisible$ | async) {\n <div class=\"filter-actions\">\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbar>\n @if (config.reload || config.autoReload || ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting)) {\n <div class=\"filter-toolbar\">\n @if ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"filterButtonClick($event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon [svgIcon]=\"'filterOutline'\"></mat-icon>\n }\n </a>\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [ngModel]=\"config.autoReload.enabled\"\n (ngModelChange)=\"config.autoReload.enabled = $event\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #heading>\n @if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-inner-inputs{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.heading{margin-right:10px}.heading h2{margin:0}.heading h2+.subheading{margin:0}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FsSavedFilterAutocompleteChipsComponent, selector: "fs-saved-filter-autocomplete-chips", inputs: ["savedFiltersController"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }, { kind: "ngmodule", type: FsClearModule }, { kind: "component", type: FsFilterChipsComponent, selector: "fs-filter-chips" }, { kind: "component", type: FsFilterActionsComponent, selector: "fs-filter-actions", inputs: ["kebabActions", "actions"] }, { kind: "component", type: MatIconAnchor, selector: "a[mat-icon-button]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatSlideToggle, selector: "mat-slide-toggle", inputs: ["name", "id", "labelPosition", "aria-label", "aria-labelledby", "aria-describedby", "required", "color", "disabled", "disableRipple", "tabIndex", "checked", "hideIcon", "disabledInteractive"], outputs: ["change", "toggleChange"], exportAs: ["matSlideToggle"] }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "component", type: KeywordInputComponent, selector: "fs-keyword-input", inputs: ["autofocus"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3489
3414
  }
3490
3415
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FilterComponent, decorators: [{
3491
3416
  type: Component,
@@ -3513,7 +3438,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3513
3438
  MatSlideToggle,
3514
3439
  AsyncPipe,
3515
3440
  KeywordInputComponent,
3516
- ], template: "<div class=\"filter-container\">\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n }\n <div class=\"filter-inner-container\">\n @if (notInlineToolbar$ | async) {\n <div class=\"filter-inner-inputs\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @if (savedFilterController.enabled) {\n <fs-saved-filter-autocomplete-chips [savedFiltersController]=\"savedFilterController\"></fs-saved-filter-autocomplete-chips>\n }\n </div>\n } @else {\n <div>\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n }\n</div>\n<ng-template #filterStatusBarChips>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n @if (config.chips) {\n <fs-filter-chips class=\"filter-chips\"></fs-filter-chips>\n }\n</ng-template>\n<ng-template #filterActions>\n @if (actionsVisible$ | async) {\n <div class=\"filter-actions\">\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbar>\n @if (config.reload || config.autoReload || ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting)) {\n <div class=\"filter-toolbar\">\n @if ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"filterButtonClick($event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon [svgIcon]=\"'filterOutline'\"></mat-icon>\n }\n </a>\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n @if (config.autoReload) {\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [(ngModel)]=\"autoReload\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n }\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #heading>\n @if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-inner-inputs{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.heading{margin-right:10px}.heading h2{margin:0}.heading h2+.subheading{margin:0}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"] }]
3441
+ ], template: "<div class=\"filter-container\">\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n }\n <div class=\"filter-inner-container\">\n @if (notInlineToolbar$ | async) {\n <div class=\"filter-inner-inputs\">\n @if (keywordVisible$ | async) {\n <fs-keyword-input [autofocus]=\"config.autofocus\"></fs-keyword-input>\n }\n @if (savedFilterController.enabled) {\n <fs-saved-filter-autocomplete-chips [savedFiltersController]=\"savedFilterController\"></fs-saved-filter-autocomplete-chips>\n }\n </div>\n } @else {\n <div>\n <ng-container *ngTemplateOutlet=\"heading\"></ng-container>\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n </div>\n }\n <ng-container [ngTemplateOutlet]=\"filterToolbar\"></ng-container>\n <ng-container [ngTemplateOutlet]=\"filterActions\"></ng-container>\n </div>\n @if (notInlineToolbar$ | async) {\n <ng-container *ngTemplateOutlet=\"filterStatusBarChips\"></ng-container>\n }\n</div>\n<ng-template #filterStatusBarChips>\n @if (statusBar) {\n <div\n class=\"filter-status-container\"\n [ngClass]=\"{ 'has-status': !!filterStatus.textContent }\">\n <div\n class=\"filter-status\"\n #filterStatus>\n <ng-container *ngTemplateOutlet=\"statusBar.templateRef\"></ng-container>\n </div>\n </div>\n }\n @if (config.chips) {\n <fs-filter-chips class=\"filter-chips\"></fs-filter-chips>\n }\n</ng-template>\n<ng-template #filterActions>\n @if (actionsVisible$ | async) {\n <div class=\"filter-actions\">\n <fs-filter-actions\n [actions]=\"actions$ | async\"\n [kebabActions]=\"menuActions$ | async\">\n </fs-filter-actions>\n </div>\n }\n</ng-template>\n<ng-template #filterToolbar>\n @if (config.reload || config.autoReload || ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting)) {\n <div class=\"filter-toolbar\">\n @if ((filtersBtnVisible$ | async) && hasVisibleItemOrSorting) {\n <a\n mat-icon-button\n class=\"button-filters\"\n (click)=\"filterButtonClick($event)\"\n [color]=\"config.button.color\">\n @if (config.button.icon) {\n <mat-icon [svgIcon]=\"'filterOutline'\"></mat-icon>\n }\n </a>\n }\n @if (config.reload) {\n <a\n mat-icon-button\n (click)=\"reload($event)\"\n class=\"button-reload\">\n <mat-icon #reloadEl>\n refresh\n </mat-icon>\n </a>\n }\n @if (config.autoReload) {\n <div class=\"filter-reload\">\n <mat-slide-toggle\n name=\"autoReload\"\n class=\"auto-reload\"\n [ngModel]=\"config.autoReload.enabled\"\n (ngModelChange)=\"config.autoReload.enabled = $event\">\n <span>\n Auto refresh\n </span>\n </mat-slide-toggle>\n </div>\n }\n </div>\n }\n</ng-template>\n<ng-template #heading>\n @if (config.heading) {\n <div class=\"heading\">\n <h2>\n {{ config.heading }}\n </h2>\n <div class=\"subheading\">\n {{ config.subheading }}\n </div>\n </div>\n }\n</ng-template>", styles: [":host{margin-bottom:20px;display:block}.filter-status-container{flex-grow:1;display:flex;justify-content:center;flex-direction:column;align-self:flex-end}.filter-status-container .filter-status{overflow:hidden;text-overflow:ellipsis;line-height:18px}.filter-container{width:100%}.filter-inner-container{flex-direction:row;box-sizing:border-box;display:flex;position:relative;align-items:center}.filter-inner-container .filter-inner-inputs{flex-direction:row;box-sizing:border-box;display:flex;align-items:center;min-width:0;gap:5px}.filter-actions{display:flex;align-items:center;flex:1;justify-content:flex-end}.filter-toolbar{white-space:nowrap;display:flex;align-items:center}.filter-toolbar .button-filters,.filter-toolbar .button-reload{display:flex;width:40px;padding:8px;height:40px;overflow:hidden}.filter-toolbar .button-filters ::ng-deep svg,.filter-toolbar .button-reload ::ng-deep svg{display:flex}.filter-toolbar .filter-reload{margin-left:10px;display:flex;align-items:center}.filter-toolbar .filter-reload .auto-reload{margin-right:5px}.filter-toolbar .filter-reload .auto-reload span{font-size:80%}.heading{margin-right:10px}.heading h2{margin:0}.heading h2+.subheading{margin:0}.results{min-height:90px;position:relative;overflow-x:auto;overflow-y:hidden}fs-filter-chips{margin:4px 0;display:flex;flex-wrap:wrap;gap:5px}@media screen and (min-width: 1200px){html.fs-filter-open body{margin-right:350px}}html.fs-filter-open{scrollbar-width:none}:host ::ng-deep .auto-reload.mat-checked .mat-slide-toggle-thumb-container{transform:translate3d(12px,0,0)}:host ::ng-deep .auto-reload:not(.mat-checked) .mat-slide-toggle-content{color:#ccc}:host ::ng-deep .auto-reload .mat-slide-toggle-thumb,:host ::ng-deep .auto-reload .mat-slide-toggle-thumb-container{height:15px;width:15px}:host ::ng-deep .auto-reload .mat-slide-toggle-content{font-size:90%}:host ::ng-deep .auto-reload .mat-slide-toggle-bar{width:26px;height:10px;border-radius:10px}\n"] }]
3517
3442
  }], ctorParameters: () => [], propDecorators: { keywordInput: [{
3518
3443
  type: ViewChild,
3519
3444
  args: [KeywordInputComponent]
@@ -3608,7 +3533,7 @@ class CheckboxComponent extends BaseItemComponent {
3608
3533
  });
3609
3534
  }
3610
3535
  change() {
3611
- this.item.value = this.value;
3536
+ this.item.setValue(this.value);
3612
3537
  }
3613
3538
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CheckboxComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3614
3539
  static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CheckboxComponent, isStandalone: true, selector: "filter-item-checkbox", usesInheritance: true, ngImport: i0, template: "<fs-label-field>\n <mat-checkbox\n [(ngModel)]=\"value\"\n (ngModelChange)=\"change()\"\n [name]=\"item.name\">\n {{ item.label }}\n </mat-checkbox>\n</fs-label-field>", styles: ["fs-label-field{margin:0 0 -12px -8px}\n"], dependencies: [{ kind: "ngmodule", type: FsLabelModule }, { kind: "component", type: i1$6.FsLabelFieldComponent, selector: "fs-label-field", inputs: ["appearance", "showOutline", "disabled", "focused", "hoverable", "padless"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
@@ -3905,11 +3830,8 @@ class WeekComponent extends BaseItemComponent {
3905
3830
  this._cdRef.detectChanges();
3906
3831
  });
3907
3832
  }
3908
- change() {
3909
- this.item.value = this.value;
3910
- }
3911
3833
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WeekComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
3912
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WeekComponent, isStandalone: true, selector: "filter-item-week", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>\n {{ item.label }}\n </mat-label>\n <input\n matInput\n fsDateWeekPicker\n [placeholder]=\"item.label\"\n [fsFilterFocusTrigger]=\"item\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"change()\"\n [seedDate]=\"item.seedDate\"\n [clear]=\"item.showClear\"\n [name]=\"item.name\">\n</mat-form-field>", dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i3$2.FsDateWeekPickerComponent, selector: "[fsDateWeekPicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "seedDate", "period", "view"], outputs: ["change"] }, { kind: "directive", type: FocusToItemDirective, selector: "[fsFilterFocusTrigger]", inputs: ["fsFilterFocusTrigger", "focusTargetType"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3834
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WeekComponent, isStandalone: true, selector: "filter-item-week", usesInheritance: true, ngImport: i0, template: "<mat-form-field>\n <mat-label>\n {{ item.label }}\n </mat-label>\n <input\n matInput\n fsDateWeekPicker\n [placeholder]=\"item.label\"\n [fsFilterFocusTrigger]=\"item\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"item.value = value\"\n [seedDate]=\"item.seedDate\"\n [clear]=\"item.showClear\"\n [name]=\"item.name\">\n</mat-form-field>", dependencies: [{ kind: "component", type: MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: MatLabel, selector: "mat-label" }, { kind: "directive", type: MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: FsDatePickerModule }, { kind: "component", type: i3$2.FsDateWeekPickerComponent, selector: "[fsDateWeekPicker]", inputs: ["minYear", "maxYear", "minDate", "maxDate", "seedDate", "period", "view"], outputs: ["change"] }, { kind: "directive", type: FocusToItemDirective, selector: "[fsFilterFocusTrigger]", inputs: ["fsFilterFocusTrigger", "focusTargetType"] }, { kind: "ngmodule", type: FsFormModule }, { kind: "directive", type: i3.FsFormNoFsValidatorsDirective, selector: "[ngModel]:not([required]):not([fsFormRequired]):not([fsFormCompare]):not([fsFormDateRange]):not([fsFormEmail]):not([fsFormEmails]):not([fsFormFunction]):not([fsFormGreater]):not([fsFormGreaterEqual]):not([fsFormInteger]):not([fsFormLesser]):not([fsFormMax]):not([fsFormMaxLength]):not([fsFormMin]):not([fsFormMinLength]):not([fsFormNumeric]):not([fsFormPattern]):not([fsFormPhone]):not([fsFormUrl]):not([validate])" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
3913
3835
  }
3914
3836
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WeekComponent, decorators: [{
3915
3837
  type: Component,
@@ -3921,7 +3843,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
3921
3843
  FsDatePickerModule,
3922
3844
  FocusToItemDirective,
3923
3845
  FsFormModule,
3924
- ], template: "<mat-form-field>\n <mat-label>\n {{ item.label }}\n </mat-label>\n <input\n matInput\n fsDateWeekPicker\n [placeholder]=\"item.label\"\n [fsFilterFocusTrigger]=\"item\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"change()\"\n [seedDate]=\"item.seedDate\"\n [clear]=\"item.showClear\"\n [name]=\"item.name\">\n</mat-form-field>" }]
3846
+ ], template: "<mat-form-field>\n <mat-label>\n {{ item.label }}\n </mat-label>\n <input\n matInput\n fsDateWeekPicker\n [placeholder]=\"item.label\"\n [fsFilterFocusTrigger]=\"item\"\n [(ngModel)]=\"value\"\n (ngModelChange)=\"item.value = value\"\n [seedDate]=\"item.seedDate\"\n [clear]=\"item.showClear\"\n [name]=\"item.name\">\n</mat-form-field>" }]
3925
3847
  }] });
3926
3848
 
3927
3849
  class FilterItemComponent {