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