@bootkit/ng0 0.0.0-alpha.20 → 0.0.0-alpha.21

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,31 +1,25 @@
1
1
  import * as i0 from '@angular/core';
2
- import { inject, DOCUMENT, ChangeDetectorRef, signal, input, model, booleanAttribute, TemplateRef, forwardRef, HostListener, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
2
+ import { signal, inject, DOCUMENT, DestroyRef, ElementRef, Renderer2, ChangeDetectorRef, input, booleanAttribute, model, TemplateRef, forwardRef, HostListener, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
3
  import * as i1 from '@angular/common';
4
4
  import { CommonModule } from '@angular/common';
5
- import { dataSourceAttribute, defaultValueExtractor, ValueExtractorAttribute, stringFilter, DataRequest } from '@bootkit/ng0/data';
5
+ import { dataSourceAttribute, defaultBooleanValueComparer, BooleanValueComparerAttribute, defaultValueExtractor, ValueExtractorAttribute, stringFilter, DataRequest } from '@bootkit/ng0/data';
6
6
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { NG_VALUE_ACCESSOR } from '@angular/forms';
8
8
  import * as i2 from '@angular/cdk/overlay';
9
- import { ViewportRuler, Overlay, OverlayModule } from '@angular/cdk/overlay';
10
- import { _IdGenerator } from '@bootkit/ng0/common';
9
+ import { Overlay, ViewportRuler, OverlayModule } from '@angular/cdk/overlay';
10
+ import { CssClassAttribute, _IdGenerator } from '@bootkit/ng0/common';
11
11
  import { LocalizationService, defaultValueFormatter, ValueFormatterAttribute } from '@bootkit/ng0/localization';
12
+ import * as i3 from '@angular/cdk/listbox';
13
+ import { CdkListboxModule } from '@angular/cdk/listbox';
12
14
 
13
15
  /**
14
16
  * Select component that allows users to choose an option from a dropdown list.
15
17
  */
16
18
  class SelectComponent {
17
- _el;
18
- _renderer;
19
- _destroyRef;
20
- _viewportRuler = inject(ViewportRuler);
21
- _overlay = inject(Overlay);
22
- _document = inject(DOCUMENT);
23
- _ls = inject(LocalizationService);
24
- _changeDetector = inject(ChangeDetectorRef);
25
19
  _resizeObserver;
26
20
  _resizeObserverInitialized = false;
27
21
  _viewpoerRulerSubscription;
28
- _value = signal(undefined, ...(ngDevMode ? [{ debugName: "_value" }] : []));
22
+ _cdkListboxValue = signal(undefined, ...(ngDevMode ? [{ debugName: "_cdkListboxValue" }] : []));
29
23
  _filterElementRef;
30
24
  _onChangeCallback;
31
25
  _onTouchedCallback;
@@ -36,6 +30,14 @@ class SelectComponent {
36
30
  _optionTemplate;
37
31
  _positionStrategy;
38
32
  _scrollStrategy;
33
+ _overlay = inject(Overlay);
34
+ _document = inject(DOCUMENT);
35
+ _ls = inject(LocalizationService);
36
+ _destroyRef = inject(DestroyRef);
37
+ _el = inject((ElementRef));
38
+ _renderer = inject(Renderer2);
39
+ _viewportRuler = inject(ViewportRuler);
40
+ _changeDetector = inject(ChangeDetectorRef);
39
41
  /**
40
42
  * The data source for the select component.
41
43
  * This can be an array of data, a function that returns an observable of data,
@@ -45,19 +47,20 @@ class SelectComponent {
45
47
  transform: v => dataSourceAttribute(v)
46
48
  }]));
47
49
  /**
48
- * Indicates whether the dropdown is open or closed.
50
+ * Indicates whether multi selection is enabled or not.
49
51
  */
50
- open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
52
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple", transform: booleanAttribute }] : [{
53
+ transform: booleanAttribute
54
+ }]));
51
55
  /**
52
- * Custom compare function to determine equality between two items.
53
- * Default is a simple equality check.
56
+ * Indicates whether the dropdown is open or closed.
54
57
  */
55
- // public readonly compareFunction = input<ValueComparerFunction>(defaultValueComparer);
58
+ open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
56
59
  /**
57
- * Custom value extractor function to extract the value of any object.
58
- */
59
- extractBy = input(defaultValueExtractor, ...(ngDevMode ? [{ debugName: "extractBy", transform: ValueExtractorAttribute }] : [{
60
- transform: ValueExtractorAttribute
60
+ * A custom comparer function or the name of a field for comparing two objects.
61
+ */
62
+ compareBy = input(defaultBooleanValueComparer, ...(ngDevMode ? [{ debugName: "compareBy", transform: BooleanValueComparerAttribute }] : [{
63
+ transform: BooleanValueComparerAttribute
61
64
  }]));
62
65
  /**
63
66
  * Custom format function to convert an item to a string for display.
@@ -66,6 +69,12 @@ class SelectComponent {
66
69
  formatBy = input(defaultValueFormatter, ...(ngDevMode ? [{ debugName: "formatBy", transform: ValueFormatterAttribute(this._ls.get()) }] : [{
67
70
  transform: ValueFormatterAttribute(this._ls.get())
68
71
  }]));
72
+ /**
73
+ * Custom value extractor function to extract the value of any object while writing values.
74
+ */
75
+ writeBy = input(defaultValueExtractor, ...(ngDevMode ? [{ debugName: "writeBy", transform: ValueExtractorAttribute }] : [{
76
+ transform: ValueExtractorAttribute
77
+ }]));
69
78
  /**
70
79
  * Indicates whether the dropdown is filterable.
71
80
  */
@@ -79,20 +88,26 @@ class SelectComponent {
79
88
  * Default checks if the item contains the filter value (case-insensitive).
80
89
  */
81
90
  filterBy = input(stringFilter, ...(ngDevMode ? [{ debugName: "filterBy" }] : []));
82
- constructor(_el, _renderer, _destroyRef) {
83
- this._el = _el;
84
- this._renderer = _renderer;
85
- this._destroyRef = _destroyRef;
91
+ /**
92
+ * CSS class or classes to apply to the list container.
93
+ */
94
+ itemClass = input((item) => undefined, ...(ngDevMode ? [{ debugName: "itemClass", transform: CssClassAttribute }] : [{
95
+ transform: CssClassAttribute
96
+ }]));
97
+ constructor() {
86
98
  this._renderer.addClass(this._el.nativeElement, 'form-select');
87
99
  this._renderer.setAttribute(this._el.nativeElement, 'tabindex', '0');
88
100
  this._scrollStrategy = this._overlay.scrollStrategies.block();
89
101
  }
90
102
  ngOnInit() {
103
+ this._loadItems();
104
+ this._handleDataSourceChange();
105
+ }
106
+ _loadItems() {
91
107
  var r = new DataRequest();
92
108
  this.source().load(r).pipe(takeUntilDestroyed(this._destroyRef)).subscribe(res => {
93
109
  this._insertOptions(0, ...res.data);
94
110
  });
95
- this._handleDataSourceChange();
96
111
  }
97
112
  _handleDataSourceChange() {
98
113
  let options = this._options();
@@ -123,38 +138,34 @@ class SelectComponent {
123
138
  return;
124
139
  }
125
140
  let option = this._options()[index];
126
- this._value.set(this.extractBy()(option.value));
127
- this._onChangeCallback(this._value());
128
- }
129
- isSelected(value) {
130
- let v = this.extractBy()(value);
131
- return v === this._value();
132
- }
133
- /**
134
- * Sets an option as active
135
- */
136
- active(index) {
137
- if (index < 0) {
138
- throw Error();
139
- }
140
- this._activeOptionIndex.set(index);
141
- if (this.open()) {
142
- this.scrollItemIntoView(this._activeOptionIndex(), 'nearest');
143
- }
144
- }
145
- /**
146
- * Scrolls the item at the specified index into view within the dropdown list.
147
- * @param index The index of the item to scroll into view.
148
- * @param position The vertical alignment of the item after scrolling.
149
- * Can be 'start', 'center', 'end', or 'nearest'.
150
- * Default is 'nearest'.
151
- * @param behavior The scrolling behavior.
152
- */
153
- scrollItemIntoView(index, position, behavior) {
154
- let item = this._options()[index];
155
- let elm = this._document.getElementById(item.id);
156
- elm.scrollIntoView({ block: position, behavior: behavior });
141
+ this._cdkListboxValue.set(this.writeBy()(option.value));
142
+ this._onChangeCallback(this._cdkListboxValue());
157
143
  }
144
+ // /**
145
+ // * Sets an option as active
146
+ // */
147
+ // public active(index: number) {
148
+ // if (index < 0) {
149
+ // throw Error();
150
+ // }
151
+ // this._activeOptionIndex.set(index);
152
+ // if (this.open()) {
153
+ // this.scrollItemIntoView(this._activeOptionIndex(), 'nearest');
154
+ // }
155
+ // }
156
+ // /**
157
+ // * Scrolls the item at the specified index into view within the dropdown list.
158
+ // * @param index The index of the item to scroll into view.
159
+ // * @param position The vertical alignment of the item after scrolling.
160
+ // * Can be 'start', 'center', 'end', or 'nearest'.
161
+ // * Default is 'nearest'.
162
+ // * @param behavior The scrolling behavior.
163
+ // */
164
+ // public scrollItemIntoView(index: number, position?: ScrollLogicalPosition, behavior?: ScrollBehavior) {
165
+ // let item = this._options()[index];
166
+ // let elm = this._document.getElementById(item.id) as HTMLUListElement;
167
+ // elm!.scrollIntoView({ block: position, behavior: behavior });
168
+ // }
158
169
  _insertOptions(index, ...items) {
159
170
  // let filter = this.filterBy()()
160
171
  var options = items.map(x => ({
@@ -171,8 +182,29 @@ class SelectComponent {
171
182
  this._changeDetector.markForCheck();
172
183
  }
173
184
  writeValue(obj) {
174
- let value = this.extractBy()(obj);
175
- this._value.set(value);
185
+ let value;
186
+ if (this.multiple()) {
187
+ if (Array.isArray(obj)) {
188
+ value = obj;
189
+ }
190
+ else if (obj === null || obj === undefined) {
191
+ value = [];
192
+ }
193
+ else {
194
+ throw Error('Provide an array or null as the value of ng0-select component.');
195
+ }
196
+ }
197
+ else {
198
+ value = [obj];
199
+ }
200
+ this._cdkListboxValue.set(value);
201
+ // Update selection state of items
202
+ // let compareBy = this.compareBy();
203
+ // if (this.multiple()) {
204
+ // this._items().forEach(x => x.selected = (value as any[]).some(y => compareBy(x.value, y)));
205
+ // } else {
206
+ // this._items().forEach(x => x.selected = compareBy(x.value, value));
207
+ // }
176
208
  }
177
209
  registerOnChange(fn) {
178
210
  this._onChangeCallback = fn;
@@ -195,7 +227,7 @@ class SelectComponent {
195
227
  case 'ArrowDown':
196
228
  if (open) {
197
229
  if (this._activeOptionIndex() < optionsCount - 1) {
198
- this.active(this._activeOptionIndex() + 1);
230
+ // this.active(this._activeOptionIndex() + 1);
199
231
  }
200
232
  }
201
233
  else {
@@ -208,7 +240,7 @@ class SelectComponent {
208
240
  case 'ArrowUp':
209
241
  if (open) {
210
242
  if (this._activeOptionIndex() > 0) {
211
- this.active(this._activeOptionIndex() - 1);
243
+ // this.active(this._activeOptionIndex()! - 1);
212
244
  }
213
245
  }
214
246
  else {
@@ -245,7 +277,7 @@ class SelectComponent {
245
277
  break;
246
278
  case 'Home':
247
279
  if (open) {
248
- this.active(0);
280
+ // this.active(0);
249
281
  }
250
282
  else {
251
283
  this._selectByIndex(0);
@@ -254,7 +286,7 @@ class SelectComponent {
254
286
  break;
255
287
  case 'End':
256
288
  if (open) {
257
- this.active(optionsCount - 1);
289
+ // this.active(optionsCount - 1);
258
290
  }
259
291
  else {
260
292
  this._selectByIndex(optionsCount - 1);
@@ -284,7 +316,7 @@ class SelectComponent {
284
316
  }, 0);
285
317
  }
286
318
  if (this._selectedOptionIndex() > -1) {
287
- this.scrollItemIntoView(this._selectedOptionIndex(), 'start', 'instant');
319
+ // this.scrollItemIntoView(this._selectedOptionIndex(), 'start', 'instant');
288
320
  }
289
321
  }
290
322
  _onOverlayDetach() {
@@ -330,18 +362,19 @@ class SelectComponent {
330
362
  this.open.update(x => !x);
331
363
  // this._onTouchedCallback?.(this._selectedValue());
332
364
  }
333
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.DestroyRef }], target: i0.ɵɵFactoryTarget.Component });
334
- 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 }, open: { classPropertyName: "open", publicName: "open", isSignal: true, isRequired: false, transformFunction: null }, extractBy: { classPropertyName: "extractBy", publicName: "extractBy", isSignal: true, isRequired: false, transformFunction: null }, formatBy: { classPropertyName: "formatBy", publicName: "formatBy", 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 } }, outputs: { open: "openChange" }, host: { listeners: { "keydown": "_onKeydown($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 ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
366
+ 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 }, 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 } }, outputs: { open: "openChange" }, host: { listeners: { "keydown": "_onKeydown($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: [{
335
367
  provide: NG_VALUE_ACCESSOR,
336
368
  useExisting: forwardRef(() => SelectComponent),
337
369
  multi: true
338
- }], queries: [{ propertyName: "_optionTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_filterElementRef", first: true, predicate: ["filterInput"], descendants: true }], exportAs: ["ng0Select"], ngImport: i0, template: "@let formattedValue = formatBy()(_value());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"$index == _activeOptionIndex()\"\r\n [class.ng0-select-option-selected]=\"isSelected(option.value)\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"_selectByIndex($index); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\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:1rem 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"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
370
+ }], queries: [{ propertyName: "_optionTemplate", first: true, predicate: TemplateRef, descendants: true }], viewQueries: [{ propertyName: "_filterElementRef", first: true, predicate: ["filterInput"], descendants: true }], exportAs: ["ng0Select"], ngImport: i0, template: "@let formattedValue = formatBy()(_cdkListboxValue());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n cdkListbox\r\n [cdkListboxValue]=\"_cdkListboxValue()\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li [cdkOption]=\"option.value\"\r\n #cdkOption=\"cdkOption\"\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"cdkOption.isActive()\"\r\n [class.ng0-select-option-selected]=\"cdkOption.isSelected()\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"cdkOption.select(); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\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:1rem 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: CdkListboxModule }, { kind: "directive", type: i3.CdkListbox, selector: "[cdkListbox]", inputs: ["id", "tabindex", "cdkListboxValue", "cdkListboxMultiple", "cdkListboxDisabled", "cdkListboxUseActiveDescendant", "cdkListboxOrientation", "cdkListboxCompareWith", "cdkListboxNavigationWrapDisabled", "cdkListboxNavigatesDisabledOptions"], outputs: ["cdkListboxValueChange"], exportAs: ["cdkListbox"] }, { kind: "directive", type: i3.CdkOption, selector: "[cdkOption]", inputs: ["id", "cdkOption", "cdkOptionTypeaheadLabel", "cdkOptionDisabled", "tabindex"], exportAs: ["cdkOption"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
339
371
  }
340
372
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, decorators: [{
341
373
  type: Component,
342
374
  args: [{ selector: 'ng0-select', exportAs: 'ng0Select', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [
343
375
  CommonModule,
344
376
  OverlayModule,
377
+ CdkListboxModule
345
378
  ], providers: [{
346
379
  provide: NG_VALUE_ACCESSOR,
347
380
  useExisting: forwardRef(() => SelectComponent),
@@ -352,8 +385,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImpor
352
385
  '[attr.aria-activedescendant]': '_activeOptionIndex() > -1 ? (_options()[_activeOptionIndex()].id) : undefined',
353
386
  '[attr.disabled]': '_isDisabled()',
354
387
  '[attr.aria-disabled]': '_isDisabled()'
355
- }, template: "@let formattedValue = formatBy()(_value());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"$index == _activeOptionIndex()\"\r\n [class.ng0-select-option-selected]=\"isSelected(option.value)\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"_selectByIndex($index); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\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:1rem var(--ng0-select-item-padding-x);background-color:inherit}.ng0-select-dropdown-container .ng0-select-filter-container .ng0-select-filter-input{width:100%}\n"] }]
356
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.DestroyRef }], propDecorators: { _filterElementRef: [{
388
+ }, template: "@let formattedValue = formatBy()(_cdkListboxValue());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n cdkListbox\r\n [cdkListboxValue]=\"_cdkListboxValue()\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li [cdkOption]=\"option.value\"\r\n #cdkOption=\"cdkOption\"\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"cdkOption.isActive()\"\r\n [class.ng0-select-option-selected]=\"cdkOption.isSelected()\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"cdkOption.select(); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\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:1rem var(--ng0-select-item-padding-x);background-color:inherit}.ng0-select-dropdown-container .ng0-select-filter-container .ng0-select-filter-input{width:100%}\n"] }]
389
+ }], ctorParameters: () => [], propDecorators: { _filterElementRef: [{
357
390
  type: ViewChild,
358
391
  args: ['filterInput']
359
392
  }], _optionTemplate: [{
@@ -1 +1 @@
1
- {"version":3,"file":"bootkit-ng0-components-select.mjs","sources":["../../../projects/ng0/components/select/select.component.ts","../../../projects/ng0/components/select/select.component.html","../../../projects/ng0/components/select/select.module.ts","../../../projects/ng0/components/select/public-api.ts","../../../projects/ng0/components/select/bootkit-ng0-components-select.ts"],"sourcesContent":["import { Component, ElementRef, Renderer2, input, OnInit, DestroyRef, signal, model, HostListener, inject, forwardRef, ViewChild, TemplateRef, ContentChild, ViewEncapsulation, DOCUMENT, ChangeDetectionStrategy, booleanAttribute, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { dataSourceAttribute, DataRequest, DataSource, DataSourceLike, ValueExtractorAttribute, defaultValueExtractor, stringFilter, FilterPredicate } from '@bootkit/ng0/data';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayModule, ScrollStrategy, ViewportRuler } from '@angular/cdk/overlay';\r\nimport { Subscription } from 'rxjs';\r\nimport { SelectOption, _IdGenerator } from '@bootkit/ng0/common';\r\nimport { ValueFormatterAttribute, defaultValueFormatter, LocalizationService } from '@bootkit/ng0/localization';\r\n\r\n/**\r\n * Select component that allows users to choose an option from a dropdown list.\r\n */\r\n@Component({\r\n selector: 'ng0-select',\r\n exportAs: 'ng0Select',\r\n templateUrl: './select.component.html',\r\n styleUrl: './select.component.scss',\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n OverlayModule,\r\n ],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectComponent),\r\n multi: true\r\n }],\r\n host: {\r\n '[class.ng0-select-open]': 'open()',\r\n '[class.ng0-select-loading]': 'source().isLoading()',\r\n '[attr.aria-activedescendant]': '_activeOptionIndex() > -1 ? (_options()[_activeOptionIndex()].id) : undefined',\r\n '[attr.disabled]': '_isDisabled()',\r\n '[attr.aria-disabled]': '_isDisabled()'\r\n }\r\n})\r\nexport class SelectComponent implements OnInit, ControlValueAccessor {\r\n private _viewportRuler = inject(ViewportRuler);\r\n private _overlay = inject(Overlay);\r\n private _document = inject(DOCUMENT);\r\n private _ls = inject(LocalizationService);\r\n private _changeDetector = inject(ChangeDetectorRef);\r\n private _resizeObserver?: ResizeObserver;\r\n private _resizeObserverInitialized = false;\r\n private _viewpoerRulerSubscription?: Subscription;\r\n protected _value = signal<any>(undefined);\r\n @ViewChild('filterInput') private _filterElementRef?: ElementRef;\r\n private _onChangeCallback!: (value: any) => void;\r\n private _onTouchedCallback!: (value: any) => void;\r\n\r\n protected readonly _options = signal<SelectOption[]>([]);\r\n protected readonly _isDisabled = signal<boolean>(false);\r\n protected readonly _selectedOptionIndex = signal<number>(-1);\r\n protected readonly _activeOptionIndex = signal<number>(-1);\r\n @ContentChild(TemplateRef) protected _optionTemplate?: TemplateRef<any>;\r\n protected _positionStrategy!: FlexibleConnectedPositionStrategy;\r\n protected _scrollStrategy!: ScrollStrategy;\r\n\r\n /**\r\n * The data source for the select component.\r\n * This can be an array of data, a function that returns an observable of data,\r\n * or an instance of DataSource.\r\n */\r\n public readonly source = input.required<DataSource<any>, DataSourceLike<any>>({\r\n transform: v => dataSourceAttribute(v)\r\n });\r\n\r\n /** \r\n * Indicates whether the dropdown is open or closed.\r\n */\r\n public readonly open = model(false);\r\n\r\n /**\r\n * Custom compare function to determine equality between two items.\r\n * Default is a simple equality check.\r\n */\r\n // public readonly compareFunction = input<ValueComparerFunction>(defaultValueComparer);\r\n\r\n /**\r\n * Custom value extractor function to extract the value of any object.\r\n */\r\n public readonly extractBy = input(defaultValueExtractor, {\r\n transform: ValueExtractorAttribute\r\n });\r\n\r\n /**\r\n * Custom format function to convert an item to a string for display.\r\n * Default converts the item to a string using its toString method.\r\n */\r\n public readonly formatBy = input(defaultValueFormatter, {\r\n transform: ValueFormatterAttribute(this._ls.get())\r\n });\r\n\r\n /**\r\n * Indicates whether the dropdown is filterable.\r\n */\r\n public readonly filterable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Placeholder text for the filter input field.\r\n */\r\n public readonly filterPlaceholder = input('');\r\n\r\n /**\r\n * Custom filter function to filter items based on a filter value.\r\n * Default checks if the item contains the filter value (case-insensitive).\r\n */\r\n public readonly filterBy = input<FilterPredicate>(stringFilter);\r\n\r\n constructor(protected _el: ElementRef<HTMLDivElement>, private _renderer: Renderer2, private _destroyRef: DestroyRef) {\r\n this._renderer.addClass(this._el.nativeElement, 'form-select');\r\n this._renderer.setAttribute(this._el.nativeElement, 'tabindex', '0');\r\n this._scrollStrategy = this._overlay.scrollStrategies.block();\r\n }\r\n\r\n ngOnInit(): void {\r\n var r = new DataRequest();\r\n this.source().load(r).pipe(takeUntilDestroyed(this._destroyRef)).subscribe(res => {\r\n this._insertOptions(0, ...res.data)\r\n })\r\n\r\n this._handleDataSourceChange();\r\n }\r\n\r\n private _handleDataSourceChange() {\r\n let options = this._options();\r\n this.source().change.subscribe(e => {\r\n e.changes.forEach(change => {\r\n switch (change.type) {\r\n case 'insert':\r\n this._insertOptions(change.index!, ...change.items);\r\n break;\r\n case 'replace':\r\n options[change.index].value = change.value;\r\n break;\r\n case 'remove':\r\n options.splice(change.index, change.count);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Selects an option by index\r\n */\r\n protected _selectByIndex(index: number) {\r\n let optionsCount = this._options().length;\r\n if (optionsCount == 0 || index < 0 || index > optionsCount - 1) {\r\n throw new Error('Index out of range');\r\n }\r\n\r\n if (index == this._selectedOptionIndex()) {\r\n return;\r\n }\r\n\r\n let option = this._options()[index];\r\n this._value.set(this.extractBy()(option.value));\r\n this._onChangeCallback(this._value());\r\n }\r\n\r\n public isSelected(value: any) {\r\n let v = this.extractBy()(value);\r\n return v === this._value();\r\n }\r\n\r\n /**\r\n * Sets an option as active\r\n */\r\n public active(index: number) {\r\n if (index < 0) {\r\n throw Error();\r\n }\r\n\r\n this._activeOptionIndex.set(index);\r\n if (this.open()) {\r\n this.scrollItemIntoView(this._activeOptionIndex(), 'nearest');\r\n }\r\n }\r\n\r\n /**\r\n * Scrolls the item at the specified index into view within the dropdown list.\r\n * @param index The index of the item to scroll into view.\r\n * @param position The vertical alignment of the item after scrolling.\r\n * Can be 'start', 'center', 'end', or 'nearest'.\r\n * Default is 'nearest'.\r\n * @param behavior The scrolling behavior.\r\n */\r\n public scrollItemIntoView(index: number, position?: ScrollLogicalPosition, behavior?: ScrollBehavior) {\r\n let item = this._options()[index];\r\n let elm = this._document.getElementById(item.id) as HTMLUListElement;\r\n elm!.scrollIntoView({ block: position, behavior: behavior });\r\n }\r\n\r\n protected _insertOptions(index?: number, ...items: any[]) {\r\n // let filter = this.filterBy()()\r\n var options = items.map(x => ({\r\n id: this._getNextOptionId(),\r\n value: x,\r\n show: true\r\n }) as SelectOption)\r\n\r\n if (Number.isInteger(index)) {\r\n this._options().splice(index!, 0, ...options);\r\n } else {\r\n this._options().push(...options);\r\n }\r\n\r\n this._changeDetector.markForCheck();\r\n }\r\n\r\n writeValue(obj: any): void {\r\n let value = this.extractBy()(obj)\r\n this._value.set(value);\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onChangeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._onTouchedCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this._isDisabled.set(isDisabled);\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n protected _onKeydown(e: KeyboardEvent, firedByFilter: boolean = false) {\r\n let open = this.open();\r\n\r\n if (this._isDisabled())\r\n return;\r\n\r\n let optionsCount = this._options().length;\r\n if (optionsCount == 0) {\r\n return;\r\n }\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n if (open) {\r\n if (this._activeOptionIndex() < optionsCount - 1) {\r\n this.active(this._activeOptionIndex() + 1);\r\n }\r\n } else {\r\n if (this._selectedOptionIndex()! < optionsCount - 1) {\r\n this._selectByIndex(this._selectedOptionIndex() + 1)\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'ArrowUp':\r\n if (open) {\r\n if (this._activeOptionIndex() > 0) {\r\n this.active(this._activeOptionIndex()! - 1);\r\n }\r\n } else {\r\n if (this._selectedOptionIndex() > 0) {\r\n this._selectByIndex(this._selectedOptionIndex()! - 1)\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Enter':\r\n if (open) {\r\n if (this._activeOptionIndex() == this._selectedOptionIndex()) {\r\n this.open.set(false);\r\n } else {\r\n this._selectByIndex(this._activeOptionIndex());\r\n this.open.set(false);\r\n }\r\n } else {\r\n this.open.set(true);\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case ' ':\r\n if (!open) {\r\n this.open.set(true);\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Escape':\r\n this.open.set(false);\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Home':\r\n if (open) {\r\n this.active(0);\r\n } else {\r\n this._selectByIndex(0)\r\n }\r\n\r\n e.preventDefault();\r\n break;\r\n\r\n case 'End':\r\n if (open) {\r\n this.active(optionsCount - 1);\r\n } else {\r\n this._selectByIndex(optionsCount - 1);\r\n }\r\n\r\n e.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected _onFilterBlur() {\r\n // use setTimeout to allow next element receives the focus.\r\n setTimeout(() => {\r\n if (!this._el.nativeElement.matches(':focus')) {\r\n this.open.set(false);\r\n }\r\n }, 0);\r\n }\r\n\r\n protected _filterItems(filter: string) {\r\n let filterFunc = this.filterBy();\r\n this._options().forEach(x => x.show = filterFunc(x.value, filter));\r\n }\r\n\r\n protected _onOverlayAttach() {\r\n this._activeOptionIndex.set(this._selectedOptionIndex())\r\n\r\n this._listenToResizeEvents();\r\n\r\n if (this.filterable()) {\r\n setTimeout(() => {\r\n this._filterElementRef?.nativeElement.focus();\r\n }, 0);\r\n }\r\n\r\n if (this._selectedOptionIndex() > -1) {\r\n this.scrollItemIntoView(this._selectedOptionIndex(), 'start', 'instant');\r\n }\r\n }\r\n\r\n protected _onOverlayDetach() {\r\n this._unlistenFromResizeEvents();\r\n if (this.filterable()) {\r\n this._el?.nativeElement.focus();\r\n this._options().forEach(x => x.show = false);\r\n }\r\n }\r\n\r\n private _getNextOptionId() {\r\n return `ng0-select-item-${_IdGenerator.next().toString()}`;\r\n }\r\n\r\n private _listenToResizeEvents() {\r\n this._viewportRuler.change().subscribe(x => {\r\n this.open.set(false);\r\n });\r\n\r\n this._resizeObserver = new ResizeObserver(e => {\r\n // Sterategy 1: close overlay\r\n if (!this._resizeObserverInitialized) {\r\n this._resizeObserverInitialized = true;\r\n return;\r\n } else {\r\n this.open.set(false);\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n // Sterategy 2: update overlay size\r\n // const width = (e[0].target as HTMLDivElement).offsetWidth;\r\n // this._connectedOverlay.overlayRef.updateSize({ width });\r\n });\r\n\r\n this._resizeObserver.observe(this._el.nativeElement);\r\n }\r\n\r\n private _unlistenFromResizeEvents() {\r\n this._viewpoerRulerSubscription?.unsubscribe();\r\n this._viewpoerRulerSubscription = undefined;\r\n\r\n this._resizeObserver?.disconnect();\r\n this._resizeObserver = undefined;\r\n this._resizeObserverInitialized = false;\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n private _onHostClick(e: MouseEvent) {\r\n if (this._isDisabled())\r\n return;\r\n\r\n this.open.update(x => !x);\r\n // this._onTouchedCallback?.(this._selectedValue());\r\n }\r\n}\r\n","@let formattedValue = formatBy()(_value());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"$index == _activeOptionIndex()\"\r\n [class.ng0-select-option-selected]=\"isSelected(option.value)\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"_selectByIndex($index); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { SelectComponent } from './select.component';\r\n\r\nconst Items = [SelectComponent]\r\n\r\n/**\r\n * Select module.\r\n */\r\n@NgModule({\r\n imports: Items,\r\n exports: Items\r\n})\r\nexport class SelectModule { }\r\n","// export * from './types';\r\nexport * from './select.component';\r\nexport * from './select.module';\r\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":"bootkit-ng0-components-select.mjs","sources":["../../../projects/ng0/components/select/select.component.ts","../../../projects/ng0/components/select/select.component.html","../../../projects/ng0/components/select/select.module.ts","../../../projects/ng0/components/select/public-api.ts","../../../projects/ng0/components/select/bootkit-ng0-components-select.ts"],"sourcesContent":["import { Component, ElementRef, Renderer2, input, OnInit, DestroyRef, signal, model, HostListener, inject, forwardRef, ViewChild, TemplateRef, ContentChild, ViewEncapsulation, DOCUMENT, ChangeDetectionStrategy, booleanAttribute, ChangeDetectorRef } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { dataSourceAttribute, DataRequest, DataSource, DataSourceLike, ValueExtractorAttribute, defaultValueExtractor, stringFilter, FilterPredicate, BooleanValueComparerAttribute, defaultBooleanValueComparer } from '@bootkit/ng0/data';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { FlexibleConnectedPositionStrategy, Overlay, OverlayModule, ScrollStrategy, ViewportRuler } from '@angular/cdk/overlay';\r\nimport { Subscription } from 'rxjs';\r\nimport { CssClassAttribute, SelectOption, _IdGenerator } from '@bootkit/ng0/common';\r\nimport { ValueFormatterAttribute, defaultValueFormatter, LocalizationService } from '@bootkit/ng0/localization';\r\nimport { CdkListboxModule } from '@angular/cdk/listbox';\r\n\r\n/**\r\n * Select component that allows users to choose an option from a dropdown list.\r\n */\r\n@Component({\r\n selector: 'ng0-select',\r\n exportAs: 'ng0Select',\r\n templateUrl: './select.component.html',\r\n styleUrl: './select.component.scss',\r\n standalone: true,\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n imports: [\r\n CommonModule,\r\n OverlayModule,\r\n CdkListboxModule\r\n ],\r\n providers: [{\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => SelectComponent),\r\n multi: true\r\n }],\r\n host: {\r\n '[class.ng0-select-open]': 'open()',\r\n '[class.ng0-select-loading]': 'source().isLoading()',\r\n '[attr.aria-activedescendant]': '_activeOptionIndex() > -1 ? (_options()[_activeOptionIndex()].id) : undefined',\r\n '[attr.disabled]': '_isDisabled()',\r\n '[attr.aria-disabled]': '_isDisabled()'\r\n }\r\n})\r\nexport class SelectComponent implements OnInit, ControlValueAccessor {\r\n private _resizeObserver?: ResizeObserver;\r\n private _resizeObserverInitialized = false;\r\n private _viewpoerRulerSubscription?: Subscription;\r\n protected _cdkListboxValue = signal<any>(undefined);\r\n @ViewChild('filterInput') private _filterElementRef?: ElementRef;\r\n private _onChangeCallback!: (value: any) => void;\r\n private _onTouchedCallback!: (value: any) => void;\r\n protected readonly _options = signal<SelectOption[]>([]);\r\n protected readonly _isDisabled = signal<boolean>(false);\r\n protected readonly _selectedOptionIndex = signal<number>(-1);\r\n protected readonly _activeOptionIndex = signal<number>(-1);\r\n @ContentChild(TemplateRef) protected _optionTemplate?: TemplateRef<any>;\r\n protected _positionStrategy!: FlexibleConnectedPositionStrategy;\r\n protected _scrollStrategy!: ScrollStrategy;\r\n\r\n private _overlay = inject(Overlay);\r\n private _document = inject(DOCUMENT);\r\n private _ls = inject(LocalizationService);\r\n private _destroyRef = inject(DestroyRef);\r\n protected _el = inject(ElementRef<HTMLDivElement>);\r\n private _renderer = inject(Renderer2);\r\n private _viewportRuler = inject(ViewportRuler);\r\n private _changeDetector = inject(ChangeDetectorRef);\r\n\r\n /**\r\n * The data source for the select component.\r\n * This can be an array of data, a function that returns an observable of data,\r\n * or an instance of DataSource.\r\n */\r\n public readonly source = input.required<DataSource<any>, DataSourceLike<any>>({\r\n transform: v => dataSourceAttribute(v)\r\n });\r\n\r\n /** \r\n * Indicates whether multi selection is enabled or not.\r\n */\r\n public readonly multiple = input(false, {\r\n transform: booleanAttribute\r\n });\r\n\r\n /** \r\n * Indicates whether the dropdown is open or closed.\r\n */\r\n public readonly open = model(false);\r\n\r\n /**\r\n * A custom comparer function or the name of a field for comparing two objects.\r\n */\r\n public readonly compareBy = input(defaultBooleanValueComparer, {\r\n transform: BooleanValueComparerAttribute\r\n });\r\n\r\n /**\r\n * Custom format function to convert an item to a string for display.\r\n * Default converts the item to a string using its toString method.\r\n */\r\n public readonly formatBy = input(defaultValueFormatter, {\r\n transform: ValueFormatterAttribute(this._ls.get())\r\n });\r\n\r\n /**\r\n * Custom value extractor function to extract the value of any object while writing values.\r\n */\r\n public readonly writeBy = input(defaultValueExtractor, {\r\n transform: ValueExtractorAttribute\r\n });\r\n\r\n /**\r\n * Indicates whether the dropdown is filterable.\r\n */\r\n public readonly filterable = input(false, { transform: booleanAttribute });\r\n\r\n /**\r\n * Placeholder text for the filter input field.\r\n */\r\n public readonly filterPlaceholder = input('');\r\n\r\n /**\r\n * Custom filter function to filter items based on a filter value.\r\n * Default checks if the item contains the filter value (case-insensitive).\r\n */\r\n public readonly filterBy = input<FilterPredicate>(stringFilter);\r\n\r\n /**\r\n * CSS class or classes to apply to the list container.\r\n */\r\n public readonly itemClass = input((item) => undefined, {\r\n transform: CssClassAttribute\r\n });\r\n\r\n constructor() {\r\n this._renderer.addClass(this._el.nativeElement, 'form-select');\r\n this._renderer.setAttribute(this._el.nativeElement, 'tabindex', '0');\r\n this._scrollStrategy = this._overlay.scrollStrategies.block();\r\n }\r\n\r\n ngOnInit(): void {\r\n this._loadItems();\r\n this._handleDataSourceChange();\r\n }\r\n\r\n private _loadItems() {\r\n var r = new DataRequest();\r\n this.source().load(r).pipe(takeUntilDestroyed(this._destroyRef)).subscribe(res => {\r\n this._insertOptions(0, ...res.data);\r\n });\r\n }\r\n\r\n private _handleDataSourceChange() {\r\n let options = this._options();\r\n this.source().change.subscribe(e => {\r\n e.changes.forEach(change => {\r\n switch (change.type) {\r\n case 'insert':\r\n this._insertOptions(change.index!, ...change.items);\r\n break;\r\n case 'replace':\r\n options[change.index].value = change.value;\r\n break;\r\n case 'remove':\r\n options.splice(change.index, change.count);\r\n }\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Selects an option by index\r\n */\r\n protected _selectByIndex(index: number) {\r\n let optionsCount = this._options().length;\r\n if (optionsCount == 0 || index < 0 || index > optionsCount - 1) {\r\n throw new Error('Index out of range');\r\n }\r\n\r\n if (index == this._selectedOptionIndex()) {\r\n return;\r\n }\r\n\r\n let option = this._options()[index];\r\n this._cdkListboxValue.set(this.writeBy()(option.value));\r\n this._onChangeCallback(this._cdkListboxValue());\r\n }\r\n\r\n // /**\r\n // * Sets an option as active\r\n // */\r\n // public active(index: number) {\r\n // if (index < 0) {\r\n // throw Error();\r\n // }\r\n\r\n // this._activeOptionIndex.set(index);\r\n // if (this.open()) {\r\n // this.scrollItemIntoView(this._activeOptionIndex(), 'nearest');\r\n // }\r\n // }\r\n\r\n // /**\r\n // * Scrolls the item at the specified index into view within the dropdown list.\r\n // * @param index The index of the item to scroll into view.\r\n // * @param position The vertical alignment of the item after scrolling.\r\n // * Can be 'start', 'center', 'end', or 'nearest'.\r\n // * Default is 'nearest'.\r\n // * @param behavior The scrolling behavior.\r\n // */\r\n // public scrollItemIntoView(index: number, position?: ScrollLogicalPosition, behavior?: ScrollBehavior) {\r\n // let item = this._options()[index];\r\n // let elm = this._document.getElementById(item.id) as HTMLUListElement;\r\n // elm!.scrollIntoView({ block: position, behavior: behavior });\r\n // }\r\n\r\n protected _insertOptions(index?: number, ...items: any[]) {\r\n // let filter = this.filterBy()()\r\n var options = items.map(x => ({\r\n id: this._getNextOptionId(),\r\n value: x,\r\n show: true\r\n }) as SelectOption)\r\n\r\n if (Number.isInteger(index)) {\r\n this._options().splice(index!, 0, ...options);\r\n } else {\r\n this._options().push(...options);\r\n }\r\n\r\n this._changeDetector.markForCheck();\r\n }\r\n\r\n writeValue(obj: any): void {\r\n let value;\r\n\r\n if (this.multiple()) {\r\n if (Array.isArray(obj)) {\r\n value = obj;\r\n } else if (obj === null || obj === undefined) {\r\n value = [];\r\n } else {\r\n throw Error('Provide an array or null as the value of ng0-select component.');\r\n }\r\n } else {\r\n value = [obj];\r\n }\r\n \r\n this._cdkListboxValue.set(value);\r\n\r\n // Update selection state of items\r\n // let compareBy = this.compareBy();\r\n // if (this.multiple()) {\r\n // this._items().forEach(x => x.selected = (value as any[]).some(y => compareBy(x.value, y)));\r\n // } else {\r\n // this._items().forEach(x => x.selected = compareBy(x.value, value));\r\n // }\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._onChangeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._onTouchedCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this._isDisabled.set(isDisabled);\r\n }\r\n\r\n @HostListener('keydown', ['$event'])\r\n protected _onKeydown(e: KeyboardEvent, firedByFilter: boolean = false) {\r\n let open = this.open();\r\n\r\n if (this._isDisabled())\r\n return;\r\n\r\n let optionsCount = this._options().length;\r\n if (optionsCount == 0) {\r\n return;\r\n }\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n if (open) {\r\n if (this._activeOptionIndex() < optionsCount - 1) {\r\n // this.active(this._activeOptionIndex() + 1);\r\n }\r\n } else {\r\n if (this._selectedOptionIndex()! < optionsCount - 1) {\r\n this._selectByIndex(this._selectedOptionIndex() + 1)\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'ArrowUp':\r\n if (open) {\r\n if (this._activeOptionIndex() > 0) {\r\n // this.active(this._activeOptionIndex()! - 1);\r\n }\r\n } else {\r\n if (this._selectedOptionIndex() > 0) {\r\n this._selectByIndex(this._selectedOptionIndex()! - 1)\r\n }\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Enter':\r\n if (open) {\r\n if (this._activeOptionIndex() == this._selectedOptionIndex()) {\r\n this.open.set(false);\r\n } else {\r\n this._selectByIndex(this._activeOptionIndex());\r\n this.open.set(false);\r\n }\r\n } else {\r\n this.open.set(true);\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case ' ':\r\n if (!open) {\r\n this.open.set(true);\r\n }\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Escape':\r\n this.open.set(false);\r\n e.preventDefault();\r\n break;\r\n\r\n case 'Home':\r\n if (open) {\r\n // this.active(0);\r\n } else {\r\n this._selectByIndex(0)\r\n }\r\n\r\n e.preventDefault();\r\n break;\r\n\r\n case 'End':\r\n if (open) {\r\n // this.active(optionsCount - 1);\r\n } else {\r\n this._selectByIndex(optionsCount - 1);\r\n }\r\n\r\n e.preventDefault();\r\n break;\r\n }\r\n }\r\n\r\n protected _onFilterBlur() {\r\n // use setTimeout to allow next element receives the focus.\r\n setTimeout(() => {\r\n if (!this._el.nativeElement.matches(':focus')) {\r\n this.open.set(false);\r\n }\r\n }, 0);\r\n }\r\n\r\n protected _filterItems(filter: string) {\r\n let filterFunc = this.filterBy();\r\n this._options().forEach(x => x.show = filterFunc(x.value, filter));\r\n }\r\n\r\n protected _onOverlayAttach() {\r\n this._activeOptionIndex.set(this._selectedOptionIndex())\r\n\r\n this._listenToResizeEvents();\r\n\r\n if (this.filterable()) {\r\n setTimeout(() => {\r\n this._filterElementRef?.nativeElement.focus();\r\n }, 0);\r\n }\r\n\r\n if (this._selectedOptionIndex() > -1) {\r\n // this.scrollItemIntoView(this._selectedOptionIndex(), 'start', 'instant');\r\n }\r\n }\r\n\r\n protected _onOverlayDetach() {\r\n this._unlistenFromResizeEvents();\r\n if (this.filterable()) {\r\n this._el?.nativeElement.focus();\r\n this._options().forEach(x => x.show = false);\r\n }\r\n }\r\n\r\n private _getNextOptionId() {\r\n return `ng0-select-item-${_IdGenerator.next().toString()}`;\r\n }\r\n\r\n private _listenToResizeEvents() {\r\n this._viewportRuler.change().subscribe(x => {\r\n this.open.set(false);\r\n });\r\n\r\n this._resizeObserver = new ResizeObserver(e => {\r\n // Sterategy 1: close overlay\r\n if (!this._resizeObserverInitialized) {\r\n this._resizeObserverInitialized = true;\r\n return;\r\n } else {\r\n this.open.set(false);\r\n this._resizeObserver?.disconnect();\r\n }\r\n\r\n // Sterategy 2: update overlay size\r\n // const width = (e[0].target as HTMLDivElement).offsetWidth;\r\n // this._connectedOverlay.overlayRef.updateSize({ width });\r\n });\r\n\r\n this._resizeObserver.observe(this._el.nativeElement);\r\n }\r\n\r\n private _unlistenFromResizeEvents() {\r\n this._viewpoerRulerSubscription?.unsubscribe();\r\n this._viewpoerRulerSubscription = undefined;\r\n\r\n this._resizeObserver?.disconnect();\r\n this._resizeObserver = undefined;\r\n this._resizeObserverInitialized = false;\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n private _onHostClick(e: MouseEvent) {\r\n if (this._isDisabled())\r\n return;\r\n\r\n this.open.update(x => !x);\r\n // this._onTouchedCallback?.(this._selectedValue());\r\n }\r\n}\r\n","@let formattedValue = formatBy()(_cdkListboxValue());\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 (keydown)=\"_onKeydown($event, true)\"\r\n (blur)=\"_onFilterBlur()\"\r\n (input)=\"_filterItems($event.target.value)\">\r\n </div>\r\n }\r\n\r\n <ul class=\"ng0-select-dropdown\"\r\n cdkListbox\r\n [cdkListboxValue]=\"_cdkListboxValue()\"\r\n [attr.tabindex]=\"_isDisabled() ? undefined : -1\"\r\n [class.is-open]=\"open()\">\r\n\r\n @for (option of _options(); track $index) {\r\n <li [cdkOption]=\"option.value\"\r\n #cdkOption=\"cdkOption\"\r\n [attr.id]=\"option.id\"\r\n class=\"ng0-select-option\"\r\n [class.ng0-select-option-active]=\"cdkOption.isActive()\"\r\n [class.ng0-select-option-selected]=\"cdkOption.isSelected()\"\r\n [class.ng0-select-option-filtered]=\"!option.show\"\r\n (click)=\"cdkOption.select(); open.set(false)\"\r\n (keyup.enter)=\"open.set(false)\">\r\n @if(_optionTemplate) {\r\n <ng-container *ngTemplateOutlet=\"_optionTemplate; context: { $implicit: option}\" />\r\n } @else {\r\n @let v = formatBy()(option.value);\r\n @if(v) {\r\n {{v}}\r\n }@else {\r\n &nbsp;\r\n }\r\n }\r\n </li>\r\n }\r\n </ul>\r\n</ng-template>","import { NgModule } from '@angular/core';\r\nimport { SelectComponent } from './select.component';\r\n\r\nconst Items = [SelectComponent]\r\n\r\n/**\r\n * Select module.\r\n */\r\n@NgModule({\r\n imports: Items,\r\n exports: Items\r\n})\r\nexport class SelectModule { }\r\n","// export * from './types';\r\nexport * from './select.component';\r\nexport * from './select.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -64,6 +64,7 @@ const Keys = {
64
64
  */
65
65
  class NumberDirective {
66
66
  _value;
67
+ _isDisabled;
67
68
  _decimalSeparator;
68
69
  _thousandsSeparator = ',';
69
70
  _onChangeCallback;
@@ -107,7 +108,8 @@ class NumberDirective {
107
108
  this._onTouchedCallback = fn;
108
109
  }
109
110
  setDisabledState(isDisabled) {
110
- // this._setProperty('disabled', isDisabled);
111
+ this._isDisabled = isDisabled;
112
+ this._renderer.setProperty(this._elmRef.nativeElement, 'disabled', isDisabled);
111
113
  }
112
114
  writeValue(value) {
113
115
  var inputValue;