@agorapulse/ui-components 21.1.10 → 21.1.12

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.
@@ -1,5 +1,5 @@
1
1
  import { AvatarNetwork } from '@agorapulse/ui-components/avatar';
2
- import { Period, Locale, FirstDayOfWeek } from '@agorapulse/ui-components/datepicker';
2
+ import { Locale, FirstDayOfWeek, Period } from '@agorapulse/ui-components/datepicker';
3
3
  import dayjs from 'dayjs';
4
4
  import { SelectLabelSingleDisplayType } from '@agorapulse/ui-components/select';
5
5
  import { TagColor } from '@agorapulse/ui-components/tag';
@@ -68,12 +68,21 @@ interface FilterDropdownValueDateRange {
68
68
  type FilterDropdownValue = FilterDropdownValueCheckbox | FilterDropdownValueRadio | FilterDropdownValueToggle | FilterDropdownValueSingleSelect | FilterDropdownValueMultipleSelect | FilterDropdownValueDateRange;
69
69
  /** The output emitted by filter-dropdown on apply: a map of filter key → value */
70
70
  type FilterDropdownOutput = Record<string, FilterDropdownValue>;
71
+ /** A single user edit reported up by a leaf: the fully-formed value for one filter key. */
72
+ interface FilterValueEdit {
73
+ key: string;
74
+ value: FilterDropdownValue;
75
+ }
71
76
  interface FilterDropdownGroupBase {
72
77
  /** Unique key to identify this filter in the output */
73
78
  key: string;
74
79
  /** The title of the filter group to display in the UI */
75
80
  title: string;
76
- /** Whether the filter group is expanded (open) or collapsed by default. Only applicable if `closable` is true. */
81
+ /**
82
+ * The *initial* expanded (open) / collapsed state of the filter group. Only applicable if `closable` is true.
83
+ * This seeds the state on the first render; afterwards the live expand/collapse state is owned by the component
84
+ * and is never written back to this config. Use the dropdown's `expandOnOpen` input to re-derive it on each open.
85
+ */
77
86
  expanded?: boolean;
78
87
  /** An optional label to display under the filter group title */
79
88
  label?: string;
@@ -90,19 +99,16 @@ interface FilterDropdownGroupCheckbox extends FilterDropdownGroupBase {
90
99
  /** The type of the FilterDropdownGroupBase */
91
100
  filterType: 'checkbox';
92
101
  items: FilterDropdownItemCheckbox[];
93
- defaultSelected?: string[];
94
102
  }
95
103
  interface FilterDropdownGroupRadio extends FilterDropdownGroupBase {
96
104
  /** The type of the FilterDropdownGroupBase */
97
105
  filterType: 'radio';
98
106
  items: FilterDropdownItemRadio[];
99
- defaultSelected?: unknown;
100
107
  }
101
108
  interface FilterDropdownGroupToggle extends FilterDropdownGroupBase {
102
109
  /** The type of the FilterDropdownGroupBase */
103
110
  filterType: 'toggle';
104
111
  item: FilterDropdownItemToggle;
105
- defaultSelected?: boolean;
106
112
  }
107
113
  interface FilterDropdownGroupSelectSingle extends FilterDropdownGroupBase {
108
114
  /** An optional label to display next to each filter item (e.g. "and", "or"). Only applicable for checkbox, radio and toggle filter groups. */
@@ -116,7 +122,6 @@ interface FilterDropdownGroupSelectSingle extends FilterDropdownGroupBase {
116
122
  /** An optional text to display when all items are selected. Only applicable for select filter groups with multiple selection. */
117
123
  onlyText?: string;
118
124
  items: FilterDropdownItemSelect[];
119
- defaultSelected?: unknown;
120
125
  }
121
126
  interface FilterDropdownGroupSelectMultiple extends FilterDropdownGroupBase {
122
127
  /** An optional label to display next to each filter item (e.g. "and", "or"). Only applicable for checkbox, radio and toggle filter groups. */
@@ -130,59 +135,91 @@ interface FilterDropdownGroupSelectMultiple extends FilterDropdownGroupBase {
130
135
  /** An optional text to display when all items are selected. Only applicable for select filter groups with multiple selection. */
131
136
  onlyText?: string;
132
137
  items: FilterDropdownItemSelect[];
133
- defaultSelected?: unknown[];
134
138
  }
135
139
  interface FilterDropdownGroupDateRange extends FilterDropdownGroupBase {
136
140
  /** The type of the FilterDropdownGroupBase */
137
141
  filterType: 'date-range';
138
142
  minDate?: dayjs.Dayjs;
139
143
  maxDate?: dayjs.Dayjs;
140
- selectedPeriod?: Period;
141
144
  locale?: Locale;
142
145
  firstDayOfWeek?: FirstDayOfWeek;
143
146
  dateFormat?: string;
144
147
  }
145
148
  type FilterDropdownGroup = FilterDropdownGroupCheckbox | FilterDropdownGroupRadio | FilterDropdownGroupToggle | FilterDropdownGroupSelectSingle | FilterDropdownGroupSelectMultiple | FilterDropdownGroupDateRange;
149
+ /**
150
+ * Policy deciding which groups start expanded each time the dropdown opens.
151
+ * - `'collapse-empty'`: expand groups that currently have a selection, collapse the empty ones.
152
+ * - a predicate: evaluated per group against its current draft value.
153
+ * When omitted on the component, the expand/collapse state persists across opens.
154
+ */
155
+ type ExpandOnOpenPolicy = 'collapse-empty' | ((group: FilterDropdownGroup, value: FilterDropdownValue) => boolean);
146
156
 
157
+ /**
158
+ * Working state for a single filter-dropdown instance. Component-scoped (provided on
159
+ * `FilterDropdownComponent`), never `providedIn: 'root'`.
160
+ *
161
+ * This is a PURE state container: every method here only reads or writes signals — none of them
162
+ * emit anything. The apply→value→apply loop is impossible because the ONLY code that emits
163
+ * `applyFilters` lives inside the component's user-gesture handlers (see FilterDropdownComponent),
164
+ * and seeding an input never runs a gesture handler. Re-seeding `value`/`savedValue` therefore
165
+ * updates the draft and stops there — there is no emit path to loop through.
166
+ *
167
+ * The internal `_baseline` is the dirty-tracking reference: seeded from the `savedValue` input
168
+ * (falling back to `value`), and moved locally by `commit()` on Apply/Save/Update.
169
+ */
147
170
  declare class FilterState {
148
171
  private readonly _groups;
149
172
  private readonly _draft;
150
173
  private readonly _baseline;
151
- activeFilterCount: _angular_core.Signal<number>;
174
+ private readonly _expanded;
152
175
  readonly groups: _angular_core.Signal<FilterDropdownGroup[]>;
153
176
  readonly draft: _angular_core.Signal<FilterDropdownOutput>;
154
- isFilterCountActive: _angular_core.Signal<boolean>;
177
+ readonly expanded: _angular_core.Signal<Record<string, boolean>>;
178
+ readonly activeFilterCount: _angular_core.Signal<number>;
179
+ readonly isFilterCountActive: _angular_core.Signal<boolean>;
155
180
  readonly hasChanges: _angular_core.Signal<boolean>;
181
+ /** Save / Update / Reset / Apply are gated on dirty state. */
156
182
  readonly buttonsDisabled: _angular_core.Signal<boolean>;
157
- /** Refresh the groups schema and (re-)seed the draft + baseline from config defaults. */
158
- initialize(groups: FilterDropdownGroup[]): void;
159
- /** Adopt the current draft as the baseline (called on Apply / Save / Update). */
183
+ /** Clear is gated on "is there anything to clear", not on dirty state. */
184
+ readonly clearDisabled: _angular_core.Signal<boolean>;
185
+ /** Refresh the structural schema and reconcile the value keyspace (add empty / drop removed). */
186
+ setSchema(groups: FilterDropdownGroup[]): void;
187
+ /** Seed the draft from an external value, projected onto the current keyspace. Echo-gated, silent. */
188
+ seedDraft(value: FilterDropdownOutput): void;
189
+ /** Seed the baseline (the saved reference for dirty tracking / reset) from an external value. Silent. */
190
+ seedBaseline(value: FilterDropdownOutput): void;
191
+ /** Adopt the current draft as the baseline (Apply / Save / Update). */
160
192
  commit(): void;
161
- private buildValues;
162
- collapseHeader(key: string): void;
163
- /** Get the draft value for a specific filter key */
164
- getValue(key: string): FilterDropdownValue | undefined;
165
- /** Update a single filter's draft value */
166
- updateValue(key: string, value: FilterDropdownValue): void;
167
- /** Toggle a checkbox item in a checkbox filter */
168
- toggleCheckbox(key: string, name: string, checked: boolean): void;
169
- /** Set the selected radio value */
170
- setRadioValue(key: string, value: unknown): void;
171
- /** Set the toggle checked state */
172
- setToggleValue(key: string, checked: boolean): void;
173
- /** Set selected indices for a select filter */
174
- setSingleSelectValue(key: string, selected: unknown): void;
175
- setMultipleSelectValue(key: string, selected: unknown[]): void;
176
- /** Set the selected period for a date range filter */
177
- setDateRangeValue(key: string, selectedPeriod: Period): void;
178
- /** Return the current draft snapshot (used on Apply) */
179
- getSnapshot(): FilterDropdownOutput;
180
- /** Revert the draft to the committed baseline. */
193
+ /** Revert the draft to the committed baseline (user action). */
181
194
  reset(): void;
182
- /** Clear all draft values to empty/default states */
195
+ /** Clear all draft values to their empty states (user action). */
183
196
  clear(): void;
184
- private buildInitialValue;
185
- private buildEmptyValue;
197
+ /** Get the draft value for a specific filter key. */
198
+ getValue(key: string): FilterDropdownValue | undefined;
199
+ /** Return the current draft snapshot (used on Apply / Save). */
200
+ getSnapshot(): FilterDropdownOutput;
201
+ /**
202
+ * Apply a single filter's fully-formed draft value (user action). The value is built by the
203
+ * leaf that owns the widget; this state only stores it, keeping the type-specific shaping at
204
+ * the edge where the DOM event happens.
205
+ */
206
+ updateValue(key: string, value: FilterDropdownValue): void;
207
+ /** Whether a group is currently expanded. Defaults to collapsed for unknown keys. */
208
+ isExpanded(key: string): boolean;
209
+ /** Toggle a group's expand/collapse state. Updates internal state only — the config is never mutated. */
210
+ collapseHeader(key: string): void;
211
+ /**
212
+ * On open, optionally re-derive each group's expanded state from a policy. `'collapse-empty'` expands
213
+ * groups that currently have a selection; a custom predicate is evaluated against the current draft.
214
+ * When no policy is given the state is left untouched, so it persists across opens.
215
+ */
216
+ applyExpandOnOpen(policy?: ExpandOnOpenPolicy): void;
217
+ /** Seed the live expanded state from config, preserving any key that already has a live value. */
218
+ private seedExpanded;
219
+ /** Keep only keys present in `groups`; fill missing keys with their empty value, preserve existing ones. */
220
+ private reconcileKeyspace;
221
+ /** Project an external value onto the current keyspace: matching entries kept, others empty, extras dropped. */
222
+ private projectValues;
186
223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterState, never>;
187
224
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<FilterState>;
188
225
  }
@@ -190,18 +227,37 @@ declare class FilterState {
190
227
  declare class FilterDropdownComponent implements DropdownOverlay {
191
228
  private readonly overlay;
192
229
  readonly filterState: FilterState;
193
- initGroups: _angular_core.EffectRef;
194
- emitOnValueChange: _angular_core.EffectRef;
230
+ /**
231
+ * Seed the component state from its inputs. This is the ONLY reactive path and it is silent:
232
+ * it just copies inputs into `FilterState`. It never emits — emitting lives exclusively in the
233
+ * user-gesture handlers below — so feeding an applied `value` back here cannot start a loop.
234
+ * `savedValue` falls back to `value` when omitted (non-preset consumers).
235
+ */
236
+ syncFromInputs: _angular_core.EffectRef;
195
237
  filterGroupTemplate: _angular_core.Signal<TemplateRef<unknown> | undefined>;
196
238
  /**
197
- * The filter groups to display, with their default/initial selection. Configuration, not a live value
198
- * binding: update only on external changes never feed the component's own output back in (apply→items→apply loop).
239
+ * The filter groups to display: STRUCTURE only (keys, titles, options, locks, display type, and the
240
+ * optional initial `expanded` seed). Not a value binding selection lives in `value`, never here.
241
+ */
242
+ groups: _angular_core.InputSignal<FilterDropdownGroup[]>;
243
+ /** The current / applied selection. Seeds the editable draft; re-seeding is silent (never emits). */
244
+ value: _angular_core.InputSignal<FilterDropdownOutput>;
245
+ /**
246
+ * The consumer's saved value (e.g. the active preset's filter) that the dirty state and Reset compare
247
+ * against. Falls back to `value` when omitted. Kept distinct from `value` so an auto-applied edit stays
248
+ * dirty vs the preset.
199
249
  */
200
- items: _angular_core.InputSignal<FilterDropdownGroup[] | undefined>;
250
+ savedValue: _angular_core.InputSignal<FilterDropdownOutput | undefined>;
201
251
  /** Whether the filter needs the apply button to be clicked for applyFilters to emit */
202
252
  needApplyButton: _angular_core.InputSignal<boolean>;
203
253
  /** 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. */
204
254
  closable: _angular_core.InputSignal<boolean>;
255
+ /**
256
+ * Policy deciding which groups start expanded each time the dropdown opens. `'collapse-empty'` expands
257
+ * groups that currently have a selection; a predicate is evaluated per group against its draft value.
258
+ * Omitted → the expand/collapse state persists across opens.
259
+ */
260
+ expandOnOpen: _angular_core.InputSignal<ExpandOnOpenPolicy | undefined>;
205
261
  /** whether the feature to save presets is locked for the org */
206
262
  presetsFeatureLocked: _angular_core.InputSignal<boolean>;
207
263
  /** whether the mode is in preset mode */
@@ -247,14 +303,23 @@ declare class FilterDropdownComponent implements DropdownOverlay {
247
303
  close(): void;
248
304
  /** Toggles the dropdown menu open or closed state */
249
305
  toggle(triggerElement?: HTMLElement): void;
306
+ /**
307
+ * A leaf reported a user edit. Store it, then — in auto-apply mode — emit the new snapshot
308
+ * immediately. This is the whole auto-apply mechanism: an edit is a gesture, so it emits here;
309
+ * seeding an input never runs this handler, so an echoed value can never loop.
310
+ */
311
+ onLeafEdit(edit: FilterValueEdit): void;
312
+ /** Manual-apply commit (Apply button; only rendered when `needApplyButton`). */
250
313
  onApplyFilters(): void;
251
314
  onClearFilters(): void;
252
315
  onResetFilters(): void;
316
+ /** In auto-apply mode, push the current draft to the consumer. The single place clear/reset/leaf-edit funnel through. */
317
+ private emitIfAuto;
253
318
  onSavePresets(): void;
254
319
  onUpdatePresets(): void;
255
320
  protected onActionDropdownItemClick(item: ActionDropdownItem): void;
256
321
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterDropdownComponent, never>;
257
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownComponent, "ap-filter-dropdown", never, { "items": { "alias": "items"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
322
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownComponent, "ap-filter-dropdown", never, { "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "savedValue": { "alias": "savedValue"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "expandOnOpen": { "alias": "expandOnOpen"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
258
323
  }
259
324
 
260
325
  declare class FilterDropdownButtonComponent {
@@ -264,15 +329,18 @@ declare class FilterDropdownButtonComponent {
264
329
  /** text of the button, input specific to the button */
265
330
  buttonFilterText: _angular_core.InputSignal<string>;
266
331
  /** input specific to the filter-dropdown */
267
- /**
268
- * The filter groups to display, with their default/initial selection. Configuration, not a live value
269
- * binding: update only on external changes — never feed the component's own output back in (apply→items→apply loop).
270
- */
271
- items: _angular_core.InputSignal<FilterDropdownGroup[] | undefined>;
332
+ /** The filter groups to display: STRUCTURE only (keys, titles, options, locks, display type, expand seed). */
333
+ groups: _angular_core.InputSignal<FilterDropdownGroup[]>;
334
+ /** The current / applied selection. Seeds the editable draft; re-seeding is silent (never emits). */
335
+ value: _angular_core.InputSignal<FilterDropdownOutput>;
336
+ /** The consumer's saved value (e.g. the active preset's filter) that dirty state / Reset compare against. Falls back to `value`. */
337
+ savedValue: _angular_core.InputSignal<FilterDropdownOutput | undefined>;
272
338
  /** Whether the filter needs the apply button to be clicked for applyFilters to emit */
273
339
  needApplyButton: _angular_core.InputSignal<boolean>;
274
340
  /** 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. */
275
341
  closable: _angular_core.InputSignal<boolean>;
342
+ /** Policy deciding which groups start expanded on each open ('collapse-empty' | predicate). Omitted → persist. */
343
+ expandOnOpen: _angular_core.InputSignal<ExpandOnOpenPolicy | undefined>;
276
344
  /** whether the feature to save presets is locked for the org */
277
345
  presetsFeatureLocked: _angular_core.InputSignal<boolean>;
278
346
  /** whether the mode is in preset mode */
@@ -313,8 +381,8 @@ declare class FilterDropdownButtonComponent {
313
381
  /** Event emitted when a group with locked feature is clicked */
314
382
  filterDropdownGroupLockedClicked: _angular_core.OutputEmitterRef<FilterDropdownGroup>;
315
383
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<FilterDropdownButtonComponent, never>;
316
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownButtonComponent, "ap-filter-dropdown-button", never, { "buttonFilterText": { "alias": "buttonFilterText"; "required": false; "isSignal": true; }; "items": { "alias": "items"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
384
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<FilterDropdownButtonComponent, "ap-filter-dropdown-button", never, { "buttonFilterText": { "alias": "buttonFilterText"; "required": false; "isSignal": true; }; "groups": { "alias": "groups"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "savedValue": { "alias": "savedValue"; "required": false; "isSignal": true; }; "needApplyButton": { "alias": "needApplyButton"; "required": false; "isSignal": true; }; "closable": { "alias": "closable"; "required": false; "isSignal": true; }; "expandOnOpen": { "alias": "expandOnOpen"; "required": false; "isSignal": true; }; "presetsFeatureLocked": { "alias": "presetsFeatureLocked"; "required": false; "isSignal": true; }; "savePresetsMode": { "alias": "savePresetsMode"; "required": false; "isSignal": true; }; "editingPresetsMode": { "alias": "editingPresetsMode"; "required": false; "isSignal": true; }; "showBackdrop": { "alias": "showBackdrop"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "defaultPosition": { "alias": "defaultPosition"; "required": false; "isSignal": true; }; "saveNewPresetsText": { "alias": "saveNewPresetsText"; "required": false; "isSignal": true; }; "saveAsNewPresetText": { "alias": "saveAsNewPresetText"; "required": false; "isSignal": true; }; "savePresetText": { "alias": "savePresetText"; "required": false; "isSignal": true; }; "updateExistingPresetText": { "alias": "updateExistingPresetText"; "required": false; "isSignal": true; }; "resetFilterText": { "alias": "resetFilterText"; "required": false; "isSignal": true; }; "applyFiltersText": { "alias": "applyFiltersText"; "required": false; "isSignal": true; }; "clearFilterText": { "alias": "clearFilterText"; "required": false; "isSignal": true; }; }, { "opened": "opened"; "closed": "closed"; "presetsLockedClicked": "presetsLockedClicked"; "saveNewPresets": "saveNewPresets"; "updatePresets": "updatePresets"; "applyFilters": "applyFilters"; "clearFilters": "clearFilters"; "resetFilters": "resetFilters"; "lockedFeatureClicked": "lockedFeatureClicked"; "filterDropdownGroupLockedClicked": "filterDropdownGroupLockedClicked"; }, never, never, true, never>;
317
385
  }
318
386
 
319
387
  export { FilterDropdownButtonComponent, FilterDropdownComponent };
320
- export type { FilterDropdownGroup, FilterDropdownGroupCheckbox, FilterDropdownGroupDateRange, FilterDropdownGroupRadio, FilterDropdownGroupSelectMultiple, FilterDropdownGroupSelectSingle, FilterDropdownGroupToggle, FilterDropdownItemCheckbox, FilterDropdownItemRadio, FilterDropdownItemSelect, FilterDropdownItemToggle, FilterDropdownOutput, FilterDropdownType, FilterDropdownValue, FilterDropdownValueCheckbox, FilterDropdownValueDateRange, FilterDropdownValueMultipleSelect, FilterDropdownValueRadio, FilterDropdownValueSingleSelect, FilterDropdownValueToggle };
388
+ export type { ExpandOnOpenPolicy, FilterDropdownGroup, FilterDropdownGroupCheckbox, FilterDropdownGroupDateRange, FilterDropdownGroupRadio, FilterDropdownGroupSelectMultiple, FilterDropdownGroupSelectSingle, FilterDropdownGroupToggle, FilterDropdownItemCheckbox, FilterDropdownItemRadio, FilterDropdownItemSelect, FilterDropdownItemToggle, FilterDropdownOutput, FilterDropdownType, FilterDropdownValue, FilterDropdownValueCheckbox, FilterDropdownValueDateRange, FilterDropdownValueMultipleSelect, FilterDropdownValueRadio, FilterDropdownValueSingleSelect, FilterDropdownValueToggle, FilterValueEdit };
@@ -185,6 +185,7 @@ declare class SelectLabelMultipleComponent {
185
185
  bindSymbolId: _angular_core.InputSignal<string>;
186
186
  roundedAvatar: _angular_core.InputSignal<boolean>;
187
187
  bindNetwork: _angular_core.InputSignal<string>;
188
+ bindTagColor: _angular_core.InputSignal<string>;
188
189
  removeItem: _angular_core.OutputEmitterRef<any>;
189
190
  /**
190
191
  * Parent ng-select, resolved through the DI chain of the `ng-multi-label-tmp` template.
@@ -199,6 +200,7 @@ declare class SelectLabelMultipleComponent {
199
200
  symbolId: any;
200
201
  value: any;
201
202
  network: any;
203
+ tagColor: TagColor | undefined;
202
204
  }[]>;
203
205
  hiddenCount: _angular_core.WritableSignal<number>;
204
206
  trackByItem: (_: number, item: any) => any;
@@ -206,7 +208,7 @@ declare class SelectLabelMultipleComponent {
206
208
  itemsElement: _angular_core.Signal<readonly ElementRef<any>[]>;
207
209
  private responsiveLayout;
208
210
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<SelectLabelMultipleComponent, never>;
209
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectLabelMultipleComponent, "ap-select-label-multiple", never, { "displayType": { "alias": "displayType"; "required": false; "isSignal": true; }; "tagColor": { "alias": "tagColor"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": true; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindValue": { "alias": "bindValue"; "required": false; "isSignal": true; }; "bindAvatarUrl": { "alias": "bindAvatarUrl"; "required": false; "isSignal": true; }; "bindSymbolId": { "alias": "bindSymbolId"; "required": false; "isSignal": true; }; "roundedAvatar": { "alias": "roundedAvatar"; "required": false; "isSignal": true; }; "bindNetwork": { "alias": "bindNetwork"; "required": false; "isSignal": true; }; }, { "removeItem": "removeItem"; }, never, never, true, never>;
211
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<SelectLabelMultipleComponent, "ap-select-label-multiple", never, { "displayType": { "alias": "displayType"; "required": false; "isSignal": true; }; "tagColor": { "alias": "tagColor"; "required": false; "isSignal": true; }; "selectedItems": { "alias": "selectedItems"; "required": true; "isSignal": true; }; "bindLabel": { "alias": "bindLabel"; "required": false; "isSignal": true; }; "bindValue": { "alias": "bindValue"; "required": false; "isSignal": true; }; "bindAvatarUrl": { "alias": "bindAvatarUrl"; "required": false; "isSignal": true; }; "bindSymbolId": { "alias": "bindSymbolId"; "required": false; "isSignal": true; }; "roundedAvatar": { "alias": "roundedAvatar"; "required": false; "isSignal": true; }; "bindNetwork": { "alias": "bindNetwork"; "required": false; "isSignal": true; }; "bindTagColor": { "alias": "bindTagColor"; "required": false; "isSignal": true; }; }, { "removeItem": "removeItem"; }, never, never, true, never>;
210
212
  }
211
213
 
212
214
  /** Search input for an ng-select dropdown — place inside its `ng-header-tmp`. */