UNPKG

@sd-angular/core

Version:

Sd Angular Core Lib

588 lines (581 loc) 38.1 kB
import { Directive, TemplateRef, EventEmitter, Component, ChangeDetectionStrategy, ChangeDetectorRef, Inject, Optional, ViewChild, Input, ContentChild, Output, NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { Validators, NgForm, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatInput, MatInputModule } from '@angular/material/input'; import { MatIconModule } from '@angular/material/icon'; import { MatTooltipModule } from '@angular/material/tooltip'; import { MatProgressSpinnerModule } from '@angular/material/progress-spinner'; import { __classPrivateFieldGet, __awaiter, __classPrivateFieldSet } from 'tslib'; import { SdFormControl, FORM_CONFIG, SdLabelDefDirective, SdViewDefDirective, SdCommonModule } from '@sd-angular/core/common'; import hash from 'object-hash'; import { Subject, BehaviorSubject, Subscription, combineLatest } from 'rxjs'; import { startWith, debounceTime, switchMap, map } from 'rxjs/operators'; import { v4 } from 'uuid'; import { MatSelectModule } from '@angular/material/select'; import { SdTranslateModule } from '@sd-angular/core/translate'; import { MatCheckboxModule } from '@angular/material/checkbox'; import { SdPopoverModule } from '@sd-angular/core/popover'; class SdSelectDisplayDefDirective { constructor(templateRef) { this.templateRef = templateRef; } } SdSelectDisplayDefDirective.decorators = [ { type: Directive, args: [{ selector: '[sdSelectDisplayDef]' },] } ]; SdSelectDisplayDefDirective.ctorParameters = () => [ { type: TemplateRef } ]; var _input, _name, _form, _itemsChanges, _delay, _validator, _subscription, _allItems, _allItem, _cache, _updateValidator, _loadSelectedItems, _loadItems, _onChange, _customValidator, _hashedValue, _getCopyText; class SdSelect { constructor(ref, formConfig) { this.ref = ref; this.formConfig = formConfig; _input.set(this, void 0); _name.set(this, v4()); this.disableErrorMessage = false; this.formControl = new SdFormControl(); this.searchTerm$ = new Subject(); _form.set(this, void 0); // Items _itemsChanges.set(this, new BehaviorSubject([])); // Server search this.loading = false; _delay.set(this, 200); // Sau khoảng thời gian delay nếu không có thay đổi thì thì mới bắt đầu thực hiện gọi hàm // Validator this.isRequired = false; _validator.set(this, void 0); this.multiple = false; this.limit = 100; this.filtered = false; this.selectAll = false; this.copyable = false; this.copied = false; this.modelChange = new EventEmitter(); this.sdChange = new EventEmitter(); this.sdSelection = new EventEmitter(); _subscription.set(this, new Subscription()); _allItems.set(this, void 0); _allItem.set(this, {}); this.allSelected = false; _cache.set(this, {}); this.isFocused = false; _updateValidator.set(this, () => { this.formControl.clearValidators(); this.formControl.clearAsyncValidators(); const validators = []; const asyncValidators = []; if (this.isRequired) { validators.push(Validators.required); } if (__classPrivateFieldGet(this, _validator)) { asyncValidators.push(__classPrivateFieldGet(this, _customValidator).call(this, __classPrivateFieldGet(this, _validator))); } if (this.inlineError) { validators.push(this.customInlineErrorValidator()); } this.formControl.setValidators(validators); this.formControl.setAsyncValidators(asyncValidators); this.formControl.updateValueAndValidity(); }); _loadSelectedItems.set(this, (value, items) => __awaiter(this, void 0, void 0, function* () { if (!(value === null || value === void 0 ? void 0 : value.toString())) { return []; } const values = Array.isArray(value) ? value : [value]; if (!this.valueField && !this.displayField) { return values; } this.loading = true; if (values.some(val => __classPrivateFieldGet(this, _allItem)[val] === undefined)) { const results = yield items(value, true) .catch(() => []) .finally(() => (this.loading = false)); const objItem = Array.toObject(results, this.valueField); const objValue = Array.toObject(values.map(val => ({ [val === null || val === void 0 ? void 0 : val.toString()]: { [this.valueField]: val, [this.displayField]: val } })), this.valueField); __classPrivateFieldSet(this, _allItem, Object.assign(Object.assign(Object.assign({}, objValue), __classPrivateFieldGet(this, _allItem)), objItem)); } return values.map(val => { var _a; return (_a = __classPrivateFieldGet(this, _allItem)[val === null || val === void 0 ? void 0 : val.toString()]) !== null && _a !== void 0 ? _a : { [this.valueField]: val, [this.displayField]: val }; }); })); _loadItems.set(this, (searchText, items) => __awaiter(this, void 0, void 0, function* () { searchText = (searchText === null || searchText === void 0 ? void 0 : searchText.toString()) || ''; const key = hash({ checksum: this.cacheChecksum || null, searchText, }); if (__classPrivateFieldGet(this, _cache)[key] === undefined && this.isFocused) { this.loading = true; const results = yield items(searchText) .catch(() => []) .finally(() => (this.loading = false)); const objItem = Array.toObject(results, this.valueField); __classPrivateFieldSet(this, _allItem, Object.assign(Object.assign({}, __classPrivateFieldGet(this, _allItem)), objItem)); __classPrivateFieldGet(this, _cache)[key] = results.union(this.valueField); } const selectedItems = yield __classPrivateFieldGet(this, _loadSelectedItems).call(this, this.formControl.value, items); // Đưa những selectedItems lên đầu nếu không mat-select-trigger sẽ không work return [...selectedItems, ...(__classPrivateFieldGet(this, _cache)[key] || [])].union(this.valueField); })); this.onSelectionChange = (change) => { var _a; this.allSelected = !this.select.options.some(e => !e.selected); const value = (_a = change === null || change === void 0 ? void 0 : change.value) !== null && _a !== void 0 ? _a : ''; if (this.multiple) { this.formControl.setValue(value || []); __classPrivateFieldGet(this, _onChange).call(this, value || []); } else { this.searchTerm$.next(''); this.formControl.setValue(value); __classPrivateFieldGet(this, _onChange).call(this, value); } }; this.reValidate = () => { this.formControl.updateValueAndValidity({ emitEvent: true }); }; _onChange.set(this, (value) => __awaiter(this, void 0, void 0, function* () { if (Array.isArray(value)) { this.modelChange.emit(value); // this.sdChange.emit(value); // this.sdSelection.emit({ // value: value, // items: value.map(val => this.#allItem[val?.toString()]), // }); } else { this.modelChange.emit(value); // this.sdChange.emit(value); this.sdSelection.emit({ value: value, item: __classPrivateFieldGet(this, _allItem)[value === null || value === void 0 ? void 0 : value.toString()], }); } })); this.clear = ($event) => { $event === null || $event === void 0 ? void 0 : $event.stopPropagation(); if (this.multiple) { this.formControl.setValue([]); this.modelChange.emit([]); this.sdChange.emit([]); this.sdSelection.emit({ value: [], items: [], }); } else { this.formControl.setValue(null); this.modelChange.emit(null); this.sdChange.emit(null); this.sdSelection.emit({ value: null, item: null, }); } }; this.onClick = () => { var _a; if ((_a = this.sdView) === null || _a === void 0 ? void 0 : _a.templateRef) { if (!this.formControl.disabled && !this.isFocused) { this.focus(); } } }; this.focus = () => { this.isFocused = true; setTimeout(() => { var _a, _b; (_a = this.select) === null || _a === void 0 ? void 0 : _a.focus(); (_b = this.select) === null || _b === void 0 ? void 0 : _b.open(); }, 100); }; _customValidator.set(this, (func) => { return (c) => __awaiter(this, void 0, void 0, function* () { const value = c.value || null; if (func && typeof func === 'function') { const result = func(value); if (result instanceof Promise) { const message = yield result; if (message) { return { customValidator: message, }; } return null; } if (result) { return { customValidator: result, }; } return null; } return null; }); }); _hashedValue.set(this, void 0); this.onOpenedChange = (isOpened) => { var _a, _b; if (isOpened) { this.isFocused = true; if (__classPrivateFieldGet(this, _input)) { __classPrivateFieldGet(this, _input).value = null; } __classPrivateFieldSet(this, _hashedValue, hash({ value: this.formControl.value, })); this.searchTerm$.next(''); } else { this.isFocused = false; const hashedValue = hash({ value: this.formControl.value, }); // Khi panel close, bắn event sdChange, sdSelection nếu có thay đổi giá trị if (__classPrivateFieldGet(this, _hashedValue) !== hashedValue) { this.sdChange.emit(this.formControl.value); if (this.multiple) { this.sdSelection.emit({ value: this.formControl.value, items: ((_a = this.formControl.value) === null || _a === void 0 ? void 0 : _a.map(val => __classPrivateFieldGet(this, _allItem)[val === null || val === void 0 ? void 0 : val.toString()])) || [], }); } else { this.sdSelection.emit({ value: this.formControl.value, item: __classPrivateFieldGet(this, _allItem)[(_b = this.formControl.value) === null || _b === void 0 ? void 0 : _b.toString()], }); } } __classPrivateFieldSet(this, _hashedValue, undefined); } }; this.onOptionChange = (tooltip) => { tooltip === null || tooltip === void 0 ? void 0 : tooltip.hide(); }; this.trackByKey = (index, item) => { if (this.valueField) { return item === null || item === void 0 ? void 0 : item[this.valueField]; } return item; }; this.onCopyText = (event) => { event === null || event === void 0 ? void 0 : event.stopPropagation(); const text = __classPrivateFieldGet(this, _getCopyText).call(this); SdUtility.copyToClipboard(text); this.copied = true; setTimeout(() => { this.copied = false; this.ref.markForCheck(); }, 2000); }; _getCopyText.set(this, () => { var _a; const value = this.formControl.value; let text = (_a = value === null || value === void 0 ? void 0 : value.toString()) !== null && _a !== void 0 ? _a : ''; if (typeof this.copyText === 'function') { if (Array.isArray(value)) { text = this.copyText(value, value.map(val => __classPrivateFieldGet(this, _allItem)[val === null || val === void 0 ? void 0 : val.toString()])); } else { text = this.copyText(value, __classPrivateFieldGet(this, _allItem)[value === null || value === void 0 ? void 0 : value.toString()]); } } else if (this.copyText) { text = this.copyText; } return text; }); } set input(input) { if (__classPrivateFieldGet(this, _input) !== input) { __classPrivateFieldSet(this, _input, input); __classPrivateFieldGet(this, _input).value = null; } } set name(val) { if (val) { __classPrivateFieldSet(this, _name, val); } } set _disableErrorMessage(val) { this.disableErrorMessage = val === '' || val; val = val === '' || val; } set form(val) { if (val) { if (val instanceof NgForm) { __classPrivateFieldSet(this, _form, val.form); } else { __classPrivateFieldSet(this, _form, val); } } } set _label(val) { this.label = val; this.qcId = hash({ selector: 'sd-select', label: val, }); } set model(value) { // if (this.formControl.value !== value) { // this.formControl.setValue(value); // } // if(this.formControl.disabled) { // this.formControl.enable({ // emitEvent: false // }); // this.formControl.setValue(value); // this.formControl.disable({ // emitEvent: false // }); // } else { // this.formControl.setValue(value); // } // this.formControl.setValue(value); if (this.formControl.value !== value) { this.formControl.setValue(value); } } set items(items) { __classPrivateFieldSet(this, _delay, 0); if (!items) { __classPrivateFieldGet(this, _itemsChanges).next([]); } else if (Array.isArray(items)) { __classPrivateFieldGet(this, _itemsChanges).next(items.filter(e => e !== null && e !== undefined)); } else { __classPrivateFieldSet(this, _delay, 500); __classPrivateFieldGet(this, _itemsChanges).next(items); } this.searchTerm$.next(''); } set required(val) { this.isRequired = val === '' || val; __classPrivateFieldGet(this, _updateValidator).call(this); } set validator(validator) { __classPrivateFieldSet(this, _validator, validator); __classPrivateFieldGet(this, _updateValidator).call(this); } set _inlineError(val) { this.inlineError = val; __classPrivateFieldGet(this, _updateValidator).call(this); } // Optional set disabled(val) { val = val === '' || val; if (val) { this.formControl.disable(); } else { this.formControl.enable(); } } set _multiple(val) { this.multiple = val === '' || val; } set _filtered(val) { this.filtered = val === '' || val; } set _selectAll(val) { this.selectAll = val === '' || val; } set _copyable(val) { this.copyable = val === '' || val; } ngOnInit() { var _a; this.appearance = this.appearance || ((_a = this.formConfig) === null || _a === void 0 ? void 0 : _a.appearance); __classPrivateFieldGet(this, _subscription).add(this.formControl.sdChanges.subscribe(() => { this.ref.markForCheck(); })); __classPrivateFieldSet(this, _allItems, combineLatest([ __classPrivateFieldGet(this, _itemsChanges).asObservable(), this.searchTerm$.asObservable().pipe(startWith(''), debounceTime(__classPrivateFieldGet(this, _delay))), this.formControl.valueChanges.pipe(startWith(this.formControl.value)), ]).pipe(switchMap(([items, val, formValue]) => __awaiter(this, void 0, void 0, function* () { formValue = this.formControl.value; if (typeof items === 'function') { return yield __classPrivateFieldGet(this, _loadItems).call(this, val, items); } __classPrivateFieldSet(this, _allItem, items.toObject(this.valueField)); const isArray = Array.isArray(formValue); const hasFields = !!this.valueField && !!this.displayField; const filteredItems = items.filter(item => { const value = hasFields ? item[this.valueField] : item; const display = hasFields ? item[this.displayField] : item; if (String.aliasIncludes(value, val) || String.aliasIncludes(display, val)) { return true; } if (isArray) { return formValue.some(e => e === value); } return formValue === value; }); if (items.length <= this.limit) { return filteredItems; } // Đưa những selectedItems lên đầu nếu không mat-select-trigger sẽ không work return filteredItems.sort((current, next) => { const value1 = hasFields ? current[this.valueField] : current; const value2 = hasFields ? next[this.valueField] : next; let flag1 = 0; let flag2 = 0; if (isArray) { flag1 = formValue.some(e => e === value1) ? 1 : 0; flag2 = formValue.some(e => e === value2) ? 1 : 0; return flag2 - flag1; } flag1 = formValue === value1 ? 1 : 0; flag2 = formValue === value2 ? 1 : 0; return flag2 - flag1; }); })))); this.selectedItems = combineLatest([ __classPrivateFieldGet(this, _itemsChanges).asObservable(), this.formControl.valueChanges.pipe(startWith(this.formControl.value)), ]).pipe(switchMap(([items, val]) => __awaiter(this, void 0, void 0, function* () { // Vì một số lý do chưa xác định mà khi sử dụng sdViewDef thì khi chuyển sang dạng view sẽ trigger val = null // Nhưng formControl.value vẫn có giá trị đúng nên thực hiện gán val = this.formControl.value; val = this.formControl.value; if (!(val === null || val === void 0 ? void 0 : val.toString())) { return []; } const values = Array.isArray(val) ? val : [val]; if (!this.valueField) { return values; } if (typeof items === 'function') { return yield __classPrivateFieldGet(this, _loadSelectedItems).call(this, val, items); } return values.map(value => { return ((items === null || items === void 0 ? void 0 : items.find(item => item[this.valueField] === value)) || { [this.valueField]: value, [this.displayField]: value, }); }); }))); this.filteredItems = __classPrivateFieldGet(this, _allItems).pipe(map(allItems => allItems.paging(this.limit))); this.display = this.selectedItems.pipe(map(selectedItems => { var _a; return (_a = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.map(item => (this.displayField ? item[this.displayField] : item))) === null || _a === void 0 ? void 0 : _a.join(', '); })); // Lấy dữ liệu cho tooltip __classPrivateFieldGet(this, _subscription).add(this.selectedItems.subscribe(selectedItems => { var _a; return (this.tooltip = (_a = selectedItems === null || selectedItems === void 0 ? void 0 : selectedItems.map(item => (this.valueField ? `• ${item[this.valueField]} - ${item[this.displayField]}` : `• ${item}`))) === null || _a === void 0 ? void 0 : _a.join('\n')); })); } ngAfterViewInit() { var _a; (_a = __classPrivateFieldGet(this, _form)) === null || _a === void 0 ? void 0 : _a.addControl(__classPrivateFieldGet(this, _name), this.formControl); } ngOnDestroy() { var _a; (_a = __classPrivateFieldGet(this, _form)) === null || _a === void 0 ? void 0 : _a.removeControl(__classPrivateFieldGet(this, _name)); __classPrivateFieldGet(this, _subscription).unsubscribe(); } // Hàm tạo Validators tùy chỉnh cho inlineError customInlineErrorValidator() { return (control) => { return { inlineError: true }; }; } onSelectAll() { if (this.allSelected) { this.formControl.setValue(this.select.options.map(e => e.value)); } else { this.formControl.setValue([]); } __classPrivateFieldGet(this, _onChange).call(this, this.formControl.value); } } _input = new WeakMap(), _name = new WeakMap(), _form = new WeakMap(), _itemsChanges = new WeakMap(), _delay = new WeakMap(), _validator = new WeakMap(), _subscription = new WeakMap(), _allItems = new WeakMap(), _allItem = new WeakMap(), _cache = new WeakMap(), _updateValidator = new WeakMap(), _loadSelectedItems = new WeakMap(), _loadItems = new WeakMap(), _onChange = new WeakMap(), _customValidator = new WeakMap(), _hashedValue = new WeakMap(), _getCopyText = new WeakMap(); SdSelect.decorators = [ { type: Component, args: [{ selector: 'sd-select', template: "<ng-container *ngIf=\"!appearance && sdLabelDef?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"sdLabelDef.templateRef\"> </ng-container>\r\n</ng-container>\r\n<label *ngIf=\"!appearance && label && !sdLabelDef?.templateRef\" class=\"d-block mb-0 T14M\"\r\n >{{ label }} <span class=\"text-danger mb-2\" *ngIf=\"isRequired\">*</span></label\r\n>\r\n<div\r\n class=\"d-flex align-items-center\"\r\n [class.sd-view]=\"sdView?.templateRef\"\r\n [class.c-focused]=\"isFocused\"\r\n [class.c-disabled]=\"formControl.disabled\"\r\n (click)=\"onClick()\">\r\n <ng-container *ngIf=\"sdView?.templateRef && !isFocused; else default\">\r\n <ng-container *ngTemplateOutlet=\"sdView.templateRef; context: { value: formControl.value, selectedItems: selectedItems | async }\">\r\n </ng-container>\r\n </ng-container>\r\n <ng-template #default>\r\n <mat-form-field\r\n class=\"sd-md\"\r\n [ngClass]=\"{ 'sd-sm': size === 'sm', 'no-padding-wrapper': disableErrorMessage }\"\r\n [appearance]=\"appearance || 'outline'\">\r\n <mat-label *ngIf=\"appearance && label\">{{ label }}</mat-label>\r\n <mat-select\r\n *ngIf=\"multiple\"\r\n #select\r\n [formControl]=\"formControl\"\r\n [placeholder]=\"placeholder || (appearance ? label : '')\"\r\n multiple\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n disableOptionCentering=\"true\"\r\n panelClass=\"sd-select-panel\"\r\n [class.sd-selected]=\"!isRequired && formControl?.value?.length\"\r\n [required]=\"isRequired\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n [attr.data-qclabel]=\"label\"\r\n [attr.data-qcid]=\"qcId\"\r\n matTooltipClass=\"sd-multiline-tooltip\"\r\n [matTooltipDisabled]=\"!formControl.disabled || !formControl?.value?.length\"\r\n [matTooltip]=\"tooltip\">\r\n <mat-select-trigger>\r\n {{ display | async }}\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"filtered\" class=\"sd-filtered-input\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\r\n <mat-form-field class=\"sd-md\" appearance=\"outline\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input\r\n aria-hidden=\"true\"\r\n #input\r\n placeholder=\"{{ 'Search' | sdTranslate }}\"\r\n matInput\r\n autocomplete=\"off\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"searchTerm$.next($event.target.value)\" />\r\n </mat-form-field>\r\n </mat-option>\r\n <ng-container *ngIf=\"multiple && selectAll\">\r\n <mat-checkbox class=\"mat-option\" [(ngModel)]=\"allSelected\" [ngModelOptions]=\"{ standalone: true }\" (change)=\"onSelectAll()\">\r\n T\u1EA5t c\u1EA3</mat-checkbox\r\n >\r\n </ng-container>\r\n <ng-container *ngIf=\"valueField && displayField\">\r\n <mat-option *ngFor=\"let item of filteredItems | async; trackBy: trackByKey\" [value]=\"item[valueField]\">\r\n <div matTooltipPosition=\"above\" [matTooltip]=\"item[displayField]\">\r\n <ng-container *ngIf=\"selectDisplayDef?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"selectDisplayDef.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!selectDisplayDef?.templateRef\">\r\n {{ item[displayField] }}\r\n </ng-container>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n <ng-container *ngIf=\"!valueField && !displayField\">\r\n <mat-option *ngFor=\"let item of filteredItems | async; trackBy: trackByKey\" [value]=\"item\">\r\n <div matTooltipPosition=\"above\" [matTooltip]=\"item\">\r\n <ng-container *ngIf=\"selectDisplayDef?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"selectDisplayDef.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!selectDisplayDef?.templateRef\">\r\n {{ item }}\r\n </ng-container>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <mat-select\r\n *ngIf=\"!multiple\"\r\n #select\r\n [formControl]=\"formControl\"\r\n [placeholder]=\"placeholder || (appearance ? label : '')\"\r\n (selectionChange)=\"onSelectionChange($event)\"\r\n disableOptionCentering=\"true\"\r\n panelClass=\"sd-select-panel\"\r\n [class.sd-selected]=\"!isRequired && formControl?.value != null\"\r\n [required]=\"isRequired\"\r\n (openedChange)=\"onOpenedChange($event)\"\r\n [attr.data-qclabel]=\"label\"\r\n [attr.data-qcid]=\"qcId\">\r\n <mat-select-trigger>\r\n {{ display | async }}\r\n </mat-select-trigger>\r\n <mat-option *ngIf=\"filtered\" class=\"sd-filtered-input\" (keyup.Space)=\"$event.stopPropagation()\" disabled=\"true\">\r\n <mat-form-field class=\"sd-md\" appearance=\"outline\">\r\n <mat-icon matPrefix>search</mat-icon>\r\n <input\r\n aria-hidden=\"true\"\r\n #input\r\n placeholder=\"{{ 'Search' | sdTranslate }}\"\r\n matInput\r\n autocomplete=\"off\"\r\n (keydown)=\"$event.stopPropagation()\"\r\n (keyup)=\"searchTerm$.next($event.target.value)\" />\r\n </mat-form-field>\r\n </mat-option>\r\n <ng-container *ngIf=\"valueField && displayField\">\r\n <mat-option *ngFor=\"let item of filteredItems | async; trackBy: trackByKey\" [value]=\"item[valueField]\">\r\n <div matTooltipPosition=\"above\" [matTooltip]=\"item[displayField]\">\r\n <ng-container *ngIf=\"selectDisplayDef?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"selectDisplayDef.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!selectDisplayDef?.templateRef\">\r\n {{ item[displayField] }}\r\n </ng-container>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n <ng-container *ngIf=\"!valueField && !displayField\">\r\n <mat-option *ngFor=\"let item of filteredItems | async; trackBy: trackByKey\" [value]=\"item\">\r\n <div matTooltipPosition=\"above\" [matTooltip]=\"item\">\r\n <ng-container *ngIf=\"selectDisplayDef?.templateRef\">\r\n <ng-container *ngTemplateOutlet=\"selectDisplayDef.templateRef; context: { item: item }\"> </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!selectDisplayDef?.templateRef\">\r\n {{ item }}\r\n </ng-container>\r\n </div>\r\n </mat-option>\r\n </ng-container>\r\n </mat-select>\r\n <ng-content select=\"[sdSuffixIcon]\" matSuffix></ng-content>\r\n <svg\r\n #copyTooltip=\"matTooltip\"\r\n *ngIf=\"(multiple ? formControl?.value?.length : formControl?.value != null) && copyable\"\r\n matSuffix\r\n [matTooltip]=\"copied ? 'Copied' : 'Copy'\"\r\n class=\"icon-copy\"\r\n focusable=\"false\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n viewBox=\"0 0 448 512\"\r\n (click)=\"onCopyText($event)\">\r\n <path\r\n d=\"M433.941 65.941l-51.882-51.882A48 48 0 0 0 348.118 0H176c-26.51 0-48 21.49-48 48v48H48c-26.51 0-48 21.49-48 48v320c0 26.51 21.49 48 48 48h224c26.51 0 48-21.49 48-48v-48h80c26.51 0 48-21.49 48-48V99.882a48 48 0 0 0-14.059-33.941zM266 464H54a6 6 0 0 1-6-6V150a6 6 0 0 1 6-6h74v224c0 26.51 21.49 48 48 48h96v42a6 6 0 0 1-6 6zm128-96H182a6 6 0 0 1-6-6V54a6 6 0 0 1 6-6h106v88c0 13.255 10.745 24 24 24h88v202a6 6 0 0 1-6 6zm6-256h-64V48h9.632c1.591 0 3.117.632 4.243 1.757l48.368 48.368a6 6 0 0 1 1.757 4.243V112z\"></path>\r\n </svg>\r\n \r\n <mat-icon\r\n *ngIf=\"(multiple ? formControl?.value?.length : formControl?.value != null) && !isRequired && !formControl.disabled\"\r\n class=\"pointer sd-suffix-icon\"\r\n (click)=\"clear($event)\"\r\n matSuffix\r\n >cancel\r\n </mat-icon>\r\n <mat-error *ngIf=\"formControl.errors?.required\">\r\n <ng-container *ngIf=\"!disableErrorMessage\">{{ 'This field is required' | sdTranslate }}</ng-container>\r\n </mat-error>\r\n <mat-error *ngIf=\"formControl?.errors?.customValidator\">\r\n <ng-container *ngIf=\"!disableErrorMessage\">{{ formControl?.errors?.customValidator }}</ng-container>\r\n </mat-error>\r\n <mat-error *ngIf=\"formControl.errors?.inlineError\">\r\n <ng-container *ngIf=\"!disableErrorMessage\">{{ inlineError }}</ng-container>\r\n </mat-error>\r\n </mat-form-field>\r\n </ng-template>\r\n</div>\r\n<!-- <sd-popover #popoverValues=\"sdPopover\" width=\"auto\">\r\n <ng-container *ngIf=\"formControl?.value?.length\">\r\n <ng-container *sdLet=\"selectedItems | async as items\">\r\n <div *ngFor=\"let item of items\">\r\n <strong>{{ item[valueField] }}</strong> - {{ item[displayField] }}\r\n </div>\r\n </ng-container>\r\n </ng-container>\r\n</sd-popover> -->\r\n", changeDetection: ChangeDetectionStrategy.OnPush, styles: [":host{display:block;padding-top:5px}:host ::ng-deep .mat-form-field.mat-form-field-appearance-outline .mat-select-arrow-wrapper{transform:none}:host ::ng-deep .sd-selected .mat-select-arrow{border:none}:host ::ng-deep .mat-form-field.no-padding-wrapper .mat-form-field-wrapper{padding-bottom:0}:host ::ng-deep .mat-form-field.mat-form-field-appearance-outline.mat-form-field-disabled .mat-form-field-outline{background:#f6f6f6;color:#e9e9e9}:host ::ng-deep .mat-form-field mat-select.mat-select-disabled .mat-select-value{color:#4d4d4d!important}:host ::ng-deep .mat-form-field .mat-placeholder-required{color:#f82c13}:host ::ng-deep .mat-form-field:hover .icon-copy{opacity:1}:host ::ng-deep .mat-form-field .icon-copy{cursor:pointer;fill:rgba(0,0,0,.5);height:.9em;opacity:0;transition:opacity .2s linear;width:.9em}.sd-view:not(.c-focused):not(.c-disabled):hover{background-color:#ebecf0}::ng-deep .sd-select-panel .mat-option.sd-filtered-input{background-color:#fff;position:-webkit-sticky;position:sticky;top:0;z-index:10}::ng-deep .sd-select-panel .mat-option.sd-filtered-input .mat-form-field.mat-form-field-appearance-outline{width:100%}::ng-deep .sd-select-panel .mat-option.sd-filtered-input mat-pseudo-checkbox{display:none}::ng-deep .mat-select-panel .mat-option.sd-filtered-input{height:auto}::ng-deep .sd-select-panel .mat-option.sd-filtered-input input{color:#000}::ng-deep .sd-select-panel .mat-option.sd-filtered-input .mat-form-field-prefix .mat-icon{margin-right:0}::ng-deep .sd-select-panel .mat-option.sd-filtered-input .mat-form-field.mat-form-field-appearance-outline .mat-form-field-wrapper{padding:10px 0}::ng-deep .sd-select-panel .mat-option.sd-filtered-input .mat-form-field.mat-form-field-appearance-outline .mat-form-field-wrapper .mat-form-field-outline{background-color:rgba(0,0,0,.04)}::ng-deep .sd-multiline-tooltip{white-space:pre-line}::ng-deep .mat-select-panel{overflow:auto!important}"] },] } ]; SdSelect.ctorParameters = () => [ { type: ChangeDetectorRef }, { type: undefined, decorators: [{ type: Inject, args: [FORM_CONFIG,] }, { type: Optional }] } ]; SdSelect.propDecorators = { input: [{ type: ViewChild, args: [MatInput,] }], select: [{ type: ViewChild, args: ['select',] }], name: [{ type: Input }], appearance: [{ type: Input }], _disableErrorMessage: [{ type: Input, args: ['disableErrorMessage',] }], size: [{ type: Input }], form: [{ type: Input }], _label: [{ type: Input, args: ['label',] }], placeholder: [{ type: Input }], model: [{ type: Input }], items: [{ type: Input }], valueField: [{ type: Input }], displayField: [{ type: Input }], cacheChecksum: [{ type: Input }], required: [{ type: Input }], validator: [{ type: Input }], _inlineError: [{ type: Input, args: ['inlineError',] }], disabled: [{ type: Input }], _multiple: [{ type: Input, args: ['multiple',] }], limit: [{ type: Input }], _filtered: [{ type: Input, args: ['filtered',] }], selectDisplayDef: [{ type: ContentChild, args: [SdSelectDisplayDefDirective,] }], _selectAll: [{ type: Input, args: ['selectAll',] }], copyTooltip: [{ type: ViewChild, args: ['copyTooltip',] }], _copyable: [{ type: Input, args: ['copyable',] }], copyText: [{ type: Input }], modelChange: [{ type: Output }], sdChange: [{ type: Output }], sdSelection: [{ type: Output }], sdLabelDef: [{ type: ContentChild, args: [SdLabelDefDirective,] }], sdView: [{ type: ContentChild, args: [SdViewDefDirective,] }] }; class SdSelectModule { } SdSelectModule.decorators = [ { type: NgModule, args: [{ imports: [ CommonModule, FormsModule, ReactiveFormsModule, MatInputModule, MatTooltipModule, MatFormFieldModule, MatIconModule, MatSelectModule, MatProgressSpinnerModule, MatCheckboxModule, SdTranslateModule, SdCommonModule, SdPopoverModule ], declarations: [ SdSelect, SdSelectDisplayDefDirective ], exports: [ SdSelect, SdSelectDisplayDefDirective, SdCommonModule ], providers: [] },] } ]; /* * Public API Surface of superdev-angular-core */ /** * Generated bundle index. Do not edit. */ export { SdSelect, SdSelectDisplayDefDirective, SdSelectModule }; //# sourceMappingURL=sd-angular-core-select.js.map