@sd-angular/core 19.0.48 → 19.0.49
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/sd-angular-core-components-table.mjs +29 -19
- package/fesm2022/sd-angular-core-components-table.mjs.map +1 -1
- package/fesm2022/sd-angular-core-directives.mjs +20 -3
- package/fesm2022/sd-angular-core-directives.mjs.map +1 -1
- package/fesm2022/sd-angular-core-forms-select.mjs +23 -4
- package/fesm2022/sd-angular-core-forms-select.mjs.map +1 -1
- package/fesm2022/sd-angular-core-pipes.mjs +11 -21
- package/fesm2022/sd-angular-core-pipes.mjs.map +1 -1
- package/package.json +9 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sd-angular-core-forms-select.mjs","sources":["../../../projects/sd-angular/forms/select/src/select-footer-action.directive.ts","../../../projects/sd-angular/forms/select/src/select.component.ts","../../../projects/sd-angular/forms/select/src/select.component.html","../../../projects/sd-angular/forms/select/sd-angular-core-forms-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject, input } from '@angular/core';\n\nexport interface SdSelectFooterActionContext {\n searchText: string;\n filteredItems: unknown[];\n selectedItems: unknown[];\n}\n\nexport type SdSelectFooterActionWhenFn = (ctx: SdSelectFooterActionContext) => boolean | Promise<boolean>;\nexport type SdSelectFooterActionWhen = 'always' | 'empty' | 'has-result' | SdSelectFooterActionWhenFn;\n\n@Directive({\n selector: 'ng-template[sdSelectFooterAction]',\n standalone: true,\n})\nexport class SdSelectFooterActionDirective {\n readonly templateRef = inject(TemplateRef<SdSelectFooterActionContext>);\n readonly when = input<SdSelectFooterActionWhen>('always');\n}\n","/* eslint-disable @angular-eslint/no-input-rename */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n isSignal,\n model,\n OnInit,\n output,\n signal, // THÊM IMPORT NÀY\n Signal,\n TemplateRef,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport {\n AsyncValidatorFn,\n FormControl,\n FormGroup,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\nimport { MatPseudoCheckbox } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelect, MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdView } from '@sd-angular/core/components/view';\nimport { SdDataState, SdDataStateTemplateDirective } from '@sd-angular/core/components/data-state';\nimport { cloneReadRequest, combineReadStates, SdReadChannel, SdSearchReadState } from '@sd-angular/core/utilities/read-state';\nimport { SdTooltipDirective } from '@sd-angular/core/directives';\nimport { SdItemDefDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\nimport { SdLabel } from '@sd-angular/core/forms/label';\nimport {\n HandleSdCustomValidator,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n sdFormControlState,\n SdInlineErrorValidator,\n SdSearch,\n SdSearchReq,\n SdSelectionData,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sd-angular/core/forms/models';\nimport { I18nService } from '@sd-angular/core/i18n';\nimport { sdIsEmpty, sdSerializeDataValue } from '@sd-angular/core/utilities/data-state';\nimport { ArrayUtilities, StringUtilities, Utilities } from '@sd-angular/core/utilities/extensions';\nimport { NestedKeyOf, Size } from '@sdcorejs/utils/models';\n\nimport { combineLatest, timer } from 'rxjs';\nimport { debounce, filter, map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';\nimport { SdSelectFooterActionDirective, SdSelectFooterActionWhenFn } from './select-footer-action.directive';\n\ninterface SelectReadRequest {\n loader: SdSearch;\n args: SdSearchReq;\n key: string;\n valid: () => boolean;\n}\n\n@Component({\n selector: 'sd-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n imports: [\n SdDataState,\n SdDataStateTemplateDirective,\n SdTooltipDirective,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatIconModule,\n MatSelectModule,\n MatPseudoCheckbox,\n MatProgressSpinnerModule,\n SdLabel,\n SdView,\n SdSelectFooterActionDirective,\n ],\n})\nexport class SdSelect<T extends object | string | number = Record<string, unknown>> implements OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES & INJECTS\n // ==========================================\n matInputRef = viewChild(MatInput);\n selectRef = viewChild<MatSelect>('select');\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n /**\n * Custom render for the SELECTED value shown in the editable trigger (`<mat-select-trigger>`).\n * Distinct from `#sdValue`/`sdViewDef` which only drive the read-only `viewed`/`inline` face.\n * Context: `{ $implicit, item, items: selectedItems(), display, multiple }` — `item`/`$implicit`\n * is the single selected item object (single mode) or the selected-item array (multiple mode).\n * Falls back to the plain `display` text when not projected, so existing usages are unaffected.\n */\n sdSelectedTemplate = contentChild<TemplateRef<any>>('sdSelected');\n itemDef = contentChild(SdItemDefDefDirective);\n sdViewDef = contentChild(SdViewDefDirective);\n footerActions = contentChildren(SdSelectFooterActionDirective);\n\n /**\n * View display template. `sdViewDef` is now just a custom override of the view rendering —\n * it replaces the projected `#sdValue` template when present (fed into `<sd-view>`'s\n * `valueTemplate`), so there is ONE rendering path. No more `.sd-view` class / focus-swap;\n * click-to-edit is governed by `viewed='inline'`.\n */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n #ref = inject(ChangeDetectorRef);\n #formConfiguration = inject(SD_FORM_CONFIGURATION, { optional: true });\n #el = inject(ElementRef);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 2. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-select-${this.autoIdInput()}` : undefined));\n\n // E2E data-* attributes\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n readonly dataLoading = computed(() => (this.loading() ? 'true' : 'false'));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n // why: KHÔNG dùng input.required. Template có nhánh riêng cho mảng primitive\n // (`@else if (!_valueField && !_displayField)`) nhưng input.required làm nhánh đó không bao giờ\n // tới được: `<sd-select [items]=\"['a','b']\">` ném NG0950 ngay lần render đầu vì template đọc\n // valueField()/displayField() trước khi có giá trị. Mặc định '' (giống disabledField) →\n // bỏ trống cả hai = item chính là value + label. (Đồng bộ với fix đã có ở @sdcorejs/angular.)\n valueField = input<NestedKeyOf<T> | ''>('');\n displayField = input<NestedKeyOf<T> | ''>('');\n disabledField = input<NestedKeyOf<T> | ''>('');\n cacheChecksum = input<any>();\n\n limit = input<number>(50);\n hyperlink = input<string | null | undefined>();\n\n minWidthPanel = input<string | number, string | number | undefined | null>('auto', {\n transform: value => value ?? 'auto',\n });\n\n hideInlineError = input(false, { transform: booleanAttribute });\n readonly hideReadError = input(false, { transform: booleanAttribute });\n readonly dataStateTemplate = contentChild(SdDataStateTemplateDirective);\n readonly sdReadStateChange = output<SdSearchReadState>();\n readonly #valueRead = new SdReadChannel('VALUE', () => this.#emitReadState());\n readonly #searchRead = new SdReadChannel('SEARCH', () => this.#emitReadState());\n readonly readState = computed(() => combineReadStates(this.#valueRead.state(), this.#searchRead.state()));\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (bare editor). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n multiple = input(false, { transform: booleanAttribute });\n /**\n * Hiện option \"Chọn tất cả\" đầu panel (chỉ multiple + items là mảng tĩnh/Signal — ẩn với\n * SdSearch lazy vì dataset không xác định). Opt-in, default `false`.\n */\n showSelectAll = input(false, { transform: booleanAttribute });\n /**\n * Whether the `viewed='inline'` text face shows a hover clear-× to empty the value.\n * Default `true`. Set `false` where the HOST owns removal (e.g. `<sd-query-bar>` chips,\n * whose own `×` removes the whole filter) so the chip isn't cluttered with two ×.\n */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` (isViewed / isInline) — shared primitive. In `'inline'` the editor is\n // always rendered (chrome hidden via CSS); the sd-view text face opens the panel on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'` — editor mounted but chrome hidden; sd-view text is the trigger face. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` — static read-only view, no editor mounted. */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the picker from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.select.required');\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.#formConfiguration?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Mở rộng kiểu dữ liệu cho phép nhận Signal từ bên ngoài truyền vào\n items = input<undefined | null | T[] | SdSearch | Signal<T[]>>();\n\n valueModel = model<boolean | number | string | (number | string)[] | undefined | null>(undefined, { alias: 'model' });\n\n // ==========================================\n // 3. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdSelection = output<SdSelectionData>();\n\n // ==========================================\n // 4. INTERNAL STATE & STREAMS\n // ==========================================\n formControl = new SdFormControl();\n inputControl = new FormControl('');\n\n loading = signal<boolean>(false);\n focused = signal<boolean>(false);\n allSelected = false;\n\n #cache: Record<string, any[]> = {};\n #allItem: Record<string, any> = {};\n #searchRequestId = 0;\n #destroyed = false;\n #searchDebouncing = false;\n #failedValue?: SelectReadRequest;\n #failedSearch?: SelectReadRequest;\n #pendingValue?: { request: SelectReadRequest; result: Promise<any[] | undefined> };\n #pendingSearch?: { request: SelectReadRequest; result: Promise<any[] | undefined> };\n #valueCache: Record<string, any[]> = {};\n #hashedValue?: string;\n\n // [NÂNG CẤP]: Xử lý Unwrap (Mở hộp) Signal lồng nhau nếu có\n actualItems = computed(() => {\n const rawItems = this.items();\n // Nếu cha truyền vào một biến Signal, ta cần gọi rawItems() để lấy mảng thật\n if (isSignal(rawItems)) {\n return rawItems();\n }\n return rawItems;\n });\n\n // Thay vì toObservable(this.items), ta observe cái actualItems đã được unwrap\n #items$ = toObservable(\n computed(() => ({\n items: this.actualItems(),\n checksum: this.cacheChecksum(),\n valueField: this.valueField(),\n displayField: this.displayField(),\n }))\n ).pipe(map(context => context.items));\n #valueModel$ = toObservable(this.valueModel);\n\n filteredItems = signal<T[]>([]);\n selectedItems = signal<T[]>([]);\n display = signal<string>('');\n calculatedPanelWidth = signal<string | number>('auto');\n\n readonly searchText = signal<string>('');\n readonly footerActionContext = computed(() => ({\n searchText: this.searchText(),\n filteredItems: this.filteredItems() as T[],\n selectedItems: this.selectedItems() as T[],\n }));\n readonly #footerFnVisibility = signal<WeakMap<SdSelectFooterActionDirective, boolean>>(new WeakMap());\n readonly visibleFooterActions = computed(() => this.footerActions().filter(action => this.shouldRenderFooterAction(action)));\n\n normalizedValue = computed(() => {\n const val = this.valueModel();\n if (this.multiple() && val !== undefined && val !== null && !Array.isArray(val)) {\n return [val];\n }\n return val;\n });\n\n filtered = computed(() => {\n const data = this.actualItems();\n if (typeof data === 'function') return true;\n if (Array.isArray(data)) return data.filter(e => e != null).length > 10;\n return false;\n });\n\n delayTime = computed(() => (typeof this.actualItems() === 'function' ? 500 : 0));\n\n /**\n * Scope của \"Chọn tất cả\": item enabled khớp search text hiện tại, tính trên MẢNG NGUỒN\n * `actualItems()`.\n */\n // why: KHÔNG đọc filteredItems — nó đã bị cắt theo `limit` paging nên tick all sẽ thiếu item;\n // luật khớp search phải trùng với filter của allItems$ (aliasIncludes trên cả value + display).\n readonly selectAllScope = computed<T[]>(() => {\n const data = this.actualItems();\n if (!Array.isArray(data)) return [];\n const sText = this.searchText() || '';\n return (data as T[]).filter(item => {\n if (item == null || this.itemDisabled(item)) return false;\n return StringUtilities.aliasIncludes(this.itemValue(item), sText) || StringUtilities.aliasIncludes(this.itemDisplay(item), sText);\n });\n });\n\n /** Row \"Chọn tất cả\" chỉ render khi opt-in + multiple + items tĩnh + scope có item để thao tác. */\n readonly selectAllVisible = computed(\n () => this.showSelectAll() && this.multiple() && Array.isArray(this.actualItems()) && this.selectAllScope().length > 0\n );\n\n /** Trạng thái checkbox \"Chọn tất cả\", tính trên items ENABLED trong scope (item disabled bỏ qua). */\n readonly selectAllState = computed<'checked' | 'indeterminate' | 'unchecked'>(() => {\n const scope = this.selectAllScope();\n const val = this.normalizedValue();\n const selected = new Set((Array.isArray(val) ? val : []).map(v => String(v)));\n if (!scope.length || !selected.size) return 'unchecked';\n let count = 0;\n for (const item of scope) {\n if (selected.has(String(this.itemValue(item)))) count++;\n }\n if (count === 0) return 'unchecked';\n return count === scope.length ? 'checked' : 'indeterminate';\n });\n\n // why: template select chưa dùng pipe i18n — label đi qua computed để khỏi thêm pipe import.\n readonly selectAllLabel = computed(() => this.#i18n.t('core.form.select.selectAll'));\n\n // ==========================================\n // 5. GETTER & HELPERS\n // ==========================================\n itemValue = (item: T): unknown => {\n const path = this.valueField();\n if (!path || item == null) return item;\n return Utilities.getNestedValue(item, path as string);\n };\n\n itemDisplay = (item: T): string => {\n const path = this.displayField();\n if (!path || item == null) return String(item ?? '');\n return String(Utilities.getNestedValue(item, path as string) ?? '');\n };\n\n itemDisabled = (item: T): boolean => {\n const path = this.disabledField();\n if (!path || item == null) return false;\n return Boolean(Utilities.getNestedValue(item, path as string));\n };\n\n shouldRenderFooterAction(action: SdSelectFooterActionDirective): boolean {\n const when = action.when();\n\n if (typeof when === 'function') {\n return this.#footerFnVisibility().get(action) ?? false;\n }\n\n if (when === 'always') return true;\n if (when === 'empty') {\n return this.searchText().trim().length > 0 && this.filteredItems().length === 0;\n }\n if (when === 'has-result') return this.filteredItems().length > 0;\n return false;\n }\n\n setNestedValue = (obj: any, path: string, value: any) => {\n if (!path) return;\n const keys = path.split('.');\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) current[keys[i]] = {};\n current = current[keys[i]];\n }\n current[keys[keys.length - 1]] = value;\n };\n\n #addToDict = (dataList: any[]) => {\n if (!this.valueField()) return;\n dataList.forEach(e => {\n const k = this.itemValue(e);\n if (k != null) this.#allItem[String(k)] = e;\n });\n };\n\n tooltip = computed(() => {\n const items = this.selectedItems();\n if (!items || !items.length) return '';\n if (this.multiple()) {\n return [\n this.#i18n.t('core.form.select.selected-count', { count: items.length }),\n ...items.map(item => `• ${this.itemDisplay(item)}`),\n ].join('\\n');\n }\n const vF = this.valueField();\n return items.map(item => (vF ? `• ${this.itemValue(item)} - ${this.itemDisplay(item)}` : `• ${item}`)).join('\\n');\n });\n\n updatePanelWidth = () => {\n let minWInput = this.minWidthPanel();\n // why: inline mode — trigger là text hẹp (.sd-inline-view), panel tối thiểu 200px cho dễ đọc options.\n if (this.isInline() && (!minWInput || minWInput === 'auto')) minWInput = '200px';\n if (!minWInput || minWInput === 'auto') {\n this.calculatedPanelWidth.set('auto');\n return;\n }\n\n const minWStr = String(minWInput).trim().toLowerCase();\n if (!minWStr.endsWith('px') && isNaN(Number(minWStr))) {\n this.calculatedPanelWidth.set(minWInput);\n return;\n }\n\n const hostWidth = this.#el.nativeElement.getBoundingClientRect().width;\n const minW = parseFloat(minWStr);\n\n if (hostWidth >= minW) {\n this.calculatedPanelWidth.set('auto');\n } else {\n this.calculatedPanelWidth.set(minWInput);\n }\n };\n\n #destroyRef = inject(DestroyRef);\n\n constructor() {\n // why: CDK dispatch keydown ở body capture; bắt Tab sớm hơn nhưng chỉ trong control/panel này.\n this.#el.nativeElement.ownerDocument.addEventListener('keydown', this.focusReadRetry, true);\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n this.#el.nativeElement.ownerDocument.removeEventListener('keydown', this.focusReadRetry, true);\n this.#valueRead.invalidate();\n this.#searchRead.invalidate();\n ++this.#searchRequestId;\n });\n effect(() => {\n this.actualItems();\n this.valueModel();\n this.valueField();\n this.displayField();\n this.cacheChecksum();\n untracked(() => {\n if ((this.#failedValue && !this.#failedValue.valid()) || (this.#pendingValue && !this.#pendingValue.request.valid())) {\n this.#failedValue = undefined;\n this.#pendingValue = undefined;\n this.#valueRead.invalidate();\n }\n });\n });\n effect(() => {\n const val = this.normalizedValue();\n untracked(() => {\n const current = this.formControl.value;\n const isDiff = Array.isArray(val) && Array.isArray(current) ? JSON.stringify(val) !== JSON.stringify(current) : val !== current;\n\n if (isDiff) {\n this.formControl.setValue(val, { emitEvent: false });\n }\n });\n });\n\n effect(() => {\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\n else this.formControl.enable({ emitEvent: false });\n });\n\n effect(() => {\n const req = this.required();\n const val = this.validator();\n const inl = this.inlineError();\n untracked(() => this.#updateValidator(req, val, inl));\n });\n\n // ==========================================\n // EFFECT: QUẢN LÝ FORM GROUP & CONTROL\n // ==========================================\n effect(onCleanup => {\n // 1. Lấy giá trị mới nhất của form và name\n const formGroup = this.form();\n const controlName = this.name();\n if (formGroup && controlName) {\n // 2. Thêm control vào form\n formGroup.addControl(controlName, this.formControl);\n // 3. Đăng ký hàm dọn dẹp (Cleanup)\n onCleanup(() => {\n // Hàm này sẽ tự động chạy trong 2 trường hợp:\n // - Khi Component bị Destroy (thay thế ngOnDestroy)\n // - Khi form() hoặc name() thay đổi giá trị (nó sẽ gỡ control cũ ra trước khi add cái mới vào)\n formGroup.removeControl(controlName);\n });\n }\n });\n\n effect(() => {\n const actions = this.footerActions();\n const context = this.footerActionContext();\n\n const fnActions: { action: SdSelectFooterActionDirective; fn: SdSelectFooterActionWhenFn }[] = [];\n for (const action of actions) {\n const when = action.when();\n if (typeof when === 'function') fnActions.push({ action, fn: when });\n }\n\n if (!fnActions.length) return;\n\n // why: Promise.all chạy ngoài reactive context — không tạo circular dependency\n Promise.all(\n fnActions.map(async ({ action, fn }) => ({\n action,\n result: await Promise.resolve(fn(context)),\n }))\n ).then(results => {\n const map = new WeakMap<SdSelectFooterActionDirective, boolean>();\n results.forEach(({ action, result }) => map.set(action, result));\n this.#footerFnVisibility.set(map);\n this.#ref.markForCheck();\n });\n });\n }\n\n ngOnInit() {\n this.formControl.valueChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(val => {\n const currentModel = this.valueModel();\n const isDiff =\n Array.isArray(val) && Array.isArray(currentModel) ? JSON.stringify(val) !== JSON.stringify(currentModel) : val !== currentModel;\n\n if (isDiff) {\n this.valueModel.set(val);\n }\n });\n\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#ref.markForCheck());\n\n const cleanItems$ = this.#items$.pipe(\n tap(() => {\n this.#cache = {};\n this.#allItem = {};\n this.#valueCache = {};\n this.#failedValue = this.#failedSearch = undefined;\n this.#pendingValue = this.#pendingSearch = undefined;\n this.#valueRead.invalidate();\n this.#searchRead.invalidate();\n ++this.#searchRequestId;\n this.inputControl.setValue('');\n }),\n map(items => {\n if (!items) return [];\n if (Array.isArray(items)) return items.filter(e => e !== null && e !== undefined);\n return items;\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n const search$ = this.inputControl.valueChanges.pipe(\n startWith(''),\n tap(searchText => {\n const text = searchText?.toString() || '';\n if (text !== this.searchText()) {\n ++this.#searchRequestId;\n this.#failedSearch = undefined;\n this.#pendingSearch = undefined;\n this.#searchRead.invalidate();\n }\n this.searchText.set(text);\n }),\n tap(() => {\n if (typeof this.actualItems() === 'function' && this.focused()) {\n this.#searchDebouncing = true;\n this.loading.set(true);\n this.#ref.markForCheck();\n }\n }),\n debounce(() => timer(this.delayTime()))\n );\n\n const allItems$ = combineLatest([cleanItems$, search$, this.#valueModel$]).pipe(\n switchMap(async ([items, searchText]) => {\n const sText = searchText || '';\n const formValue = this.valueModel();\n const vField = this.valueField();\n\n if (typeof items === 'function') {\n return await this.#loadItems(sText, items);\n }\n\n this.#addToDict(items);\n const isArray = Array.isArray(formValue);\n const hasFields = !!vField && !!this.displayField();\n\n const filteredList = items.filter(item => {\n const value = hasFields ? this.itemValue(item) : item;\n const display = hasFields ? this.itemDisplay(item) : item;\n if (StringUtilities.aliasIncludes(value, sText) || StringUtilities.aliasIncludes(display, sText)) return true;\n if (isArray) return formValue.some((e: any) => e === value);\n return formValue === value;\n });\n\n // Khi filtered mode bật và multiple=true, luôn đẩy item đã chọn lên trên\n // để user dễ nhìn thấy selection hiện tại, kể cả dataset chưa vượt limit.\n const shouldPinSelectedFirst = this.filtered() && this.multiple() && isArray;\n if (!shouldPinSelectedFirst && items.length <= this.limit()) return filteredList;\n\n return filteredList.sort((current, next) => {\n const value1 = hasFields ? this.itemValue(current) : current;\n const value2 = hasFields ? this.itemValue(next) : next;\n let flag1 = 0;\n let flag2 = 0;\n if (isArray) {\n flag1 = formValue.some((e: any) => e === value1) ? 1 : 0;\n flag2 = formValue.some((e: any) => e === value2) ? 1 : 0;\n return flag2 - flag1;\n }\n flag1 = formValue === value1 ? 1 : 0;\n flag2 = formValue === value2 ? 1 : 0;\n return flag2 - flag1;\n });\n }),\n filter((items): items is any[] => items !== undefined),\n tap(() => this.#syncReadLoading())\n );\n\n const selectedItems$ = combineLatest([cleanItems$, this.#valueModel$]).pipe(\n switchMap(async ([items, val]) => {\n const vField = this.valueField();\n const dField = this.displayField();\n\n if (val === undefined || val === null || val === '') {\n this.#failedValue = undefined;\n this.#valueRead.invalidate();\n return [];\n }\n\n const values = Array.isArray(val) ? val : [val];\n if (!vField) return values;\n\n if (typeof items === 'function') {\n return await this.#loadSelectedItems(val, items as SdSearch);\n }\n\n return values.map(value => {\n return (\n (items as any[])?.find(item => this.itemValue(item) === value) || {\n [vField]: value,\n [dField]: value,\n }\n );\n });\n }),\n filter((items): items is any[] => items !== undefined)\n );\n\n const filteredItems$ = allItems$.pipe(map(this.#pageReadItems));\n\n filteredItems$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(val => {\n this.filteredItems.set(val || []);\n this.#ref.markForCheck();\n });\n selectedItems$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(items => this.#setSelectedItems(items));\n }\n\n #setSelectedItems = (items: T[]): void => {\n // why: VALUE, SEARCH và retry phải cập nhật cùng một nhãn cho trigger, template và tooltip.\n this.selectedItems.set(items);\n this.display.set(items.map(item => (this.displayField() ? this.itemDisplay(item) : item)).join(', '));\n this.#ref.markForCheck();\n };\n\n #pageReadItems = (allItems: T[]): T[] => {\n const limit = this.limit();\n const val = this.valueModel();\n if (!this.multiple() || !Array.isArray(val) || val.length === 0) return ArrayUtilities.paging(allItems, limit);\n // why: giữ toàn bộ selection và thêm limit item chưa chọn, kể cả sau retry.\n const selectedSet = new Set(val.map(String));\n const selected: T[] = [];\n const unselected: T[] = [];\n for (const item of allItems) {\n const value = this.valueField() ? String(this.itemValue(item) ?? '') : String(item ?? '');\n (selectedSet.has(value) ? selected : unselected).push(item);\n }\n return [...selected, ...ArrayUtilities.paging(unselected, limit)];\n };\n\n #readRegion = (): HTMLElement | null => this.selectRef()?.panel?.nativeElement.querySelector('.sd-read-state-region') ?? null;\n\n protected focusReadRetry = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab' || event.shiftKey || !this.selectRef()?.panelOpen) return;\n const region = this.#readRegion();\n if (!(event.target instanceof Node) || region?.contains(event.target)) return;\n if (!this.#el.nativeElement.contains(event.target) && !this.selectRef()?.panel?.nativeElement.contains(event.target)) return;\n const button = region?.querySelector<HTMLElement>('button:not([disabled]), [tabindex=\"0\"]');\n if (!button) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n button.focus();\n };\n\n protected onReadRegionKeydown = (event: KeyboardEvent): void => {\n event.stopPropagation();\n if (event.key === 'Escape' || event.key === 'Tab') {\n if (event.key === 'Escape' || event.shiftKey) event.preventDefault();\n this.selectRef()?.focus();\n this.selectRef()?.close();\n }\n };\n\n #updateValidator = (req: boolean, val: SdCustomValidator | undefined, inl: string | undefined) => {\n this.formControl.clearValidators();\n this.formControl.clearAsyncValidators();\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (req) validators.push(Validators.required);\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n };\n\n #loadSelectedItems = async (value: any, items: SdSearch, retry = false): Promise<any[] | undefined> => {\n if (value === undefined || value === null || value === '') return [];\n\n const values = cloneReadRequest(Array.isArray(value) ? value : [value]);\n const vField = this.valueField();\n const dField = this.displayField();\n\n if (!vField && !dField) return values;\n\n const request = this.#createReadRequest(items, { type: 'VALUE', value: cloneReadRequest(value) });\n if (!request.valid()) return undefined;\n if (this.#pendingValue?.request.key === request.key && this.#pendingValue.request.valid()) {\n await this.#pendingValue.result;\n } else if (!retry && this.#failedValue?.key === request.key && this.#failedValue.valid()) {\n // why: mở panel/search không tự retry hoặc che lỗi VALUE còn hiệu lực.\n } else {\n const revision = this.#valueRead.begin(request.valid);\n this.#failedValue = undefined;\n const cached = this.#valueCache[request.key];\n if (!retry && (cached !== undefined || values.every(val => this.#allItem[String(val)] !== undefined))) {\n this.#valueRead.succeed(revision, cached?.length ?? values.length);\n } else {\n const result = (async () => {\n try {\n const results = (await items(cloneReadRequest(request.args))) || [];\n if (!this.#valueRead.isCurrent(revision)) return undefined;\n this.#addToDict(results);\n this.#valueCache[request.key] = results;\n this.#valueRead.succeed(revision, results.length);\n return results;\n } catch (error) {\n if (this.#valueRead.isCurrent(revision)) {\n this.#failedValue = request;\n this.#valueRead.fail(revision, error);\n }\n return undefined;\n } finally {\n if (this.#pendingValue?.request === request) this.#pendingValue = undefined;\n this.#syncReadLoading();\n }\n })();\n this.#pendingValue = { request, result };\n await result;\n if (this.#pendingValue?.request === request) this.#pendingValue = undefined;\n }\n }\n if (!request.valid()) return undefined;\n\n return values.map(val => {\n if (this.#allItem[val?.toString()]) return this.#allItem[val?.toString()];\n const dummy = {};\n this.setNestedValue(dummy, vField, val);\n if (dField) this.setNestedValue(dummy, dField, val);\n return dummy;\n });\n };\n\n #loadItems = async (searchText: string | undefined | null, items: SdSearch, retry = false): Promise<any[] | undefined> => {\n searchText = searchText?.toString() || '';\n const key = Utilities.hash({ checksum: this.cacheChecksum() || null, searchText });\n const request = this.#createReadRequest(items, { type: 'SEARCH', searchText });\n if (!request.valid()) return undefined;\n this.#searchDebouncing = false;\n if (this.#pendingSearch?.request.key === request.key && this.#pendingSearch.request.valid()) {\n await this.#pendingSearch.result;\n } else if (!retry && this.#failedSearch?.key === request.key && this.#failedSearch.valid()) {\n // why: thất bại không ghi [] vào cache và không tự retry do subscription khác.\n } else if (this.#cache[key] !== undefined && !retry) {\n const revision = this.#searchRead.begin(request.valid);\n this.#searchRead.succeed(revision, this.#cache[key].length);\n } else if (this.focused() || retry) {\n const currentRequestId = ++this.#searchRequestId;\n const revision = this.#searchRead.begin(() => request.valid() && currentRequestId === this.#searchRequestId);\n this.#failedSearch = undefined;\n const result = (async () => {\n try {\n const results = (await items(cloneReadRequest(request.args))) || [];\n if (!this.#searchRead.isCurrent(revision)) return undefined;\n this.#addToDict(results);\n const unique = new Map();\n results.forEach(item => {\n const value = this.itemValue(item);\n if (value != null && !unique.has(value)) unique.set(value, item);\n });\n this.#cache[key] = Array.from(unique.values());\n this.#searchRead.succeed(revision, results.length);\n return results;\n } catch (error) {\n if (this.#searchRead.isCurrent(revision)) {\n this.#failedSearch = request;\n this.#searchRead.fail(revision, error);\n }\n return undefined;\n } finally {\n if (this.#pendingSearch?.request === request) this.#pendingSearch = undefined;\n this.#syncReadLoading();\n }\n })();\n this.#pendingSearch = { request, result };\n await result;\n if (this.#pendingSearch?.request === request) this.#pendingSearch = undefined;\n }\n\n // why: continuation của loader cũ không được mở revision VALUE sau khi đổi items/context.\n if (!request.valid()) return undefined;\n const value = cloneReadRequest(this.valueModel());\n const valueKey = Utilities.hash(value);\n const selectedItems = await this.#loadSelectedItems(value, items);\n\n if (!request.valid() || valueKey !== Utilities.hash(this.valueModel()) || selectedItems === undefined) return undefined;\n\n // why: SEARCH có thể tìm được nhãn sau VALUE rỗng/lỗi; model không đổi nên selectedItems$ không chạy lại.\n this.#setSelectedItems(selectedItems);\n\n const finalMap = new Map();\n [...selectedItems, ...(this.#cache[key] || [])].forEach(e => {\n const k = this.itemValue(e);\n if (k != null && !finalMap.has(k)) finalMap.set(k, e);\n });\n return Array.from(finalMap.values());\n };\n\n #createReadRequest = (loader: SdSearch, args: SdSearchReq): SelectReadRequest => {\n const checksum = Utilities.hash({ checksum: this.cacheChecksum(), valueField: this.valueField(), displayField: this.displayField() });\n const key = Utilities.hash({ checksum, args });\n return {\n loader,\n args: cloneReadRequest(args),\n key,\n valid: () =>\n !this.#destroyed &&\n this.actualItems() === loader &&\n checksum === Utilities.hash({ checksum: this.cacheChecksum(), valueField: this.valueField(), displayField: this.displayField() }) &&\n key ===\n Utilities.hash({\n checksum,\n args:\n args.type === 'VALUE'\n ? { type: 'VALUE', value: this.valueModel() }\n : { type: 'SEARCH', searchText: this.inputControl.value || '' },\n }),\n };\n };\n\n #syncReadLoading = () => {\n if (this.#destroyed) return;\n this.loading.set(\n this.#searchDebouncing || this.#valueRead.state().status === 'loading' || this.#searchRead.state().status === 'loading'\n );\n this.#ref.markForCheck();\n };\n\n #emitReadState = () => {\n if (this.#destroyed) return;\n this.#syncReadLoading();\n this.sdReadStateChange.emit(this.readState());\n };\n\n /** Retry the error selected by readState; VALUE and SEARCH retain separate snapshots. */\n retryRead = async (): Promise<void> => {\n const state = this.readState();\n if (state.status !== 'error') return;\n const request = state.operation === 'VALUE' ? this.#failedValue : this.#failedSearch;\n if (!request || !request.valid()) return;\n if (this.#readRegion()?.contains(this.#el.nativeElement.ownerDocument.activeElement)) this.selectRef()?.focus();\n if (state.operation === 'VALUE') {\n const items = await this.#loadSelectedItems(request.args.value, request.loader, true);\n if (!request.valid() || !items) return;\n this.#setSelectedItems(items);\n const selectedKeys = new Set(items.map(item => this.itemValue(item)));\n this.filteredItems.set([...items, ...this.filteredItems().filter(item => !selectedKeys.has(this.itemValue(item)))]);\n } else {\n const items = await this.#loadItems(request.args.searchText, request.loader, true);\n if (!request.valid() || !items) return;\n this.filteredItems.set(this.#pageReadItems(items));\n }\n this.#syncReadLoading();\n };\n\n onSelectionChange = (change: MatSelectChange) => {\n this.allSelected = !this.selectRef()?.options.some(e => !e.selected);\n const value = change?.value ?? '';\n if (this.multiple()) {\n this.formControl.setValue(value || [], { emitEvent: false });\n this.#onChange(value || []);\n } else {\n this.clearSearch();\n this.formControl.setValue(value, { emitEvent: false });\n this.#onChange(value);\n }\n };\n\n /**\n * Toggle \"Chọn tất cả\" theo scope hiện tại (items enabled khớp search):\n * - Đang `checked` → BỎ chọn các value trong scope (giữ value ngoài scope, kể cả item disabled đã chọn).\n * - Ngược lại → CHỌN THÊM toàn bộ scope, union với selection hiện có (additive khi đang search).\n */\n // why: KHÔNG emit sdChange/sdSelection ở đây — giữ đúng semantics hiện hành: hai output đó chỉ\n // bắn khi panel đóng với giá trị đổi (onOpenedChange so hash). Mirror value đi cùng đường\n // onSelectionChange (setValue + #onChange) để formControl/valueModel/CVA nhất quán.\n toggleSelectAll = (): void => {\n const scope = this.selectAllScope();\n if (!scope.length) return;\n\n const current = this.normalizedValue();\n // why: normalizedValue có nhánh bọc scalar boolean thành mảng — với multiple thực tế value là\n // (number | string)[], cast để khớp chữ ký #onChange.\n const currentArr: (number | string)[] = Array.isArray(current) ? ([...current] as (number | string)[]) : [];\n const scopeValues = scope.map(item => this.itemValue(item) as number | string);\n\n let next: (number | string)[];\n if (this.selectAllState() === 'checked') {\n const scopeKeys = new Set(scopeValues.map(v => String(v)));\n next = currentArr.filter(v => !scopeKeys.has(String(v)));\n } else {\n const existing = new Set(currentArr.map(v => String(v)));\n next = [...currentArr, ...scopeValues.filter(v => !existing.has(String(v)))];\n }\n\n this.formControl.setValue(next, { emitEvent: false });\n this.#onChange(next);\n };\n\n reValidate = () => {\n this.formControl.updateValueAndValidity({ emitEvent: true });\n };\n\n // Chỉ cập nhật model binding, KHÔNG emit event.\n // sdChange + sdSelection sẽ chỉ được emit khi panel đóng (onOpenedChange).\n #onChange = async (value: boolean | number | string | (number | string)[]) => {\n this.valueModel.set(value);\n };\n\n clear = ($event?: any) => {\n $event?.stopPropagation();\n if (this.multiple()) {\n this.formControl.setValue([]);\n this.valueModel.set([]);\n this.sdChange.emit([]);\n this.sdSelection.emit({ multiple: true, values: [], selectedItems: [], value: undefined, selectedItem: undefined });\n } else {\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.sdSelection.emit({ multiple: false, values: [], selectedItems: [], value: null, selectedItem: null });\n }\n };\n\n onClick = () => {\n this.updatePanelWidth();\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.focused()) this.focus();\n }\n };\n\n focus = () => {\n this.focused.set(true);\n this.updatePanelWidth();\n setTimeout(() => {\n this.selectRef()?.focus();\n this.selectRef()?.open();\n }, 100);\n };\n\n /** Clears the panel search/filter input and resets `searchText`. */\n clearSearch = (): void => {\n const input = this.matInputRef();\n if (input) {\n input.value = '';\n }\n this.inputControl.setValue('');\n };\n\n /** Open the select panel programmatically (anchors to the mat-select trigger). */\n open = () => {\n if (this.formControl.disabled) return;\n // why: signal write từ updatePanelWidth() chưa qua CD trong cùng tick → mat-select\n // sẽ đọc [panelWidth] cũ và panel co lại theo bare trigger. Gán trực tiếp panelWidth\n // lên mat-select instance để open() thấy giá trị mới ngay, không phải chờ CD.\n this.updatePanelWidth();\n const ref = this.selectRef();\n if (!ref) return;\n (ref as { panelWidth: string | number }).panelWidth = this.calculatedPanelWidth();\n ref.open();\n };\n\n onOpenedChange = (isOpened: boolean) => {\n if (isOpened) {\n this.focused.set(true);\n this.clearSearch();\n setTimeout(() => this.matInputRef()?.focus(), 100);\n this.#hashedValue = Utilities.hash({ value: this.formControl.value });\n } else {\n this.focused.set(false);\n const hashedValue = Utilities.hash({ value: this.formControl.value });\n\n if (this.#hashedValue !== hashedValue) {\n this.sdChange.emit(this.formControl.value);\n if (this.multiple()) {\n this.sdSelection.emit({\n multiple: true,\n values: this.formControl.value,\n selectedItems: this.formControl.value?.map((val: any) => this.#allItem[val?.toString()]) || [],\n });\n } else {\n this.sdSelection.emit({\n multiple: false,\n values: [this.formControl.value],\n selectedItems: [this.#allItem[this.formControl.value?.toString()]],\n value: this.formControl.value,\n selectedItem: this.#allItem[this.formControl.value?.toString()],\n });\n }\n }\n this.#hashedValue = undefined;\n }\n };\n}\n","@let _selectedItems = selectedItems();\n@let _tooltip = tooltip();\n@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _multiple = multiple();\n@let _required = required();\n@let _normalizedValue = $any(normalizedValue());\n@let _focused = $any(focused());\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = _multiple ? !!_normalizedValue?.length : _normalizedValue !== undefined && _normalizedValue !== null;\n@let _display = display();\n@let _size = size();\n@let _floatLabel = floatLabel();\n@let _valueField = valueField();\n@let _displayField = displayField();\n@let _autoId = autoId();\n@let _loading = loading();\n@let _readState = readState();\n@let _hideReadError = hideReadError();\n\n<ng-template #selectionTooltip>\n <div class=\"sd-select-tooltip\">{{ _tooltip }}</div>\n</ng-template>\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_normalizedValue\"\n [display]=\"_display\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\"\n [selectedItems]=\"_selectedItems\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view text là \"mặt\" + trigger; editor vẫn render bên dưới (chrome ẩn qua\n .sd-inline-editor) để mở panel. Text giữ nguyên, chỉ đổi khi commit giá trị mới. -->\n <span\n class=\"sd-inline-view\"\n [sdTooltip]=\"_multiple && _tooltip ? selectionTooltip : ''\"\n sdTooltipPosition=\"top\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"enterInlineEdit()\"\n (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_normalizedValue\"\n [display]=\"_display\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\"\n [selectedItems]=\"_selectedItems\">\n </sd-view>\n\n <!-- why: clear-× chỉ hiện khi hover (CSS), đặt CUỐI face + clear($event) stopPropagation →\n xoá giá trị mà KHÔNG mở panel; tránh bug cũ (× sát trigger bị bấm nhầm lúc đóng panel). -->\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </span>\n }\n\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\" role=\"presentation\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"_focused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n (mouseenter)=\"updatePanelWidth()\"\n (focusin)=\"updatePanelWidth()\">\n @if (_multiple) {\n <mat-form-field\n [sdTooltip]=\"_tooltip ? selectionTooltip : ''\"\n sdTooltipPosition=\"top\"\n [class.sd-md]=\"_size === 'md'\"\n [class.sd-sm]=\"_size === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"_floatLabel\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <mat-select\n #select\n multiple\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n (selectionChange)=\"onSelectionChange($event)\"\n disableOptionCentering=\"true\"\n [panelWidth]=\"calculatedPanelWidth()\"\n [panelClass]=\"['sd-select-panel', 'sd-multiple']\"\n [class.sd-selected]=\"!_required && _normalizedValue?.length\"\n [required]=\"_required\"\n (openedChange)=\"onOpenedChange($event)\"\n [attr.data-autoId]=\"_autoId\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\">\n <mat-select-trigger>\n @if (sdSelectedTemplate(); as _selTpl) {\n <ng-container\n *ngTemplateOutlet=\"_selTpl; context: { $implicit: _selectedItems, item: _selectedItems, items: _selectedItems, display: _display, multiple: true }\">\n </ng-container>\n } @else {\n <div class=\"sd-trigger-text\">\n {{ _display }}\n </div>\n }\n </mat-select-trigger>\n\n @if (filtered()) {\n <div class=\"c-filter-input-container\">\n <div class=\"filter-input-wrapper\">\n <mat-icon>search</mat-icon>\n <input\n [formControl]=\"inputControl\"\n [attr.aria-label]=\"placeholder() || _label\"\n matInput\n autocomplete=\"off\"\n class=\"c-search-input\"\n (keydown)=\"focusReadRetry($event); $event.stopPropagation()\" />\n </div>\n </div>\n }\n\n <!-- why: row \"Tất cả\" KHÔNG phải mat-option thật — nếu là option, giá trị của nó lọt vào\n formControl.value và keyboard navigation của mat-select. Nhưng nó phải TRÔNG y hệt một\n option: dùng chính <mat-pseudo-checkbox> + .mdc-list-item__primary-text mà mat-option\n render, nên ăn cùng scale/margin (rule .sd-multiple) và cùng màu theme (panel mang\n class mat-primary) — mat-checkbox MDC thật thì lệch cột và ăn accent (xanh lá).\n Vì pseudo-checkbox là decorative + aria-hidden, chính div mang role/aria/keyboard. -->\n @if (selectAllVisible()) {\n @let _selectAllState = selectAllState();\n <div\n class=\"sd-select-all-row\"\n role=\"checkbox\"\n tabindex=\"0\"\n [attr.aria-checked]=\"_selectAllState === 'indeterminate' ? 'mixed' : _selectAllState === 'checked'\"\n [attr.data-autoid]=\"_autoId ? _autoId + '-select-all' : null\"\n (click)=\"toggleSelectAll()\"\n (keydown.enter)=\"toggleSelectAll(); $event.preventDefault()\"\n (keydown.space)=\"toggleSelectAll(); $event.preventDefault()\"\n (keydown)=\"$event.stopPropagation()\">\n <mat-pseudo-checkbox class=\"mat-mdc-option-pseudo-checkbox\" [state]=\"_selectAllState\" aria-hidden=\"true\"></mat-pseudo-checkbox>\n <span class=\"mdc-list-item__primary-text\">{{ selectAllLabel() }}</span>\n </div>\n }\n\n @if (!_loading && _readState.status === 'error') {\n <!-- why: MatSelect query cần option khai báo trực tiếp, không nằm trong template outlet ngoài control. -->\n <mat-option disabled class=\"sd-read-state-anchor\" aria-hidden=\"true\"></mat-option>\n }\n @let _filteredItems = filteredItems();\n @if (_filteredItems) {\n @if (!_filteredItems.length && !_loading && _readState.status !== 'error') {\n <mat-option class=\"sd-empty\" disabled>\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" style=\"width: 95px\" />\n </mat-option>\n } @else {\n @let iDefTpl = itemDef()?.templateRef;\n @if (_valueField && _displayField) {\n @for (item of _filteredItems; track itemValue(item)) {\n <mat-option [value]=\"itemValue(item)\" [disabled]=\"itemDisabled(item)\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ itemDisplay(item) }}\n }\n </div>\n </mat-option>\n }\n } @else if (!_valueField && !_displayField) {\n @for (item of _filteredItems; track item) {\n <mat-option [value]=\"item\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ item }}\n }\n </div>\n </mat-option>\n }\n }\n }\n }\n\n <ng-container [ngTemplateOutlet]=\"readRegion\"></ng-container>\n\n @if (_loading) {\n <mat-option disabled class=\"sd-loading-option\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n </mat-option>\n }\n\n @let _visibleFooterActions = visibleFooterActions();\n @if (_visibleFooterActions.length) {\n <div class=\"sd-select-footer-actions\">\n @for (action of _visibleFooterActions; track action) {\n <ng-container *ngTemplateOutlet=\"action.templateRef; context: footerActionContext()\"> </ng-container>\n }\n </div>\n }\n </mat-select>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (_normalizedValue?.length && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix>keyboard_arrow_down</mat-icon>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [class.sd-md]=\"_size === 'md'\"\n [class.sd-sm]=\"_size === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"_floatLabel\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <mat-select\n #select\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n (selectionChange)=\"onSelectionChange($event)\"\n disableOptionCentering=\"true\"\n [panelWidth]=\"calculatedPanelWidth()\"\n [panelClass]=\"'sd-select-panel'\"\n [class.sd-selected]=\"!_required && _normalizedValue !== undefined && _normalizedValue !== null\"\n [required]=\"_required\"\n (openedChange)=\"onOpenedChange($event)\"\n [attr.data-autoId]=\"_autoId\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [matTooltipDisabled]=\"!formControl.disabled || !_normalizedValue?.length\"\n [matTooltip]=\"_tooltip || ''\">\n <mat-select-trigger>\n @if (sdSelectedTemplate(); as _selTpl) {\n <ng-container\n *ngTemplateOutlet=\"_selTpl; context: { $implicit: _selectedItems[0], item: _selectedItems[0], items: _selectedItems, display: _display, multiple: false }\">\n </ng-container>\n } @else {\n {{ _display }}\n }\n </mat-select-trigger>\n\n @if (filtered()) {\n <div class=\"c-filter-input-container\">\n <div class=\"filter-input-wrapper\">\n <mat-icon>search</mat-icon>\n <input\n [formControl]=\"inputControl\"\n [attr.aria-label]=\"placeholder() || _label\"\n matInput\n autocomplete=\"off\"\n class=\"c-search-input\"\n (keydown)=\"focusReadRetry($event); $event.stopPropagation()\" />\n </div>\n </div>\n }\n\n @if (!_loading && _readState.status === 'error') {\n <mat-option disabled class=\"sd-read-state-anchor\" aria-hidden=\"true\"></mat-option>\n }\n @let _filteredItems = filteredItems();\n @if (_filteredItems) {\n @if (!_filteredItems.length && !_loading && _readState.status !== 'error') {\n <mat-option class=\"sd-empty\" disabled>\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" style=\"width: 95px\" />\n </mat-option>\n } @else {\n @let iDefTpl = itemDef()?.templateRef;\n\n @if (_valueField && _displayField) {\n @for (item of _filteredItems; track itemValue(item)) {\n <mat-option [value]=\"itemValue(item)\" [disabled]=\"itemDisabled(item)\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ itemDisplay(item) }}\n }\n </div>\n </mat-option>\n }\n } @else if (!_valueField && !_displayField) {\n @for (item of _filteredItems; track item) {\n <mat-option [value]=\"item\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ item }}\n }\n </div>\n </mat-option>\n }\n }\n }\n }\n\n <ng-container [ngTemplateOutlet]=\"readRegion\"></ng-container>\n\n @if (_loading) {\n <mat-option disabled class=\"sd-loading-option\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n </mat-option>\n }\n\n @let _visibleFooterActions = visibleFooterActions();\n @if (_visibleFooterActions.length) {\n <div class=\"sd-select-footer-actions\">\n @for (action of _visibleFooterActions; track action) {\n <ng-container *ngTemplateOutlet=\"action.templateRef; context: footerActionContext()\"> </ng-container>\n }\n </div>\n }\n </mat-select>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (_normalizedValue !== undefined && _normalizedValue !== null && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix>keyboard_arrow_down</mat-icon>\n }\n </mat-form-field>\n }\n </div>\n}\n\n<ng-template #readRegion>\n <!-- why: VALUE/SEARCH giữ lỗi độc lập; trong lúc kênh khác đang đọc chỉ hiển thị loading. -->\n @if (!_loading && _readState.status === 'error') {\n <!-- why: nút retry nằm ngoài mat-option để không trở thành một lựa chọn/form value. -->\n @if (!_hideReadError) {\n <div class=\"sd-read-state-region\" role=\"presentation\" (mousedown)=\"$event.preventDefault()\" (click)=\"$event.stopPropagation()\" (keydown)=\"onReadRegionKeydown($event)\">\n <sd-data-state state=\"error\" compact retryable (sdRetry)=\"retryRead()\">\n @if (dataStateTemplate(); as custom) {\n <ng-template sdDataStateTemplate let-current let-retry=\"retry\" let-action=\"action\">\n <ng-container [ngTemplateOutlet]=\"custom.template\"\n [ngTemplateOutletContext]=\"{ $implicit: current, state: current, retry: retry, action: action }\"></ng-container>\n </ng-template>\n }\n </sd-data-state>\n </div>\n }\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sd-angular-core-forms-select.mjs","sources":["../../../projects/sd-angular/forms/select/src/select-footer-action.directive.ts","../../../projects/sd-angular/forms/select/src/select.component.ts","../../../projects/sd-angular/forms/select/src/select.component.html","../../../projects/sd-angular/forms/select/sd-angular-core-forms-select.ts"],"sourcesContent":["import { Directive, TemplateRef, inject, input } from '@angular/core';\n\nexport interface SdSelectFooterActionContext {\n searchText: string;\n filteredItems: unknown[];\n selectedItems: unknown[];\n}\n\nexport type SdSelectFooterActionWhenFn = (ctx: SdSelectFooterActionContext) => boolean | Promise<boolean>;\nexport type SdSelectFooterActionWhen = 'always' | 'empty' | 'has-result' | SdSelectFooterActionWhenFn;\n\n@Directive({\n selector: 'ng-template[sdSelectFooterAction]',\n standalone: true,\n})\nexport class SdSelectFooterActionDirective {\n readonly templateRef = inject(TemplateRef<SdSelectFooterActionContext>);\n readonly when = input<SdSelectFooterActionWhen>('always');\n}\n","/* eslint-disable @angular-eslint/no-input-rename */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n effect,\n ElementRef,\n inject,\n input,\n isSignal,\n model,\n NgZone,\n OnInit,\n output,\n signal, // THÊM IMPORT NÀY\n Signal,\n TemplateRef,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport {\n AsyncValidatorFn,\n FormControl,\n FormGroup,\n FormsModule,\n NgForm,\n ReactiveFormsModule,\n ValidatorFn,\n Validators,\n} from '@angular/forms';\nimport { MatPseudoCheckbox } from '@angular/material/core';\nimport { FloatLabelType, MatFormFieldAppearance, MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInput, MatInputModule } from '@angular/material/input';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { MatSelect, MatSelectChange, MatSelectModule } from '@angular/material/select';\nimport { MatTooltipModule } from '@angular/material/tooltip';\n\nimport { SdView } from '@sd-angular/core/components/view';\nimport { SdDataState, SdDataStateTemplateDirective } from '@sd-angular/core/components/data-state';\nimport { cloneReadRequest, combineReadStates, SdReadChannel, SdSearchReadState } from '@sd-angular/core/utilities/read-state';\nimport { SdTooltipDirective } from '@sd-angular/core/directives';\nimport { SdItemDefDefDirective, SdViewDefDirective } from '@sd-angular/core/forms/directives';\nimport { SdLabel } from '@sd-angular/core/forms/label';\nimport {\n HandleSdCustomValidator,\n SD_FORM_CONFIGURATION,\n SdCustomValidator,\n SdFormControl,\n sdFormControlState,\n SdInlineErrorValidator,\n SdSearch,\n SdSearchReq,\n SdSelectionData,\n SdViewed,\n SdViewedInput,\n sdViewedInline,\n sdViewedTransform,\n} from '@sd-angular/core/forms/models';\nimport { I18nService } from '@sd-angular/core/i18n';\nimport { sdIsEmpty, sdSerializeDataValue } from '@sd-angular/core/utilities/data-state';\nimport { ArrayUtilities, StringUtilities, Utilities } from '@sd-angular/core/utilities/extensions';\nimport { NestedKeyOf, Size } from '@sdcorejs/utils/models';\n\nimport { combineLatest, timer } from 'rxjs';\nimport { debounce, filter, map, shareReplay, startWith, switchMap, tap } from 'rxjs/operators';\nimport { SdSelectFooterActionDirective, SdSelectFooterActionWhenFn } from './select-footer-action.directive';\n\ninterface SelectReadRequest {\n loader: SdSearch;\n args: SdSearchReq;\n key: string;\n valid: () => boolean;\n}\n\n@Component({\n selector: 'sd-select',\n templateUrl: './select.component.html',\n styleUrl: './select.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: { '[class.sd-bare]': 'isInline()', '[class.sd-viewed]': 'isViewed() || isInline()', '[class.sd-has-label]': '!!label()' },\n imports: [\n SdDataState,\n SdDataStateTemplateDirective,\n SdTooltipDirective,\n CommonModule,\n FormsModule,\n ReactiveFormsModule,\n MatInputModule,\n MatTooltipModule,\n MatFormFieldModule,\n MatIconModule,\n MatSelectModule,\n MatPseudoCheckbox,\n MatProgressSpinnerModule,\n SdLabel,\n SdView,\n SdSelectFooterActionDirective,\n ],\n})\nexport class SdSelect<T extends object | string | number = Record<string, unknown>> implements OnInit {\n id = `I${Utilities.generateUuid()}`;\n\n // ==========================================\n // 1. SIGNAL QUERIES & INJECTS\n // ==========================================\n matInputRef = viewChild(MatInput);\n selectRef = viewChild<MatSelect>('select');\n\n sdLabelTemplate = contentChild<TemplateRef<any>>('sdLabel');\n sdValueTemplate = contentChild<TemplateRef<any>>('sdValue');\n /**\n * Custom render for the SELECTED value shown in the editable trigger (`<mat-select-trigger>`).\n * Distinct from `#sdValue`/`sdViewDef` which only drive the read-only `viewed`/`inline` face.\n * Context: `{ $implicit, item, items: selectedItems(), display, multiple }` — `item`/`$implicit`\n * is the single selected item object (single mode) or the selected-item array (multiple mode).\n * Falls back to the plain `display` text when not projected, so existing usages are unaffected.\n */\n sdSelectedTemplate = contentChild<TemplateRef<any>>('sdSelected');\n itemDef = contentChild(SdItemDefDefDirective);\n sdViewDef = contentChild(SdViewDefDirective);\n footerActions = contentChildren(SdSelectFooterActionDirective);\n\n /**\n * View display template. `sdViewDef` is now just a custom override of the view rendering —\n * it replaces the projected `#sdValue` template when present (fed into `<sd-view>`'s\n * `valueTemplate`), so there is ONE rendering path. No more `.sd-view` class / focus-swap;\n * click-to-edit is governed by `viewed='inline'`.\n */\n readonly viewTemplate = computed<TemplateRef<any> | undefined>(() => this.sdViewDef()?.templateRef ?? this.sdValueTemplate());\n\n #ref = inject(ChangeDetectorRef);\n #formConfiguration = inject(SD_FORM_CONFIGURATION, { optional: true });\n #el = inject(ElementRef);\n readonly #zone = inject(NgZone);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 2. SIGNAL INPUTS & MODEL\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `forms-select-${this.autoIdInput()}` : undefined));\n\n // E2E data-* attributes\n readonly #state = sdFormControlState(computed(() => this.formControl));\n readonly dataDisabled = computed(() => (this.#state().disabled ? 'true' : 'false'));\n readonly dataInvalid = computed(() => (this.#state().invalid ? 'true' : 'false'));\n readonly dataEmpty = computed(() => (sdIsEmpty(this.#state().value) ? 'true' : 'false'));\n readonly dataValue = computed(() => sdSerializeDataValue(this.#state().value));\n readonly dataLoading = computed(() => (this.loading() ? 'true' : 'false'));\n\n readonly dataRequired = computed(() => (this.required() ? 'true' : 'false'));\n readonly dataErrorMessage = computed(() => {\n void this.#state();\n const msg = this.errorMessage();\n return msg && msg.length > 0 ? msg : null;\n });\n\n name = input<string>(Utilities.generateUuid());\n\n size = input<Size>('md');\n // Ghi (TransformT): any (để không bị lỗi typing khi cha truyền vào)\n form = input<FormGroup | undefined, any>(undefined, {\n transform: (val: any): FormGroup | undefined => {\n if (!val) return undefined;\n // Nếu cha truyền vào NgForm (template-driven) -> Bóc lấy FormGroup bên trong\n if (val instanceof NgForm) return val.form;\n // Nếu cha truyền sẵn FormGroup (reactive) -> Lấy luôn\n if (val instanceof FormGroup) return val;\n // Fallback an toàn phòng trường hợp cha truyền 1 object chứa form\n if (val?.form instanceof FormGroup) return val.form;\n return undefined;\n },\n });\n label = input<string | undefined>();\n helperText = input<string | undefined>();\n placeholder = input<string | undefined>();\n\n // why: KHÔNG dùng input.required. Template có nhánh riêng cho mảng primitive\n // (`@else if (!_valueField && !_displayField)`) nhưng input.required làm nhánh đó không bao giờ\n // tới được: `<sd-select [items]=\"['a','b']\">` ném NG0950 ngay lần render đầu vì template đọc\n // valueField()/displayField() trước khi có giá trị. Mặc định '' (giống disabledField) →\n // bỏ trống cả hai = item chính là value + label. (Đồng bộ với fix đã có ở @sdcorejs/angular.)\n valueField = input<NestedKeyOf<T> | ''>('');\n displayField = input<NestedKeyOf<T> | ''>('');\n disabledField = input<NestedKeyOf<T> | ''>('');\n cacheChecksum = input<any>();\n\n limit = input<number>(50);\n hyperlink = input<string | null | undefined>();\n\n minWidthPanel = input<string | number, string | number | undefined | null>('auto', {\n transform: value => value ?? 'auto',\n });\n\n hideInlineError = input(false, { transform: booleanAttribute });\n readonly hideReadError = input(false, { transform: booleanAttribute });\n readonly dataStateTemplate = contentChild(SdDataStateTemplateDirective);\n readonly sdReadStateChange = output<SdSearchReadState>();\n readonly #valueRead = new SdReadChannel('VALUE', () => this.#emitReadState());\n readonly #searchRead = new SdReadChannel('SEARCH', () => this.#emitReadState());\n readonly readState = computed(() => combineReadStates(this.#valueRead.state(), this.#searchRead.state()));\n required = input(false, { transform: booleanAttribute });\n disabled = input(false, { transform: booleanAttribute });\n /** Display mode: `false` edit · `true` static view · `'inline'` view + click-to-edit (bare editor). */\n viewed = input<SdViewed, SdViewedInput>(false, { transform: sdViewedTransform });\n multiple = input(false, { transform: booleanAttribute });\n /**\n * Hiện option \"Chọn tất cả\" đầu panel (chỉ multiple + items là mảng tĩnh/Signal — ẩn với\n * SdSearch lazy vì dataset không xác định). Opt-in, default `false`.\n */\n showSelectAll = input(false, { transform: booleanAttribute });\n /**\n * Whether the `viewed='inline'` text face shows a hover clear-× to empty the value.\n * Default `true`. Set `false` where the HOST owns removal (e.g. `<sd-query-bar>` chips,\n * whose own `×` removes the whole filter) so the chip isn't cluttered with two ×.\n */\n clearable = input(false, { transform: booleanAttribute });\n\n // Tri-state `viewed` (isViewed / isInline) — shared primitive. In `'inline'` the editor is\n // always rendered (chrome hidden via CSS); the sd-view text face opens the panel on click.\n readonly #viewedState = sdViewedInline(this.viewed, () => this.open(), this.disabled);\n /** `true` when `viewed === 'inline'` — editor mounted but chrome hidden; sd-view text is the trigger face. */\n readonly isInline = this.#viewedState.isInline;\n /** `true` when `viewed === true` — static read-only view, no editor mounted. */\n readonly isViewed = this.#viewedState.isViewed;\n /** Open the picker from the inline text face. No-op unless `viewed='inline'`. */\n enterInlineEdit = (): void => this.#viewedState.enterInlineEdit();\n\n validator = input<SdCustomValidator | undefined>();\n inlineError = input<string | undefined>();\n\n /**\n * Tổng hợp error message để hiển thị trong tooltip khi hideInlineError = true.\n */\n readonly errorMessage = computed<string | undefined>(() => {\n void this.#state();\n const errors = this.formControl.errors;\n if (!errors) return undefined;\n\n if (errors['required']) return this.#i18n.t('core.form.select.required');\n if (errors['customValidator']) return errors['customValidator'] as string;\n if (errors['inlineError']) return this.inlineError();\n return undefined;\n });\n\n appearanceInput = input<MatFormFieldAppearance | undefined>(undefined, { alias: 'appearance' });\n appearance = computed(() => this.appearanceInput() ?? this.#formConfiguration?.appearance ?? 'outline');\n\n floatLabel = input<FloatLabelType>('auto');\n\n // Mở rộng kiểu dữ liệu cho phép nhận Signal từ bên ngoài truyền vào\n items = input<undefined | null | T[] | SdSearch | Signal<T[]>>();\n\n valueModel = model<boolean | number | string | (number | string)[] | undefined | null>(undefined, { alias: 'model' });\n\n // ==========================================\n // 3. SIGNAL OUTPUTS\n // ==========================================\n sdChange = output<any>();\n sdSelection = output<SdSelectionData>();\n\n // ==========================================\n // 4. INTERNAL STATE & STREAMS\n // ==========================================\n formControl = new SdFormControl();\n inputControl = new FormControl('');\n\n loading = signal<boolean>(false);\n focused = signal<boolean>(false);\n allSelected = false;\n\n #cache: Record<string, any[]> = {};\n #allItem: Record<string, any> = {};\n #searchRequestId = 0;\n #destroyed = false;\n #searchDebouncing = false;\n #failedValue?: SelectReadRequest;\n #failedSearch?: SelectReadRequest;\n #pendingValue?: { request: SelectReadRequest; result: Promise<any[] | undefined> };\n #pendingSearch?: { request: SelectReadRequest; result: Promise<any[] | undefined> };\n #valueCache: Record<string, any[]> = {};\n #hashedValue?: string;\n\n // [NÂNG CẤP]: Xử lý Unwrap (Mở hộp) Signal lồng nhau nếu có\n actualItems = computed(() => {\n const rawItems = this.items();\n // Nếu cha truyền vào một biến Signal, ta cần gọi rawItems() để lấy mảng thật\n if (isSignal(rawItems)) {\n return rawItems();\n }\n return rawItems;\n });\n\n // Thay vì toObservable(this.items), ta observe cái actualItems đã được unwrap\n #items$ = toObservable(\n computed(() => ({\n items: this.actualItems(),\n checksum: this.cacheChecksum(),\n valueField: this.valueField(),\n displayField: this.displayField(),\n }))\n ).pipe(map(context => context.items));\n #valueModel$ = toObservable(this.valueModel);\n\n filteredItems = signal<T[]>([]);\n selectedItems = signal<T[]>([]);\n display = signal<string>('');\n calculatedPanelWidth = signal<string | number>('auto');\n\n readonly searchText = signal<string>('');\n readonly footerActionContext = computed(() => ({\n searchText: this.searchText(),\n filteredItems: this.filteredItems() as T[],\n selectedItems: this.selectedItems() as T[],\n }));\n readonly #footerFnVisibility = signal<WeakMap<SdSelectFooterActionDirective, boolean>>(new WeakMap());\n readonly visibleFooterActions = computed(() => this.footerActions().filter(action => this.shouldRenderFooterAction(action)));\n\n normalizedValue = computed(() => {\n const val = this.valueModel();\n if (this.multiple() && val !== undefined && val !== null && !Array.isArray(val)) {\n return [val];\n }\n return val;\n });\n\n filtered = computed(() => {\n const data = this.actualItems();\n if (typeof data === 'function') return true;\n if (Array.isArray(data)) return data.filter(e => e != null).length > 10;\n return false;\n });\n\n delayTime = computed(() => (typeof this.actualItems() === 'function' ? 500 : 0));\n\n /**\n * Scope của \"Chọn tất cả\": item enabled khớp search text hiện tại, tính trên MẢNG NGUỒN\n * `actualItems()`.\n */\n // why: KHÔNG đọc filteredItems — nó đã bị cắt theo `limit` paging nên tick all sẽ thiếu item;\n // luật khớp search phải trùng với filter của allItems$ (aliasIncludes trên cả value + display).\n readonly selectAllScope = computed<T[]>(() => {\n const data = this.actualItems();\n if (!Array.isArray(data)) return [];\n const sText = this.searchText() || '';\n return (data as T[]).filter(item => {\n if (item == null || this.itemDisabled(item)) return false;\n return StringUtilities.aliasIncludes(this.itemValue(item), sText) || StringUtilities.aliasIncludes(this.itemDisplay(item), sText);\n });\n });\n\n /** Row \"Chọn tất cả\" chỉ render khi opt-in + multiple + items tĩnh + scope có item để thao tác. */\n readonly selectAllVisible = computed(\n () => this.showSelectAll() && this.multiple() && Array.isArray(this.actualItems()) && this.selectAllScope().length > 0\n );\n\n /** Trạng thái checkbox \"Chọn tất cả\", tính trên items ENABLED trong scope (item disabled bỏ qua). */\n readonly selectAllState = computed<'checked' | 'indeterminate' | 'unchecked'>(() => {\n const scope = this.selectAllScope();\n const val = this.normalizedValue();\n const selected = new Set((Array.isArray(val) ? val : []).map(v => String(v)));\n if (!scope.length || !selected.size) return 'unchecked';\n let count = 0;\n for (const item of scope) {\n if (selected.has(String(this.itemValue(item)))) count++;\n }\n if (count === 0) return 'unchecked';\n return count === scope.length ? 'checked' : 'indeterminate';\n });\n\n // why: template select chưa dùng pipe i18n — label đi qua computed để khỏi thêm pipe import.\n readonly selectAllLabel = computed(() => this.#i18n.t('core.form.select.selectAll'));\n\n // ==========================================\n // 5. GETTER & HELPERS\n // ==========================================\n itemValue = (item: T): unknown => {\n const path = this.valueField();\n if (!path || item == null) return item;\n return Utilities.getNestedValue(item, path as string);\n };\n\n itemDisplay = (item: T): string => {\n const path = this.displayField();\n if (!path || item == null) return String(item ?? '');\n return String(Utilities.getNestedValue(item, path as string) ?? '');\n };\n\n itemDisabled = (item: T): boolean => {\n const path = this.disabledField();\n if (!path || item == null) return false;\n return Boolean(Utilities.getNestedValue(item, path as string));\n };\n\n shouldRenderFooterAction(action: SdSelectFooterActionDirective): boolean {\n const when = action.when();\n\n if (typeof when === 'function') {\n return this.#footerFnVisibility().get(action) ?? false;\n }\n\n if (when === 'always') return true;\n if (when === 'empty') {\n return this.searchText().trim().length > 0 && this.filteredItems().length === 0;\n }\n if (when === 'has-result') return this.filteredItems().length > 0;\n return false;\n }\n\n setNestedValue = (obj: any, path: string, value: any) => {\n if (!path) return;\n const keys = path.split('.');\n let current = obj;\n for (let i = 0; i < keys.length - 1; i++) {\n if (!current[keys[i]]) current[keys[i]] = {};\n current = current[keys[i]];\n }\n current[keys[keys.length - 1]] = value;\n };\n\n #addToDict = (dataList: any[]) => {\n if (!this.valueField()) return;\n dataList.forEach(e => {\n const k = this.itemValue(e);\n if (k != null) this.#allItem[String(k)] = e;\n });\n };\n\n tooltip = computed(() => {\n const items = this.selectedItems();\n if (!items || !items.length) return '';\n if (this.multiple()) {\n return [\n this.#i18n.t('core.form.select.selected-count', { count: items.length }),\n ...items.map(item => `• ${this.itemDisplay(item)}`),\n ].join('\\n');\n }\n const vF = this.valueField();\n return items.map(item => (vF ? `• ${this.itemValue(item)} - ${this.itemDisplay(item)}` : `• ${item}`)).join('\\n');\n });\n\n updatePanelWidth = () => {\n let minWInput = this.minWidthPanel();\n // why: inline mode — trigger là text hẹp (.sd-inline-view), panel tối thiểu 200px cho dễ đọc options.\n if (this.isInline() && (!minWInput || minWInput === 'auto')) minWInput = '200px';\n if (!minWInput || minWInput === 'auto') {\n this.calculatedPanelWidth.set('auto');\n return;\n }\n\n const minWStr = String(minWInput).trim().toLowerCase();\n if (!minWStr.endsWith('px') && isNaN(Number(minWStr))) {\n this.calculatedPanelWidth.set(minWInput);\n return;\n }\n\n const hostWidth = this.#el.nativeElement.getBoundingClientRect().width;\n const minW = parseFloat(minWStr);\n\n if (hostWidth >= minW) {\n this.calculatedPanelWidth.set('auto');\n } else {\n this.calculatedPanelWidth.set(minWInput);\n }\n };\n\n #destroyRef = inject(DestroyRef);\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#destroyed = true;\n this.#valueRead.invalidate();\n this.#searchRead.invalidate();\n ++this.#searchRequestId;\n });\n effect(() => {\n this.actualItems();\n this.valueModel();\n this.valueField();\n this.displayField();\n this.cacheChecksum();\n untracked(() => {\n if ((this.#failedValue && !this.#failedValue.valid()) || (this.#pendingValue && !this.#pendingValue.request.valid())) {\n this.#failedValue = undefined;\n this.#pendingValue = undefined;\n this.#valueRead.invalidate();\n }\n });\n });\n effect(() => {\n const val = this.normalizedValue();\n untracked(() => {\n const current = this.formControl.value;\n const isDiff = Array.isArray(val) && Array.isArray(current) ? JSON.stringify(val) !== JSON.stringify(current) : val !== current;\n\n if (isDiff) {\n this.formControl.setValue(val, { emitEvent: false });\n }\n });\n });\n\n effect(() => {\n if (this.disabled()) this.formControl.disable({ emitEvent: false });\n else this.formControl.enable({ emitEvent: false });\n });\n\n effect(() => {\n const req = this.required();\n const val = this.validator();\n const inl = this.inlineError();\n untracked(() => this.#updateValidator(req, val, inl));\n });\n\n // ==========================================\n // EFFECT: QUẢN LÝ FORM GROUP & CONTROL\n // ==========================================\n effect(onCleanup => {\n // 1. Lấy giá trị mới nhất của form và name\n const formGroup = this.form();\n const controlName = this.name();\n if (formGroup && controlName) {\n // 2. Thêm control vào form\n formGroup.addControl(controlName, this.formControl);\n // 3. Đăng ký hàm dọn dẹp (Cleanup)\n onCleanup(() => {\n // Hàm này sẽ tự động chạy trong 2 trường hợp:\n // - Khi Component bị Destroy (thay thế ngOnDestroy)\n // - Khi form() hoặc name() thay đổi giá trị (nó sẽ gỡ control cũ ra trước khi add cái mới vào)\n formGroup.removeControl(controlName);\n });\n }\n });\n\n effect(() => {\n const actions = this.footerActions();\n const context = this.footerActionContext();\n\n const fnActions: { action: SdSelectFooterActionDirective; fn: SdSelectFooterActionWhenFn }[] = [];\n for (const action of actions) {\n const when = action.when();\n if (typeof when === 'function') fnActions.push({ action, fn: when });\n }\n\n if (!fnActions.length) return;\n\n // why: Promise.all chạy ngoài reactive context — không tạo circular dependency\n Promise.all(\n fnActions.map(async ({ action, fn }) => ({\n action,\n result: await Promise.resolve(fn(context)),\n }))\n ).then(results => {\n const map = new WeakMap<SdSelectFooterActionDirective, boolean>();\n results.forEach(({ action, result }) => map.set(action, result));\n this.#footerFnVisibility.set(map);\n this.#ref.markForCheck();\n });\n });\n\n effect(onCleanup => {\n const select = this.selectRef();\n if (!select) return;\n const document = this.#el.nativeElement.ownerDocument as Document;\n const removeListener = () => document.removeEventListener('keydown', this.focusReadRetry, true);\n const opened = select.openedChange.subscribe(isOpened => {\n if (isOpened) {\n // why: bắt Tab trước Material để focus nút thử lại, chỉ trong lúc panel mở.\n this.#zone.runOutsideAngular(() => document.addEventListener('keydown', this.focusReadRetry, true));\n } else {\n removeListener();\n }\n });\n onCleanup(() => {\n // why: đổi viewed/multiple có thể huỷ MatSelect bên trong mà không phát sự kiện đóng.\n opened.unsubscribe();\n removeListener();\n });\n });\n }\n\n ngOnInit() {\n this.formControl.valueChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(val => {\n const currentModel = this.valueModel();\n const isDiff =\n Array.isArray(val) && Array.isArray(currentModel) ? JSON.stringify(val) !== JSON.stringify(currentModel) : val !== currentModel;\n\n if (isDiff) {\n this.valueModel.set(val);\n }\n });\n\n this.formControl.sdChanges.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(() => this.#ref.markForCheck());\n\n const cleanItems$ = this.#items$.pipe(\n tap(() => {\n this.#cache = {};\n this.#allItem = {};\n this.#valueCache = {};\n this.#failedValue = this.#failedSearch = undefined;\n this.#pendingValue = this.#pendingSearch = undefined;\n this.#valueRead.invalidate();\n this.#searchRead.invalidate();\n ++this.#searchRequestId;\n this.inputControl.setValue('');\n }),\n map(items => {\n if (!items) return [];\n if (Array.isArray(items)) return items.filter(e => e !== null && e !== undefined);\n return items;\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n );\n\n const search$ = this.inputControl.valueChanges.pipe(\n startWith(''),\n tap(searchText => {\n const text = searchText?.toString() || '';\n if (text !== this.searchText()) {\n ++this.#searchRequestId;\n this.#failedSearch = undefined;\n this.#pendingSearch = undefined;\n this.#searchRead.invalidate();\n }\n this.searchText.set(text);\n }),\n tap(() => {\n if (typeof this.actualItems() === 'function' && this.focused()) {\n this.#searchDebouncing = true;\n this.loading.set(true);\n this.#ref.markForCheck();\n }\n }),\n debounce(() => timer(this.delayTime()))\n );\n\n const allItems$ = combineLatest([cleanItems$, search$, this.#valueModel$]).pipe(\n switchMap(async ([items, searchText]) => {\n const sText = searchText || '';\n const formValue = this.valueModel();\n const vField = this.valueField();\n\n if (typeof items === 'function') {\n return await this.#loadItems(sText, items);\n }\n\n this.#addToDict(items);\n const isArray = Array.isArray(formValue);\n const hasFields = !!vField && !!this.displayField();\n\n const filteredList = items.filter(item => {\n const value = hasFields ? this.itemValue(item) : item;\n const display = hasFields ? this.itemDisplay(item) : item;\n if (StringUtilities.aliasIncludes(value, sText) || StringUtilities.aliasIncludes(display, sText)) return true;\n if (isArray) return formValue.some((e: any) => e === value);\n return formValue === value;\n });\n\n // Khi filtered mode bật và multiple=true, luôn đẩy item đã chọn lên trên\n // để user dễ nhìn thấy selection hiện tại, kể cả dataset chưa vượt limit.\n const shouldPinSelectedFirst = this.filtered() && this.multiple() && isArray;\n if (!shouldPinSelectedFirst && items.length <= this.limit()) return filteredList;\n\n return filteredList.sort((current, next) => {\n const value1 = hasFields ? this.itemValue(current) : current;\n const value2 = hasFields ? this.itemValue(next) : next;\n let flag1 = 0;\n let flag2 = 0;\n if (isArray) {\n flag1 = formValue.some((e: any) => e === value1) ? 1 : 0;\n flag2 = formValue.some((e: any) => e === value2) ? 1 : 0;\n return flag2 - flag1;\n }\n flag1 = formValue === value1 ? 1 : 0;\n flag2 = formValue === value2 ? 1 : 0;\n return flag2 - flag1;\n });\n }),\n filter((items): items is any[] => items !== undefined),\n tap(() => this.#syncReadLoading())\n );\n\n const selectedItems$ = combineLatest([cleanItems$, this.#valueModel$]).pipe(\n switchMap(async ([items, val]) => {\n const vField = this.valueField();\n const dField = this.displayField();\n\n if (val === undefined || val === null || val === '') {\n this.#failedValue = undefined;\n this.#valueRead.invalidate();\n return [];\n }\n\n const values = Array.isArray(val) ? val : [val];\n if (!vField) return values;\n\n if (typeof items === 'function') {\n return await this.#loadSelectedItems(val, items as SdSearch);\n }\n\n return values.map(value => {\n return (\n (items as any[])?.find(item => this.itemValue(item) === value) || {\n [vField]: value,\n [dField]: value,\n }\n );\n });\n }),\n filter((items): items is any[] => items !== undefined)\n );\n\n const filteredItems$ = allItems$.pipe(map(this.#pageReadItems));\n\n filteredItems$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(val => {\n this.filteredItems.set(val || []);\n this.#ref.markForCheck();\n });\n selectedItems$.pipe(takeUntilDestroyed(this.#destroyRef)).subscribe(items => this.#setSelectedItems(items));\n }\n\n #setSelectedItems = (items: T[]): void => {\n // why: VALUE, SEARCH và retry phải cập nhật cùng một nhãn cho trigger, template và tooltip.\n this.selectedItems.set(items);\n this.display.set(items.map(item => (this.displayField() ? this.itemDisplay(item) : item)).join(', '));\n this.#ref.markForCheck();\n };\n\n #pageReadItems = (allItems: T[]): T[] => {\n const limit = this.limit();\n const val = this.valueModel();\n if (!this.multiple() || !Array.isArray(val) || val.length === 0) return ArrayUtilities.paging(allItems, limit);\n // why: giữ toàn bộ selection và thêm limit item chưa chọn, kể cả sau retry.\n const selectedSet = new Set(val.map(String));\n const selected: T[] = [];\n const unselected: T[] = [];\n for (const item of allItems) {\n const value = this.valueField() ? String(this.itemValue(item) ?? '') : String(item ?? '');\n (selectedSet.has(value) ? selected : unselected).push(item);\n }\n return [...selected, ...ArrayUtilities.paging(unselected, limit)];\n };\n\n #readRegion = (): HTMLElement | null => this.selectRef()?.panel?.nativeElement.querySelector('.sd-read-state-region') ?? null;\n\n protected focusReadRetry = (event: KeyboardEvent): void => {\n if (event.key !== 'Tab' || event.shiftKey || !this.selectRef()?.panelOpen) return;\n const region = this.#readRegion();\n if (!(event.target instanceof Node) || region?.contains(event.target)) return;\n if (!this.#el.nativeElement.contains(event.target) && !this.selectRef()?.panel?.nativeElement.contains(event.target)) return;\n const button = region?.querySelector<HTMLElement>('button:not([disabled]), [tabindex=\"0\"]');\n if (!button) return;\n event.preventDefault();\n event.stopImmediatePropagation();\n button.focus();\n };\n\n protected onReadRegionKeydown = (event: KeyboardEvent): void => {\n event.stopPropagation();\n if (event.key === 'Escape' || event.key === 'Tab') {\n if (event.key === 'Escape' || event.shiftKey) event.preventDefault();\n this.selectRef()?.focus();\n this.selectRef()?.close();\n }\n };\n\n #updateValidator = (req: boolean, val: SdCustomValidator | undefined, inl: string | undefined) => {\n this.formControl.clearValidators();\n this.formControl.clearAsyncValidators();\n const validators: ValidatorFn[] = [];\n const asyncValidators: AsyncValidatorFn[] = [];\n\n if (req) validators.push(Validators.required);\n if (val) asyncValidators.push(HandleSdCustomValidator(val));\n if (inl) validators.push(SdInlineErrorValidator);\n\n this.formControl.setValidators(validators.length ? validators : null);\n this.formControl.setAsyncValidators(asyncValidators.length ? asyncValidators : null);\n this.formControl.updateValueAndValidity({ emitEvent: false });\n };\n\n #loadSelectedItems = async (value: any, items: SdSearch, retry = false): Promise<any[] | undefined> => {\n if (value === undefined || value === null || value === '') return [];\n\n const values = cloneReadRequest(Array.isArray(value) ? value : [value]);\n const vField = this.valueField();\n const dField = this.displayField();\n\n if (!vField && !dField) return values;\n\n const request = this.#createReadRequest(items, { type: 'VALUE', value: cloneReadRequest(value) });\n if (!request.valid()) return undefined;\n if (this.#pendingValue?.request.key === request.key && this.#pendingValue.request.valid()) {\n await this.#pendingValue.result;\n } else if (!retry && this.#failedValue?.key === request.key && this.#failedValue.valid()) {\n // why: mở panel/search không tự retry hoặc che lỗi VALUE còn hiệu lực.\n } else {\n const revision = this.#valueRead.begin(request.valid);\n this.#failedValue = undefined;\n const cached = this.#valueCache[request.key];\n if (!retry && (cached !== undefined || values.every(val => this.#allItem[String(val)] !== undefined))) {\n this.#valueRead.succeed(revision, cached?.length ?? values.length);\n } else {\n const result = (async () => {\n try {\n const results = (await items(cloneReadRequest(request.args))) || [];\n if (!this.#valueRead.isCurrent(revision)) return undefined;\n this.#addToDict(results);\n this.#valueCache[request.key] = results;\n this.#valueRead.succeed(revision, results.length);\n return results;\n } catch (error) {\n if (this.#valueRead.isCurrent(revision)) {\n this.#failedValue = request;\n this.#valueRead.fail(revision, error);\n }\n return undefined;\n } finally {\n if (this.#pendingValue?.request === request) this.#pendingValue = undefined;\n this.#syncReadLoading();\n }\n })();\n this.#pendingValue = { request, result };\n await result;\n if (this.#pendingValue?.request === request) this.#pendingValue = undefined;\n }\n }\n if (!request.valid()) return undefined;\n\n return values.map(val => {\n if (this.#allItem[val?.toString()]) return this.#allItem[val?.toString()];\n const dummy = {};\n this.setNestedValue(dummy, vField, val);\n if (dField) this.setNestedValue(dummy, dField, val);\n return dummy;\n });\n };\n\n #loadItems = async (searchText: string | undefined | null, items: SdSearch, retry = false): Promise<any[] | undefined> => {\n searchText = searchText?.toString() || '';\n const key = Utilities.hash({ checksum: this.cacheChecksum() || null, searchText });\n const request = this.#createReadRequest(items, { type: 'SEARCH', searchText });\n if (!request.valid()) return undefined;\n this.#searchDebouncing = false;\n if (this.#pendingSearch?.request.key === request.key && this.#pendingSearch.request.valid()) {\n await this.#pendingSearch.result;\n } else if (!retry && this.#failedSearch?.key === request.key && this.#failedSearch.valid()) {\n // why: thất bại không ghi [] vào cache và không tự retry do subscription khác.\n } else if (this.#cache[key] !== undefined && !retry) {\n const revision = this.#searchRead.begin(request.valid);\n this.#searchRead.succeed(revision, this.#cache[key].length);\n } else if (this.focused() || retry) {\n const currentRequestId = ++this.#searchRequestId;\n const revision = this.#searchRead.begin(() => request.valid() && currentRequestId === this.#searchRequestId);\n this.#failedSearch = undefined;\n const result = (async () => {\n try {\n const results = (await items(cloneReadRequest(request.args))) || [];\n if (!this.#searchRead.isCurrent(revision)) return undefined;\n this.#addToDict(results);\n const unique = new Map();\n results.forEach(item => {\n const value = this.itemValue(item);\n if (value != null && !unique.has(value)) unique.set(value, item);\n });\n this.#cache[key] = Array.from(unique.values());\n this.#searchRead.succeed(revision, results.length);\n return results;\n } catch (error) {\n if (this.#searchRead.isCurrent(revision)) {\n this.#failedSearch = request;\n this.#searchRead.fail(revision, error);\n }\n return undefined;\n } finally {\n if (this.#pendingSearch?.request === request) this.#pendingSearch = undefined;\n this.#syncReadLoading();\n }\n })();\n this.#pendingSearch = { request, result };\n await result;\n if (this.#pendingSearch?.request === request) this.#pendingSearch = undefined;\n }\n\n // why: continuation của loader cũ không được mở revision VALUE sau khi đổi items/context.\n if (!request.valid()) return undefined;\n const value = cloneReadRequest(this.valueModel());\n const valueKey = Utilities.hash(value);\n const selectedItems = await this.#loadSelectedItems(value, items);\n\n if (!request.valid() || valueKey !== Utilities.hash(this.valueModel()) || selectedItems === undefined) return undefined;\n\n // why: SEARCH có thể tìm được nhãn sau VALUE rỗng/lỗi; model không đổi nên selectedItems$ không chạy lại.\n this.#setSelectedItems(selectedItems);\n\n const finalMap = new Map();\n [...selectedItems, ...(this.#cache[key] || [])].forEach(e => {\n const k = this.itemValue(e);\n if (k != null && !finalMap.has(k)) finalMap.set(k, e);\n });\n return Array.from(finalMap.values());\n };\n\n #createReadRequest = (loader: SdSearch, args: SdSearchReq): SelectReadRequest => {\n const checksum = Utilities.hash({ checksum: this.cacheChecksum(), valueField: this.valueField(), displayField: this.displayField() });\n const key = Utilities.hash({ checksum, args });\n return {\n loader,\n args: cloneReadRequest(args),\n key,\n valid: () =>\n !this.#destroyed &&\n this.actualItems() === loader &&\n checksum === Utilities.hash({ checksum: this.cacheChecksum(), valueField: this.valueField(), displayField: this.displayField() }) &&\n key ===\n Utilities.hash({\n checksum,\n args:\n args.type === 'VALUE'\n ? { type: 'VALUE', value: this.valueModel() }\n : { type: 'SEARCH', searchText: this.inputControl.value || '' },\n }),\n };\n };\n\n #syncReadLoading = () => {\n if (this.#destroyed) return;\n this.loading.set(\n this.#searchDebouncing || this.#valueRead.state().status === 'loading' || this.#searchRead.state().status === 'loading'\n );\n this.#ref.markForCheck();\n };\n\n #emitReadState = () => {\n if (this.#destroyed) return;\n this.#syncReadLoading();\n this.sdReadStateChange.emit(this.readState());\n };\n\n /** Retry the error selected by readState; VALUE and SEARCH retain separate snapshots. */\n retryRead = async (): Promise<void> => {\n const state = this.readState();\n if (state.status !== 'error') return;\n const request = state.operation === 'VALUE' ? this.#failedValue : this.#failedSearch;\n if (!request || !request.valid()) return;\n if (this.#readRegion()?.contains(this.#el.nativeElement.ownerDocument.activeElement)) this.selectRef()?.focus();\n if (state.operation === 'VALUE') {\n const items = await this.#loadSelectedItems(request.args.value, request.loader, true);\n if (!request.valid() || !items) return;\n this.#setSelectedItems(items);\n const selectedKeys = new Set(items.map(item => this.itemValue(item)));\n this.filteredItems.set([...items, ...this.filteredItems().filter(item => !selectedKeys.has(this.itemValue(item)))]);\n } else {\n const items = await this.#loadItems(request.args.searchText, request.loader, true);\n if (!request.valid() || !items) return;\n this.filteredItems.set(this.#pageReadItems(items));\n }\n this.#syncReadLoading();\n };\n\n onSelectionChange = (change: MatSelectChange) => {\n this.allSelected = !this.selectRef()?.options.some(e => !e.selected);\n const value = change?.value ?? '';\n if (this.multiple()) {\n this.formControl.setValue(value || [], { emitEvent: false });\n this.#onChange(value || []);\n } else {\n this.clearSearch();\n this.formControl.setValue(value, { emitEvent: false });\n this.#onChange(value);\n }\n };\n\n /**\n * Toggle \"Chọn tất cả\" theo scope hiện tại (items enabled khớp search):\n * - Đang `checked` → BỎ chọn các value trong scope (giữ value ngoài scope, kể cả item disabled đã chọn).\n * - Ngược lại → CHỌN THÊM toàn bộ scope, union với selection hiện có (additive khi đang search).\n */\n // why: KHÔNG emit sdChange/sdSelection ở đây — giữ đúng semantics hiện hành: hai output đó chỉ\n // bắn khi panel đóng với giá trị đổi (onOpenedChange so hash). Mirror value đi cùng đường\n // onSelectionChange (setValue + #onChange) để formControl/valueModel/CVA nhất quán.\n toggleSelectAll = (): void => {\n const scope = this.selectAllScope();\n if (!scope.length) return;\n\n const current = this.normalizedValue();\n // why: normalizedValue có nhánh bọc scalar boolean thành mảng — với multiple thực tế value là\n // (number | string)[], cast để khớp chữ ký #onChange.\n const currentArr: (number | string)[] = Array.isArray(current) ? ([...current] as (number | string)[]) : [];\n const scopeValues = scope.map(item => this.itemValue(item) as number | string);\n\n let next: (number | string)[];\n if (this.selectAllState() === 'checked') {\n const scopeKeys = new Set(scopeValues.map(v => String(v)));\n next = currentArr.filter(v => !scopeKeys.has(String(v)));\n } else {\n const existing = new Set(currentArr.map(v => String(v)));\n next = [...currentArr, ...scopeValues.filter(v => !existing.has(String(v)))];\n }\n\n this.formControl.setValue(next, { emitEvent: false });\n this.#onChange(next);\n };\n\n reValidate = () => {\n this.formControl.updateValueAndValidity({ emitEvent: true });\n };\n\n // Chỉ cập nhật model binding, KHÔNG emit event.\n // sdChange + sdSelection sẽ chỉ được emit khi panel đóng (onOpenedChange).\n #onChange = async (value: boolean | number | string | (number | string)[]) => {\n this.valueModel.set(value);\n };\n\n clear = ($event?: any) => {\n $event?.stopPropagation();\n if (this.multiple()) {\n this.formControl.setValue([]);\n this.valueModel.set([]);\n this.sdChange.emit([]);\n this.sdSelection.emit({ multiple: true, values: [], selectedItems: [], value: undefined, selectedItem: undefined });\n } else {\n this.formControl.setValue(null);\n this.valueModel.set(null);\n this.sdChange.emit(null);\n this.sdSelection.emit({ multiple: false, values: [], selectedItems: [], value: null, selectedItem: null });\n }\n };\n\n onClick = () => {\n this.updatePanelWidth();\n if (this.sdViewDef()?.templateRef) {\n if (!this.formControl.disabled && !this.focused()) this.focus();\n }\n };\n\n focus = () => {\n this.focused.set(true);\n this.updatePanelWidth();\n setTimeout(() => {\n this.selectRef()?.focus();\n this.selectRef()?.open();\n }, 100);\n };\n\n /** Clears the panel search/filter input and resets `searchText`. */\n clearSearch = (): void => {\n const input = this.matInputRef();\n if (input) {\n input.value = '';\n }\n this.inputControl.setValue('');\n };\n\n /** Open the select panel programmatically (anchors to the mat-select trigger). */\n open = () => {\n if (this.formControl.disabled) return;\n // why: signal write từ updatePanelWidth() chưa qua CD trong cùng tick → mat-select\n // sẽ đọc [panelWidth] cũ và panel co lại theo bare trigger. Gán trực tiếp panelWidth\n // lên mat-select instance để open() thấy giá trị mới ngay, không phải chờ CD.\n this.updatePanelWidth();\n const ref = this.selectRef();\n if (!ref) return;\n (ref as { panelWidth: string | number }).panelWidth = this.calculatedPanelWidth();\n ref.open();\n };\n\n onOpenedChange = (isOpened: boolean) => {\n if (isOpened) {\n this.focused.set(true);\n this.clearSearch();\n setTimeout(() => this.matInputRef()?.focus(), 100);\n this.#hashedValue = Utilities.hash({ value: this.formControl.value });\n } else {\n this.focused.set(false);\n const hashedValue = Utilities.hash({ value: this.formControl.value });\n\n if (this.#hashedValue !== hashedValue) {\n this.sdChange.emit(this.formControl.value);\n if (this.multiple()) {\n this.sdSelection.emit({\n multiple: true,\n values: this.formControl.value,\n selectedItems: this.formControl.value?.map((val: any) => this.#allItem[val?.toString()]) || [],\n });\n } else {\n this.sdSelection.emit({\n multiple: false,\n values: [this.formControl.value],\n selectedItems: [this.#allItem[this.formControl.value?.toString()]],\n value: this.formControl.value,\n selectedItem: this.#allItem[this.formControl.value?.toString()],\n });\n }\n }\n this.#hashedValue = undefined;\n }\n };\n}\n","@let _selectedItems = selectedItems();\n@let _tooltip = tooltip();\n@let _label = label();\n@let _appearance = appearance();\n@let _hideInlineError = hideInlineError();\n@let _errorMessage = errorMessage();\n@let _helperText = helperText();\n@let _multiple = multiple();\n@let _required = required();\n@let _normalizedValue = $any(normalizedValue());\n@let _focused = $any(focused());\n@let _isInline = isInline();\n@let _bare = _isInline;\n@let _hasValue = _multiple ? !!_normalizedValue?.length : _normalizedValue !== undefined && _normalizedValue !== null;\n@let _display = display();\n@let _size = size();\n@let _floatLabel = floatLabel();\n@let _valueField = valueField();\n@let _displayField = displayField();\n@let _autoId = autoId();\n@let _loading = loading();\n@let _readState = readState();\n@let _hideReadError = hideReadError();\n\n<ng-template #selectionTooltip>\n <div class=\"sd-select-tooltip\">{{ _tooltip }}</div>\n</ng-template>\n\n@if (isViewed()) {\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_normalizedValue\"\n [display]=\"_display\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\"\n [selectedItems]=\"_selectedItems\">\n </sd-view>\n} @else {\n @if (_isInline) {\n <!-- why: inline — sd-view text là \"mặt\" + trigger; editor vẫn render bên dưới (chrome ẩn qua\n .sd-inline-editor) để mở panel. Text giữ nguyên, chỉ đổi khi commit giá trị mới. -->\n <span\n class=\"sd-inline-view\"\n [sdTooltip]=\"_multiple && _tooltip ? selectionTooltip : ''\"\n sdTooltipPosition=\"top\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"enterInlineEdit()\"\n (keydown.enter)=\"enterInlineEdit()\">\n <sd-view\n [label]=\"_label\"\n [labelTemplate]=\"sdLabelTemplate()\"\n [value]=\"_normalizedValue\"\n [display]=\"_display\"\n [hyperlink]=\"hyperlink()\"\n [valueTemplate]=\"viewTemplate()\"\n [selectedItems]=\"_selectedItems\">\n </sd-view>\n\n <!-- why: clear-× chỉ hiện khi hover (CSS), đặt CUỐI face + clear($event) stopPropagation →\n xoá giá trị mà KHÔNG mở panel; tránh bug cũ (× sát trigger bị bấm nhầm lúc đóng panel). -->\n @if (clearable() && _hasValue && !_required && !formControl.disabled) {\n <button type=\"button\" class=\"sd-inline-clear\" (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n }\n </span>\n }\n\n @if (!_appearance) {\n <ng-content select=\"[sdLabel]\">\n @if (_label) {\n <sd-label [label]=\"_label\" [required]=\"_required\"></sd-label>\n }\n </ng-content>\n }\n\n <div\n class=\"d-flex align-items-center\" role=\"presentation\"\n [class.sd-inline-editor]=\"_isInline\"\n [class.c-focused]=\"_focused\"\n [class.c-disabled]=\"formControl.disabled\"\n (click)=\"onClick()\"\n (mouseenter)=\"updatePanelWidth()\"\n (focusin)=\"updatePanelWidth()\">\n @if (_multiple) {\n <mat-form-field\n [sdTooltip]=\"_tooltip ? selectionTooltip : ''\"\n sdTooltipPosition=\"top\"\n [class.sd-md]=\"_size === 'md'\"\n [class.sd-sm]=\"_size === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"_floatLabel\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <mat-select\n #select\n multiple\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n (selectionChange)=\"onSelectionChange($event)\"\n disableOptionCentering=\"true\"\n [panelWidth]=\"calculatedPanelWidth()\"\n [panelClass]=\"['sd-select-panel', 'sd-multiple']\"\n [class.sd-selected]=\"!_required && _normalizedValue?.length\"\n [required]=\"_required\"\n (openedChange)=\"onOpenedChange($event)\"\n [attr.data-autoId]=\"_autoId\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\">\n <mat-select-trigger>\n @if (sdSelectedTemplate(); as _selTpl) {\n <ng-container\n *ngTemplateOutlet=\"_selTpl; context: { $implicit: _selectedItems, item: _selectedItems, items: _selectedItems, display: _display, multiple: true }\">\n </ng-container>\n } @else {\n <div class=\"sd-trigger-text\">\n {{ _display }}\n </div>\n }\n </mat-select-trigger>\n\n @if (filtered()) {\n <div class=\"c-filter-input-container\">\n <div class=\"filter-input-wrapper\">\n <mat-icon>search</mat-icon>\n <input\n [formControl]=\"inputControl\"\n [attr.aria-label]=\"placeholder() || _label\"\n matInput\n autocomplete=\"off\"\n class=\"c-search-input\"\n (keydown)=\"focusReadRetry($event); $event.stopPropagation()\" />\n </div>\n </div>\n }\n\n <!-- why: row \"Tất cả\" KHÔNG phải mat-option thật — nếu là option, giá trị của nó lọt vào\n formControl.value và keyboard navigation của mat-select. Nhưng nó phải TRÔNG y hệt một\n option: dùng chính <mat-pseudo-checkbox> + .mdc-list-item__primary-text mà mat-option\n render, nên ăn cùng scale/margin (rule .sd-multiple) và cùng màu theme (panel mang\n class mat-primary) — mat-checkbox MDC thật thì lệch cột và ăn accent (xanh lá).\n Vì pseudo-checkbox là decorative + aria-hidden, chính div mang role/aria/keyboard. -->\n @if (selectAllVisible()) {\n @let _selectAllState = selectAllState();\n <div\n class=\"sd-select-all-row\"\n role=\"checkbox\"\n tabindex=\"0\"\n [attr.aria-checked]=\"_selectAllState === 'indeterminate' ? 'mixed' : _selectAllState === 'checked'\"\n [attr.data-autoid]=\"_autoId ? _autoId + '-select-all' : null\"\n (click)=\"toggleSelectAll()\"\n (keydown.enter)=\"toggleSelectAll(); $event.preventDefault()\"\n (keydown.space)=\"toggleSelectAll(); $event.preventDefault()\"\n (keydown)=\"$event.stopPropagation()\">\n <mat-pseudo-checkbox class=\"mat-mdc-option-pseudo-checkbox\" [state]=\"_selectAllState\" aria-hidden=\"true\"></mat-pseudo-checkbox>\n <span class=\"mdc-list-item__primary-text\">{{ selectAllLabel() }}</span>\n </div>\n }\n\n @if (!_loading && _readState.status === 'error') {\n <!-- why: MatSelect query cần option khai báo trực tiếp, không nằm trong template outlet ngoài control. -->\n <mat-option disabled class=\"sd-read-state-anchor\" aria-hidden=\"true\"></mat-option>\n }\n @let _filteredItems = filteredItems();\n @if (_filteredItems) {\n @if (!_filteredItems.length && !_loading && _readState.status !== 'error') {\n <mat-option class=\"sd-empty\" disabled>\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" style=\"width: 95px\" />\n </mat-option>\n } @else {\n @let iDefTpl = itemDef()?.templateRef;\n @if (_valueField && _displayField) {\n @for (item of _filteredItems; track itemValue(item)) {\n <mat-option [value]=\"itemValue(item)\" [disabled]=\"itemDisabled(item)\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ itemDisplay(item) }}\n }\n </div>\n </mat-option>\n }\n } @else if (!_valueField && !_displayField) {\n @for (item of _filteredItems; track item) {\n <mat-option [value]=\"item\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ item }}\n }\n </div>\n </mat-option>\n }\n }\n }\n }\n\n <ng-container [ngTemplateOutlet]=\"readRegion\"></ng-container>\n\n @if (_loading) {\n <mat-option disabled class=\"sd-loading-option\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n </mat-option>\n }\n\n @let _visibleFooterActions = visibleFooterActions();\n @if (_visibleFooterActions.length) {\n <div class=\"sd-select-footer-actions\">\n @for (action of _visibleFooterActions; track action) {\n <ng-container *ngTemplateOutlet=\"action.templateRef; context: footerActionContext()\"> </ng-container>\n }\n </div>\n }\n </mat-select>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (_normalizedValue?.length && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix>keyboard_arrow_down</mat-icon>\n }\n </mat-form-field>\n } @else {\n <mat-form-field\n [class.sd-md]=\"_size === 'md'\"\n [class.sd-sm]=\"_size === 'sm'\"\n [class.hide-inline-error]=\"_hideInlineError\"\n [appearance]=\"_appearance!\"\n [floatLabel]=\"_floatLabel\">\n @if (_appearance && _label) {\n <mat-label style=\"display: inline-block\">\n <div style=\"display: flex; align-items: center; gap: 4px\">\n <span>{{ _label }}</span>\n @if (_helperText) {\n <mat-icon [matTooltip]=\"_helperText\" matTooltipPosition=\"below\">info_outline</mat-icon>\n }\n </div>\n </mat-label>\n }\n\n <mat-select\n #select\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder() || _label || ''\"\n (selectionChange)=\"onSelectionChange($event)\"\n disableOptionCentering=\"true\"\n [panelWidth]=\"calculatedPanelWidth()\"\n [panelClass]=\"'sd-select-panel'\"\n [class.sd-selected]=\"!_required && _normalizedValue !== undefined && _normalizedValue !== null\"\n [required]=\"_required\"\n (openedChange)=\"onOpenedChange($event)\"\n [attr.data-autoId]=\"_autoId\"\n [attr.data-disabled]=\"dataDisabled()\"\n [attr.data-invalid]=\"dataInvalid()\"\n [attr.data-empty]=\"dataEmpty()\"\n [attr.data-value]=\"dataValue()\"\n [attr.data-loading]=\"dataLoading()\"\n [attr.data-required]=\"dataRequired()\"\n [attr.data-error-message]=\"dataErrorMessage()\"\n matTooltipClass=\"sd-multiline-tooltip\"\n [matTooltipDisabled]=\"!formControl.disabled || !_normalizedValue?.length\"\n [matTooltip]=\"_tooltip || ''\">\n <mat-select-trigger>\n @if (sdSelectedTemplate(); as _selTpl) {\n <ng-container\n *ngTemplateOutlet=\"_selTpl; context: { $implicit: _selectedItems[0], item: _selectedItems[0], items: _selectedItems, display: _display, multiple: false }\">\n </ng-container>\n } @else {\n {{ _display }}\n }\n </mat-select-trigger>\n\n @if (filtered()) {\n <div class=\"c-filter-input-container\">\n <div class=\"filter-input-wrapper\">\n <mat-icon>search</mat-icon>\n <input\n [formControl]=\"inputControl\"\n [attr.aria-label]=\"placeholder() || _label\"\n matInput\n autocomplete=\"off\"\n class=\"c-search-input\"\n (keydown)=\"focusReadRetry($event); $event.stopPropagation()\" />\n </div>\n </div>\n }\n\n @if (!_loading && _readState.status === 'error') {\n <mat-option disabled class=\"sd-read-state-anchor\" aria-hidden=\"true\"></mat-option>\n }\n @let _filteredItems = filteredItems();\n @if (_filteredItems) {\n @if (!_filteredItems.length && !_loading && _readState.status !== 'error') {\n <mat-option class=\"sd-empty\" disabled>\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" style=\"width: 95px\" />\n </mat-option>\n } @else {\n @let iDefTpl = itemDef()?.templateRef;\n\n @if (_valueField && _displayField) {\n @for (item of _filteredItems; track itemValue(item)) {\n <mat-option [value]=\"itemValue(item)\" [disabled]=\"itemDisabled(item)\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ itemDisplay(item) }}\n }\n </div>\n </mat-option>\n }\n } @else if (!_valueField && !_displayField) {\n @for (item of _filteredItems; track item) {\n <mat-option [value]=\"item\">\n <div>\n @if (iDefTpl) {\n <ng-container *ngTemplateOutlet=\"iDefTpl ?? null; context: { item: item }\"> </ng-container>\n } @else {\n {{ item }}\n }\n </div>\n </mat-option>\n }\n }\n }\n }\n\n <ng-container [ngTemplateOutlet]=\"readRegion\"></ng-container>\n\n @if (_loading) {\n <mat-option disabled class=\"sd-loading-option\">\n <mat-spinner diameter=\"24\"></mat-spinner>\n </mat-option>\n }\n\n @let _visibleFooterActions = visibleFooterActions();\n @if (_visibleFooterActions.length) {\n <div class=\"sd-select-footer-actions\">\n @for (action of _visibleFooterActions; track action) {\n <ng-container *ngTemplateOutlet=\"action.templateRef; context: footerActionContext()\"> </ng-container>\n }\n </div>\n }\n </mat-select>\n\n @if (_hideInlineError && _errorMessage && formControl.touched) {\n <mat-icon matSuffix class=\"sd-error-icon\" [matTooltip]=\"_errorMessage\" matTooltipPosition=\"above\"> error </mat-icon>\n }\n\n @if (!_hideInlineError && _errorMessage && formControl.touched) {\n <mat-error>{{ _errorMessage }}</mat-error>\n }\n\n @if (_normalizedValue !== undefined && _normalizedValue !== null && !_required && !formControl.disabled && !_bare) {\n <button type=\"button\" class=\"sd-clear-btn\" matSuffix (click)=\"clear($event)\" title=\"Xóa\" aria-label=\"Xóa\">\n <mat-icon>close</mat-icon>\n </button>\n } @else {\n <mat-icon class=\"cursor-pointer sd-suffix-icon\" matSuffix>keyboard_arrow_down</mat-icon>\n }\n </mat-form-field>\n }\n </div>\n}\n\n<ng-template #readRegion>\n <!-- why: VALUE/SEARCH giữ lỗi độc lập; trong lúc kênh khác đang đọc chỉ hiển thị loading. -->\n @if (!_loading && _readState.status === 'error') {\n <!-- why: nút retry nằm ngoài mat-option để không trở thành một lựa chọn/form value. -->\n @if (!_hideReadError) {\n <div class=\"sd-read-state-region\" role=\"presentation\" (mousedown)=\"$event.preventDefault()\" (click)=\"$event.stopPropagation()\" (keydown)=\"onReadRegionKeydown($event)\">\n <sd-data-state state=\"error\" compact retryable (sdRetry)=\"retryRead()\">\n @if (dataStateTemplate(); as custom) {\n <ng-template sdDataStateTemplate let-current let-retry=\"retry\" let-action=\"action\">\n <ng-container [ngTemplateOutlet]=\"custom.template\"\n [ngTemplateOutletContext]=\"{ $implicit: current, state: current, retry: retry, action: action }\"></ng-container>\n </ng-template>\n }\n </sd-data-state>\n </div>\n }\n }\n</ng-template>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ import { NumberUtilities, DateUtilities } from '@sd-angular/core/utilities/exten
|
|
|
5
5
|
import * as i1 from '@angular/platform-browser';
|
|
6
6
|
import { ɵsdInjectDateTime as _sdInjectDateTime, ɵSD_LOCAL_DATE_TIME as _SD_LOCAL_DATE_TIME } from '@sd-angular/core/services/date-time';
|
|
7
7
|
import { of, interval } from 'rxjs';
|
|
8
|
-
import { map } from 'rxjs/operators';
|
|
8
|
+
import { map, takeWhile } from 'rxjs/operators';
|
|
9
9
|
import { EMPTY_STR } from '@sdcorejs/utils/constants';
|
|
10
10
|
|
|
11
11
|
class SdFormatNumberPipe {
|
|
@@ -83,28 +83,18 @@ class SdTimeDifferentPipe {
|
|
|
83
83
|
if (!different) {
|
|
84
84
|
return of(this.#format(value, format));
|
|
85
85
|
}
|
|
86
|
-
|
|
86
|
+
const elapsedSeconds = () => Math.round((Date.now() - this.#instant(value)) / 1000);
|
|
87
|
+
if (elapsedSeconds() < 0) {
|
|
87
88
|
return of(this.#format(value, format));
|
|
88
89
|
}
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
if (different === 'hour' && timeDifferent < this.maxHour) {
|
|
98
|
-
return this.#relative(value);
|
|
99
|
-
}
|
|
100
|
-
if (different === 'minute' && timeDifferent < this.maxMinute) {
|
|
101
|
-
return this.#relative(value);
|
|
102
|
-
}
|
|
103
|
-
if (different === 'second' && timeDifferent < this.maxSecond) {
|
|
104
|
-
return this.#relative(value);
|
|
105
|
-
}
|
|
106
|
-
return this.#format(value, format);
|
|
107
|
-
}));
|
|
90
|
+
const thresholds = { second: this.maxSecond, minute: this.maxMinute, hour: this.maxHour, day: this.maxDay, month: this.maxMonth };
|
|
91
|
+
const threshold = thresholds[different];
|
|
92
|
+
// why: ngày đã quá ngưỡng chỉ hiển thị chuỗi cố định, không cần một timer cho mỗi ô.
|
|
93
|
+
if (elapsedSeconds() >= threshold)
|
|
94
|
+
return of(this.#format(value, format));
|
|
95
|
+
return interval(1000).pipe(map(elapsedSeconds),
|
|
96
|
+
// why: phát giá trị ngày tuyệt đối lần cuối rồi dừng timer khi vượt ngưỡng tương đối.
|
|
97
|
+
takeWhile(elapsed => elapsed < threshold, true), map(elapsed => (elapsed < threshold ? this.#relative(value) : this.#format(value, format))));
|
|
108
98
|
}
|
|
109
99
|
#format(value, format) {
|
|
110
100
|
return (this.#dateTime ?? _SD_LOCAL_DATE_TIME).toFormat(value, format);
|