@bootkit/ng0 0.0.0-alpha.26 → 0.0.0-alpha.27

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,44 +1,42 @@
1
1
  import * as i0 from '@angular/core';
2
- import { signal, inject, DOCUMENT, DestroyRef, ElementRef, Renderer2, ChangeDetectorRef, input, model, booleanAttribute, effect, computed, TemplateRef, forwardRef, HostListener, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
- import * as i1 from '@angular/common';
2
+ import { signal, inject, ElementRef, Renderer2, ChangeDetectorRef, input, booleanAttribute, model, effect, untracked, computed, TemplateRef, forwardRef, HostListener, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
4
3
  import { CommonModule } from '@angular/common';
5
4
  import { dataSourceAttribute, DataRequest } from '@bootkit/ng0/data';
6
5
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
7
6
  import * as i2 from '@angular/cdk/overlay';
8
7
  import { Overlay, ViewportRuler, OverlayModule } from '@angular/cdk/overlay';
9
- import { defaultEqualityComparer, equalityComparerAttribute, defaultValueWriter, valueWriterAttribute, noopFilter, CssClassAttribute, sequentialIdGenerator, findValuesByComparer, findValueByComparer } from '@bootkit/ng0/common';
10
- import { LocalizationService, defaultObjectFormatter, objectFormatterAttribute } from '@bootkit/ng0/localization';
11
- import * as i3 from '@bootkit/ng0/components/list';
8
+ import { LocalizationService, defaultFormatter, objectFormatterAttribute } from '@bootkit/ng0/localization';
9
+ import * as i1 from '@bootkit/ng0/components/list';
12
10
  import { ListModule, ListComponent } from '@bootkit/ng0/components/list';
13
- import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
+ import { defaultEqualityComparer, equalityComparerAttribute, defaultValueWriter, valueWriterAttribute, defaultFilter, filterPredicateAttribute, CssClassAttribute, IdGeneratorAttribute } from '@bootkit/ng0/common';
14
12
 
15
13
  /**
16
14
  * Select component that allows users to choose an option from a dropdown list.
17
15
  */
18
16
  class SelectComponent {
19
- _resizeObserver;
20
- _resizeObserverInitialized = false;
17
+ // private _resizeObserver?: ResizeObserver;
21
18
  _viewpoerRulerSubscription;
22
19
  _filterElementRef;
23
20
  _listComponent;
24
21
  _changeCallback;
25
22
  _touchCallback;
26
- _options = signal([], ...(ngDevMode ? [{ debugName: "_options" }] : []));
23
+ _sourceItems = signal(undefined, ...(ngDevMode ? [{ debugName: "_sourceItems" }] : []));
24
+ _selectedItems = new Set();
27
25
  _isDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : []));
28
- // protected readonly _selectedOptionIndex = signal<number>(-1);
29
- _activeOptionIndex = signal(-1, ...(ngDevMode ? [{ debugName: "_activeOptionIndex" }] : []));
30
- _optionTemplate;
31
26
  _positionStrategy;
32
27
  _scrollStrategy;
33
28
  _overlay = inject(Overlay);
34
- _document = inject(DOCUMENT);
35
- _ls = inject(LocalizationService);
36
- _destroyRef = inject(DestroyRef);
37
- _el = inject((ElementRef));
29
+ _localizationService = inject(LocalizationService);
30
+ _elementRef = inject((ElementRef));
31
+ _filterValue = signal('', ...(ngDevMode ? [{ debugName: "_filterValue" }] : []));
38
32
  _renderer = inject(Renderer2);
39
33
  _viewportRuler = inject(ViewportRuler);
40
- _changeDetector = inject(ChangeDetectorRef);
41
- _activateSlectedItemEffectRef;
34
+ _changeDetectorRef = inject(ChangeDetectorRef);
35
+ _value = signal(undefined, ...(ngDevMode ? [{ debugName: "_value" }] : []));
36
+ /**
37
+ * Template for rendering each item in the select component.
38
+ */
39
+ itemTemplate;
42
40
  /**
43
41
  * The data source for the select component.
44
42
  * This can be an array of data, a function that returns an observable of data,
@@ -47,35 +45,37 @@ class SelectComponent {
47
45
  source = input.required(...(ngDevMode ? [{ debugName: "source", transform: v => dataSourceAttribute(v) }] : [{
48
46
  transform: v => dataSourceAttribute(v)
49
47
  }]));
50
- /**
51
- * Value of the select component.
52
- */
53
- value = model(undefined, ...(ngDevMode ? [{ debugName: "value" }] : []));
54
48
  /**
55
49
  * Indicates whether multi selection is enabled or not.
56
50
  */
57
51
  multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple", transform: booleanAttribute }] : [{
58
52
  transform: booleanAttribute
59
53
  }]));
54
+ /**
55
+ * Indicates whether to show selection indicator (checkbox/radio) next to each item.
56
+ * Default is false.
57
+ */
58
+ showSelectionIndicator = input(false, ...(ngDevMode ? [{ debugName: "showSelectionIndicator", transform: booleanAttribute }] : [{
59
+ transform: booleanAttribute
60
+ }]));
60
61
  /**
61
62
  * Indicates whether the dropdown is open or closed.
62
63
  */
63
64
  open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
64
65
  /**
65
- * A custom comparer function or the name of a field for comparing two objects.
66
+ * A comparer to compare items for selection.
66
67
  */
67
68
  compareBy = input(defaultEqualityComparer, ...(ngDevMode ? [{ debugName: "compareBy", transform: equalityComparerAttribute }] : [{
68
69
  transform: equalityComparerAttribute
69
70
  }]));
70
71
  /**
71
- * Custom format function to convert an item to a string for display.
72
- * Default converts the item to a string using its toString method.
72
+ * A fromatter to convert each item to a string for display.
73
73
  */
74
- formatBy = input(defaultObjectFormatter, ...(ngDevMode ? [{ debugName: "formatBy", transform: objectFormatterAttribute(this._ls.get()) }] : [{
75
- transform: objectFormatterAttribute(this._ls.get())
74
+ formatBy = input(defaultFormatter, ...(ngDevMode ? [{ debugName: "formatBy", transform: objectFormatterAttribute(this._localizationService.get()) }] : [{
75
+ transform: objectFormatterAttribute(this._localizationService.get())
76
76
  }]));
77
77
  /**
78
- * Custom value writer function to extract the value of any object while writing values.
78
+ * Custom value writer to extract the value of any object while writing values.
79
79
  */
80
80
  writeBy = input(defaultValueWriter, ...(ngDevMode ? [{ debugName: "writeBy", transform: valueWriterAttribute }] : [{
81
81
  transform: valueWriterAttribute
@@ -84,58 +84,106 @@ class SelectComponent {
84
84
  * Indicates whether the select component is filterable.
85
85
  */
86
86
  filterable = input(false, ...(ngDevMode ? [{ debugName: "filterable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
87
- /**
88
- * Placeholder text for the filter input field.
89
- */
90
- filterPlaceholder = input('', ...(ngDevMode ? [{ debugName: "filterPlaceholder" }] : []));
91
87
  /**
92
88
  * Custom filter function to filter items based on a filter value.
93
89
  * Default checks if the item contains the filter value (case-insensitive).
94
90
  */
95
- filterBy = input(noopFilter, ...(ngDevMode ? [{ debugName: "filterBy" }] : []));
91
+ filterBy = input(defaultFilter, ...(ngDevMode ? [{ debugName: "filterBy", transform: filterPredicateAttribute }] : [{
92
+ transform: filterPredicateAttribute
93
+ }]));
94
+ /**
95
+ * Placeholder text for the filter input field.
96
+ */
97
+ filterPlaceholder = input(undefined, ...(ngDevMode ? [{ debugName: "filterPlaceholder" }] : []));
96
98
  /**
97
99
  * CSS class or classes to apply to the items.
98
100
  */
99
- itemClass = input((item) => undefined, ...(ngDevMode ? [{ debugName: "itemClass", transform: CssClassAttribute }] : [{
101
+ itemClass = input(undefined, ...(ngDevMode ? [{ debugName: "itemClass", transform: CssClassAttribute }] : [{
100
102
  transform: CssClassAttribute
101
103
  }]));
102
104
  /**
103
- * Custom id generator function to generate unique ids for each item.
104
- * Default generates sequential ids with the prefix 'ng0-select-item-'.
105
- * If set to undefined, no ids will be generated.
105
+ * A function that generates unique ids for each item in the list.
106
+ * If set to a function, it will be called with the item as an argument to generate the id.
107
+ * If set to undefined, no ids will be generated for the items.
108
+ * @default undefined
106
109
  */
107
- idGenerator = input(sequentialIdGenerator('ng0-select-item-'), ...(ngDevMode ? [{ debugName: "idGenerator" }] : []));
110
+ idGenerator = input(undefined, ...(ngDevMode ? [{ debugName: "idGenerator", transform: IdGeneratorAttribute }] : [{
111
+ transform: IdGeneratorAttribute
112
+ }]));
108
113
  constructor() {
109
- this._renderer.addClass(this._el.nativeElement, 'form-select');
110
- this._renderer.setAttribute(this._el.nativeElement, 'tabindex', '0');
114
+ ['ng0-select', 'form-select'].forEach(c => this._renderer.addClass(this._elementRef.nativeElement, c));
111
115
  this._scrollStrategy = this._overlay.scrollStrategies.block();
112
116
  effect(() => {
113
- var value = this.value(); // track value
114
- this._changeCallback?.(value);
117
+ let source = this.source();
118
+ source.load(new DataRequest()).subscribe(res => {
119
+ untracked(() => {
120
+ this._sourceItems.set(res.data);
121
+ this._findAndSelectItems();
122
+ this._changeDetectorRef.markForCheck();
123
+ });
124
+ });
115
125
  });
116
- effect(() => {
117
- var value = this.open(); // track value
118
- });
119
- this._activateSlectedItemEffectRef = effect(() => {
120
- var value = this.value(); // track value
121
- var options = this._options(); // track options
122
- if (!this.multiple() && this._activeOptionIndex() == -1 && options.length > 0) {
123
- let index = options.findIndex(x => this.compareBy()(x, this.value()));
124
- if (index > -1) {
125
- this._activeOptionIndex.set(index);
126
- this._activateSlectedItemEffectRef.destroy();
127
- }
126
+ }
127
+ /**
128
+ * Indicates whether the given value is selected.
129
+ * @param item
130
+ * @returns
131
+ */
132
+ isSelected(value) {
133
+ return this._selectedItems.has(value);
134
+ }
135
+ /**
136
+ * Selects the given value.
137
+ * @param item
138
+ */
139
+ select(value) {
140
+ if (this.multiple()) {
141
+ if (!this._selectedItems.has(value)) {
142
+ this._selectedItems.add(value);
143
+ this._updateValue();
144
+ this._changeCallback?.(this._value());
128
145
  }
129
- }, ...(ngDevMode ? [{ debugName: "_activateSlectedItemEffectRef" }] : []));
146
+ }
147
+ else {
148
+ this._selectedItems.clear();
149
+ this._selectedItems.add(value);
150
+ this._updateValue();
151
+ this._changeCallback?.(this._value());
152
+ }
130
153
  }
131
- ngOnInit() {
132
- this.source().load(new DataRequest()).pipe(takeUntilDestroyed(this._destroyRef)).subscribe(res => {
133
- this._options.set(res.data);
134
- this._changeDetector.markForCheck();
135
- });
154
+ /**
155
+ * Deselects the given value.
156
+ * @param item
157
+ */
158
+ deselect(value) {
159
+ this._selectedItems.delete(value);
160
+ this._updateValue();
161
+ this._changeCallback?.(this._value());
162
+ }
163
+ /**
164
+ * Toggles the selection state of the given value.
165
+ * @param item
166
+ */
167
+ toggle(value) {
168
+ if (this.isSelected(value)) {
169
+ this.deselect(value);
170
+ }
171
+ else {
172
+ this.select(value);
173
+ }
136
174
  }
137
175
  writeValue(obj) {
138
- this.value.set(obj);
176
+ if (this.multiple()) {
177
+ if (obj === null || obj === undefined) {
178
+ obj = [];
179
+ }
180
+ else if (!Array.isArray(obj)) {
181
+ throw Error('invalid value. Expected an array in multiple selection mode.');
182
+ }
183
+ }
184
+ this._value.set(obj);
185
+ this._findAndSelectItems();
186
+ this._changeDetectorRef.markForCheck();
139
187
  }
140
188
  registerOnChange(fn) {
141
189
  this._changeCallback = fn;
@@ -146,13 +194,48 @@ class SelectComponent {
146
194
  setDisabledState(isDisabled) {
147
195
  this._isDisabled.set(isDisabled);
148
196
  }
149
- _onFilterBlur() {
150
- // use setTimeout to allow next element receives the focus.
151
- // setTimeout(() => {
152
- // if (!this._el.nativeElement.matches(':focus')) {
153
- // this.open.set(false);
154
- // }
155
- // }, 0);
197
+ _findAndSelectItems() {
198
+ let value = this._value();
199
+ let compareBy = this.compareBy();
200
+ let sourceItems = this._sourceItems();
201
+ if (sourceItems == undefined) {
202
+ return;
203
+ }
204
+ let findAndSelect = (v) => {
205
+ let index = sourceItems.findIndex(sourceItem => compareBy(sourceItem, v));
206
+ if (index > -1) {
207
+ let item = sourceItems.at(index);
208
+ this._selectedItems.add(item);
209
+ }
210
+ };
211
+ if (this.multiple()) {
212
+ if (Array.isArray(value)) {
213
+ value.forEach(v => findAndSelect(v));
214
+ }
215
+ }
216
+ else {
217
+ findAndSelect(value);
218
+ }
219
+ }
220
+ _updateValue() {
221
+ let value;
222
+ if (this.multiple()) {
223
+ let values = [];
224
+ this._selectedItems.forEach(v => {
225
+ values.push(this.writeBy()(v));
226
+ });
227
+ value = values;
228
+ }
229
+ else {
230
+ if (this._selectedItems.size > 0) {
231
+ let first = this._selectedItems.values().next().value;
232
+ value = this.writeBy()(first);
233
+ }
234
+ else {
235
+ value = undefined;
236
+ }
237
+ }
238
+ this._value.set(value);
156
239
  }
157
240
  _onOverlayAttach() {
158
241
  this._listenToResizeEvents();
@@ -160,6 +243,7 @@ class SelectComponent {
160
243
  if (this.filterable()) {
161
244
  this._filterElementRef?.nativeElement.focus();
162
245
  }
246
+ this._listComponent.writeValue(this._value());
163
247
  // if (this._activeOptionIndex() > -1) {
164
248
  // this._listComponent?.active(this._activeOptionIndex());
165
249
  // }
@@ -167,161 +251,144 @@ class SelectComponent {
167
251
  }
168
252
  _onOverlayDetach() {
169
253
  this._unlistenFromResizeEvents();
170
- this._el.nativeElement.focus();
254
+ this._elementRef.nativeElement.focus();
255
+ this._filterValue.set('');
171
256
  this.open.set(false);
172
257
  }
173
258
  _onListSelectionChange(e) {
259
+ let value = e.item.value();
260
+ if (this.multiple()) {
261
+ this.toggle(value);
262
+ }
263
+ else {
264
+ this.select(value);
265
+ }
266
+ // this.selectionChange.emit({ item: item, list: this });
267
+ this._changeDetectorRef.detectChanges();
174
268
  if (!this.multiple()) {
175
- // this._activeOptionIndex.set(e.index);
176
269
  this.open.set(false);
177
270
  }
178
271
  }
179
- // Find the value in options using the comparer function
180
- _mappedValue = computed(() => {
181
- return this.multiple() ?
182
- findValuesByComparer(this._options(), this.value(), this.compareBy()) :
183
- findValueByComparer(this._options(), this.value(), this.compareBy());
184
- }, ...(ngDevMode ? [{ debugName: "_mappedValue" }] : []));
272
+ _filterPredicate = computed(() => {
273
+ let filterValue = this._filterValue();
274
+ let filterBy = this.filterBy();
275
+ return (item) => filterBy(item, filterValue);
276
+ }, ...(ngDevMode ? [{ debugName: "_filterPredicate" }] : []));
277
+ _onFilterKeydown(e) {
278
+ let keys = ['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End'];
279
+ if (e.key === 'Tab') {
280
+ e.preventDefault();
281
+ this.open.set(false);
282
+ }
283
+ if (keys.includes(e.key)) {
284
+ e.preventDefault();
285
+ const newEvent = new KeyboardEvent(e.type, e);
286
+ this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);
287
+ }
288
+ }
185
289
  _listenToResizeEvents() {
186
290
  this._viewportRuler.change().subscribe(x => {
187
291
  this.open.set(false);
188
292
  });
189
- this._resizeObserver = new ResizeObserver(e => {
190
- // Sterategy 1: close overlay
191
- if (!this._resizeObserverInitialized) {
192
- this._resizeObserverInitialized = true;
193
- return;
194
- }
195
- else {
196
- this.open.set(false);
197
- this._resizeObserver?.disconnect();
198
- }
199
- // Sterategy 2: update overlay size
200
- // const width = (e[0].target as HTMLDivElement).offsetWidth;
201
- // this._connectedOverlay.overlayRef.updateSize({ width });
202
- });
203
- this._resizeObserver.observe(this._el.nativeElement);
293
+ // this._resizeObserver = new ResizeObserver(e => {
294
+ // // update overlay size
295
+ // // const width = (e[0].target as HTMLDivElement).offsetWidth;
296
+ // // this._connectedOverlay.overlayRef.updateSize({ width });
297
+ // });
298
+ // this._resizeObserver.observe(this._elementRef.nativeElement);
204
299
  }
205
300
  _unlistenFromResizeEvents() {
206
301
  this._viewpoerRulerSubscription?.unsubscribe();
207
302
  this._viewpoerRulerSubscription = undefined;
208
- this._resizeObserver?.disconnect();
209
- this._resizeObserver = undefined;
210
- this._resizeObserverInitialized = false;
211
- }
212
- _selectFirst() {
213
- let optionsCount = this._options().length;
214
- if (optionsCount > 0) {
215
- this._activeOptionIndex.set(0);
216
- let value = this.writeBy()(this._options()[this._activeOptionIndex()]);
217
- this.value.set(value);
218
- }
219
- }
220
- _selectLast() {
221
- let optionsCount = this._options().length;
222
- if (optionsCount > 0) {
223
- this._activeOptionIndex.set(optionsCount - 1);
224
- let value = this.writeBy()(this._options()[this._activeOptionIndex()]);
225
- this.value.set(value);
226
- }
227
- }
228
- _selectNext() {
229
- let optionsCount = this._options().length;
230
- if (this._activeOptionIndex() < optionsCount - 1) {
231
- this._activeOptionIndex.update(x => x + 1);
232
- let value = this.writeBy()(this._options()[this._activeOptionIndex()]);
233
- this.value.set(value);
234
- }
235
- }
236
- _selectPrevious() {
237
- // let optionsCount = this._options().length;
238
- if (this._activeOptionIndex() > 0) {
239
- this._activeOptionIndex.update(x => x - 1);
240
- let value = this.writeBy()(this._options()[this._activeOptionIndex()]);
241
- this.value.set(value);
242
- }
303
+ // this._resizeObserver?.disconnect();
304
+ // this._resizeObserver = undefined;
243
305
  }
244
306
  _onHostKeydown(e) {
245
- if (this._isDisabled())
246
- return;
247
- let optionsCount = this._options().length;
248
- if (optionsCount == 0) {
307
+ let sourceItems = this._sourceItems();
308
+ let itemsCount = sourceItems?.length || 0;
309
+ if (this._isDisabled() || !sourceItems || itemsCount === 0) {
249
310
  return;
250
311
  }
251
312
  if (this.open()) {
252
313
  const newEvent = new KeyboardEvent(e.type, e);
253
314
  this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);
315
+ return;
316
+ }
317
+ let selectedItemindex;
318
+ if (this._selectedItems.size == 0) {
319
+ selectedItemindex = -1;
254
320
  }
255
321
  else {
256
- switch (e.key) {
257
- case 'ArrowDown':
258
- if (this.multiple())
259
- return;
260
- this._selectNext();
261
- e.preventDefault();
262
- break;
263
- case 'ArrowUp':
264
- if (this.multiple())
265
- return;
266
- this._selectPrevious();
267
- e.preventDefault();
268
- break;
269
- case 'Enter':
270
- this.open.set(!this.open());
271
- // e.preventDefault();
272
- break;
273
- case 'Home':
274
- if (this.multiple())
275
- return;
276
- this._selectFirst();
277
- e.preventDefault();
278
- break;
279
- case 'End':
280
- if (this.multiple())
281
- return;
282
- this._selectLast();
283
- e.preventDefault();
284
- break;
285
- }
322
+ let firstValue = this._selectedItems.values().next().value;
323
+ selectedItemindex = sourceItems.findIndex(i => i === firstValue);
324
+ }
325
+ switch (e.key) {
326
+ case 'ArrowDown':
327
+ if (selectedItemindex < itemsCount - 1) {
328
+ this.select(sourceItems[selectedItemindex + 1]);
329
+ }
330
+ e.preventDefault();
331
+ break;
332
+ case 'ArrowUp':
333
+ if (selectedItemindex > 0) {
334
+ this.select(sourceItems[selectedItemindex - 1]);
335
+ }
336
+ e.preventDefault();
337
+ break;
338
+ case 'Enter':
339
+ this.open.set(true);
340
+ e.preventDefault();
341
+ break;
342
+ case 'Home':
343
+ if (itemsCount > 0) {
344
+ this.select(sourceItems[0]);
345
+ }
346
+ e.preventDefault();
347
+ break;
348
+ case 'End':
349
+ if (itemsCount > 0) {
350
+ this.select(sourceItems[itemsCount - 1]);
351
+ }
352
+ e.preventDefault();
353
+ break;
286
354
  }
355
+ this._changeDetectorRef.markForCheck();
287
356
  }
288
357
  _onHostClick(e) {
289
- if (!this._isDisabled()) {
290
- this.open.update(x => !x);
291
- // this._onTouchedCallback?.(this._selectedValue());
358
+ if (this._isDisabled() || this.source().isLoading()) {
359
+ return;
292
360
  }
361
+ this.open.update(x => !x);
362
+ this._touchCallback?.();
293
363
  }
294
364
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
295
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: SelectComponent, isStandalone: true, selector: "ng0-select", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: true, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, compareBy: { classPropertyName: "compareBy", publicName: "compareBy", isSignal: true, isRequired: false, transformFunction: null }, formatBy: { classPropertyName: "formatBy", publicName: "formatBy", isSignal: true, isRequired: false, transformFunction: null }, writeBy: { classPropertyName: "writeBy", publicName: "writeBy", isSignal: true, isRequired: false, transformFunction: null }, filterable: { classPropertyName: "filterable", publicName: "filterable", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, idGenerator: { classPropertyName: "idGenerator", publicName: "idGenerator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", open: "openChange" }, host: { listeners: { "keydown": "_onHostKeydown($event)", "click": "_onHostClick($event)" }, properties: { "class.ng0-select-open": "open()", "class.ng0-select-loading": "source().isLoading()", "attr.aria-activedescendant": "_activeOptionIndex() > -1 ? (_options()[_activeOptionIndex()].id) : undefined", "attr.disabled": "_isDisabled()", "attr.aria-disabled": "_isDisabled()" } }, providers: [{
365
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.2.1", type: SelectComponent, isStandalone: true, selector: "ng0-select", inputs: { source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: true, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, showSelectionIndicator: { classPropertyName: "showSelectionIndicator", publicName: "showSelectionIndicator", isSignal: true, isRequired: false, transformFunction: null }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, compareBy: { classPropertyName: "compareBy", publicName: "compareBy", isSignal: true, isRequired: false, transformFunction: null }, formatBy: { classPropertyName: "formatBy", publicName: "formatBy", isSignal: true, isRequired: false, transformFunction: null }, writeBy: { classPropertyName: "writeBy", publicName: "writeBy", isSignal: true, isRequired: false, transformFunction: null }, filterable: { classPropertyName: "filterable", publicName: "filterable", isSignal: true, isRequired: false, transformFunction: null }, filterBy: { classPropertyName: "filterBy", publicName: "filterBy", isSignal: true, isRequired: false, transformFunction: null }, filterPlaceholder: { classPropertyName: "filterPlaceholder", publicName: "filterPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, itemClass: { classPropertyName: "itemClass", publicName: "itemClass", isSignal: true, isRequired: false, transformFunction: null }, idGenerator: { classPropertyName: "idGenerator", publicName: "idGenerator", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { open: "openChange" }, host: { listeners: { "keydown": "_onHostKeydown($event)", "click": "_onHostClick($event)" }, properties: { "class.ng0-select-open": "open()", "class.ng0-select-filterable": "filterable()", "class.ng0-select-loading": "source().isLoading()", "attr.disabled": "_isDisabled() ? \"\" : undefined", "attr.aria-disabled": "_isDisabled() ? \"\" : undefined", "attr.tabindex": "_isDisabled() ? undefined : 0" } }, providers: [{
296
366
  provide: NG_VALUE_ACCESSOR,
297
367
  useExisting: forwardRef(() => SelectComponent),
298
368
  multi: true
299
- }], queries: [{ propertyName: "_optionTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_filterElementRef", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "_listComponent", first: true, predicate: ListComponent, descendants: true }], exportAs: ["ng0Select"], ngImport: i0, template: "@let formattedValue = formatBy()(_mappedValue());\r\n\r\n@if(formattedValue == null || formattedValue == '') {\r\n&nbsp;\r\n}@else {\r\n{{formattedValue}}\r\n}\r\n\r\n@if(source().isLoading()) {\r\n<div class=\"spinner-border text-success spinner-border-sm ng0-select-spinner\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n</div>\r\n}\r\n\r\n<ng-template cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"_el.nativeElement\"\r\n [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\r\n [cdkConnectedOverlayOpen]=\"open()\"\r\n [cdkConnectedOverlayPush]=\"false\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\r\n [cdkConnectedOverlayPanelClass]=\"['ng0-select-dropdown-container', 'shadow']\"\r\n [cdkConnectedOverlayWidth]=\"_el.nativeElement.clientWidth\"\r\n (overlayOutsideClick)=\"open.set(false)\"\r\n (attach)=\"_onOverlayAttach()\"\r\n (detach)=\"_onOverlayDetach()\">\r\n\r\n @if(filterable()) {\r\n <div class=\"ng0-select-filter-container border-bottom\">\r\n <input #filterInput\r\n type=\"text\"\r\n class=\"ng0-select-filter-input form-control form-control-sm\"\r\n [attr.placeholder]=\"filterPlaceholder()\"\r\n (blur)=\"_onFilterBlur()\"\r\n >\r\n </div>\r\n }\r\n\r\n <ng0-list #list\r\n [source]=\"source()\"\r\n [multiple]=\"multiple()\"\r\n [idGenerator]=\"idGenerator()\"\r\n [filterBy]=\"filterBy()\"\r\n [compareBy]=\"compareBy()\"\r\n focus=\"none\"\r\n style=\"border: none; border-radius: 0;\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\r\n (click)=\"open.set(false)\"\r\n (selectionChange)=\"_onListSelectionChange($event)\">\r\n\r\n <ng-template let-option>\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n }@else {\r\n {{formatBy()(option.value)}}\r\n }\r\n </ng-template>\r\n\r\n </ng0-list>\r\n</ng-template>", styles: ["ng0-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;display:flex!important;align-items:center}ng0-select.disabled{background-color:var(--bs-secondary-bg)}.ng0-select-dropdown-container{display:flex;flex-direction:column;background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);padding:.5rem var(--bs-dropdown-padding-x);--ng0-select-item-padding-x: 1rem;--ng0-select-item-padding-y: .25rem}.ng0-select-dropdown-container ul.ng0-select-dropdown{list-style:none;border-start-start-radius:0;border-start-end-radius:0;padding:0!important;margin:0;flex-grow:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.4) transparent}.ng0-select-dropdown-container ul.ng0-select-dropdown.is-open{border-top:none}.ng0-select-dropdown-container ul.ng0-select-dropdown li{overflow:hidden;cursor:pointer;padding:var(--ng0-select-item-padding-y) var(--ng0-select-item-padding-x)}.ng0-select-dropdown-container ul.ng0-select-dropdown li:hover{background-color:var(--bs-tertiary-bg)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-selected{background-color:var(--bs-primary);color:var(--bs-light)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-active:not(.ng0-select-option-selected){background-color:var(--bs-gray-300);color:var(--bs-body)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-filtered{display:none!important}.ng0-select-dropdown-container .ng0-select-filter-container{padding:.5rem var(--ng0-select-item-padding-x);background-color:inherit}.ng0-select-dropdown-container .ng0-select-filter-container .ng0-select-filter-input{width:100%}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i3.ListComponent, selector: "ng0-list", inputs: ["source", "multiple", "showSelectionIndicator", "compareBy", "formatBy", "writeBy", "filterBy", "trackBy", "itemClass", "focus", "idGenerator"], outputs: ["selectionChange"], exportAs: ["ng0List"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
369
+ }], queries: [{ propertyName: "itemTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_filterElementRef", first: true, predicate: ["filterInput"], descendants: true }, { propertyName: "_listComponent", first: true, predicate: ListComponent, descendants: true }], exportAs: ["ng0Select"], ngImport: i0, template: "@if(multiple()) {\r\n\r\n@for(item of _selectedItems.values(); track $index; let last=$last) {\r\n{{formatBy()(item)}}@if(!last) {,}\r\n}\r\n\r\n} @else {\r\n@if(_selectedItems.size > 0) {\r\n{{formatBy()(_selectedItems.values().next().value)}}\r\n}\r\n}\r\n\r\n@if(source().isLoading()) {\r\n<div class=\"spinner-grow text-secondary spinner-grow-sm ng0-select-spinner\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n</div>\r\n\r\n&nbsp; <!-- This space is required to prevent layout shift after loading indicator hides. -->\r\n}\r\n\r\n<ng-template cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"_elementRef.nativeElement\"\r\n [cdkConnectedOverlayOpen]=\"open()\"\r\n [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\r\n [cdkConnectedOverlayPush]=\"false\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\r\n [cdkConnectedOverlayPanelClass]=\"['ng0-select-dropdown']\"\r\n [cdkConnectedOverlayWidth]=\"_elementRef.nativeElement.clientWidth\"\r\n (overlayOutsideClick)=\"this.open.set(false)\"\r\n (attach)=\"_onOverlayAttach();\"\r\n (detach)=\"_onOverlayDetach()\">\r\n\r\n @if(filterable()) {\r\n <div class=\"ng0-select-filter-container\">\r\n <input #filterInput\r\n type=\"text\"\r\n class=\"ng0-select-filter-input\"\r\n [attr.placeholder]=\"filterPlaceholder()\"\r\n (input)=\"_filterValue.set($event.target.value)\"\r\n (keydown)=\"_onFilterKeydown($event)\">\r\n </div>\r\n }\r\n\r\n <ng0-select-list #list\r\n [source]=\"_sourceItems()\"\r\n [multiple]=\"multiple()\"\r\n [formatBy]=\"formatBy()\"\r\n [compareBy]=\"compareBy()\"\r\n [itemClass]=\"itemClass()\"\r\n [showSelectionIndicator]=\"showSelectionIndicator()\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [filterBy]=\"_filterPredicate()\"\r\n focusMode=\"none\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\r\n (selectionChange)=\"_onListSelectionChange($event)\">\r\n </ng0-select-list>\r\n</ng-template>", styles: ["ng0-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;display:flex!important;align-items:center}ng0-select[disabled],ng0-select.disabled{opacity:.5;pointer-events:none}ng0-select:empty:before{content:\" \";white-space:pre}ng0-select:focus,ng0-select:focus-visible,ng0-select.ng0-select-open.ng0-select-filterable{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.ng0-select-dropdown{display:flex;flex-direction:column;background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow-y:auto;margin:var(--bs-focus-ring-width, 0) 0}.ng0-select-filter-container{padding:.5rem;background-color:inherit}.ng0-select-filter-container .ng0-select-filter-input{width:100%;border:1px solid var(--bs-border-color);border-radius:.2rem;padding:.25rem}.ng0-select-filter-container .ng0-select-filter-input:focus,.ng0-select-filter-container .ng0-select-filter-input:focus-visible{outline:0}ng0-select-list{flex-grow:1;overflow-y:auto}ng0-select-list ng0-list-item{padding:.5rem;display:flex}ng0-select-list ng0-list-item.selected{background-color:var(--bs-primary);color:var(--bs-light)}ng0-select-list ng0-list-item.active:not(.selected){background-color:color-mix(in srgb,var(--bs-primary),white 85%)}ng0-select-list ng0-list-item:hover:not(.selected):not(.disabled):not(.active){background-color:color-mix(in srgb,var(--bs-primary),white 95%)}ng0-select-list ng0-list-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}ng0-select-list ng0-list-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}ng0-select-list ng0-list-item .ng0-selection-indicator{margin-inline-end:.5rem}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ListModule }, { kind: "component", type: i1.ListComponent, selector: "ng0-list, ng0-select-list", inputs: ["source", "multiple", "showSelectionIndicator", "compareBy", "formatBy", "writeBy", "filterBy", "trackBy", "itemClass", "focusMode", "idGenerator", "itemTemplate"], outputs: ["selectionChange"], exportAs: ["ng0List"] }, { kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i2.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
300
370
  }
301
371
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, decorators: [{
302
372
  type: Component,
303
- args: [{ selector: 'ng0-select', exportAs: 'ng0Select', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
304
- CommonModule,
305
- OverlayModule,
306
- ListModule,
307
- ], providers: [{
373
+ args: [{ selector: 'ng0-select', exportAs: 'ng0Select', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, ListModule, OverlayModule], providers: [{
308
374
  provide: NG_VALUE_ACCESSOR,
309
375
  useExisting: forwardRef(() => SelectComponent),
310
376
  multi: true
311
377
  }], host: {
312
378
  '[class.ng0-select-open]': 'open()',
379
+ '[class.ng0-select-filterable]': 'filterable()',
313
380
  '[class.ng0-select-loading]': 'source().isLoading()',
314
- '[attr.aria-activedescendant]': '_activeOptionIndex() > -1 ? (_options()[_activeOptionIndex()].id) : undefined',
315
- '[attr.disabled]': '_isDisabled()',
316
- '[attr.aria-disabled]': '_isDisabled()'
317
- }, template: "@let formattedValue = formatBy()(_mappedValue());\r\n\r\n@if(formattedValue == null || formattedValue == '') {\r\n&nbsp;\r\n}@else {\r\n{{formattedValue}}\r\n}\r\n\r\n@if(source().isLoading()) {\r\n<div class=\"spinner-border text-success spinner-border-sm ng0-select-spinner\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n</div>\r\n}\r\n\r\n<ng-template cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"_el.nativeElement\"\r\n [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\r\n [cdkConnectedOverlayOpen]=\"open()\"\r\n [cdkConnectedOverlayPush]=\"false\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\r\n [cdkConnectedOverlayPanelClass]=\"['ng0-select-dropdown-container', 'shadow']\"\r\n [cdkConnectedOverlayWidth]=\"_el.nativeElement.clientWidth\"\r\n (overlayOutsideClick)=\"open.set(false)\"\r\n (attach)=\"_onOverlayAttach()\"\r\n (detach)=\"_onOverlayDetach()\">\r\n\r\n @if(filterable()) {\r\n <div class=\"ng0-select-filter-container border-bottom\">\r\n <input #filterInput\r\n type=\"text\"\r\n class=\"ng0-select-filter-input form-control form-control-sm\"\r\n [attr.placeholder]=\"filterPlaceholder()\"\r\n (blur)=\"_onFilterBlur()\"\r\n >\r\n </div>\r\n }\r\n\r\n <ng0-list #list\r\n [source]=\"source()\"\r\n [multiple]=\"multiple()\"\r\n [idGenerator]=\"idGenerator()\"\r\n [filterBy]=\"filterBy()\"\r\n [compareBy]=\"compareBy()\"\r\n focus=\"none\"\r\n style=\"border: none; border-radius: 0;\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\r\n (click)=\"open.set(false)\"\r\n (selectionChange)=\"_onListSelectionChange($event)\">\r\n\r\n <ng-template let-option>\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n }@else {\r\n {{formatBy()(option.value)}}\r\n }\r\n </ng-template>\r\n\r\n </ng0-list>\r\n</ng-template>", styles: ["ng0-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;display:flex!important;align-items:center}ng0-select.disabled{background-color:var(--bs-secondary-bg)}.ng0-select-dropdown-container{display:flex;flex-direction:column;background-color:var(--bs-body-bg);border-radius:var(--bs-border-radius);padding:.5rem var(--bs-dropdown-padding-x);--ng0-select-item-padding-x: 1rem;--ng0-select-item-padding-y: .25rem}.ng0-select-dropdown-container ul.ng0-select-dropdown{list-style:none;border-start-start-radius:0;border-start-end-radius:0;padding:0!important;margin:0;flex-grow:1;overflow-y:auto;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.4) transparent}.ng0-select-dropdown-container ul.ng0-select-dropdown.is-open{border-top:none}.ng0-select-dropdown-container ul.ng0-select-dropdown li{overflow:hidden;cursor:pointer;padding:var(--ng0-select-item-padding-y) var(--ng0-select-item-padding-x)}.ng0-select-dropdown-container ul.ng0-select-dropdown li:hover{background-color:var(--bs-tertiary-bg)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-selected{background-color:var(--bs-primary);color:var(--bs-light)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-active:not(.ng0-select-option-selected){background-color:var(--bs-gray-300);color:var(--bs-body)}.ng0-select-dropdown-container ul.ng0-select-dropdown li.ng0-select-option-filtered{display:none!important}.ng0-select-dropdown-container .ng0-select-filter-container{padding:.5rem var(--ng0-select-item-padding-x);background-color:inherit}.ng0-select-dropdown-container .ng0-select-filter-container .ng0-select-filter-input{width:100%}\n"] }]
381
+ '[attr.disabled]': '_isDisabled() ? "" : undefined',
382
+ '[attr.aria-disabled]': '_isDisabled() ? "" : undefined',
383
+ '[attr.tabindex]': '_isDisabled() ? undefined : 0',
384
+ }, template: "@if(multiple()) {\r\n\r\n@for(item of _selectedItems.values(); track $index; let last=$last) {\r\n{{formatBy()(item)}}@if(!last) {,}\r\n}\r\n\r\n} @else {\r\n@if(_selectedItems.size > 0) {\r\n{{formatBy()(_selectedItems.values().next().value)}}\r\n}\r\n}\r\n\r\n@if(source().isLoading()) {\r\n<div class=\"spinner-grow text-secondary spinner-grow-sm ng0-select-spinner\" role=\"status\">\r\n <span class=\"visually-hidden\">Loading...</span>\r\n</div>\r\n\r\n&nbsp; <!-- This space is required to prevent layout shift after loading indicator hides. -->\r\n}\r\n\r\n<ng-template cdkConnectedOverlay\r\n [cdkConnectedOverlayOrigin]=\"_elementRef.nativeElement\"\r\n [cdkConnectedOverlayOpen]=\"open()\"\r\n [cdkConnectedOverlayScrollStrategy]=\"_scrollStrategy\"\r\n [cdkConnectedOverlayPush]=\"false\"\r\n [cdkConnectedOverlayFlexibleDimensions]=\"true\"\r\n [cdkConnectedOverlayPanelClass]=\"['ng0-select-dropdown']\"\r\n [cdkConnectedOverlayWidth]=\"_elementRef.nativeElement.clientWidth\"\r\n (overlayOutsideClick)=\"this.open.set(false)\"\r\n (attach)=\"_onOverlayAttach();\"\r\n (detach)=\"_onOverlayDetach()\">\r\n\r\n @if(filterable()) {\r\n <div class=\"ng0-select-filter-container\">\r\n <input #filterInput\r\n type=\"text\"\r\n class=\"ng0-select-filter-input\"\r\n [attr.placeholder]=\"filterPlaceholder()\"\r\n (input)=\"_filterValue.set($event.target.value)\"\r\n (keydown)=\"_onFilterKeydown($event)\">\r\n </div>\r\n }\r\n\r\n <ng0-select-list #list\r\n [source]=\"_sourceItems()\"\r\n [multiple]=\"multiple()\"\r\n [formatBy]=\"formatBy()\"\r\n [compareBy]=\"compareBy()\"\r\n [itemClass]=\"itemClass()\"\r\n [showSelectionIndicator]=\"showSelectionIndicator()\"\r\n [itemTemplate]=\"itemTemplate\"\r\n [filterBy]=\"_filterPredicate()\"\r\n focusMode=\"none\"\r\n (mousedown)=\"$event.preventDefault(); $event.stopImmediatePropagation()\"\r\n (selectionChange)=\"_onListSelectionChange($event)\">\r\n </ng0-select-list>\r\n</ng-template>", styles: ["ng0-select{user-select:none;-webkit-user-select:none;-moz-user-select:none;display:flex!important;align-items:center}ng0-select[disabled],ng0-select.disabled{opacity:.5;pointer-events:none}ng0-select:empty:before{content:\" \";white-space:pre}ng0-select:focus,ng0-select:focus-visible,ng0-select.ng0-select-open.ng0-select-filterable{outline:0;box-shadow:var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color)}.ng0-select-dropdown{display:flex;flex-direction:column;background-color:var(--bs-body-bg);border:1px solid var(--bs-border-color);border-radius:var(--bs-border-radius);overflow-y:auto;margin:var(--bs-focus-ring-width, 0) 0}.ng0-select-filter-container{padding:.5rem;background-color:inherit}.ng0-select-filter-container .ng0-select-filter-input{width:100%;border:1px solid var(--bs-border-color);border-radius:.2rem;padding:.25rem}.ng0-select-filter-container .ng0-select-filter-input:focus,.ng0-select-filter-container .ng0-select-filter-input:focus-visible{outline:0}ng0-select-list{flex-grow:1;overflow-y:auto}ng0-select-list ng0-list-item{padding:.5rem;display:flex}ng0-select-list ng0-list-item.selected{background-color:var(--bs-primary);color:var(--bs-light)}ng0-select-list ng0-list-item.active:not(.selected){background-color:color-mix(in srgb,var(--bs-primary),white 85%)}ng0-select-list ng0-list-item:hover:not(.selected):not(.disabled):not(.active){background-color:color-mix(in srgb,var(--bs-primary),white 95%)}ng0-select-list ng0-list-item:first-child{border-top-left-radius:inherit;border-top-right-radius:inherit}ng0-select-list ng0-list-item:last-child{border-bottom-left-radius:inherit;border-bottom-right-radius:inherit}ng0-select-list ng0-list-item .ng0-selection-indicator{margin-inline-end:.5rem}\n"] }]
318
385
  }], ctorParameters: () => [], propDecorators: { _filterElementRef: [{
319
386
  type: ViewChild,
320
387
  args: ['filterInput']
321
388
  }], _listComponent: [{
322
389
  type: ViewChild,
323
390
  args: [ListComponent]
324
- }], _optionTemplate: [{
391
+ }], itemTemplate: [{
325
392
  type: ContentChild,
326
393
  args: [TemplateRef]
327
394
  }], _onHostKeydown: [{