@dmlibs/dm-cmps 0.0.1 → 0.0.3
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.
|
@@ -28,6 +28,16 @@ class DmCmpsDataSource {
|
|
|
28
28
|
currentPageIndex = 0;
|
|
29
29
|
pageSize = 10;
|
|
30
30
|
autoPaginationAboveItemsCount = 100;
|
|
31
|
+
propertiesToSkipInSearchSet = new Set([
|
|
32
|
+
'_id',
|
|
33
|
+
'createdAt',
|
|
34
|
+
'updatedAt',
|
|
35
|
+
'__v',
|
|
36
|
+
'createdBy',
|
|
37
|
+
'updatedBy',
|
|
38
|
+
'creatorName',
|
|
39
|
+
'updaterName',
|
|
40
|
+
]);
|
|
31
41
|
searchTerm = '';
|
|
32
42
|
speratedSearch = false;
|
|
33
43
|
filterPredicate = (item, filter) => {
|
|
@@ -37,7 +47,11 @@ class DmCmpsDataSource {
|
|
|
37
47
|
if (typeof item === 'string') {
|
|
38
48
|
return item.toLowerCase().includes(filter.toLowerCase());
|
|
39
49
|
}
|
|
40
|
-
const match = (term) =>
|
|
50
|
+
const match = (term) => {
|
|
51
|
+
return Object.entries(item).some(([key, value]) => !this.propertiesToSkipInSearchSet.has(key) &&
|
|
52
|
+
value != null &&
|
|
53
|
+
value.toString().toLowerCase().includes(term.toLowerCase()));
|
|
54
|
+
};
|
|
41
55
|
if (this.speratedSearch) {
|
|
42
56
|
const terms = filter
|
|
43
57
|
.split(' ')
|
|
@@ -329,6 +343,9 @@ class DmCmpsDataSource {
|
|
|
329
343
|
applySperatedSearch(enabled) {
|
|
330
344
|
this.speratedSearch = enabled;
|
|
331
345
|
}
|
|
346
|
+
setPropertiesToSkipInSearch(...props) {
|
|
347
|
+
this.propertiesToSkipInSearchSet = new Set(props);
|
|
348
|
+
}
|
|
332
349
|
}
|
|
333
350
|
|
|
334
351
|
const SEARCH_SECTION_BG_COLOR_VAR = '--dm-mat-select-search-section-bg-color';
|
|
@@ -375,6 +392,16 @@ class DmMatSelect {
|
|
|
375
392
|
focusSearchInputOnPanelOpen = input(true, { ...(ngDevMode ? { debugName: "focusSearchInputOnPanelOpen" } : {}), transform: booleanAttribute });
|
|
376
393
|
filterPredicate = input(null, ...(ngDevMode ? [{ debugName: "filterPredicate" }] : []));
|
|
377
394
|
_filterPredicate = null;
|
|
395
|
+
propertiesToSkipInSearch = input([
|
|
396
|
+
'_id',
|
|
397
|
+
'createdAt',
|
|
398
|
+
'updatedAt',
|
|
399
|
+
'__v',
|
|
400
|
+
'createdBy',
|
|
401
|
+
'updatedBy',
|
|
402
|
+
'creatorName',
|
|
403
|
+
'updaterName',
|
|
404
|
+
], ...(ngDevMode ? [{ debugName: "propertiesToSkipInSearch" }] : []));
|
|
378
405
|
simpleArray = computed(() => {
|
|
379
406
|
return typeof this.options()[0] === 'string' || typeof this.options()[0] === 'number';
|
|
380
407
|
}, ...(ngDevMode ? [{ debugName: "simpleArray" }] : []));
|
|
@@ -409,14 +436,13 @@ class DmMatSelect {
|
|
|
409
436
|
effect(() => {
|
|
410
437
|
this._filterPredicate = this.filterPredicate();
|
|
411
438
|
this._optionNameFormat = this.optionNameFormat();
|
|
439
|
+
this.datasource().setPropertiesToSkipInSearch(...this.propertiesToSkipInSearch());
|
|
412
440
|
});
|
|
413
441
|
effect(() => {
|
|
414
442
|
const opts = this.options();
|
|
415
443
|
this.setOptionsFormattedNames(opts);
|
|
416
444
|
this.datasource().setAutoPaginationAboveItemsCount(-1);
|
|
417
|
-
this.datasource().setSearchDebounceTime(3000);
|
|
418
445
|
if (this._filterPredicate) {
|
|
419
|
-
console.log('filter predicate updated!!!!!!!!');
|
|
420
446
|
this.datasource().setFilterPredicate(this._filterPredicate);
|
|
421
447
|
}
|
|
422
448
|
if (this.sortBySelectedOnTop() && this.multiple()) {
|
|
@@ -484,7 +510,6 @@ class DmMatSelect {
|
|
|
484
510
|
onSelectionChangeHandler(event, option) {
|
|
485
511
|
if (!event.isUserInput)
|
|
486
512
|
return;
|
|
487
|
-
console.log('selection change!!');
|
|
488
513
|
const selected = event.source.selected;
|
|
489
514
|
const currentValue = this.control().value;
|
|
490
515
|
if (this.multiple()) {
|
|
@@ -506,7 +531,6 @@ class DmMatSelect {
|
|
|
506
531
|
return;
|
|
507
532
|
}
|
|
508
533
|
if (selected) {
|
|
509
|
-
console.log('set value => ', option);
|
|
510
534
|
this.control().setValue(this.getOptionValue(option));
|
|
511
535
|
}
|
|
512
536
|
else {
|
|
@@ -557,7 +581,7 @@ class DmMatSelect {
|
|
|
557
581
|
}
|
|
558
582
|
}
|
|
559
583
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: DmMatSelect, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
560
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DmMatSelect, isStandalone: true, selector: "dm-mat-select", inputs: { formFieldClass: { classPropertyName: "formFieldClass", publicName: "formFieldClass", isSignal: true, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "wrapperClass", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, selectAllEnabled: { classPropertyName: "selectAllEnabled", publicName: "selectAllEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectAllLabel: { classPropertyName: "selectAllLabel", publicName: "selectAllLabel", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionValueKey: { classPropertyName: "optionValueKey", publicName: "optionValueKey", isSignal: true, isRequired: false, transformFunction: null }, optionLabelKey: { classPropertyName: "optionLabelKey", publicName: "optionLabelKey", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyOption: { classPropertyName: "emptyOption", publicName: "emptyOption", isSignal: true, isRequired: false, transformFunction: null }, emptyOptionLabel: { classPropertyName: "emptyOptionLabel", publicName: "emptyOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, emptyOptionValue: { classPropertyName: "emptyOptionValue", publicName: "emptyOptionValue", isSignal: true, isRequired: false, transformFunction: null }, optionNameFormat: { classPropertyName: "optionNameFormat", publicName: "optionNameFormat", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, formControl: { classPropertyName: "formControl", publicName: "formControl", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, searchSectionBackgroundColor: { classPropertyName: "searchSectionBackgroundColor", publicName: "searchSectionBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, sortBySelectedOnTop: { classPropertyName: "sortBySelectedOnTop", publicName: "sortBySelectedOnTop", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, noDataLabel: { classPropertyName: "noDataLabel", publicName: "noDataLabel", isSignal: true, isRequired: false, transformFunction: null }, clearSearchAfterSelect: { classPropertyName: "clearSearchAfterSelect", publicName: "clearSearchAfterSelect", isSignal: true, isRequired: false, transformFunction: null }, clearSearchButtonTooltip: { classPropertyName: "clearSearchButtonTooltip", publicName: "clearSearchButtonTooltip", isSignal: true, isRequired: false, transformFunction: null }, focusSearchInputOnPanelOpen: { classPropertyName: "focusSearchInputOnPanelOpen", publicName: "focusSearchInputOnPanelOpen", isSignal: true, isRequired: false, transformFunction: null }, filterPredicate: { classPropertyName: "filterPredicate", publicName: "filterPredicate", isSignal: true, isRequired: false, transformFunction: null }, filterText: { classPropertyName: "filterText", publicName: "filterText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", selectionChange: "selectionChange", filterText: "filterTextChange" }, ngImport: i0, template: "<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n", styles: [":host{display:block;width:auto;height:auto}:host .dm-mat-select-wrapper{width:100%;height:100%;position:relative}:host .dm-mat-select-wrapper .search-section{display:flex;flex-direction:column;position:sticky;top:0;z-index:1;background-color:var(--dm-mat-select-search-section-bg-color, #faf9fd)}:host .dm-mat-select-wrapper .search-section ::ng-deep mat-form-field>.mat-mdc-form-field-subscript-wrapper{display:none}:host .dm-mat-select-wrapper ::ng-deep mat-form-field>.mat-mdc-text-field-wrapper>.mat-mdc-form-field-flex>.mat-mdc-form-field-icon-suffix{padding:0 4px 0 8px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
584
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.0.3", type: DmMatSelect, isStandalone: true, selector: "dm-mat-select", inputs: { formFieldClass: { classPropertyName: "formFieldClass", publicName: "formFieldClass", isSignal: true, isRequired: false, transformFunction: null }, wrapperClass: { classPropertyName: "wrapperClass", publicName: "wrapperClass", isSignal: true, isRequired: false, transformFunction: null }, appearance: { classPropertyName: "appearance", publicName: "appearance", isSignal: true, isRequired: false, transformFunction: null }, multiple: { classPropertyName: "multiple", publicName: "multiple", isSignal: true, isRequired: false, transformFunction: null }, selectAllEnabled: { classPropertyName: "selectAllEnabled", publicName: "selectAllEnabled", isSignal: true, isRequired: false, transformFunction: null }, selectAllLabel: { classPropertyName: "selectAllLabel", publicName: "selectAllLabel", isSignal: true, isRequired: false, transformFunction: null }, label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, options: { classPropertyName: "options", publicName: "options", isSignal: true, isRequired: false, transformFunction: null }, optionValueKey: { classPropertyName: "optionValueKey", publicName: "optionValueKey", isSignal: true, isRequired: false, transformFunction: null }, optionLabelKey: { classPropertyName: "optionLabelKey", publicName: "optionLabelKey", isSignal: true, isRequired: false, transformFunction: null }, searchable: { classPropertyName: "searchable", publicName: "searchable", isSignal: true, isRequired: false, transformFunction: null }, required: { classPropertyName: "required", publicName: "required", isSignal: true, isRequired: false, transformFunction: null }, disabled: { classPropertyName: "disabled", publicName: "disabled", isSignal: true, isRequired: false, transformFunction: null }, error: { classPropertyName: "error", publicName: "error", isSignal: true, isRequired: false, transformFunction: null }, searchPlaceholder: { classPropertyName: "searchPlaceholder", publicName: "searchPlaceholder", isSignal: true, isRequired: false, transformFunction: null }, emptyOption: { classPropertyName: "emptyOption", publicName: "emptyOption", isSignal: true, isRequired: false, transformFunction: null }, emptyOptionLabel: { classPropertyName: "emptyOptionLabel", publicName: "emptyOptionLabel", isSignal: true, isRequired: false, transformFunction: null }, emptyOptionValue: { classPropertyName: "emptyOptionValue", publicName: "emptyOptionValue", isSignal: true, isRequired: false, transformFunction: null }, optionNameFormat: { classPropertyName: "optionNameFormat", publicName: "optionNameFormat", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, formControl: { classPropertyName: "formControl", publicName: "formControl", isSignal: true, isRequired: false, transformFunction: null }, panelWidth: { classPropertyName: "panelWidth", publicName: "panelWidth", isSignal: true, isRequired: false, transformFunction: null }, panelClass: { classPropertyName: "panelClass", publicName: "panelClass", isSignal: true, isRequired: false, transformFunction: null }, searchSectionBackgroundColor: { classPropertyName: "searchSectionBackgroundColor", publicName: "searchSectionBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, sortBySelectedOnTop: { classPropertyName: "sortBySelectedOnTop", publicName: "sortBySelectedOnTop", isSignal: true, isRequired: false, transformFunction: null }, icon: { classPropertyName: "icon", publicName: "icon", isSignal: true, isRequired: false, transformFunction: null }, noDataLabel: { classPropertyName: "noDataLabel", publicName: "noDataLabel", isSignal: true, isRequired: false, transformFunction: null }, clearSearchAfterSelect: { classPropertyName: "clearSearchAfterSelect", publicName: "clearSearchAfterSelect", isSignal: true, isRequired: false, transformFunction: null }, clearSearchButtonTooltip: { classPropertyName: "clearSearchButtonTooltip", publicName: "clearSearchButtonTooltip", isSignal: true, isRequired: false, transformFunction: null }, focusSearchInputOnPanelOpen: { classPropertyName: "focusSearchInputOnPanelOpen", publicName: "focusSearchInputOnPanelOpen", isSignal: true, isRequired: false, transformFunction: null }, filterPredicate: { classPropertyName: "filterPredicate", publicName: "filterPredicate", isSignal: true, isRequired: false, transformFunction: null }, propertiesToSkipInSearch: { classPropertyName: "propertiesToSkipInSearch", publicName: "propertiesToSkipInSearch", isSignal: true, isRequired: false, transformFunction: null }, filterText: { classPropertyName: "filterText", publicName: "filterText", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { value: "valueChange", selectionChange: "selectionChange", filterText: "filterTextChange" }, ngImport: i0, template: "<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\" style=\"width: 100%\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n", styles: [".dm-mat-select-wrapper{width:100%;position:relative}.dm-mat-select-wrapper .search-section{display:flex;flex-direction:column;position:sticky;top:0;z-index:1;background-color:var(--dm-mat-select-search-section-bg-color, #faf9fd)}.dm-mat-select-wrapper .search-section ::ng-deep mat-form-field>.mat-mdc-form-field-subscript-wrapper{display:none}.dm-mat-select-wrapper ::ng-deep mat-form-field>.mat-mdc-text-field-wrapper>.mat-mdc-form-field-flex>.mat-mdc-form-field-icon-suffix{padding:0 4px 0 8px}\n"], dependencies: [{ kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i1.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i1.MatLabel, selector: "mat-label" }, { kind: "directive", type: i1.MatError, selector: "mat-error, [matError]", inputs: ["id"] }, { kind: "directive", type: i1.MatSuffix, selector: "[matSuffix], [matIconSuffix], [matTextSuffix]", inputs: ["matTextSuffix"] }, { kind: "ngmodule", type: MatSelectModule }, { kind: "component", type: i2.MatSelect, selector: "mat-select", inputs: ["aria-describedby", "panelClass", "disabled", "disableRipple", "tabIndex", "hideSingleSelectionIndicator", "placeholder", "required", "multiple", "disableOptionCentering", "compareWith", "value", "aria-label", "aria-labelledby", "errorStateMatcher", "typeaheadDebounceInterval", "sortComparator", "id", "panelWidth", "canSelectNullableOptions"], outputs: ["openedChange", "opened", "closed", "selectionChange", "valueChange"], exportAs: ["matSelect"] }, { kind: "component", type: i2.MatOption, selector: "mat-option", inputs: ["value", "id", "disabled"], outputs: ["onSelectionChange"], exportAs: ["matOption"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i4.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i4.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "ngmodule", type: MatCheckboxModule }, { kind: "component", type: i6.MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i7.MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }] });
|
|
561
585
|
}
|
|
562
586
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImport: i0, type: DmMatSelect, decorators: [{
|
|
563
587
|
type: Component,
|
|
@@ -573,8 +597,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.0.3", ngImpor
|
|
|
573
597
|
MatButtonModule,
|
|
574
598
|
MatTooltip,
|
|
575
599
|
MatSuffix,
|
|
576
|
-
], template: "<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n", styles: ["
|
|
577
|
-
}], ctorParameters: () => [], propDecorators: { formFieldClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "formFieldClass", required: false }] }], wrapperClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrapperClass", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], selectAllEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllEnabled", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionValueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValueKey", required: false }] }], optionLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabelKey", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], emptyOption: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOption", required: false }] }], emptyOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOptionLabel", required: false }] }], emptyOptionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOptionValue", required: false }] }], optionNameFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionNameFormat", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], formControl: [{ type: i0.Input, args: [{ isSignal: true, alias: "formControl", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], searchSectionBackgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchSectionBackgroundColor", required: false }] }], sortBySelectedOnTop: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortBySelectedOnTop", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], noDataLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noDataLabel", required: false }] }], clearSearchAfterSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearSearchAfterSelect", required: false }] }], clearSearchButtonTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearSearchButtonTooltip", required: false }] }], focusSearchInputOnPanelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusSearchInputOnPanelOpen", required: false }] }], filterPredicate: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPredicate", required: false }] }], filterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterText", required: false }] }, { type: i0.Output, args: ["filterTextChange"] }] } });
|
|
600
|
+
], template: "<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\" style=\"width: 100%\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n", styles: [".dm-mat-select-wrapper{width:100%;position:relative}.dm-mat-select-wrapper .search-section{display:flex;flex-direction:column;position:sticky;top:0;z-index:1;background-color:var(--dm-mat-select-search-section-bg-color, #faf9fd)}.dm-mat-select-wrapper .search-section ::ng-deep mat-form-field>.mat-mdc-form-field-subscript-wrapper{display:none}.dm-mat-select-wrapper ::ng-deep mat-form-field>.mat-mdc-text-field-wrapper>.mat-mdc-form-field-flex>.mat-mdc-form-field-icon-suffix{padding:0 4px 0 8px}\n"] }]
|
|
601
|
+
}], ctorParameters: () => [], propDecorators: { formFieldClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "formFieldClass", required: false }] }], wrapperClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "wrapperClass", required: false }] }], appearance: [{ type: i0.Input, args: [{ isSignal: true, alias: "appearance", required: false }] }], multiple: [{ type: i0.Input, args: [{ isSignal: true, alias: "multiple", required: false }] }], selectAllEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllEnabled", required: false }] }], selectAllLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "selectAllLabel", required: false }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: false }] }], options: [{ type: i0.Input, args: [{ isSignal: true, alias: "options", required: false }] }], optionValueKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionValueKey", required: false }] }], optionLabelKey: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionLabelKey", required: false }] }], searchable: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchable", required: false }] }], required: [{ type: i0.Input, args: [{ isSignal: true, alias: "required", required: false }] }], disabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "disabled", required: false }] }], error: [{ type: i0.Input, args: [{ isSignal: true, alias: "error", required: false }] }], searchPlaceholder: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchPlaceholder", required: false }] }], emptyOption: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOption", required: false }] }], emptyOptionLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOptionLabel", required: false }] }], emptyOptionValue: [{ type: i0.Input, args: [{ isSignal: true, alias: "emptyOptionValue", required: false }] }], optionNameFormat: [{ type: i0.Input, args: [{ isSignal: true, alias: "optionNameFormat", required: false }] }], value: [{ type: i0.Input, args: [{ isSignal: true, alias: "value", required: false }] }, { type: i0.Output, args: ["valueChange"] }], formControl: [{ type: i0.Input, args: [{ isSignal: true, alias: "formControl", required: false }] }], panelWidth: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelWidth", required: false }] }], panelClass: [{ type: i0.Input, args: [{ isSignal: true, alias: "panelClass", required: false }] }], searchSectionBackgroundColor: [{ type: i0.Input, args: [{ isSignal: true, alias: "searchSectionBackgroundColor", required: false }] }], sortBySelectedOnTop: [{ type: i0.Input, args: [{ isSignal: true, alias: "sortBySelectedOnTop", required: false }] }], selectionChange: [{ type: i0.Output, args: ["selectionChange"] }], icon: [{ type: i0.Input, args: [{ isSignal: true, alias: "icon", required: false }] }], noDataLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "noDataLabel", required: false }] }], clearSearchAfterSelect: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearSearchAfterSelect", required: false }] }], clearSearchButtonTooltip: [{ type: i0.Input, args: [{ isSignal: true, alias: "clearSearchButtonTooltip", required: false }] }], focusSearchInputOnPanelOpen: [{ type: i0.Input, args: [{ isSignal: true, alias: "focusSearchInputOnPanelOpen", required: false }] }], filterPredicate: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterPredicate", required: false }] }], propertiesToSkipInSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "propertiesToSkipInSearch", required: false }] }], filterText: [{ type: i0.Input, args: [{ isSignal: true, alias: "filterText", required: false }] }, { type: i0.Output, args: ["filterTextChange"] }] } });
|
|
578
602
|
|
|
579
603
|
/*
|
|
580
604
|
* Public API Surface of dm-cmps
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dmlibs-dm-cmps.mjs","sources":["../../../projects/dm-cmps/src/lib/utils/dm-cmps-data-source.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/utils.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/dm-mat-select.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/dm-mat-select.html","../../../projects/dm-cmps/src/public-api.ts","../../../projects/dm-cmps/src/dmlibs-dm-cmps.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, Subject, Subscription, switchMap } from 'rxjs';\n\nexport interface DmCmpsDataSourceSort {\n direction: 'asc' | 'desc';\n field: string;\n sortFn?: (a: any, b: any) => number;\n}\n\nexport class DmCmpsDataSource<T> implements DmCmpsDataSourceConfig<T> {\n private data: T[];\n private filteredData: T[];\n private _resultData: T[];\n\n public result = signal<T[]>([]);\n\n private paginationEnabled: boolean = false;\n private currentPageIndex: number = 0;\n private pageSize: number = 10;\n private autoPaginationAboveItemsCount: number = 100;\n\n private searchTerm: string = '';\n\n private speratedSearch: boolean = false;\n private filterPredicate: (data: T, filter: string) => boolean = (item: T, filter: string) => {\n if (!item || !filter) {\n return true;\n }\n if (typeof item === 'string') {\n return item.toLowerCase().includes(filter.toLowerCase());\n }\n const match = (term: string) =>\n Object.values(item).some(\n (value) => value != null && value.toString().toLowerCase().includes(term.toLowerCase())\n );\n if (this.speratedSearch) {\n const terms = filter\n .split(' ')\n .map((t) => t.trim())\n .filter((t) => !!t);\n return terms.every((term) => match(term));\n }\n return match(filter);\n };\n\n private filterByObject: Partial<T> | null = null;\n\n private fieldsToSearchIn: string[] = [];\n\n private sortMap: DmCmpsDataSourceSort[] = [];\n private sortFn: ((a: T, b: T) => number) | null = null;\n\n private searchTerms$: Subject<string> = new Subject<string>();\n private searchDebounceTime = signal<number>(300);\n\n private readonly subscription = new Subscription();\n\n /**\n * builds a new DmCmpsDataSource\n * @param initialData The data to be used as datasource\n */\n constructor(initialData: T[] = []) {\n this.data = initialData;\n this.filteredData = [...initialData];\n this._resultData = [...initialData];\n if (\n this.autoPaginationAboveItemsCount > 0 &&\n initialData.length > this.autoPaginationAboveItemsCount\n ) {\n this.paginationEnabled = true;\n }\n this.updateResultSignal();\n\n this.subscription.add(\n toObservable(this.searchDebounceTime)\n .pipe(\n switchMap((debounceMs) =>\n this.searchTerms$.pipe(\n debounceTime(debounceMs),\n distinctUntilChanged((p, c) => p === c)\n )\n )\n )\n .subscribe((term) => {\n this.searchTerm = term;\n this.applySearch();\n })\n );\n // this.searchTerms$\n // .pipe(\n // debounceTime(this.searchDebounceTime),\n // distinctUntilChanged((p, c) => p === c && c != '')\n // )\n // .subscribe((term) => {\n // this.searchTerm = term;\n // this.applySearch();\n // });\n }\n\n private updateResultData() {\n this.applySorting();\n this.applySearch();\n this.updateResultSignal();\n }\n\n disconnect(): void {\n this.subscription.unsubscribe();\n }\n\n setAutoPaginationAboveItemsCount(count: number): void {\n this.autoPaginationAboveItemsCount = count;\n if (count > 0 && this._resultData.length > count) {\n this.paginationEnabled = true;\n } else {\n this.paginationEnabled = false;\n }\n this.updateResultSignal();\n }\n\n applyPagination(pageSize?: number): void {\n if (pageSize !== undefined && pageSize < 5) {\n throw new Error('Page size must be at least 5');\n }\n this.currentPageIndex = 0;\n this.paginationEnabled = true;\n if (pageSize) {\n this.pageSize = pageSize;\n }\n }\n\n setPageSize(pageSize: number): void {\n if (pageSize < 5) {\n throw new Error('Page size must be at least 5');\n }\n this.pageSize = pageSize;\n this.updateResultSignal();\n }\n\n disablePagination(): void {\n this.currentPageIndex = 0;\n this.paginationEnabled = false;\n this.updateResultSignal();\n }\n\n nextPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n const totalPages = Math.ceil(this._resultData.length / this.pageSize);\n if (this.currentPageIndex < totalPages - 1) {\n this.currentPageIndex++;\n }\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n previousPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n if (this.currentPageIndex > 0) {\n this.currentPageIndex--;\n }\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n firstPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n this.currentPageIndex = 0;\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n lastPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n const totalPages = Math.ceil(this._resultData.length / this.pageSize);\n this.currentPageIndex = totalPages - 1;\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n getCurrentPageIndex(): number {\n return this.currentPageIndex;\n }\n\n getTotalPagesCount(): number {\n if (this.pageSize <= 0) {\n return 1;\n }\n return Math.ceil(this._resultData.length / this.pageSize);\n }\n\n setSearchDebounceTime(milliseconds: number): void {\n this.searchDebounceTime.set(milliseconds);\n }\n\n setDatasource(newData: T[]) {\n this.data = [...newData];\n this.applyObjectFilter();\n }\n\n private updateResultSignal() {\n const res = (() => {\n if (\n this.pageSize > 0 &&\n (this.paginationEnabled ||\n (this.autoPaginationAboveItemsCount > 0 &&\n this._resultData.length > this.autoPaginationAboveItemsCount))\n ) {\n const startIndex = this.currentPageIndex * this.pageSize;\n return this._resultData.slice(startIndex, startIndex + this.pageSize);\n }\n return this._resultData;\n })();\n this.result.set(res);\n }\n\n // get resultData(): T[] {\n // if (\n // this.pageSize > 0 &&\n // (this.paginationEnabled ||\n // (this.autoPaginationAboveItemsCount > 0 &&\n // this._resultData.length > this.autoPaginationAboveItemsCount))\n // ) {\n // const startIndex = this.currentPageIndex * this.pageSize;\n // return this.filteredData.slice(startIndex, startIndex + this.pageSize);\n // }\n\n // return this.filteredData;\n // }\n\n search(filterTerm: string): void {\n this.searchTerms$.next(filterTerm);\n }\n\n private applySearch(): void {\n if (!this.searchTerm) {\n this._resultData = [...this.filteredData];\n } else {\n this.currentPageIndex = 0;\n this._resultData = this.filteredData.filter((item) =>\n this.filterPredicate(item, this.searchTerm)\n );\n }\n this.updateResultSignal();\n }\n\n setFilterPredicate(predicate: (data: T, filter: string) => boolean): void {\n this.filterPredicate = predicate;\n }\n\n setFieldsToSearchIn(fields: string[]) {\n if (!fields || fields.length === 0) {\n throw new Error('Fields to search in cannot be empty');\n }\n this.fieldsToSearchIn = fields;\n this.setFilterPredicate((item: T, filter: string) => {\n if (!item || !filter) {\n return true;\n }\n if (this.speratedSearch) {\n const terms = filter\n .split(' ')\n .map((t) => t.trim())\n .filter((t) => !!t);\n return terms.every((term) => {\n return this.fieldsToSearchIn.some((field) => {\n const value = (item as any)[field];\n if (value != null) {\n return value.toString().toLowerCase().includes(term.toLowerCase());\n }\n return false;\n });\n });\n }\n return this.fieldsToSearchIn.some((field) => {\n const value = (item as any)[field];\n if (value != null) {\n return value.toString().toLowerCase().includes(filter.toLowerCase());\n }\n return false;\n });\n });\n }\n\n setSortFunction(sortFn: ((a: T, b: T) => number) | null): void {\n this.sortFn = sortFn;\n }\n\n private applySorting() {\n if (this.sortMap.length === 0 && !this.sortFn) {\n return;\n }\n if (this.sortFn) {\n this.filteredData.sort(this.sortFn);\n return;\n }\n\n this.filteredData.sort((a, b) => {\n for (const sort of this.sortMap) {\n let comparison = 0;\n if (sort.sortFn) {\n comparison = sort.sortFn(a, b);\n } else {\n const aValue = (a as any)[sort.field];\n const bValue = (b as any)[sort.field];\n if (isNaN(aValue) || isNaN(bValue)) {\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n comparison = aValue.localeCompare(bValue);\n } else {\n comparison = 0;\n }\n } else if (aValue < bValue) {\n comparison = -1;\n } else if (aValue > bValue) {\n comparison = 1;\n } else {\n comparison = 0;\n }\n }\n\n if (comparison !== 0) {\n return sort.direction === 'asc' ? comparison : -comparison;\n }\n }\n return 0;\n });\n }\n\n sortByFields(sortMap: DmCmpsDataSourceSort[]): void {\n this.sortMap = sortMap;\n this.sortFn = null;\n this.updateResultData();\n }\n\n resetSorting(): void {\n this.sortMap = [];\n this.sortFn = null;\n this.applyObjectFilter();\n }\n\n setFilterByObjectFields(filterObj: Partial<T> | null): void {\n this.filterByObject = filterObj;\n this.applyObjectFilter();\n }\n\n private applyObjectFilter(): void {\n if (!this.filterByObject) {\n this.filteredData = [...this.data];\n } else {\n this.filteredData = this.data.filter((item) => {\n for (const [key, value] of Object.entries(this.filterByObject!)) {\n if ((item as any)[key] !== value) {\n return false;\n }\n }\n return true;\n });\n }\n this.updateResultData();\n }\n\n applySperatedSearch(enabled: boolean): void {\n this.speratedSearch = enabled;\n }\n}\n\ninterface DmCmpsDataSourceConfig<T = any> {\n /**\n * Disconnects the data source and performs any necessary cleanup.\n */\n disconnect: () => void;\n\n /**\n * Sets auto pagination threshold.\n * When the number of items exceeds the given count, pagination will be enabled automatically.\n * Use -1 to disable auto pagination.\n *\n * @param count Number of items threshold\n * @default 100\n */\n setAutoPaginationAboveItemsCount: (count: number) => void;\n\n /**\n * ApplyPagination - Enables pagination with the given page size.\n *\n * @param pageSize Number of items per page, optional, default is 10, must be at least 5\n * @default 10\n */\n applyPagination: (pageSize?: number) => void;\n\n /**\n * Sets the page size for pagination.\n * @param pageSize Number of items per page, must be at least 5\n */\n setPageSize: (pageSize: number) => void;\n\n /**\n * Disables pagination.\n */\n disablePagination: () => void;\n\n /**\n * Moves to the next page and returns the current page index.\n * @returns New current page index\n */\n nextPage: () => number;\n\n /**\n * Moves to the previous page and returns the current page index.\n * @returns New current page index\n */\n previousPage: () => number;\n\n /**\n * Moves to the first page and returns the current page index.\n * @returns New current page index\n */\n firstPage: () => number;\n\n /**\n * Moves to the last page and returns the current page index.\n * @returns New current page index\n */\n lastPage: () => number;\n\n /**\n * Gets the current page index.\n * @returns Current page index\n */\n getCurrentPageIndex: () => number;\n\n /**\n * Gets the total number of pages.\n * @returns Total pages count\n */\n getTotalPagesCount: () => number;\n\n /**\n * Sets the debounce time for search input.\n * @param milliseconds Debounce time in milliseconds\n * @default 300\n */\n setSearchDebounceTime: (milliseconds: number) => void;\n\n /**\n * Sets the data source.\n * @param newData New data array\n */\n setDatasource: (newData: T[]) => void;\n\n /**\n * Performs a search with the given filter term.\n * @param filterTerm The term to filter the data\n */\n search: (filterTerm: string) => void;\n\n /**\n * Sets the filter predicate function.\n * @param predicate Function to filter data items\n *\n * @default - A default predicate that checks if the item includes the filter term in any of its non Object properties.\n */\n setFilterPredicate: (predicate: (data: T, filter: string) => boolean) => void;\n\n /**\n * Sets the fields to search in.\n * @param fields Array of field names to search in\n *\n * @default - All non Object properties of the data items.\n */\n setFieldsToSearchIn: (fields: string[]) => void;\n\n /**\n * Sets a custom sort function.\n * @param sortFn Custom sort function\n *\n * @default - No custom sort function.\n */\n setSortFunction: (sortFn: ((a: T, b: T) => number) | null) => void;\n\n /**\n * Sorts the data by the given fields and directions.\n * @param sortMap\n * @default - No sorting applied.\n */\n sortByFields: (sortMap: DmCmpsDataSourceSort[]) => void;\n\n /**\n * Resets any applied sorting.\n */\n resetSorting: () => void;\n\n /**\n * Sets filter by object fields.\n * @param filterObj Object with fields and values to filter by\n * @default null (no filtering)\n */\n setFilterByObjectFields: (filterObj: Partial<T> | null) => void;\n\n /**\n * Enables or disables separated search.\n * When enabled, the search term is split by spaces and each term is searched separately.\n * @param enabled true to enable separated search, false to disable\n * @default false\n */\n applySperatedSearch: (enabled: boolean) => void;\n}\n","import {\n Input,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n} from '@angular/core';\nimport { DmMatSelectOutput } from './dm-mat-select';\nimport { FormControl } from '@angular/forms';\nimport { MatSelectChange } from '@angular/material/select';\n\nexport const SEARCH_SECTION_BG_COLOR_VAR = '--dm-mat-select-search-section-bg-color';\nexport const SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE = '#faf9fd';\n\n/**\n * Public API for <dm-mat-select>\n *\n * This interface describes all inputs, outputs, and configuration options.\n * It is used only for documentation and IntelliSense — not for runtime behavior.\n */\nexport interface DmMatSelectConfig<T = any> {\n /**\n * CSS classes applied to the mat-form-field element.\n * ```\n * type string\n * ```\n *\n */\n formFieldClass?: InputSignal<string>;\n\n /**\n * CSS classes applied to the wrapper div element.\n * ```\n * type string\n * ```\n *\n */\n wrapperClass?: InputSignal<string>;\n\n /**\n * Appearance style of the select component.\n * ```\n * type 'fill' | 'outline'\n * ```\n *\n * @default fill\n */\n appearance?: InputSignal<'fill' | 'outline'>;\n\n /**\n * Enables multiple selection mode.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n multiple?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Enables a \"Select All\" option in the dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n selectAllEnabled?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Text of the \"Select All\" checkbox.\n * ```\n * type string\n * ```\n *\n * @default 'בחר הכל'\n */\n selectAllLabel?: InputSignal<string>;\n\n /**\n * Label shown in the form field.\n * ```\n * type string\n * ```\n *\n * @default ''\n */\n label?: InputSignal<string>;\n\n /**\n * The list of items shown in the dropdown.\n * ```\n * type T[]\n * ```\n *\n * @default []\n */\n options: InputSignal<T[]>;\n\n /**\n * The property to use as the unique identifier of each item.\n * ```\n * type keyof T\n * ```\n *\n * @default '_id'\n */\n optionValueKey?: InputSignal<keyof T>;\n\n /**\n * The property to use as the display label.\n * ```\n * type keyof T\n * ```\n *\n * @default 'name'\n */\n optionLabelKey?: InputSignal<keyof T>;\n\n /**\n * Enables searching inside the dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n searchable?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Function to filter options based on search input.\n * ```\n * type ((option: T, filter: string) => boolean) | null\n * ```\n *\n * @default null\n */\n filterPredicate?: InputSignal<((option: T, filter: string) => boolean) | null>;\n\n /**\n * Marks field as required.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n required?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Disables the component.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n disabled?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Custom error message.\n * ```\n * type string | null\n * ```\n *\n * @default null\n */\n error?: InputSignal<string | null>;\n\n /**\n * Placeholder text for the search input.\n * ```\n * type string\n * ```\n *\n * @default 'חפש...'\n */\n searchPlaceholder?: InputSignal<string>;\n\n /**\n * Enables an empty option in the select dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n emptyOption?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Label for the empty option.\n * ```\n * type string\n * ```\n *\n * @default 'ללא'\n */\n emptyOptionLabel?: InputSignal<string>;\n\n /**\n * Value for the empty option.\n * ```\n * type null | string | number\n * ```\n *\n * @default null\n */\n emptyOptionValue?: InputSignal<T | null>;\n\n /**\n * Function to format option names for display.\n * ```\n * type (option: T) => string\n * ```\n *\n */\n optionNameFormat?: InputSignal<((option: T) => string) | null>;\n\n /**\n * Width of the select panel.\n * To set the panel width to match the trigger width, use 'auto'.\n * To set a custom width, provide a CSS width value (e.g., '300px', '50%', etc.).\n * To have the panel width adjust to its content, set to null or empty string.\n * ```\n * type string | null\n * ```\n *\n * @default 'auto'\n */\n panelWidth?: InputSignal<string | null>;\n\n /**\\\n * Custom CSS classes applied to the select panel.\n * Can be a string, array of strings, Set of strings, or an object with class names as keys and boolean values.\n * Accepts the same values as ngClass.\n * ```\n * type string | string[] | Set<string> | { [key: string]: any }\n * ```\n *\n * @default ''\n */\n panelClass?: InputSignal<string | string[] | Set<string> | { [key: string]: any }>;\n\n /**\\\n * Background color for the search section.\n * Uses CSS variable '--dm-mat-select-search-section-bg-color'.\n * ```\n * type string | null\n * ```\n *\n * @default '#faf9fd'\n */\n searchSectionBackgroundColor?: InputSignal<string | null>;\n\n /**\n * Sort selected items at top of the list.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n sortBySelectedOnTop?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * A signal that holds the selected value(s) of the select component.\n * ```\n * type ModelSignal<DmMatSelectOutput<T>>\n * ```\n *\n * @default null\n */\n value?: ModelSignal<DmMatSelectOutput<T>>;\n\n /**\n * FormControl to bind to the select component.\n * ```\n * type FormControl<DmMatSelectOutput<T>> | null\n * ```\n *\n * @default null\n */\n formControl?: InputSignal<FormControl<DmMatSelectOutput<T>> | null>;\n\n /**\n * Event emitted when the selection changes.\n * ```\n * type OutputEmitterRef<MatSelectChange<DmMatSelectOutput<T>>>\n * ```\n *\n *\n */\n selectionChange?: OutputEmitterRef<MatSelectChange<DmMatSelectOutput<T>>>;\n\n /**\n * Icon name to display in the select trigger.\n * Can be a Material icon name or a Bootstrap icon html (like <i class=\"bi bi-name\"></i>).\n * ```\n * type string | null\n * ```\n *\n * @default null\n */\n icon?: InputSignal<string | null>;\n\n /**\n * Label to show in disabled option when there is no data to display.\n * ```\n * type string\n * ```\n *\n * @default 'אין נתונים להצגה'\n */\n noDataLabel?: InputSignal<string>;\n\n /**\n * Cleans the search input after selecting an option.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n clearSearchAfterSelect?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Tooltip text for the clear search button.\n * ```\n * type string\n * ```\n * @default 'נקה חיפוש'\n */\n clearSearchButtonTooltip?: InputSignal<string>;\n\n /**\n * Automatically focuses the search input when the panel opens.\n * ```\n * type boolean\n * ```\n *\n * @default true\n */\n focusSearchInputOnPanelOpen?: InputSignalWithTransform<boolean, unknown>;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { MatFormFieldModule, MatSuffix } from '@angular/material/form-field';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { DmCmpsDataSource } from '../utils/dm-cmps-data-source';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptionSelectionChange } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\nimport {\n DmMatSelectConfig,\n SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE,\n SEARCH_SECTION_BG_COLOR_VAR,\n} from './utils';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nexport type DmMatSelectOutput<T> = T | T[] | string | string[] | number | number[] | null;\ntype DmMatSelectOption<T> = T & { __dmMatSelectFormattedName: string };\n\n@Component({\n selector: 'dm-mat-select',\n standalone: true,\n imports: [\n MatFormFieldModule,\n MatSelectModule,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatCheckboxModule,\n MatIcon,\n MatButtonModule,\n MatTooltip,\n MatSuffix,\n ],\n templateUrl: './dm-mat-select.html',\n styleUrl: './dm-mat-select.scss',\n})\nexport class DmMatSelect<T = any> implements DmMatSelectConfig<T>, OnDestroy {\n formFieldClass = input<string>('');\n wrapperClass = input<string>('');\n appearance = input<'fill' | 'outline'>('fill');\n multiple = input(false, { transform: booleanAttribute });\n selectAllEnabled = input(false, { transform: booleanAttribute });\n selectAllLabel = input<string>('בחר הכל');\n label = input<string>('');\n options = input<T[]>([]);\n optionValueKey = input<keyof T>('_id' as keyof T);\n optionLabelKey = input<keyof T>('name' as keyof T);\n searchable = input(false, { transform: booleanAttribute });\n\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n error = input<string | null>(null);\n\n searchPlaceholder = input<string>('חפש...');\n\n emptyOption = input(false, { transform: booleanAttribute });\n emptyOptionLabel = input<string>('ללא');\n emptyOptionValue = input<T | null>(null);\n\n optionNameFormat = input<((option: T) => string) | null>(null);\n private _optionNameFormat: ((option: T) => string) | null = null;\n\n protected datasource = signal<DmCmpsDataSource<DmMatSelectOption<T>>>(\n new DmCmpsDataSource<DmMatSelectOption<T>>()\n );\n\n value = model<DmMatSelectOutput<T>>(null);\n\n formControl = input<FormControl<DmMatSelectOutput<T>> | null>(null);\n panelWidth = input<string | null>('auto');\n panelClass = input<string | string[] | Set<string> | { [key: string]: any }>('');\n searchSectionBackgroundColor = input<string | null>(SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE);\n\n sortBySelectedOnTop = input(false, { transform: booleanAttribute });\n\n private internalControl = new FormControl<DmMatSelectOutput<T>>(null);\n\n protected control = computed(() => this.formControl() ?? this.internalControl);\n\n selectionChange = output<MatSelectChange<DmMatSelectOutput<T>>>();\n\n icon = input<string | null>(null);\n\n protected isBootstrapIcon = computed(() => {\n return this.icon() ? this.icon()!.includes('bi-') : false;\n });\n\n noDataLabel = input<string>('אין נתונים להצגה');\n\n clearSearchAfterSelect = input(true, { transform: booleanAttribute });\n\n clearSearchButtonTooltip = input<string>('נקה חיפוש');\n\n focusSearchInputOnPanelOpen = input(true, { transform: booleanAttribute });\n\n filterPredicate = input<((option: T, filterText: string) => boolean) | null>(null);\n private _filterPredicate: ((option: T, filterText: string) => boolean) | null = null;\n\n simpleArray = computed(() => {\n return typeof this.options()[0] === 'string' || typeof this.options()[0] === 'number';\n });\n\n private selectedOptionsIdsSet = signal<Set<any>>(new Set());\n\n protected filterText = model<string>('');\n\n protected checkIfAllSelected = computed(() => {\n const options = this.datasource().result();\n const selected = this.control().value;\n const allSelected =\n options.length > 0 &&\n Array.isArray(selected) &&\n selected.length >= options.length &&\n options.every((option) => {\n const optionValue = this.getOptionValue(option);\n return this.selectedOptionsIdsSet().has(optionValue);\n });\n\n return allSelected;\n });\n\n constructor() {\n this.runEffects();\n }\n\n ngOnDestroy(): void {\n this.datasource().disconnect();\n }\n\n setOptionsFormattedNames(options: DmMatSelectOption<T>[]) {\n if (this._optionNameFormat) {\n for (const option of options) {\n option.__dmMatSelectFormattedName = this._optionNameFormat(option);\n }\n }\n }\n\n private runEffects() {\n effect(() => {\n this._filterPredicate = this.filterPredicate();\n this._optionNameFormat = this.optionNameFormat();\n });\n\n effect(() => {\n const opts = this.options() as DmMatSelectOption<T>[];\n this.setOptionsFormattedNames(opts);\n this.datasource().setAutoPaginationAboveItemsCount(-1);\n this.datasource().setSearchDebounceTime(3000);\n if (this._filterPredicate) {\n console.log('filter predicate updated!!!!!!!!');\n\n this.datasource().setFilterPredicate(this._filterPredicate);\n }\n if (this.sortBySelectedOnTop() && this.multiple()) {\n this.datasource().setSortFunction(\n ((a: T, b: T) => {\n const aSelected = this.selectedOptionsIdsSet().has(this.getOptionValue(a));\n const bSelected = this.selectedOptionsIdsSet().has(this.getOptionValue(b));\n if (aSelected && !bSelected) {\n return -1;\n } else if (!aSelected && bSelected) {\n return 1;\n } else {\n return 0;\n }\n }).bind(this)\n );\n }\n this.datasource().setDatasource(opts);\n });\n\n effect(() => {\n if (this.formControl()) {\n return;\n }\n this.internalControl.setValue(this.value(), { emitEvent: false });\n });\n\n effect((onCleanup) => {\n const ctrl = this.control();\n const setSelectedIdsSet = (selectedVal: DmMatSelectOutput<T>) => {\n const newSelectedIdsSet = new Set<any>();\n if (this.multiple()) {\n const arr = Array.isArray(selectedVal) ? selectedVal : [];\n for (const item of arr) {\n const id = this.getOptionValue(item as T);\n newSelectedIdsSet.add(id);\n }\n this.selectedOptionsIdsSet.set(newSelectedIdsSet);\n }\n };\n setSelectedIdsSet(ctrl.value);\n\n const sub = ctrl.valueChanges.subscribe((val) => {\n setSelectedIdsSet(val);\n this.value.set(val);\n });\n\n onCleanup(() => sub.unsubscribe());\n });\n\n effect(() => {\n document.documentElement.style.setProperty(\n SEARCH_SECTION_BG_COLOR_VAR,\n this.searchSectionBackgroundColor() ?? SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE\n );\n });\n }\n\n protected applyFilter(event: KeyboardEvent) {\n const target = event.target as HTMLInputElement;\n this.filterText.set(target.value);\n this.datasource().search(this.filterText());\n }\n\n protected selectionChangeHandler(event: MatSelectChange<T | T[] | null>) {\n this.selectionChange.emit(event);\n }\n\n private getOptionValue(option: T): any {\n if (this.simpleArray()) return option;\n return typeof option === 'object' && option != null\n ? (option as any)[this.optionValueKey()]\n : option;\n }\n\n protected onSelectionChangeHandler(event: MatOptionSelectionChange, option: T | null) {\n if (!event.isUserInput) return;\n console.log('selection change!!');\n\n const selected = event.source.selected;\n const currentValue = this.control().value;\n if (this.multiple()) {\n if (!option) return;\n const arr = Array.isArray(currentValue) ? currentValue : [];\n let newValue: (string | number | T)[];\n if (selected) {\n newValue = [...arr, this.getOptionValue(option)];\n } else {\n newValue = arr.filter((v) => v !== this.getOptionValue(option));\n }\n this.control().setValue(newValue as DmMatSelectOutput<T>);\n } else {\n if (!option) {\n this.control().setValue(this.emptyOptionValue());\n return;\n }\n if (selected) {\n console.log('set value => ', option);\n\n this.control().setValue(this.getOptionValue(option) as DmMatSelectOutput<T>);\n } else {\n this.control().setValue(null);\n }\n }\n if (this.clearSearchAfterSelect()) {\n this.resetSearch();\n }\n }\n\n protected selectAllChange(event: MatCheckboxChange) {\n if (event.checked) {\n const allValues = this.datasource()\n .result()\n .map((option) => this.getOptionValue(option));\n const newValues = Array.isArray(this.control().value)\n ? (this.control().value as (string | T)[])\n : [];\n for (const val of allValues) {\n if (!this.selectedOptionsIdsSet().has(val)) {\n newValues.push(val);\n }\n }\n this.control().setValue(newValues as DmMatSelectOutput<T>);\n } else {\n const selectedValues = (this.control().value as (string | T)[]).filter((val) => {\n const allOptionValues = this.datasource()\n .result()\n .map((option) => this.getOptionValue(option));\n return !allOptionValues.includes(val as any);\n });\n this.control().setValue(selectedValues as DmMatSelectOutput<T>);\n }\n }\n\n protected resetSearch() {\n this.filterText.set('');\n this.datasource().search('');\n }\n\n protected onPanelOpened() {\n if (this.focusSearchInputOnPanelOpen()) {\n const searchInput = document.getElementById('dm-mat-select-search-input') as HTMLInputElement;\n setTimeout(() => {\n if (searchInput) {\n searchInput.focus();\n }\n }, 0);\n }\n }\n}\n","<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n","/*\n * Public API Surface of dm-cmps\n */\n\nexport { DmCmpsDataSource } from './lib/utils/dm-cmps-data-source';\nexport type { DmCmpsDataSourceSort } from './lib/utils/dm-cmps-data-source';\nexport { DmMatSelect } from './lib/dm-mat-select/dm-mat-select';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"dmlibs-dm-cmps.mjs","sources":["../../../projects/dm-cmps/src/lib/utils/dm-cmps-data-source.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/utils.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/dm-mat-select.ts","../../../projects/dm-cmps/src/lib/dm-mat-select/dm-mat-select.html","../../../projects/dm-cmps/src/public-api.ts","../../../projects/dm-cmps/src/dmlibs-dm-cmps.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { toObservable } from '@angular/core/rxjs-interop';\nimport { debounceTime, distinctUntilChanged, Subject, Subscription, switchMap } from 'rxjs';\n\nexport interface DmCmpsDataSourceSort {\n direction: 'asc' | 'desc';\n field: string;\n sortFn?: (a: any, b: any) => number;\n}\n\nexport class DmCmpsDataSource<T> implements DmCmpsDataSourceConfig<T> {\n private data: T[];\n private filteredData: T[];\n private _resultData: T[];\n\n public result = signal<T[]>([]);\n\n private paginationEnabled: boolean = false;\n private currentPageIndex: number = 0;\n private pageSize: number = 10;\n private autoPaginationAboveItemsCount: number = 100;\n private propertiesToSkipInSearchSet: Set<string> = new Set([\n '_id',\n 'createdAt',\n 'updatedAt',\n '__v',\n 'createdBy',\n 'updatedBy',\n 'creatorName',\n 'updaterName',\n ]);\n\n private searchTerm: string = '';\n\n private speratedSearch: boolean = false;\n private filterPredicate: (data: T, filter: string) => boolean = (item: T, filter: string) => {\n if (!item || !filter) {\n return true;\n }\n if (typeof item === 'string') {\n return item.toLowerCase().includes(filter.toLowerCase());\n }\n const match = (term: string) => {\n return Object.entries(item).some(\n ([key, value]) =>\n !this.propertiesToSkipInSearchSet.has(key) &&\n value != null &&\n value.toString().toLowerCase().includes(term.toLowerCase())\n );\n };\n if (this.speratedSearch) {\n const terms = filter\n .split(' ')\n .map((t) => t.trim())\n .filter((t) => !!t);\n return terms.every((term) => match(term));\n }\n return match(filter);\n };\n\n private filterByObject: Partial<T> | null = null;\n\n private fieldsToSearchIn: string[] = [];\n\n private sortMap: DmCmpsDataSourceSort[] = [];\n private sortFn: ((a: T, b: T) => number) | null = null;\n\n private searchTerms$: Subject<string> = new Subject<string>();\n private searchDebounceTime = signal<number>(300);\n\n private readonly subscription = new Subscription();\n\n /**\n * builds a new DmCmpsDataSource\n * @param initialData The data to be used as datasource\n */\n constructor(initialData: T[] = []) {\n this.data = initialData;\n this.filteredData = [...initialData];\n this._resultData = [...initialData];\n if (\n this.autoPaginationAboveItemsCount > 0 &&\n initialData.length > this.autoPaginationAboveItemsCount\n ) {\n this.paginationEnabled = true;\n }\n this.updateResultSignal();\n\n this.subscription.add(\n toObservable(this.searchDebounceTime)\n .pipe(\n switchMap((debounceMs) =>\n this.searchTerms$.pipe(\n debounceTime(debounceMs),\n distinctUntilChanged((p, c) => p === c)\n )\n )\n )\n .subscribe((term) => {\n this.searchTerm = term;\n this.applySearch();\n })\n );\n // this.searchTerms$\n // .pipe(\n // debounceTime(this.searchDebounceTime),\n // distinctUntilChanged((p, c) => p === c && c != '')\n // )\n // .subscribe((term) => {\n // this.searchTerm = term;\n // this.applySearch();\n // });\n }\n\n private updateResultData() {\n this.applySorting();\n this.applySearch();\n this.updateResultSignal();\n }\n\n disconnect(): void {\n this.subscription.unsubscribe();\n }\n\n setAutoPaginationAboveItemsCount(count: number): void {\n this.autoPaginationAboveItemsCount = count;\n if (count > 0 && this._resultData.length > count) {\n this.paginationEnabled = true;\n } else {\n this.paginationEnabled = false;\n }\n this.updateResultSignal();\n }\n\n applyPagination(pageSize?: number): void {\n if (pageSize !== undefined && pageSize < 5) {\n throw new Error('Page size must be at least 5');\n }\n this.currentPageIndex = 0;\n this.paginationEnabled = true;\n if (pageSize) {\n this.pageSize = pageSize;\n }\n }\n\n setPageSize(pageSize: number): void {\n if (pageSize < 5) {\n throw new Error('Page size must be at least 5');\n }\n this.pageSize = pageSize;\n this.updateResultSignal();\n }\n\n disablePagination(): void {\n this.currentPageIndex = 0;\n this.paginationEnabled = false;\n this.updateResultSignal();\n }\n\n nextPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n const totalPages = Math.ceil(this._resultData.length / this.pageSize);\n if (this.currentPageIndex < totalPages - 1) {\n this.currentPageIndex++;\n }\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n previousPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n if (this.currentPageIndex > 0) {\n this.currentPageIndex--;\n }\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n firstPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n this.currentPageIndex = 0;\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n lastPage(): number {\n if (this.pageSize <= 0 || !this.paginationEnabled) {\n return 0;\n }\n const totalPages = Math.ceil(this._resultData.length / this.pageSize);\n this.currentPageIndex = totalPages - 1;\n this.updateResultSignal();\n return this.currentPageIndex;\n }\n\n getCurrentPageIndex(): number {\n return this.currentPageIndex;\n }\n\n getTotalPagesCount(): number {\n if (this.pageSize <= 0) {\n return 1;\n }\n return Math.ceil(this._resultData.length / this.pageSize);\n }\n\n setSearchDebounceTime(milliseconds: number): void {\n this.searchDebounceTime.set(milliseconds);\n }\n\n setDatasource(newData: T[]) {\n this.data = [...newData];\n this.applyObjectFilter();\n }\n\n private updateResultSignal() {\n const res = (() => {\n if (\n this.pageSize > 0 &&\n (this.paginationEnabled ||\n (this.autoPaginationAboveItemsCount > 0 &&\n this._resultData.length > this.autoPaginationAboveItemsCount))\n ) {\n const startIndex = this.currentPageIndex * this.pageSize;\n return this._resultData.slice(startIndex, startIndex + this.pageSize);\n }\n return this._resultData;\n })();\n this.result.set(res);\n }\n\n // get resultData(): T[] {\n // if (\n // this.pageSize > 0 &&\n // (this.paginationEnabled ||\n // (this.autoPaginationAboveItemsCount > 0 &&\n // this._resultData.length > this.autoPaginationAboveItemsCount))\n // ) {\n // const startIndex = this.currentPageIndex * this.pageSize;\n // return this.filteredData.slice(startIndex, startIndex + this.pageSize);\n // }\n\n // return this.filteredData;\n // }\n\n search(filterTerm: string): void {\n this.searchTerms$.next(filterTerm);\n }\n\n private applySearch(): void {\n if (!this.searchTerm) {\n this._resultData = [...this.filteredData];\n } else {\n this.currentPageIndex = 0;\n this._resultData = this.filteredData.filter((item) =>\n this.filterPredicate(item, this.searchTerm)\n );\n }\n this.updateResultSignal();\n }\n\n setFilterPredicate(predicate: (data: T, filter: string) => boolean): void {\n this.filterPredicate = predicate;\n }\n\n setFieldsToSearchIn(fields: string[]) {\n if (!fields || fields.length === 0) {\n throw new Error('Fields to search in cannot be empty');\n }\n this.fieldsToSearchIn = fields;\n this.setFilterPredicate((item: T, filter: string) => {\n if (!item || !filter) {\n return true;\n }\n if (this.speratedSearch) {\n const terms = filter\n .split(' ')\n .map((t) => t.trim())\n .filter((t) => !!t);\n return terms.every((term) => {\n return this.fieldsToSearchIn.some((field) => {\n const value = (item as any)[field];\n if (value != null) {\n return value.toString().toLowerCase().includes(term.toLowerCase());\n }\n return false;\n });\n });\n }\n return this.fieldsToSearchIn.some((field) => {\n const value = (item as any)[field];\n if (value != null) {\n return value.toString().toLowerCase().includes(filter.toLowerCase());\n }\n return false;\n });\n });\n }\n\n setSortFunction(sortFn: ((a: T, b: T) => number) | null): void {\n this.sortFn = sortFn;\n }\n\n private applySorting() {\n if (this.sortMap.length === 0 && !this.sortFn) {\n return;\n }\n if (this.sortFn) {\n this.filteredData.sort(this.sortFn);\n return;\n }\n\n this.filteredData.sort((a, b) => {\n for (const sort of this.sortMap) {\n let comparison = 0;\n if (sort.sortFn) {\n comparison = sort.sortFn(a, b);\n } else {\n const aValue = (a as any)[sort.field];\n const bValue = (b as any)[sort.field];\n if (isNaN(aValue) || isNaN(bValue)) {\n if (typeof aValue === 'string' && typeof bValue === 'string') {\n comparison = aValue.localeCompare(bValue);\n } else {\n comparison = 0;\n }\n } else if (aValue < bValue) {\n comparison = -1;\n } else if (aValue > bValue) {\n comparison = 1;\n } else {\n comparison = 0;\n }\n }\n\n if (comparison !== 0) {\n return sort.direction === 'asc' ? comparison : -comparison;\n }\n }\n return 0;\n });\n }\n\n sortByFields(sortMap: DmCmpsDataSourceSort[]): void {\n this.sortMap = sortMap;\n this.sortFn = null;\n this.updateResultData();\n }\n\n resetSorting(): void {\n this.sortMap = [];\n this.sortFn = null;\n this.applyObjectFilter();\n }\n\n setFilterByObjectFields(filterObj: Partial<T> | null): void {\n this.filterByObject = filterObj;\n this.applyObjectFilter();\n }\n\n private applyObjectFilter(): void {\n if (!this.filterByObject) {\n this.filteredData = [...this.data];\n } else {\n this.filteredData = this.data.filter((item) => {\n for (const [key, value] of Object.entries(this.filterByObject!)) {\n if ((item as any)[key] !== value) {\n return false;\n }\n }\n return true;\n });\n }\n this.updateResultData();\n }\n\n applySperatedSearch(enabled: boolean): void {\n this.speratedSearch = enabled;\n }\n\n setPropertiesToSkipInSearch(...props: string[]): void {\n this.propertiesToSkipInSearchSet = new Set(props);\n }\n}\n\ninterface DmCmpsDataSourceConfig<T = any> {\n /**\n * Disconnects the data source and performs any necessary cleanup.\n */\n disconnect: () => void;\n\n /**\n * Sets auto pagination threshold.\n * When the number of items exceeds the given count, pagination will be enabled automatically.\n * Use -1 to disable auto pagination.\n *\n * @param count Number of items threshold\n * @default 100\n */\n setAutoPaginationAboveItemsCount: (count: number) => void;\n\n /**\n * ApplyPagination - Enables pagination with the given page size.\n *\n * @param pageSize Number of items per page, optional, default is 10, must be at least 5\n * @default 10\n */\n applyPagination: (pageSize?: number) => void;\n\n /**\n * Sets the page size for pagination.\n * @param pageSize Number of items per page, must be at least 5\n */\n setPageSize: (pageSize: number) => void;\n\n /**\n * Disables pagination.\n */\n disablePagination: () => void;\n\n /**\n * Moves to the next page and returns the current page index.\n * @returns New current page index\n */\n nextPage: () => number;\n\n /**\n * Moves to the previous page and returns the current page index.\n * @returns New current page index\n */\n previousPage: () => number;\n\n /**\n * Moves to the first page and returns the current page index.\n * @returns New current page index\n */\n firstPage: () => number;\n\n /**\n * Moves to the last page and returns the current page index.\n * @returns New current page index\n */\n lastPage: () => number;\n\n /**\n * Gets the current page index.\n * @returns Current page index\n */\n getCurrentPageIndex: () => number;\n\n /**\n * Gets the total number of pages.\n * @returns Total pages count\n */\n getTotalPagesCount: () => number;\n\n /**\n * Sets the debounce time for search input.\n * @param milliseconds Debounce time in milliseconds\n * @default 300\n */\n setSearchDebounceTime: (milliseconds: number) => void;\n\n /**\n * Sets the data source.\n * @param newData New data array\n */\n setDatasource: (newData: T[]) => void;\n\n /**\n * Performs a search with the given filter term.\n * @param filterTerm The term to filter the data\n */\n search: (filterTerm: string) => void;\n\n /**\n * Sets the filter predicate function.\n * @param predicate Function to filter data items\n *\n * @default - A default predicate that checks if the item includes the filter term in any of its non Object properties.\n */\n setFilterPredicate: (predicate: (data: T, filter: string) => boolean) => void;\n\n /**\n * Sets the fields to search in.\n * @param fields Array of field names to search in\n *\n * @default - All non Object properties of the data items.\n */\n setFieldsToSearchIn: (fields: string[]) => void;\n\n /**\n * Sets a custom sort function.\n * @param sortFn Custom sort function\n *\n * @default - No custom sort function.\n */\n setSortFunction: (sortFn: ((a: T, b: T) => number) | null) => void;\n\n /**\n * Sorts the data by the given fields and directions.\n * @param sortMap\n * @default - No sorting applied.\n */\n sortByFields: (sortMap: DmCmpsDataSourceSort[]) => void;\n\n /**\n * Resets any applied sorting.\n */\n resetSorting: () => void;\n\n /**\n * Sets filter by object fields.\n * @param filterObj Object with fields and values to filter by\n * @default null (no filtering)\n */\n setFilterByObjectFields: (filterObj: Partial<T> | null) => void;\n\n /**\n * Enables or disables separated search.\n * When enabled, the search term is split by spaces and each term is searched separately.\n * @param enabled true to enable separated search, false to disable\n * @default false\n */\n applySperatedSearch: (enabled: boolean) => void;\n\n /**\n * Sets keys to skip in default search.\n * @param Props Array of properties names to skip\n * @returns\n */\n setPropertiesToSkipInSearch: (...props: string[]) => void;\n}\n","import {\n Input,\n InputSignal,\n InputSignalWithTransform,\n ModelSignal,\n OutputEmitterRef,\n} from '@angular/core';\nimport { DmMatSelectOutput } from './dm-mat-select';\nimport { FormControl } from '@angular/forms';\nimport { MatSelectChange } from '@angular/material/select';\n\nexport const SEARCH_SECTION_BG_COLOR_VAR = '--dm-mat-select-search-section-bg-color';\nexport const SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE = '#faf9fd';\n\n/**\n * Public API for <dm-mat-select>\n *\n * This interface describes all inputs, outputs, and configuration options.\n * It is used only for documentation and IntelliSense — not for runtime behavior.\n */\nexport interface DmMatSelectConfig<T = any> {\n /**\n * CSS classes applied to the mat-form-field element.\n * ```\n * type string\n * ```\n *\n */\n formFieldClass?: InputSignal<string>;\n\n /**\n * CSS classes applied to the wrapper div element.\n * ```\n * type string\n * ```\n *\n */\n wrapperClass?: InputSignal<string>;\n\n /**\n * Appearance style of the select component.\n * ```\n * type 'fill' | 'outline'\n * ```\n *\n * @default fill\n */\n appearance?: InputSignal<'fill' | 'outline'>;\n\n /**\n * Enables multiple selection mode.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n multiple?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Enables a \"Select All\" option in the dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n selectAllEnabled?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Text of the \"Select All\" checkbox.\n * ```\n * type string\n * ```\n *\n * @default 'בחר הכל'\n */\n selectAllLabel?: InputSignal<string>;\n\n /**\n * Label shown in the form field.\n * ```\n * type string\n * ```\n *\n * @default ''\n */\n label?: InputSignal<string>;\n\n /**\n * The list of items shown in the dropdown.\n * ```\n * type T[]\n * ```\n *\n * @default []\n */\n options: InputSignal<T[]>;\n\n /**\n * The property to use as the unique identifier of each item.\n * ```\n * type keyof T\n * ```\n *\n * @default '_id'\n */\n optionValueKey?: InputSignal<keyof T>;\n\n /**\n * The property to use as the display label.\n * ```\n * type keyof T\n * ```\n *\n * @default 'name'\n */\n optionLabelKey?: InputSignal<keyof T>;\n\n /**\n * Enables searching inside the dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n searchable?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Function to filter options based on search input.\n * ```\n * type ((option: T, filter: string) => boolean) | null\n * ```\n *\n * @default null\n */\n filterPredicate?: InputSignal<((option: T, filter: string) => boolean) | null>;\n\n /**\n * Marks field as required.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n required?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Disables the component.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n disabled?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Custom error message.\n * ```\n * type string | null\n * ```\n *\n * @default null\n */\n error?: InputSignal<string | null>;\n\n /**\n * Placeholder text for the search input.\n * ```\n * type string\n * ```\n *\n * @default 'חפש...'\n */\n searchPlaceholder?: InputSignal<string>;\n\n /**\n * Enables an empty option in the select dropdown.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n emptyOption?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Label for the empty option.\n * ```\n * type string\n * ```\n *\n * @default 'ללא'\n */\n emptyOptionLabel?: InputSignal<string>;\n\n /**\n * Value for the empty option.\n * ```\n * type null | string | number\n * ```\n *\n * @default null\n */\n emptyOptionValue?: InputSignal<T | null>;\n\n /**\n * Function to format option names for display.\n * ```\n * type (option: T) => string\n * ```\n *\n */\n optionNameFormat?: InputSignal<((option: T) => string) | null>;\n\n /**\n * Width of the select panel.\n * To set the panel width to match the trigger width, use 'auto'.\n * To set a custom width, provide a CSS width value (e.g., '300px', '50%', etc.).\n * To have the panel width adjust to its content, set to null or empty string.\n * ```\n * type string | null\n * ```\n *\n * @default 'auto'\n */\n panelWidth?: InputSignal<string | null>;\n\n /**\\\n * Custom CSS classes applied to the select panel.\n * Can be a string, array of strings, Set of strings, or an object with class names as keys and boolean values.\n * Accepts the same values as ngClass.\n * ```\n * type string | string[] | Set<string> | { [key: string]: any }\n * ```\n *\n * @default ''\n */\n panelClass?: InputSignal<string | string[] | Set<string> | { [key: string]: any }>;\n\n /**\\\n * Background color for the search section.\n * Uses CSS variable '--dm-mat-select-search-section-bg-color'.\n * ```\n * type string | null\n * ```\n *\n * @default '#faf9fd'\n */\n searchSectionBackgroundColor?: InputSignal<string | null>;\n\n /**\n * Sort selected items at top of the list.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n sortBySelectedOnTop?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * A signal that holds the selected value(s) of the select component.\n * ```\n * type ModelSignal<DmMatSelectOutput<T>>\n * ```\n *\n * @default null\n */\n value?: ModelSignal<DmMatSelectOutput<T>>;\n\n /**\n * FormControl to bind to the select component.\n * ```\n * type FormControl<DmMatSelectOutput<T>> | null\n * ```\n *\n * @default null\n */\n formControl?: InputSignal<FormControl<DmMatSelectOutput<T>> | null>;\n\n /**\n * Event emitted when the selection changes.\n * ```\n * type OutputEmitterRef<MatSelectChange<DmMatSelectOutput<T>>>\n * ```\n *\n *\n */\n selectionChange?: OutputEmitterRef<MatSelectChange<DmMatSelectOutput<T>>>;\n\n /**\n * Icon name to display in the select trigger.\n * Can be a Material icon name or a Bootstrap icon html (like <i class=\"bi bi-name\"></i>).\n * ```\n * type string | null\n * ```\n *\n * @default null\n */\n icon?: InputSignal<string | null>;\n\n /**\n * Label to show in disabled option when there is no data to display.\n * ```\n * type string\n * ```\n *\n * @default 'אין נתונים להצגה'\n */\n noDataLabel?: InputSignal<string>;\n\n /**\n * Cleans the search input after selecting an option.\n * ```\n * type boolean\n * ```\n *\n * @default false\n */\n clearSearchAfterSelect?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Tooltip text for the clear search button.\n * ```\n * type string\n * ```\n * @default 'נקה חיפוש'\n */\n clearSearchButtonTooltip?: InputSignal<string>;\n\n /**\n * Automatically focuses the search input when the panel opens.\n * ```\n * type boolean\n * ```\n *\n * @default true\n */\n focusSearchInputOnPanelOpen?: InputSignalWithTransform<boolean, unknown>;\n\n /**\n * Properties to skip in default search.\n * ```\n * type string[]\n * ```\n *\n * @default ['_id',\n 'createdAt',\n 'updatedAt',\n '__v',\n 'createdBy',\n 'updatedBy',\n 'creatorName',\n 'updaterName',]\n */\n propertiesToSkipInSearch?: InputSignal<string[]>;\n}\n","import {\n booleanAttribute,\n Component,\n computed,\n effect,\n input,\n model,\n OnDestroy,\n output,\n signal,\n} from '@angular/core';\nimport { MatFormFieldModule, MatSuffix } from '@angular/material/form-field';\nimport { MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { DmCmpsDataSource } from '../utils/dm-cmps-data-source';\nimport { CommonModule } from '@angular/common';\nimport { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { MatOptionSelectionChange } from '@angular/material/core';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatCheckboxChange, MatCheckboxModule } from '@angular/material/checkbox';\nimport {\n DmMatSelectConfig,\n SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE,\n SEARCH_SECTION_BG_COLOR_VAR,\n} from './utils';\nimport { MatIcon } from '@angular/material/icon';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatTooltip } from '@angular/material/tooltip';\n\nexport type DmMatSelectOutput<T> = T | T[] | string | string[] | number | number[] | null;\ntype DmMatSelectOption<T> = T & { __dmMatSelectFormattedName: string };\n\n@Component({\n selector: 'dm-mat-select',\n standalone: true,\n imports: [\n MatFormFieldModule,\n MatSelectModule,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatCheckboxModule,\n MatIcon,\n MatButtonModule,\n MatTooltip,\n MatSuffix,\n ],\n templateUrl: './dm-mat-select.html',\n styleUrl: './dm-mat-select.scss',\n})\nexport class DmMatSelect<T = any> implements DmMatSelectConfig<T>, OnDestroy {\n formFieldClass = input<string>('');\n wrapperClass = input<string>('');\n appearance = input<'fill' | 'outline'>('fill');\n multiple = input(false, { transform: booleanAttribute });\n selectAllEnabled = input(false, { transform: booleanAttribute });\n selectAllLabel = input<string>('בחר הכל');\n label = input<string>('');\n options = input<T[]>([]);\n optionValueKey = input<keyof T>('_id' as keyof T);\n optionLabelKey = input<keyof T>('name' as keyof T);\n searchable = input(false, { transform: booleanAttribute });\n\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n error = input<string | null>(null);\n\n searchPlaceholder = input<string>('חפש...');\n\n emptyOption = input(false, { transform: booleanAttribute });\n emptyOptionLabel = input<string>('ללא');\n emptyOptionValue = input<T | null>(null);\n\n optionNameFormat = input<((option: T) => string) | null>(null);\n private _optionNameFormat: ((option: T) => string) | null = null;\n\n protected datasource = signal<DmCmpsDataSource<DmMatSelectOption<T>>>(\n new DmCmpsDataSource<DmMatSelectOption<T>>()\n );\n\n value = model<DmMatSelectOutput<T>>(null);\n\n formControl = input<FormControl<DmMatSelectOutput<T>> | null>(null);\n panelWidth = input<string | null>('auto');\n panelClass = input<string | string[] | Set<string> | { [key: string]: any }>('');\n searchSectionBackgroundColor = input<string | null>(SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE);\n\n sortBySelectedOnTop = input(false, { transform: booleanAttribute });\n\n private internalControl = new FormControl<DmMatSelectOutput<T>>(null);\n\n protected control = computed(() => this.formControl() ?? this.internalControl);\n\n selectionChange = output<MatSelectChange<DmMatSelectOutput<T>>>();\n\n icon = input<string | null>(null);\n\n protected isBootstrapIcon = computed(() => {\n return this.icon() ? this.icon()!.includes('bi-') : false;\n });\n\n noDataLabel = input<string>('אין נתונים להצגה');\n\n clearSearchAfterSelect = input(true, { transform: booleanAttribute });\n\n clearSearchButtonTooltip = input<string>('נקה חיפוש');\n\n focusSearchInputOnPanelOpen = input(true, { transform: booleanAttribute });\n\n filterPredicate = input<((option: T, filterText: string) => boolean) | null>(null);\n private _filterPredicate: ((option: T, filterText: string) => boolean) | null = null;\n\n propertiesToSkipInSearch = input<string[]>([\n '_id',\n 'createdAt',\n 'updatedAt',\n '__v',\n 'createdBy',\n 'updatedBy',\n 'creatorName',\n 'updaterName',\n ]);\n\n simpleArray = computed(() => {\n return typeof this.options()[0] === 'string' || typeof this.options()[0] === 'number';\n });\n\n private selectedOptionsIdsSet = signal<Set<any>>(new Set());\n\n protected filterText = model<string>('');\n\n protected checkIfAllSelected = computed(() => {\n const options = this.datasource().result();\n const selected = this.control().value;\n const allSelected =\n options.length > 0 &&\n Array.isArray(selected) &&\n selected.length >= options.length &&\n options.every((option) => {\n const optionValue = this.getOptionValue(option);\n return this.selectedOptionsIdsSet().has(optionValue);\n });\n\n return allSelected;\n });\n\n constructor() {\n this.runEffects();\n }\n\n ngOnDestroy(): void {\n this.datasource().disconnect();\n }\n\n setOptionsFormattedNames(options: DmMatSelectOption<T>[]) {\n if (this._optionNameFormat) {\n for (const option of options) {\n option.__dmMatSelectFormattedName = this._optionNameFormat(option);\n }\n }\n }\n\n private runEffects() {\n effect(() => {\n this._filterPredicate = this.filterPredicate();\n this._optionNameFormat = this.optionNameFormat();\n this.datasource().setPropertiesToSkipInSearch(...this.propertiesToSkipInSearch());\n });\n\n effect(() => {\n const opts = this.options() as DmMatSelectOption<T>[];\n this.setOptionsFormattedNames(opts);\n this.datasource().setAutoPaginationAboveItemsCount(-1);\n if (this._filterPredicate) {\n this.datasource().setFilterPredicate(this._filterPredicate);\n }\n if (this.sortBySelectedOnTop() && this.multiple()) {\n this.datasource().setSortFunction(\n ((a: T, b: T) => {\n const aSelected = this.selectedOptionsIdsSet().has(this.getOptionValue(a));\n const bSelected = this.selectedOptionsIdsSet().has(this.getOptionValue(b));\n if (aSelected && !bSelected) {\n return -1;\n } else if (!aSelected && bSelected) {\n return 1;\n } else {\n return 0;\n }\n }).bind(this)\n );\n }\n this.datasource().setDatasource(opts);\n });\n\n effect(() => {\n if (this.formControl()) {\n return;\n }\n this.internalControl.setValue(this.value(), { emitEvent: false });\n });\n\n effect((onCleanup) => {\n const ctrl = this.control();\n const setSelectedIdsSet = (selectedVal: DmMatSelectOutput<T>) => {\n const newSelectedIdsSet = new Set<any>();\n if (this.multiple()) {\n const arr = Array.isArray(selectedVal) ? selectedVal : [];\n for (const item of arr) {\n const id = this.getOptionValue(item as T);\n newSelectedIdsSet.add(id);\n }\n this.selectedOptionsIdsSet.set(newSelectedIdsSet);\n }\n };\n setSelectedIdsSet(ctrl.value);\n\n const sub = ctrl.valueChanges.subscribe((val) => {\n setSelectedIdsSet(val);\n this.value.set(val);\n });\n\n onCleanup(() => sub.unsubscribe());\n });\n\n effect(() => {\n document.documentElement.style.setProperty(\n SEARCH_SECTION_BG_COLOR_VAR,\n this.searchSectionBackgroundColor() ?? SEARCH_SECTION_BG_COLOR_DEFAULT_VALUE\n );\n });\n }\n\n protected applyFilter(event: KeyboardEvent) {\n const target = event.target as HTMLInputElement;\n this.filterText.set(target.value);\n this.datasource().search(this.filterText());\n }\n\n protected selectionChangeHandler(event: MatSelectChange<T | T[] | null>) {\n this.selectionChange.emit(event);\n }\n\n private getOptionValue(option: T): any {\n if (this.simpleArray()) return option;\n return typeof option === 'object' && option != null\n ? (option as any)[this.optionValueKey()]\n : option;\n }\n\n protected onSelectionChangeHandler(event: MatOptionSelectionChange, option: T | null) {\n if (!event.isUserInput) return;\n const selected = event.source.selected;\n const currentValue = this.control().value;\n if (this.multiple()) {\n if (!option) return;\n const arr = Array.isArray(currentValue) ? currentValue : [];\n let newValue: (string | number | T)[];\n if (selected) {\n newValue = [...arr, this.getOptionValue(option)];\n } else {\n newValue = arr.filter((v) => v !== this.getOptionValue(option));\n }\n this.control().setValue(newValue as DmMatSelectOutput<T>);\n } else {\n if (!option) {\n this.control().setValue(this.emptyOptionValue());\n return;\n }\n if (selected) {\n this.control().setValue(this.getOptionValue(option) as DmMatSelectOutput<T>);\n } else {\n this.control().setValue(null);\n }\n }\n if (this.clearSearchAfterSelect()) {\n this.resetSearch();\n }\n }\n\n protected selectAllChange(event: MatCheckboxChange) {\n if (event.checked) {\n const allValues = this.datasource()\n .result()\n .map((option) => this.getOptionValue(option));\n const newValues = Array.isArray(this.control().value)\n ? (this.control().value as (string | T)[])\n : [];\n for (const val of allValues) {\n if (!this.selectedOptionsIdsSet().has(val)) {\n newValues.push(val);\n }\n }\n this.control().setValue(newValues as DmMatSelectOutput<T>);\n } else {\n const selectedValues = (this.control().value as (string | T)[]).filter((val) => {\n const allOptionValues = this.datasource()\n .result()\n .map((option) => this.getOptionValue(option));\n return !allOptionValues.includes(val as any);\n });\n this.control().setValue(selectedValues as DmMatSelectOutput<T>);\n }\n }\n\n protected resetSearch() {\n this.filterText.set('');\n this.datasource().search('');\n }\n\n protected onPanelOpened() {\n if (this.focusSearchInputOnPanelOpen()) {\n const searchInput = document.getElementById('dm-mat-select-search-input') as HTMLInputElement;\n setTimeout(() => {\n if (searchInput) {\n searchInput.focus();\n }\n }, 0);\n }\n }\n}\n","<div class=\"dm-mat-select-wrapper\" [class]=\"wrapperClass()\">\n <mat-form-field [appearance]=\"appearance()\" [class]=\"formFieldClass()\" style=\"width: 100%\">\n <mat-label>{{ label() }}</mat-label>\n <mat-select\n [multiple]=\"multiple()\"\n [formControl]=\"control()\"\n (selectionChange)=\"selectionChangeHandler($event)\"\n [disabled]=\"disabled()\"\n [panelWidth]=\"panelWidth()\"\n [panelClass]=\"panelClass()\"\n (opened)=\"onPanelOpened()\"\n >\n <div\n class=\"search-section\"\n [ngStyle]=\"{\n 'background-color': 'none'\n }\"\n >\n @if (searchable()) {\n <mat-form-field>\n <input\n id=\"dm-mat-select-search-input\"\n matInput\n [placeholder]=\"searchPlaceholder()\"\n [(ngModel)]=\"filterText\"\n (keyup)=\"applyFilter($event)\"\n />\n @if (filterText()) {\n <button\n mat-icon-button\n matSuffix\n (click)=\"resetSearch()\"\n [matTooltip]=\"clearSearchButtonTooltip() || ''\"\n >\n <mat-icon>close</mat-icon>\n </button>\n }\n </mat-form-field>\n } @if (selectAllEnabled() && multiple()) {\n <mat-checkbox [checked]=\"checkIfAllSelected()\" (change)=\"selectAllChange($event)\">{{\n selectAllLabel()\n }}</mat-checkbox>\n }\n </div>\n @if (emptyOption()) {\n <mat-option\n [value]=\"emptyOptionValue()\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, emptyOptionValue())\"\n >{{ emptyOptionLabel() }}</mat-option\n >\n } @for (option of datasource().result(); track simpleArray() ? option :\n option[this.optionValueKey()]) {\n <mat-option\n [value]=\"simpleArray() ? option : option[optionValueKey()]\"\n (onSelectionChange)=\"onSelectionChangeHandler($event, option)\"\n >{{\n optionNameFormat()\n ? option.__dmMatSelectFormattedName\n : simpleArray()\n ? option\n : option[optionLabelKey()]\n }}</mat-option\n >\n } @if (datasource().result().length === 0) {\n <mat-option disabled>{{ noDataLabel() }}</mat-option>\n }\n </mat-select>\n\n @if (icon(); as icon) {\n <span matSuffix>\n @if (isBootstrapIcon()) {\n <span [innerHTML]=\"icon\"></span> } @else {\n <mat-icon matSuffix>{{ icon }}</mat-icon>\n }\n </span>\n }\n\n <span matSuffix>\n <ng-content select=\"[dm-mat-select-suffix]\"></ng-content>\n </span>\n\n <mat-error>{{ error() }}</mat-error>\n </mat-form-field>\n</div>\n","/*\n * Public API Surface of dm-cmps\n */\n\nexport { DmCmpsDataSource } from './lib/utils/dm-cmps-data-source';\nexport type { DmCmpsDataSourceSort } from './lib/utils/dm-cmps-data-source';\nexport { DmMatSelect } from './lib/dm-mat-select/dm-mat-select';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -19,6 +19,7 @@ declare class DmCmpsDataSource<T> implements DmCmpsDataSourceConfig<T> {
|
|
|
19
19
|
private currentPageIndex;
|
|
20
20
|
private pageSize;
|
|
21
21
|
private autoPaginationAboveItemsCount;
|
|
22
|
+
private propertiesToSkipInSearchSet;
|
|
22
23
|
private searchTerm;
|
|
23
24
|
private speratedSearch;
|
|
24
25
|
private filterPredicate;
|
|
@@ -60,6 +61,7 @@ declare class DmCmpsDataSource<T> implements DmCmpsDataSourceConfig<T> {
|
|
|
60
61
|
setFilterByObjectFields(filterObj: Partial<T> | null): void;
|
|
61
62
|
private applyObjectFilter;
|
|
62
63
|
applySperatedSearch(enabled: boolean): void;
|
|
64
|
+
setPropertiesToSkipInSearch(...props: string[]): void;
|
|
63
65
|
}
|
|
64
66
|
interface DmCmpsDataSourceConfig<T = any> {
|
|
65
67
|
/**
|
|
@@ -181,6 +183,12 @@ interface DmCmpsDataSourceConfig<T = any> {
|
|
|
181
183
|
* @default false
|
|
182
184
|
*/
|
|
183
185
|
applySperatedSearch: (enabled: boolean) => void;
|
|
186
|
+
/**
|
|
187
|
+
* Sets keys to skip in default search.
|
|
188
|
+
* @param Props Array of properties names to skip
|
|
189
|
+
* @returns
|
|
190
|
+
*/
|
|
191
|
+
setPropertiesToSkipInSearch: (...props: string[]) => void;
|
|
184
192
|
}
|
|
185
193
|
|
|
186
194
|
/**
|
|
@@ -483,6 +491,22 @@ interface DmMatSelectConfig<T = any> {
|
|
|
483
491
|
* @default true
|
|
484
492
|
*/
|
|
485
493
|
focusSearchInputOnPanelOpen?: InputSignalWithTransform<boolean, unknown>;
|
|
494
|
+
/**
|
|
495
|
+
* Properties to skip in default search.
|
|
496
|
+
* ```
|
|
497
|
+
* type string[]
|
|
498
|
+
* ```
|
|
499
|
+
*
|
|
500
|
+
* @default ['_id',
|
|
501
|
+
'createdAt',
|
|
502
|
+
'updatedAt',
|
|
503
|
+
'__v',
|
|
504
|
+
'createdBy',
|
|
505
|
+
'updatedBy',
|
|
506
|
+
'creatorName',
|
|
507
|
+
'updaterName',]
|
|
508
|
+
*/
|
|
509
|
+
propertiesToSkipInSearch?: InputSignal<string[]>;
|
|
486
510
|
}
|
|
487
511
|
|
|
488
512
|
type DmMatSelectOutput<T> = T | T[] | string | string[] | number | number[] | null;
|
|
@@ -530,6 +554,7 @@ declare class DmMatSelect<T = any> implements DmMatSelectConfig<T>, OnDestroy {
|
|
|
530
554
|
focusSearchInputOnPanelOpen: _angular_core.InputSignalWithTransform<boolean, unknown>;
|
|
531
555
|
filterPredicate: _angular_core.InputSignal<((option: T, filterText: string) => boolean) | null>;
|
|
532
556
|
private _filterPredicate;
|
|
557
|
+
propertiesToSkipInSearch: _angular_core.InputSignal<string[]>;
|
|
533
558
|
simpleArray: _angular_core.Signal<boolean>;
|
|
534
559
|
private selectedOptionsIdsSet;
|
|
535
560
|
protected filterText: _angular_core.ModelSignal<string>;
|
|
@@ -546,7 +571,7 @@ declare class DmMatSelect<T = any> implements DmMatSelectConfig<T>, OnDestroy {
|
|
|
546
571
|
protected resetSearch(): void;
|
|
547
572
|
protected onPanelOpened(): void;
|
|
548
573
|
static ɵfac: _angular_core.ɵɵFactoryDeclaration<DmMatSelect<any>, never>;
|
|
549
|
-
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DmMatSelect<any>, "dm-mat-select", never, { "formFieldClass": { "alias": "formFieldClass"; "required": false; "isSignal": true; }; "wrapperClass": { "alias": "wrapperClass"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectAllEnabled": { "alias": "selectAllEnabled"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionValueKey": { "alias": "optionValueKey"; "required": false; "isSignal": true; }; "optionLabelKey": { "alias": "optionLabelKey"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyOption": { "alias": "emptyOption"; "required": false; "isSignal": true; }; "emptyOptionLabel": { "alias": "emptyOptionLabel"; "required": false; "isSignal": true; }; "emptyOptionValue": { "alias": "emptyOptionValue"; "required": false; "isSignal": true; }; "optionNameFormat": { "alias": "optionNameFormat"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "formControl": { "alias": "formControl"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "searchSectionBackgroundColor": { "alias": "searchSectionBackgroundColor"; "required": false; "isSignal": true; }; "sortBySelectedOnTop": { "alias": "sortBySelectedOnTop"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "noDataLabel": { "alias": "noDataLabel"; "required": false; "isSignal": true; }; "clearSearchAfterSelect": { "alias": "clearSearchAfterSelect"; "required": false; "isSignal": true; }; "clearSearchButtonTooltip": { "alias": "clearSearchButtonTooltip"; "required": false; "isSignal": true; }; "focusSearchInputOnPanelOpen": { "alias": "focusSearchInputOnPanelOpen"; "required": false; "isSignal": true; }; "filterPredicate": { "alias": "filterPredicate"; "required": false; "isSignal": true; }; "filterText": { "alias": "filterText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "selectionChange": "selectionChange"; "filterText": "filterTextChange"; }, never, ["[dm-mat-select-suffix]"], true, never>;
|
|
574
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<DmMatSelect<any>, "dm-mat-select", never, { "formFieldClass": { "alias": "formFieldClass"; "required": false; "isSignal": true; }; "wrapperClass": { "alias": "wrapperClass"; "required": false; "isSignal": true; }; "appearance": { "alias": "appearance"; "required": false; "isSignal": true; }; "multiple": { "alias": "multiple"; "required": false; "isSignal": true; }; "selectAllEnabled": { "alias": "selectAllEnabled"; "required": false; "isSignal": true; }; "selectAllLabel": { "alias": "selectAllLabel"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "options": { "alias": "options"; "required": false; "isSignal": true; }; "optionValueKey": { "alias": "optionValueKey"; "required": false; "isSignal": true; }; "optionLabelKey": { "alias": "optionLabelKey"; "required": false; "isSignal": true; }; "searchable": { "alias": "searchable"; "required": false; "isSignal": true; }; "required": { "alias": "required"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "error": { "alias": "error"; "required": false; "isSignal": true; }; "searchPlaceholder": { "alias": "searchPlaceholder"; "required": false; "isSignal": true; }; "emptyOption": { "alias": "emptyOption"; "required": false; "isSignal": true; }; "emptyOptionLabel": { "alias": "emptyOptionLabel"; "required": false; "isSignal": true; }; "emptyOptionValue": { "alias": "emptyOptionValue"; "required": false; "isSignal": true; }; "optionNameFormat": { "alias": "optionNameFormat"; "required": false; "isSignal": true; }; "value": { "alias": "value"; "required": false; "isSignal": true; }; "formControl": { "alias": "formControl"; "required": false; "isSignal": true; }; "panelWidth": { "alias": "panelWidth"; "required": false; "isSignal": true; }; "panelClass": { "alias": "panelClass"; "required": false; "isSignal": true; }; "searchSectionBackgroundColor": { "alias": "searchSectionBackgroundColor"; "required": false; "isSignal": true; }; "sortBySelectedOnTop": { "alias": "sortBySelectedOnTop"; "required": false; "isSignal": true; }; "icon": { "alias": "icon"; "required": false; "isSignal": true; }; "noDataLabel": { "alias": "noDataLabel"; "required": false; "isSignal": true; }; "clearSearchAfterSelect": { "alias": "clearSearchAfterSelect"; "required": false; "isSignal": true; }; "clearSearchButtonTooltip": { "alias": "clearSearchButtonTooltip"; "required": false; "isSignal": true; }; "focusSearchInputOnPanelOpen": { "alias": "focusSearchInputOnPanelOpen"; "required": false; "isSignal": true; }; "filterPredicate": { "alias": "filterPredicate"; "required": false; "isSignal": true; }; "propertiesToSkipInSearch": { "alias": "propertiesToSkipInSearch"; "required": false; "isSignal": true; }; "filterText": { "alias": "filterText"; "required": false; "isSignal": true; }; }, { "value": "valueChange"; "selectionChange": "selectionChange"; "filterText": "filterTextChange"; }, never, ["[dm-mat-select-suffix]"], true, never>;
|
|
550
575
|
}
|
|
551
576
|
|
|
552
577
|
export { DmCmpsDataSource, DmMatSelect };
|