@ngstarter-ui/components 21.0.49 → 21.0.50
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/ai/component-registry.json +53 -12
- package/fesm2022/ngstarter-ui-components-country-select.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-country-select.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-currency-select.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-currency-select.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-date-format-select.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-date-format-select.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-filter-builder.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-filter-builder.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-form-builder.mjs +196 -11
- package/fesm2022/ngstarter-ui-components-form-builder.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-image-designer.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-image-designer.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-option.mjs +2 -2
- package/fesm2022/ngstarter-ui-components-option.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-paginator.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-paginator.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-select.mjs +474 -27
- package/fesm2022/ngstarter-ui-components-select.mjs.map +1 -1
- package/fesm2022/ngstarter-ui-components-timezone-select.mjs +1 -1
- package/fesm2022/ngstarter-ui-components-timezone-select.mjs.map +1 -1
- package/package.json +1 -1
- package/styles/_tokens.scss +1 -1
- package/types/ngstarter-ui-components-form-builder.d.ts +42 -2
- package/types/ngstarter-ui-components-select.d.ts +112 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Directive, InjectionToken, inject, TemplateRef, input, numberAttribute, booleanAttribute, contentChild, computed, ChangeDetectionStrategy, Component, ElementRef, ChangeDetectorRef, signal, contentChildren, output, viewChild, model, DestroyRef, effect, untracked, forwardRef } from '@angular/core';
|
|
2
|
+
import { Directive, InjectionToken, inject, TemplateRef, input, numberAttribute, booleanAttribute, contentChild, computed, ChangeDetectionStrategy, Component, ElementRef, ChangeDetectorRef, signal, contentChildren, output, viewChildren, viewChild, model, DestroyRef, effect, untracked, forwardRef } from '@angular/core';
|
|
3
3
|
import { outputToObservable } from '@angular/core/rxjs-interop';
|
|
4
4
|
import { NgControl } from '@angular/forms';
|
|
5
5
|
import { NgTemplateOutlet } from '@angular/common';
|
|
@@ -7,7 +7,7 @@ import { SelectionModel } from '@angular/cdk/collections';
|
|
|
7
7
|
import * as i1 from '@angular/cdk/overlay';
|
|
8
8
|
import { CdkConnectedOverlay, OverlayModule, CdkOverlayOrigin } from '@angular/cdk/overlay';
|
|
9
9
|
import { Subject, takeUntil } from 'rxjs';
|
|
10
|
-
import { OPTION, Optgroup, OPTION_PARENT } from '@ngstarter-ui/components/option';
|
|
10
|
+
import { OPTION, Optgroup, Option, OPTION_PARENT } from '@ngstarter-ui/components/option';
|
|
11
11
|
export { Optgroup, Option } from '@ngstarter-ui/components/option';
|
|
12
12
|
import { FORM_FIELD, FormFieldControl } from '@ngstarter-ui/components/form-field';
|
|
13
13
|
import { AUTOFOCUSABLE } from '@ngstarter-ui/components/core';
|
|
@@ -104,6 +104,49 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
|
|
|
104
104
|
}, styles: [":host{display:block;position:relative;flex:1;overflow:auto;min-height:0;max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px));padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));box-sizing:border-box}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
105
105
|
}] });
|
|
106
106
|
|
|
107
|
+
class SelectHeader {
|
|
108
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
109
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: SelectHeader, isStandalone: true, selector: "ngs-select-header", host: { classAttribute: "ngs-select-header" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
|
|
110
|
+
}
|
|
111
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, decorators: [{
|
|
112
|
+
type: Component,
|
|
113
|
+
args: [{ selector: 'ngs-select-header', standalone: true, imports: [], template: '<ng-content />', host: {
|
|
114
|
+
'class': 'ngs-select-header'
|
|
115
|
+
}, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
116
|
+
}] });
|
|
117
|
+
|
|
118
|
+
class SelectOptionContentDef {
|
|
119
|
+
templateRef = inject(TemplateRef);
|
|
120
|
+
static ngTemplateContextGuard(_directive, _context) {
|
|
121
|
+
return true;
|
|
122
|
+
}
|
|
123
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectOptionContentDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
124
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.4", type: SelectOptionContentDef, isStandalone: true, selector: "ng-template[ngsOptionContentDef]", ngImport: i0 });
|
|
125
|
+
}
|
|
126
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectOptionContentDef, decorators: [{
|
|
127
|
+
type: Directive,
|
|
128
|
+
args: [{
|
|
129
|
+
selector: 'ng-template[ngsOptionContentDef]',
|
|
130
|
+
standalone: true
|
|
131
|
+
}]
|
|
132
|
+
}] });
|
|
133
|
+
|
|
134
|
+
class SelectValueDef {
|
|
135
|
+
templateRef = inject(TemplateRef);
|
|
136
|
+
static ngTemplateContextGuard(_directive, _context) {
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectValueDef, deps: [], target: i0.ɵɵFactoryTarget.Directive });
|
|
140
|
+
static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "21.2.4", type: SelectValueDef, isStandalone: true, selector: "ng-template[ngsSelectValueDef]", ngImport: i0 });
|
|
141
|
+
}
|
|
142
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectValueDef, decorators: [{
|
|
143
|
+
type: Directive,
|
|
144
|
+
args: [{
|
|
145
|
+
selector: 'ng-template[ngsSelectValueDef]',
|
|
146
|
+
standalone: true
|
|
147
|
+
}]
|
|
148
|
+
}] });
|
|
149
|
+
|
|
107
150
|
class SelectChange {
|
|
108
151
|
source;
|
|
109
152
|
value;
|
|
@@ -134,6 +177,12 @@ class Select {
|
|
|
134
177
|
multiple = input(false, { ...(ngDevMode ? { debugName: "multiple" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
135
178
|
hideCheckIcon = input(false, { ...(ngDevMode ? { debugName: "hideCheckIcon" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
136
179
|
clearable = input(false, { ...(ngDevMode ? { debugName: "clearable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
180
|
+
dataSource = input(null, ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
|
|
181
|
+
pageSize = input(25, { ...(ngDevMode ? { debugName: "pageSize" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
182
|
+
searchable = input(false, { ...(ngDevMode ? { debugName: "searchable" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
183
|
+
searchDebounce = input(250, { ...(ngDevMode ? { debugName: "searchDebounce" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
184
|
+
minSearchLength = input(0, { ...(ngDevMode ? { debugName: "minSearchLength" } : /* istanbul ignore next */ {}), transform: numberAttribute });
|
|
185
|
+
loadOnOpen = input(true, { ...(ngDevMode ? { debugName: "loadOnOpen" } : /* istanbul ignore next */ {}), transform: booleanAttribute });
|
|
137
186
|
ariaLabel = input(null, { ...(ngDevMode ? { debugName: "ariaLabel" } : /* istanbul ignore next */ {}), alias: 'aria-label' });
|
|
138
187
|
tabIndex = input(0, { ...(ngDevMode ? { debugName: "tabIndex" } : /* istanbul ignore next */ {}), transform: (value) => value == null ? 0 : parseInt(value + '', 10) });
|
|
139
188
|
ariaDescribedby = input(null, { ...(ngDevMode ? { debugName: "ariaDescribedby" } : /* istanbul ignore next */ {}), alias: 'aria-describedby' });
|
|
@@ -142,10 +191,17 @@ class Select {
|
|
|
142
191
|
selectionChange = output();
|
|
143
192
|
opened = output();
|
|
144
193
|
closed = output();
|
|
145
|
-
|
|
194
|
+
projectedOptions = contentChildren(OPTION, { ...(ngDevMode ? { debugName: "projectedOptions" } : /* istanbul ignore next */ {}), descendants: true });
|
|
195
|
+
dataSourceOptions = viewChildren(OPTION, ...(ngDevMode ? [{ debugName: "dataSourceOptions" }] : /* istanbul ignore next */ []));
|
|
196
|
+
options = computed(() => [
|
|
197
|
+
...this.projectedOptions(),
|
|
198
|
+
...this.dataSourceOptions()
|
|
199
|
+
], ...(ngDevMode ? [{ debugName: "options" }] : /* istanbul ignore next */ []));
|
|
146
200
|
optionGroups = contentChildren(Optgroup, { ...(ngDevMode ? { debugName: "optionGroups" } : /* istanbul ignore next */ {}), descendants: true });
|
|
147
201
|
customTrigger = contentChildren(SelectTrigger, { ...(ngDevMode ? { debugName: "customTrigger" } : /* istanbul ignore next */ {}), descendants: true });
|
|
148
202
|
filterTrigger = contentChildren(FilterTrigger, { ...(ngDevMode ? { debugName: "filterTrigger" } : /* istanbul ignore next */ {}), descendants: true });
|
|
203
|
+
optionContentDef = contentChild(SelectOptionContentDef, { ...(ngDevMode ? { debugName: "optionContentDef" } : /* istanbul ignore next */ {}), descendants: true });
|
|
204
|
+
selectValueDef = contentChild(SelectValueDef, { ...(ngDevMode ? { debugName: "selectValueDef" } : /* istanbul ignore next */ {}), descendants: true });
|
|
149
205
|
overlayDir = viewChild(CdkConnectedOverlay, ...(ngDevMode ? [{ debugName: "overlayDir" }] : /* istanbul ignore next */ []));
|
|
150
206
|
panel = viewChild('panel', ...(ngDevMode ? [{ debugName: "panel" }] : /* istanbul ignore next */ []));
|
|
151
207
|
origin = viewChild('origin', ...(ngDevMode ? [{ debugName: "origin" }] : /* istanbul ignore next */ []));
|
|
@@ -172,10 +228,34 @@ class Select {
|
|
|
172
228
|
_optionsContentChanges = signal(0, ...(ngDevMode ? [{ debugName: "_optionsContentChanges" }] : /* istanbul ignore next */ []));
|
|
173
229
|
_errorState = signal(false, ...(ngDevMode ? [{ debugName: "_errorState" }] : /* istanbul ignore next */ []));
|
|
174
230
|
get errorState() { return this._errorState(); }
|
|
231
|
+
asyncOptions = signal([], ...(ngDevMode ? [{ debugName: "asyncOptions" }] : /* istanbul ignore next */ []));
|
|
232
|
+
asyncSearch = signal('', ...(ngDevMode ? [{ debugName: "asyncSearch" }] : /* istanbul ignore next */ []));
|
|
233
|
+
asyncLoading = signal(false, ...(ngDevMode ? [{ debugName: "asyncLoading" }] : /* istanbul ignore next */ []));
|
|
234
|
+
asyncLoadingMore = signal(false, ...(ngDevMode ? [{ debugName: "asyncLoadingMore" }] : /* istanbul ignore next */ []));
|
|
235
|
+
asyncError = signal(null, ...(ngDevMode ? [{ debugName: "asyncError" }] : /* istanbul ignore next */ []));
|
|
236
|
+
asyncHasMore = signal(false, ...(ngDevMode ? [{ debugName: "asyncHasMore" }] : /* istanbul ignore next */ []));
|
|
237
|
+
asyncEnabled = computed(() => !!this.dataSource(), ...(ngDevMode ? [{ debugName: "asyncEnabled" }] : /* istanbul ignore next */ []));
|
|
238
|
+
_asyncSelectedCache = signal([], ...(ngDevMode ? [{ debugName: "_asyncSelectedCache" }] : /* istanbul ignore next */ []));
|
|
239
|
+
_asyncPage = 0;
|
|
240
|
+
_asyncCursor;
|
|
241
|
+
_asyncSearchTimer = null;
|
|
242
|
+
_asyncRequestId = 0;
|
|
243
|
+
_asyncAbortController = null;
|
|
244
|
+
_lastDataSource = undefined;
|
|
245
|
+
_lastInitialSelectedKey = '';
|
|
246
|
+
_destroyed = false;
|
|
175
247
|
_empty = computed(() => {
|
|
176
248
|
this._selectionChanges();
|
|
249
|
+
this._asyncSelectedCache();
|
|
250
|
+
this.asyncOptions();
|
|
177
251
|
const value = this.value();
|
|
178
252
|
const isValueEmpty = value === null || value === undefined || value === '' || (Array.isArray(value) && value.length === 0);
|
|
253
|
+
if (isValueEmpty) {
|
|
254
|
+
return true;
|
|
255
|
+
}
|
|
256
|
+
if (this.asyncEnabled()) {
|
|
257
|
+
return this._selectedValues(value).every(selectedValue => !this._asyncOptionForValue(selectedValue));
|
|
258
|
+
}
|
|
179
259
|
const isEmpty = (this._selectionModel?.isEmpty() ?? true) && isValueEmpty;
|
|
180
260
|
return isEmpty;
|
|
181
261
|
}, ...(ngDevMode ? [{ debugName: "_empty" }] : /* istanbul ignore next */ []));
|
|
@@ -228,6 +308,18 @@ class Select {
|
|
|
228
308
|
}
|
|
229
309
|
});
|
|
230
310
|
});
|
|
311
|
+
effect(() => {
|
|
312
|
+
const dataSource = this.dataSource();
|
|
313
|
+
untracked(() => {
|
|
314
|
+
if (dataSource !== this._lastDataSource) {
|
|
315
|
+
this._lastDataSource = dataSource;
|
|
316
|
+
this._resetAsyncState();
|
|
317
|
+
}
|
|
318
|
+
if (!dataSource) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
});
|
|
322
|
+
});
|
|
231
323
|
effect(() => {
|
|
232
324
|
this._optionsContentChanges();
|
|
233
325
|
untracked(() => {
|
|
@@ -242,13 +334,19 @@ class Select {
|
|
|
242
334
|
this._selectionChanges();
|
|
243
335
|
this.options();
|
|
244
336
|
this._optionsContentChanges();
|
|
337
|
+
this._asyncSelectedCache();
|
|
338
|
+
this.asyncOptions();
|
|
245
339
|
if (this.empty) {
|
|
246
340
|
return '';
|
|
247
341
|
}
|
|
248
342
|
if (this.multiple()) {
|
|
249
|
-
|
|
343
|
+
const values = this._selectedValues(this.value());
|
|
344
|
+
return values
|
|
345
|
+
.map(value => this._viewValueForValue(value))
|
|
346
|
+
.filter(value => value.length > 0)
|
|
347
|
+
.join(', ');
|
|
250
348
|
}
|
|
251
|
-
return this._selectionModel.selected[0]?.viewValue || '';
|
|
349
|
+
return this._selectionModel.selected[0]?.viewValue || this._viewValueForValue(this.value()) || '';
|
|
252
350
|
}, ...(ngDevMode ? [{ debugName: "triggerValue" }] : /* istanbul ignore next */ []));
|
|
253
351
|
selectedCount = computed(() => {
|
|
254
352
|
this._selectionChanges();
|
|
@@ -264,12 +362,66 @@ class Select {
|
|
|
264
362
|
}, ...(ngDevMode ? [{ debugName: "selectedCount" }] : /* istanbul ignore next */ []));
|
|
265
363
|
selectedData = computed(() => {
|
|
266
364
|
this._selectionChanges();
|
|
365
|
+
this._asyncSelectedCache();
|
|
366
|
+
this.asyncOptions();
|
|
367
|
+
if (this.asyncEnabled()) {
|
|
368
|
+
if (this.multiple()) {
|
|
369
|
+
return this._selectedValues(this.value()).map(value => this._dataForValue(value));
|
|
370
|
+
}
|
|
371
|
+
const value = this.value();
|
|
372
|
+
return value === null || value === undefined || value === '' ? null : this._dataForValue(value);
|
|
373
|
+
}
|
|
267
374
|
if (this.multiple()) {
|
|
268
375
|
return this._selectionModel.selected.map(option => this._getOptionData(option));
|
|
269
376
|
}
|
|
270
377
|
const selectedOption = this._selectionModel.selected[0];
|
|
271
378
|
return selectedOption ? this._getOptionData(selectedOption) : null;
|
|
272
379
|
}, ...(ngDevMode ? [{ debugName: "selectedData" }] : /* istanbul ignore next */ []));
|
|
380
|
+
selectValueContext = computed(() => {
|
|
381
|
+
this._selectionChanges();
|
|
382
|
+
this._asyncSelectedCache();
|
|
383
|
+
this.asyncOptions();
|
|
384
|
+
const values = this._selectedValues(this.value());
|
|
385
|
+
const labels = values.map(value => this._viewValueForValue(value)).filter(label => label.length > 0);
|
|
386
|
+
const options = values
|
|
387
|
+
.map(value => this._displayOptionForValue(value))
|
|
388
|
+
.filter((option) => !!option);
|
|
389
|
+
if (this.multiple()) {
|
|
390
|
+
const data = values.map(value => this._dataForValue(value));
|
|
391
|
+
return {
|
|
392
|
+
$implicit: data,
|
|
393
|
+
data,
|
|
394
|
+
option: options,
|
|
395
|
+
value: values,
|
|
396
|
+
label: labels.join(', '),
|
|
397
|
+
labels,
|
|
398
|
+
count: values.length,
|
|
399
|
+
multiple: true
|
|
400
|
+
};
|
|
401
|
+
}
|
|
402
|
+
const value = values[0] ?? null;
|
|
403
|
+
const data = value === null ? null : this._dataForValue(value);
|
|
404
|
+
return {
|
|
405
|
+
$implicit: data,
|
|
406
|
+
data,
|
|
407
|
+
option: options[0] ?? null,
|
|
408
|
+
value,
|
|
409
|
+
label: labels[0] ?? '',
|
|
410
|
+
labels,
|
|
411
|
+
count: values.length,
|
|
412
|
+
multiple: false
|
|
413
|
+
};
|
|
414
|
+
}, ...(ngDevMode ? [{ debugName: "selectValueContext" }] : /* istanbul ignore next */ []));
|
|
415
|
+
selectValueTemplateReady = computed(() => {
|
|
416
|
+
this._selectionChanges();
|
|
417
|
+
this._asyncSelectedCache();
|
|
418
|
+
this.asyncOptions();
|
|
419
|
+
if (!this.asyncEnabled()) {
|
|
420
|
+
return true;
|
|
421
|
+
}
|
|
422
|
+
const values = this._selectedValues(this.value());
|
|
423
|
+
return values.length > 0 && values.every(value => !!this._asyncOptionForValue(value));
|
|
424
|
+
}, ...(ngDevMode ? [{ debugName: "selectValueTemplateReady" }] : /* istanbul ignore next */ []));
|
|
273
425
|
ngAfterContentInit() {
|
|
274
426
|
}
|
|
275
427
|
_resetOptions() {
|
|
@@ -285,6 +437,8 @@ class Select {
|
|
|
285
437
|
});
|
|
286
438
|
}
|
|
287
439
|
ngOnDestroy() {
|
|
440
|
+
this._destroyed = true;
|
|
441
|
+
this._asyncAbortController?.abort();
|
|
288
442
|
this._destroy.next();
|
|
289
443
|
this._destroy.complete();
|
|
290
444
|
this._optionsDestroy.next();
|
|
@@ -314,6 +468,22 @@ class Select {
|
|
|
314
468
|
this._focused.set(true);
|
|
315
469
|
this.stateChanges.set(undefined);
|
|
316
470
|
this.opened.emit();
|
|
471
|
+
if (this.dataSource() && this.loadOnOpen() && !this.asyncLoading()) {
|
|
472
|
+
const selectedValues = this._selectedValues(this.value());
|
|
473
|
+
const selectedKey = this._selectedValuesKey(selectedValues);
|
|
474
|
+
const initialKey = `${this.pageSize()}:${selectedKey}`;
|
|
475
|
+
const missingSelectedOption = selectedValues.some(value => !this._asyncOptionForValue(value));
|
|
476
|
+
const shouldLoadOptions = this.asyncOptions().length === 0 || missingSelectedOption;
|
|
477
|
+
if (shouldLoadOptions) {
|
|
478
|
+
const reason = selectedValues.length > 0 && missingSelectedOption && initialKey !== this._lastInitialSelectedKey
|
|
479
|
+
? 'initial'
|
|
480
|
+
: 'open';
|
|
481
|
+
if (reason === 'initial') {
|
|
482
|
+
this._lastInitialSelectedKey = initialKey;
|
|
483
|
+
}
|
|
484
|
+
void this._loadFirstPage(reason);
|
|
485
|
+
}
|
|
486
|
+
}
|
|
317
487
|
setTimeout(() => {
|
|
318
488
|
this._scrollToSelectedOption();
|
|
319
489
|
}, 10);
|
|
@@ -393,7 +563,55 @@ class Select {
|
|
|
393
563
|
this.close();
|
|
394
564
|
}
|
|
395
565
|
}
|
|
566
|
+
onAsyncSearchInput(value) {
|
|
567
|
+
this.asyncSearch.set(value);
|
|
568
|
+
if (this._asyncSearchTimer) {
|
|
569
|
+
clearTimeout(this._asyncSearchTimer);
|
|
570
|
+
}
|
|
571
|
+
this._asyncSearchTimer = setTimeout(() => {
|
|
572
|
+
this._asyncSearchTimer = null;
|
|
573
|
+
if (value.length > 0 && value.length < this.minSearchLength()) {
|
|
574
|
+
this.asyncOptions.set([]);
|
|
575
|
+
this.asyncHasMore.set(false);
|
|
576
|
+
this.asyncError.set(null);
|
|
577
|
+
return;
|
|
578
|
+
}
|
|
579
|
+
void this._loadFirstPage('search');
|
|
580
|
+
}, Math.max(0, this.searchDebounce()));
|
|
581
|
+
}
|
|
582
|
+
onAsyncContentScroll(event) {
|
|
583
|
+
const target = event.target;
|
|
584
|
+
if (!target || !this.asyncHasMore() || this.asyncLoading() || this.asyncLoadingMore()) {
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
const threshold = 32;
|
|
588
|
+
const remaining = target.scrollHeight - target.scrollTop - target.clientHeight;
|
|
589
|
+
if (remaining <= threshold) {
|
|
590
|
+
void this._loadNextPage();
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
retryAsyncLoad() {
|
|
594
|
+
void this._loadFirstPage(this.asyncSearch() ? 'search' : 'open');
|
|
595
|
+
}
|
|
596
|
+
asyncOptionContext(option) {
|
|
597
|
+
const selected = this._selectedValues(this.value())
|
|
598
|
+
.some(value => this._compareValues(value, option.value));
|
|
599
|
+
return {
|
|
600
|
+
$implicit: option.data === undefined ? option.value : option.data,
|
|
601
|
+
data: option.data === undefined ? option.value : option.data,
|
|
602
|
+
option,
|
|
603
|
+
value: option.value,
|
|
604
|
+
label: option.label,
|
|
605
|
+
selected,
|
|
606
|
+
disabled: option.disabled === true,
|
|
607
|
+
multiple: this.multiple()
|
|
608
|
+
};
|
|
609
|
+
}
|
|
396
610
|
_selectOption(option) {
|
|
611
|
+
if (this.asyncEnabled() && this.multiple()) {
|
|
612
|
+
this._selectAsyncMultipleOption(option);
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
397
615
|
const wasSelected = this._selectionModel.isSelected(option);
|
|
398
616
|
if (this.multiple()) {
|
|
399
617
|
this._selectionModel.toggle(option);
|
|
@@ -405,6 +623,19 @@ class Select {
|
|
|
405
623
|
this._propagateChanges();
|
|
406
624
|
}
|
|
407
625
|
}
|
|
626
|
+
_selectAsyncMultipleOption(option) {
|
|
627
|
+
const optionValue = option.value();
|
|
628
|
+
const selectedValues = this._selectedValues(this.value());
|
|
629
|
+
const selectedIndex = selectedValues.findIndex(value => this._compareValues(value, optionValue));
|
|
630
|
+
const nextValues = selectedIndex >= 0
|
|
631
|
+
? selectedValues.filter((_, index) => index !== selectedIndex)
|
|
632
|
+
: [...selectedValues, optionValue];
|
|
633
|
+
this.value.set(nextValues);
|
|
634
|
+
this._setSelectionByValue(nextValues);
|
|
635
|
+
this._onChange(nextValues);
|
|
636
|
+
this.selectionChange.emit(new SelectChange(this, nextValues));
|
|
637
|
+
this._cdr.markForCheck();
|
|
638
|
+
}
|
|
408
639
|
_propagateChanges() {
|
|
409
640
|
let valueToEmit;
|
|
410
641
|
if (this.multiple()) {
|
|
@@ -452,6 +683,25 @@ class Select {
|
|
|
452
683
|
}
|
|
453
684
|
}
|
|
454
685
|
const option = selected.elementRef.nativeElement;
|
|
686
|
+
this._scrollOptionElementIntoContainer(option, scrollContainer);
|
|
687
|
+
}
|
|
688
|
+
_scrollToAsyncOptionValue(value) {
|
|
689
|
+
const panel = this.panel()?.nativeElement;
|
|
690
|
+
if (!panel) {
|
|
691
|
+
return;
|
|
692
|
+
}
|
|
693
|
+
const scrollContainer = panel.querySelector('.ngs-select-async-content');
|
|
694
|
+
if (!scrollContainer) {
|
|
695
|
+
return;
|
|
696
|
+
}
|
|
697
|
+
const option = this.dataSourceOptions()
|
|
698
|
+
.find(option => this._compareValues(option.value(), value));
|
|
699
|
+
if (!option) {
|
|
700
|
+
return;
|
|
701
|
+
}
|
|
702
|
+
this._scrollOptionElementIntoContainer(option.elementRef.nativeElement, scrollContainer);
|
|
703
|
+
}
|
|
704
|
+
_scrollOptionElementIntoContainer(option, scrollContainer) {
|
|
455
705
|
let offsetTop = 0;
|
|
456
706
|
let currentElement = option;
|
|
457
707
|
while (currentElement && currentElement !== scrollContainer && scrollContainer.contains(currentElement)) {
|
|
@@ -462,10 +712,10 @@ class Select {
|
|
|
462
712
|
const containerScrollTop = scrollContainer.scrollTop;
|
|
463
713
|
const containerHeight = scrollContainer.clientHeight;
|
|
464
714
|
if (offsetTop < containerScrollTop) {
|
|
465
|
-
scrollContainer
|
|
715
|
+
this._setScrollTop(scrollContainer, offsetTop);
|
|
466
716
|
}
|
|
467
717
|
else if (offsetTop + optionHeight > containerScrollTop + containerHeight) {
|
|
468
|
-
scrollContainer
|
|
718
|
+
this._setScrollTop(scrollContainer, offsetTop - containerHeight + optionHeight);
|
|
469
719
|
}
|
|
470
720
|
// Дополнительная проверка: если скролл все еще не там, попробуем через getBoundingClientRect
|
|
471
721
|
// но только как fallback, так как offsetTop надежнее если offsetParent настроены верно.
|
|
@@ -474,13 +724,21 @@ class Select {
|
|
|
474
724
|
if (optionRect.top < containerRect.top || optionRect.bottom > containerRect.bottom) {
|
|
475
725
|
const relativeOffsetTop = optionRect.top - containerRect.top + scrollContainer.scrollTop;
|
|
476
726
|
if (relativeOffsetTop < scrollContainer.scrollTop) {
|
|
477
|
-
scrollContainer
|
|
727
|
+
this._setScrollTop(scrollContainer, relativeOffsetTop);
|
|
478
728
|
}
|
|
479
729
|
else if (relativeOffsetTop + optionHeight > scrollContainer.scrollTop + containerHeight) {
|
|
480
|
-
scrollContainer
|
|
730
|
+
this._setScrollTop(scrollContainer, relativeOffsetTop - containerHeight + optionHeight);
|
|
481
731
|
}
|
|
482
732
|
}
|
|
483
733
|
}
|
|
734
|
+
_setScrollTop(element, value) {
|
|
735
|
+
try {
|
|
736
|
+
element.scrollTop = value;
|
|
737
|
+
}
|
|
738
|
+
catch {
|
|
739
|
+
// Some test DOM mocks expose scrollTop as read-only.
|
|
740
|
+
}
|
|
741
|
+
}
|
|
484
742
|
_getOptionIndex(option) {
|
|
485
743
|
return this.options().indexOf(option);
|
|
486
744
|
}
|
|
@@ -504,8 +762,205 @@ class Select {
|
|
|
504
762
|
this._selectionModel.select(correspondingOption);
|
|
505
763
|
}
|
|
506
764
|
}
|
|
765
|
+
async _loadFirstPage(reason) {
|
|
766
|
+
await this._loadAsyncPage({ reason, append: false });
|
|
767
|
+
}
|
|
768
|
+
async _loadNextPage() {
|
|
769
|
+
await this._loadAsyncPage({ reason: 'page', append: true });
|
|
770
|
+
}
|
|
771
|
+
async _loadAsyncPage(config) {
|
|
772
|
+
const dataSource = this.dataSource();
|
|
773
|
+
if (!dataSource) {
|
|
774
|
+
return;
|
|
775
|
+
}
|
|
776
|
+
if (config.append && (!this.asyncHasMore() || this.asyncLoadingMore())) {
|
|
777
|
+
return;
|
|
778
|
+
}
|
|
779
|
+
this._asyncAbortController?.abort();
|
|
780
|
+
const abortController = new AbortController();
|
|
781
|
+
this._asyncAbortController = abortController;
|
|
782
|
+
const requestId = ++this._asyncRequestId;
|
|
783
|
+
const nextPage = config.append ? this._asyncPage + 1 : 1;
|
|
784
|
+
let firstLoadedOptionValue;
|
|
785
|
+
let hasLoadedOptionToScroll = false;
|
|
786
|
+
if (config.append) {
|
|
787
|
+
this.asyncLoadingMore.set(true);
|
|
788
|
+
}
|
|
789
|
+
else {
|
|
790
|
+
this.asyncLoading.set(true);
|
|
791
|
+
this.asyncError.set(null);
|
|
792
|
+
this._asyncPage = 0;
|
|
793
|
+
this._asyncCursor = undefined;
|
|
794
|
+
this.asyncHasMore.set(false);
|
|
795
|
+
}
|
|
796
|
+
try {
|
|
797
|
+
const result = await dataSource({
|
|
798
|
+
search: this.asyncSearch(),
|
|
799
|
+
page: nextPage,
|
|
800
|
+
pageSize: this.pageSize(),
|
|
801
|
+
cursor: config.append ? this._asyncCursor : undefined,
|
|
802
|
+
selectedValues: this._selectedValues(this.value()),
|
|
803
|
+
reason: config.reason,
|
|
804
|
+
signal: abortController.signal
|
|
805
|
+
});
|
|
806
|
+
if (requestId !== this._asyncRequestId || abortController.signal.aborted) {
|
|
807
|
+
return;
|
|
808
|
+
}
|
|
809
|
+
const normalized = this._normalizeAsyncResult(result);
|
|
810
|
+
const items = config.append
|
|
811
|
+
? this._mergeAsyncOptions(this.asyncOptions(), normalized.items)
|
|
812
|
+
: this._mergeAsyncOptions([], normalized.items);
|
|
813
|
+
const firstLoadedOption = normalized.items[0];
|
|
814
|
+
if (firstLoadedOption) {
|
|
815
|
+
firstLoadedOptionValue = firstLoadedOption.value;
|
|
816
|
+
hasLoadedOptionToScroll = true;
|
|
817
|
+
}
|
|
818
|
+
this.asyncOptions.set(items);
|
|
819
|
+
this._cacheAsyncSelectedOptions(normalized.items);
|
|
820
|
+
this.asyncHasMore.set(!!normalized.hasMore);
|
|
821
|
+
this._asyncCursor = normalized.nextCursor;
|
|
822
|
+
this._asyncPage = nextPage;
|
|
823
|
+
this.asyncError.set(null);
|
|
824
|
+
this._optionsContentChanges.update(v => v + 1);
|
|
825
|
+
}
|
|
826
|
+
catch (error) {
|
|
827
|
+
if (requestId === this._asyncRequestId && !abortController.signal.aborted) {
|
|
828
|
+
this.asyncError.set(error);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
finally {
|
|
832
|
+
if (requestId === this._asyncRequestId) {
|
|
833
|
+
this.asyncLoading.set(false);
|
|
834
|
+
this.asyncLoadingMore.set(false);
|
|
835
|
+
if (!this._destroyed) {
|
|
836
|
+
this._cdr.detectChanges();
|
|
837
|
+
if (hasLoadedOptionToScroll) {
|
|
838
|
+
this._scrollToAsyncOptionValue(firstLoadedOptionValue);
|
|
839
|
+
}
|
|
840
|
+
this._cdr.markForCheck();
|
|
841
|
+
}
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
}
|
|
845
|
+
_normalizeAsyncResult(result) {
|
|
846
|
+
if (Array.isArray(result)) {
|
|
847
|
+
return {
|
|
848
|
+
items: result,
|
|
849
|
+
hasMore: false
|
|
850
|
+
};
|
|
851
|
+
}
|
|
852
|
+
return {
|
|
853
|
+
...result,
|
|
854
|
+
items: result.items ?? []
|
|
855
|
+
};
|
|
856
|
+
}
|
|
857
|
+
_mergeAsyncOptions(current, incoming) {
|
|
858
|
+
const merged = [...current];
|
|
859
|
+
incoming.forEach(option => {
|
|
860
|
+
const existingIndex = merged.findIndex(currentOption => this._compareValues(currentOption.value, option.value));
|
|
861
|
+
if (existingIndex >= 0) {
|
|
862
|
+
merged[existingIndex] = option;
|
|
863
|
+
}
|
|
864
|
+
else {
|
|
865
|
+
merged.push(option);
|
|
866
|
+
}
|
|
867
|
+
});
|
|
868
|
+
return merged;
|
|
869
|
+
}
|
|
870
|
+
_cacheAsyncSelectedOptions(options) {
|
|
871
|
+
const selectedValues = this._selectedValues(this.value());
|
|
872
|
+
if (selectedValues.length === 0) {
|
|
873
|
+
this._asyncSelectedCache.set([]);
|
|
874
|
+
return;
|
|
875
|
+
}
|
|
876
|
+
const cached = this._mergeAsyncOptions(this._asyncSelectedCache(), options)
|
|
877
|
+
.filter(option => selectedValues.some(value => this._compareValues(value, option.value)));
|
|
878
|
+
this._asyncSelectedCache.set(cached);
|
|
879
|
+
}
|
|
880
|
+
_resetAsyncState() {
|
|
881
|
+
this._asyncAbortController?.abort();
|
|
882
|
+
this._asyncRequestId++;
|
|
883
|
+
this.asyncOptions.set([]);
|
|
884
|
+
this.asyncSearch.set('');
|
|
885
|
+
this.asyncLoading.set(false);
|
|
886
|
+
this.asyncLoadingMore.set(false);
|
|
887
|
+
this.asyncError.set(null);
|
|
888
|
+
this.asyncHasMore.set(false);
|
|
889
|
+
this._asyncSelectedCache.set([]);
|
|
890
|
+
this._asyncPage = 0;
|
|
891
|
+
this._asyncCursor = undefined;
|
|
892
|
+
this._lastInitialSelectedKey = '';
|
|
893
|
+
}
|
|
894
|
+
_selectedValues(value) {
|
|
895
|
+
if (this.multiple()) {
|
|
896
|
+
return Array.isArray(value)
|
|
897
|
+
? value.filter(item => item !== null && item !== undefined && item !== '')
|
|
898
|
+
: [];
|
|
899
|
+
}
|
|
900
|
+
return value === null || value === undefined || value === '' ? [] : [value];
|
|
901
|
+
}
|
|
902
|
+
_selectedValuesKey(values) {
|
|
903
|
+
return values.map(value => `${typeof value}:${String(value)}`).join('|');
|
|
904
|
+
}
|
|
905
|
+
_viewValueForValue(value) {
|
|
906
|
+
const asyncOption = this._asyncOptionForValue(value);
|
|
907
|
+
if (asyncOption) {
|
|
908
|
+
return asyncOption.label;
|
|
909
|
+
}
|
|
910
|
+
const option = this._optionForValue(value);
|
|
911
|
+
if (option) {
|
|
912
|
+
return option.viewValue;
|
|
913
|
+
}
|
|
914
|
+
return '';
|
|
915
|
+
}
|
|
916
|
+
_dataForValue(value) {
|
|
917
|
+
const option = this._optionForValue(value);
|
|
918
|
+
if (option) {
|
|
919
|
+
return this._getOptionData(option);
|
|
920
|
+
}
|
|
921
|
+
const asyncOption = this._asyncOptionForValue(value);
|
|
922
|
+
if (this.asyncEnabled()) {
|
|
923
|
+
return asyncOption?.data ?? null;
|
|
924
|
+
}
|
|
925
|
+
return value;
|
|
926
|
+
}
|
|
927
|
+
_displayOptionForValue(value) {
|
|
928
|
+
const asyncOption = this._asyncOptionForValue(value);
|
|
929
|
+
if (asyncOption) {
|
|
930
|
+
return asyncOption;
|
|
931
|
+
}
|
|
932
|
+
const option = this._optionForValue(value);
|
|
933
|
+
if (option) {
|
|
934
|
+
const data = this._getOptionData(option);
|
|
935
|
+
return {
|
|
936
|
+
label: option.viewValue,
|
|
937
|
+
value: option.value(),
|
|
938
|
+
data
|
|
939
|
+
};
|
|
940
|
+
}
|
|
941
|
+
return undefined;
|
|
942
|
+
}
|
|
943
|
+
_optionForValue(value) {
|
|
944
|
+
return this.options().find(option => {
|
|
945
|
+
try {
|
|
946
|
+
return option.value() != null && this._compareValues(option.value(), value);
|
|
947
|
+
}
|
|
948
|
+
catch {
|
|
949
|
+
return false;
|
|
950
|
+
}
|
|
951
|
+
});
|
|
952
|
+
}
|
|
953
|
+
_asyncOptionForValue(value) {
|
|
954
|
+
return [
|
|
955
|
+
...this.asyncOptions(),
|
|
956
|
+
...this._asyncSelectedCache()
|
|
957
|
+
].find(option => this._compareValues(option.value, value));
|
|
958
|
+
}
|
|
959
|
+
_compareValues(first, second) {
|
|
960
|
+
return first === second || Object.is(first, second);
|
|
961
|
+
}
|
|
507
962
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Select, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
508
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: Select, isStandalone: true, selector: "ngs-select", inputs: { _id: { classPropertyName: "_id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledInput: { classPropertyName: "_disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, hideCheckIcon: { classPropertyName: "hideCheckIcon", publicName: "hideCheckIcon", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", opened: "opened", closed: "closed", value: "valueChange" }, host: { attributes: { "role": "combobox", "aria-autocomplete": "none", "aria-haspopup": "listbox" }, listeners: { "click": "toggle()", "keydown": "_handleKeydown($event)", "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex()", "attr.aria-controls": "panelOpen() ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen()", "attr.aria-label": "ariaLabel()", "attr.aria-required": "required", "attr.aria-disabled": "disabled", "attr.aria-invalid": "errorState", "class.ngs-select-disabled": "disabled", "class.ngs-select-invalid": "errorState", "class.ngs-select-required": "required", "class.ngs-select-empty": "empty", "class.ngs-select-panel-open": "panelOpen()", "class.ngs-select-has-filter-trigger": "filterTrigger().length > 0", "class.ngs-select-clearable": "clearable()", "class.ngs-select-has-clear": "showClearButton()" } }, providers: [
|
|
963
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.4", type: Select, isStandalone: true, selector: "ngs-select", inputs: { _id: { classPropertyName: "_id", publicName: "id", isSignal: true, isRequired: false, transformFunction: null }, _placeholder: { classPropertyName: "_placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, _disabledInput: { classPropertyName: "_disabledInput", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, _required: { classPropertyName: "_required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, hideCheckIcon: { classPropertyName: "hideCheckIcon", publicName: "hideCheckIcon", isSignal: true, isRequired: false, transformFunction: null }, clearable: { classPropertyName: "clearable", publicName: "clearable", isSignal: true, isRequired: false, transformFunction: null }, dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, pageSize: { classPropertyName: "pageSize", publicName: "pageSize", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, searchDebounce: { classPropertyName: "searchDebounce", publicName: "searchDebounce", isSignal: true, isRequired: false, transformFunction: null }, minSearchLength: { classPropertyName: "minSearchLength", publicName: "minSearchLength", isSignal: true, isRequired: false, transformFunction: null }, loadOnOpen: { classPropertyName: "loadOnOpen", publicName: "loadOnOpen", isSignal: true, isRequired: false, transformFunction: null }, ariaLabel: { classPropertyName: "ariaLabel", publicName: "aria-label", isSignal: true, isRequired: false, transformFunction: null }, tabIndex: { classPropertyName: "tabIndex", publicName: "tabIndex", isSignal: true, isRequired: false, transformFunction: null }, ariaDescribedby: { classPropertyName: "ariaDescribedby", publicName: "aria-describedby", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { selectionChange: "selectionChange", opened: "opened", closed: "closed", value: "valueChange" }, host: { attributes: { "role": "combobox", "aria-autocomplete": "none", "aria-haspopup": "listbox" }, listeners: { "click": "toggle()", "keydown": "_handleKeydown($event)", "focus": "_onFocus()", "blur": "_onBlur()" }, properties: { "attr.id": "id", "attr.tabindex": "disabled ? -1 : tabIndex()", "attr.aria-controls": "panelOpen() ? id + \"-panel\" : null", "attr.aria-expanded": "panelOpen()", "attr.aria-label": "ariaLabel()", "attr.aria-required": "required", "attr.aria-disabled": "disabled", "attr.aria-invalid": "errorState", "class.ngs-select-disabled": "disabled", "class.ngs-select-invalid": "errorState", "class.ngs-select-required": "required", "class.ngs-select-empty": "empty", "class.ngs-select-panel-open": "panelOpen()", "class.ngs-select-has-filter-trigger": "filterTrigger().length > 0", "class.ngs-select-clearable": "clearable()", "class.ngs-select-has-clear": "showClearButton()" } }, providers: [
|
|
509
964
|
{
|
|
510
965
|
provide: FormFieldControl,
|
|
511
966
|
useExisting: forwardRef(() => Select)
|
|
@@ -522,13 +977,16 @@ class Select {
|
|
|
522
977
|
provide: AUTOFOCUSABLE,
|
|
523
978
|
useExisting: forwardRef(() => Select)
|
|
524
979
|
}
|
|
525
|
-
], queries: [{ propertyName: "selectBody", predicate: SelectBody, isSignal: true }, { propertyName: "options", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "optionGroups", predicate: Optgroup, descendants: true, isSignal: true }, { propertyName: "customTrigger", predicate: SelectTrigger, descendants: true, isSignal: true }, { propertyName: "filterTrigger", predicate: FilterTrigger, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "origin", first: true, predicate: ["origin"], descendants: true, isSignal: true }], exportAs: ["ngsSelect"], ngImport: i0, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }] });
|
|
980
|
+
], queries: [{ propertyName: "selectBody", predicate: SelectBody, isSignal: true }, { propertyName: "projectedOptions", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "optionGroups", predicate: Optgroup, descendants: true, isSignal: true }, { propertyName: "customTrigger", predicate: SelectTrigger, descendants: true, isSignal: true }, { propertyName: "filterTrigger", predicate: FilterTrigger, descendants: true, isSignal: true }, { propertyName: "optionContentDef", first: true, predicate: SelectOptionContentDef, descendants: true, isSignal: true }, { propertyName: "selectValueDef", first: true, predicate: SelectValueDef, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "dataSourceOptions", predicate: OPTION, descendants: true, isSignal: true }, { propertyName: "overlayDir", first: true, predicate: CdkConnectedOverlay, descendants: true, isSignal: true }, { propertyName: "panel", first: true, predicate: ["panel"], descendants: true, isSignal: true }, { propertyName: "origin", first: true, predicate: ["origin"], descendants: true, isSignal: true }], exportAs: ["ngsSelect"], ngImport: i0, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else if (selectValueTemplateReady() && selectValueDef(); as valueTpl) {\n <span class=\"ngs-select-value-text\">\n <ng-container\n [ngTemplateOutlet]=\"valueTpl.templateRef\"\n [ngTemplateOutletContext]=\"selectValueContext()\"/>\n </span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else if (asyncEnabled()) {\n @if (searchable()) {\n <ngs-select-header>\n <div class=\"ngs-select-search sticky top-0 z-1 bg-surface-container-lowest\">\n <input\n class=\"ngs-select-search-input w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\"\n type=\"text\"\n [value]=\"asyncSearch()\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n autocomplete=\"off\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (input)=\"onAsyncSearchInput($any($event.target).value)\">\n </div>\n </ngs-select-header>\n }\n\n <div class=\"ngs-select-content ngs-select-async-content\" (scroll)=\"onAsyncContentScroll($event)\">\n @if (asyncLoading()) {\n <div class=\"ngs-select-state\">Loading...</div>\n } @else if (asyncError()) {\n <button type=\"button\" class=\"ngs-select-state ngs-select-retry\" (click)=\"retryAsyncLoad()\">\n Could not load options. Try again.\n </button>\n } @else {\n @for (option of asyncOptions(); track option.value) {\n <ngs-option [value]=\"option.value\" [data]=\"option.data\" [disabled]=\"option.disabled ?? false\">\n @if (optionContentDef(); as optionTpl) {\n <ng-container\n [ngTemplateOutlet]=\"optionTpl.templateRef\"\n [ngTemplateOutletContext]=\"asyncOptionContext(option)\"/>\n } @else {\n {{ option.label }}\n }\n </ngs-option>\n }\n\n @if (asyncOptions().length === 0) {\n <div class=\"ngs-select-state\">No options</div>\n } @else if (asyncLoadingMore()) {\n <div class=\"ngs-select-state\">Loading more...</div>\n }\n }\n </div>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}.ngs-select-panel .ngs-select-search{position:sticky;top:0;z-index:1;background:var(--ngs-select-search-bg, var(--ngs-color-surface-container-lowest, var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))))}.ngs-select-panel .ngs-select-search-input{width:100%;min-width:0;height:var(--ngs-select-search-height, calc(var(--spacing, .25rem) * 14));padding:0 var(--ngs-select-search-padding-inline, calc(var(--spacing, .25rem) * 3));border:0;border-bottom:var(--ngs-select-search-border, 1px solid var(--ngs-color-surface-container-high, var(--ngs-color-outline-variant)));outline:none;background:transparent;color:var(--ngs-select-search-color, var(--ngs-color-on-surface));font:inherit;font-size:var(--ngs-select-search-font-size, var(--ngs-font-size-sm, .875rem))}.ngs-select-panel .ngs-select-search-input:focus{border-bottom-color:var(--ngs-select-search-focus-border-color, var(--ngs-color-primary))}.ngs-select-panel .ngs-select-state{display:flex;align-items:center;width:100%;min-height:var(--ngs-select-state-min-height, 36px);padding:var(--ngs-select-state-padding, calc(var(--spacing, .25rem) * 2));border:0;background:transparent;color:var(--ngs-select-state-color, var(--ngs-color-on-surface-variant));font:inherit;font-size:var(--ngs-select-state-font-size, var(--ngs-field-font-size));text-align:left}.ngs-select-panel .ngs-select-retry{cursor:pointer}.ngs-select-panel .ngs-select-retry:hover,.ngs-select-panel .ngs-select-retry:focus-visible{color:var(--ngs-select-state-action-color, var(--ngs-color-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"], dependencies: [{ kind: "ngmodule", type: OverlayModule }, { kind: "directive", type: i1.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", "cdkConnectedOverlayUsePopover", "cdkConnectedOverlayMatchWidth", "cdkConnectedOverlay"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "directive", type: i1.CdkOverlayOrigin, selector: "[cdk-overlay-origin], [overlay-origin], [cdkOverlayOrigin]", exportAs: ["cdkOverlayOrigin"] }, { kind: "component", type: Option, selector: "ngs-option", inputs: ["value", "data", "disabled", "selected"], outputs: ["onSelectionChange"], exportAs: ["ngsOption"] }, { kind: "component", type: SelectHeader, selector: "ngs-select-header" }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] });
|
|
526
981
|
}
|
|
527
982
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: Select, decorators: [{
|
|
528
983
|
type: Component,
|
|
529
|
-
args: [{ selector: 'ngs-select', exportAs: 'ngsSelect',
|
|
984
|
+
args: [{ selector: 'ngs-select', exportAs: 'ngsSelect', imports: [
|
|
530
985
|
OverlayModule,
|
|
531
|
-
CdkOverlayOrigin
|
|
986
|
+
CdkOverlayOrigin,
|
|
987
|
+
Option,
|
|
988
|
+
SelectHeader,
|
|
989
|
+
NgTemplateOutlet
|
|
532
990
|
], providers: [
|
|
533
991
|
{
|
|
534
992
|
provide: FormFieldControl,
|
|
@@ -570,19 +1028,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
|
|
|
570
1028
|
'(keydown)': '_handleKeydown($event)',
|
|
571
1029
|
'(focus)': '_onFocus()',
|
|
572
1030
|
'(blur)': '_onBlur()',
|
|
573
|
-
}, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
574
|
-
}], ctorParameters: () => [], propDecorators: { selectBody: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectBody), { isSignal: true }] }], _id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], _disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], hideCheckIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCheckIcon", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }],
|
|
575
|
-
|
|
576
|
-
class SelectHeader {
|
|
577
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
578
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "21.2.4", type: SelectHeader, isStandalone: true, selector: "ngs-select-header", host: { classAttribute: "ngs-select-header" }, ngImport: i0, template: '<ng-content />', isInline: true, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] });
|
|
579
|
-
}
|
|
580
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectHeader, decorators: [{
|
|
581
|
-
type: Component,
|
|
582
|
-
args: [{ selector: 'ngs-select-header', standalone: true, imports: [], template: '<ng-content />', host: {
|
|
583
|
-
'class': 'ngs-select-header'
|
|
584
|
-
}, styles: [":host{display:block;background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
585
|
-
}] });
|
|
1031
|
+
}, template: "<div class=\"ngs-select-trigger\" cdkOverlayOrigin #origin=\"cdkOverlayOrigin\">\n <div class=\"ngs-select-value\">\n @if (customTrigger().length > 0 || filterTrigger().length > 0) {\n <ng-content select=\"ngs-select-trigger\"/>\n <ng-content select=\"ngs-filter-trigger\"/>\n } @else {\n @if (empty) {\n <span class=\"ngs-select-placeholder\">{{ placeholder }}</span>\n } @else if (selectValueTemplateReady() && selectValueDef(); as valueTpl) {\n <span class=\"ngs-select-value-text\">\n <ng-container\n [ngTemplateOutlet]=\"valueTpl.templateRef\"\n [ngTemplateOutletContext]=\"selectValueContext()\"/>\n </span>\n } @else {\n <span class=\"ngs-select-value-text\">{{ triggerValue() }}</span>\n }\n }\n </div>\n</div>\n@if (showClearButton()) {\n <button\n type=\"button\"\n class=\"ngs-select-clear-button\"\n aria-label=\"Clear selection\"\n (click)=\"clear($event)\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-clear-icon\" aria-hidden=\"true\">\n <path\n fill=\"currentColor\"\n d=\"M6.22 6.22a.75.75 0 0 1 1.06 0L12 10.94l4.72-4.72a.75.75 0 1 1 1.06 1.06L13.06 12l4.72 4.72a.75.75 0 1 1-1.06 1.06L12 13.06l-4.72 4.72a.75.75 0 0 1-1.06-1.06L10.94 12 6.22 7.28a.75.75 0 0 1 0-1.06Z\"/>\n </svg>\n </button>\n}\n<div class=\"ngs-select-arrow-wrapper\">\n <svg viewBox=\"0 0 24 24\" class=\"ngs-select-arrow\">\n <path fill=\"currentColor\"\n d=\"M4.22 8.47a.75.75 0 0 1 1.06 0L12 15.19l6.72-6.72a.75.75 0 1 1 1.06 1.06l-7.25 7.25a.75.75 0 0 1-1.06 0L4.22 9.53a.75.75 0 0 1 0-1.06\"></path>\n </svg>\n</div>\n\n<ng-template\n cdkConnectedOverlay\n [cdkConnectedOverlayOrigin]=\"overlayOrigin\"\n [cdkConnectedOverlayOpen]=\"panelOpen()\"\n [cdkConnectedOverlayHasBackdrop]=\"true\"\n [cdkConnectedOverlayWidth]=\"overlayWidth\"\n cdkConnectedOverlayBackdropClass=\"cdk-overlay-transparent-backdrop\"\n (backdropClick)=\"close()\"\n (positionChange)=\"_onPositionChange($event)\"\n (detach)=\"close()\"\n>\n <div\n class=\"ngs-select-panel\"\n [class.ngs-select-panel-above]=\"_panelPosition() === 'top'\"\n #panel\n [attr.id]=\"id + '-panel'\"\n (keydown)=\"_handleKeydown($event)\"\n >\n <ng-content select=\"ngs-select-header\"/>\n\n @if (selectBody().length > 0) {\n <ng-content select=\"ngs-select-body\"/>\n } @else if (asyncEnabled()) {\n @if (searchable()) {\n <ngs-select-header>\n <div class=\"ngs-select-search sticky top-0 z-1 bg-surface-container-lowest\">\n <input\n class=\"ngs-select-search-input w-full text-sm focus:outline-none border-b border-surface-container-high focus:border-b-primary h-14 px-3\"\n type=\"text\"\n [value]=\"asyncSearch()\"\n placeholder=\"Search...\"\n aria-label=\"Search options\"\n autocomplete=\"off\"\n (click)=\"$event.stopPropagation()\"\n (keydown)=\"$event.stopPropagation()\"\n (input)=\"onAsyncSearchInput($any($event.target).value)\">\n </div>\n </ngs-select-header>\n }\n\n <div class=\"ngs-select-content ngs-select-async-content\" (scroll)=\"onAsyncContentScroll($event)\">\n @if (asyncLoading()) {\n <div class=\"ngs-select-state\">Loading...</div>\n } @else if (asyncError()) {\n <button type=\"button\" class=\"ngs-select-state ngs-select-retry\" (click)=\"retryAsyncLoad()\">\n Could not load options. Try again.\n </button>\n } @else {\n @for (option of asyncOptions(); track option.value) {\n <ngs-option [value]=\"option.value\" [data]=\"option.data\" [disabled]=\"option.disabled ?? false\">\n @if (optionContentDef(); as optionTpl) {\n <ng-container\n [ngTemplateOutlet]=\"optionTpl.templateRef\"\n [ngTemplateOutletContext]=\"asyncOptionContext(option)\"/>\n } @else {\n {{ option.label }}\n }\n </ngs-option>\n }\n\n @if (asyncOptions().length === 0) {\n <div class=\"ngs-select-state\">No options</div>\n } @else if (asyncLoadingMore()) {\n <div class=\"ngs-select-state\">Loading more...</div>\n }\n }\n </div>\n } @else {\n <div class=\"ngs-select-content\">\n <ng-content select=\"ngs-optgroup,ngs-option\" />\n <ng-content/>\n </div>\n }\n\n <ng-content select=\"ngs-select-footer\"/>\n </div>\n</ng-template>\n", styles: [":host{--ngs-select-arrow-color: var(--ngs-color-on-surface-variant);--ngs-select-font-size: var(--ngs-field-font-size);--ngs-select-placeholder-color: var(--ngs-field-label-color);--ngs-select-border-color: var(--ngs-field-border-color);--ngs-select-min-width: 120px;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 5);--ngs-select-arrow-size: 18px;--ngs-select-clear-container-width: calc(var(--spacing, .25rem) * 6);--ngs-select-clear-icon-size: 20px;--ngs-select-clear-overlap: 0px;--ngs-select-clear-color: var(--ngs-color-on-surface-variant);--ngs-select-clear-hover-color: var(--ngs-color-danger);display:inline-block;outline:none;cursor:pointer;font-size:var(--ngs-select-font-size);min-width:var(--ngs-select-min-width);padding-right:var(--ngs-select-arrow-container-width)}:host:has(ngs-filter-trigger){--ngs-select-min-width: 0;--ngs-select-arrow-container-width: calc(var(--spacing, .25rem) * 7);position:relative}:host.ngs-select-has-clear{padding-right:calc(var(--ngs-select-arrow-container-width) + var(--ngs-select-clear-container-width) - var(--ngs-select-clear-overlap))}:host.ngs-select-has-filter-trigger.ngs-select-has-clear{--ngs-select-clear-overlap: calc(var(--spacing, .25rem) * 2)}:host.ngs-select-panel-open.ngs-select-has-filter-trigger .ngs-select-arrow-wrapper{transform:rotate(-180deg)}:host.ngs-select-disabled{cursor:default;pointer-events:none;--ngs-select-border-color: var(--ngs-color-outline)}@supports (color: color-mix(in lab,red,red)){:host.ngs-select-disabled{--ngs-select-border-color: color-mix(in srgb, var(--ngs-color-outline), transparent 80%)}}:host.ngs-select-disabled .ngs-select-trigger{opacity:.38}:host .ngs-select-value{display:flex;align-items:center;max-width:100%;min-width:0;height:100%;flex-grow:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-value-text{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host .ngs-select-placeholder{display:block;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--ngs-select-placeholder-color)}.ngs-form-field :host{min-width:0}:host .ngs-select-arrow{width:var(--ngs-select-arrow-size);height:var(--ngs-select-arrow-size);display:flex;color:var(--ngs-select-arrow-color)}:host .ngs-select-clear-button{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;position:absolute;right:calc(var(--ngs-select-arrow-container-width) - var(--ngs-select-clear-overlap));top:0;bottom:0;width:var(--ngs-select-clear-container-width);padding:0;border:0;background:transparent;color:var(--ngs-select-clear-color);cursor:pointer;outline:none;transition:color .15s ease}:host .ngs-select-clear-button:hover{color:var(--ngs-select-clear-hover-color)}:host .ngs-select-clear-button:focus-visible{color:var(--ngs-select-clear-hover-color)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-clear-button,.ngs-paginator :host .ngs-select-clear-button{top:0}:host .ngs-select-clear-icon{width:var(--ngs-select-clear-icon-size);height:var(--ngs-select-clear-icon-size);display:flex}:host .ngs-select-arrow-wrapper{align-items:center;justify-content:center;flex-shrink:0;display:inline-flex;transition:transform .2s ease;position:absolute;right:0;top:0;bottom:0;width:var(--ngs-select-arrow-container-width)}.ngs-form-field:not(.ngs-form-field-has-label) :host .ngs-select-arrow-wrapper,.ngs-paginator :host .ngs-select-arrow-wrapper{top:0}:host .ngs-select-trigger{display:flex;align-items:center;height:100%;min-width:0;overflow:hidden;position:relative;box-sizing:border-box;line-height:var(--ngs-field-line-height);font-size:var(--ngs-field-font-size)}:host .ngs-select-trigger .hidden{display:none}:host ::ng-deep ngs-select-trigger,:host ::ng-deep .ngs-select-trigger-content{display:flex;align-items:center;min-width:0;max-width:100%;height:100%;overflow:hidden;white-space:nowrap}:host ::ng-deep .ngs-select-trigger-content{gap:var(--ngs-select-trigger-gap, var(--ngs-dropdown-item-gap, calc(var(--spacing, .25rem) * 2)))}:host ::ng-deep .ngs-select-trigger-icon{flex:none;line-height:0}:host ::ng-deep .ngs-select-trigger-text{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}:host-context(.ngs-form-field-focused) .ngs-select-arrow-wrapper{transform:rotate(180deg)}.ngs-select-panel{background:var(--ngs-select-panel-bg, var(--ngs-dropdown-bg));box-shadow:var(--ngs-select-panel-shadow, var(--ngs-dropdown-shadow));border-radius:var(--ngs-dropdown-radius);width:100%;transform-origin:top;animation:ngs-dropdown-panel-showing .15s cubic-bezier(0,0,.2,1);display:flex;flex-direction:column;overflow:hidden;outline:var(--ngs-select-panel-border, var(--ngs-dropdown-border))}.ngs-select-panel.ngs-select-panel-above{transform-origin:bottom}.ngs-select-panel:not(:has(.ngs-select-body)){max-height:var(--ngs-select-panel-max-height, var(--ngs-dropdown-max-height, 256px))}.ngs-select-panel .ngs-select-header,.ngs-select-panel .ngs-select-footer{display:block;flex:none;z-index:1}.ngs-select-panel .ngs-select-content{position:relative;padding:var(--ngs-select-content-padding, var(--ngs-dropdown-padding, calc(var(--spacing, .25rem) * 2)));overflow:auto;max-height:inherit}.ngs-select-panel .ngs-select-search{position:sticky;top:0;z-index:1;background:var(--ngs-select-search-bg, var(--ngs-color-surface-container-lowest, var(--ngs-select-panel-bg, var(--ngs-dropdown-bg))))}.ngs-select-panel .ngs-select-search-input{width:100%;min-width:0;height:var(--ngs-select-search-height, calc(var(--spacing, .25rem) * 14));padding:0 var(--ngs-select-search-padding-inline, calc(var(--spacing, .25rem) * 3));border:0;border-bottom:var(--ngs-select-search-border, 1px solid var(--ngs-color-surface-container-high, var(--ngs-color-outline-variant)));outline:none;background:transparent;color:var(--ngs-select-search-color, var(--ngs-color-on-surface));font:inherit;font-size:var(--ngs-select-search-font-size, var(--ngs-font-size-sm, .875rem))}.ngs-select-panel .ngs-select-search-input:focus{border-bottom-color:var(--ngs-select-search-focus-border-color, var(--ngs-color-primary))}.ngs-select-panel .ngs-select-state{display:flex;align-items:center;width:100%;min-height:var(--ngs-select-state-min-height, 36px);padding:var(--ngs-select-state-padding, calc(var(--spacing, .25rem) * 2));border:0;background:transparent;color:var(--ngs-select-state-color, var(--ngs-color-on-surface-variant));font:inherit;font-size:var(--ngs-select-state-font-size, var(--ngs-field-font-size));text-align:left}.ngs-select-panel .ngs-select-retry{cursor:pointer}.ngs-select-panel .ngs-select-retry:hover,.ngs-select-panel .ngs-select-retry:focus-visible{color:var(--ngs-select-state-action-color, var(--ngs-color-primary))}\n/*! tailwindcss v4.2.2 | MIT License | https://tailwindcss.com */\n"] }]
|
|
1032
|
+
}], ctorParameters: () => [], propDecorators: { selectBody: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectBody), { isSignal: true }] }], _id: [{ type: i0.Input, args: [{ isSignal: true, alias: "id", required: false }] }], _placeholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "placeholder", required: false }] }], _disabledInput: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], _required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], hideCheckIcon: [{ type: i0.Input, args: [{ isSignal: true, alias: "hideCheckIcon", required: false }] }], clearable: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearable", required: false }] }], dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], pageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageSize", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], searchDebounce: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchDebounce", required: false }] }], minSearchLength: [{ type: i0.Input, args: [{ isSignal: true, alias: "minSearchLength", required: false }] }], loadOnOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "loadOnOpen", required: false }] }], ariaLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-label", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], ariaDescribedby: [{ type: i0.Input, args: [{ isSignal: true, alias: "aria-describedby", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], opened: [{ type: i0.Output, args: ["opened"] }], closed: [{ type: i0.Output, args: ["closed"] }], projectedOptions: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => OPTION), { ...{ descendants: true }, isSignal: true }] }], dataSourceOptions: [{ type: i0.ViewChildren, args: [i0.forwardRef(() => OPTION), { isSignal: true }] }], optionGroups: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => Optgroup), { ...{ descendants: true }, isSignal: true }] }], customTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => SelectTrigger), { ...{ descendants: true }, isSignal: true }] }], filterTrigger: [{ type: i0.ContentChildren, args: [i0.forwardRef(() => FilterTrigger), { ...{ descendants: true }, isSignal: true }] }], optionContentDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SelectOptionContentDef), { ...{ descendants: true }, isSignal: true }] }], selectValueDef: [{ type: i0.ContentChild, args: [i0.forwardRef(() => SelectValueDef), { ...{ descendants: true }, isSignal: true }] }], overlayDir: [{ type: i0.ViewChild, args: [i0.forwardRef(() => CdkConnectedOverlay), { isSignal: true }] }], panel: [{ type: i0.ViewChild, args: ['panel', { isSignal: true }] }], origin: [{ type: i0.ViewChild, args: ['origin', { isSignal: true }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }] } });
|
|
586
1033
|
|
|
587
1034
|
class SelectFooter {
|
|
588
1035
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: SelectFooter, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -599,5 +1046,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
|
|
|
599
1046
|
* Generated bundle index. Do not edit.
|
|
600
1047
|
*/
|
|
601
1048
|
|
|
602
|
-
export { FilterTrigger, FilterTriggerValueDirective, SELECT, Select, SelectBody, SelectChange, SelectFooter, SelectHeader, SelectTrigger, _Select };
|
|
1049
|
+
export { FilterTrigger, FilterTriggerValueDirective, SELECT, Select, SelectBody, SelectChange, SelectFooter, SelectHeader, SelectOptionContentDef, SelectTrigger, SelectValueDef, _Select };
|
|
603
1050
|
//# sourceMappingURL=ngstarter-ui-components-select.mjs.map
|