@bootkit/ng0 0.0.0-alpha.3 → 0.0.0-alpha.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/common/index.d.ts +271 -7
  2. package/components/accordion/index.d.ts +1 -1
  3. package/components/backdrop/index.d.ts +12 -0
  4. package/components/button/index.d.ts +48 -0
  5. package/components/card/index.d.ts +27 -0
  6. package/components/code/index.d.ts +35 -0
  7. package/components/confirmation/index.d.ts +66 -0
  8. package/components/dropdown/index.d.ts +140 -0
  9. package/components/form-field/index.d.ts +24 -41
  10. package/components/list/index.d.ts +259 -0
  11. package/components/modal/index.d.ts +22 -4
  12. package/components/nav/index.d.ts +23 -19
  13. package/components/pagination/index.d.ts +35 -9
  14. package/components/popover/index.d.ts +1 -1
  15. package/components/select/index.d.ts +159 -0
  16. package/components/sidenav/index.d.ts +59 -0
  17. package/components/stepper/index.d.ts +26 -0
  18. package/components/table/index.d.ts +273 -0
  19. package/components/toast/index.d.ts +1 -1
  20. package/components/tooltip/index.d.ts +1 -1
  21. package/components/vertical-menu/index.d.ts +61 -0
  22. package/data/index.d.ts +145 -45
  23. package/date/index.d.ts +34 -0
  24. package/fesm2022/bootkit-ng0-common.mjs +295 -12
  25. package/fesm2022/bootkit-ng0-common.mjs.map +1 -1
  26. package/fesm2022/bootkit-ng0-components-accordion.mjs +13 -13
  27. package/fesm2022/bootkit-ng0-components-accordion.mjs.map +1 -1
  28. package/fesm2022/bootkit-ng0-components-backdrop.mjs +46 -0
  29. package/fesm2022/bootkit-ng0-components-backdrop.mjs.map +1 -0
  30. package/fesm2022/bootkit-ng0-components-button.mjs +119 -0
  31. package/fesm2022/bootkit-ng0-components-button.mjs.map +1 -0
  32. package/fesm2022/bootkit-ng0-components-card.mjs +62 -0
  33. package/fesm2022/bootkit-ng0-components-card.mjs.map +1 -0
  34. package/fesm2022/bootkit-ng0-components-code.mjs +70 -0
  35. package/fesm2022/bootkit-ng0-components-code.mjs.map +1 -0
  36. package/fesm2022/bootkit-ng0-components-collapse.mjs +14 -14
  37. package/fesm2022/bootkit-ng0-components-collapse.mjs.map +1 -1
  38. package/fesm2022/bootkit-ng0-components-confirmation.mjs +167 -0
  39. package/fesm2022/bootkit-ng0-components-confirmation.mjs.map +1 -0
  40. package/fesm2022/bootkit-ng0-components-dropdown.mjs +302 -0
  41. package/fesm2022/bootkit-ng0-components-dropdown.mjs.map +1 -0
  42. package/fesm2022/bootkit-ng0-components-form-field.mjs +61 -83
  43. package/fesm2022/bootkit-ng0-components-form-field.mjs.map +1 -1
  44. package/fesm2022/bootkit-ng0-components-list.mjs +563 -0
  45. package/fesm2022/bootkit-ng0-components-list.mjs.map +1 -0
  46. package/fesm2022/bootkit-ng0-components-modal.mjs +40 -23
  47. package/fesm2022/bootkit-ng0-components-modal.mjs.map +1 -1
  48. package/fesm2022/bootkit-ng0-components-nav.mjs +58 -59
  49. package/fesm2022/bootkit-ng0-components-nav.mjs.map +1 -1
  50. package/fesm2022/bootkit-ng0-components-offcanvas.mjs +9 -9
  51. package/fesm2022/bootkit-ng0-components-offcanvas.mjs.map +1 -1
  52. package/fesm2022/bootkit-ng0-components-overlay.mjs.map +1 -1
  53. package/fesm2022/bootkit-ng0-components-pagination.mjs +58 -23
  54. package/fesm2022/bootkit-ng0-components-pagination.mjs.map +1 -1
  55. package/fesm2022/bootkit-ng0-components-popover.mjs +10 -10
  56. package/fesm2022/bootkit-ng0-components-popover.mjs.map +1 -1
  57. package/fesm2022/bootkit-ng0-components-select.mjs +446 -0
  58. package/fesm2022/bootkit-ng0-components-select.mjs.map +1 -0
  59. package/fesm2022/bootkit-ng0-components-sidenav.mjs +153 -0
  60. package/fesm2022/bootkit-ng0-components-sidenav.mjs.map +1 -0
  61. package/fesm2022/bootkit-ng0-components-stepper.mjs +91 -0
  62. package/fesm2022/bootkit-ng0-components-stepper.mjs.map +1 -0
  63. package/fesm2022/bootkit-ng0-components-table.mjs +461 -0
  64. package/fesm2022/bootkit-ng0-components-table.mjs.map +1 -0
  65. package/fesm2022/bootkit-ng0-components-toast.mjs +7 -7
  66. package/fesm2022/bootkit-ng0-components-toast.mjs.map +1 -1
  67. package/fesm2022/bootkit-ng0-components-tooltip.mjs +8 -8
  68. package/fesm2022/bootkit-ng0-components-tooltip.mjs.map +1 -1
  69. package/fesm2022/bootkit-ng0-components-vertical-menu.mjs +161 -0
  70. package/fesm2022/bootkit-ng0-components-vertical-menu.mjs.map +1 -0
  71. package/fesm2022/bootkit-ng0-data.mjs +180 -90
  72. package/fesm2022/bootkit-ng0-data.mjs.map +1 -1
  73. package/fesm2022/bootkit-ng0-date.mjs +50 -0
  74. package/fesm2022/bootkit-ng0-date.mjs.map +1 -0
  75. package/fesm2022/bootkit-ng0-file.mjs +50 -0
  76. package/fesm2022/bootkit-ng0-file.mjs.map +1 -0
  77. package/fesm2022/bootkit-ng0-form.mjs +514 -0
  78. package/fesm2022/bootkit-ng0-form.mjs.map +1 -0
  79. package/fesm2022/bootkit-ng0-http.mjs +224 -176
  80. package/fesm2022/bootkit-ng0-http.mjs.map +1 -1
  81. package/fesm2022/bootkit-ng0-layouts-layout1.mjs +138 -0
  82. package/fesm2022/bootkit-ng0-layouts-layout1.mjs.map +1 -0
  83. package/fesm2022/bootkit-ng0-localization-locales.mjs +101 -0
  84. package/fesm2022/bootkit-ng0-localization-locales.mjs.map +1 -0
  85. package/fesm2022/bootkit-ng0-localization.mjs +347 -105
  86. package/fesm2022/bootkit-ng0-localization.mjs.map +1 -1
  87. package/fesm2022/bootkit-ng0-platform-browser.mjs +51 -0
  88. package/fesm2022/bootkit-ng0-platform-browser.mjs.map +1 -0
  89. package/fesm2022/bootkit-ng0-routing.mjs +80 -0
  90. package/fesm2022/bootkit-ng0-routing.mjs.map +1 -0
  91. package/fesm2022/bootkit-ng0-script.mjs +59 -0
  92. package/fesm2022/bootkit-ng0-script.mjs.map +1 -0
  93. package/fesm2022/bootkit-ng0-security.mjs +17 -15
  94. package/fesm2022/bootkit-ng0-security.mjs.map +1 -1
  95. package/file/index.d.ts +22 -0
  96. package/form/index.d.ts +127 -0
  97. package/http/index.d.ts +138 -37
  98. package/layouts/layout1/index.d.ts +92 -0
  99. package/localization/index.d.ts +180 -41
  100. package/localization/locales/index.d.ts +7 -0
  101. package/package.json +94 -14
  102. package/platform/browser/index.d.ts +22 -0
  103. package/routing/index.d.ts +124 -0
  104. package/script/index.d.ts +27 -0
  105. package/security/index.d.ts +3 -9
@@ -0,0 +1,446 @@
1
+ import * as i0 from '@angular/core';
2
+ import { signal, inject, ElementRef, Renderer2, ChangeDetectorRef, input, booleanAttribute, model, EventEmitter, effect, untracked, computed, TemplateRef, forwardRef, HostListener, Output, ContentChild, ViewChild, ChangeDetectionStrategy, ViewEncapsulation, Component, NgModule } from '@angular/core';
3
+ import { CommonModule } from '@angular/common';
4
+ import { dataSourceAttribute, DataRequest } from '@bootkit/ng0/data';
5
+ import { NG_VALUE_ACCESSOR } from '@angular/forms';
6
+ import * as i2 from '@angular/cdk/overlay';
7
+ import { Overlay, ViewportRuler, OverlayModule } from '@angular/cdk/overlay';
8
+ import { LocalizationService, defaultFormatter, objectFormatterAttribute } from '@bootkit/ng0/localization';
9
+ import * as i1 from '@bootkit/ng0/components/list';
10
+ import { ListModule, ListComponent } from '@bootkit/ng0/components/list';
11
+ import { defaultEqualityComparer, equalityComparerAttribute, defaultValueWriter, valueWriterAttribute, defaultFilter, filterPredicateAttribute, CssClassAttribute, IdGeneratorAttribute } from '@bootkit/ng0/common';
12
+
13
+ /**
14
+ * Select component that allows users to choose an option from a dropdown list.
15
+ */
16
+ class SelectComponent {
17
+ // private _resizeObserver?: ResizeObserver;
18
+ _viewpoerRulerSubscription;
19
+ _filterElementRef;
20
+ _listComponent;
21
+ _changeCallback;
22
+ _touchCallback;
23
+ _sourceItems = signal(undefined, ...(ngDevMode ? [{ debugName: "_sourceItems" }] : []));
24
+ _selectedItems = new Set();
25
+ _isDisabled = signal(false, ...(ngDevMode ? [{ debugName: "_isDisabled" }] : []));
26
+ _positionStrategy;
27
+ _scrollStrategy;
28
+ _overlay = inject(Overlay);
29
+ _localizationService = inject(LocalizationService);
30
+ _elementRef = inject((ElementRef));
31
+ _filterValue = signal('', ...(ngDevMode ? [{ debugName: "_filterValue" }] : []));
32
+ _renderer = inject(Renderer2);
33
+ _viewportRuler = inject(ViewportRuler);
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;
40
+ /**
41
+ * The data source for the select component.
42
+ * This can be an array of data, a function that returns an observable of data,
43
+ * or an instance of DataSource.
44
+ */
45
+ source = input.required(...(ngDevMode ? [{ debugName: "source", transform: v => dataSourceAttribute(v) }] : [{
46
+ transform: v => dataSourceAttribute(v)
47
+ }]));
48
+ /**
49
+ * Indicates whether multi selection is enabled or not.
50
+ */
51
+ multiple = input(false, ...(ngDevMode ? [{ debugName: "multiple", transform: booleanAttribute }] : [{
52
+ transform: booleanAttribute
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
+ }]));
61
+ /**
62
+ * Indicates whether the dropdown is open or closed.
63
+ */
64
+ open = model(false, ...(ngDevMode ? [{ debugName: "open" }] : []));
65
+ /**
66
+ * A comparer to compare items for selection.
67
+ */
68
+ compareBy = input(defaultEqualityComparer, ...(ngDevMode ? [{ debugName: "compareBy", transform: equalityComparerAttribute }] : [{
69
+ transform: equalityComparerAttribute
70
+ }]));
71
+ /**
72
+ * A fromatter to convert each item to a string for display.
73
+ */
74
+ formatBy = input(defaultFormatter, ...(ngDevMode ? [{ debugName: "formatBy", transform: objectFormatterAttribute(this._localizationService.get()) }] : [{
75
+ transform: objectFormatterAttribute(this._localizationService.get())
76
+ }]));
77
+ /**
78
+ * Custom value writer to extract the value of any object while writing values.
79
+ */
80
+ writeBy = input(defaultValueWriter, ...(ngDevMode ? [{ debugName: "writeBy", transform: valueWriterAttribute }] : [{
81
+ transform: valueWriterAttribute
82
+ }]));
83
+ /**
84
+ * Indicates whether the select component is filterable.
85
+ */
86
+ filterable = input(false, ...(ngDevMode ? [{ debugName: "filterable", transform: booleanAttribute }] : [{ transform: booleanAttribute }]));
87
+ /**
88
+ * Custom filter function to filter items based on a filter value.
89
+ * Default checks if the item contains the filter value (case-insensitive).
90
+ */
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" }] : []));
98
+ /**
99
+ * CSS class or classes to apply to the items.
100
+ */
101
+ itemClass = input(undefined, ...(ngDevMode ? [{ debugName: "itemClass", transform: CssClassAttribute }] : [{
102
+ transform: CssClassAttribute
103
+ }]));
104
+ /**
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
109
+ */
110
+ idGenerator = input(undefined, ...(ngDevMode ? [{ debugName: "idGenerator", transform: IdGeneratorAttribute }] : [{
111
+ transform: IdGeneratorAttribute
112
+ }]));
113
+ /**
114
+ * Event emitted when the selected value changes.
115
+ */
116
+ itemSelect = new EventEmitter();
117
+ constructor() {
118
+ ['ng0-select', 'form-select'].forEach(c => this._renderer.addClass(this._elementRef.nativeElement, c));
119
+ this._scrollStrategy = this._overlay.scrollStrategies.block();
120
+ effect(() => {
121
+ let source = this.source();
122
+ source.load(new DataRequest()).subscribe(res => {
123
+ untracked(() => {
124
+ this._sourceItems.set(res.data);
125
+ this._findAndSelectItems();
126
+ this._changeDetectorRef.markForCheck();
127
+ });
128
+ });
129
+ });
130
+ }
131
+ /**
132
+ * Indicates whether the given value is selected.
133
+ * @param item
134
+ * @returns
135
+ */
136
+ isSelected(value) {
137
+ return this._selectedItems.has(value);
138
+ }
139
+ /**
140
+ * Selects the given value.
141
+ * @param item
142
+ */
143
+ select(value) {
144
+ if (this.multiple()) {
145
+ if (!this._selectedItems.has(value)) {
146
+ this._selectedItems.add(value);
147
+ this._updateValue();
148
+ this._changeCallback?.(this._value());
149
+ }
150
+ }
151
+ else {
152
+ this._selectedItems.clear();
153
+ this._selectedItems.add(value);
154
+ this._updateValue();
155
+ this._changeCallback?.(this._value());
156
+ }
157
+ }
158
+ /**
159
+ * Deselects the given value.
160
+ * @param item
161
+ */
162
+ deselect(value) {
163
+ this._selectedItems.delete(value);
164
+ this._updateValue();
165
+ this._changeCallback?.(this._value());
166
+ }
167
+ /**
168
+ * Toggles the selection state of the given value.
169
+ * @param item
170
+ */
171
+ toggle(value) {
172
+ if (this.isSelected(value)) {
173
+ this.deselect(value);
174
+ }
175
+ else {
176
+ this.select(value);
177
+ }
178
+ }
179
+ writeValue(obj) {
180
+ if (this.multiple()) {
181
+ if (obj === null || obj === undefined) {
182
+ obj = [];
183
+ }
184
+ else if (!Array.isArray(obj)) {
185
+ throw Error('invalid value. Expected an array in multiple selection mode.');
186
+ }
187
+ }
188
+ this._value.set(obj);
189
+ this._findAndSelectItems();
190
+ this._changeDetectorRef.markForCheck();
191
+ }
192
+ registerOnChange(fn) {
193
+ this._changeCallback = fn;
194
+ }
195
+ registerOnTouched(fn) {
196
+ this._touchCallback = fn;
197
+ }
198
+ setDisabledState(isDisabled) {
199
+ this._isDisabled.set(isDisabled);
200
+ }
201
+ _findAndSelectItems() {
202
+ let value = this._value();
203
+ let compareBy = this.compareBy();
204
+ let sourceItems = this._sourceItems();
205
+ if (sourceItems == undefined) {
206
+ return;
207
+ }
208
+ let findAndSelect = (v) => {
209
+ let index = sourceItems.findIndex(sourceItem => compareBy(sourceItem, v));
210
+ if (index > -1) {
211
+ let item = sourceItems.at(index);
212
+ this._selectedItems.add(item);
213
+ }
214
+ };
215
+ if (this.multiple()) {
216
+ if (Array.isArray(value)) {
217
+ value.forEach(v => findAndSelect(v));
218
+ }
219
+ }
220
+ else {
221
+ findAndSelect(value);
222
+ }
223
+ }
224
+ _updateValue() {
225
+ let value;
226
+ if (this.multiple()) {
227
+ let values = [];
228
+ this._selectedItems.forEach(v => {
229
+ values.push(this.writeBy()(v));
230
+ });
231
+ value = values;
232
+ }
233
+ else {
234
+ if (this._selectedItems.size > 0) {
235
+ let first = this._selectedItems.values().next().value;
236
+ value = this.writeBy()(first);
237
+ }
238
+ else {
239
+ value = undefined;
240
+ }
241
+ }
242
+ this._value.set(value);
243
+ }
244
+ _onOverlayAttach() {
245
+ this._listenToResizeEvents();
246
+ setTimeout(() => {
247
+ if (this.filterable()) {
248
+ this._filterElementRef?.nativeElement.focus();
249
+ }
250
+ this._listComponent.writeValue(this._value());
251
+ // if (this._activeOptionIndex() > -1) {
252
+ // this._listComponent?.active(this._activeOptionIndex());
253
+ // }
254
+ }, 0);
255
+ }
256
+ _onOverlayDetach() {
257
+ this._unlistenFromResizeEvents();
258
+ this._elementRef.nativeElement.focus();
259
+ this._filterValue.set('');
260
+ this.open.set(false);
261
+ }
262
+ _onListSelectionChange(e) {
263
+ let value = e.item.value();
264
+ if (this.multiple()) {
265
+ this.toggle(value);
266
+ }
267
+ else {
268
+ this.select(value);
269
+ }
270
+ this.itemSelect.emit({ value: e.value, select: this });
271
+ this._changeDetectorRef.detectChanges();
272
+ if (!this.multiple()) {
273
+ this.open.set(false);
274
+ }
275
+ }
276
+ _filterPredicate = computed(() => {
277
+ let filterValue = this._filterValue();
278
+ let filterBy = this.filterBy();
279
+ return (item) => filterBy(item, filterValue);
280
+ }, ...(ngDevMode ? [{ debugName: "_filterPredicate" }] : []));
281
+ _onFilterKeydown(e) {
282
+ let keys = ['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End'];
283
+ if (e.key === 'Tab') {
284
+ e.preventDefault();
285
+ this.open.set(false);
286
+ }
287
+ if (keys.includes(e.key)) {
288
+ e.preventDefault();
289
+ const newEvent = new KeyboardEvent(e.type, e);
290
+ this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);
291
+ }
292
+ }
293
+ _listenToResizeEvents() {
294
+ this._viewportRuler.change().subscribe(x => {
295
+ this.open.set(false);
296
+ });
297
+ // this._resizeObserver = new ResizeObserver(e => {
298
+ // // update overlay size
299
+ // // const width = (e[0].target as HTMLDivElement).offsetWidth;
300
+ // // this._connectedOverlay.overlayRef.updateSize({ width });
301
+ // });
302
+ // this._resizeObserver.observe(this._elementRef.nativeElement);
303
+ }
304
+ _unlistenFromResizeEvents() {
305
+ this._viewpoerRulerSubscription?.unsubscribe();
306
+ this._viewpoerRulerSubscription = undefined;
307
+ // this._resizeObserver?.disconnect();
308
+ // this._resizeObserver = undefined;
309
+ }
310
+ _onHostKeydown(e) {
311
+ let sourceItems = this._sourceItems();
312
+ let itemsCount = sourceItems?.length || 0;
313
+ if (this._isDisabled() || !sourceItems || itemsCount === 0) {
314
+ return;
315
+ }
316
+ if (this.open()) {
317
+ const newEvent = new KeyboardEvent(e.type, e);
318
+ this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);
319
+ return;
320
+ }
321
+ else {
322
+ if (e.key == 'Enter') {
323
+ this.open.set(true);
324
+ e.preventDefault();
325
+ return;
326
+ }
327
+ }
328
+ if (this.multiple()) {
329
+ return;
330
+ }
331
+ let selectedItemindex;
332
+ if (this._selectedItems.size == 0) {
333
+ selectedItemindex = -1;
334
+ }
335
+ else {
336
+ let firstValue = this._selectedItems.values().next().value;
337
+ selectedItemindex = sourceItems.findIndex(i => i === firstValue);
338
+ }
339
+ let newItemIndex = selectedItemindex;
340
+ switch (e.key) {
341
+ case 'ArrowDown':
342
+ if (selectedItemindex < itemsCount - 1) {
343
+ newItemIndex = selectedItemindex + 1;
344
+ this.select(sourceItems[newItemIndex]);
345
+ }
346
+ e.preventDefault();
347
+ break;
348
+ case 'ArrowUp':
349
+ if (selectedItemindex > 0) {
350
+ newItemIndex = selectedItemindex - 1;
351
+ this.select(sourceItems[newItemIndex]);
352
+ }
353
+ e.preventDefault();
354
+ break;
355
+ case 'Home':
356
+ if (itemsCount > 0) {
357
+ newItemIndex = 0;
358
+ this.select(sourceItems[0]);
359
+ }
360
+ e.preventDefault();
361
+ break;
362
+ case 'End':
363
+ if (itemsCount > 0) {
364
+ newItemIndex = itemsCount - 1;
365
+ this.select(sourceItems[newItemIndex]);
366
+ }
367
+ e.preventDefault();
368
+ break;
369
+ }
370
+ if (selectedItemindex != newItemIndex) {
371
+ this.itemSelect.emit({ value: sourceItems[newItemIndex], select: this });
372
+ this._changeDetectorRef.markForCheck();
373
+ }
374
+ }
375
+ _onHostClick(e) {
376
+ if (this._isDisabled() || this.source().isLoading()) {
377
+ return;
378
+ }
379
+ this.open.update(x => !x);
380
+ this._touchCallback?.();
381
+ }
382
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
383
+ 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", itemSelect: "itemSelect" }, 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: [{
384
+ provide: NG_VALUE_ACCESSOR,
385
+ useExisting: forwardRef(() => SelectComponent),
386
+ multi: true
387
+ }], 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 (itemSelect)=\"_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: ["itemSelect"], 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 });
388
+ }
389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectComponent, decorators: [{
390
+ type: Component,
391
+ args: [{ selector: 'ng0-select', exportAs: 'ng0Select', standalone: true, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, imports: [CommonModule, ListModule, OverlayModule], providers: [{
392
+ provide: NG_VALUE_ACCESSOR,
393
+ useExisting: forwardRef(() => SelectComponent),
394
+ multi: true
395
+ }], host: {
396
+ '[class.ng0-select-open]': 'open()',
397
+ '[class.ng0-select-filterable]': 'filterable()',
398
+ '[class.ng0-select-loading]': 'source().isLoading()',
399
+ '[attr.disabled]': '_isDisabled() ? "" : undefined',
400
+ '[attr.aria-disabled]': '_isDisabled() ? "" : undefined',
401
+ '[attr.tabindex]': '_isDisabled() ? undefined : 0',
402
+ }, 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 (itemSelect)=\"_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"] }]
403
+ }], ctorParameters: () => [], propDecorators: { _filterElementRef: [{
404
+ type: ViewChild,
405
+ args: ['filterInput']
406
+ }], _listComponent: [{
407
+ type: ViewChild,
408
+ args: [ListComponent]
409
+ }], itemTemplate: [{
410
+ type: ContentChild,
411
+ args: [TemplateRef]
412
+ }], itemSelect: [{
413
+ type: Output
414
+ }], _onHostKeydown: [{
415
+ type: HostListener,
416
+ args: ['keydown', ['$event']]
417
+ }], _onHostClick: [{
418
+ type: HostListener,
419
+ args: ['click', ['$event']]
420
+ }] } });
421
+
422
+ const Items = [SelectComponent];
423
+ /**
424
+ * Select module.
425
+ */
426
+ class SelectModule {
427
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
428
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "20.2.1", ngImport: i0, type: SelectModule, imports: [SelectComponent], exports: [SelectComponent] });
429
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectModule, imports: [Items] });
430
+ }
431
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.2.1", ngImport: i0, type: SelectModule, decorators: [{
432
+ type: NgModule,
433
+ args: [{
434
+ imports: Items,
435
+ exports: Items
436
+ }]
437
+ }] });
438
+
439
+ // export * from './types';
440
+
441
+ /**
442
+ * Generated bundle index. Do not edit.
443
+ */
444
+
445
+ export { SelectComponent, SelectModule };
446
+ //# sourceMappingURL=bootkit-ng0-components-select.mjs.map
@@ -0,0 +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, signal, model, HostListener, inject, forwardRef, ViewChild, TemplateRef, ContentChild, ViewEncapsulation, ChangeDetectionStrategy, booleanAttribute, ChangeDetectorRef, effect, computed, untracked, Output, EventEmitter } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { dataSourceAttribute, DataSource, DataSourceLike, DataRequest } from '@bootkit/ng0/data';\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 { objectFormatterAttribute, defaultFormatter, LocalizationService } from '@bootkit/ng0/localization';\r\nimport { ListComponent, ListModule, ListItemSelectEvent } from '@bootkit/ng0/components/list';\r\nimport {\r\n CssClassAttribute, equalityComparerAttribute, defaultEqualityComparer, valueWriterAttribute, defaultValueWriter,\r\n IdGeneratorAttribute, defaultFilter, filterPredicateAttribute\r\n} from '@bootkit/ng0/common';\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: [CommonModule, ListModule, OverlayModule],\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-filterable]': 'filterable()',\r\n '[class.ng0-select-loading]': 'source().isLoading()',\r\n '[attr.disabled]': '_isDisabled() ? \"\" : undefined',\r\n '[attr.aria-disabled]': '_isDisabled() ? \"\" : undefined',\r\n '[attr.tabindex]': '_isDisabled() ? undefined : 0',\r\n }\r\n})\r\nexport class SelectComponent implements ControlValueAccessor {\r\n // private _resizeObserver?: ResizeObserver;\r\n private _viewpoerRulerSubscription?: Subscription;\r\n @ViewChild('filterInput') private _filterElementRef?: ElementRef;\r\n @ViewChild(ListComponent) private _listComponent?: ListComponent;\r\n private _changeCallback!: (value: any) => void;\r\n private _touchCallback!: () => void;\r\n protected readonly _sourceItems = signal<any[] | undefined>(undefined);\r\n protected readonly _selectedItems = new Set<any>();\r\n protected readonly _isDisabled = signal<boolean>(false);\r\n protected _positionStrategy!: FlexibleConnectedPositionStrategy;\r\n protected _scrollStrategy!: ScrollStrategy;\r\n private _overlay = inject(Overlay);\r\n private _localizationService = inject(LocalizationService);\r\n protected _elementRef = inject(ElementRef<HTMLDivElement>);\r\n protected readonly _filterValue = signal('');\r\n private _renderer = inject(Renderer2);\r\n private _viewportRuler = inject(ViewportRuler);\r\n private _changeDetectorRef = inject(ChangeDetectorRef);\r\n private readonly _value = signal<any>(undefined);\r\n\r\n /**\r\n * Template for rendering each item in the select component.\r\n */\r\n @ContentChild(TemplateRef) public itemTemplate?: TemplateRef<any>;\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 to show selection indicator (checkbox/radio) next to each item.\r\n * Default is false.\r\n */\r\n public readonly showSelectionIndicator = 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 comparer to compare items for selection.\r\n */\r\n public readonly compareBy = input(defaultEqualityComparer, {\r\n transform: equalityComparerAttribute\r\n });\r\n\r\n /**\r\n * A fromatter to convert each item to a string for display.\r\n */\r\n public readonly formatBy = input(defaultFormatter, {\r\n transform: objectFormatterAttribute(this._localizationService.get())\r\n });\r\n\r\n /**\r\n * Custom value writer to extract the value of any object while writing values.\r\n */\r\n public readonly writeBy = input(defaultValueWriter, {\r\n transform: valueWriterAttribute\r\n });\r\n\r\n /**\r\n * Indicates whether the select component is filterable.\r\n */\r\n public readonly filterable = input(false, { transform: booleanAttribute });\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(defaultFilter, {\r\n transform: filterPredicateAttribute\r\n });\r\n\r\n /**\r\n * Placeholder text for the filter input field.\r\n */\r\n public readonly filterPlaceholder = input<string | undefined>(undefined);\r\n\r\n /**\r\n * CSS class or classes to apply to the items.\r\n */\r\n public readonly itemClass = input(undefined, {\r\n transform: CssClassAttribute\r\n });\r\n\r\n /**\r\n * A function that generates unique ids for each item in the list.\r\n * If set to a function, it will be called with the item as an argument to generate the id.\r\n * If set to undefined, no ids will be generated for the items.\r\n * @default undefined\r\n */\r\n public readonly idGenerator = input(undefined, {\r\n transform: IdGeneratorAttribute\r\n });\r\n\r\n /**\r\n * Event emitted when the selected value changes.\r\n */\r\n @Output() public readonly itemSelect = new EventEmitter<ItemSelectEvent>();\r\n\r\n constructor() {\r\n ['ng0-select', 'form-select'].forEach(c => this._renderer.addClass(this._elementRef.nativeElement, c));\r\n this._scrollStrategy = this._overlay.scrollStrategies.block();\r\n\r\n effect(() => {\r\n let source = this.source();\r\n source.load(new DataRequest()).subscribe(res => {\r\n untracked(() => {\r\n this._sourceItems.set(res.data);\r\n this._findAndSelectItems();\r\n this._changeDetectorRef.markForCheck();\r\n })\r\n });\r\n });\r\n }\r\n\r\n /**\r\n * Indicates whether the given value is selected.\r\n * @param item \r\n * @returns \r\n */\r\n public isSelected(value: any): boolean {\r\n return this._selectedItems.has(value);\r\n }\r\n\r\n /**\r\n * Selects the given value.\r\n * @param item \r\n */\r\n public select(value: any): void {\r\n if (this.multiple()) {\r\n if (!this._selectedItems.has(value)) {\r\n this._selectedItems.add(value);\r\n this._updateValue();\r\n this._changeCallback?.(this._value());\r\n }\r\n } else {\r\n this._selectedItems.clear();\r\n this._selectedItems.add(value);\r\n this._updateValue();\r\n this._changeCallback?.(this._value());\r\n }\r\n }\r\n\r\n /**\r\n * Deselects the given value.\r\n * @param item \r\n */\r\n public deselect(value: any): void {\r\n this._selectedItems.delete(value);\r\n this._updateValue();\r\n this._changeCallback?.(this._value());\r\n }\r\n\r\n /**\r\n * Toggles the selection state of the given value.\r\n * @param item\r\n */\r\n public toggle(value: any): void {\r\n if (this.isSelected(value)) {\r\n this.deselect(value);\r\n } else {\r\n this.select(value);\r\n }\r\n }\r\n\r\n writeValue(obj: any): void {\r\n if (this.multiple()) {\r\n if (obj === null || obj === undefined) {\r\n obj = [];\r\n } else if (!Array.isArray(obj)) {\r\n throw Error('invalid value. Expected an array in multiple selection mode.');\r\n }\r\n }\r\n\r\n this._value.set(obj);\r\n this._findAndSelectItems();\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n\r\n registerOnChange(fn: any): void {\r\n this._changeCallback = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this._touchCallback = fn;\r\n }\r\n\r\n setDisabledState?(isDisabled: boolean): void {\r\n this._isDisabled.set(isDisabled);\r\n }\r\n\r\n private _findAndSelectItems(): void {\r\n let value = this._value();\r\n let compareBy = this.compareBy();\r\n let sourceItems = this._sourceItems();\r\n if (sourceItems == undefined) {\r\n return;\r\n }\r\n\r\n let findAndSelect = (v: any) => {\r\n let index = sourceItems.findIndex(sourceItem => compareBy(sourceItem, v));\r\n if (index > -1) {\r\n let item = sourceItems.at(index)!;\r\n this._selectedItems.add(item);\r\n }\r\n };\r\n\r\n if (this.multiple()) {\r\n if (Array.isArray(value)) {\r\n (value as any[]).forEach(v => findAndSelect(v));\r\n }\r\n } else {\r\n findAndSelect(value);\r\n }\r\n }\r\n\r\n private _updateValue(): void {\r\n let value: any;\r\n\r\n if (this.multiple()) {\r\n let values: any[] = [];\r\n this._selectedItems.forEach(v => {\r\n values.push(this.writeBy()(v));\r\n });\r\n value = values;\r\n } else {\r\n if (this._selectedItems.size > 0) {\r\n let first = this._selectedItems.values().next().value;\r\n value = this.writeBy()(first);\r\n } else {\r\n value = undefined;\r\n }\r\n }\r\n\r\n this._value.set(value);\r\n }\r\n\r\n protected _onOverlayAttach() {\r\n this._listenToResizeEvents();\r\n\r\n setTimeout(() => {\r\n if (this.filterable()) {\r\n this._filterElementRef?.nativeElement.focus();\r\n }\r\n\r\n this._listComponent!.writeValue(this._value());\r\n // if (this._activeOptionIndex() > -1) {\r\n // this._listComponent?.active(this._activeOptionIndex());\r\n // }\r\n }, 0);\r\n }\r\n\r\n protected _onOverlayDetach() {\r\n this._unlistenFromResizeEvents();\r\n this._elementRef!.nativeElement.focus();\r\n this._filterValue.set('');\r\n this.open.set(false);\r\n }\r\n\r\n protected _onListSelectionChange(e: ListItemSelectEvent) {\r\n let value = e.item.value();\r\n\r\n if (this.multiple()) {\r\n this.toggle(value);\r\n } else {\r\n this.select(value);\r\n }\r\n\r\n this.itemSelect.emit({ value: e.value, select: this });\r\n this._changeDetectorRef.detectChanges();\r\n if (!this.multiple()) {\r\n this.open.set(false);\r\n }\r\n }\r\n\r\n protected _filterPredicate = computed(() => {\r\n let filterValue = this._filterValue();\r\n let filterBy = this.filterBy();\r\n\r\n return (item: any) => filterBy(item, filterValue);\r\n })\r\n\r\n protected _onFilterKeydown(e: KeyboardEvent) {\r\n let keys = ['ArrowDown', 'ArrowUp', 'Enter', 'Home', 'End'];\r\n\r\n if (e.key === 'Tab') {\r\n e.preventDefault();\r\n this.open.set(false);\r\n }\r\n\r\n if (keys.includes(e.key)) {\r\n e.preventDefault();\r\n const newEvent = new KeyboardEvent(e.type, e);\r\n this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);\r\n }\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 // // 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._elementRef.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 }\r\n\r\n @HostListener('keydown', ['$event'])\r\n private _onHostKeydown(e: KeyboardEvent) {\r\n let sourceItems = this._sourceItems()\r\n let itemsCount = sourceItems?.length || 0;\r\n\r\n if (this._isDisabled() || !sourceItems || itemsCount === 0) {\r\n return;\r\n }\r\n\r\n if (this.open()) {\r\n const newEvent = new KeyboardEvent(e.type, e);\r\n this._listComponent?.elementRef.nativeElement.dispatchEvent(newEvent);\r\n return;\r\n } else {\r\n if (e.key == 'Enter') {\r\n this.open.set(true);\r\n e.preventDefault();\r\n return;\r\n }\r\n }\r\n\r\n if (this.multiple()) {\r\n return;\r\n }\r\n\r\n let selectedItemindex: number;\r\n if (this._selectedItems.size == 0) {\r\n selectedItemindex = -1\r\n } else {\r\n let firstValue = this._selectedItems.values().next().value;\r\n selectedItemindex = sourceItems.findIndex(i => i === firstValue);\r\n }\r\n\r\n let newItemIndex = selectedItemindex;\r\n\r\n switch (e.key) {\r\n case 'ArrowDown':\r\n if (selectedItemindex < itemsCount - 1) {\r\n newItemIndex = selectedItemindex + 1;\r\n this.select(sourceItems[newItemIndex]);\r\n }\r\n e.preventDefault();\r\n break;\r\n case 'ArrowUp':\r\n if (selectedItemindex > 0) {\r\n newItemIndex = selectedItemindex - 1;\r\n this.select(sourceItems[newItemIndex]);\r\n }\r\n e.preventDefault();\r\n break;\r\n case 'Home':\r\n if (itemsCount > 0) {\r\n newItemIndex = 0;\r\n this.select(sourceItems[0]);\r\n }\r\n e.preventDefault();\r\n break;\r\n case 'End':\r\n if (itemsCount > 0) {\r\n newItemIndex = itemsCount - 1;\r\n this.select(sourceItems[newItemIndex]);\r\n }\r\n e.preventDefault();\r\n break;\r\n }\r\n\r\n if (selectedItemindex != newItemIndex!) {\r\n this.itemSelect.emit({ value: sourceItems[newItemIndex], select: this });\r\n this._changeDetectorRef.markForCheck();\r\n }\r\n }\r\n\r\n @HostListener('click', ['$event'])\r\n private _onHostClick(e: MouseEvent) {\r\n if (this._isDisabled() || this.source().isLoading()) {\r\n return;\r\n }\r\n\r\n this.open.update(x => !x);\r\n this._touchCallback?.();\r\n }\r\n}\r\n\r\n\r\n/**\r\n * Event emitted when the selection state of the select component changes by user interaction.\r\n */\r\nexport interface ItemSelectEvent {\r\n /**\r\n * The value of the item that was selected or deselected.\r\n */\r\n value: any;\r\n\r\n /**\r\n * The select component that emitted the event.\r\n */\r\n readonly select: SelectComponent\r\n}\r\n","@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 (itemSelect)=\"_onListSelectionChange($event)\">\r\n </ng0-select-list>\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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"}