@agorapulse/ui-components 20.4.12 → 20.4.13

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.
@@ -10,7 +10,9 @@ import { apChevronDown } from '@agorapulse/ui-symbol/icons';
10
10
  import * as i0 from '@angular/core';
11
11
  import { signal, Injectable, inject, input, computed, Component, effect, untracked, viewChild, output } from '@angular/core';
12
12
  import * as i1 from '@angular/forms';
13
- import { FormsModule, ReactiveFormsModule } from '@angular/forms';
13
+ import { FormsModule } from '@angular/forms';
14
+ import { SelectMultipleDirective, SelectSingleDirective, SelectLabelSingleComponent, SelectLabelMultipleComponent, DropdownItemMultipleTwoLinesComponent, DropdownItemMultipleOneLineComponent, DropdownItemSingleOneLineComponent, DropdownItemSingleTwoLinesComponent } from '@agorapulse/ui-components/select';
15
+ import { NgSelectComponent, NgOptionTemplateDirective, NgLabelTemplateDirective, NgMultiLabelTemplateDirective } from '@ng-select/ng-select';
14
16
 
15
17
  class FilterState {
16
18
  _groups = signal([], ...(ngDevMode ? [{ debugName: "_groups" }] : []));
@@ -46,9 +48,7 @@ class FilterState {
46
48
  const current = this._draft()[key];
47
49
  if (current?.filterType !== 'checkbox')
48
50
  return;
49
- const selected = checked
50
- ? [...current.selected, name]
51
- : current.selected.filter(n => n !== name);
51
+ const selected = checked ? [...current.selected, name] : current.selected.filter(n => n !== name);
52
52
  this.updateValue(key, { filterType: 'checkbox', selected });
53
53
  }
54
54
  /** Set the selected radio value */
@@ -60,8 +60,11 @@ class FilterState {
60
60
  this.updateValue(key, { filterType: 'toggle', checked });
61
61
  }
62
62
  /** Set selected indices for a select filter */
63
- setSelectValue(key, selected) {
64
- this.updateValue(key, { filterType: 'select', selected });
63
+ setSingleSelectValue(key, selected) {
64
+ this.updateValue(key, { filterType: 'select', selectionType: 'single', selected });
65
+ }
66
+ setMultipleSelectValue(key, selected) {
67
+ this.updateValue(key, { filterType: 'select', selectionType: 'multiple', selected });
65
68
  }
66
69
  /** Return the current draft snapshot (used on Apply) */
67
70
  getSnapshot() {
@@ -97,10 +100,20 @@ class FilterState {
97
100
  checked: group.defaultSelected ?? group.item.checked ?? false,
98
101
  };
99
102
  case 'select':
100
- return {
101
- filterType: 'select',
102
- selected: group.defaultSelected ?? [],
103
- };
103
+ if (group.selectionType === 'single') {
104
+ return {
105
+ filterType: 'select',
106
+ selectionType: 'single',
107
+ selected: group.defaultSelected ? group.defaultSelected : undefined,
108
+ };
109
+ }
110
+ else {
111
+ return {
112
+ filterType: 'select',
113
+ selectionType: 'multiple',
114
+ selected: group.defaultSelected ?? [],
115
+ };
116
+ }
104
117
  case 'date-range':
105
118
  return {
106
119
  filterType: 'date-range',
@@ -117,7 +130,10 @@ class FilterState {
117
130
  case 'toggle':
118
131
  return { filterType: 'toggle', checked: false };
119
132
  case 'select':
120
- return { filterType: 'select', selected: [] };
133
+ if (group.selectionType === 'single') {
134
+ return { filterType: 'select', selectionType: 'single', selected: undefined };
135
+ }
136
+ return { filterType: 'select', selectionType: 'multiple', selected: [] };
121
137
  case 'date-range':
122
138
  return { filterType: 'date-range', selectedPeriod: undefined };
123
139
  }
@@ -129,8 +145,46 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImpo
129
145
  type: Injectable
130
146
  }] });
131
147
 
148
+ const MULTIPLE_DISPLAY_TYPES = new Set(['tag', 'label']);
149
+ class FilterLeafSelectComponent {
150
+ filterState = inject(FilterState);
151
+ item = input.required(...(ngDevMode ? [{ debugName: "item" }] : []));
152
+ multipleDisplayType = computed(() => {
153
+ const dt = this.item().displayType;
154
+ return MULTIPLE_DISPLAY_TYPES.has(dt) ? dt : 'label';
155
+ }, ...(ngDevMode ? [{ debugName: "multipleDisplayType" }] : []));
156
+ singleSelectValue = computed(() => {
157
+ const value = this.filterState.getValue(this.item().key);
158
+ return value?.filterType === 'select' && value.selectionType === 'single' ? value.selected : undefined;
159
+ }, ...(ngDevMode ? [{ debugName: "singleSelectValue" }] : []));
160
+ multipleSelectValue = computed(() => {
161
+ const value = this.filterState.getValue(this.item().key);
162
+ return value?.filterType === 'select' && value?.selectionType === 'multiple' ? value.selected : [];
163
+ }, ...(ngDevMode ? [{ debugName: "multipleSelectValue" }] : []));
164
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterLeafSelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
165
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilterLeafSelectComponent, isStandalone: true, selector: "ap-filter-leaf-select", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: "@let selectItem = item();\n<div class=\"ap-filter-leaf__option\">\n @if (selectItem.selectionType === 'single') {\n <ng-select\n apSelectSingle\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"singleSelectValue()\"\n (ngModelChange)=\"filterState.setSingleSelectValue(selectItem.key, $event)\"\n >\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n <ap-select-label-single\n [displayType]=\"selectItem.displayType\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [label]=\"item.label\" />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-single-two-lines\n [caption]=\"item$.caption\"\n [selected]=\"item$.selected\"\n [text]=\"item$.label\"\n [avatarUrl]=\"item$.avatarUrl\"\n [network]=\"item$.network\"\n [symbolId]=\"item$.symbolId\"\n />\n } @else {\n <ap-dropdown-item-single-one-line\n [selected]=\"item$.selected\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n\n </ng-template>\n\n </ng-select>\n } @else {\n <ng-select\n apSelectMultiple\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"multipleSelectValue()\"\n (ngModelChange)=\"filterState.setMultipleSelectValue(selectItem.key, $event)\">\n <ng-template\n let-items=\"items\"\n let-clear=\"clear\"\n ng-multi-label-tmp>\n <ap-select-label-multiple\n bindValue=\"value\"\n bindLabel=\"label\"\n [displayType]=\"multipleDisplayType()\"\n [selectedItems]=\"items\"\n (removeItem)=\"clear($event)\"\n />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-multiple-two-lines\n [selected]=\"item$.selected\"\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [caption]=\"item.caption\"\n [text]=\"item.label\"\n [htmlId]=\"item$.htmlId\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n } @else {\n <ap-dropdown-item-multiple-one-line\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [selected]=\"item$.selected\"\n [htmlId]=\"item$.htmlId\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n </ng-template>\n </ng-select>\n }\n</div>\n", dependencies: [{ kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: NgSelectComponent, selector: "ng-select", inputs: ["ariaLabelDropdown", "bindLabel", "bindValue", "ariaLabel", "markFirst", "placeholder", "fixedPlaceholder", "notFoundText", "typeToSearchText", "preventToggleOnRightClick", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "tabFocusOnClearButton", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "ngClass", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd", "deselectOnClick", "keyDownFn"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "directive", type: SelectMultipleDirective, selector: "ng-select[apSelectMultiple]", inputs: ["maxItemsTooltip"] }, { kind: "directive", type: SelectSingleDirective, selector: "ng-select[apSelectSingle]" }, { kind: "component", type: SelectLabelSingleComponent, selector: "ap-select-label-single", inputs: ["displayType", "label", "avatarUrl", "network", "showAvatarInitials", "roundedAvatar"] }, { kind: "component", type: SelectLabelMultipleComponent, selector: "ap-select-label-multiple", inputs: ["displayType", "tagColor", "selectedItems", "bindLabel", "bindValue", "bindAvatarUrl", "bindSymbolId", "roundedAvatar", "bindNetwork"], outputs: ["removeItem"] }, { kind: "directive", type: NgOptionTemplateDirective, selector: "[ng-option-tmp]" }, { kind: "component", type: DropdownItemMultipleTwoLinesComponent, selector: "ap-dropdown-item-multiple-two-lines", inputs: ["text", "caption", "selected", "htmlId", "disabled", "avatarUrl", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "onlyEnabled", "onlyText", "isFeatureLocked", "roundedAvatar", "network", "symbolColor", "symbolTooltipText"], outputs: ["selectOnly", "lockedFeatureClicked"] }, { kind: "component", type: DropdownItemMultipleOneLineComponent, selector: "ap-dropdown-item-multiple-one-line", inputs: ["text", "selected", "htmlId", "disabled", "avatarUrl", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "onlyEnabled", "onlyText", "isFeatureLocked", "roundedAvatar", "network", "symbolColor", "symbolTooltipText"], outputs: ["selectOnly", "selectionChange", "lockedFeatureClicked"] }, { kind: "component", type: DropdownItemSingleOneLineComponent, selector: "ap-dropdown-item-single-one-line", inputs: ["text", "selected", "disabled", "avatarUrl", "showAvatarInitials", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "component", type: DropdownItemSingleTwoLinesComponent, selector: "ap-dropdown-item-single-two-lines", inputs: ["text", "caption", "selected", "disabled", "avatarUrl", "symbolId", "disabledTooltip", "badgeText", "dividerEnabled", "network", "roundedAvatar", "isFeatureLocked"], outputs: ["lockedFeatureClicked"] }, { kind: "directive", type: NgLabelTemplateDirective, selector: "[ng-label-tmp]" }, { kind: "directive", type: NgMultiLabelTemplateDirective, selector: "[ng-multi-label-tmp]" }] });
166
+ }
167
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterLeafSelectComponent, decorators: [{
168
+ type: Component,
169
+ args: [{ selector: 'ap-filter-leaf-select', imports: [
170
+ FormsModule,
171
+ NgSelectComponent,
172
+ SelectMultipleDirective,
173
+ SelectSingleDirective,
174
+ SelectLabelSingleComponent,
175
+ SelectLabelMultipleComponent,
176
+ NgOptionTemplateDirective,
177
+ DropdownItemMultipleTwoLinesComponent,
178
+ DropdownItemMultipleOneLineComponent,
179
+ DropdownItemSingleOneLineComponent,
180
+ DropdownItemSingleTwoLinesComponent,
181
+ NgLabelTemplateDirective,
182
+ NgMultiLabelTemplateDirective,
183
+ ], template: "@let selectItem = item();\n<div class=\"ap-filter-leaf__option\">\n @if (selectItem.selectionType === 'single') {\n <ng-select\n apSelectSingle\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"singleSelectValue()\"\n (ngModelChange)=\"filterState.setSingleSelectValue(selectItem.key, $event)\"\n >\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n <ap-select-label-single\n [displayType]=\"selectItem.displayType\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [label]=\"item.label\" />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-single-two-lines\n [caption]=\"item$.caption\"\n [selected]=\"item$.selected\"\n [text]=\"item$.label\"\n [avatarUrl]=\"item$.avatarUrl\"\n [network]=\"item$.network\"\n [symbolId]=\"item$.symbolId\"\n />\n } @else {\n <ap-dropdown-item-single-one-line\n [selected]=\"item$.selected\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n\n </ng-template>\n\n </ng-select>\n } @else {\n <ng-select\n apSelectMultiple\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"multipleSelectValue()\"\n (ngModelChange)=\"filterState.setMultipleSelectValue(selectItem.key, $event)\">\n <ng-template\n let-items=\"items\"\n let-clear=\"clear\"\n ng-multi-label-tmp>\n <ap-select-label-multiple\n bindValue=\"value\"\n bindLabel=\"label\"\n [displayType]=\"multipleDisplayType()\"\n [selectedItems]=\"items\"\n (removeItem)=\"clear($event)\"\n />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-multiple-two-lines\n [selected]=\"item$.selected\"\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [caption]=\"item.caption\"\n [text]=\"item.label\"\n [htmlId]=\"item$.htmlId\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n } @else {\n <ap-dropdown-item-multiple-one-line\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [selected]=\"item$.selected\"\n [htmlId]=\"item$.htmlId\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n </ng-template>\n </ng-select>\n }\n</div>\n" }]
184
+ }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }] } });
185
+
132
186
  class FilterLeafComponent {
133
- state = inject(FilterState);
187
+ filterState = inject(FilterState);
134
188
  /** item propagated from FilterDropdownComponent */
135
189
  item = input.required(...(ngDevMode ? [{ debugName: "item" }] : []));
136
190
  /** whether the leaf is closable */
@@ -156,53 +210,61 @@ class FilterLeafComponent {
156
210
  return item.filterType === 'date-range' ? item : undefined;
157
211
  }, ...(ngDevMode ? [{ debugName: "dateRangeItem" }] : []));
158
212
  radioValue = computed(() => {
159
- const value = this.state.getValue(this.item().key);
213
+ const value = this.filterState.getValue(this.item().key);
160
214
  return value?.filterType === 'radio' ? value.selected : null;
161
215
  }, ...(ngDevMode ? [{ debugName: "radioValue" }] : []));
162
216
  checkboxValue = computed(() => {
163
217
  const checkboxItem = this.checkboxItem();
164
218
  const checkboxValueByKey = {};
165
219
  checkboxItem?.items.forEach(item => (checkboxValueByKey[item.name] = !!item.checked));
166
- const value = this.state.getValue(this.item().key);
220
+ const value = this.filterState.getValue(this.item().key);
167
221
  if (value && value.filterType === 'checkbox') {
168
222
  value.selected.forEach(item => (checkboxValueByKey[item] = true));
169
223
  }
170
224
  return checkboxValueByKey;
171
225
  }, ...(ngDevMode ? [{ debugName: "checkboxValue" }] : []));
172
226
  toggleValue = computed(() => {
173
- const value = this.state.getValue(this.item().key);
227
+ const value = this.filterState.getValue(this.item().key);
174
228
  return value?.filterType === 'toggle' ? value.checked : false;
175
229
  }, ...(ngDevMode ? [{ debugName: "toggleValue" }] : []));
176
230
  onHeaderClick() {
177
231
  if (this.closable()) {
178
- this.state.collapseHeader(this.item().key);
232
+ this.filterState.collapseHeader(this.item().key);
179
233
  }
180
234
  }
181
235
  onCheckboxChange(name, checked) {
182
- this.state.toggleCheckbox(this.item().key, name, checked);
236
+ this.filterState.toggleCheckbox(this.item().key, name, checked);
183
237
  }
184
238
  onRadioClick(value) {
185
- this.state.setRadioValue(this.item().key, value);
239
+ this.filterState.setRadioValue(this.item().key, value);
186
240
  }
187
241
  onToggleChange(checked) {
188
- this.state.setToggleValue(this.item().key, checked);
242
+ this.filterState.setToggleValue(this.item().key, checked);
189
243
  }
190
244
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterLeafComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
191
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilterLeafComponent, isStandalone: true, selector: "ap-filter-leaf", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideUiComponentsSymbols(apChevronDown)], ngImport: i0, template: "<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n", styles: [".ap-filter-leaf{display:flex;flex-direction:column;gap:var(--ref-spacing-xs);padding:var(--ref-spacing-sm);border-bottom:1px solid var(--ref-color-grey-10)}.ap-filter-leaf__header{display:flex;align-items:center;justify-content:space-between}.ap-filter-leaf__closable{cursor:pointer}.ap-filter-leaf__title{display:flex;align-items:center;gap:var(--ref-spacing-xxxs);flex:1 0 0;color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-bold);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__label{color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-regular);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__chevron--rotated{transform:rotate(180deg)}.ap-filter-leaf__content{display:flex;flex-direction:column;gap:var(--ref-spacing-xs)}.ap-filter-leaf__option{display:flex;gap:var(--ref-spacing-xxs);align-items:center;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement", "apTooltipTrigger", "apTooltipType", "apTooltipPresentationContext", "apTooltipListItems", "apTooltipShowAvatarCaption"], exportAs: ["apTooltip"] }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "component", type: CheckboxComponent, selector: "ap-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "indeterminate", "checked", "required", "name"], outputs: ["change"] }, { kind: "component", type: RadioComponent, selector: "ap-radio", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "labelPosition", "radioId", "formControlName", "value", "required", "name"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ToggleComponent, selector: "ap-toggle", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "labelPosition", "disabled", "checked", "required", "confirm", "confirmMessage", "confirmOk", "confirmCancel", "confirmTitle", "name"], outputs: ["change"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }] });
245
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilterLeafComponent, isStandalone: true, selector: "ap-filter-leaf", inputs: { item: { classPropertyName: "item", publicName: "item", isSignal: true, isRequired: true, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null } }, providers: [provideUiComponentsSymbols(apChevronDown)], ngImport: i0, template: "<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n @let vSelectItem = selectItem();\n @if (vSelectItem) {\n <ap-filter-leaf-select [item]=\"vSelectItem\" />\n }\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n", styles: [".ap-filter-leaf{display:flex;flex-direction:column;gap:var(--ref-spacing-xs);padding:var(--ref-spacing-sm);border-bottom:1px solid var(--ref-color-grey-10)}.ap-filter-leaf__header{display:flex;align-items:center;justify-content:space-between}.ap-filter-leaf__closable{cursor:pointer}.ap-filter-leaf__title{display:flex;align-items:center;gap:var(--ref-spacing-xxxs);flex:1 0 0;color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-bold);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__label{color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-regular);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__chevron--rotated{transform:rotate(180deg)}.ap-filter-leaf__content{display:flex;flex-direction:column;gap:var(--ref-spacing-xs)}.ap-filter-leaf__option{display:flex;gap:var(--ref-spacing-xxs);align-items:center;justify-content:flex-start}\n"], dependencies: [{ kind: "directive", type: TooltipDirective, selector: "[apTooltip]", inputs: ["apTooltip", "apTooltipPosition", "apTooltipShowDelay", "apTooltipHideDelay", "apTooltipDuration", "apTooltipDisabled", "apTooltipTruncatedTextOnly", "apTooltipTemplateContext", "apTooltipVirtualScrollElement", "apTooltipTrigger", "apTooltipType", "apTooltipPresentationContext", "apTooltipListItems", "apTooltipShowAvatarCaption"], exportAs: ["apTooltip"] }, { kind: "component", type: SymbolComponent, selector: "ap-symbol", inputs: ["symbolId", "color", "size"], outputs: ["sizeChange"] }, { kind: "component", type: CheckboxComponent, selector: "ap-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "indeterminate", "checked", "required", "name"], outputs: ["change"] }, { kind: "component", type: RadioComponent, selector: "ap-radio", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "disabled", "labelPosition", "radioId", "formControlName", "value", "required", "name"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "component", type: ToggleComponent, selector: "ap-toggle", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "labelPosition", "disabled", "checked", "required", "confirm", "confirmMessage", "confirmOk", "confirmCancel", "confirmTitle", "name"], outputs: ["change"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: FilterLeafSelectComponent, selector: "ap-filter-leaf-select", inputs: ["item"] }] });
192
246
  }
193
247
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterLeafComponent, decorators: [{
194
248
  type: Component,
195
- args: [{ selector: 'ap-filter-leaf', imports: [TooltipDirective, SymbolComponent, CheckboxComponent, RadioComponent, ToggleComponent, FormsModule, ReactiveFormsModule], providers: [provideUiComponentsSymbols(apChevronDown)], template: "<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n", styles: [".ap-filter-leaf{display:flex;flex-direction:column;gap:var(--ref-spacing-xs);padding:var(--ref-spacing-sm);border-bottom:1px solid var(--ref-color-grey-10)}.ap-filter-leaf__header{display:flex;align-items:center;justify-content:space-between}.ap-filter-leaf__closable{cursor:pointer}.ap-filter-leaf__title{display:flex;align-items:center;gap:var(--ref-spacing-xxxs);flex:1 0 0;color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-bold);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__label{color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-regular);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__chevron--rotated{transform:rotate(180deg)}.ap-filter-leaf__content{display:flex;flex-direction:column;gap:var(--ref-spacing-xs)}.ap-filter-leaf__option{display:flex;gap:var(--ref-spacing-xxs);align-items:center;justify-content:flex-start}\n"] }]
249
+ args: [{ selector: 'ap-filter-leaf', imports: [
250
+ TooltipDirective,
251
+ SymbolComponent,
252
+ CheckboxComponent,
253
+ RadioComponent,
254
+ ToggleComponent,
255
+ FormsModule,
256
+ FilterLeafSelectComponent,
257
+ ], providers: [provideUiComponentsSymbols(apChevronDown)], template: "<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n @let vSelectItem = selectItem();\n @if (vSelectItem) {\n <ap-filter-leaf-select [item]=\"vSelectItem\" />\n }\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n", styles: [".ap-filter-leaf{display:flex;flex-direction:column;gap:var(--ref-spacing-xs);padding:var(--ref-spacing-sm);border-bottom:1px solid var(--ref-color-grey-10)}.ap-filter-leaf__header{display:flex;align-items:center;justify-content:space-between}.ap-filter-leaf__closable{cursor:pointer}.ap-filter-leaf__title{display:flex;align-items:center;gap:var(--ref-spacing-xxxs);flex:1 0 0;color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-bold);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__label{color:var(--ref-color-grey-100);font-family:Averta;font-size:var(--ref-font-size-sm);font-style:normal;font-weight:var(--ref-font-weight-regular);line-height:var(--ref-font-line-height-sm)}.ap-filter-leaf__chevron--rotated{transform:rotate(180deg)}.ap-filter-leaf__content{display:flex;flex-direction:column;gap:var(--ref-spacing-xs)}.ap-filter-leaf__option{display:flex;gap:var(--ref-spacing-xxs);align-items:center;justify-content:flex-start}\n"] }]
196
258
  }], propDecorators: { item: [{ type: i0.Input, args: [{ isSignal: true, alias: "item", required: true }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }] } });
197
259
 
198
260
  class FilterDropdownComponent {
199
261
  overlay = createDropdownOverlay();
200
- state = inject(FilterState);
262
+ filterState = inject(FilterState);
201
263
  initGroups = effect(() => {
202
264
  const groups = this.items();
203
265
  untracked(() => {
204
266
  if (groups) {
205
- this.state.initialize(groups);
267
+ this.filterState.initialize(groups);
206
268
  }
207
269
  });
208
270
  }, ...(ngDevMode ? [{ debugName: "initGroups" }] : []));
@@ -267,25 +329,25 @@ class FilterDropdownComponent {
267
329
  }
268
330
  }
269
331
  onApplyFilters() {
270
- this.applyFilters.emit(this.state.getSnapshot());
332
+ this.applyFilters.emit(this.filterState.getSnapshot());
271
333
  }
272
334
  onClearFilters() {
273
- this.state.clear();
335
+ this.filterState.clear();
274
336
  this.clearFilters.emit();
275
337
  }
276
338
  onResetFilters() {
277
- this.state.reset();
339
+ this.filterState.reset();
278
340
  this.resetFilters.emit();
279
341
  }
280
342
  onSavePresets() {
281
- this.savePresets.emit(this.state.getSnapshot());
343
+ this.savePresets.emit(this.filterState.getSnapshot());
282
344
  }
283
345
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterDropdownComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
284
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilterDropdownComponent, isStandalone: true, selector: "ap-filter-dropdown", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, needApplyButton: { classPropertyName: "needApplyButton", publicName: "needApplyButton", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, savePresetsMode: { classPropertyName: "savePresetsMode", publicName: "savePresetsMode", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, defaultPosition: { classPropertyName: "defaultPosition", publicName: "defaultPosition", isSignal: true, isRequired: false, transformFunction: null }, savePresetsText: { classPropertyName: "savePresetsText", publicName: "savePresetsText", isSignal: true, isRequired: false, transformFunction: null }, resetFilterText: { classPropertyName: "resetFilterText", publicName: "resetFilterText", isSignal: true, isRequired: false, transformFunction: null }, applyFiltersText: { classPropertyName: "applyFiltersText", publicName: "applyFiltersText", isSignal: true, isRequired: false, transformFunction: null }, clearFilterText: { classPropertyName: "clearFilterText", publicName: "clearFilterText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", savePresets: "savePresets", applyFilters: "applyFilters", clearFilters: "clearFilters", resetFilters: "resetFilters" }, providers: [FilterState, provideUiComponentsSymbols(apReset)], viewQueries: [{ propertyName: "filterGroupTemplate", first: true, predicate: ["filterGroupTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of state.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n", styles: [":host{display:none}.ap-filter-dropdown{width:420px;background-color:var(--comp-action-dropdown-background-color);border-radius:var(--comp-action-dropdown-border-radius);box-shadow:var(--comp-action-dropdown-box-shadow);padding:var(--comp-action-dropdown-padding);outline:none;overflow:hidden;z-index:1000}.ap-filter-dropdown__footer{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm)}.ap-filter-dropdown__footer--presets{display:flex;justify-content:space-between}.ap-filter-dropdown__footer--apply{display:flex;justify-content:flex-end;gap:var(--ref-spacing-sm)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "ap-button", inputs: ["ariaLabel", "disabled", "name", "form", "config", "loading", "locked", "menuTrigger", "symbolPosition", "symbolId"], outputs: ["menuOpened", "menuClosed", "click", "focus", "blur"] }, { kind: "component", type: FilterLeafComponent, selector: "ap-filter-leaf", inputs: ["item", "closable"] }] });
346
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.18", type: FilterDropdownComponent, isStandalone: true, selector: "ap-filter-dropdown", inputs: { items: { classPropertyName: "items", publicName: "items", isSignal: true, isRequired: false, transformFunction: null }, needApplyButton: { classPropertyName: "needApplyButton", publicName: "needApplyButton", isSignal: true, isRequired: false, transformFunction: null }, closable: { classPropertyName: "closable", publicName: "closable", isSignal: true, isRequired: false, transformFunction: null }, savePresetsMode: { classPropertyName: "savePresetsMode", publicName: "savePresetsMode", isSignal: true, isRequired: false, transformFunction: null }, showBackdrop: { classPropertyName: "showBackdrop", publicName: "showBackdrop", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, defaultPosition: { classPropertyName: "defaultPosition", publicName: "defaultPosition", isSignal: true, isRequired: false, transformFunction: null }, savePresetsText: { classPropertyName: "savePresetsText", publicName: "savePresetsText", isSignal: true, isRequired: false, transformFunction: null }, resetFilterText: { classPropertyName: "resetFilterText", publicName: "resetFilterText", isSignal: true, isRequired: false, transformFunction: null }, applyFiltersText: { classPropertyName: "applyFiltersText", publicName: "applyFiltersText", isSignal: true, isRequired: false, transformFunction: null }, clearFilterText: { classPropertyName: "clearFilterText", publicName: "clearFilterText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { opened: "opened", closed: "closed", savePresets: "savePresets", applyFilters: "applyFilters", clearFilters: "clearFilters", resetFilters: "resetFilters" }, providers: [FilterState, provideUiComponentsSymbols(apReset)], viewQueries: [{ propertyName: "filterGroupTemplate", first: true, predicate: ["filterGroupTemplate"], descendants: true, isSignal: true }], ngImport: i0, template: "<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of filterState.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n", styles: [":host{display:none}.ap-filter-dropdown{width:420px;background-color:var(--comp-action-dropdown-background-color);border-radius:var(--comp-action-dropdown-border-radius);box-shadow:var(--comp-action-dropdown-box-shadow);padding:var(--comp-action-dropdown-padding);outline:none;overflow-x:hidden;overflow-y:auto;z-index:1000;max-height:min(90vh,750px)}.ap-filter-dropdown__footer{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm)}.ap-filter-dropdown__footer--presets{display:flex;justify-content:space-between}.ap-filter-dropdown__footer--apply{display:flex;justify-content:flex-end;gap:var(--ref-spacing-sm)}\n"], dependencies: [{ kind: "component", type: ButtonComponent, selector: "ap-button", inputs: ["ariaLabel", "disabled", "name", "form", "config", "loading", "locked", "menuTrigger", "symbolPosition", "symbolId"], outputs: ["menuOpened", "menuClosed", "click", "focus", "blur"] }, { kind: "component", type: FilterLeafComponent, selector: "ap-filter-leaf", inputs: ["item", "closable"] }] });
285
347
  }
286
348
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.18", ngImport: i0, type: FilterDropdownComponent, decorators: [{
287
349
  type: Component,
288
- args: [{ selector: 'ap-filter-dropdown', imports: [ButtonComponent, FilterLeafComponent], providers: [FilterState, provideUiComponentsSymbols(apReset)], template: "<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of state.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n", styles: [":host{display:none}.ap-filter-dropdown{width:420px;background-color:var(--comp-action-dropdown-background-color);border-radius:var(--comp-action-dropdown-border-radius);box-shadow:var(--comp-action-dropdown-box-shadow);padding:var(--comp-action-dropdown-padding);outline:none;overflow:hidden;z-index:1000}.ap-filter-dropdown__footer{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm)}.ap-filter-dropdown__footer--presets{display:flex;justify-content:space-between}.ap-filter-dropdown__footer--apply{display:flex;justify-content:flex-end;gap:var(--ref-spacing-sm)}\n"] }]
350
+ args: [{ selector: 'ap-filter-dropdown', imports: [ButtonComponent, FilterLeafComponent], providers: [FilterState, provideUiComponentsSymbols(apReset)], template: "<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of filterState.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n", styles: [":host{display:none}.ap-filter-dropdown{width:420px;background-color:var(--comp-action-dropdown-background-color);border-radius:var(--comp-action-dropdown-border-radius);box-shadow:var(--comp-action-dropdown-box-shadow);padding:var(--comp-action-dropdown-padding);outline:none;overflow-x:hidden;overflow-y:auto;z-index:1000;max-height:min(90vh,750px)}.ap-filter-dropdown__footer{padding:var(--ref-spacing-xxs) var(--ref-spacing-sm)}.ap-filter-dropdown__footer--presets{display:flex;justify-content:space-between}.ap-filter-dropdown__footer--apply{display:flex;justify-content:flex-end;gap:var(--ref-spacing-sm)}\n"] }]
289
351
  }], propDecorators: { filterGroupTemplate: [{ type: i0.ViewChild, args: ['filterGroupTemplate', { isSignal: true }] }], items: [{ type: i0.Input, args: [{ isSignal: true, alias: "items", required: false }] }], needApplyButton: [{ type: i0.Input, args: [{ isSignal: true, alias: "needApplyButton", required: false }] }], closable: [{ type: i0.Input, args: [{ isSignal: true, alias: "closable", required: false }] }], savePresetsMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "savePresetsMode", required: false }] }], showBackdrop: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBackdrop", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], defaultPosition: [{ type: i0.Input, args: [{ isSignal: true, alias: "defaultPosition", required: false }] }], savePresetsText: [{ type: i0.Input, args: [{ isSignal: true, alias: "savePresetsText", required: false }] }], resetFilterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "resetFilterText", required: false }] }], applyFiltersText: [{ type: i0.Input, args: [{ isSignal: true, alias: "applyFiltersText", required: false }] }], clearFilterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearFilterText", required: false }] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], savePresets: [{ type: i0.Output, args: ["savePresets"] }], applyFilters: [{ type: i0.Output, args: ["applyFilters"] }], clearFilters: [{ type: i0.Output, args: ["clearFilters"] }], resetFilters: [{ type: i0.Output, args: ["resetFilters"] }] } });
290
352
 
291
353
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"agorapulse-ui-components-filter-dropdown.mjs","sources":["../../../libs/ui-components/filter-dropdown/src/filter.state.ts","../../../libs/ui-components/filter-dropdown/src/filter-leaf/filter-leaf.component.ts","../../../libs/ui-components/filter-dropdown/src/filter-leaf/filter-leaf.component.html","../../../libs/ui-components/filter-dropdown/src/filter-dropdown/filter-dropdown.component.ts","../../../libs/ui-components/filter-dropdown/src/filter-dropdown/filter-dropdown.component.html","../../../libs/ui-components/filter-dropdown/src/agorapulse-ui-components-filter-dropdown.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport {\n FilterDropdownOutput,\n FilterDropdownGroup,\n FilterDropdownValue,\n FilterDropdownValueCheckbox,\n FilterDropdownValueDateRange,\n FilterDropdownValueRadio,\n FilterDropdownValueSelect,\n FilterDropdownValueToggle,\n} from './filter.model';\n\n@Injectable()\nexport class FilterState {\n private readonly _groups = signal<FilterDropdownGroup[]>([]);\n private readonly _draft = signal<FilterDropdownOutput>({});\n\n readonly groups = this._groups.asReadonly();\n readonly draft = this._draft.asReadonly();\n\n /** Initialize groups and seed draft from config defaults */\n initialize(groups: FilterDropdownGroup[]): void {\n this._groups.set(groups);\n const initial: FilterDropdownOutput = {};\n for (const group of groups) {\n initial[group.key] = this.buildInitialValue(group);\n }\n this._draft.set(initial);\n }\n\n collapseHeader(key: string): void {\n const group = this._groups().find(g => g.key === key);\n if (group) {\n group.expanded = !group.expanded;\n this._groups.update(gs => [...gs]);\n }\n }\n\n /** Get the draft value for a specific filter key */\n getValue(key: string): FilterDropdownValue | undefined {\n return this._draft()[key];\n }\n\n /** Update a single filter's draft value */\n updateValue(key: string, value: FilterDropdownValue): void {\n this._draft.update(draft => ({ ...draft, [key]: value }));\n }\n\n /** Toggle a checkbox item in a checkbox filter */\n toggleCheckbox(key: string, name: string, checked: boolean): void {\n const current = this._draft()[key];\n if (current?.filterType !== 'checkbox') return;\n\n const selected = checked\n ? [...current.selected, name]\n : current.selected.filter(n => n !== name);\n\n this.updateValue(key, { filterType: 'checkbox', selected });\n }\n\n /** Set the selected radio value */\n setRadioValue(key: string, value: unknown): void {\n this.updateValue(key, { filterType: 'radio', selected: value });\n }\n\n /** Set the toggle checked state */\n setToggleValue(key: string, checked: boolean): void {\n this.updateValue(key, { filterType: 'toggle', checked });\n }\n\n /** Set selected indices for a select filter */\n setSelectValue(key: string, selected: number[]): void {\n this.updateValue(key, { filterType: 'select', selected });\n }\n\n /** Return the current draft snapshot (used on Apply) */\n getSnapshot(): FilterDropdownOutput {\n return { ...this._draft() };\n }\n\n /** Reset draft to initial values from the current config */\n reset(): void {\n this.initialize(this._groups());\n }\n\n /** Clear all draft values to empty/default states */\n clear(): void {\n const cleared: FilterDropdownOutput = {};\n for (const group of this._groups()) {\n cleared[group.key] = this.buildEmptyValue(group);\n }\n this._draft.set(cleared);\n }\n\n private buildInitialValue(group: FilterDropdownGroup): FilterDropdownValue {\n switch (group.filterType) {\n case 'checkbox':\n return {\n filterType: 'checkbox',\n selected: group.defaultSelected ?? group.items.filter(i => i.checked).map(i => i.name),\n } satisfies FilterDropdownValueCheckbox;\n case 'radio':\n return {\n filterType: 'radio',\n selected: group.defaultSelected ?? null,\n } satisfies FilterDropdownValueRadio;\n case 'toggle':\n return {\n filterType: 'toggle',\n checked: group.defaultSelected ?? group.item.checked ?? false,\n } satisfies FilterDropdownValueToggle;\n case 'select':\n return {\n filterType: 'select',\n selected: group.defaultSelected ?? [],\n } satisfies FilterDropdownValueSelect;\n case 'date-range':\n return {\n filterType: 'date-range',\n selectedPeriod: group.selectedPeriod,\n } satisfies FilterDropdownValueDateRange;\n }\n }\n\n private buildEmptyValue(group: FilterDropdownGroup): FilterDropdownValue {\n switch (group.filterType) {\n case 'checkbox':\n return { filterType: 'checkbox', selected: [] };\n case 'radio':\n return { filterType: 'radio', selected: null };\n case 'toggle':\n return { filterType: 'toggle', checked: false };\n case 'select':\n return { filterType: 'select', selected: [] };\n case 'date-range':\n return { filterType: 'date-range', selectedPeriod: undefined };\n }\n }\n}\n","import { CheckboxComponent } from '@agorapulse/ui-components/checkbox';\nimport { provideUiComponentsSymbols } from '@agorapulse/ui-components/providers';\nimport { RadioComponent } from '@agorapulse/ui-components/radio';\nimport { ToggleComponent } from '@agorapulse/ui-components/toggle';\nimport { TooltipDirective } from '@agorapulse/ui-components/tooltip';\nimport { SymbolComponent } from '@agorapulse/ui-symbol';\nimport { apChevronDown } from '@agorapulse/ui-symbol/icons';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { FilterDropdownGroup } from '../filter.model';\nimport { FilterState } from '../filter.state';\n\n@Component({\n selector: 'ap-filter-leaf',\n templateUrl: './filter-leaf.component.html',\n styleUrl: './filter-leaf.component.scss',\n imports: [TooltipDirective, SymbolComponent, CheckboxComponent, RadioComponent, ToggleComponent, FormsModule, ReactiveFormsModule],\n providers: [provideUiComponentsSymbols(apChevronDown)],\n})\nexport class FilterLeafComponent {\n public readonly state = inject(FilterState);\n\n /** item propagated from FilterDropdownComponent */\n item = input.required<FilterDropdownGroup>();\n /** whether the leaf is closable */\n closable = input(true);\n\n checkboxItem = computed(() => {\n const item = this.item();\n return item.filterType === 'checkbox' ? item : undefined;\n });\n\n radioItem = computed(() => {\n const item = this.item();\n return item.filterType === 'radio' ? item : undefined;\n });\n\n toggleItem = computed(() => {\n const item = this.item();\n return item.filterType === 'toggle' ? item : undefined;\n });\n\n selectItem = computed(() => {\n const item = this.item();\n return item.filterType === 'select' ? item : undefined;\n });\n\n dateRangeItem = computed(() => {\n const item = this.item();\n return item.filterType === 'date-range' ? item : undefined;\n });\n\n radioValue = computed<unknown | null>(() => {\n const value = this.state.getValue(this.item().key);\n return value?.filterType === 'radio' ? value.selected : null;\n });\n\n checkboxValue = computed<Record<string, boolean>>(() => {\n const checkboxItem = this.checkboxItem();\n const checkboxValueByKey: Record<string, boolean> = {};\n checkboxItem?.items.forEach(item => (checkboxValueByKey[item.name] = !!item.checked));\n\n const value = this.state.getValue(this.item().key);\n if (value && value.filterType === 'checkbox') {\n value.selected.forEach(item => (checkboxValueByKey[item] = true));\n }\n return checkboxValueByKey;\n });\n\n toggleValue = computed(() => {\n const value = this.state.getValue(this.item().key);\n return value?.filterType === 'toggle' ? value.checked : false;\n });\n\n onHeaderClick(): void {\n if (this.closable()) {\n this.state.collapseHeader(this.item().key);\n }\n }\n\n onCheckboxChange(name: string, checked: boolean): void {\n this.state.toggleCheckbox(this.item().key, name, checked);\n }\n\n onRadioClick(value: unknown): void {\n this.state.setRadioValue(this.item().key, value);\n }\n\n onToggleChange(checked: boolean): void {\n this.state.setToggleValue(this.item().key, checked);\n }\n}\n","<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n","import { ButtonComponent } from '@agorapulse/ui-components/button';\nimport { createDropdownOverlay, DropdownOverlay } from '@agorapulse/ui-components/dropdown-base';\nimport { FilterLeafComponent } from '../filter-leaf/filter-leaf.component';\nimport { provideUiComponentsSymbols } from '@agorapulse/ui-components/providers';\nimport { apReset } from '@agorapulse/ui-symbol';\nimport { Component, effect, inject, input, output, TemplateRef, untracked, viewChild } from '@angular/core';\nimport { FilterDropdownGroup, FilterDropdownOutput } from '../filter.model';\nimport { FilterState } from '../filter.state';\n\n@Component({\n selector: 'ap-filter-dropdown',\n templateUrl: './filter-dropdown.component.html',\n styleUrl: './filter-dropdown.component.scss',\n imports: [ButtonComponent, FilterLeafComponent],\n providers: [FilterState, provideUiComponentsSymbols(apReset)],\n})\nexport class FilterDropdownComponent implements DropdownOverlay {\n private readonly overlay = createDropdownOverlay();\n readonly state = inject(FilterState);\n\n initGroups = effect(() => {\n const groups = this.items();\n untracked(() => {\n if (groups) {\n this.state.initialize(groups);\n }\n });\n });\n\n filterGroupTemplate = viewChild<TemplateRef<unknown>>('filterGroupTemplate');\n\n /** The filter groups to display in the dropdown */\n items = input<FilterDropdownGroup[]>();\n /** Whether the filter needs the apply button to be clicked for applyFilters to emit */\n needApplyButton = input(true);\n /** Whether the filter group can be closed (collapsed) by the user. If false, the group will always be expanded and the user won't see a toggle button. */\n closable = input(true);\n /** whether the mode is in preset mode */\n savePresetsMode = input(false);\n\n /** Whether to show a backdrop that closes the dropdown when clicked */\n showBackdrop = input(true);\n /** Whether the dropdown is disabled and cannot be opened */\n disabled = input(false);\n /** Default position for the dropdown relative to the trigger element */\n defaultPosition = input<'right' | 'left'>('right');\n\n savePresetsText = input('Save new presets');\n resetFilterText = input('Reset filters');\n\n applyFiltersText = input('Apply filters');\n clearFilterText = input('Clear filters');\n\n /** Emits when the dropdown menu is opened */\n opened = output<void>();\n /** Emits when the dropdown menu is closed */\n closed = output<void>();\n\n /** Emits when save presets is clicked */\n savePresets = output<FilterDropdownOutput>();\n /** Emits when filters are applied */\n applyFilters = output<FilterDropdownOutput>();\n /** Emits when user clicks on clear filter */\n clearFilters = output<void>();\n /** Emits when user clicks on reset filter */\n resetFilters = output<void>();\n\n readonly isOpen = this.overlay.isOpen;\n\n /** Opens the dropdown menu at the specified trigger element */\n open(triggerElement?: HTMLElement): void {\n const template = this.filterGroupTemplate();\n if (this.disabled() || this.isOpen() || !template) return;\n\n this.overlay.open(template, triggerElement, {\n showBackdrop: this.showBackdrop(),\n defaultPosition: this.defaultPosition(),\n onClose: () => this.close(),\n });\n this.opened.emit();\n }\n\n /** Closes the dropdown menu and cleans up overlay resources */\n close(): void {\n if (!this.isOpen()) return;\n this.overlay.close();\n this.closed.emit();\n }\n\n /** Toggles the dropdown menu open or closed state */\n toggle(triggerElement?: HTMLElement): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open(triggerElement);\n }\n }\n\n onApplyFilters(): void {\n this.applyFilters.emit(this.state.getSnapshot());\n }\n\n onClearFilters(): void {\n this.state.clear();\n this.clearFilters.emit();\n }\n\n onResetFilters(): void {\n this.state.reset();\n this.resetFilters.emit();\n }\n\n onSavePresets(): void {\n this.savePresets.emit(this.state.getSnapshot());\n }\n}\n","<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of state.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agorapulse-ui-components-filter-dropdown.mjs","sources":["../../../libs/ui-components/filter-dropdown/src/filter.state.ts","../../../libs/ui-components/filter-dropdown/src/filter-leaf-select/filter-leaf-select.component.ts","../../../libs/ui-components/filter-dropdown/src/filter-leaf-select/filter-leaf-select.component.html","../../../libs/ui-components/filter-dropdown/src/filter-leaf/filter-leaf.component.ts","../../../libs/ui-components/filter-dropdown/src/filter-leaf/filter-leaf.component.html","../../../libs/ui-components/filter-dropdown/src/filter-dropdown/filter-dropdown.component.ts","../../../libs/ui-components/filter-dropdown/src/filter-dropdown/filter-dropdown.component.html","../../../libs/ui-components/filter-dropdown/src/agorapulse-ui-components-filter-dropdown.ts"],"sourcesContent":["import { Injectable, signal } from '@angular/core';\nimport {\n FilterDropdownOutput,\n FilterDropdownGroup,\n FilterDropdownValue,\n FilterDropdownValueCheckbox,\n FilterDropdownValueDateRange,\n FilterDropdownValueRadio,\n FilterDropdownValueSingleSelect,\n FilterDropdownValueMultipleSelect,\n FilterDropdownValueToggle,\n} from './filter.model';\n\n@Injectable()\nexport class FilterState {\n private readonly _groups = signal<FilterDropdownGroup[]>([]);\n private readonly _draft = signal<FilterDropdownOutput>({});\n\n readonly groups = this._groups.asReadonly();\n readonly draft = this._draft.asReadonly();\n\n /** Initialize groups and seed draft from config defaults */\n initialize(groups: FilterDropdownGroup[]): void {\n this._groups.set(groups);\n const initial: FilterDropdownOutput = {};\n for (const group of groups) {\n initial[group.key] = this.buildInitialValue(group);\n }\n this._draft.set(initial);\n }\n\n collapseHeader(key: string): void {\n const group = this._groups().find(g => g.key === key);\n if (group) {\n group.expanded = !group.expanded;\n this._groups.update(gs => [...gs]);\n }\n }\n\n /** Get the draft value for a specific filter key */\n getValue(key: string): FilterDropdownValue | undefined {\n return this._draft()[key];\n }\n\n /** Update a single filter's draft value */\n updateValue(key: string, value: FilterDropdownValue): void {\n this._draft.update(draft => ({ ...draft, [key]: value }));\n }\n\n /** Toggle a checkbox item in a checkbox filter */\n toggleCheckbox(key: string, name: string, checked: boolean): void {\n const current = this._draft()[key];\n if (current?.filterType !== 'checkbox') return;\n\n const selected = checked ? [...current.selected, name] : current.selected.filter(n => n !== name);\n\n this.updateValue(key, { filterType: 'checkbox', selected });\n }\n\n /** Set the selected radio value */\n setRadioValue(key: string, value: unknown): void {\n this.updateValue(key, { filterType: 'radio', selected: value });\n }\n\n /** Set the toggle checked state */\n setToggleValue(key: string, checked: boolean): void {\n this.updateValue(key, { filterType: 'toggle', checked });\n }\n\n /** Set selected indices for a select filter */\n setSingleSelectValue(key: string, selected: unknown): void {\n this.updateValue(key, { filterType: 'select', selectionType: 'single', selected });\n }\n\n setMultipleSelectValue(key: string, selected: unknown[]): void {\n this.updateValue(key, { filterType: 'select', selectionType: 'multiple', selected });\n }\n\n /** Return the current draft snapshot (used on Apply) */\n getSnapshot(): FilterDropdownOutput {\n return { ...this._draft() };\n }\n\n /** Reset draft to initial values from the current config */\n reset(): void {\n this.initialize(this._groups());\n }\n\n /** Clear all draft values to empty/default states */\n clear(): void {\n const cleared: FilterDropdownOutput = {};\n for (const group of this._groups()) {\n cleared[group.key] = this.buildEmptyValue(group);\n }\n this._draft.set(cleared);\n }\n\n private buildInitialValue(group: FilterDropdownGroup): FilterDropdownValue {\n switch (group.filterType) {\n case 'checkbox':\n return {\n filterType: 'checkbox',\n selected: group.defaultSelected ?? group.items.filter(i => i.checked).map(i => i.name),\n } satisfies FilterDropdownValueCheckbox;\n case 'radio':\n return {\n filterType: 'radio',\n selected: group.defaultSelected ?? null,\n } satisfies FilterDropdownValueRadio;\n case 'toggle':\n return {\n filterType: 'toggle',\n checked: group.defaultSelected ?? group.item.checked ?? false,\n } satisfies FilterDropdownValueToggle;\n case 'select':\n if (group.selectionType === 'single') {\n return {\n filterType: 'select',\n selectionType: 'single',\n selected: group.defaultSelected ? group.defaultSelected : undefined,\n } satisfies FilterDropdownValueSingleSelect;\n } else {\n return {\n filterType: 'select',\n selectionType: 'multiple',\n selected: group.defaultSelected ?? [],\n } satisfies FilterDropdownValueMultipleSelect;\n }\n case 'date-range':\n return {\n filterType: 'date-range',\n selectedPeriod: group.selectedPeriod,\n } satisfies FilterDropdownValueDateRange;\n }\n }\n\n private buildEmptyValue(group: FilterDropdownGroup): FilterDropdownValue {\n switch (group.filterType) {\n case 'checkbox':\n return { filterType: 'checkbox', selected: [] };\n case 'radio':\n return { filterType: 'radio', selected: null };\n case 'toggle':\n return { filterType: 'toggle', checked: false };\n case 'select':\n if (group.selectionType === 'single') {\n return { filterType: 'select', selectionType: 'single', selected: undefined };\n }\n return { filterType: 'select', selectionType: 'multiple', selected: [] };\n case 'date-range':\n return { filterType: 'date-range', selectedPeriod: undefined };\n }\n }\n}\n","import {\n DropdownItemMultipleOneLineComponent,\n DropdownItemMultipleTwoLinesComponent,\n DropdownItemSingleOneLineComponent,\n DropdownItemSingleTwoLinesComponent,\n SelectLabelMultipleComponent,\n SelectLabelMultipleDisplayType,\n SelectLabelSingleComponent,\n SelectMultipleDirective,\n SelectSingleDirective,\n} from '@agorapulse/ui-components/select';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport {\n NgLabelTemplateDirective,\n NgMultiLabelTemplateDirective,\n NgOptionTemplateDirective,\n NgSelectComponent,\n} from '@ng-select/ng-select';\nimport { FilterDropdownGroupSelect } from '../filter.model';\nimport { FilterState } from '../filter.state';\n\nconst MULTIPLE_DISPLAY_TYPES = new Set<string>(['tag', 'label']);\n\n@Component({\n selector: 'ap-filter-leaf-select',\n templateUrl: './filter-leaf-select.component.html',\n imports: [\n FormsModule,\n NgSelectComponent,\n SelectMultipleDirective,\n SelectSingleDirective,\n SelectLabelSingleComponent,\n SelectLabelMultipleComponent,\n NgOptionTemplateDirective,\n DropdownItemMultipleTwoLinesComponent,\n DropdownItemMultipleOneLineComponent,\n DropdownItemSingleOneLineComponent,\n DropdownItemSingleTwoLinesComponent,\n NgLabelTemplateDirective,\n NgMultiLabelTemplateDirective,\n ],\n})\nexport class FilterLeafSelectComponent {\n readonly filterState = inject(FilterState);\n\n item = input.required<FilterDropdownGroupSelect>();\n\n multipleDisplayType = computed<SelectLabelMultipleDisplayType>(() => {\n const dt = this.item().displayType;\n return MULTIPLE_DISPLAY_TYPES.has(dt) ? (dt as SelectLabelMultipleDisplayType) : 'label';\n });\n\n singleSelectValue = computed(() => {\n const value = this.filterState.getValue(this.item().key);\n return value?.filterType === 'select' && value.selectionType === 'single' ? value.selected : undefined;\n });\n\n multipleSelectValue = computed(() => {\n const value = this.filterState.getValue(this.item().key);\n return value?.filterType === 'select' && value?.selectionType === 'multiple' ? value.selected : [];\n });\n}\n","@let selectItem = item();\n<div class=\"ap-filter-leaf__option\">\n @if (selectItem.selectionType === 'single') {\n <ng-select\n apSelectSingle\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"singleSelectValue()\"\n (ngModelChange)=\"filterState.setSingleSelectValue(selectItem.key, $event)\"\n >\n <ng-template\n let-item=\"item\"\n ng-label-tmp>\n <ap-select-label-single\n [displayType]=\"selectItem.displayType\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [label]=\"item.label\" />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-single-two-lines\n [caption]=\"item$.caption\"\n [selected]=\"item$.selected\"\n [text]=\"item$.label\"\n [avatarUrl]=\"item$.avatarUrl\"\n [network]=\"item$.network\"\n [symbolId]=\"item$.symbolId\"\n />\n } @else {\n <ap-dropdown-item-single-one-line\n [selected]=\"item$.selected\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n\n </ng-template>\n\n </ng-select>\n } @else {\n <ng-select\n apSelectMultiple\n bindLabel=\"label\"\n bindValue=\"value\"\n [items]=\"selectItem.items\"\n [placeholder]=\"selectItem.placeholder ?? 'Select an option'\"\n [inlineLabel]=\"selectItem.inlineLabel\"\n [ngModel]=\"multipleSelectValue()\"\n (ngModelChange)=\"filterState.setMultipleSelectValue(selectItem.key, $event)\">\n <ng-template\n let-items=\"items\"\n let-clear=\"clear\"\n ng-multi-label-tmp>\n <ap-select-label-multiple\n bindValue=\"value\"\n bindLabel=\"label\"\n [displayType]=\"multipleDisplayType()\"\n [selectedItems]=\"items\"\n (removeItem)=\"clear($event)\"\n />\n </ng-template>\n\n <ng-template\n let-item=\"item\"\n let-item$=\"item$\"\n ng-option-tmp>\n @if (item.caption) {\n <ap-dropdown-item-multiple-two-lines\n [selected]=\"item$.selected\"\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [caption]=\"item.caption\"\n [text]=\"item.label\"\n [htmlId]=\"item$.htmlId\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n } @else {\n <ap-dropdown-item-multiple-one-line\n [onlyText]=\"selectItem.onlyText ?? 'Only'\"\n [selected]=\"item$.selected\"\n [htmlId]=\"item$.htmlId\"\n [text]=\"item.label\"\n [avatarUrl]=\"item.avatarUrl\"\n [network]=\"item.network\"\n [symbolId]=\"item.symbolId\"\n />\n }\n </ng-template>\n </ng-select>\n }\n</div>\n","import { CheckboxComponent } from '@agorapulse/ui-components/checkbox';\nimport { provideUiComponentsSymbols } from '@agorapulse/ui-components/providers';\nimport { RadioComponent } from '@agorapulse/ui-components/radio';\nimport { ToggleComponent } from '@agorapulse/ui-components/toggle';\nimport { TooltipDirective } from '@agorapulse/ui-components/tooltip';\nimport { SymbolComponent } from '@agorapulse/ui-symbol';\nimport { apChevronDown } from '@agorapulse/ui-symbol/icons';\nimport { Component, computed, inject, input } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { FilterLeafSelectComponent } from '../filter-leaf-select/filter-leaf-select.component';\nimport { FilterDropdownGroup } from '../filter.model';\nimport { FilterState } from '../filter.state';\n\n@Component({\n selector: 'ap-filter-leaf',\n templateUrl: './filter-leaf.component.html',\n styleUrl: './filter-leaf.component.scss',\n imports: [\n TooltipDirective,\n SymbolComponent,\n CheckboxComponent,\n RadioComponent,\n ToggleComponent,\n FormsModule,\n FilterLeafSelectComponent,\n ],\n providers: [provideUiComponentsSymbols(apChevronDown)],\n})\nexport class FilterLeafComponent {\n public readonly filterState = inject(FilterState);\n\n /** item propagated from FilterDropdownComponent */\n item = input.required<FilterDropdownGroup>();\n /** whether the leaf is closable */\n closable = input(true);\n\n checkboxItem = computed(() => {\n const item = this.item();\n return item.filterType === 'checkbox' ? item : undefined;\n });\n\n radioItem = computed(() => {\n const item = this.item();\n return item.filterType === 'radio' ? item : undefined;\n });\n\n toggleItem = computed(() => {\n const item = this.item();\n return item.filterType === 'toggle' ? item : undefined;\n });\n\n selectItem = computed(() => {\n const item = this.item();\n return item.filterType === 'select' ? item : undefined;\n });\n\n dateRangeItem = computed(() => {\n const item = this.item();\n return item.filterType === 'date-range' ? item : undefined;\n });\n\n radioValue = computed<unknown | null>(() => {\n const value = this.filterState.getValue(this.item().key);\n return value?.filterType === 'radio' ? value.selected : null;\n });\n\n checkboxValue = computed<Record<string, boolean>>(() => {\n const checkboxItem = this.checkboxItem();\n const checkboxValueByKey: Record<string, boolean> = {};\n checkboxItem?.items.forEach(item => (checkboxValueByKey[item.name] = !!item.checked));\n\n const value = this.filterState.getValue(this.item().key);\n if (value && value.filterType === 'checkbox') {\n value.selected.forEach(item => (checkboxValueByKey[item] = true));\n }\n return checkboxValueByKey;\n });\n\n toggleValue = computed(() => {\n const value = this.filterState.getValue(this.item().key);\n return value?.filterType === 'toggle' ? value.checked : false;\n });\n\n onHeaderClick(): void {\n if (this.closable()) {\n this.filterState.collapseHeader(this.item().key);\n }\n }\n\n onCheckboxChange(name: string, checked: boolean): void {\n this.filterState.toggleCheckbox(this.item().key, name, checked);\n }\n\n onRadioClick(value: unknown): void {\n this.filterState.setRadioValue(this.item().key, value);\n }\n\n onToggleChange(checked: boolean): void {\n this.filterState.setToggleValue(this.item().key, checked);\n }\n}\n","<div class=\"ap-filter-leaf\">\n\n <div class=\"ap-filter-leaf__header\" [class.ap-filter-leaf__closable]=\"closable()\" (click)=\"onHeaderClick()\">\n <div class=\"ap-filter-leaf__title\">\n <span>{{ item().title }}</span>\n @if (item().tooltipText) {\n <ap-symbol symbolId=\"info\" size=\"sm\" [apTooltip]=\"item().tooltipText\" />\n }\n </div>\n @if (closable()) {\n <div class=\"ap-filter-leaf__actions\" [class.ap-filter-leaf__chevron--rotated]=\"!item().expanded\">\n <ap-symbol symbolId=\"chevron-up\" size=\"sm\" />\n </div>\n }\n </div>\n\n @if (!closable() || item().expanded) {\n <div class=\"ap-filter-leaf__content\">\n @if (item().label) {\n <span class=\"ap-filter-leaf__label\">{{ item().label }}</span>\n }\n @switch(item().filterType) {\n @case ('checkbox') {\n @let vCheckboxItem = checkboxItem();\n @if (vCheckboxItem) {\n @for (option of vCheckboxItem.items; track option.name) {\n <div class=\"ap-filter-leaf__option\">\n <ap-checkbox\n [name]=\"'checkbox-' + option.name\"\n [checked]=\"checkboxValue()[option.name]\"\n [disabled]=\"!!option.disabled\"\n [indeterminate]=\"!!option.indeterminate\"\n (change)=\"onCheckboxChange(option.name, $event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-checkbox>\n </div>\n }\n }\n }\n @case ('radio') {\n @let vRadioItem = radioItem();\n @if (vRadioItem) {\n @for (option of vRadioItem.items; track option.radioId) {\n <div class=\"ap-filter-leaf__option\">\n <ap-radio\n [radioId]=\"option.radioId\"\n [value]=\"option.value\"\n [disabled]=\"!!option.disabled\"\n [name]=\"item().key\"\n [ngModel]=\"radioValue()\"\n (ngModelChange)=\"onRadioClick($event)\"\n >\n <span class=\"ap-filter-leaf__label\">{{ option.label }}</span>\n </ap-radio>\n </div>\n }\n }\n }\n @case ('toggle') {\n @let vToggleItem = toggleItem();\n @if (vToggleItem) {\n <div class=\"ap-filter-leaf__option\">\n <ap-toggle\n [name]=\"'toggle-' + vToggleItem.item.name\"\n [checked]=\"toggleValue()\"\n [disabled]=\"vToggleItem.item.disabled\"\n (change)=\"onToggleChange($event)\"\n />\n <span class=\"ap-filter-leaf__label\">{{ vToggleItem.item.label }}</span>\n </div>\n }\n }\n @case ('select') {\n @let vSelectItem = selectItem();\n @if (vSelectItem) {\n <ap-filter-leaf-select [item]=\"vSelectItem\" />\n }\n }\n @case ('date-range') {\n\n }\n }\n </div>\n }\n\n</div>\n","import { ButtonComponent } from '@agorapulse/ui-components/button';\nimport { createDropdownOverlay, DropdownOverlay } from '@agorapulse/ui-components/dropdown-base';\nimport { FilterLeafComponent } from '../filter-leaf/filter-leaf.component';\nimport { provideUiComponentsSymbols } from '@agorapulse/ui-components/providers';\nimport { apReset } from '@agorapulse/ui-symbol';\nimport { Component, effect, inject, input, output, TemplateRef, untracked, viewChild } from '@angular/core';\nimport { FilterDropdownGroup, FilterDropdownOutput } from '../filter.model';\nimport { FilterState } from '../filter.state';\n\n@Component({\n selector: 'ap-filter-dropdown',\n templateUrl: './filter-dropdown.component.html',\n styleUrl: './filter-dropdown.component.scss',\n imports: [ButtonComponent, FilterLeafComponent],\n providers: [FilterState, provideUiComponentsSymbols(apReset)],\n})\nexport class FilterDropdownComponent implements DropdownOverlay {\n private readonly overlay = createDropdownOverlay();\n readonly filterState = inject(FilterState);\n\n initGroups = effect(() => {\n const groups = this.items();\n untracked(() => {\n if (groups) {\n this.filterState.initialize(groups);\n }\n });\n });\n\n filterGroupTemplate = viewChild<TemplateRef<unknown>>('filterGroupTemplate');\n\n /** The filter groups to display in the dropdown */\n items = input<FilterDropdownGroup[]>();\n /** Whether the filter needs the apply button to be clicked for applyFilters to emit */\n needApplyButton = input(true);\n /** Whether the filter group can be closed (collapsed) by the user. If false, the group will always be expanded and the user won't see a toggle button. */\n closable = input(true);\n /** whether the mode is in preset mode */\n savePresetsMode = input(false);\n\n /** Whether to show a backdrop that closes the dropdown when clicked */\n showBackdrop = input(true);\n /** Whether the dropdown is disabled and cannot be opened */\n disabled = input(false);\n /** Default position for the dropdown relative to the trigger element */\n defaultPosition = input<'right' | 'left'>('right');\n\n savePresetsText = input('Save new presets');\n resetFilterText = input('Reset filters');\n\n applyFiltersText = input('Apply filters');\n clearFilterText = input('Clear filters');\n\n /** Emits when the dropdown menu is opened */\n opened = output<void>();\n /** Emits when the dropdown menu is closed */\n closed = output<void>();\n\n /** Emits when save presets is clicked */\n savePresets = output<FilterDropdownOutput>();\n /** Emits when filters are applied */\n applyFilters = output<FilterDropdownOutput>();\n /** Emits when user clicks on clear filter */\n clearFilters = output<void>();\n /** Emits when user clicks on reset filter */\n resetFilters = output<void>();\n\n readonly isOpen = this.overlay.isOpen;\n\n /** Opens the dropdown menu at the specified trigger element */\n open(triggerElement?: HTMLElement): void {\n const template = this.filterGroupTemplate();\n if (this.disabled() || this.isOpen() || !template) return;\n\n this.overlay.open(template, triggerElement, {\n showBackdrop: this.showBackdrop(),\n defaultPosition: this.defaultPosition(),\n onClose: () => this.close(),\n });\n this.opened.emit();\n }\n\n /** Closes the dropdown menu and cleans up overlay resources */\n close(): void {\n if (!this.isOpen()) return;\n this.overlay.close();\n this.closed.emit();\n }\n\n /** Toggles the dropdown menu open or closed state */\n toggle(triggerElement?: HTMLElement): void {\n if (this.isOpen()) {\n this.close();\n } else {\n this.open(triggerElement);\n }\n }\n\n onApplyFilters(): void {\n this.applyFilters.emit(this.filterState.getSnapshot());\n }\n\n onClearFilters(): void {\n this.filterState.clear();\n this.clearFilters.emit();\n }\n\n onResetFilters(): void {\n this.filterState.reset();\n this.resetFilters.emit();\n }\n\n onSavePresets(): void {\n this.savePresets.emit(this.filterState.getSnapshot());\n }\n}\n","<ng-template #filterGroupTemplate>\n <div\n class=\"ap-filter-dropdown\"\n role=\"menu\"\n tabindex=\"-1\"\n aria-label=\"Filter dropdown\">\n\n <div class=\"ap-filter-dropdown__content\">\n @for (item of filterState.groups(); track item.key) {\n <ap-filter-leaf [item]=\"item\" [closable]=\"closable()\" />\n }\n </div>\n\n <div class=\"ap-filter-dropdown__footer\">\n @if (savePresetsMode()) {\n <div class=\"ap-filter-dropdown__footer--presets\">\n <ap-button\n name=\"filter-dropdown-save-preset\"\n [config]=\"{ color: 'blue', style: 'stroked-transparent' }\"\n (click)=\"onSavePresets()\">\n {{ savePresetsText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-reset-filters\"\n [symbolId]=\"'reset'\"\n [symbolPosition]=\"'left'\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onResetFilters()\">\n {{ resetFilterText() }}\n </ap-button>\n </div>\n } @else {\n <div class=\"ap-filter-dropdown__footer--apply\">\n <ap-button\n name=\"filter-dropdown-clear-filters\"\n [config]=\"{ color: 'blue', style: 'ghost' }\"\n (click)=\"onClearFilters()\">\n {{ clearFilterText() }}\n </ap-button>\n\n <ap-button\n name=\"filter-dropdown-apply-filters\"\n [config]=\"{ color: 'blue', style: 'primary' }\"\n (click)=\"onApplyFilters()\">\n {{ applyFiltersText() }}\n </ap-button>\n </div>\n }\n </div>\n </div>\n\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}