@sdcorejs/angular 19.2.0 → 19.2.2
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/components/api-contract-builder/index.d.ts +8 -0
- package/components/api-contract-builder/src/api-contract-builder.component.d.ts +123 -0
- package/components/api-contract-builder/src/api-contract.configuration.d.ts +41 -0
- package/components/api-contract-builder/src/api-contract.expression.d.ts +43 -0
- package/components/api-contract-builder/src/api-contract.model.d.ts +167 -0
- package/components/api-contract-builder/src/api-contract.samples.d.ts +25 -0
- package/components/api-contract-builder/src/api-contract.schema.d.ts +126 -0
- package/components/api-contract-builder/src/api-contract.serializer.d.ts +17 -0
- package/components/api-contract-builder/src/api-contract.validation.d.ts +12 -0
- package/components/api-contract-builder/src/components/api-contract-diagnostic-list.component.d.ts +18 -0
- package/components/api-contract-builder/src/components/api-contract-node-drawer.component.d.ts +130 -0
- package/components/api-contract-builder/src/components/api-contract-node-editor.component.d.ts +35 -0
- package/components/api-contract-builder/src/components/api-contract-node-summary.component.d.ts +41 -0
- package/components/api-contract-builder/src/components/api-contract-record-editor.component.d.ts +36 -0
- package/components/api-contract-builder/src/components/api-contract-source-editor.component.d.ts +86 -0
- package/components/api-contract-builder/src/components/api-contract-suggestion.model.d.ts +17 -0
- package/components/badge/src/badge.component.d.ts +1 -0
- package/components/index.d.ts +1 -0
- package/components/section/src/section.component.d.ts +2 -0
- package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs +3411 -0
- package/fesm2022/sdcorejs-angular-components-api-contract-builder.mjs.map +1 -0
- package/fesm2022/sdcorejs-angular-components-badge.mjs +14 -2
- package/fesm2022/sdcorejs-angular-components-badge.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-operator.mjs +2 -2
- package/fesm2022/sdcorejs-angular-components-operator.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-section.mjs +22 -5
- package/fesm2022/sdcorejs-angular-components-section.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components-table.mjs +14 -13
- package/fesm2022/sdcorejs-angular-components-table.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-components.mjs +1 -0
- package/fesm2022/sdcorejs-angular-components.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-i18n.mjs +405 -0
- package/fesm2022/sdcorejs-angular-i18n.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-icon.mjs.map +1 -1
- package/fesm2022/sdcorejs-angular-modules-layout.mjs +146 -83
- package/fesm2022/sdcorejs-angular-modules-layout.mjs.map +1 -1
- package/i18n/src/en.d.ts +80 -0
- package/modules/layout/components/sidebar-v1/components/sidebar/sidebar.component.d.ts +9 -0
- package/modules/layout/pipes/menu-focus.pipe.d.ts +6 -2
- package/modules/layout/utils/index.d.ts +1 -0
- package/modules/layout/utils/menu-path.util.d.ts +16 -0
- package/package.json +17 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdcorejs-angular-components-table.mjs","sources":["../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-cell-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-command-header-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-expand-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-filter-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-footer-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-group-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-title-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-filter/table-filter.model.ts","../../../projects/sdcorejs-angular/components/table/src/components/column-title/column-title.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/column-title/column-title.component.html","../../../projects/sdcorejs-angular/components/table/src/components/filter/column-filter/column-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/column-filter/column-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/pipes/filter-values.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/tree/tree.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/sd-tree.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/external-filter/external-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/external-filter/external-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/components/filter/mobile-filter/mobile-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/mobile-filter/mobile-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/action-filter.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/selector-action.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/selector-action.component.html","../../../projects/sdcorejs-angular/components/table/src/configurations/table.configuration.ts","../../../projects/sdcorejs-angular/components/table/src/services/config.service.ts","../../../projects/sdcorejs-angular/components/table/src/components/config/config.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/config/config.component.html","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/view/view.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/view/view.component.html","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/desktop-cell.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/desktop-cell.component.html","../../../projects/sdcorejs-angular/components/table/src/components/command/pipes/command.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/pipes/filter.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/desktop-command.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/desktop-command.component.html","../../../projects/sdcorejs-angular/components/table/src/components/popup-export/popup-export.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/popup-export/popup-export.component.html","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-column-filter-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sticky-shadow.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-column-resize.directive.ts","../../../projects/sdcorejs-angular/components/table/src/models/table-item.model.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-selection/table-selection.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/sd-group.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-disabled.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-selection/selection-action.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-visible.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-export/table-export.service.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-format/table-format.service.ts","../../../projects/sdcorejs-angular/components/table/src/services/column-width.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-local/table-local.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-reorder/table-reorder.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-filter/table-filter.service.ts","../../../projects/sdcorejs-angular/components/table/src/table.component.ts","../../../projects/sdcorejs-angular/components/table/src/table.component.html","../../../projects/sdcorejs-angular/components/table/sdcorejs-angular-components-table.ts"],"sourcesContent":["import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n item: T;\n column: SdTableColumn<T>;\n autoId: string;\n}\n\n@Directive({\n selector: '[sdTableCellDef]',\n})\nexport class SdTableCellDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableCellDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableCellDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Nội dung cho ô HEADER của cột command.\n *\n * Ô đó vốn để trống — chỉ giữ chỗ cho các nút thao tác bên dưới — nên đây là chỗ tự nhiên để đặt\n * một hành động cấp bảng (thường là \"thêm dòng\") mà không tốn thêm một dải riêng dưới bảng.\n *\n * Không có input: cột command chỉ có một, khác `sdTableCellDef` / `sdTableTitleDef` vốn phải chỉ\n * đích danh field.\n *\n * ```html\n * <sd-table [option]=\"option\">\n * <ng-template sdTableCommandHeaderDef>\n * <sd-button prefixIcon=\"add\" type=\"text\" (click)=\"addRow()\"></sd-button>\n * </ng-template>\n * </sd-table>\n * ```\n */\n@Directive({\n selector: '[sdTableCommandHeaderDef]',\n})\nexport class SdTableCommandHeaderDefDirective {\n templateRef: TemplateRef<unknown> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { SdTableItem } from '../models/table-item.model';\n\ninterface Context<T = any> {\n item: SdTableItem<T>;\n}\n\n@Directive({\n selector: '[sdTableExpandDef]',\n})\nexport class SdTableExpandDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableExpandDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, booleanAttribute, inject, input } from '@angular/core';\n\ninterface Context {\n externalFilter?: Record<string, unknown>;\n}\n\n@Directive({\n selector: '[sdTableFilterDef]',\n})\nexport class SdTableFilterDefDirective {\n static ngTemplateContextGuard(_dir: SdTableFilterDefDirective, _ctx: unknown): _ctx is Context {\n return true;\n }\n\n sdTableFilterDef = input.required<string>();\n defaultShowing = input(false, { transform: booleanAttribute });\n templateRef: TemplateRef<Context> | null = inject(TemplateRef, { optional: true });\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\nimport { SdTableItem } from '../models/table-item.model';\n\ninterface Context<T = any> {\n items: SdTableItem<T>[];\n column: SdTableColumn<T>;\n}\n\n@Directive({\n selector: '[sdTableFooterDef]',\n})\nexport class SdMaterialFooterDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdMaterialFooterDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableFooterDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { SdTableItem } from '../models/table-item.model';\n\nexport interface SdTableGroupDefContext<T = any> {\n /** Children items thuộc group hiện tại (kèm wrapper SdTableItem). */\n items: SdTableItem<T>[];\n /** Children raw data (đã unwrap khỏi SdTableItem) — tiện dùng trong template. */\n data: T[];\n /** Hash key của group (Utilities.hash(values)). */\n key: string;\n /** Resolved giá trị các field group — vd `{ customerId: 1, customerName: 'A' }`. */\n values: Record<string, any>;\n /** true nếu group đang expand, false nếu collapse (chỉ ý nghĩa khi option.group.collapsible). */\n isExpanded: boolean;\n /** true nếu mọi children selectable đều selected. */\n isSelected: boolean;\n /** true nếu một phần children selected (partial). */\n indeterminate: boolean;\n /** Toggle expand/collapse (chỉ chạy nếu collapsible). */\n toggleExpand: () => void;\n /** Toggle select-all cho cả group (chỉ chạy nếu selector visible). */\n toggleSelect: () => void;\n}\n\n/**\n * Directive cung cấp custom template render group header row trong sd-table.\n * Thay thế cho htmlTemplate callback cũ — cho phép Angular template binding,\n * pipes, components con (sd-badge, sd-button, …) bên trong.\n *\n * Ví dụ:\n * ```html\n * <sd-table [option]=\"opt\">\n * <ng-template sdTableGroupDef let-values=\"values\" let-items=\"items\" let-indeterminate=\"indeterminate\">\n * <b>Khách hàng: {{ values.customerName }}</b>\n * <span>{{ items.length }} đơn hàng</span>\n * </ng-template>\n * </sd-table>\n * ```\n */\n@Directive({ selector: '[sdTableGroupDef]' })\nexport class SdTableGroupDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableGroupDefDirective<T>, _ctx: unknown): _ctx is SdTableGroupDefContext<T> {\n return true;\n }\n templateRef: TemplateRef<SdTableGroupDefContext<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n column: SdTableColumn<T>;\n}\n\n@Directive({\n selector: '[sdTableTitleDef]',\n})\nexport class SdTableTitleDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableTitleDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableTitleDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { TemplateRef } from '@angular/core';\nimport type { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { Filter, NestedKeyOf, Operator, Order, PagingReq } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\nimport { SdTableColumn, SdTableColumnAnyRow } from '../../models/table-column.model';\n\nexport interface SdTableQuickFilter {\n code: string;\n columnFilter: Record<string, any>;\n externalFilter: Record<string, any>;\n}\n\nexport interface TableFilterConfiguration {\n // selectedQuickFilter: string;\n // quickFilters: SdGridMaterialQuickFilter[];\n // columnFilter?: Record<string, any>; // Giá trị filter column\n inlineExternal: Record<string, boolean>; // Ẩn hiện filter external\n // externalFilter?: Record<string, any>; // Giá trị filter external\n}\n\nexport interface TableFilterValue {\n columnOperator?: Record<string, Operator>;\n\n columnFilter?: Record<string, any>; // Giá trị filter column\n\n externalFilter?: Record<string, any>; // Giá trị filter external\n\n notReload?: boolean; // Để nhận biết là chỉ set giá trị, không trigger change\n\n filtered?: boolean; // Để nhận biết là có đang lọc hay không\n}\n\nexport interface SdTableFilterRequest<T = unknown> {\n columnOperator: Record<NestedKeyOf<T>, Operator>;\n rawColumnFilter: Record<NestedKeyOf<T>, any>;\n rawExternalFilter: Record<string, any>;\n pageNumber: number;\n pageSize: number;\n orderBy?: string;\n orderDirection?: Order['direction'];\n isExported?: boolean;\n visibledColumns?: SdTableColumn[];\n}\n\nexport interface SdTableOptionFilter<T = unknown> {\n /** Key định danh nếu muốn lưu cache */\n key?: string;\n\n /** Có bật cache giá trị filter hay không */\n cacheable?: boolean;\n\n /** Vô hiệu toàn bộ filter */\n disabled?: boolean;\n\n /** Ẩn tất cả inline filter (chỉ còn external), nếu chọn auto thì sẽ ẩn khi total row <= 10, phù hợp cho các màn detail có ít dữ liệu */\n hideInlineFilter?: boolean | 'auto';\n\n /** Hàm xử lý khi đổi Operator của filter column */\n operatorChange?: (column?: SdTableColumn, operator?: Operator) => void;\n\n /** Danh sách external filter */\n externalFilters?: SdTableExternalFilter[];\n\n /** Số lượng cột external filter trên mỗi hàng (mặc định: 6) */\n externalFilterPerRow?: 4 | 6;\n\n /** Chế độ thủ công: phải nhấn nút áp dụng mới gửi filter */\n manualFilter?: boolean;\n\n /** Có thể thu gọn bộ lọc hay không */\n collapsible?: boolean;\n\n /** Ẩn toolbar (xóa bộ lọc, thiết lập) của external filter, khi có ít external filter user không cần chức năng này */\n hideExternalFilterToolbar?: boolean;\n\n /** Hàm xử lý khi trigger clear filter từ external filter */\n onClearFilter?: () => void;\n}\n\n// why: `columns` nhận `SdTableColumnAnyRow[]` (= `SdTableColumn<never>[]`). Hàm chỉ đọc\n// `field` / `type` / `filter.operator.default` — không bao giờ chạm dữ liệu hàng — nên không cần generic\n// theo `T`; `never` ở vị trí contravariant khiến mọi `SdTableColumn<T>` vẫn truyền vào được sau khi\n// default generic siết từ `any` sang `unknown`.\nexport const SdConvertToPagingReq = (\n filterRequest: SdTableFilterRequest,\n args: {\n columns?: SdTableColumnAnyRow[];\n externalFilters?: SdTableExternalFilter[];\n fieldMapping?: Record<string, string>;\n orders?: Order[];\n }\n): PagingReq => {\n const { externalFilters, columns, fieldMapping } = args;\n const req: PagingReq = {\n filters: [],\n orders: args?.orders || [],\n pageNumber: filterRequest.pageNumber,\n pageSize: filterRequest.pageSize,\n };\n const { filters } = req;\n const { rawExternalFilter, rawColumnFilter, columnOperator, orderBy, orderDirection } = filterRequest;\n // Xử lý external filter\n for (const externalFilter of externalFilters || []) {\n const value = rawExternalFilter?.[externalFilter.field];\n const field = fieldMapping?.[externalFilter.field] || externalFilter.field;\n // Nếu có giá trị thì mới xử lý filter\n if (value !== undefined && value !== null && value !== '') {\n if (externalFilter.type === 'string') {\n if (externalFilter.defaultOperator === 'EQUAL' && typeof value === 'string' && value.includes(',')) {\n filters!.push({\n field,\n operator: 'IN',\n data: value.split(',').map(val => val.trim()),\n });\n } else {\n filters!.push({\n field,\n operator: externalFilter.defaultOperator || 'CONTAIN',\n data: value,\n } as Filter);\n }\n } else if (externalFilter.type === 'boolean') {\n filters!.push({\n field,\n operator: 'EQUAL',\n data: value === true || value === 1 || value === 'true' || value === '1',\n });\n } else if (externalFilter.type === 'daterange') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n }\n } else if (externalFilter.type === 'date' || externalFilter.type === 'datetime') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else if (DateUtilities.isDate(value)) {\n if (externalFilter.type === 'date') {\n if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value)!.toISOString(),\n });\n }\n if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value, 1))!.toISOString(),\n });\n }\n } else {\n if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: new Date(value).toISOString(),\n });\n }\n if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'LESS_OR_EQUAL',\n data: new Date(value).toISOString(),\n });\n }\n }\n }\n } else {\n if (Array.isArray(value)) {\n if (value.length) {\n filters!.push({\n field,\n operator: 'IN',\n data: value,\n });\n }\n } else if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else {\n filters!.push({\n field,\n operator: externalFilter.defaultOperator || 'EQUAL',\n data: value,\n } as Filter);\n }\n }\n }\n }\n // Xử lý column filter\n for (const column of columns || []) {\n const value = rawColumnFilter?.[column.field];\n const field = fieldMapping?.[column.field] || column.field;\n const operator = columnOperator?.[column.field] || column.filter?.operator?.default;\n // Nếu có giá trị thì mới xử lý filter\n if (value !== undefined && value !== null && value !== '') {\n if (column.type === 'string') {\n filters!.push({\n field,\n operator: operator || 'CONTAIN',\n data: value,\n } as Filter);\n } else if (column.type === 'boolean') {\n filters!.push({\n field,\n operator: 'EQUAL',\n data: value === true || value === 1 || value === 'true' || value === '1',\n });\n } else if (column.type === 'date' || column.type === 'datetime') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from && value?.to) {\n filters!.push({\n field,\n operator: 'BETWEEN',\n data: {\n from: DateUtilities.begin(value?.from)!.toISOString(),\n to: DateUtilities.end(value?.to)!.toISOString(),\n },\n });\n } else if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n } else if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else {\n if (DateUtilities.isDate(value)) {\n filters!.push({\n field,\n operator: 'BETWEEN',\n data: {\n from: DateUtilities.begin(value)!.toISOString(),\n to: DateUtilities.end(value)!.toISOString(),\n },\n });\n }\n }\n } else {\n if (Array.isArray(value)) {\n if (value.length) {\n filters!.push({\n field,\n operator: 'IN',\n data: value,\n });\n }\n } else {\n filters!.push({\n field,\n operator: operator || 'EQUAL',\n data: value,\n } as Filter);\n }\n }\n }\n }\n // Xử lý orders\n if (orderBy && orderDirection) {\n req.orders!.push({\n field: orderBy,\n direction: orderDirection,\n });\n }\n return req;\n};\n\nexport declare type SdTableExternalFilter<TData = unknown> =\n | TextFilter<TData>\n | DateFilter<TData>\n | DateTimeFilter<TData>\n | DateRangeFilter<TData>\n | NumberFilter<TData>\n | ValuesFilter<TData>\n | LazyValuesFilter<TData>\n | BooleanFilter<TData>\n | CustomFilter<TData>;\n\ninterface BaseFilter<TData = unknown> {\n field: string;\n title: string;\n defaultShowing?: boolean;\n required?: boolean; // Bật lên nếu bắt buộc phải có giá trị- mới thực hiện gọi API filter\n hidden?: boolean; // Ẩn filter\n defaultOperator?: Operator; // Đôi lúc cột string nhưng lại muốn tìm kiếm chính xác\n data?: TData; // Các tham số muốn truyền thêm để đánh dấu/nhận biết ..., ví dụ mappingField\n onChange?: (value: any) => void;\n}\n\ninterface TextFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'string';\n default?: string;\n}\n\ninterface DateFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'date';\n default?: Date | string;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n}\n\ninterface DateTimeFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'datetime';\n default?: Date | string;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n}\n\ninterface DateRangeFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'daterange';\n enableTime?: boolean;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n default?: {\n from?: Date | string;\n to?: Date | string;\n };\n}\n\ninterface NumberFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'number';\n default?: number;\n}\n\ninterface ValuesFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'values';\n option: {\n valueField: string;\n displayField: string;\n items: any[] | (() => Promise<any[]>);\n selection?: 'AUTOCOMPLETE' | 'MULTIPLE' | 'MULTIPLEAUTOCOMPLETE';\n };\n default?: string | string[];\n}\n\ninterface LazyValuesFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'lazy-values';\n option: {\n valueField: string;\n displayField: string;\n items: SdSearch; // Filter\n selection?: 'MULTIPLE';\n };\n default?: string | string[];\n}\n\ninterface BooleanFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'boolean';\n option?: {\n displayOnTrue?: string;\n displayOnFalse?: string;\n };\n default?: boolean;\n}\n\ninterface CustomFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'custom';\n // filterDef?: TemplateRef<SdTableFilterDefDirective>;\n filterDef?: TemplateRef<any>;\n default?: any;\n}\n\nexport interface TableFilterRegister {\n configuration: {\n get: () => TableFilterConfiguration;\n set: (configuration: Partial<TableFilterConfiguration>) => TableFilterConfiguration;\n remove: () => void;\n observer: Observable<TableFilterConfiguration>;\n };\n value: {\n get: () => TableFilterValue;\n set: (value: Partial<TableFilterValue>) => TableFilterValue;\n remove: () => void;\n observer: Observable<TableFilterValue>;\n };\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SdTableTitleDefDirective } from '../../directives/sd-table-title-def.directive';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'column-title',\n templateUrl: './column-title.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet],\n})\nexport class ColumnTitleComponent {\n column = input.required<SdTableColumn>();\n titleDef = input<SdTableTitleDefDirective | undefined>(undefined);\n\n templateRef = computed(() => {\n const title = this.column()?.title;\n if (typeof title === 'object') {\n return title?.templateRef || this.titleDef()?.templateRef;\n }\n return this.titleDef()?.templateRef;\n });\n}\n","@let _column = column();\n@let _templateRef = templateRef();\n\n@if (_templateRef) {\n <ng-container *ngTemplateOutlet=\"_templateRef\"></ng-container>\n} @else {\n {{ _column.title }}\n}\n","import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n isSignal,\n model,\n output,\n Signal,\n} from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport type { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { OPERATORS } from '@sdcorejs/utils/constants';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableColumn } from '../../../models/table-column.model';\n\n@Component({\n selector: 'column-filter',\n templateUrl: './column-filter.component.html',\n styleUrl: './column-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdOperator, SdInput, SdInputNumber, SdSelect, SdDate, SdDateRange, SdBadge],\n})\nexport class ColumnFilterComponent {\n #lastOnChangeValueHash?: string;\n\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n column = input.required<SdTableColumn>();\n columnFilter = input<Record<string, any>>({});\n cacheValues = input<Record<string, any[]> | undefined>(undefined);\n // Parent vẫn truyền `value` vào — giữ input để không phá hợp đồng (template không dùng trực tiếp).\n value = input<any>();\n // 2-way bind từ parent: parent đọc/ghi operator hiện tại của column.\n operator = model<Operator | undefined>(undefined);\n // Khi true (mobile context): gán column.title vào [label] của các control con\n // để parent không phải render <label> riêng. Default false (desktop inline).\n isMobile = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // 2. SIGNAL OUTPUTS\n // ==========================================\n filterChange = output<void>();\n filterCommit = output<void>();\n\n // ==========================================\n // 3. COMPUTED\n // ==========================================\n // autoId final = `${base}-inline-${column.field}`\n autoId = computed(() => {\n const base = this.autoIdInput();\n const field = this.column()?.field ?? '';\n return base ? `${base}-inline-${field}` : '';\n });\n\n // Cho phép parent custom filter qua templateRef (column.filter.filterDef).\n templateRef = computed(() => this.column()?.filter?.filterDef);\n\n // Label cho control con khi isMobile=true. column.title có thể là string hoặc { title, templateRef }.\n // Trả undefined khi không phải mobile → control không hiển thị label (giữ behavior desktop cũ).\n label = computed<string | undefined>(() => {\n if (!this.isMobile()) return undefined;\n const col = this.column();\n const title = col?.title;\n if (!title) return col?.field;\n return typeof title === 'string' ? title : title.title || col?.field;\n });\n\n // Danh sách operator hiển thị dựa trên column config\n operators = computed(() => {\n const col = this.column();\n if (!col?.filter?.disabled && col?.filter?.operator?.enable) {\n return OPERATORS.filter(e => col.filter?.operator?.list?.includes?.(e.value));\n }\n return [];\n });\n\n // Chỉ các Operator value cho phép — truyền vào <sd-operator [operators]>.\n operatorValues = computed(() => this.operators().map(o => o.value));\n\n // Items cho sd-select khi column type = values / lazy-values\n items = computed<any[] | Signal<any[]> | SdSearch>(() => {\n const col = this.column();\n const cache = this.cacheValues();\n if (col?.type === 'values') {\n const optItems = col.option?.items;\n if (Array.isArray(optItems)) return optItems;\n if (isSignal(optItems)) return optItems as Signal<any[]>;\n return cache?.[col.field] || [];\n }\n if (col?.type === 'lazy-values') {\n return col.option.items;\n }\n return [];\n });\n\n constructor() {\n // Khởi tạo default { from: null, to: null } cho split-date / split-number / daterange.\n // Chạy trước lần render đầu nên template thấy giá trị đã init — không cần markForCheck.\n effect(() => {\n const col = this.column();\n const filter = this.columnFilter();\n if (!col || !filter) return;\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n if (col.filter?.type !== 'date') {\n filter[col.field] = filter[col.field] || { from: null, to: null };\n }\n }\n if (col.type === 'number' && col.filter?.type === 'split-number') {\n filter[col.field] = filter[col.field] || { from: null, to: null };\n }\n this.#lastOnChangeValueHash = this.#filterValueHash(filter[col.field]);\n });\n }\n\n // ==========================================\n // 4. HANDLERS\n // ==========================================\n onFilterChange = () => {\n this.#emitFilterOnChange();\n this.filterChange.emit();\n };\n\n // Blur input: commit giá trị KHÔNG trigger reload.\n onFilterCommit = () => {\n this.#emitFilterOnChange();\n this.filterCommit.emit();\n };\n\n #emitFilterOnChange = () => {\n const col = this.column();\n const filter = this.columnFilter();\n if (!col?.filter?.onChange || !filter) return;\n\n const value = filter[col.field];\n const hash = this.#filterValueHash(value);\n if (hash === this.#lastOnChangeValueHash) return;\n\n this.#lastOnChangeValueHash = hash;\n col.filter.onChange(value, col, filter);\n };\n\n #filterValueHash = (value: any): string => Utilities.hash({ value });\n}\n","@let _column = column();\n@let _columnFilter = columnFilter();\n@let _autoId = autoId();\n@let _templateRef = templateRef();\n@let _operators = operators();\n@let _items = items();\n@let _label = label();\n@let _context = { columnFilter: _columnFilter, autoId: _autoId };\n\n<div class=\"d-flex c-inline-column align-items-center\" style=\"width: 100%; max-width: 100%\">\n @if (\n _column.type === 'string' ||\n _column.type === 'number' ||\n _column.type === 'boolean' ||\n _column.type === 'values' ||\n _column.type === 'lazy-values' ||\n _column.type === 'date' ||\n _column.type === 'datetime' ||\n _column.type === 'time'\n ) {\n <!-- Operator filter -->\n @if (_operators.length) {\n <sd-operator class=\"mr-4\" [(model)]=\"operator\" [operators]=\"operatorValues()\" />\n }\n\n <!-- Nếu filter nhận vào template -->\n @if (_templateRef) {\n <ng-container *ngTemplateOutlet=\"_templateRef; context: _context\"></ng-container>\n }\n <!-- Mặc định theo type và giá trị values defined của column -->\n @else {\n @if (_column.type === 'string') {\n <sd-input\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n type=\"text\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (keyupEnter)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-input>\n } @else if (_column.type === 'number') {\n @if (!_column.filter?.type) {\n <sd-input-number\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (keyupEnter)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n } @else if (_column.filter?.type === 'split-number') {\n <ng-container *ngTemplateOutlet=\"splitNumberTpl; context: { field: _column.field, disabled: _column.filter?.disabled }\">\n </ng-container>\n }\n } @else if (_column.type === 'boolean') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"[\n { value: '1', display: _column.option?.displayOnTrue || 'True' },\n { value: '0', display: _column.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n hideInlineError>\n <ng-template sdItemDef let-item=\"item\">\n @if (item.value === '1') {\n <sd-badge color=\"success\" [title]=\"_column.option?.displayOnTrue || 'True'\"> </sd-badge>\n } @else {\n <sd-badge color=\"error\" [title]=\"_column.option?.displayOnFalse || 'False'\"> </sd-badge>\n }\n </ng-template>\n </sd-select>\n } @else if (_column.type === 'values') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"_items\"\n [valueField]=\"_column.option.valueField\"\n [displayField]=\"_column.option.displayField\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n [multiple]=\"_column.option.selection === 'MULTIPLE'\"\n hideInlineError>\n </sd-select>\n } @else if (_column.type === 'lazy-values') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"_items\"\n [valueField]=\"_column.option.valueField\"\n [displayField]=\"_column.option.displayField\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n [multiple]=\"_column.option.selection === 'MULTIPLE'\"\n hideInlineError>\n </sd-select>\n } @else if (_column.type === 'date' || _column.type === 'datetime' || _column.type === 'time') {\n @if (!_column.filter?.type || _column.filter?.type === 'daterange') {\n <sd-date-range\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n hideInlineError>\n </sd-date-range>\n } @else if (_column.filter?.type === 'date') {\n <sd-date\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-date>\n } @else if (_column.filter?.type === 'split-date') {\n <ng-container *ngTemplateOutlet=\"splitDateTpl; context: { field: _column.field, disabled: _column.filter?.disabled }\">\n </ng-container>\n }\n }\n }\n } @else {\n <sd-input [autoId]=\"_autoId\" style=\"flex: 1 1 0%; min-width: 0\" type=\"text\" size=\"sm\" disabled></sd-input>\n }\n</div>\n\n<!-- ================================================ -->\n<!-- Split from/to templates (đưa xuống cuối file) -->\n<!-- ================================================ -->\n<ng-template #splitNumberTpl let-field=\"field\" let-disabled=\"disabled\">\n <div class=\"d-flex align-items-center\" style=\"flex: 1 1 0%; min-width: 0\">\n <sd-input-number\n [autoId]=\"_autoId + '-from'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[field].from\"\n (sdChange)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n <div class=\"mx-4\">-</div>\n <sd-input-number\n [autoId]=\"_autoId + '-to'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [(model)]=\"_columnFilter[field].to\"\n (sdChange)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n </div>\n</ng-template>\n\n<ng-template #splitDateTpl let-field=\"field\" let-disabled=\"disabled\">\n <div class=\"d-flex align-items-center\" style=\"flex: 1 1 0%; min-width: 0\">\n <sd-date\n [autoId]=\"_autoId + '-from'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[field].from\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-date>\n <div class=\"mx-4\">-</div>\n <sd-date\n [autoId]=\"_autoId + '-to'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [(model)]=\"_columnFilter[field].to\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-date>\n </div>\n</ng-template>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n// Đối với filter loại values, items có thể là 1 mảng, có thể là 1 hàm, do đó cần xử lý nếu là hàm có thể xử lý gọi API\n@Pipe({\n name: 'filterValues',\n})\nexport class FilterValuesPipe implements PipeTransform {\n constructor() {}\n async transform(items: any[] | (() => Promise<any[]>) | undefined | null): Promise<any[]> {\n if (Array.isArray(items)) {\n return items;\n }\n if (typeof items === 'function') {\n const results = await items();\n if (Array.isArray(results)) {\n return results;\n }\n }\n return [];\n }\n}\n","import { SdTableOptionTree, TableOptionTreeLazy } from '../../models/table-option-tree.model';\nimport { SdTableItem } from '../../models/table-item.model';\n\n/**\n * Type-guard: tree có nạp children lười (lazy) hay không.\n * Dùng để narrow discriminated union `SdTableOptionTree` một cách an toàn —\n * thay vì truy cập `option.onExpandChildren` trực tiếp trên union (chỉ tồn tại\n * ở nhánh lazy).\n */\nexport const isLazyTree = <T = unknown>(option?: SdTableOptionTree<T>): option is TableOptionTreeLazy<T> => option?.loadType === 'lazy';\n\n/**\n * Key chứa mảng children trên object row.\n * - `static`: lấy `childrenKey` đã cấu hình, mặc định `'children'`.\n * - `lazy`: không có `childrenKey` riêng → luôn dùng `'children'` làm nơi lưu\n * kết quả nạp lười.\n */\nexport const getChildrenKey = (option?: SdTableOptionTree): string =>\n (option?.loadType === 'static' ? option.childrenKey : undefined) ?? 'children';\n\nexport const getChildrenFromData = <T>(data: T, option?: SdTableOptionTree): T[] => {\n const key = getChildrenKey(option);\n const raw = (data as Record<string, unknown>)?.[key];\n return Array.isArray(raw) ? (raw as T[]) : [];\n};\n\n/**\n * Trạng thái bung mặc định cho một cấp.\n * Chỉ `static` mới có `defaultExpanded`; lazy luôn trả `false` (không thể bung\n * mặc định nhánh chưa nạp).\n */\nexport const resolveDefaultExpanded = (level: number, option?: SdTableOptionTree): boolean => {\n const def = option?.loadType === 'static' ? (option.defaultExpanded ?? false) : false;\n if (def === true) return true;\n if (def === false) return false;\n if (typeof def === 'number') return level < def;\n return false;\n};\n\n/**\n * Row có khả năng có children hay không (để hiện nút bung).\n * - Có children embedded → true.\n * - Lazy tree: dùng `hasChildren(row.data)` nếu được cấu hình; không thì luôn\n * true (chưa biết cho tới khi nạp).\n */\nexport const resolveHasChildren = <T>(row: SdTableItem<T>, option?: SdTableOptionTree<T>): boolean => {\n const embedded = getChildrenFromData(row.data, option);\n if (embedded.length > 0) return true;\n if (isLazyTree(option)) return option.hasChildren ? option.hasChildren(row.data) : true;\n return false;\n};\n\n/** Row cần nạp lười (lazy) khi bung: là lazy tree và chưa có children embedded. */\nexport const hasLazyChildren = <T>(row: SdTableItem<T>, option?: SdTableOptionTree): boolean => {\n if (!isLazyTree(option)) return false;\n return getChildrenFromData(row.data, option).length === 0;\n};\n\n/**\n * True nếu `data` HOẶC bất kỳ hậu duệ nào (theo `childrenKey`) thoả `predicate`.\n *\n * Dùng cho search ở cấp con (static tree, table `type: 'local'`): một nhánh\n * gốc được giữ lại trong kết quả lọc nếu subtree của nó có ít nhất một node\n * khớp từ khoá. `visited` chống đệ quy vô hạn khi data có circular reference.\n */\nexport const subtreeMatches = <T>(\n data: T,\n predicate: (data: T) => boolean,\n option?: SdTableOptionTree,\n visited: Set<unknown> = new Set()\n): boolean => {\n if (data == null || visited.has(data)) return false;\n visited.add(data);\n if (predicate(data)) return true;\n for (const child of getChildrenFromData(data, option)) {\n if (subtreeMatches(child, predicate, option, visited)) return true;\n }\n return false;\n};\n\n/**\n * Lọc mảng children: chỉ giữ child có subtree khớp `predicate`.\n *\n * Trả về MẢNG MỚI nhưng GIỮ NGUYÊN object reference của từng child (không clone)\n * — nhờ vậy `meta.id` (bám theo identity của object data, hoặc theo `option.rowKey`)\n * ổn định, selection / trạng thái bung không bị mất khi từ khoá search đổi. Đây là\n * bước \"prune\" của tính năng search-con.\n */\nexport const filterMatchingChildren = <T>(children: T[], predicate: (data: T) => boolean, option?: SdTableOptionTree): T[] =>\n children.filter(child => subtreeMatches(child, predicate, option));\n\nexport const getVisibleChildrenData = <T>(data: T, option: SdTableOptionTree<T>, predicate?: (data: T) => boolean): T[] => {\n const children = getChildrenFromData(data, option);\n return predicate ? filterMatchingChildren(children, predicate, option) : children;\n};\n\nexport const saveTreeExpandState = <T>(rows: SdTableItem<T>[], expandState: Map<string, boolean>): void => {\n for (const row of rows) {\n if (row.meta.tree?.isExpanded) {\n expandState.set(row.meta.id, true);\n }\n const children = row.meta.tree?.childItems;\n if (children?.length) {\n saveTreeExpandState(children, expandState);\n }\n }\n};\n\nexport const clearTreeChildCache = <T>(rows: SdTableItem<T>[]): void => {\n for (const row of rows) {\n const children = row.meta.tree?.childItems;\n if (children?.length) {\n clearTreeChildCache(children);\n row.meta.tree!.childItems = undefined;\n }\n }\n};\n\nexport const initTreeMeta = <T>(\n rows: SdTableItem<T>[],\n option: SdTableOptionTree<T>,\n args: {\n expandState?: Map<string, boolean>;\n treeSearchPredicate?: (data: T) => boolean;\n level?: number;\n parentId?: string;\n } = {}\n): void => {\n const { expandState, treeSearchPredicate, level = 0, parentId } = args;\n const searchActive = !!treeSearchPredicate;\n for (const row of rows) {\n const saved = expandState?.get(row.meta.id);\n const hasChildren = searchActive\n ? getVisibleChildrenData(row.data, option, treeSearchPredicate).length > 0\n : resolveHasChildren(row, option);\n row.meta.tree = {\n ...row.meta.tree,\n level,\n parentId,\n hasChildren,\n isExpanded: searchActive ? hasChildren : (saved ?? resolveDefaultExpanded(level, option)),\n isExpanding: false,\n };\n }\n};\n\nexport const flattenTree = <T>(roots: SdTableItem<T>[], option?: SdTableOptionTree, visited: Set<string> = new Set()): SdTableItem<T>[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: SdTableItem<T>[] = [];\n\n const walk = (rows: SdTableItem<T>[], level: number, parentPath: number[]) => {\n rows.forEach((row, siblingIdx) => {\n if (visited.has(row.meta.id)) return;\n visited.add(row.meta.id);\n row.meta.tree ??= { level, hasChildren: false, isExpanded: false };\n row.meta.tree.level = level;\n // why: hierarchical numbering (1, 1.2, 1.2.1, ...) — STT template join('.').\n const indexPath = [...parentPath, siblingIdx + 1];\n row.meta.tree.indexPath = indexPath;\n result.push(row);\n\n const canDescend = row.meta.tree.isExpanded && row.meta.tree.hasChildren;\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!canDescend || !depthOk) return;\n\n const children = row.meta.tree.childItems ?? [];\n walk(children, level + 1, indexPath);\n });\n };\n\n walk(roots, 0, []);\n return result;\n};\n\n/** Thu thập mọi SdTableItem đã format trong cây (kể cả node đang collapse). */\nexport const collectFormattedTreeRows = <T>(roots: SdTableItem<T>[]): SdTableItem<T>[] => {\n const result: SdTableItem<T>[] = [];\n const walk = (rows: SdTableItem<T>[]) => {\n for (const row of rows) {\n result.push(row);\n const children = row.meta.tree?.childItems;\n if (children?.length) walk(children);\n }\n };\n walk(roots);\n return result;\n};\n\n/** Flatten ALL nodes regardless of expand state — used for export */\nexport const flattenTreeAll = <T>(\n roots: SdTableItem<T>[],\n option?: SdTableOptionTree,\n visited: Set<string> = new Set()\n): SdTableItem<T>[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: SdTableItem<T>[] = [];\n\n const walk = (rows: SdTableItem<T>[], level: number) => {\n for (const row of rows) {\n if (visited.has(row.meta.id)) continue;\n visited.add(row.meta.id);\n result.push(row);\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n const children = row.meta.tree?.childItems ?? [];\n walk(children, level + 1);\n }\n };\n\n walk(roots, 0);\n return result;\n};\n\n/** Flatten raw data tree for export (ignores expand state) */\nexport const flattenDataTree = <T>(roots: T[], option?: SdTableOptionTree, visited: Set<unknown> = new Set()): T[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: T[] = [];\n\n const walk = (rows: T[], level: number) => {\n for (const row of rows) {\n if (visited.has(row as object)) continue;\n visited.add(row as object);\n result.push(row);\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n walk(getChildrenFromData(row, option), level + 1);\n }\n };\n\n walk(roots, 0);\n return result;\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableOptionTree } from '../models/table-option-tree.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { flattenTree } from '../services/tree/tree.util';\n\n@Pipe({ name: 'sdTree' })\nexport class SdTreePipe implements PipeTransform {\n transform(items: SdTableItem[], treeOption?: SdTableOptionTree, _revision = 0): SdTableItem[] {\n if (!treeOption) return items;\n return flattenTree(items, treeOption);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdSection } from '@sdcorejs/angular/components/section';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport { FilterValuesPipe } from '../../../pipes';\nimport { SdTableExternalFilter, SdTableOptionFilter, TableFilterRegister } from '../../../services/table-filter/table-filter.model';\n\n@Component({\n selector: 'external-filter',\n templateUrl: './external-filter.component.html',\n styleUrl: './external-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatMenuModule,\n MatCheckboxModule,\n SdSection,\n SdInput,\n SdInputNumber,\n SdSelect,\n SdDate,\n SdDatetime,\n SdDateRange,\n SdButton,\n FilterValuesPipe,\n SdCheckbox,\n SdTranslatePipe,\n ],\n})\nexport class ExternalFilterComponent {\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n filter = input<SdTableOptionFilter | undefined>(undefined);\n externalFilters = input<SdTableExternalFilter[] | null | undefined>([]);\n filterRegister = input<TableFilterRegister | undefined>(undefined);\n\n // ==========================================\n // 2. INJECT\n // ==========================================\n readonly #ref = inject(ChangeDetectorRef);\n\n // ==========================================\n // 3. STATE (signals)\n // ==========================================\n externalFilter = signal<Record<string, any>>({});\n inlineExternal = signal<Record<string, boolean>>({});\n filtered = signal<boolean>(false);\n isMobileOrTablet = BrowserUtilities.isMobile();\n // FormGroup là instance, parent đọc qua viewChild — giữ readonly field.\n readonly form = new FormGroup({});\n\n // ==========================================\n // 4. COMPUTED\n // ==========================================\n // autoId base = `<input>-external-` — template ghép tiếp `<field>` cho mỗi control.\n autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-external-` : '';\n });\n\n // Layout column: 4 filter/row → 3 cột; mặc định 6 filter/row → 2 cột.\n col = computed<2 | 3>(() => (this.filter()?.externalFilterPerRow === 4 ? 3 : 2));\n\n // Normalize externalFilters về mảng (input có thể null/undefined).\n filterItems = computed(() => this.externalFilters() || []);\n\n constructor() {\n // Subscribe filterRegister observers — re-subscribe khi input đổi, cleanup khi đổi/destroy.\n // QUAN TRỌNG: phải wrap untracked(). Observer có startWith() → emit ĐỒNG BỘ ngay khi\n // subscribe, callback đọc this.externalFilter() (qua #filtered) sẽ bị effect track →\n // externalFilter.set({}) tạo ref mới → effect rerun → resubscribe → loop vô hạn → OOM.\n effect(onCleanup => {\n const register = this.filterRegister();\n if (!register) return;\n\n untracked(() => {\n const cfgSub = register.configuration.observer.subscribe(cfg => {\n this.inlineExternal.set(cfg.inlineExternal || {});\n });\n\n const valSub = register.value.observer.subscribe(val => {\n this.externalFilter.set(val.externalFilter || {});\n this.filtered.set(this.#filtered());\n });\n\n onCleanup(() => {\n cfgSub.unsubscribe();\n valSub.unsubscribe();\n });\n });\n });\n\n // Khi form values đổi → cập nhật filtered. takeUntilDestroyed() tự lấy DestroyRef từ injection context.\n this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n this.filtered.set(this.#filtered());\n this.#ref.markForCheck();\n });\n }\n\n // ==========================================\n // 5. HANDLERS\n // ==========================================\n onKeyupEnter = () => {\n this.onSubmit();\n };\n\n onFilter = (externalFilter: SdTableExternalFilter) => {\n externalFilter?.onChange?.(this.externalFilter()?.[externalFilter.field]);\n // Nếu không phải manual filter thì submit luôn; manual → đợi user bấm nút Search.\n if (!this.filter()?.manualFilter) {\n this.onSubmit();\n }\n };\n\n onSubmit = () => {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n this.filterRegister()?.value.set({\n externalFilter: this.externalFilter(),\n });\n };\n\n // Public API — table.component gọi để commit pending value vào filterRegister mà không trigger reload.\n updateFilter = () => {\n this.filterRegister()?.value.set({\n externalFilter: this.externalFilter(),\n notReload: true,\n });\n };\n\n clearFilter = (event?: Event) => {\n event?.stopPropagation();\n this.filterRegister()?.value.remove();\n this.filter()?.onClearFilter?.();\n };\n\n onCheckboxChange = (event: Event, externalFilter: SdTableExternalFilter) => {\n event?.stopPropagation();\n const next = { ...this.inlineExternal() };\n next[externalFilter.field] = !next[externalFilter.field];\n this.inlineExternal.set(next);\n this.filterRegister()?.configuration.set({\n inlineExternal: next,\n });\n };\n\n // ==========================================\n // 6. INTERNAL\n // ==========================================\n #filtered = (): boolean => {\n return Object.values({ ...this.externalFilter() }).some(val => {\n // Mảng có phần tử → coi như có filter\n if (Array.isArray(val)) return !!val.length;\n // Object (date) có from/to → có filter\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) return true;\n if ('to' in val && !!val.to) return true;\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n });\n };\n}\n","@let _filter = filter();\n@let _autoId = autoId();\n@let _filterItems = filterItems();\n@let _externalFilter = externalFilter();\n@let _inlineExternal = inlineExternal();\n@let _filtered = filtered();\n@let _col = col();\n\n@if (!_filter?.disabled) {\n @if (!isMobileOrTablet && _filterItems.length) {\n <sd-section\n [hideHeader]=\"_filter?.hideExternalFilterToolbar\"\n icon=\"filter_alt\"\n iconColor=\"secondary\"\n [title]=\"'core.component.table.filter' | sdTranslate\"\n [collapsible]=\"_filter?.collapsible ?? true\">\n <div class=\"d-flex mr-4\" sdHeaderRight>\n <sd-button\n [autoId]=\"_autoId + 'clear'\"\n [disabled]=\"!_filtered\"\n type=\"text\"\n prefixIcon=\"cleaning_services\"\n [tooltip]=\"'core.component.table.clear-selection' | sdTranslate\"\n (click)=\"$event.stopPropagation(); clearFilter($event)\"></sd-button>\n <sd-button\n [autoId]=\"_autoId + 'setting'\"\n type=\"text\"\n prefixIcon=\"settings\"\n [tooltip]=\"'core.component.table.customize' | sdTranslate\"\n [matMenuTriggerFor]=\"menu\"\n (click)=\"$event.stopPropagation()\"></sd-button>\n <mat-menu #menu=\"matMenu\" class=\"sd-custom-panel-filter-configuration\" [attr.data-autoid]=\"_autoId + 'setting-menu'\">\n @for (externalFilter of _filterItems; track externalFilter.field) {\n <button\n [attr.data-autoid]=\"_autoId + 'setting-' + externalFilter.field\"\n mat-menu-item\n (click)=\"onCheckboxChange($event, externalFilter)\"\n [disabled]=\"externalFilter.required\">\n <sd-checkbox\n [autoId]=\"_autoId + 'setting-' + externalFilter.field + '-checkbox'\"\n [label]=\"externalFilter.title\"\n [model]=\"_inlineExternal[externalFilter.field]\"\n [disabled]=\"externalFilter.required\" />\n </button>\n }\n </mat-menu>\n </div>\n <div class=\"row mx-0\" style=\"row-gap: 16px\">\n @for (item of _filterItems; track item.field) {\n @if (_inlineExternal[item.field]) {\n <div class=\"col-md-3 col-sm-6 px-8\" [class.col-lg-2]=\"_col === 2\" [class.col-lg-3]=\"_col === 3\">\n @if (item.type === 'string') {\n <sd-input\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n type=\"text\"\n [(model)]=\"_externalFilter[item.field]\"\n (keyupEnter)=\"onKeyupEnter()\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n clearable\n hideInlineError>\n </sd-input>\n } @else if (item.type === 'number') {\n <sd-input-number\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (keyupEnter)=\"onKeyupEnter()\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n clearable\n hideInlineError>\n </sd-input-number>\n } @else if (item.type === 'boolean') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"[\n { value: true, display: item.option?.displayOnTrue || 'True' },\n { value: false, display: item.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'date') {\n <sd-date\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n clearable\n hideInlineError>\n </sd-date>\n } @else if (item.type === 'datetime') {\n <sd-datetime\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n clearable\n hideInlineError>\n </sd-datetime>\n } @else if (item.type === 'daterange') {\n <sd-date-range\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n appearance=\"outline\"\n hideInlineError>\n </sd-date-range>\n } @else if (item.type === 'values') {\n @if (item.option.selection === 'MULTIPLE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.option.selection === 'AUTOCOMPLETE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.option.selection === 'MULTIPLEAUTOCOMPLETE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n }\n } @else if (item.type === 'lazy-values') {\n @if (item.option.selection === 'MULTIPLE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n }\n } @else if (item.type === 'custom' && item.filterDef) {\n <ng-container\n *ngTemplateOutlet=\"\n item.filterDef;\n context: { form: form, externalFilter: _externalFilter, autoId: _autoId + item.field }\n \">\n </ng-container>\n }\n </div>\n }\n }\n </div>\n @if (_filter?.manualFilter) {\n <div class=\"d-flex justify-content-end mt-16 px-8\">\n <sd-button\n [autoId]=\"_autoId + 'submit'\"\n [disabled]=\"form.invalid\"\n type=\"fill\"\n color=\"primary\"\n [title]=\"'core.component.table.search' | sdTranslate\"\n prefixIcon=\"filter_alt\"\n (click)=\"onSubmit()\">\n </sd-button>\n </div>\n }\n </sd-section>\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal, viewChild } from '@angular/core';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdSideDrawer } from '@sdcorejs/angular/components/side-drawer';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableFilterDefDirective } from '../../../directives/sd-table-filter-def.directive';\nimport { SdTableColumn } from '../../../models/table-column.model';\nimport { FilterValuesPipe } from '../../../pipes';\nimport { SdTableExternalFilter, SdTableOptionFilter, TableFilterRegister } from '../../../services/table-filter/table-filter.model';\nimport { ColumnFilterComponent } from '../column-filter/column-filter.component';\n\n/**\n * Mobile-filter — side-drawer chiếm ~90% width thiết bị. Dùng cho table khi\n * render trên màn hình điện thoại (inline filter bị ẩn).\n *\n * Layout (mỗi filter 1 hàng, size='sm'):\n * 1. External filter (render inline — KHÔNG reuse external-filter component\n * vì component đó dùng grid 2/3 cột + có chọn ẩn/hiện không phù hợp mobile).\n * 2. filterDefs — custom templates do app khai báo qua `[sdTableFilterDef]`.\n * 3. Column filter — 1 column-filter / column.\n *\n * State: local working copy. Cancel = đóng (không ghi). Apply = flush vào\n * filterRegister + đóng.\n */\n@Component({\n selector: 'mobile-filter',\n templateUrl: './mobile-filter.component.html',\n styleUrl: './mobile-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n SdSideDrawer,\n SdButton,\n ColumnFilterComponent,\n SdInput,\n SdInputNumber,\n SdSelect,\n SdDate,\n SdDatetime,\n SdDateRange,\n FilterValuesPipe,\n SdTranslatePipe,\n ],\n})\nexport class MobileFilterComponent {\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n filter = input<SdTableOptionFilter | undefined>(undefined);\n externalFilters = input<SdTableExternalFilter[] | null | undefined>([]);\n columns = input<SdTableColumn[] | null | undefined>([]);\n filterDefs = input<readonly SdTableFilterDefDirective[] | null | undefined>([]);\n filterRegister = input<TableFilterRegister | undefined>(undefined);\n cacheValues = input<Record<string, any[]> | undefined>(undefined);\n\n // ==========================================\n // 2. VIEW QUERY\n // ==========================================\n drawer = viewChild.required(SdSideDrawer);\n\n // ==========================================\n // 3. STATE — local working copies; chỉ flush khi Apply.\n // ==========================================\n workingColumnFilter = signal<Record<string, any>>({});\n workingColumnOperator = signal<Record<string, Operator>>({});\n workingExternalFilter = signal<Record<string, any>>({});\n\n // ==========================================\n // 4. COMPUTED\n // ==========================================\n autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-mobile-filter-` : '';\n });\n\n externalFilterItems = computed(() => this.externalFilters() || []);\n columnItems = computed(() => this.columns() || []);\n filterDefItems = computed(() => this.filterDefs() || []);\n\n // ==========================================\n // 5. PUBLIC API\n // ==========================================\n open = () => {\n const reg = this.filterRegister();\n const val = reg?.value.get();\n const cloned = (o: any) => (o ? JSON.parse(JSON.stringify(o)) : {});\n this.workingColumnFilter.set(cloned(val?.columnFilter));\n this.workingColumnOperator.set(cloned(val?.columnOperator));\n this.workingExternalFilter.set(cloned(val?.externalFilter));\n this.drawer().open();\n };\n\n close = () => this.drawer().close();\n\n // ==========================================\n // 6. HANDLERS\n // ==========================================\n onApply = () => {\n this.filterRegister()?.value.set({\n columnFilter: this.workingColumnFilter(),\n columnOperator: this.workingColumnOperator(),\n externalFilter: this.workingExternalFilter(),\n });\n this.drawer().close();\n };\n\n onCancel = () => {\n // Local working state — không ghi gì khi cancel, chỉ đóng drawer.\n this.drawer().close();\n };\n}\n","@let _autoId = autoId();\n@let _externalFilterItems = externalFilterItems();\n@let _columnItems = columnItems();\n@let _filterDefItems = filterDefItems();\n@let _workingColumnFilter = workingColumnFilter();\n@let _workingColumnOperator = workingColumnOperator();\n@let _workingExternalFilter = workingExternalFilter();\n@let _cacheValues = cacheValues();\n\n<sd-side-drawer\n #drawer\n [title]=\"'core.component.table.filter' | sdTranslate\"\n width=\"90vw\">\n <div class=\"mobile-filter-body\">\n <!-- ============================ -->\n <!-- 1. External filters (inline) -->\n <!-- ============================ -->\n @if (_externalFilterItems.length) {\n <section class=\"mobile-filter-section\">\n @for (item of _externalFilterItems; track item.field) {\n <div class=\"mobile-filter-row\">\n @if (item.type === 'string') {\n <sd-input\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n type=\"text\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-input>\n } @else if (item.type === 'number') {\n <sd-input-number\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-input-number>\n } @else if (item.type === 'boolean') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"[\n { value: true, display: item.option?.displayOnTrue || 'True' },\n { value: false, display: item.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'date') {\n <sd-date\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n hideInlineError>\n </sd-date>\n } @else if (item.type === 'datetime') {\n <sd-datetime\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n hideInlineError>\n </sd-datetime>\n } @else if (item.type === 'daterange') {\n <sd-date-range\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n appearance=\"outline\"\n hideInlineError>\n </sd-date-range>\n } @else if (item.type === 'values') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [multiple]=\"item.option.selection === 'MULTIPLE' || item.option.selection === 'MULTIPLEAUTOCOMPLETE'\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'lazy-values') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [multiple]=\"item.option.selection === 'MULTIPLE'\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'custom' && item.filterDef) {\n <ng-container\n *ngTemplateOutlet=\"\n item.filterDef;\n context: { externalFilter: _workingExternalFilter, autoId: _autoId + 'ext-' + item.field }\n \">\n </ng-container>\n }\n </div>\n }\n </section>\n }\n\n <!-- ============================ -->\n <!-- 2. Custom filterDef templates -->\n <!-- ============================ -->\n @if (_filterDefItems.length) {\n <section class=\"mobile-filter-section\">\n @for (def of _filterDefItems; track def.sdTableFilterDef()) {\n <div class=\"mobile-filter-row\" [attr.data-autoid]=\"_autoId + 'def-' + def.sdTableFilterDef()\">\n <ng-container\n *ngTemplateOutlet=\"def.templateRef!; context: { externalFilter: _workingExternalFilter }\">\n </ng-container>\n </div>\n }\n </section>\n }\n\n <!-- ============================ -->\n <!-- 3. Column filters -->\n <!-- ============================ -->\n @if (_columnItems.length) {\n <section class=\"mobile-filter-section\">\n @for (column of _columnItems; track column.field) {\n <div class=\"mobile-filter-row\" [attr.data-autoid]=\"_autoId + 'col-' + column.field\">\n <column-filter\n [autoId]=\"_autoId + 'col'\"\n [column]=\"column\"\n [columnFilter]=\"_workingColumnFilter\"\n [operator]=\"$any(_workingColumnOperator[column.field])\"\n (operatorChange)=\"_workingColumnOperator[column.field] = $event!\"\n [cacheValues]=\"_cacheValues\"\n isMobile>\n </column-filter>\n </div>\n }\n </section>\n }\n </div>\n\n <ng-container sdFooterRight>\n <div class=\"mobile-filter-footer\">\n <sd-button\n [autoId]=\"_autoId + 'cancel'\"\n class=\"mobile-filter-action\"\n (click)=\"onCancel()\"\n [title]=\"'core.confirm.no' | sdTranslate\"\n type=\"text\"\n color=\"secondary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId + 'apply'\"\n class=\"mobile-filter-action\"\n (click)=\"onApply()\"\n [title]=\"'core.confirm.yes' | sdTranslate\"\n type=\"fill\"\n color=\"primary\">\n </sd-button>\n </div>\n </ng-container>\n</sd-side-drawer>\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableAction, SdTableActionNormal } from '../../models/table-option-selector.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';\n/**\n * Resolves the bulk actions a selection is allowed to run.\n *\n * why: tách khỏi pipe để component đọc được cùng KẾT QUẢ trong `computed()` — quick-action chỉ\n * được mở khi danh sách này KHÔNG rỗng, mà điều đó phải quyết định trong TS chứ không thể suy ra\n * từ một pipe chỉ chạy trong template.\n */\nexport function sdResolveTableActions(selectedItems: SdTableItem[] | undefined, actions: SdTableAction[] | undefined): Action[] {\n const results: SdTableAction[] = [];\n if (!actions?.length || !selectedItems?.length) {\n return [];\n }\n for (const action of actions) {\n if ('children' in action) {\n const children: SdTableActionNormal[] = [];\n for (const childAction of action.children) {\n const key = Utilities.hash(childAction);\n if (selectedItems.every(e => e?.meta?.selector?.actions?.includes(key))) {\n children.push(childAction);\n }\n }\n if (children.length > 0) {\n results.push({ ...action, children });\n }\n } else {\n const key = Utilities.hash(action);\n if (selectedItems.every(e => e?.meta?.selector?.actions?.includes(key))) {\n results.push(action);\n }\n }\n }\n return results.map(result => convertAction(result));\n}\n\nfunction convertAction(action: SdTableAction): Action {\n if ('children' in action) {\n return {\n variant: 'children',\n title: action.title,\n icon: action.icon,\n fontSet: action.fontSet,\n tooltip: action.tooltip,\n color: action.color,\n type: action.type,\n children: action.children.map(e => ({\n variant: 'normal',\n title: e.title,\n icon: e.icon,\n color: action.color,\n type: action.type,\n fontSet: e.fontSet,\n tooltip: e.tooltip,\n click: e.click,\n })),\n };\n }\n return {\n variant: 'normal',\n title: action.title,\n icon: action.icon,\n color: action.color,\n type: action.type,\n fontSet: action.fontSet,\n tooltip: action.tooltip,\n click: action.click,\n };\n}\n\n@Pipe({\n name: 'actionFilter',\n})\nexport class ActionFilterPipe implements PipeTransform {\n transform = (selectedItems: SdTableItem[] | undefined, actions: SdTableAction[] | undefined): Action[] =>\n sdResolveTableActions(selectedItems, actions);\n}\n\nexport type Action<T = any> = ActionNormal<T> | ActionChildren<T>;\n\ninterface ActionNormal<T = any> {\n variant: 'normal';\n icon?: string;\n fontSet?: SdUnwrapSignal<SdButton['fontSet']>;\n tooltip?: SdUnwrapSignal<SdButton['tooltip']>;\n title?: SdUnwrapSignal<SdButton['title']>;\n color?: SdUnwrapSignal<SdButton['color']>;\n type?: SdUnwrapSignal<SdButton['type']>;\n click: (selectedItems?: T[]) => void;\n}\n\ninterface ActionChildren<T = any> {\n variant: 'children';\n icon?: string;\n fontSet?: SdUnwrapSignal<SdButton['fontSet']>;\n tooltip?: SdUnwrapSignal<SdButton['tooltip']>;\n title?: SdUnwrapSignal<SdButton['title']>;\n color?: SdUnwrapSignal<SdButton['color']>;\n type?: SdUnwrapSignal<SdButton['type']>;\n children: ActionNormal<T>[];\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdQuickAction } from '@sdcorejs/angular/components/quick-action';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { Action, sdResolveTableActions } from './action-filter.pipe';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'selector-action',\n templateUrl: './selector-action.component.html',\n styleUrl: './selector-action.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, SdButton, SdQuickAction],\n})\nexport class SelectorActionComponent {\n // ==========================================\n // 1. SIGNAL INPUTS / OUTPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n tableOption = input<SdTableOption | undefined>(undefined);\n selectedTableItems = input<SdTableItem[] | undefined>(undefined);\n clear = output<void>();\n\n // Base autoId (đã là `components-table-<scope>` từ parent), '' khi parent không set.\n autoId = computed(() => this.autoIdInput() || '');\n\n // ==========================================\n // 2. INJECT\n // ==========================================\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. COMPUTED\n // ==========================================\n message = computed<string>(() => {\n const msg = this.tableOption()?.selector?.message;\n if (!msg) return this.#i18n.t('core.component.table.selector-action.default-msg');\n if (typeof msg === 'function') {\n return msg(this.selectedTableItems()?.map(e => e.data));\n }\n return msg;\n });\n\n /** Bulk actions the current selection is allowed to run. */\n actions = computed<Action[]>(() => sdResolveTableActions(this.selectedTableItems(), this.tableOption()?.selector?.actions));\n\n // why: chọn dòng mà KHÔNG có action nào chạy được thì thanh quick-action chỉ còn đúng một nút ✕ —\n // nó che nội dung bảng để đổi lấy thông tin người dùng đã thấy (dòng đang highlight + checkbox).\n // Không có action ⇒ không mở thanh; bỏ chọn bằng chính checkbox ở header/dòng.\n opened = computed(() => !!this.selectedTableItems()?.length && this.actions().length > 0);\n\n // ==========================================\n // 4. HANDLERS\n // ==========================================\n onClear = () => this.clear.emit();\n\n onClickAction = (action: Action) => {\n if (action?.variant === 'normal' && action.click) {\n action.click(this.selectedTableItems()?.map(e => e.data));\n }\n };\n}\n","@let _actions = actions();\n@let _selectedTableItems = selectedTableItems();\n@let _autoId = autoId();\n\n<sd-quick-action [opened]=\"opened()\">\n <div class=\"d-flex align-items-center\" sdMessage>\n <div class=\"c-bg-length\">\n <span class=\"c-length\">{{ _selectedTableItems?.length }}</span>\n </div>\n <div class=\"c-message\">\n {{ message() }}\n </div>\n </div>\n\n <div class=\"d-flex align-items-center mr-8\" sdAction>\n @for (action of _actions; track $index) {\n @if (action.variant === 'normal') {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-action-' + $index : null\"\n class=\"ml-4\"\n [tooltip]=\"action.tooltip\"\n [prefixIcon]=\"action.icon\"\n [color]=\"action.color\"\n [type]=\"action.type || 'light'\"\n [fontSet]=\"action.fontSet\"\n [title]=\"action.title\"\n (click)=\"onClickAction(action)\"></sd-button>\n } @else if (action.variant === 'children') {\n @let _actionIndex = $index;\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-action-' + _actionIndex : null\"\n class=\"ml-4\"\n [tooltip]=\"action.tooltip\"\n [prefixIcon]=\"action.icon || 'more_vert'\"\n [color]=\"action.color || 'secondary'\"\n [type]=\"action.type || 'light'\"\n [fontSet]=\"action.fontSet\"\n [title]=\"action.title\"\n [matMenuTriggerFor]=\"menu\">\n </sd-button>\n <mat-menu #menu=\"matMenu\">\n <span>\n @for (child of action.children; track $index) {\n <button\n mat-menu-item\n [attr.data-autoid]=\"_autoId ? _autoId + '-action-' + _actionIndex + '-' + $index : null\"\n (click)=\"onClickAction(child)\">\n @if (child.icon) {\n <sd-icon [fontSet]=\"child.fontSet\" class=\"c-icon\" [name]=\"child.icon\"></sd-icon>\n }\n <span> {{ child.title }}</span>\n </button>\n }\n </span>\n </mat-menu>\n }\n }\n <!-- why: thanh này chỉ mở khi CÓ action (xem `opened`), nên nút ✕ luôn đi kèm ít nhất một\n action — nó là lối thoát nhanh, không còn là nội dung duy nhất của thanh. -->\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-clear-selection' : null\"\n class=\"ml-4\"\n prefixIcon=\"close\"\n color=\"secondary\"\n type=\"outline\"\n (click)=\"onClear()\"\n width=\"35px\"></sd-button>\n </div>\n</sd-quick-action>\n","import { InjectionToken } from '@angular/core';\nimport { SdTableOptionPaginate } from '../models/table-option-paginate.model';\nimport { SdTableOptionFilter } from '../services/table-filter/table-filter.model';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableColumn } from '../models';\n\nexport interface ISdTableConfiguration {\n paginate?: {\n /** Số dòng mỗi trang. */\n pageSize?: SdTableOptionPaginate['pageSize'];\n\n /** Danh sách các tuỳ chọn số dòng/trang mà người dùng có thể chọn. */\n pages?: SdTableOptionPaginate['pages'];\n\n showFirstLastButtons?: SdTableOptionPaginate['showFirstLastButtons'];\n };\n filter?: {\n /** Ẩn bộ lọc dưới cột, nếu không cấu hình thì giá trị mặc định là false */\n hideInlineFilter?: SdTableOptionFilter['hideInlineFilter'];\n\n /** Số lượng external filter mỗi dòng, mặc định là 6 */\n externalFilterPerRow?: SdTableOptionFilter['externalFilterPerRow'];\n\n /** Kích hoạt chế độ lọc thủ công, hiển thị nút áp dụng, mặc định là false */\n manualFilter?: SdTableOptionFilter['manualFilter'];\n\n /** Ẩn toolbar (xóa bộ lọc, thiết lập) của external filter, khi có ít external filter user không cần chức năng này, mặc định là false */\n hideExternalFilterToolbar?: SdTableOptionFilter['hideExternalFilterToolbar'];\n\n operator?: {\n list?: Partial<Record<SdTableColumn['type'], Operator[]>>;\n default?: Partial<Record<SdTableColumn['type'], Operator>>;\n };\n };\n images?: {\n filterRequired?: string; // Link ảnh cho table ở trạng thái cần nhập filter\n dataEmpty?: string; // Link ảnh cho table ở trạng thái không có dữ liệu\n filterEmpty?: string; // Link ảnh cho table ở trạng thái filter không có dữ liệu\n };\n}\n\nexport const DEFAULT_TABLE_CONFIG: ISdTableConfiguration = {\n paginate: {\n pageSize: 20,\n pages: [20, 50, 100, 200],\n },\n};\n\nexport const SD_TABLE_CONFIGURATION = new InjectionToken<ISdTableConfiguration>('sd-table.configuration');\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdStorageService, SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { Subject } from 'rxjs';\nimport { ConfiguredColumn, ConfiguredTable, ConfiguredTableResult } from '../models/table-option-config.model';\nimport { SdTableOption } from '../models/table-option.model';\nimport { ISdTableConfiguration, SD_TABLE_CONFIGURATION } from '../configurations';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\n@Injectable()\nexport class ConfigService {\n #COLUMNS = {\n SUBINFORMATION: 'sdSubInformationAction',\n COMMAND: 'sdCommand',\n SELECTION: 'sdSelection',\n GROUP: 'sdGroup',\n REORDER: 'sdReorder',\n INDEX: 'sdIndex',\n FILLER: 'sdFiller',\n };\n #prefix = 'TABLE_CONFIG';\n #storage?: SdStorageWithDefault<ConfiguredTable>;\n #widthChange = new Subject<{ field: string; width: string }>();\n widthChange$ = this.#widthChange.asObservable();\n private readonly storageService = inject(SdStorageService);\n readonly #destroyRef = inject(DestroyRef);\n public readonly tableConfiguration: ISdTableConfiguration | null = inject(SD_TABLE_CONFIGURATION, { optional: true });\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#storage?.destroy();\n this.#storage = undefined;\n });\n }\n\n #loadConfiguredTable = (option: SdTableOption): SdStorageWithDefault<ConfiguredTable> => {\n // Nếu không có key thì không lấy được setting\n if (!option?.key) {\n return this.storageService.create<ConfiguredTable>(Utilities.hash(option), {\n type: 'session', // Nếu không có key thì lưu theo session\n default: this.#default(option),\n });\n }\n // Key của setting là tổ hợp từ key truyền vào và prefix để tránh chung key với các tính năng khác cũng dùng key trong core table\n return this.storageService.create<ConfiguredTable>(\n { prefix: this.#prefix, key: option?.key },\n {\n default: this.#default(option),\n }\n );\n };\n\n loadConfiguredTable = (option: SdTableOption) => {\n // Nếu không có key thì trả về thông tin mặc định\n if (!option?.key) {\n return this.#default(option);\n }\n const storage = this.#loadConfiguredTable(option);\n try {\n return storage.get();\n } finally {\n storage.destroy();\n }\n };\n\n loadConfigurationResult = (option: SdTableOption, configuration: ConfiguredTable): ConfiguredTableResult => {\n const result: ConfiguredTableResult = {\n column: {},\n fixedColumn: {},\n firstColumns: [],\n secondColumns: [],\n firstHeaders: [],\n secondHeaders: [],\n displayedColumns: [],\n displayedFooters: [],\n multipleHeader: false,\n };\n const { selector, group } = option || {};\n const commands = option?.command?.commands || option?.commands || [];\n const isCommandRight = option?.command?.align === 'right' || false; // 👈 thêm dòng này\n const columns = option?.columns?.filter(e => !e.hidden) || [];\n if (selector?.visible) {\n result.firstHeaders.push(this.#COLUMNS.SELECTION);\n result.displayedColumns.push(this.#COLUMNS.SELECTION);\n }\n // why: tree toggle KHÔNG còn là cột riêng — icon expand được nhúng vào cột\n // đầu tiên (cột Index nếu có, ngược lại là cột data đầu). Xem table.component.html.\n // 👇 Chỉ push vào đầu nếu là left (mặc định)\n if (commands?.length && !isCommandRight) {\n result.firstHeaders.push(this.#COLUMNS.COMMAND);\n result.displayedColumns.push(this.#COLUMNS.COMMAND);\n }\n // why: group header row dùng matRowDef RIÊNG với column list ['sdGroupHeader'] qua predicate\n // when:isGroupHeader — KHÔNG inject vào displayedColumns/firstHeaders để tránh colspan trick\n // (TDs khác vẫn render gây overflow row). Data row dùng displayedColumns nguyên vẹn.\n // group option vẫn cần khai báo (qua option.group) để SdGroupPipe biết bucket items.\n // sdIndex đặt sau selector / tree / command-left / group, ngay trước data columns\n if (option.index?.enabled) {\n result.firstHeaders.push(this.#COLUMNS.INDEX);\n result.displayedColumns.push(this.#COLUMNS.INDEX);\n }\n configuration?.columns\n ?.filter(col => !col.invisible)\n .forEach(col => {\n // Kiểm tra column trong config có còn được khai báo trong option\n // Nếu không thì ẩn column đó đi\n const column = columns.find(e => e.field === col.origin.field);\n if (column) {\n const title =\n typeof column.title === 'string' ? col.title || col.origin.title : { ...column.title, title: col.title || col.origin.title };\n const cell = {\n ...column.cell,\n truncate: {\n ...column.cell?.truncate,\n enable: col?.truncate ?? col.origin.truncate,\n type: column?.cell?.truncate?.type ?? 'tooltip',\n },\n };\n\n result.column[col.origin.field] = {\n title: col.title || col.origin.title,\n width: col.width || col.origin.width,\n };\n\n if (col.fixed) {\n result.fixedColumn[col.origin.field] = {\n title: col.title || col.origin.title,\n width: col.width || col.origin.width,\n };\n }\n\n result.firstColumns.push({\n ...column,\n title: title,\n width: col.width || col.origin.width,\n cell: cell,\n });\n result.firstHeaders.push(col.origin.field);\n result.displayedColumns.push(col.origin.field);\n\n if (column.type === 'children') {\n column.children?.forEach(childColumn => {\n result.secondColumns.push(childColumn);\n result.secondHeaders.push(childColumn.field);\n result.displayedColumns.push(childColumn.field);\n });\n }\n }\n });\n // Nếu có thêm các column mới, chèn các column đó vào cuối\n columns\n ?.filter(column => !configuration?.columns?.some(e => e.origin.field === column.field))\n .forEach(column => {\n result.firstColumns.push({\n ...column,\n title: column.title,\n width: column.width,\n });\n result.firstHeaders.push(column.field);\n result.displayedColumns.push(column.field);\n if (column.type === 'children') {\n column.children?.forEach(childColumn => {\n result.secondColumns.push(childColumn);\n result.secondHeaders.push(childColumn.field);\n result.displayedColumns.push(childColumn.field);\n });\n }\n });\n if (option.expand) {\n result.firstHeaders.push(this.#COLUMNS.SUBINFORMATION);\n result.displayedColumns.push(this.#COLUMNS.SUBINFORMATION);\n }\n if (commands?.length && isCommandRight) {\n result.firstHeaders.push(this.#COLUMNS.COMMAND);\n result.displayedColumns.push(this.#COLUMNS.COMMAND);\n }\n // why: filler column ở cuối hấp thụ leftover space — opt-in qua option.filler.enabled.\n // Khi bật, ngăn các cột utility (selection, index, command) bị table-layout auto stretch trên màn rộng.\n if (option.filler?.enabled) {\n result.firstHeaders.push(this.#COLUMNS.FILLER);\n result.displayedColumns.push(this.#COLUMNS.FILLER);\n }\n result.multipleHeader = result.secondHeaders.length > 0;\n // Sub infomation không thể có footer; filler cũng không cần footer cell.\n result.displayedFooters = result.displayedColumns.filter(val => val !== this.#COLUMNS.SUBINFORMATION && val !== this.#COLUMNS.FILLER);\n if (option.filler?.enabled) {\n // Footer cũng cần filler cuối để giữ width đồng bộ với data row\n result.displayedFooters.push(this.#COLUMNS.FILLER);\n }\n if (option?.rowReorder?.enabled) {\n result.displayedColumns.unshift(this.#COLUMNS.REORDER);\n result.firstHeaders.unshift(this.#COLUMNS.REORDER);\n result.displayedFooters.unshift(this.#COLUMNS.REORDER);\n }\n return result;\n };\n\n init = (tableOption: SdTableOption) => {\n this.#storage?.destroy();\n this.#storage = this.#loadConfiguredTable(tableOption);\n return this.#storage;\n };\n\n persistColumnWidth = (field: string, width: string) => {\n if (!this.#storage) return;\n const current = this.#storage.get();\n const columns = current?.columns ? [...current.columns] : [];\n const idx = columns.findIndex(c => c.origin.field === field);\n if (idx < 0) {\n // Cột chưa có trong storage (vd cột mới thêm vào option) — bỏ qua;\n // sẽ được pick up qua flow loadConfigurationResult bình thường.\n return;\n }\n columns[idx] = { ...columns[idx], width };\n this.#storage.setSilent({ ...current, columns });\n this.#widthChange.next({ field, width });\n };\n\n #default = (tableOption: SdTableOption): ConfiguredTable => {\n const columns: ConfiguredColumn[] =\n tableOption?.columns\n ?.filter(e => !e.hidden)\n .map(e => ({\n origin: {\n field: e.field,\n title: typeof e.title === 'string' ? e.title : e.title?.title,\n width: e.width,\n invisible: e.invisible,\n fixed: e.fixed,\n truncate: e?.cell?.truncate?.enable,\n },\n title: typeof e.title === 'string' ? e.title : e.title?.title,\n width: e.width,\n invisible: e.invisible,\n fixed: e.fixed,\n truncate: e?.cell?.truncate?.enable,\n })) || [];\n return {\n columns,\n };\n };\n}\n","import { DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { CdkTableModule } from '@angular/cdk/table';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, computed, inject, input, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { FormsModule } from '@angular/forms';\nimport { MatTable, MatTableModule } from '@angular/material/table';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { SdConfirmService } from '@sdcorejs/angular/services/confirm';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { ConfiguredColumn, ConfiguredTable, ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { ConfigService } from '../../services/config.service';\n\n@Component({\n selector: 'config',\n templateUrl: './config.component.html',\n styleUrl: './config.component.scss',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTableModule,\n CdkTableModule,\n DragDropModule,\n SdButton,\n SdCheckbox,\n SdIcon,\n SdInput,\n SdModal,\n SdTranslatePipe,\n ],\n providers: [ConfigService],\n})\nexport class ConfigComponent {\n // ==========================================\n // 1. SIGNAL INPUTS / OUTPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n tableOption = input<SdTableOption | undefined>(undefined);\n changes = output<ConfiguredTableResult>();\n\n // Base autoId (đã là `components-table-<scope>` từ parent), '' khi parent không set.\n autoId = computed(() => this.autoIdInput() || '');\n\n // ==========================================\n // 2. SIGNAL QUERIES\n // ==========================================\n modal = viewChild<SdModal>(SdModal);\n table = viewChild.required<MatTable<SdTableColumn>>(MatTable);\n\n // ==========================================\n // 3. INJECT\n // ==========================================\n readonly #ref = inject(ChangeDetectorRef);\n readonly #confirmService = inject(SdConfirmService);\n readonly #configService = inject(ConfigService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 4. STATE\n // ==========================================\n configuration = signal<ConfiguredTable | undefined>(undefined);\n // dragDisabled không nên là signal (mutated trong drag handlers, không trigger render).\n dragDisabled = true;\n #setting?: SdStorageWithDefault<ConfiguredTable>;\n\n // ==========================================\n // 5. WINDOW MOUSEUP — tự destroy qua takeUntilDestroyed (thay @HostListener)\n // ==========================================\n constructor() {\n fromEvent(window, 'mouseup')\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n this.dragDisabled = true;\n });\n }\n\n // ==========================================\n // 6. PUBLIC API\n // ==========================================\n open = async () => {\n const opt = this.tableOption();\n if (!opt) return;\n this.#setting = this.#configService.init(opt)!;\n this.configuration.set(this.#setting?.get());\n this.modal()?.open();\n };\n\n close = () => {\n this.modal()?.close();\n };\n\n onSave = () => {\n const cfg = this.configuration();\n if (cfg) this.#setting?.set(cfg);\n this.modal()?.close();\n this.#ref.detectChanges();\n };\n\n onReset = async () => {\n this.#confirmService.confirm(this.#i18n.t('core.component.table.config.confirm-reset')).then(() => {\n this.#setting?.remove();\n this.modal()?.close();\n this.#ref.detectChanges();\n });\n };\n\n /**\n * Cột đang tắt hiển thị thì tiêu đề / độ rộng / cố định / giới hạn ký tự đều vô nghĩa —\n * khoá chúng lại để row nói rõ trạng thái, chỉ chừa ô \"Hiển thị\" để bật lại.\n */\n isRowDisabled = (item: ConfiguredColumn): boolean => !!item?.invisible;\n\n dropTable(event: any) {\n const cols = this.configuration()?.columns;\n if (!cols) return;\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\n this.table().renderRows();\n }\n\n handleMouseDown() {\n this.dragDisabled = false;\n }\n\n handleMouseUp() {\n this.dragDisabled = true;\n }\n}\n","@let _configuration = configuration();\n@let _autoId = autoId();\n@let _columns = ['invisible', 'title', 'width', 'fixed', 'truncate'];\n\n<sd-modal width=\"sm\" [title]=\"'core.component.table.setup' | sdTranslate\" #modal>\n @if (_configuration) {\n <div class=\"c-container sd-table-config\">\n <!-- why: drag handle là affordance duy nhất cho việc đổi thứ tự cột, và nó không tự nói ra\n điều đó — một dòng hint tránh việc người dùng không bao giờ phát hiện tính năng.\n Ký hiệu ⠿ nằm SẴN trong chuỗi i18n (đúng vị trí trong câu), nên không kèm icon riêng. -->\n <p class=\"c-hint\">{{ 'core.component.table.config.drag-hint' | sdTranslate }}</p>\n\n <div class=\"c-table\">\n <table\n mat-table\n [dataSource]=\"_configuration.columns!\"\n cdkDropList\n [cdkDropListData]=\"_configuration.columns\"\n (cdkDropListDropped)=\"dropTable($event)\">\n <ng-container matColumnDef=\"invisible\">\n <th mat-header-cell class=\"c-th\" *matHeaderCellDef>\n {{ 'core.component.form-builder.display' | sdTranslate }}\n </th>\n <td mat-cell *matCellDef=\"let item\">\n <div class=\"c-display-cell\">\n <button\n type=\"button\"\n class=\"c-handle\"\n [title]=\"'core.component.table.config.drag-handle' | sdTranslate\"\n [attr.aria-label]=\"'core.component.table.config.drag-handle' | sdTranslate\"\n (mousedown)=\"handleMouseDown()\"\n (mouseup)=\"handleMouseUp()\">\n <sd-icon name=\"drag_indicator\" aria-hidden=\"true\"></sd-icon>\n </button>\n <!-- why: ô \"Hiển thị\" KHÔNG bao giờ bị khoá — nó là đường duy nhất để bật lại một\n cột đã tắt. -->\n <sd-checkbox [model]=\"!item.invisible\" (modelChange)=\"item.invisible = !item.invisible\" />\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell class=\"c-th\" *matHeaderCellDef>\n {{ 'core.component.table.column-header' | sdTranslate }}\n </th>\n <td mat-cell *matCellDef=\"let item\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"item?.origin?.title\"\n [(model)]=\"item.title\"\n [disabled]=\"isRowDisabled(item)\"\n hideInlineError></sd-input>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"width\">\n <th mat-header-cell class=\"c-th c-col-width\" *matHeaderCellDef>\n {{ 'core.component.table.width' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-width\" *matCellDef=\"let item\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"item?.origin?.width\"\n [(model)]=\"item.width\"\n [disabled]=\"isRowDisabled(item)\"\n hideInlineError></sd-input>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"fixed\">\n <th mat-header-cell class=\"c-th c-col-toggle\" *matHeaderCellDef>\n {{ 'core.component.table.fixed' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-toggle\" *matCellDef=\"let item\">\n <sd-checkbox [(model)]=\"item.fixed\" [disabled]=\"isRowDisabled(item)\" />\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"truncate\">\n <th mat-header-cell class=\"c-th c-col-toggle\" *matHeaderCellDef>\n {{ 'core.component.table.char-limit' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-toggle\" *matCellDef=\"let item\">\n <sd-checkbox [(model)]=\"item.truncate\" [disabled]=\"isRowDisabled(item)\" />\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"_columns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: _columns\"\n [class.c-row-hidden]=\"isRowDisabled(row)\"\n cdkDrag\n [cdkDragData]=\"row\"\n cdkDragLockAxis=\"y\"\n [cdkDragDisabled]=\"dragDisabled\">\n </tr>\n </table>\n </div>\n </div>\n }\n <ng-container sdFooterRight>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-skip' : null\"\n (click)=\"close()\"\n [title]=\"'core.component.table.skip' | sdTranslate\"\n color=\"secondary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-reset' : null\"\n (click)=\"onReset()\"\n [title]=\"'core.component.form-builder.default' | sdTranslate\"\n color=\"primary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-apply' : null\"\n (click)=\"onSave()\"\n [title]=\"'core.component.table.apply' | sdTranslate\"\n type=\"fill\"\n color=\"primary\">\n </sd-button>\n </ng-container>\n</sd-modal>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Pipe,\n PipeTransform,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { SdTooltipDirective } from '@sdcorejs/angular/directives';\nimport { SdTableColumn } from '../../../models/table-column.model';\nimport { SdTableItem } from '../../../models/table-item.model';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Pipe({\n name: 'asString',\n standalone: true,\n})\nexport class ToStringPipe implements PipeTransform {\n transform(value: any): string {\n return value !== null && value !== undefined ? String(value) : '';\n }\n}\n\n@Component({\n selector: 'view',\n templateUrl: './view.component.html',\n styleUrl: './view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdBadge, SdSafeHtmlPipe, SdTooltipDirective, ToStringPipe, SdTranslatePipe],\n})\nexport class ViewComponent {\n // Inject\n #cdr = inject(ChangeDetectorRef);\n\n contentContainer = viewChild<ElementRef<HTMLElement>>('contentContainer');\n\n isCollapsed = signal<boolean>(true);\n isOverflowing = signal<boolean>(false);\n\n // Inputs\n autoId = input.required<string | undefined | null>();\n column = input.required<SdTableColumn>();\n item = input.required<SdTableItem>();\n\n truncateEnable = computed(() => {\n return this.column()?.cell?.truncate?.enable;\n });\n\n truncateWidth = computed(() => {\n return this.column()?.width;\n });\n\n constructor() {\n effect(() => {\n this.truncateWidth();\n const container = this.contentContainer();\n if (container) {\n this.#checkOverflow(container.nativeElement);\n }\n });\n }\n\n #checkOverflow = (element: HTMLElement) => {\n // Ném vào queue để đợi DOM render\n setTimeout(() => {\n const hasOverflow = element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;\n if (this.isOverflowing() !== hasOverflow) {\n this.isOverflowing.set(hasOverflow);\n this.#cdr.markForCheck();\n }\n });\n };\n\n toggle = () => {\n this.isCollapsed.update(current => !current);\n };\n\n // why: ô HTML có `view.click` nay là role=\"button\" + tabindex=\"0\" nên Enter/Space phải chạy\n // đúng như click. `view.data` là HTML do consumer cung cấp và có thể chứa control riêng —\n // chỉ xử lý khi CHÍNH ô đang giữ focus để không kích hoạt hai lần.\n onViewKeydown = (event: KeyboardEvent) => {\n if (event.target !== event.currentTarget) return;\n // why: chặn Space cuộn trang.\n event.preventDefault();\n this.item().meta.display[this.column().field]?.click?.();\n };\n}\n","@let _column = column();\n@let _item = item();\n@let _autoId = autoId();\n\n@let view = _item.meta.display[_column.field];\n@let _truncateEnable = truncateEnable();\n@let _truncateWidth = truncateWidth();\n@let _isCollapsed = isCollapsed();\n@let isExpandByMore = isOverflowing() && _column?.cell?.truncate?.type === 'more';\n@let isExpandByTooltip = isOverflowing() && _column?.cell?.truncate?.type === 'tooltip';\n\n@if (view) {\n @if (view.isHtml) {\n @if (view.click) {\n <!-- why: bỏ aria-hidden=\"true\" — ô này có (click) thật nên nó là một control; aria-hidden\n vừa xoá nội dung ô khỏi accessibility tree vừa để lại một vùng bấm chuột \"câm\".\n Nay là role=\"button\" + tabindex=\"0\" + Enter/Space chạy đúng như click. -->\n <div\n #contentContainer\n [attr.data-autoId]=\"_autoId\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"view.click()\"\n (keydown.enter)=\"onViewKeydown($event)\"\n (keydown.space)=\"onViewKeydown($event)\"\n class=\"text-break cursor-pointer\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? htmlClickTooltip : '')\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"_truncateEnable\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n\n <ng-template #htmlClickTooltip>\n <div\n class=\"c-tooltip-inner-content\"\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <div [innerHTML]=\"view.data | sdSafeHtml\"></div>\n </div>\n </ng-template>\n } @else {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"_isCollapsed\"\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? htmlTooltip : '')\"\n containerClass=\"c-tooltip-html-d374bd93-f136-425c-bcc2-2d88cb163e44\"\n container=\"body\"\n placement=\"bottom\"\n [sdTooltipDelay]=\"100\"\n [style]=\"view.cellStyle\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n\n <ng-template #htmlTooltip>\n <div\n class=\"c-tooltip-inner-content\"\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <div [innerHTML]=\"view.data | sdSafeHtml\"></div>\n </div>\n </ng-template>\n\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">{{ _isCollapsed ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}</button>\n }\n } @else {\n <div\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [sdTooltip]=\"view.tooltip || ''\"\n [style]=\"view.cellStyle\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n }\n <!-- End -->\n }\n } @else {\n <!-- Nếu là giá trị lấy hiển thị lấy trực tiếp từ field -->\n @if (view.badge) {\n @if (view.data) {\n <sd-badge\n [attr.data-autoId]=\"_autoId\"\n [type]=\"view.badge.type\"\n [title]=\"view.data\"\n [color]=\"view.badge.color\"\n [icon]=\"view.badge.icon\"\n [sdTooltip]=\"view.tooltip || ''\"\n (click)=\"!!view.click && view.click()\">\n </sd-badge>\n }\n } @else {\n @if (view.click) {\n <div\n #contentContainer\n class=\"text-break\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis]=\"_truncateEnable\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? view.data : '') | asString\">\n <a [attr.data-autoId]=\"_autoId\" href=\"javascript:;\" (click)=\"view.click()\">\n {{ view.data }}\n </a>\n </div>\n } @else {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis]=\"_isCollapsed\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? view.data : '') | asString\">\n {{ view.data }}\n </div>\n\n <!-- Nếu option xem full thông tin là \"btn xem thêm\" -->\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">{{ _isCollapsed ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}</button>\n }\n } @else {\n <div [attr.data-autoId]=\"_autoId\" class=\"text-break\" [style]=\"view.cellStyle\" [sdTooltip]=\"view.tooltip || ''\">\n {{ view.data }}\n </div>\n }\n <!-- End -->\n }\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n signal,\n TemplateRef,\n viewChild,\n computed,\n effect,\n inject,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SdTableCellDefDirective } from '../../directives/sd-table-cell-def.directive';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTooltipDirective } from '@sdcorejs/angular/directives';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ViewComponent } from './view/view.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'desktop-cell',\n templateUrl: './desktop-cell.component.html',\n styleUrl: './desktop-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdTooltipDirective, ViewComponent, SdTranslatePipe],\n})\nexport class DesktopCellComponent {\n // Inject\n #cdr = inject(ChangeDetectorRef);\n\n // ViewChild\n contentContainer = viewChild<ElementRef<HTMLElement>>('contentContainer');\n\n // Inputs\n column = input.required<SdTableColumn>();\n item = input.required<SdTableItem>();\n cellDef = input.required<Record<string, SdTableCellDefDirective>>({});\n\n value = computed(() => {\n return Utilities.getNestedValue(this.item()?.data, this.column()?.field);\n });\n\n key = computed(() => {\n const data = this.item()?.data;\n return data?.id?.toString() || data?.code?.toString() || data?.value?.toString() || '';\n });\n\n autoId = computed(() => {\n const column = this.column();\n const key = this.key();\n return `${key}_${column.field}`;\n });\n\n truncateEnable = computed(() => {\n return this.column()?.cell?.truncate?.enable;\n });\n\n truncateWidth = computed(() => {\n return this.column()?.width;\n });\n\n // why: widen to TemplateRef<any> so ng-packagr doesn't try to surface the\n // directive's internal Context type through this public computed.\n templateRef = computed<TemplateRef<any> | undefined>(() => {\n const cellDef = this.cellDef();\n const column = this.column();\n return cellDef[column?.field]?.templateRef || column?.cell?.templateRef;\n });\n\n isCollapsed = signal<boolean>(true);\n isOverflowing = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n this.truncateWidth();\n const container = this.contentContainer();\n if (container) {\n this.#checkOverflow(container.nativeElement);\n }\n });\n }\n\n toggle = () => {\n this.isCollapsed.update(current => !current);\n };\n\n #checkOverflow = (element: HTMLElement): void => {\n // Ném vào queue để đợi DOM render\n setTimeout(() => {\n const hasOverflow = element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;\n if (this.isOverflowing() !== hasOverflow) {\n this.isOverflowing.set(hasOverflow);\n this.#cdr.markForCheck();\n }\n });\n };\n}\n","@let _column = column();\n@let _item = item();\n@let _autoId = autoId();\n\n@let _truncateEnable = truncateEnable();\n@let _truncateWidth = truncateWidth();\n@let isExpandByMore = isOverflowing() && _column?.cell?.truncate?.type === 'more';\n@let isExpandByTooltip = isOverflowing() && _column?.cell?.truncate?.type === 'tooltip';\n\n@let _templateRef = templateRef();\n@let context =\n {\n item: _item.data,\n column: _column,\n autoId: _autoId,\n };\n\n@if (_templateRef) {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"isCollapsed()\"\n [sdTooltip]=\"isExpandByTooltip ? htmlTooltip : ''\">\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n </div>\n\n <!-- Nếu option xem full thông tin là \"tooltip\" -->\n <ng-template #htmlTooltip>\n <div\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n </div>\n </ng-template>\n\n <!-- Nếu option xem full thông tin là \"btn xem thêm\" -->\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">\n {{ isCollapsed() ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}\n </button>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n }\n} @else {\n <view [column]=\"column()\" [item]=\"item()\" [autoId]=\"context.autoId\" />\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableCommand, SdTableCommandNormal } from '../../../models/table-command.model';\nimport { SdTableItem } from '../../../models/table-item.model';\n\n/**\n * Resolves command metadata for the current row once, then lets the template reuse it with `@let`.\n */\n@Pipe({ name: 'command', standalone: true })\nexport class CommandPipe implements PipeTransform {\n transform(item: SdTableItem, command: SdTableCommand): CommandMeta {\n return {\n disabled: this.#disabled(item, command),\n title: this.#title(item, command),\n icon: this.#icon(item, command),\n htmlTemplate: this.#htmlTemplate(item, command),\n };\n }\n\n #disabled = (item: SdTableItem, command: SdTableCommand): boolean => {\n const d = command?.disabled;\n if (d == null) return false;\n return typeof d === 'boolean' ? d : d(item.data);\n };\n\n #title = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.title) return '';\n return typeof command.title === 'string' ? command.title : command.title(item.data);\n };\n\n #icon = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.icon) return '';\n return typeof command.icon === 'string' ? command.icon : command.icon(item.data);\n };\n\n // Only child commands can provide htmlTemplate.\n #htmlTemplate = (item: SdTableItem, command: SdTableCommand): string | undefined => {\n const tpl = (command as SdTableCommandNormal)?.htmlTemplate;\n return typeof tpl === 'function' ? tpl(item.data) : undefined;\n };\n}\n\nexport interface CommandMeta {\n disabled: boolean;\n title: string;\n icon: string;\n htmlTemplate: string | undefined;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\nimport { SdTableCommand, SdTableCommandChildren, SdTableCommandNormal } from '../../../models/table-command.model';\nimport { SdTableItem } from '../../../models/table-item.model';\n\n/**\n * Filters visible commands and pre-resolves icon, title, and stable key for the current row.\n */\n@Pipe({ name: 'filter', standalone: true })\nexport class CommandFilterPipe implements PipeTransform {\n async transform(item: SdTableItem, commands: SdTableCommand[]): Promise<Command[]> {\n const results: Command[] = [];\n if (!commands) return results;\n\n for (const command of commands) {\n if (!(await this.#visible(item, command))) continue;\n\n const icon = this.#icon(item, command);\n const title = this.#title(item, command);\n\n if ('children' in command) {\n const children: CommandNormal[] = [];\n for (const child of command.children) {\n if (!(await this.#visible(item, child))) continue;\n children.push({\n ...child,\n type: 'normal',\n icon: this.#icon(item, child),\n title: this.#title(item, child),\n key: this.#key(item, child),\n });\n }\n if (children.length > 0) {\n results.push({\n ...command,\n type: 'children',\n icon,\n title,\n key: this.#key(item, command),\n children,\n });\n }\n } else {\n results.push({\n ...command,\n type: 'normal',\n icon,\n title,\n key: this.#key(item, command),\n });\n }\n }\n return results;\n }\n\n #visible = async (item: SdTableItem, command: SdTableCommand): Promise<boolean> => {\n const { hidden } = command;\n if (hidden === undefined) return true;\n if (typeof hidden === 'boolean') return !hidden;\n const result = hidden(item.data);\n return !(result instanceof Promise ? await result : result);\n };\n\n #icon = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.icon) return 'more_vert';\n return typeof command.icon === 'string' ? command.icon : command.icon(item.data);\n };\n\n #title = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.title) return '';\n return typeof command.title === 'string' ? command.title : command.title(item.data);\n };\n\n // Stable autoId key generated from resolved icon and title.\n #key = (item: SdTableItem, command: SdTableCommand): string => {\n const icon = this.#icon(item, command);\n const title = this.#title(item, command);\n return `${icon || 'noicon'}-${StringUtilities.changeAliasLowerCase(title) || 'notitle'}`;\n };\n}\n\ntype Command<T = any> = CommandNormal<T> | CommandChildren<T>;\n\ninterface CommandNormal<T = any> extends SdTableCommandNormal<T> {\n type: 'normal';\n key: string;\n title: string;\n icon: string;\n}\n\ninterface CommandChildren<T = any> extends SdTableCommandChildren<T> {\n type: 'children';\n key: string;\n title: string;\n icon: string;\n children: CommandNormal<T>[];\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdTableCommand } from '../../models/table-command.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { CommandPipe } from './pipes/command.pipe';\nimport { CommandFilterPipe } from './pipes/filter.pipe';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'desktop-command',\n templateUrl: './desktop-command.component.html',\n styleUrl: './desktop-command.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n '[attr.data-autoid]': 'autoId()',\n },\n imports: [SdIcon, CommonModule, MatTooltipModule, MatMenuModule, MatButtonModule, CommandPipe, CommandFilterPipe],\n})\nexport class DesktopCommand {\n readonly autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n readonly item = input.required<SdTableItem>();\n readonly itemIndex = input.required<number>();\n readonly commands = input<SdTableCommand[] | null | undefined>([]);\n\n // Row key for autoId: prefer id, then code, then value, then itemIndex.\n readonly itemKey = computed(() => {\n const data = this.item()?.data as Record<string, unknown> | undefined;\n return data?.['id']?.toString() || data?.['code']?.toString() || data?.['value']?.toString() || this.itemIndex().toString();\n });\n\n // Host autoId: `<base>-command-<itemKey>`. Template appends command and child keys.\n readonly autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-command-${this.itemKey()}` : '';\n });\n\n readonly _commands = computed(() => this.commands() || []);\n}\n","@let _autoId = autoId();\n@let _item = item();\n@let filteredCommands = _item | filter: _commands() | async;\n\n@if (filteredCommands?.length) {\n @for (command of filteredCommands; track command.key) {\n @let _meta = _item | command: command;\n @if (command.type === 'normal') {\n <!-- why: bỏ aria-hidden=\"true\" — đây là <button> THẬT, vẫn nhận tab focus nhưng screen reader\n không đọc được gì (nút chỉ có icon, không có text). Thay bằng aria-label lấy từ chính\n tiêu đề command đang hiển thị ở tooltip. -->\n <button\n type=\"button\"\n [attr.data-autoid]=\"_autoId + '-' + command.key\"\n (click)=\"command.click(_item.data)\"\n [matTooltip]=\"_meta.title\"\n [attr.aria-label]=\"_meta.title\"\n [disabled]=\"_meta.disabled\"\n mat-icon-button>\n <sd-icon class=\"c-icon\" [color]=\"command.color || 'secondary'\" [fontSet]=\"command.fontSet\" [name]=\"_meta.icon\"></sd-icon>\n </button>\n } @else {\n <!-- why: nút mở menu con — cũng bỏ aria-hidden và gắn aria-label + aria-haspopup=\"menu\". -->\n <button\n type=\"button\"\n [attr.data-autoid]=\"_autoId + '-' + command.key\"\n [matMenuTriggerFor]=\"menu\"\n [attr.aria-label]=\"_meta.title\"\n aria-haspopup=\"menu\"\n mat-icon-button>\n @if (_meta.icon) {\n <sd-icon class=\"c-icon\" [fontSet]=\"command.fontSet\" [name]=\"_meta.icon\"></sd-icon>\n } @else {\n <sd-icon class=\"c-icon\" [fontSet]=\"command.fontSet\" name=\"more_vert\"></sd-icon>\n }\n </button>\n <mat-menu #menu=\"matMenu\" [attr.data-autoid]=\"_autoId + '-' + command.key + '-menu'\">\n <span>\n @for (childCommand of command.children; track childCommand.key) {\n @let _childMeta = _item | command: childCommand;\n <button\n [attr.data-autoid]=\"_autoId + '-' + command.key + '-' + childCommand.key\"\n mat-menu-item\n (click)=\"childCommand.click(_item.data)\"\n [disabled]=\"_childMeta.disabled\">\n @if (_childMeta.htmlTemplate) {\n <div [innerHTML]=\"_childMeta.htmlTemplate\"></div>\n } @else {\n <span class=\"sd-command-menu-item__content\">\n <sd-icon class=\"sd-command-menu-item__icon\"\n [color]=\"childCommand.color || 'secondary'\"\n [fontSet]=\"childCommand.fontSet\" [name]=\"_childMeta.icon\"></sd-icon>\n <span class=\"sd-command-menu-item__title\">{{ _childMeta.title }}</span>\n </span>\n }\n </button>\n }\n </span>\n </mat-menu>\n }\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, inject, input, output } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { CommonModule } from '@angular/common';\nimport { FormGroup } from '@angular/forms';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatSelectionList } from '@angular/material/list';\nimport { MatTableModule } from '@angular/material/table';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdConfirmService, SdExcelColumn, SdExcelService, SdLoadingService, SdNotifyService } from '@sdcorejs/angular/services';\n// import hash from 'object-hash';\nimport { SdTableColumn, SdTableOption } from '../../models';\nimport { ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOptionExportDefault } from '../../models/table-option-export.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdExcelSheet } from '@sdcorejs/angular/services/excel';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-popup-export',\n templateUrl: './popup-export.component.html',\n styleUrl: './popup-export.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SdIcon, CommonModule, MatTableModule, MatChipsModule, SdButton, SdInput, SdModal],\n})\nexport class SdPopupExport {\n private ref = inject(ChangeDetectorRef);\n private loadingService = inject(SdLoadingService);\n private excelService = inject(SdExcelService);\n private notifyService = inject(SdNotifyService);\n private confirmService = inject(SdConfirmService);\n\n tableOption!: SdTableOption;\n columns: SdExcelColumn[] = [];\n templateName?: string | null;\n enableCreating = false;\n @ViewChild('modal') modal?: SdModal;\n @ViewChild('listGroups') listGroups?: MatSelectionList;\n\n selected: Record<string, boolean> = {};\n files: any[] = [];\n\n readonly export = output<{\n file: any | null;\n columns: SdExcelColumn[];\n isCSV?: boolean;\n }>();\n form = new FormGroup({});\n\n exportOption?: SdTableOptionExportDefault;\n @Input('tableOption') set _tableOption(option: SdTableOption) {\n this.tableOption = option;\n if (option.export?.type === 'default') {\n this.exportOption = option.export;\n }\n this.columns = this.#getExportableColumns();\n }\n readonly configuration = input<ConfiguredTableResult>();\n private get key(): string | null {\n const prefix = '93889e78-f971-4a1d-8c73-fe2321af9233';\n if (!this.exportOption?.key) {\n return null;\n }\n return Utilities.hash({\n prefix,\n key: this.exportOption?.key,\n });\n }\n\n private get tableColumns() {\n const columns: SdExcelColumn[] = [];\n this.tableOption.columns\n .filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children\n ?.filter(e => !e.export?.disabled)\n .forEach(childColumn => {\n columns.push({\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n field: childColumn.field,\n width: childColumn.width,\n });\n });\n return;\n }\n columns.push({\n title: typeof column.title === 'string' ? column.title : column.title?.title,\n field: column.field,\n width: column.width,\n });\n });\n return columns.map(e => ({\n field: e.field,\n title: e.title,\n description: e.description,\n width: e.width,\n }));\n }\n private get additionalColumns() {\n return (this.exportOption?.columns?.filter(e => !e.export?.disabled) || []).map(e => ({\n field: e.field,\n title: e.title,\n description: e.description,\n width: e.width,\n }));\n }\n\n #getExportableColumns = (): SdExcelColumn[] => {\n return [...this.tableColumns, ...this.additionalColumns];\n };\n\n readonly #i18n = inject(I18nService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n open = async () => {\n if (!this.key) {\n this.exportDefault();\n return;\n }\n this.loadFiles();\n this.selected = {};\n this.modal?.open();\n this.ref.detectChanges();\n };\n\n #getExportColumns = (): SdExcelColumn[] => {\n const configuration = this.configuration();\n if (configuration) {\n const columns = [...this.tableColumns];\n const { firstColumns, secondColumns } = configuration;\n const displayColumns: SdTableColumn[] = [...firstColumns, ...secondColumns].reduce<SdTableColumn[]>((first, next) => {\n const column = this.tableOption.columns.find(e => e.field === next.field);\n if (!column) {\n return first;\n }\n if (column.type !== 'children') {\n return [...first, column];\n }\n return [...first, ...column.children];\n }, []);\n const results = displayColumns\n .map(e => ({\n ...e,\n data: columns.find(e1 => e1.field === e.field),\n }))\n .filter(e => !!e.data)\n .map(e => e.data!);\n return [...results, ...this.additionalColumns];\n } else {\n return this.columns;\n }\n };\n\n exportDefault = () => {\n this.export.emit({\n file: null,\n columns: this.#getExportColumns(),\n isCSV: false,\n });\n };\n\n exportCSV = () => {\n this.export.emit({\n file: null,\n columns: this.#getExportColumns(),\n isCSV: true,\n });\n };\n\n loadFiles = async (group: string | undefined = undefined) => {\n // TODO: Fix\n // this.files = await this.exportService.filesInFolder({\n // key: this.key!,\n // group,\n // });\n // this.ref.markForCheck();\n };\n\n #initTemplate = async (fileName?: string) => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.exportOption?.sheets)) {\n for (const sheet of this.exportOption.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n return await this.excelService.generateTemplate({\n fileName: fileName || this.exportOption?.fileName,\n columns: this.columns,\n sheets,\n });\n };\n\n generateTemplate = async () => {\n this.loadingService.start();\n await this.#initTemplate().finally(this.loadingService.stop);\n };\n\n generateAndUploadTemplate = async (fileName?: string) => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.exportOption?.sheets)) {\n for (const sheet of this.exportOption.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n // TODO: Fix\n // return await this.exportService.generateUploadTemplate({\n // key: this.key!,\n // template: {\n // fileName: fileName || this.tableOption?.export?.fileName,\n // columns: this.columns.filter(e => this.selected[e.field]),\n // sheets,\n // },\n // });\n };\n\n onExport = (file: any) => {\n this.export.emit({\n file,\n columns: this.columns,\n });\n this.ref.detectChanges();\n };\n\n uploadTemplate = async () => {\n // TODO: Fix\n // const file = await this.exportService.uploadTemplate({\n // key: this.key!,\n // });\n // if (file) {\n // this.files = [...this.files, file];\n // this.ref.detectChanges();\n // }\n };\n\n removeFile = (file: any) => {\n this.confirmService.confirm('Remove template').then(() => {\n // TODO: Fix\n // this.exportService.removeFile({\n // key: this.key!,\n // fileName: file.fileName,\n // });\n const idx = this.files.indexOf(file);\n this.files.splice(idx, 1);\n this.files = [...this.files];\n this.ref.detectChanges();\n });\n };\n\n createTemplate = async () => {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n if (!this.columns.some(e => this.selected[e.field])) {\n this.notifyService.warning(this.#i18n.t('core.component.table.popup-export.select-columns'));\n return;\n }\n this.loadingService.start();\n const fileName = this.templateName + '.xlsx';\n try {\n const result = await this.generateAndUploadTemplate(fileName);\n // TODO: Fix\n // if (result?.filePath) {\n // const file: SdExportFile = {\n // filePath: result.filePath,\n // fileName: result.fileName,\n // };\n // this.onExport(file);\n // this.templateName = null;\n // this.enableCreating = false;\n // this.files = [...this.files, file];\n // this.ref.detectChanges();\n // }\n } finally {\n this.loadingService.stop();\n }\n };\n\n templateNameValidator = (val: string): string => {\n const regex = /^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$/;\n if (!val) {\n return 'Please enter your template name';\n }\n if (val.length > 50) {\n return 'Template name is too long';\n }\n if (!regex.test(val)) {\n return 'Template name only contains letters, numbers and spaces';\n }\n return '';\n };\n}\n","<sd-modal width=\"907px\" [title]=\"'Exported template'\" #modal>\n <div class=\"row\">\n <div *ngIf=\"!files?.length\" class=\"col-12\">\n <div class=\"c-empty\">\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" />\n <div class=\"T14R\">{{ 'There are no exported templates' }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"files?.length\">\n <div class=\"col-12\">\n <div class=\"c-table\" style=\"max-height: 50vh\">\n <table mat-table [dataSource]=\"files\">\n <ng-container matColumnDef=\"stt\">\n <th mat-header-cell class=\"c-th text-center px-5\" *matHeaderCellDef style=\"width: 50px\">#</th>\n <td class=\"text-center px-5\" mat-cell *matCellDef=\"let item; let idx = index\">\n {{ idx + 1 }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"fileName\">\n <th mat-header-cell class=\"c-th px-5\" *matHeaderCellDef>\n {{ 'File name' }}\n </th>\n <td class=\"px-5\" mat-cell *matCellDef=\"let item\">\n {{ item.fileName }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell class=\"c-th px-5\" *matHeaderCellDef style=\"width: 80px\"></th>\n <td class=\"px-5\" mat-cell *matCellDef=\"let item\">\n <div class=\"d-flex\">\n <button mat-icon-button aria-label=\"delete\" (click)=\"removeFile(item)\">\n <sd-icon name=\"delete\"></sd-icon>\n </button>\n <button mat-icon-button aria-label=\"download\" (click)=\"onExport(item)\">\n <sd-icon name=\"download\"></sd-icon>\n </button>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"['stt', 'fileName', 'action']; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['stt', 'fileName', 'action']\"></tr>\n </table>\n </div>\n </div>\n <div *ngIf=\"files.length < 5\" class=\"col-12 mt-10\">\n <sd-button class=\"mr-4\" [title]=\"'New template'\" (click)=\"enableCreating = true\" color=\"info\" [disabled]=\"enableCreating\">\n </sd-button>\n <sd-button *ngIf=\"exportOption?.enableUpload\" [title]=\"'Upload template'\" (click)=\"uploadTemplate()\" type=\"outline\">\n </sd-button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableCreating || !files?.length\">\n <div class=\"col-12 mt-20\">\n <div class=\"T14R\">{{ 'Select columns for creating template' }}:</div>\n </div>\n <div class=\"col-12\">\n <mat-chip-listbox selectable=\"true\" multiple=\"true\">\n <ng-container *ngFor=\"let column of columns\">\n <mat-chip-option [selected]=\"selected[column.field]\" (click)=\"selected[column.field] = !selected[column.field]\">\n {{ column.title }}\n </mat-chip-option>\n </ng-container>\n </mat-chip-listbox>\n </div>\n <div class=\"col-12 row\">\n <div class=\"col-10\">\n <sd-input [form]=\"form\" [label]=\"'Template name'\" [(model)]=\"templateName\" [validator]=\"templateNameValidator\"></sd-input>\n </div>\n <div class=\"col-2 mt-8\">\n <sd-button width=\"100%\" [title]=\"'Save'\" color=\"info\" (click)=\"createTemplate()\"> </sd-button>\n </div>\n </div>\n </ng-container>\n </div>\n</sd-modal>\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n column: SdTableColumn<T>;\n field: string;\n disabled?: boolean;\n}\n\n@Directive({\n selector: '[sdTableColumnFilterDef]',\n})\nexport class SdTableColumnFilterDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableColumnFilterDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableColumnFilterDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","// sticky-shadow.directive.ts\nimport { afterNextRender, Directive, DestroyRef, ElementRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent, Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/** Cửa sổ gộp (ms) cho cả scroll lẫn mutation — xem chú thích ở constructor. */\nconst SHADOW_UPDATE_DEBOUNCE_MS = 10;\n\n/**\n * Directive thêm hiệu ứng đổ bóng (elevation-2) vào cột sticky cuối cùng bên trái\n * và cột sticky đầu tiên bên phải, tạo ngăn cách trực quan với phần được scroll.\n *\n * Chỉ dùng nội bộ trong sd-table, không chìa ra ngoài.\n *\n * Gắn vào scroll container của table:\n * @example\n * <div class=\"c-table\" stickyShadow>...</div>\n */\n@Directive({\n selector: '[stickyShadow]',\n standalone: true,\n})\nexport class StickyShadowDirective {\n readonly #el = inject(ElementRef<HTMLElement>);\n readonly #destroyRef = inject(DestroyRef);\n\n constructor() {\n afterNextRender(() => {\n const container = this.#el.nativeElement;\n\n // why: MutationObserver bắn callback theo TỪNG batch DOM, mà CDK render row theo\n // nhiều batch liên tiếp; `#updateShadow` lại chạy `querySelectorAll` toàn bảng cho\n // MỖI cột sticky → render một trang 50 dòng quét lại bảng hàng chục lần. Gộp về\n // đúng 1 lần cho mỗi cụm mutation bằng cùng debounce với đường scroll (đã gộp sẵn).\n const mutation$ = new Subject<void>();\n mutation$.pipe(debounceTime(SHADOW_UPDATE_DEBOUNCE_MS), takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n this.#updateShadow(container);\n });\n\n // Dùng MutationObserver để detect khi CDK render rows mới vào table\n // (data load async, phân trang, ...) — lúc này td mới có đủ sticky classes\n const mutationObserver = new MutationObserver(() => mutation$.next());\n\n mutationObserver.observe(container, {\n childList: true, // Theo dõi thêm/bớt các node con\n subtree: true, // Bao gồm tất cả các cấp con cháu\n });\n\n // Cập nhật shadow mỗi khi user scroll ngang\n fromEvent(container, 'scroll')\n .pipe(debounceTime(SHADOW_UPDATE_DEBOUNCE_MS), takeUntilDestroyed(this.#destroyRef))\n .subscribe(() => this.#updateShadow(container));\n\n // Disconnect MutationObserver khi directive bị destroy\n this.#destroyRef.onDestroy(() => {\n mutationObserver.disconnect();\n mutation$.complete();\n });\n });\n }\n\n /**\n * Toggle class shadow lên tất cả th và td của một cột.\n * Dùng cdk-column-{field} để xác định cột vì Angular CDK\n * add class này đồng nhất lên cả th lẫn td.\n */\n #setShadow(container: HTMLElement, colClass: string, shadowClass: string, add: boolean) {\n container.querySelectorAll<HTMLElement>(`th.${colClass}, td.${colClass}`).forEach(el => {\n el.classList.toggle(shadowClass, add);\n // Cần position relative để ::after absolute hoạt động\n if (add) {\n el.style.position = 'sticky'; // Các cell sticky đã có sẵn, chỉ đảm bảo\n el.style.overflow = 'visible';\n }\n });\n }\n\n /**\n * Tính toán và cập nhật shadow dựa trên vị trí scroll hiện tại.\n *\n * Angular Material đánh dấu sticky left bằng class `mat-mdc-table-sticky-border-elem-left`\n * và sticky right bằng `mat-mdc-table-sticky-border-elem-right` — dùng các class này\n * để detect thay vì getComputedStyle vì reliable hơn.\n *\n * Chỉ apply shadow cho:\n * - Cột cuối cùng trong nhóm sticky-left (sát phần scroll)\n * - Cột đầu tiên trong nhóm sticky-right (sát phần scroll)\n */\n #updateShadow(container: HTMLElement) {\n const scrollLeft = container.scrollLeft;\n const scrollRight = container.scrollWidth - container.clientWidth - scrollLeft;\n\n // Query trên header row đầu tiên để xác định các cột sticky\n // td sẽ được xử lý thông qua #setShadow theo cdk-column class\n const headerRow = container.querySelector<HTMLElement>('tr.c-first-header');\n if (!headerRow) return;\n\n const allStickyLeft = Array.from(headerRow.querySelectorAll<HTMLElement>('th.mat-mdc-table-sticky-border-elem-left'));\n const allStickyRight = Array.from(headerRow.querySelectorAll<HTMLElement>('th.mat-mdc-table-sticky-border-elem-right'));\n\n // Reset shadow toàn bộ các cột sticky trước khi tính lại\n allStickyLeft.forEach(th => {\n const colClass = [...th.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-right', false);\n });\n allStickyRight.forEach(th => {\n const colClass = [...th.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-left', false);\n });\n\n // Chỉ cột cuối cùng sticky-left có shadow khi đang scroll sang phải\n const lastStickyLeft = allStickyLeft.at(-1);\n if (lastStickyLeft && scrollLeft > 0) {\n const colClass = [...lastStickyLeft.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-right', true);\n }\n\n // Chỉ cột đầu tiên sticky-right có shadow khi chưa scroll hết sang phải\n const firstStickyRight = allStickyRight.at(0);\n if (firstStickyRight && scrollRight > 0) {\n const colClass = [...firstStickyRight.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-left', true);\n }\n }\n}\n","import { Directive, ElementRef, NgZone, OnDestroy, Renderer2, effect, inject, input, output } from '@angular/core';\n\n@Directive({\n selector: '[sdColumnResize]',\n standalone: true,\n})\nexport class SdColumnResizeDirective implements OnDestroy {\n // Bật/tắt resize cho cell này\n sdColumnResize = input.required<boolean>();\n // min/max width tùy chọn (chuỗi 'NNpx'); nếu không phải px sẽ bỏ qua\n minWidth = input<string | undefined>();\n maxWidth = input<string | undefined>();\n // Emit width cuối cùng dạng 'NNpx' khi mouseup\n resizeEnd = output<string>();\n\n #el = inject(ElementRef<HTMLElement>);\n #renderer = inject(Renderer2);\n #zone = inject(NgZone);\n\n #handle?: HTMLElement;\n #unlistenMousedown?: () => void;\n #unlistenMove?: () => void;\n #unlistenUp?: () => void;\n #unlistenBlur?: () => void;\n\n #startX = 0;\n #startWidth = 0;\n #currentWidth = 0;\n\n constructor() {\n effect(() => {\n const enabled = this.sdColumnResize();\n if (enabled) {\n this.#enable();\n } else {\n this.#disable();\n }\n });\n }\n\n ngOnDestroy() {\n this.#disable();\n }\n\n #enable() {\n if (this.#handle) return;\n const th = this.#el.nativeElement;\n this.#renderer.addClass(th, 'sd-col-resize-host');\n\n const handle = this.#renderer.createElement('span');\n this.#renderer.addClass(handle, 'sd-col-resize-handle');\n this.#renderer.appendChild(th, handle);\n this.#handle = handle;\n\n // mousedown listen ngoài Angular zone — drag không trigger CD\n this.#zone.runOutsideAngular(() => {\n this.#unlistenMousedown = this.#renderer.listen(handle, 'mousedown', (e: MouseEvent) => this.#onMousedown(e));\n });\n }\n\n #disable() {\n this.#cleanupDrag();\n this.#unlistenMousedown?.();\n this.#unlistenMousedown = undefined;\n if (this.#handle) {\n this.#renderer.removeChild(this.#el.nativeElement, this.#handle);\n this.#handle = undefined;\n }\n this.#renderer.removeClass(this.#el.nativeElement, 'sd-col-resize-host');\n }\n\n #onMousedown = (event: MouseEvent) => {\n event.preventDefault();\n // stopPropagation để không trigger mat-sort khi click vào handle\n event.stopPropagation();\n\n const th = this.#el.nativeElement;\n this.#startX = event.clientX;\n this.#startWidth = th.getBoundingClientRect().width;\n this.#currentWidth = this.#startWidth;\n\n this.#renderer.setStyle(document.body, 'cursor', 'col-resize');\n this.#renderer.addClass(th, 'sd-resizing');\n\n this.#zone.runOutsideAngular(() => {\n this.#unlistenMove = this.#renderer.listen('document', 'mousemove', (e: MouseEvent) => this.#onMousemove(e));\n this.#unlistenUp = this.#renderer.listen('document', 'mouseup', () => this.#onMouseup());\n // Nếu user kéo ra ngoài window: cleanup an toàn\n this.#unlistenBlur = this.#renderer.listen('window', 'blur', () => this.#onMouseup());\n });\n };\n\n #onMousemove = (event: MouseEvent) => {\n const delta = event.clientX - this.#startX;\n const minPx = this.#parsePx(this.minWidth()) ?? 40;\n const maxPx = this.#parsePx(this.maxWidth()) ?? Number.POSITIVE_INFINITY;\n const w = Math.min(maxPx, Math.max(minPx, this.#startWidth + delta));\n this.#currentWidth = w;\n\n const th = this.#el.nativeElement;\n const px = `${w}px`;\n this.#renderer.setStyle(th, 'width', px);\n this.#renderer.setStyle(th, 'min-width', px);\n this.#renderer.setStyle(th, 'max-width', px);\n };\n\n #onMouseup = () => {\n const finalPx = `${Math.round(this.#currentWidth)}px`;\n this.#cleanupDrag();\n // emit trong Angular zone để consumer chạy CD bình thường\n this.#zone.run(() => this.resizeEnd.emit(finalPx));\n };\n\n #cleanupDrag() {\n this.#unlistenMove?.();\n this.#unlistenMove = undefined;\n this.#unlistenUp?.();\n this.#unlistenUp = undefined;\n this.#unlistenBlur?.();\n this.#unlistenBlur = undefined;\n this.#renderer.removeStyle(document.body, 'cursor');\n if (this.#el?.nativeElement) {\n this.#renderer.removeClass(this.#el.nativeElement, 'sd-resizing');\n }\n }\n\n #parsePx(value?: string): number | null {\n if (!value) return null;\n const m = /^(\\d+(?:\\.\\d+)?)px$/i.exec(value.trim());\n return m ? parseFloat(m[1]) : null;\n }\n}\n","import { isDevMode } from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';\nimport type { SdTableGroupDefContext } from '../directives/sd-table-group-def.directive';\n// import hash from 'object-hash';\nexport interface SdTableMetaSelector {\n selectable?: boolean;\n isSelected?: boolean;\n actions?: string[];\n}\n\nexport interface SdTableMetaExpand {\n isExpanded?: boolean;\n isExpanding?: boolean;\n data?: any;\n}\n\nexport interface SdTableMetaTree<T = any> {\n level: number;\n hasChildren: boolean;\n isExpanded: boolean;\n isExpanding?: boolean;\n parentId?: string;\n /** Cached formatted child SdTableItem[] — populated on first expand/format */\n childItems?: SdTableItem<T>[];\n /**\n * Hierarchical index path từ root tới row hiện tại — sibling-index (1-based) per level.\n * Vd root thứ nhất = [1], child thứ 2 của root đó = [1, 2], grandchild thứ 1 = [1, 2, 1].\n * Template STT join('.') → \"1\", \"1.2\", \"1.2.1\". Populate trong `flattenTree`.\n */\n indexPath?: number[];\n}\n\nexport interface SdTableDisplay {\n tooltip?: string;\n badge?: {\n type: SdUnwrapSignal<SdBadge['type']>;\n color: SdUnwrapSignal<SdBadge['color']>;\n icon?: SdUnwrapSignal<SdBadge['icon']>;\n title?: SdUnwrapSignal<SdBadge['title']>;\n };\n cellStyle?: Record<string, string>;\n data: string | number | undefined | null;\n isHtml: boolean;\n click?: () => void;\n}\n\nexport interface SdTableMetaGroup<T = any> {\n /** Children items thuộc group này (chỉ set trên group header row). */\n items?: SdTableItem<T>[];\n /**\n * Raw data của children (`items.map(i => i.data)`).\n * why: precompute 1 lần lúc SdGroupPipe dựng header — trước đây `groupContext()`\n * map lại mảng này ở MỖI change-detection pass cho MỖI group row.\n */\n data?: T[];\n /** true = row này là synthetic group header (sinh bởi SdGroupPipe). */\n isGroupHeader?: boolean;\n /** Hash key của group (= Utilities.hash(values)). */\n key?: string;\n /** Resolved group-field values (vd `{ customerId: 1, customerName: 'A' }`). */\n values?: Record<string, any>;\n /** Trạng thái expand. Chỉ ý nghĩa khi `option.group.collapsible = true`. */\n isExpanded?: boolean;\n /**\n * true nếu MỌI selectable child trong group đã được chọn.\n * why: cache thay cho `isGroupAllSelected(item)` gọi trong template — hàm đó duyệt\n * toàn bộ children mỗi CD pass. Cập nhật ở selection sync path (`#updateSelectedItems`).\n */\n isSelected?: boolean;\n /** true nếu chỉ MỘT PHẦN children được chọn (partial). Cache — xem `isSelected`. */\n indeterminate?: boolean;\n /**\n * Context ổn định truyền cho template `sdTableGroupDef`.\n * why: giữ NGUYÊN reference qua các CD pass để `ngTemplateOutlet` không phải\n * dựng lại embedded view; giá trị bên trong được mutate tại chỗ khi selection đổi.\n */\n context?: SdTableGroupDefContext<T>;\n}\n\nexport interface SdTableMeta<T> {\n id: string;\n display: Record<string, SdTableDisplay>;\n selector?: SdTableMetaSelector;\n expand?: SdTableMetaExpand;\n group?: SdTableMetaGroup<T>;\n tree?: SdTableMetaTree<T>;\n /**\n * Style inline của cả row, resolve từ `option.style.rowCss` MỘT LẦN mỗi lần render.\n * why: template bind `[ngStyle]` trực tiếp vào đây; gọi `rowCss(...)` trong binding\n * trả object MỚI mỗi CD pass → KeyValueDiffer phải diff lại toàn bộ row mỗi pass.\n */\n rowStyle?: Record<string, string> | null;\n}\n\nexport interface SdTableItem<T = any> {\n meta: SdTableMeta<T>;\n data: T;\n}\n\n// why: id của row TUYỆT ĐỐI không được suy ra từ NỘI DUNG. Hash content khiến 2 row\n// trùng dữ liệu dùng chung 1 id → mat-table `trackBy` tái dùng nhầm view, và các Map\n// keyed theo id (`#treeExpandState`, preserved-selection) đụng key. Thay bằng:\n// 1. `option.rowKey` — field định danh do caller khai báo (ổn định, đọc được, sống\n// qua re-fetch của server);\n// 2. fallback: id sinh theo bộ đếm và ghim vào CHÍNH object data qua WeakMap, nên\n// wrap lại cùng một object (re-format children của tree, filter local) vẫn ra\n// đúng id cũ — ổn định theo IDENTITY chứ không theo nội dung.\nconst rowIdByData = new WeakMap<object, string>();\nlet rowIdSequence = 0;\n\nconst nextRowId = (): string => `sd-row-${++rowIdSequence}`;\n\n/** Resolve id cho một row data. Xem chú thích ở `rowIdByData` để biết thứ tự ưu tiên. */\nexport const resolveTableItemId = <T = any>(item: T, rowKey?: string): string => {\n if (rowKey) {\n const raw = Utilities.getNestedValue(item as Record<string, unknown>, rowKey);\n // why: CHỈ nhận giá trị nguyên thuỷ. `rowKey` trỏ vào object/array thì `String(raw)` cho ra\n // `'[object Object]'` với MỌI row — trùng key `trackBy` (CDK tái dùng view sai) và `visited`\n // Set trong `flattenTree` gộp cả cây thành một row. Rơi về id sinh tự động và cảnh báo ở dev.\n if (raw !== undefined && raw !== null && raw !== '') {\n const kind = typeof raw;\n if (kind === 'string' || kind === 'number' || kind === 'bigint' || kind === 'boolean') return String(raw);\n if (isDevMode()) {\n console.error(\n `[sd-table] option.rowKey \"${rowKey}\" trả về giá trị kiểu ${kind}, không phải nguyên thuỷ. ` +\n `Bỏ qua và dùng id sinh tự động. Trỏ rowKey vào một field định danh (string/number).`\n );\n }\n }\n }\n if (item !== null && typeof item === 'object') {\n const cached = rowIdByData.get(item as object);\n if (cached) return cached;\n const generated = nextRowId();\n rowIdByData.set(item as object, generated);\n return generated;\n }\n // why: row data nguyên thuỷ (mảng string/number) KHÔNG vào được WeakMap. Sinh id mới mỗi lần\n // `format()` sẽ làm `trackBy`, `#treeExpandState` và preserved-selection churn sau mỗi lần\n // reload. Với một giá trị nguyên thuỷ thì NỘI DUNG chính là identity, nên khoá theo\n // `typeof + value` là đúng ngữ nghĩa (khác hẳn hash nội dung của một object).\n return `sd-row-lit-${typeof item}-${String(item)}`;\n};\n\nexport const MapToSdTableItem = <T = any>(item: T, rowKey?: string): SdTableItem<T> => ({\n data: item,\n meta: {\n id: resolveTableItemId(item, rowKey),\n display: {},\n expand: {\n isExpanding: false,\n isExpanded: false,\n },\n group: {},\n selector: { actions: [], isSelected: false, selectable: false },\n tree: { level: 0, hasChildren: false, isExpanded: false, isExpanding: false },\n rowStyle: null,\n },\n});\n","import { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOptionTree } from '../../models/table-option-tree.model';\nimport type { SdTableGroupDefContext } from '../../directives/sd-table-group-def.directive';\nimport { collectFormattedTreeRows, flattenTree } from '../tree/tree.util';\n\nexport const getSelectionRows = <T>(roots: SdTableItem<T>[], treeOpt?: SdTableOptionTree<T>): SdTableItem<T>[] =>\n treeOpt ? flattenTree(roots, treeOpt) : roots;\n\nexport const getSelectedRowData = <T>(rows: SdTableItem<T>[]): T[] =>\n rows.filter(row => row.meta.selector!.isSelected).map(row => row.data);\n\nexport const applyDefaultSelected = <T>(\n roots: SdTableItem<T>[],\n treeOpt: SdTableOptionTree<T> | undefined,\n defaultSelected?: (row: T) => boolean\n): void => {\n if (!defaultSelected) return;\n const rows = treeOpt ? collectFormattedTreeRows(roots) : roots;\n rows.forEach(item => {\n item.meta.selector!.isSelected = defaultSelected(item.data);\n });\n};\n\nexport const resolveSelectAllState = <T>(visibleRows: SdTableItem<T>[]): boolean => {\n const selectableRows = visibleRows.filter(row => row.meta.selector?.selectable);\n return selectableRows.length > 0 && selectableRows.every(row => row.meta.selector?.isSelected);\n};\n\nexport const restorePreservedSelection = <T>(visibleRows: SdTableItem<T>[], preservedSelectedMap: Map<string, SdTableItem<T>>): void => {\n visibleRows.forEach(item => {\n if (preservedSelectedMap.has(item.meta.id)) {\n item.meta.selector!.isSelected = true;\n preservedSelectedMap.set(item.meta.id, item);\n }\n });\n};\n\nexport const syncPreservedSelection = <T>(\n visibleRows: SdTableItem<T>[],\n preservedSelectedMap: Map<string, SdTableItem<T>>\n): SdTableItem<T>[] => {\n visibleRows.forEach(item => {\n const id = item.meta.id;\n if (item.meta.selector!.isSelected) {\n preservedSelectedMap.set(id, item);\n } else {\n preservedSelectedMap.delete(id);\n }\n });\n return Array.from(preservedSelectedMap.values());\n};\n\n// ==========================================\n// GROUP HEADER — selection state + template context\n// ==========================================\n\n/**\n * Cầu nối giữa `SdGroupPipe` (nơi group header được sinh ra) và `SdTable`.\n *\n * why: pipe dựng header nhưng KHÔNG biết method của component, còn component thì không\n * giữ mảng output của pipe. Host là một object DUY NHẤT, ổn định do component sở hữu:\n * pipe đổ header vào `headers` để component sync lại selection state sau này, và mượn\n * `toggleExpand`/`toggleSelect` để gắn vào template context.\n */\nexport interface SdGroupHeaderHost<T = any> {\n /** Sink các group header của lần transform gần nhất. Pipe clear + fill lại mỗi lần. */\n headers: SdTableItem<T>[];\n toggleExpand: (header: SdTableItem<T>) => void;\n toggleSelect: (header: SdTableItem<T>) => void;\n}\n\n/**\n * Tính lại `isSelected` / `indeterminate` của một group header và ĐỒNG BỘ sang context.\n *\n * why: template trước đây bind `[checked]=\"isGroupAllSelected(item)\"` +\n * `[indeterminate]=\"isGroupIndeterminate(item)\"` — mỗi binding duyệt toàn bộ children,\n * mỗi CD pass, cho mỗi group row (và `groupContext()` duyệt thêm lần nữa). Giờ tính MỘT\n * lần ở selection sync path rồi cache lên meta; template chỉ đọc property.\n * Một vòng duyệt duy nhất thay cho cặp `every` + `some`.\n */\nexport const syncGroupSelectionMeta = <T>(header: SdTableItem<T>): void => {\n const group = header.meta.group;\n if (!group?.isGroupHeader) return;\n let total = 0;\n let selected = 0;\n for (const child of group.items ?? []) {\n if (child.meta.selector?.selectable === false) continue;\n total++;\n if (child.meta.selector?.isSelected) selected++;\n }\n group.isSelected = total > 0 && selected === total;\n group.indeterminate = total > 0 && selected > 0 && selected < total;\n const context = group.context;\n if (context) {\n // Mutate TẠI CHỖ — giữ nguyên reference để ngTemplateOutlet không dựng lại view.\n context.isSelected = group.isSelected;\n context.indeterminate = group.indeterminate;\n context.isExpanded = group.isExpanded ?? true;\n }\n};\n\n/**\n * Dựng context truyền cho template `sdTableGroupDef`.\n * Chỉ gọi MỘT lần cho mỗi header (lúc pipe sinh header); sau đó reference được giữ\n * nguyên và giá trị bên trong cập nhật qua `syncGroupSelectionMeta`.\n */\nexport const buildGroupHeaderContext = <T>(header: SdTableItem<T>, host?: SdGroupHeaderHost<T>): SdTableGroupDefContext<T> => {\n const group = header.meta.group;\n const items = group?.items ?? [];\n return {\n items,\n data: group?.data ?? items.map(i => i.data),\n key: group?.key || '',\n values: group?.values || {},\n isExpanded: group?.isExpanded ?? true,\n isSelected: group?.isSelected ?? false,\n indeterminate: group?.indeterminate ?? false,\n toggleExpand: () => host?.toggleExpand(header),\n toggleSelect: () => host?.toggleSelect(header),\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableOption } from '../models/table-option.model';\nimport { MapToSdTableItem, SdTableItem } from '../models/table-item.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { buildGroupHeaderContext, SdGroupHeaderHost, syncGroupSelectionMeta } from '../services/table-selection/table-selection.util';\n\n@Pipe({ name: 'sdGroup' })\nexport class SdGroupPipe implements PipeTransform {\n /**\n * Nhóm items theo `option.group.fields`. Mỗi group sinh ra 1 synthetic SdTableItem\n * (group header) đặt trước children. Header có `meta.group.isGroupHeader = true` + `key`\n * + `values` + `items` + `isExpanded` để template + table consume.\n *\n * Khi `option.group.collapsible = true` + group đang collapse → children bị lọc khỏi output.\n *\n * `expandState` (optional, owned by component) — Map<key, expanded> giữ trạng thái\n * expand/collapse qua các lần transform. Pipe đọc state từ Map; nếu key chưa tồn tại,\n * dùng `!option.group.defaultCollapsed`. Pipe ghi state về Map cho lần read sau.\n *\n * `host` (optional, owned by component) — nhận danh sách header vừa sinh (để component\n * sync selection state) và cung cấp callback toggle cho template context.\n *\n * @example\n * `_items | sdGroup: _tableOption : groupExpandState : groupHost`\n */\n transform(items: SdTableItem[], gridOption: SdTableOption, expandState?: Map<string, boolean>, host?: SdGroupHeaderHost): SdTableItem[] {\n // why: sink do component sở hữu, pipe reset TẠI CHỖ mỗi lần transform (không gán\n // mảng mới) để reference bên component luôn ổn định.\n if (host) host.headers.length = 0;\n if (gridOption?.tree) {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && gridOption.group) {\n console.warn('[sd-table] option.tree and option.group cannot be used together. group is ignored.');\n }\n return items;\n }\n const group = gridOption?.group;\n if (!group?.fields?.length) return items;\n const fields = group.fields;\n const collapsible = !!group.collapsible;\n const defaultExpanded = !group.defaultCollapsed;\n\n // Bucket items theo combined field-value hash.\n // Field hỗ trợ dot-notation (vd 'customer.id') — resolve qua getNestedValue.\n const buckets = new Map<string, { values: Record<string, any>; items: SdTableItem[] }>();\n for (const item of items) {\n const values: Record<string, any> = {};\n for (const f of fields) values[f as string] = Utilities.getNestedValue(item.data, f as string);\n const key = Utilities.hash(values);\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = { values, items: [] };\n buckets.set(key, bucket);\n }\n bucket.items.push(item);\n }\n\n const result: SdTableItem[] = [];\n buckets.forEach((bucket, key) => {\n const isExpanded = expandState?.has(key) ? !!expandState.get(key) : defaultExpanded;\n if (collapsible && expandState) expandState.set(key, isExpanded);\n\n const header = MapToSdTableItem({} as any);\n // why: `MapToSdTableItem({})` sinh id cho một object rỗng MỚI mỗi lần transform →\n // trackBy của mat-table đổi liên tục (và trước kia, khi id là hash nội dung, MỌI\n // header dùng CHUNG một id). Khoá id theo group key: duy nhất giữa các group và\n // ổn định qua mọi lần re-eval.\n header.meta.id = `sd-group-${key}`;\n header.meta.group = {\n isGroupHeader: true,\n key,\n values: bucket.values,\n items: bucket.items,\n // why: precompute 1 lần — template/context không map lại mỗi CD pass nữa.\n data: bucket.items.map(i => i.data),\n isExpanded,\n };\n header.meta.selector!.selectable = false;\n header.meta.group.context = buildGroupHeaderContext(header, host);\n syncGroupSelectionMeta(header);\n host?.headers.push(header);\n result.push(header);\n\n if (!collapsible || isExpanded) {\n for (const child of bucket.items) result.push(child);\n }\n });\n return result;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdTableOptionSelector } from '../models/table-option-selector.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\n@Pipe({\n name: 'selectionDisabled',\n})\nexport class SdSelectionDisabledPipe implements PipeTransform {\n transform = <T>(selectedItems: SdTableItem<T>[], rowData: SdTableItem<T>, selection: SdTableOptionSelector<T>): boolean => {\n const { disabled, actions } = selection;\n const selectedData = selectedItems.map(e => e.data);\n const setDisabled = (isDisabled: boolean): boolean => {\n rowData.meta.selector!.selectable = !isDisabled;\n return isDisabled;\n };\n if (rowData.meta.selector!.isSelected) {\n return setDisabled(false);\n }\n // Kiểm tra có bị disabled theo function không\n // Dữ liệu chưa được check thì kiểm tra hàm disable nếu có\n if (disabled?.(rowData.data, selectedData)) {\n return setDisabled(true);\n }\n if (!actions?.length) {\n return setDisabled(false);\n }\n // Lọc các action theo selectedItems hiện tại\n const availableActions = actions.filter(action => {\n if ('children' in action) {\n for (const childAction of action.children) {\n const key = Utilities.hash(childAction);\n if (selectedItems.every(e => e.meta.selector?.actions?.includes(key))) {\n return true;\n }\n }\n return false;\n } else {\n const key = Utilities.hash(action);\n return selectedItems.every(e => e.meta.selector?.actions?.includes(key));\n }\n });\n // Kiểm tra rowData có action nào thỏa hay ko, nếu ko thì disabled\n for (const action of availableActions) {\n if ('children' in action) {\n for (const childAction of action.children) {\n if (rowData.meta.selector?.actions?.includes(Utilities.hash(childAction))) {\n return setDisabled(false);\n }\n }\n } else {\n if (rowData.meta.selector?.actions?.includes(Utilities.hash(action))) {\n return setDisabled(false);\n }\n }\n }\n return setDisabled(true);\n };\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableAction, SdTableOptionSelector } from '../../models/table-option-selector.model';\n\n/** Một action hiển thị được với row này hay không (`hidden` có thể là cờ tĩnh hoặc predicate). */\nconst isActionVisible = <T>(hidden: SdTableAction<T>['hidden'], data: T): boolean =>\n typeof hidden === 'function' ? !hidden(data) : !hidden;\n\n/**\n * Thu thập danh sách action key khả dụng cho MỘT row.\n *\n * why: ghi thẳng vào 2 mảng do caller cấp (in-place) thay vì `return` mảng mới —\n * hàm này chạy trong đường render (mỗi CD pass, mỗi row) nên không được cấp phát\n * mảng mới mỗi lần gọi. Caller reset độ dài mảng trước khi gọi.\n *\n * Key = `Utilities.hash(action)`, khớp với `ActionFilterPipe` để action bar lọc\n * đúng action chung của mọi item đang chọn.\n */\nexport const collectRowActionKeys = <T>(\n rowData: SdTableItem<T>,\n selection: SdTableOptionSelector | undefined,\n actions: string[],\n groupedActions: string[]\n): void => {\n for (const action of selection?.actions ?? []) {\n if ('children' in action) {\n let flag = false;\n let hasGroup = false;\n for (const child of action.children) {\n const { hidden, isGrouped } = child;\n if (isGrouped) {\n hasGroup = true;\n }\n if (isActionVisible(hidden, rowData.data)) {\n flag = true;\n const key = Utilities.hash(child);\n actions.push(key);\n if (isGrouped) {\n groupedActions.push(key);\n }\n }\n }\n if (flag) {\n const key = Utilities.hash(action);\n actions.push(key);\n if (hasGroup) {\n groupedActions.push(key);\n }\n }\n } else {\n const { hidden, isGrouped } = action;\n if (isActionVisible(hidden, rowData.data)) {\n const key = Utilities.hash(action);\n actions.push(key);\n if (isGrouped) {\n groupedActions.push(key);\n }\n }\n }\n }\n};\n\n/**\n * Checkbox \"chọn tất cả\" ở header có hiển thị hay không.\n *\n * why: trước đây là pure pipe `async` với `await setTimeout(500)` bên trong. Sleep đó\n * che một vấn đề THỨ TỰ change-detection: pipe đọc `meta.selector.actions` — mảng do\n * `SdSelectionVisiblePipe` ghi ở cell BODY, mà CDK render header TRƯỚC body, nên ở pass\n * đầu mảng luôn rỗng. Hệ quả: checkbox hiện trễ 500ms và mỗi lần re-eval lại đẻ thêm\n * một timer không ai dọn. Ở đây tự tính key action từ `selection` nên không phụ thuộc\n * pipe nào chạy trước → quyết định được ngay trong pass hiện tại, không cần timer.\n */\nexport const resolveSelectAllVisible = <T>(items: SdTableItem<T>[], selection: SdTableOptionSelector | undefined): boolean => {\n // Nếu chỉ chọn 1 thì không có select all\n if (selection?.single) return false;\n if (!items.length) return false;\n if (!selection?.actions?.length) return true;\n if (selection.actions.some(e => ('children' in e && e.children.some(e1 => e1.isGrouped)) || e.isGrouped)) return false;\n\n const keysPerRow: string[][] = [];\n for (const item of items) {\n const actions: string[] = [];\n collectRowActionKeys(item, selection, actions, []);\n if (actions.length) keysPerRow.push(actions);\n }\n if (!keysPerRow.length) return false;\n // Có ít nhất 1 action chung cho MỌI row còn action → cho phép select all.\n return keysPerRow[0].some(action => keysPerRow.every(keys => keys.includes(action)));\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdTableOptionSelector } from '../models/table-option-selector.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { collectRowActionKeys } from '../services/table-selection/selection-action.util';\n\n@Pipe({\n name: 'selectionVisible',\n})\nexport class SdSelectionVisiblePipe implements PipeTransform {\n transform = (rowData: SdTableItem, selection: SdTableOptionSelector | undefined): boolean => {\n const selector = rowData.meta.selector!;\n const actions = (selector.actions ??= []);\n if (!selection?.actions?.length) {\n selector.selectable = true;\n return selector.selectable;\n }\n // why: pipe là pure nhưng lại GHI vào chính input (`meta.selector.actions`). Bản cũ\n // chỉ `actions = actions || []` rồi push, không bao giờ reset — mỗi lần re-eval cho\n // cùng một row (mỗi CD pass) lại nối thêm bản sao của các key vào MẢNG CŨ, tăng vô\n // hạn; `selectable` và `ActionFilterPipe`/select-all sau đó đọc mảng đã nhiễm.\n // Reset TẠI CHỖ (giữ nguyên reference, không cấp phát mảng mới mỗi pass) rồi mới\n // tính lại → transform trở nên idempotent.\n actions.length = 0;\n const groupedActions: string[] = [];\n collectRowActionKeys(rowData, selection, actions, groupedActions);\n\n selector.selectable = !!actions.length;\n if (!selector.selectable || !groupedActions.length || rowData?.meta.group?.items?.length) {\n return selector.selectable;\n }\n // Đối với trường hợp grouped, tuy selectable là true nhưng vẫn ẩn đi checkbox\n // nếu các action đều thuộc groupedActions và rowData ko phải là dòng group\n return actions.some(action => !groupedActions.includes(action));\n };\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdExcelColumn, SdExcelService } from '@sdcorejs/angular/services';\nimport { SdExcelSheet } from '@sdcorejs/angular/services/excel';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOptionExportColumn } from '../../models/table-option-export.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { SdTableFilterRequest } from '../table-filter/table-filter.model';\n\nexport interface SdTableExportContext<T = any> {\n option: SdTableOption<T>;\n configuration?: ConfiguredTableResult;\n total: number;\n cacheObjValues: Record<string, Record<string, string>>;\n\n // Hàm callback để Service gọi ngược lại Component xin dữ liệu từng trang\n fetchChunk: (\n pageNumber: number,\n pageSize: number\n ) => Promise<\n | T[]\n | {\n items: any[];\n total: number;\n }\n >;\n\n // Dành cho custom export\n getFilterInfo: () => SdTableFilterRequest;\n}\n\n@Injectable()\nexport class TableExportService {\n #excelService = inject(SdExcelService);\n #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNAL STATE (Component sẽ bind trực tiếp vào đây)\n // ==========================================\n exporting = signal(false);\n\n // Phần trăm tiến độ export; null = đang rảnh (nút hiện nhãn mặc định).\n #exportPercent = signal<number | null>(null);\n\n // WHY computed + i18n: trước đây đây là signal('Export') hard-code tiếng Anh nên\n // app chạy tiếng Việt vẫn hiện \"Export\". Đọc qua I18nService.t() để nhãn nút bám\n // theo catalog ngôn ngữ hiện tại.\n exportTitle = computed(() => {\n const percent = this.#exportPercent();\n return percent === null ? this.#i18n.t('core.component.table.export') : this.#i18n.t('core.component.table.exporting', { percent });\n });\n\n /** Đặt tiến độ export (0-100), hoặc null để trả nút về nhãn mặc định. */\n setExportProgress = (percent: number | null): void => {\n this.#exportPercent.set(percent === null ? null : Math.min(Math.max(percent, 0), 100));\n };\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n\n exportExcel = (context: SdTableExportContext, columns?: SdExcelColumn[]) => {\n return this.#processExport(context, { columns, isCSV: false });\n };\n\n exportCSV = (context: SdTableExportContext, columns?: SdExcelColumn[]) => {\n return this.#processExport(context, { columns, isCSV: true });\n };\n\n exportCustom = (context: SdTableExportContext) => {\n const { option, getFilterInfo } = context;\n if (option?.export?.type === 'custom') {\n this.exporting.set(true);\n option.export\n .onExport(getFilterInfo())\n .catch(err => {\n console.error(err);\n throw err;\n })\n .finally(() => {\n this.exporting.set(false);\n });\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n\n async #processExport(context: SdTableExportContext, args: { columns?: SdExcelColumn[]; isCSV?: boolean }) {\n const { option, total, fetchChunk, cacheObjValues } = context;\n\n // `type` là optional trên SdTableOptionExportDefault — undefined cũng coi như 'default'.\n // Chỉ chặn nhánh 'custom' (đã có exportCustom xử lý riêng).\n if (option.export?.type === 'custom') return;\n\n const { isCSV } = args;\n try {\n const columns = this.#getExportColumns(context, args.columns);\n const pageSize = option.export?.maxItemsPerRequest || 1000;\n const batch = option.export?.batch || 1;\n\n let pageNumber = 0;\n let exportItems: any[] = [];\n let currentTotal = total; // Biến cục bộ để track total trả về từ fetchChunk\n\n this.exporting.set(true);\n const items: any[] = [];\n let promises: Promise<any[] | { items: any[]; total: number }>[] = [];\n\n const handleData = async () => {\n const results = await Promise.all(promises);\n promises = [];\n exportItems = [];\n\n for (const result of results) {\n if (result && 'items' in result) {\n exportItems = [...exportItems, ...result.items];\n currentTotal = result.total;\n } else if (Array.isArray(result)) {\n exportItems = [...exportItems, ...result];\n }\n }\n\n if (option.export?.type !== 'custom' && option.export?.mapping) {\n const mappedResults = option.export.mapping(exportItems);\n exportItems = mappedResults instanceof Promise ? await mappedResults : mappedResults;\n }\n\n const totalPage = Math.max(1, currentTotal / pageSize);\n const percent = Math.round(((pageNumber - 1) * 100.0) / totalPage);\n // Đảm bảo percent không vượt quá 100\n this.setExportProgress(percent);\n\n const allColumns = this.#allColumns(option);\n const allExportedColumns = this.#allExportedColumns(option);\n\n for (const item of exportItems) {\n const obj: any = {};\n\n const handle = async (exportColumn: SdExcelColumn) => {\n obj[exportColumn.field] = Utilities.getNestedValue(item, exportColumn.field);\n\n const column = allColumns.find(e => e.field === exportColumn.field);\n const exportedColumn = allExportedColumns.find(e => e.field === exportColumn.field);\n\n if (exportedColumn?.transform) {\n obj[exportedColumn.field] = exportedColumn.transform(Utilities.getNestedValue(item, exportedColumn.field), item);\n return;\n }\n if (!column) return;\n\n if (column.type === 'children') {\n column?.children?.forEach(childColumn =>\n handle({\n field: childColumn.field,\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n width: childColumn.width,\n })\n );\n return;\n }\n if (!columns.some(e => e.field === column.field)) return;\n\n const itemValue = Utilities.getNestedValue(item, column.field as string);\n const fieldStr = column.field as string;\n\n if (column.transform) {\n const transform = column.transform(itemValue, item, { isExport: true });\n obj[fieldStr] = transform instanceof Promise ? await transform : transform;\n obj[fieldStr] = obj[fieldStr] ?? '';\n } else if (itemValue === undefined || itemValue === null || itemValue === '') {\n obj[fieldStr] = '';\n } else if (column.type === 'string' || column.type === 'number') {\n obj[fieldStr] = itemValue;\n } else if (column.type === 'boolean') {\n if (itemValue) {\n obj[fieldStr] = column.option?.displayOnTrue || 'True';\n } else if (obj[fieldStr] !== undefined && obj[fieldStr] !== null) {\n obj[fieldStr] = column.option?.displayOnFalse || 'False';\n }\n } else if (column.type === 'date') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'yyyy/MM/dd');\n } else if (column.type === 'datetime') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'yyyy/MM/dd HH:mm:ss');\n } else if (column.type === 'time') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'HH:mm:ss');\n } else if (column.type === 'values' || column.type === 'lazy-values') {\n const vals = (Array.isArray(itemValue) ? itemValue : [itemValue]).filter(e => !!e?.toString());\n obj[fieldStr] = vals.map(val => cacheObjValues[fieldStr]?.[val]?.[column.option.displayField as any] || val)?.join(', ');\n } else {\n obj[fieldStr] = itemValue;\n }\n };\n\n for (const exportColumn of columns) {\n await handle(exportColumn);\n }\n items.push(obj);\n }\n };\n\n // Vòng lặp lấy dữ liệu\n while (pageNumber * pageSize < currentTotal) {\n promises.push(fetchChunk(pageNumber, pageSize));\n pageNumber++;\n if (promises.length < batch) continue;\n await handleData();\n }\n\n if (promises.length > 0) {\n await handleData();\n }\n\n // Xuất file\n if (isCSV) {\n await this.#excelService.exportCSV({\n columns,\n items,\n fileName: option.export?.fileName,\n });\n return;\n }\n\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(option.export?.sheets)) {\n for (const sheet of option.export.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n sheets.push({\n name: sheet.name,\n items: Array.isArray(sheet.items) ? sheet.items : await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n\n await this.#excelService.export({\n columns,\n items,\n fileName: option.export?.fileName,\n sheets,\n });\n } finally {\n this.exporting.set(false);\n this.setExportProgress(null);\n }\n }\n\n #getExportColumns(context: SdTableExportContext, explicitColumns?: SdExcelColumn[]): SdExcelColumn[] {\n const { option, configuration } = context;\n let tableColumns: SdExcelColumn[] = [];\n\n option.columns\n .filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children\n ?.filter(e => !e.export?.disabled)\n .forEach(childColumn => {\n tableColumns.push({\n field: childColumn.field as string,\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n description: childColumn.export?.description,\n width: childColumn.width,\n });\n });\n return;\n }\n tableColumns.push({\n field: column.field as string,\n title: typeof column.title === 'string' ? column.title : column.title?.title,\n description: column.export?.description,\n width: column.width,\n });\n });\n\n if (configuration) {\n const displayColumns = [...configuration.firstColumns, ...configuration.secondColumns].reduce<SdTableColumn[]>((first, next) => {\n const column = option.columns.find(e => e.field === next.field);\n if (!column) return first;\n if (column.type !== 'children') return [...first, column];\n return [...first, ...column.children];\n }, []);\n\n tableColumns = displayColumns\n .map(e => ({ ...e, data: tableColumns.find(e1 => e1.field === e.field) }))\n .filter(e => !!e.data)\n .map(e => e.data!);\n }\n\n const columnFields = explicitColumns?.map(e => e.field) || [];\n\n if (option.export?.type !== 'custom') {\n return [...tableColumns, ...(option.export?.columns?.filter(e => !e.export?.disabled) || [])].filter(\n column => !columnFields?.length || columnFields.includes(column.field)\n );\n } else {\n return tableColumns.filter(column => !columnFields?.length || columnFields.includes(column.field));\n }\n }\n\n #allColumns(option: SdTableOption): SdTableColumn[] {\n const columns: SdTableColumn[] = [];\n option.columns\n ?.filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children?.filter(e => !e.export?.disabled).forEach(childColumn => columns.push(childColumn));\n return;\n }\n columns.push(column);\n });\n return columns;\n }\n\n #allExportedColumns(option: SdTableOption): SdTableOptionExportColumn[] {\n if (option.export?.type !== 'default') return [];\n return option.export?.columns?.filter(e => !e.export?.disabled) || [];\n }\n}\n","import { Injectable, inject, isSignal } from '@angular/core';\nimport { SdFormatDatePipe, SdFormatDatetimePipe, SdFormatNumberPipe } from '@sdcorejs/angular/pipes';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ArrayUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\n\nimport { SdTableColumn, SdTableColumnNormal } from '../../models/table-column.model';\nimport { MapToSdTableItem, SdTableDisplay, SdTableItem } from '../../models/table-item.model';\n\n@Injectable()\nexport class TableFormatService {\n // Keep table display formatting aligned with the public template pipes.\n #formatDatePipe = inject(SdFormatDatePipe);\n #formatDatetimePipe = inject(SdFormatDatetimePipe);\n #formatNumberPipe = inject(SdFormatNumberPipe);\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n\n /**\n * Tải và cache các giá trị từ điển cho cột 'values'\n */\n async loadValues(\n columns: SdTableColumn[],\n cacheValues: Record<string, any[]>,\n cacheObjValues: Record<string, Record<string, string>>\n ): Promise<void> {\n const promises: Promise<{\n key: string;\n valueField: string;\n displayField: string;\n data: any[];\n }>[] = [];\n\n for (const column of columns) {\n if (column.type === 'values' && !cacheValues[column.field]) {\n // TRƯỜNG HỢP 1: Nếu items là một Signal\n if (isSignal(column.option.items)) {\n // Đọc giá trị hiện tại của Signal\n const data = column.option.items();\n\n cacheValues[column.field] = (Array.isArray(data) ? data : []).map(e => ({\n ...e,\n [column.option.valueField]: Utilities.getNestedValue(e, column.option.valueField),\n [column.option.displayField]: Utilities.getNestedValue(e, column.option.displayField),\n }));\n\n cacheObjValues[column.field] = ArrayUtilities.toObject(column.option.valueField, cacheValues[column.field]);\n }\n // TRƯỜNG HỢP 2: Nếu items là hàm trả về Promise (API Call)\n else if (typeof column.option.items === 'function') {\n promises.push(\n column.option.items().then(data => ({\n key: column.field,\n valueField: column.option.valueField,\n displayField: column.option.displayField,\n data: Array.isArray(data) ? data : [],\n }))\n // ... catch error giữ nguyên\n );\n }\n\n // TRƯỜNG HỢP 3: Mảng tĩnh (K[]) bình thường\n else {\n cacheValues[column.field] = column.option.items.map(e => ({\n ...e,\n [column.option.valueField]: Utilities.getNestedValue(e, column.option.valueField),\n [column.option.displayField]: Utilities.getNestedValue(e, column.option.displayField),\n }));\n\n cacheObjValues[column.field] = ArrayUtilities.toObject(column.option.valueField, cacheValues[column.field]);\n }\n }\n }\n\n if (promises.length) {\n const results = await Promise.all(promises);\n for (const result of results) {\n cacheValues[result.key] = result.data.map(e => ({\n ...e,\n [result.valueField]: Utilities.getNestedValue(e, result.valueField),\n [result.displayField]: Utilities.getNestedValue(e, result.displayField),\n }));\n cacheObjValues[result.key] = ArrayUtilities.toObject(result.valueField, cacheValues[result.key]);\n }\n }\n }\n\n /**\n * Chuyển đổi dữ liệu thô thành SdTableItem kèm các thiết lập hiển thị (Display Meta)\n */\n // why: `columns` phải là `SdTableColumn<T>` chứ không phải `SdTableColumn` (mặc định `unknown`).\n // Cột mang callback nhận `rowData: T` (`transform`, `tooltip`, `click`, `useBadge`) nên tham số\n // đứng ở vị trí contravariant — khi default generic còn là `any` thì mọi thứ gán được cho nhau nhờ\n // bivariance của `any`; đổi default sang `unknown` làm lộ ra rằng service đang nhận cột \"kiểu khác\"\n // với hàng nó format. Ràng buộc theo cùng `T` là cách sửa đúng, không phải cast.\n async format<T = unknown>(\n rawItems: T[],\n columns: SdTableColumn<T>[],\n cacheValues: Record<string, any[]>,\n cacheObjValues: Record<string, Record<string, string>>,\n rowKey?: string\n ): Promise<SdTableItem<T>[]> {\n // why: KHÔNG dùng `rawItems.map(MapToSdTableItem)` — `map` truyền cả index làm\n // tham số thứ 2, tức index sẽ bị nhận nhầm thành `rowKey`.\n const items = rawItems.map(item => MapToSdTableItem(item, rowKey));\n const execute = async (column: SdTableColumnNormal<T>) => {\n const { field, click, tooltip, htmlTemplate, transform } = column;\n const fieldStr = field;\n\n // Xử lý nạp từ điển động (lazy-values)\n if (!transform && !htmlTemplate && column.type === 'lazy-values' && typeof column.option.views === 'function') {\n const {\n option: { views, valueField, displayField },\n } = column;\n\n cacheObjValues[fieldStr] = cacheObjValues[fieldStr] || {};\n\n const values = ArrayUtilities.distinct(\n items\n .map(item => Utilities.getNestedValue(item.data, fieldStr))\n .filter(val => val?.toString())\n .reduce<string[]>((current, next) => [...current, ...(Array.isArray(next) ? next : [next])], [])\n .filter(val => !Object.keys(cacheObjValues[fieldStr]).includes(val))\n );\n\n if (values.length) {\n const lazyItems: any[] = (\n await views(values).catch((err: any) => {\n console.error(err);\n return [];\n })\n )\n .filter((item: any) => values.includes(Utilities.getNestedValue(item, valueField)))\n .map((e: any) => ({\n [valueField]: Utilities.getNestedValue(e, valueField),\n [displayField]: Utilities.getNestedValue(e, displayField),\n }));\n Object.assign(cacheObjValues[fieldStr], ArrayUtilities.toObject(valueField, lazyItems) || {});\n }\n }\n\n // Format dữ liệu cho từng hàng\n for (const item of items) {\n const rowData = item.data;\n const value = Utilities.getNestedValue(rowData, fieldStr);\n item.meta.display[fieldStr] = {\n badge: undefined,\n cellStyle: column.align === 'right' ? { 'text-align': 'right!important' } : undefined,\n data: value,\n isHtml: false,\n tooltip: typeof tooltip === 'function' ? tooltip(value, rowData) : undefined,\n click: typeof click === 'function' ? () => click(value, rowData) : undefined,\n };\n\n const display = item.meta.display[fieldStr];\n\n if (typeof htmlTemplate === 'function') {\n display.isHtml = true;\n display.data = htmlTemplate(value, rowData);\n } else if (typeof transform === 'function') {\n const newValue = transform(value, rowData);\n display.data = newValue instanceof Promise ? await newValue : newValue;\n } else {\n // Xử lý các type cơ bản\n if (column.type === 'date' || column.type === 'datetime' || column.type === 'time') {\n display.data = this.#formatDateDisplay(value, column.type);\n display.isHtml = column.type === 'datetime';\n }\n if (column.type === 'values' || column.type === 'lazy-values') {\n display.data = this.#processValuesDisplay(value, column, fieldStr, cacheObjValues);\n }\n if (column.type === 'number' && NumberUtilities.isNumber(value)) {\n display.data = this.#formatNumberPipe.transform(value);\n }\n if (column.type === 'boolean') {\n const { option } = column;\n if (value != null && value !== '') {\n display.data = value === true ? option?.displayOnTrue || 'True' : option?.displayOnFalse || 'False';\n } else {\n display.data = '';\n }\n }\n\n // Xử lý Badge\n const badgeResult = this.#createBadge(column, value, rowData, cacheValues);\n if (badgeResult) {\n display.badge = badgeResult.badge;\n if (badgeResult.title) {\n display.data = badgeResult.title;\n }\n }\n\n if (display.data === null || display.data === undefined || display.data === '') {\n display.data = EMPTY_STR;\n display.badge = undefined;\n }\n }\n }\n };\n\n // Duyệt qua tất cả các cột\n for (const column of columns.filter(e => !e.hidden)) {\n if (column.type === 'children') {\n for (const childColumn of column.children?.filter(e => !e.hidden) || []) {\n await execute(childColumn);\n }\n } else {\n await execute(column);\n }\n }\n return items;\n }\n\n // ==========================================\n // PRIVATE HELPERS\n // ==========================================\n\n #formatDateDisplay(value: any, type: 'date' | 'datetime' | 'time'): string {\n const date = this.#formatDatePipe.transform(value);\n const time = this.#formatDatetimePipe.transform(value, 'HH:mm:ss');\n if (type === 'datetime') {\n return time && date ? `<div class=\"T14R\">${date}<span class=\"T14R text-secondary ml-4\">${time}</span></div>` : '';\n }\n if (type === 'date') return date ?? '';\n if (type === 'time') return time ?? '';\n return '';\n }\n\n #processValuesDisplay<T>(\n value: any,\n column: SdTableColumnNormal<T> & { type: 'values' | 'lazy-values' },\n field: string,\n cacheObjValues: Record<string, Record<string, string>>\n ): string {\n const vals = (Array.isArray(value) ? value : [value]).filter(e => e?.toString());\n return vals.map(val => cacheObjValues[field]?.[val]?.[column.option.displayField as any] || val).join(', ');\n }\n\n #createBadge<T>(\n column: SdTableColumnNormal<T>,\n value: any,\n rowData: T,\n cacheValues: Record<string, any[]>\n ): { badge: SdTableDisplay['badge']; title?: string | number | null } | undefined {\n if (column.useBadge) {\n const badge = column.type === 'values' ? column.useBadge(value, rowData, cacheValues[column.field]) : column.useBadge(value, rowData);\n\n if (badge) {\n return {\n badge: {\n type: badge.type ?? 'round',\n color: badge.color,\n icon: badge.icon,\n },\n title: badge.title,\n };\n }\n }\n if (column.type === 'boolean') {\n return {\n badge: {\n type: 'round',\n color: value ? 'success' : 'error',\n },\n };\n }\n return undefined;\n }\n}\n","/**\n * Build Record<field, width> từ map column hiện tại trong ConfiguredTableResult.\n * Loại bỏ field có width undefined để consumer luôn nhận chuỗi 'NNpx'.\n */\nexport const buildColumnWidthMap = (column: Record<string, { width?: string }> | undefined | null): Record<string, string> => {\n const result: Record<string, string> = {};\n if (!column) return result;\n for (const key of Object.keys(column)) {\n const w = column[key]?.width;\n if (w) result[key] = w;\n }\n return result;\n};\n","import { DateUtilities } from '@sdcorejs/utils/fns';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableColumn, SdTableColumnLazyValues, SdTableColumnValues } from '../../models/table-column.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOptionTree } from '../../models/table-option-tree.model';\nimport { SdTableFilterRequest } from '../table-filter/table-filter.model';\nimport { subtreeMatches } from '../tree/tree.util';\n\nexport interface FilterLocalItemsOption<T> {\n type: 'local' | 'server';\n columns: SdTableColumn<T>[];\n tree?: SdTableOptionTree<T>;\n}\n\nexport interface FilterLocalItemsResult<T, TItem> {\n items: TItem[];\n total: number;\n treeSearchPredicate?: (data: T) => boolean;\n}\n\ntype LocalFilterItem<T> = SdTableItem<T> | T;\n\nconst isTableItem = <T>(item: LocalFilterItem<T>): item is SdTableItem<T> =>\n !!item && typeof item === 'object' && 'data' in item && 'meta' in item;\n\nconst resolveItemData = <T>(item: LocalFilterItem<T>): T => (isTableItem(item) ? item.data : (item as T));\n\nexport const hasActiveColumnFilter = <T>(rawColumnFilter: Partial<Record<string, any>> = {}, columns: SdTableColumn<T>[] = []): boolean =>\n columns.some(col => {\n const v = rawColumnFilter[col.field];\n if (Array.isArray(v)) return v.length > 0;\n if (v && typeof v === 'object') return !!v.from || !!v.to;\n return v !== undefined && v !== null && v !== '';\n });\n\nexport const matchesColumnFilter = <T>(\n data: T,\n columns: SdTableColumn<T>[] = [],\n rawColumnFilter: Partial<Record<string, any>> = {}\n): boolean => {\n for (const column of columns) {\n const { field, type } = column;\n const filterValue: string = (rawColumnFilter[field] || '').toString().trim().toLowerCase();\n const rawColVal = Utilities.getNestedValue(data, field);\n const columnValue: string = (rawColVal || '').toString().trim().toLowerCase();\n\n if (filterValue) {\n if (!columnValue && type !== 'datetime' && type !== 'date' && type !== 'time') {\n return false;\n }\n if (type === 'string') {\n if (columnValue.indexOf(filterValue) === -1) {\n return false;\n }\n } else if (type === 'values' || type === 'lazy-values') {\n const columnType = column as SdTableColumnValues<T> | SdTableColumnLazyValues<T>;\n const isMultiple = columnType.option.selection === 'MULTIPLE';\n if (isMultiple && Array.isArray(rawColVal)) {\n const columnValues: string[] =\n rawColVal.map((i: any) => (Utilities.getNestedValue(i, columnType.option.valueField) ?? '').toString().trim().toLowerCase()) ??\n [];\n const filterValues: string[] = rawColumnFilter[field]?.map((v: any) => (v ?? '').toString().trim().toLowerCase());\n if (filterValues?.length && filterValues.every(fv => !columnValues.includes(fv))) {\n return false;\n }\n } else {\n if (columnValue !== filterValue) {\n return false;\n }\n }\n } else if (type === 'number') {\n const fValue = +filterValue.replace('>=', '').replace('<=', '').replace('>', '').replace('<', '');\n const cValue = +columnValue;\n if (fValue || fValue === 0) {\n if (!cValue && cValue !== 0) {\n return false;\n }\n if (filterValue.indexOf('>=') > -1 && cValue < fValue) {\n return false;\n } else if (filterValue.indexOf('<=') > -1 && cValue > fValue) {\n return false;\n } else if (filterValue.indexOf('<') > -1 && cValue >= fValue) {\n return false;\n } else if (filterValue.indexOf('>') > -1 && cValue <= fValue) {\n return false;\n } else if (cValue !== fValue) {\n return false;\n }\n }\n } else if (type === 'boolean') {\n if ((filterValue === '1' || filterValue === 'true') && columnValue !== '1' && columnValue !== 'true') {\n return false;\n } else if ((filterValue === '0' || filterValue === 'false') && columnValue !== '0' && columnValue !== 'false') {\n return false;\n }\n } else if (type === 'datetime' || type === 'date' || type === 'time') {\n const from = rawColumnFilter[field]?.from ?? rawColumnFilter[field];\n const to = rawColumnFilter[field]?.to ?? rawColumnFilter[field];\n const fromDate = DateUtilities.begin(from);\n const toDate = DateUtilities.end(to);\n if (fromDate || toDate) {\n if (!columnValue) {\n return false;\n }\n\n const columnTime = new Date(columnValue).getTime();\n const fromDateTime = fromDate?.getTime() || null;\n const toDateTime = toDate?.getTime() || null;\n\n if (fromDateTime && fromDateTime > columnTime) {\n return false;\n }\n if (toDateTime && columnTime > toDateTime) {\n return false;\n }\n }\n }\n }\n }\n return true;\n};\n\nexport const filterLocalItems = <T, TItem extends LocalFilterItem<T>>(\n localItems: TItem[],\n option: FilterLocalItemsOption<T>,\n filterInfo: SdTableFilterRequest<T>\n): FilterLocalItemsResult<T, TItem> => {\n const { columns } = option;\n const { rawColumnFilter, orderBy, orderDirection, pageSize, pageNumber } = filterInfo;\n const matchesData = (data: T) => matchesColumnFilter(data, columns, rawColumnFilter);\n const treeOpt = option.tree;\n const treeSearch = option.type === 'local' && treeOpt?.loadType === 'static' && hasActiveColumnFilter(rawColumnFilter, columns);\n const treeSearchPredicate = treeSearch ? matchesData : undefined;\n\n const items = treeSearch\n ? localItems.filter(item => subtreeMatches(resolveItemData<T>(item), matchesData, treeOpt))\n : localItems.filter(item => matchesData(resolveItemData<T>(item)));\n\n if (orderBy && orderDirection) {\n const column = columns.find(e => e.field === orderBy);\n if (column) {\n const { type, field } = column;\n items.sort((tableItemCurrent, tableItemNext) => {\n const dataVal = Utilities.getNestedValue(resolveItemData<T>(tableItemCurrent), field);\n const nextVal = Utilities.getNestedValue(resolveItemData<T>(tableItemNext), field);\n\n if (type === 'number') {\n return (dataVal || 0) - (nextVal || 0);\n }\n if (type === 'date' || type === 'datetime' || type === 'time') {\n const d1 = new Date(dataVal || '').getTime();\n const d2 = new Date(nextVal || '').getTime();\n return d1 - d2;\n }\n const s1 = (dataVal || '').toString();\n const s2 = (nextVal || '').toString();\n if (s1 > s2) {\n return 1;\n }\n if (s1 < s2) {\n return -1;\n }\n return 0;\n });\n if (orderDirection === 'DESC') {\n items.reverse();\n }\n }\n }\n\n return {\n items: items.filter((item, index) => index >= pageNumber * pageSize && index < (pageNumber + 1) * pageSize),\n total: items.length,\n treeSearchPredicate,\n };\n};\n","import { SdTableItem } from '../../models/table-item.model';\n\nexport interface TableReorderOption<T> {\n disabled?: (row: T, index: number) => boolean;\n}\n\nexport interface CanSortReorderArgs<T> {\n enabled?: boolean;\n index: number;\n dragItem: SdTableItem<T>;\n allItems?: SdTableItem<T>[];\n hasGroup?: boolean;\n}\n\nexport interface ReorderTableItemsArgs<T> {\n items: SdTableItem<T>[];\n renderedItems: SdTableItem<T>[];\n previousRenderedIndex: number;\n currentRenderedIndex: number;\n localItems?: SdTableItem<T>[];\n}\n\nexport interface ReorderTableItemsResult<T> {\n items: SdTableItem<T>[];\n localItems?: SdTableItem<T>[];\n fromIndex: number;\n toIndex: number;\n}\n\nconst isGroupHeader = <T>(item?: SdTableItem<T>): boolean => !!item?.meta?.group?.items?.length;\nconst isChildRow = <T>(item?: SdTableItem<T>): boolean => (item?.meta.tree?.level ?? 0) > 0;\nconst isRootReorderRow = <T>(item?: SdTableItem<T>): boolean => !!item && !isGroupHeader(item) && !isChildRow(item);\n\nconst moveItem = <T>(items: T[], fromIndex: number, toIndex: number): T[] => {\n const next = [...items];\n const [moved] = next.splice(fromIndex, 1);\n if (!moved) return next;\n next.splice(toIndex, 0, moved);\n return next;\n};\n\nexport const isReorderDisabled = <T>(item: SdTableItem<T>, option?: TableReorderOption<T>, index = -1): boolean => {\n if (isChildRow(item)) return true;\n if (!option?.disabled || isGroupHeader(item)) return false;\n return option.disabled(item.data, index);\n};\n\nexport const sameReorderGroup = <T>(a: SdTableItem<T>, b: SdTableItem<T>, allItems: SdTableItem<T>[]): boolean => {\n const groupOf = (item: SdTableItem<T>): number => {\n let lastGroupIdx = -1;\n for (let i = 0; i < allItems.length; i++) {\n if (isGroupHeader(allItems[i])) lastGroupIdx = i;\n if (allItems[i] === item) return lastGroupIdx;\n }\n return -1;\n };\n return groupOf(a) === groupOf(b);\n};\n\nexport const canSortReorder = <T>({ enabled, index, dragItem, allItems = [], hasGroup }: CanSortReorderArgs<T>): boolean => {\n if (!enabled) return false;\n const targetItem = allItems[index];\n if (!isRootReorderRow(targetItem)) return false;\n if (isChildRow(dragItem)) return false;\n if (hasGroup) {\n return sameReorderGroup(dragItem, targetItem, allItems);\n }\n return true;\n};\n\nexport const toReorderItemsIndex = <T>(renderedItems: SdTableItem<T>[], renderedIndex: number): number => {\n let count = 0;\n for (let i = 0; i < renderedIndex; i++) {\n if (isRootReorderRow(renderedItems[i])) count++;\n }\n return count;\n};\n\nexport const reorderTableItems = <T>({\n items,\n renderedItems,\n previousRenderedIndex,\n currentRenderedIndex,\n localItems,\n}: ReorderTableItemsArgs<T>): ReorderTableItemsResult<T> => {\n const fromIndex = toReorderItemsIndex(renderedItems, previousRenderedIndex);\n const toIndex = toReorderItemsIndex(renderedItems, currentRenderedIndex);\n const nextItems = moveItem(items, fromIndex, toIndex);\n let nextLocalItems = localItems;\n\n if (localItems) {\n const localPositions = items.map(item => localItems.indexOf(item));\n if (localPositions.every(p => p >= 0)) {\n nextLocalItems = [...localItems];\n nextItems.forEach((item, i) => {\n nextLocalItems![localPositions[i]] = item;\n });\n }\n }\n\n return {\n items: nextItems,\n localItems: nextLocalItems,\n fromIndex,\n toIndex,\n };\n};\n","import { DestroyRef, Injectable, inject } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdStorageService, SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { map, startWith } from 'rxjs/operators';\nimport { SdTableFilterDefDirective } from '../../directives/sd-table-filter-def.directive';\nimport { SdTableColumnAnyRow } from '../../models/table-column.model';\nimport {\n SdTableExternalFilter,\n SdTableOptionFilter,\n TableFilterConfiguration,\n TableFilterRegister,\n TableFilterValue,\n} from './table-filter.model';\n\n@Injectable()\nexport class SdTableFilterService {\n private storageService = inject(SdStorageService);\n readonly #destroyRef = inject(DestroyRef);\n\n #filterConfiguration = 'GRID-FILTER-CONFIGURATION';\n #filterValue = 'GRID-FILTER-VALUE';\n #cache: Record<string, TableFilterRegister> = {};\n readonly #storageHandles = new Map<\n string,\n {\n configuration: SdStorageWithDefault<TableFilterConfiguration>;\n value: SdStorageWithDefault<TableFilterValue>;\n }\n >();\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {\n this.#destroyRef.onDestroy(() => {\n for (const key of [...this.#storageHandles.keys()]) this.#destroyStorageHandles(key);\n });\n }\n\n #hasOwnValue = (values: Record<string, unknown> | undefined, field: string): boolean => {\n return !!values && Object.prototype.hasOwnProperty.call(values, field);\n };\n\n #resolveKey = (\n filter: SdTableOptionFilter | undefined,\n args: {\n id: string;\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n }\n ) => {\n const { id, columns, externalFilters } = args;\n const tempKey = Utilities.hash({\n id,\n columns: columns?.map(e => e.field).filter(field => !!field) || [],\n externalFilters: externalFilters?.map(e => e.field).filter(field => !!field) || [],\n });\n return {\n tempKey,\n key: filter?.key || tempKey,\n cacheSession: !filter?.key,\n };\n };\n\n // why: `columns` khai báo `SdTableColumnAnyRow[]` (= `SdTableColumn<never>[]`) chứ không phải\n // `SdTableColumn[]`. Service filter chỉ đọc `field`/`type`/`filter` trên cột, không bao giờ chạm dữ\n // liệu hàng; sau khi default generic siết `any → unknown` thì `SdTableColumn<T>` hết tự khớp với\n // `SdTableColumn<unknown>` (T ở vị trí contravariant), nên đây là kiểu đúng thay vì quay lại `any`.\n register = (\n filter: SdTableOptionFilter | undefined,\n args: {\n id: string;\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n columnOperator?: Record<string, Operator>;\n force?: boolean;\n }\n ) => {\n const { key, tempKey, cacheSession } = this.#resolveKey(filter, args);\n if (args.force) {\n this.#destroyStorageHandles(key);\n delete this.#cache[key];\n }\n if (!this.#cache[key]) {\n // Setting của filter configuration\n const filterConfiguration = this.storageService.create<TableFilterConfiguration>(\n {\n prefix: this.#filterConfiguration,\n key,\n },\n {\n default: this.#defaultConfiguration(args),\n type: cacheSession ? 'session' : undefined,\n }\n );\n let filterValue: SdStorageWithDefault<TableFilterValue> | undefined;\n try {\n // Lấy giá trị configuration merge với giá trị defaultShowing của args nếu như args có thay đổi\n filterConfiguration.set(this.#initConfiguration(args, filterConfiguration.get()));\n // Setting của filter value\n filterValue = this.storageService.create<TableFilterValue>(\n {\n prefix: this.#filterValue,\n key: !filter?.cacheable ? tempKey : key,\n },\n {\n default: this.#defaultValue(args),\n type: cacheSession || !filter?.cacheable ? 'session' : undefined,\n }\n );\n // Lấy giá trị value merge với giá trị default của args nếu như args có thay đổi\n filterValue.set(this.#initValue(args, filterValue.get()));\n } catch (error: unknown) {\n filterValue?.destroy();\n filterConfiguration.destroy();\n throw error;\n }\n const activeFilterValue = filterValue;\n this.#storageHandles.set(key, { configuration: filterConfiguration, value: activeFilterValue });\n this.#cache[key] = {\n configuration: {\n get: (): TableFilterConfiguration => {\n return filterConfiguration.get();\n },\n set: (configuration: Partial<TableFilterConfiguration>): TableFilterConfiguration => {\n const { inlineExternal } = configuration;\n filterConfiguration.set({\n inlineExternal: inlineExternal!,\n });\n return {\n inlineExternal: inlineExternal!,\n };\n },\n remove: () => {\n filterConfiguration.set(this.#defaultConfiguration(args));\n },\n observer: filterConfiguration.observer.pipe(\n startWith(filterConfiguration.get()),\n // Sử dụng mặc định nếu bị reset\n map(configuration => configuration || this.#defaultConfiguration(args))\n ),\n },\n value: {\n get: (): TableFilterValue => {\n return activeFilterValue.get();\n },\n set: (value: Partial<TableFilterValue>): TableFilterValue => {\n const keys = Object.keys(value || {});\n const current = activeFilterValue.get();\n const { columnOperator, columnFilter, externalFilter } = current;\n const updatedFilter = {\n // Filter column\n columnOperator: keys.includes('columnOperator') ? value?.columnOperator || {} : columnOperator,\n columnFilter: keys.includes('columnFilter') ? value?.columnFilter || {} : columnFilter,\n // Filter external\n externalFilter: keys.includes('externalFilter') ? value?.externalFilter || {} : externalFilter,\n // Force\n notReload: !!value?.notReload,\n };\n activeFilterValue.set({\n ...updatedFilter,\n // Kiểm tra có đang lọc hay không\n filtered: this.#filtered(value),\n });\n return updatedFilter;\n },\n remove: () => {\n activeFilterValue.set(this.#defaultValue(args));\n },\n observer: activeFilterValue.observer.pipe(\n startWith(activeFilterValue.get()),\n // Sử dụng mặc định nếu bị reset\n map(value => value || this.#defaultValue(args))\n ),\n },\n };\n }\n return this.#cache[key];\n };\n\n #destroyStorageHandles = (key: string): void => {\n const handles = this.#storageHandles.get(key);\n if (!handles) return;\n this.#storageHandles.delete(key);\n handles.configuration.destroy();\n handles.value.destroy();\n };\n\n #filtered = (filterReq: Partial<TableFilterValue>): boolean => {\n const { columnFilter, externalFilter } = filterReq;\n if (\n Object.values({ ...columnFilter, ...externalFilter }).some(val => {\n // Nếu là mảng và mảng có phần tử thì xem như là có filter\n if (Array.isArray(val)) {\n return !!val.length;\n }\n // Nếu là object (date) và có from/to thì xem như là có filter\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n return false;\n };\n\n #defaultConfiguration = (args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n }): TableFilterConfiguration => {\n const { externalFilters } = args;\n const inlineExternal: Record<string, boolean> = {};\n // Filter external\n for (const item of externalFilters || []) {\n inlineExternal[item.field] = !!item?.defaultShowing;\n }\n return {\n // Filter external\n inlineExternal,\n };\n };\n\n #defaultValue = (args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n columnOperator?: Record<string, Operator>;\n }): TableFilterValue => {\n const columnFilter: Record<string, unknown> = {};\n const externalFilter: Record<string, unknown> = {};\n const columnOperator: Record<string, Operator> = args.columnOperator || {};\n const { columns, externalFilters } = args;\n // Filter column\n for (const item of columns || []) {\n columnFilter[item.field] = item?.filter?.default;\n if (item?.filter?.operator?.enable && item?.filter?.operator?.default) {\n columnOperator[item.field] = item.filter.operator.default;\n }\n }\n // Filter external\n for (const item of externalFilters || []) {\n if (item.type === 'daterange') {\n externalFilter[item.field] = {\n from: item.default?.from,\n to: item.default?.to,\n };\n } else {\n externalFilter[item.field] = item?.default;\n }\n // externalFilter[item.field] = item?.default;\n }\n return {\n // Filter column\n columnFilter,\n // Filter external\n externalFilter,\n // columnOperator\n columnOperator,\n };\n };\n\n #initConfiguration = (\n args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n },\n configuration: TableFilterConfiguration\n ): TableFilterConfiguration => {\n const { externalFilters } = args;\n const inlineExternal: Record<string, boolean> = {};\n // Filter external\n for (const item of externalFilters || []) {\n inlineExternal[item.field] = configuration?.inlineExternal?.[item.field] ?? item?.defaultShowing;\n }\n return {\n // Filter external\n inlineExternal,\n };\n };\n\n #initValue = (\n args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n columnOperator?: Record<string, Operator>;\n },\n value: TableFilterValue\n ): TableFilterValue => {\n const columnFilter: Record<string, unknown> = {};\n const externalFilter: Record<string, unknown> = {};\n const columnOperator: Record<string, Operator> = args.columnOperator || {};\n const { columns, externalFilters } = args;\n // Filter column\n for (const item of columns || []) {\n // why: null is a deliberate cached clear from SD controls; only a missing key should fall back to default.\n columnFilter[item.field] = this.#hasOwnValue(value?.columnFilter, item.field)\n ? value?.columnFilter?.[item.field]\n : item?.filter?.default;\n if (item?.filter?.operator?.enable && item?.filter?.operator?.default) {\n columnOperator[item.field] = item.filter.operator.default;\n }\n }\n // Filter external\n for (const item of externalFilters || []) {\n const hasExternalValue = this.#hasOwnValue(value?.externalFilter, item.field);\n if (item.type === 'daterange') {\n externalFilter[item.field] = {\n from: hasExternalValue ? value?.externalFilter?.[item.field]?.from : item.default?.from,\n to: hasExternalValue ? value?.externalFilter?.[item.field]?.to : item.default?.to,\n };\n } else {\n externalFilter[item.field] = hasExternalValue ? value?.externalFilter?.[item.field] : item?.default;\n }\n }\n return {\n // Filter column\n columnFilter,\n // Filter external\n externalFilter,\n // columnOperator\n columnOperator,\n };\n };\n}\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injectable,\n OnDestroy,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTable, MatTableModule } from '@angular/material/table';\nimport { SdExcelColumn, SdNotifyService } from '@sdcorejs/angular/services';\nimport { Subject, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport { debounceTime, map, startWith, switchMap } from 'rxjs/operators';\nimport { SdTableCellDefDirective } from './directives/sd-table-cell-def.directive';\nimport { SdTableExpandDefDirective } from './directives/sd-table-expand-def.directive';\nimport { SdTableGroupDefDirective, SdTableGroupDefContext } from './directives/sd-table-group-def.directive';\nimport { SdTableFilterDefDirective } from './directives/sd-table-filter-def.directive';\nimport { SdMaterialFooterDefDirective } from './directives/sd-table-footer-def.directive';\nimport { SdTableTitleDefDirective } from './directives/sd-table-title-def.directive';\nimport { SdTableCommandHeaderDefDirective } from './directives/sd-table-command-header-def.directive';\nimport { SdTableColumn } from './models/table-column.model';\nimport { SdTableCommand } from './models/table-command.model';\nimport { SdTableOption } from './models/table-option.model';\nimport {\n SdConvertToPagingReq,\n SdTableFilterRequest,\n TableFilterRegister,\n TableFilterValue,\n} from './services/table-filter/table-filter.model';\n\nimport { CdkColumnDef } from '@angular/cdk/table';\nimport { CdkDrag, CdkDragDrop, CdkDropList, DragDropModule } from '@angular/cdk/drag-drop';\nimport { CommonModule, DatePipe, DecimalPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdQuickAction } from '@sdcorejs/angular/components/quick-action';\nimport { SdDesktopDirective, SdHoverCopyDirective, SdMobileDirective, SdScrollDirective } from '@sdcorejs/angular/directives';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\n\nimport { Operator } from '@sdcorejs/utils/models';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ArrayUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\n\nimport { ColumnFilterComponent, ColumnTitleComponent, ExternalFilterComponent, MobileFilterComponent } from './components';\nimport { ConfigComponent } from './components/config/config.component';\nimport { DesktopCellComponent } from './components/desktop-cell/desktop-cell.component';\nimport { DesktopCommand } from './components/command/desktop-command.component';\nimport { SdPopupExport } from './components/popup-export/popup-export.component';\nimport { SelectorActionComponent } from './components/selector-action/selector-action.component';\nimport { DEFAULT_TABLE_CONFIG, ISdTableConfiguration, SD_TABLE_CONFIGURATION } from './configurations';\nimport { SdColumnResizeDirective, StickyShadowDirective } from './directives';\nimport { SdTableItem } from './models/table-item.model';\nimport { ConfiguredTableResult } from './models/table-option-config.model';\nimport { SdGroupPipe } from './pipes/sd-group.pipe';\nimport { SdTreePipe } from './pipes/sd-tree.pipe';\nimport { SdSelectionDisabledPipe } from './pipes/selection-disabled.pipe';\nimport { SdSelectionVisiblePipe } from './pipes/selection-visible.pipe';\nimport { SdTableExportContext, TableExportService, TableFormatService } from './services';\nimport { ConfigService } from './services/config.service';\nimport { buildColumnWidthMap } from './services/column-width.util';\nimport { filterLocalItems } from './services/table-local/table-local.util';\nimport { canSortReorder, isReorderDisabled as isReorderItemDisabled, reorderTableItems } from './services/table-reorder/table-reorder.util';\nimport {\n applyDefaultSelected,\n buildGroupHeaderContext,\n getSelectedRowData,\n getSelectionRows,\n resolveSelectAllState,\n restorePreservedSelection,\n SdGroupHeaderHost,\n syncGroupSelectionMeta,\n syncPreservedSelection,\n} from './services/table-selection/table-selection.util';\nimport { resolveSelectAllVisible } from './services/table-selection/selection-action.util';\nimport { SdTableFilterService } from './services/table-filter/table-filter.service';\nimport {\n clearTreeChildCache,\n collectFormattedTreeRows,\n flattenDataTree,\n getChildrenFromData,\n getChildrenKey,\n getVisibleChildrenData,\n hasLazyChildren,\n initTreeMeta,\n isLazyTree,\n resolveHasChildren,\n saveTreeExpandState,\n} from './services/tree/tree.util';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n// why: tên cũ `MatPaginatorIntlCro` là vết copy-paste từ ví dụ locale Croatia — lớp này chỉ phục vụ\n// nhãn phân trang của `<sd-table>` (VI/EN), không liên quan gì tới tiếng Croatia. Tên cũ lại còn\n// mang tiền tố `Mat`, dễ bị hiểu nhầm là API của Angular Material thay vì export public của lib này.\n@Injectable()\nexport class SdTablePaginatorIntl extends MatPaginatorIntl {\n // i18n labels resolved at construction. Reads VI/EN from I18nService.\n readonly #i18n = inject(I18nService);\n override firstPageLabel = this.#i18n.t('core.component.table.paginator.first-page');\n override lastPageLabel = this.#i18n.t('core.component.table.paginator.last-page');\n override itemsPerPageLabel = this.#i18n.t('core.component.table.paginator.items-per-page');\n override nextPageLabel = this.#i18n.t('core.component.table.paginator.next-page');\n override previousPageLabel = this.#i18n.t('core.component.table.paginator.previous-page');\n\n override getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) {\n return '';\n }\n const from = page * pageSize + 1;\n const to = from + (length - page * pageSize > pageSize ? pageSize : length - page * pageSize) - 1;\n return `${from}-${to}/${NumberUtilities.toISO(length)}`;\n };\n}\n\n/** Mảng rỗng dùng chung — tránh cấp phát `[]` mới trong binding mỗi CD pass. */\nconst EMPTY_COMMANDS: SdTableCommand[] = [];\n\n@Component({\n selector: 'sd-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss', 'table-sticky-shadow.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('detailExpand', [\n state('collapsed', style({ height: '0', minHeight: '0', visibility: 'hidden' })),\n state('expanded', style({ height: '*', visibility: 'visible' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n host: {\n '[attr.data-autoid]': 'autoId()',\n '[attr.data-loading]': 'loading() ? \"true\" : \"false\"',\n },\n providers: [\n DatePipe,\n DecimalPipe,\n CdkColumnDef,\n SdTableFilterService,\n TableFormatService,\n TableExportService,\n ConfigService,\n {\n provide: MatPaginatorIntl,\n useClass: SdTablePaginatorIntl,\n },\n ],\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatPaginatorModule,\n MatTableModule,\n MatSortModule,\n MatProgressSpinnerModule,\n MatCheckboxModule,\n MatRadioModule,\n DragDropModule,\n SdButton,\n DesktopCommand,\n DesktopCellComponent,\n ColumnTitleComponent,\n ExternalFilterComponent,\n ConfigComponent,\n ColumnFilterComponent,\n MobileFilterComponent,\n SdGroupPipe,\n SdTreePipe,\n SdSelectionVisiblePipe,\n SdSafeHtmlPipe,\n SdSelectionDisabledPipe,\n SdScrollDirective,\n SdDesktopDirective,\n SdMobileDirective,\n SdHoverCopyDirective,\n SelectorActionComponent,\n StickyShadowDirective,\n SdColumnResizeDirective,\n SdTranslatePipe,\n ],\n})\nexport class SdTable<T = unknown> implements AfterViewInit, OnDestroy {\n // ... (Giữ nguyên toàn bộ phần khai báo biến, constructor, lifecycle hooks và các hàm filter, load, export, v.v...)\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `components-table-${this.autoIdInput()}` : undefined));\n option = input.required<SdTableOption<T>>();\n\n // ==========================================\n // 2. SIGNAL QUERIES\n // ==========================================\n table = viewChild(MatTable);\n configComponent = viewChild(ConfigComponent);\n sdPopupExport = viewChild(SdPopupExport);\n scroll = viewChild(SdScrollDirective);\n quickAction = viewChild(SdQuickAction);\n externalFilter = viewChild(ExternalFilterComponent);\n mobileFilter = viewChild(MobileFilterComponent);\n paginator = viewChild(MatPaginator);\n sort = viewChild(MatSort);\n\n sdSubInformation = contentChild(SdTableExpandDefDirective);\n sdGroupDef = contentChild(SdTableGroupDefDirective);\n sdCellDefs = contentChildren(SdTableCellDefDirective);\n /** Nội dung tuỳ chọn cho ô header của cột command (mặc định ô này để trống). */\n sdCommandHeaderDef = contentChild(SdTableCommandHeaderDefDirective);\n sdFooterDefs = contentChildren(SdMaterialFooterDefDirective);\n sdFilterDefs = contentChildren(SdTableFilterDefDirective);\n sdTitleDefs = contentChildren(SdTableTitleDefDirective);\n\n // ==========================================\n // 3. COMPUTED FROM QUERIES\n // ==========================================\n cellDef = computed(() => {\n const map: Record<string, SdTableCellDefDirective> = {};\n for (const def of this.sdCellDefs()) {\n const field = def.sdTableCellDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n footerDef = computed(() => {\n const map: Record<string, SdMaterialFooterDefDirective> = {};\n for (const def of this.sdFooterDefs()) {\n const field = def.sdTableFooterDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n hasFooter = computed(() => Object.keys(this.footerDef()).length > 0);\n\n titleDef = computed(() => {\n const map: Record<string, SdTableTitleDefDirective> = {};\n for (const def of this.sdTitleDefs()) {\n const field = def.sdTableTitleDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n // ==========================================\n // 4. SIGNAL STATE\n // ==========================================\n tableOption = signal<SdTableOption<T> | undefined>(undefined);\n configuration = signal<ConfiguredTableResult | undefined>(undefined);\n\n items = signal<SdTableItem<T>[]>([]);\n selectedTableItems = signal<SdTableItem<T>[]>([]);\n total = signal<number | undefined>(undefined);\n\n loading = signal(false);\n isSelectAll = signal(false);\n\n /**\n * Checkbox \"chọn tất cả\" ở header có hiển thị không.\n *\n * why: trước đây là `_items | selectionVisibleSelectAll: … | async` — pipe `async`\n * với `await setTimeout(500)` bên trong. Sleep đó CHE một vấn đề thứ tự\n * change-detection: pipe đọc `meta.selector.actions`, mảng chỉ được `SdSelectionVisiblePipe`\n * ghi khi cell BODY render, mà CDK dựng header TRƯỚC body → pass đầu luôn đọc ra rỗng.\n * Hệ quả: checkbox hiện trễ 500ms, và vì `transform` là `async` nên MỖI lần re-eval lại\n * trả một Promise mới + đặt thêm một timer không ai dọn. Computed tự tính từ\n * `items()` + `selector` nên không phụ thuộc pipe nào chạy trước → bỏ hẳn timer.\n */\n visibleSelectAll = computed(() => resolveSelectAllVisible(this.items(), this.tableOption()?.selector));\n\n /**\n * Danh sách command của row, memoize theo option.\n * why: template cũ bind `_tableOption.command?.commands || _tableOption.commands || []`\n * — nhánh `[]` cấp phát mảng MỚI mỗi CD pass và đẩy vào `input()` của `desktop-command`,\n * làm child OnPush bị đánh dấu dirty mỗi pass cho từng dòng.\n */\n rowCommands = computed(() => {\n const opt = this.tableOption();\n return opt?.command?.commands || opt?.commands || EMPTY_COMMANDS;\n });\n\n isFiltered = signal(false);\n requireFiltered = signal(false);\n\n #tableId = Utilities.generateUuid();\n filterRegister!: TableFilterRegister;\n key = Utilities.generateUuid();\n\n columnOperator: Record<string, Operator> = {};\n columnFilter?: NonNullable<TableFilterValue['columnFilter']> = {};\n\n #localItems: SdTableItem<T>[] = [];\n #subscription = new Subscription();\n #configurationSubscription?: Subscription;\n #filterRegisterSubscription?: Subscription;\n #optionInstance?: SdTableOption<T>;\n #optionRevision = 0;\n #reload = new Subject<{ force: boolean; revision: number }>();\n #loadCompleted = false;\n\n cacheValues: Record<string, unknown[]> = {};\n #cacheObjValues: Record<string, Record<string, string>> = {};\n #itemIndexMap = new WeakMap<SdTableItem<T>, number>();\n #treeExpandState = new Map<string, boolean>();\n treeRevision = signal(0);\n // Search ở cấp con (static tree + type 'local'): predicate khớp 1 dòng theo\n // column filter hiện hành. Set ở #filterLocal khi có filter active, đọc lại ở\n // #render/#ensureChildItemsFormatted dùng predicate này để prune + auto-expand các\n // nhánh có node con khớp. undefined = không search → cây render bình thường.\n #treeSearchPredicate?: (data: T) => boolean;\n // Lần render trước có đang ở chế độ search hay không (để xử lý chuyển trạng thái).\n #treeSearchActive = false;\n\n // 1. Private Services\n #ref = inject(ChangeDetectorRef);\n #configService = inject(ConfigService);\n #gridFilterService = inject(SdTableFilterService);\n #notifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n #tableFormatService = inject(TableFormatService);\n #tableExportService = inject(TableExportService);\n\n // Expose state signals từ TableExportService cho template binding.\n exporting = this.#tableExportService.exporting;\n exportTitle = this.#tableExportService.exportTitle;\n\n // 2. Public & Optional Token\n tableConfiguration = inject<ISdTableConfiguration>(SD_TABLE_CONFIGURATION, { optional: true });\n\n constructor() {\n effect(() => {\n const option = this.option();\n if (option) {\n untracked(() => {\n if (this.#optionInstance !== option) {\n this.#optionInstance = option;\n this.#resetStateForNewOption();\n }\n const optionRevision = this.#optionRevision;\n const initOpt = this.#initConfiguration({ ...option });\n this.tableOption.set(initOpt);\n this.#loadCompleted = false;\n\n const storage = this.#configService.init(initOpt);\n this.#configurationSubscription?.unsubscribe();\n this.#configurationSubscription = storage.observer.pipe(startWith(storage.subject.getValue())).subscribe(() => {\n if (optionRevision !== this.#optionRevision) return;\n const configurationResult = this.#configService.loadConfigurationResult(initOpt, storage.get());\n const displayColumns = configurationResult.displayedColumns || [];\n this.#ref.detectChanges();\n this.#tableFormatService\n .loadValues(\n initOpt.columns.filter(column => displayColumns.includes(column.field)),\n this.cacheValues,\n this.#cacheObjValues\n )\n .then(() => {\n if (optionRevision !== this.#optionRevision) return;\n this.configuration.set(configurationResult);\n this.#loadFilterRegister();\n if (this.filterRegister) {\n this.#requestReload(true);\n }\n })\n .finally(() => {\n if (optionRevision !== this.#optionRevision) return;\n this.#ref.detectChanges();\n });\n });\n this.#subscription.add(this.#configurationSubscription);\n });\n }\n });\n\n effect(() => {\n const paginator = this.paginator();\n if (paginator) {\n untracked(() => {\n this.#subscription.add(paginator.page.subscribe(() => this.#requestReload(false)));\n });\n }\n });\n\n effect(() => {\n const sort = this.sort();\n if (sort) {\n untracked(() => {\n this.#subscription.add(sort.sortChange.subscribe(() => this.#requestReload(false)));\n });\n }\n });\n\n effect(() => {\n const items = this.items();\n this.#itemIndexMap = new WeakMap();\n items.forEach((item, idx) => this.#itemIndexMap.set(item, idx));\n });\n\n this.#subscription.add(\n this.#configService.widthChange$.subscribe(({ field, width }) => {\n // Update configuration signal local — KHÔNG gọi loadValues/reload\n const conf = this.configuration();\n if (!conf) return;\n const firstColumns = conf.firstColumns.map(c => (c.field === field ? { ...c, width } : c));\n const column = { ...conf.column };\n if (column[field]) {\n column[field] = { ...column[field], width };\n }\n const fixedColumn = { ...conf.fixedColumn };\n if (fixedColumn[field]) {\n fixedColumn[field] = { ...fixedColumn[field], width };\n }\n this.configuration.set({ ...conf, firstColumns, column, fixedColumn });\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(\n this.#reload\n .pipe(\n debounceTime(200),\n switchMap(async data => {\n if (data.revision !== this.#optionRevision || !this.filterRegister) return undefined;\n const filterInfo = this.getFilterRequest();\n const result = await this.#load(filterInfo, !this.#loadCompleted || data.force);\n if (data.revision !== this.#optionRevision) return undefined;\n this.#loadCompleted = true;\n return {\n result,\n revision: data.revision,\n };\n })\n )\n .subscribe(loadResult => {\n if (!loadResult || loadResult.revision !== this.#optionRevision) return;\n this.#render(loadResult.result);\n })\n );\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n // --- GIỮ NGUYÊN TẤT CẢ CÁC HÀM FILTER VÀ EXPORT CŨ CỦA BẠN ---\n #filterExportInfo = (pageNumber: number, pageSize: number): SdTableFilterRequest => {\n const { columnOperator, columnFilter, externalFilter } = this.filterRegister.value.get();\n return {\n columnOperator: columnOperator || {},\n rawColumnFilter: columnFilter || {},\n rawExternalFilter: externalFilter || {},\n orderBy: this.sort()?.active || '',\n orderDirection: this.sort()?.direction === 'asc' ? 'ASC' : this.sort()?.direction === 'desc' ? 'DESC' : undefined,\n pageNumber,\n pageSize,\n isExported: true,\n };\n };\n\n #requestReload = (force: boolean) => {\n this.#reload.next({ force, revision: this.#optionRevision });\n };\n\n #resetStateForNewOption = () => {\n this.#optionRevision += 1;\n this.#configurationSubscription?.unsubscribe();\n this.#configurationSubscription = undefined;\n this.#filterRegisterSubscription?.unsubscribe();\n this.#filterRegisterSubscription = undefined;\n this.filterRegister = undefined!;\n\n this.#tableId = Utilities.generateUuid();\n this.key = Utilities.generateUuid();\n this.#loadCompleted = false;\n\n this.tableOption.set(undefined);\n this.configuration.set(undefined);\n this.items.set([]);\n this.selectedTableItems.set([]);\n this.total.set(undefined);\n this.loading.set(false);\n this.isSelectAll.set(false);\n this.isFiltered.set(false);\n this.requireFiltered.set(false);\n\n this.columnOperator = {};\n this.#syncColumnFilterInPlace({});\n this.#localItems = [];\n this.cacheValues = {};\n this.#cacheObjValues = {};\n this.#itemIndexMap = new WeakMap();\n this.#treeExpandState.clear();\n this.#treeSearchPredicate = undefined;\n this.#treeSearchActive = false;\n this.groupExpandState.clear();\n this.#preservedSelectedMap.clear();\n this.treeRevision.update(n => n + 1);\n\n if (this.paginator()) {\n this.paginator()!.pageIndex = 0;\n }\n const sort = this.sort();\n if (sort) {\n sort.active = '';\n sort.direction = '';\n }\n };\n\n #initConfiguration = (option: SdTableOption): SdTableOption => {\n option.paginate = {\n hidden: option?.paginate?.hidden,\n pageSize: option?.paginate?.pageSize ?? this.tableConfiguration?.paginate?.pageSize ?? DEFAULT_TABLE_CONFIG.paginate?.pageSize,\n pages: option?.paginate?.pages ?? this.tableConfiguration?.paginate?.pages ?? DEFAULT_TABLE_CONFIG.paginate?.pages,\n showFirstLastButtons: option?.paginate?.showFirstLastButtons ?? this.tableConfiguration?.paginate?.showFirstLastButtons ?? false,\n hidePageSize: option?.paginate?.hidePageSize ?? false,\n };\n option.filter = option.filter || {};\n option.filter.hideInlineFilter = option?.filter?.hideInlineFilter ?? this.tableConfiguration?.filter?.hideInlineFilter;\n option.filter.externalFilterPerRow = option?.filter?.externalFilterPerRow ?? this.tableConfiguration?.filter?.externalFilterPerRow;\n option.filter.manualFilter = option?.filter?.manualFilter ?? this.tableConfiguration?.filter?.manualFilter;\n option.filter.hideExternalFilterToolbar =\n option?.filter?.hideExternalFilterToolbar ?? this.tableConfiguration?.filter?.hideExternalFilterToolbar;\n for (const column of option.columns || []) {\n if (column.filter?.operator?.enable) {\n if (!column.filter?.operator?.list?.length) {\n column.filter.operator.list = this.tableConfiguration?.filter?.operator?.list?.[column.type] || [];\n }\n\n const defaultOperator = this.tableConfiguration?.filter?.operator?.default?.[column.type];\n if (defaultOperator) {\n this.columnOperator[column.field] = defaultOperator;\n }\n if (column.filter.operator.default && column.filter.operator.list?.some(el => el === column.filter?.operator?.default)) {\n this.columnOperator[column.field] = column.filter.operator.default;\n }\n }\n }\n return option;\n };\n\n #loadFilterRegister = () => {\n const opt = this.tableOption();\n if (!opt || this.filterRegister) return;\n\n this.filterRegister = this.#gridFilterService.register(opt?.filter, {\n id: this.#tableId,\n columns: opt?.columns,\n externalFilters: opt?.filter?.externalFilters,\n filterDefs: [...this.sdFilterDefs()],\n columnOperator: this.columnOperator,\n force: true,\n });\n\n const { columnOperator, columnFilter } = this.filterRegister.value.get();\n this.columnOperator = columnOperator || {};\n this.#syncColumnFilterInPlace(columnFilter || {});\n\n this.#filterRegisterSubscription?.unsubscribe();\n this.#filterRegisterSubscription = this.filterRegister.value.observer\n .pipe(\n debounceTime(500),\n map(filterValue => {\n const { columnOperator, columnFilter, notReload } = filterValue;\n this.columnOperator = columnOperator || {};\n // Sync IN PLACE — không gán object clone mới. column-filter chia sẻ\n // reference this.columnFilter qua [columnFilter] input; nếu gán clone\n // mới, cf giữ ref cũ (do OnPush + reload async lag) → ghi clear vào\n // object orphan → giá trị cũ persist. Giữ ref ổn định để cf + table\n // luôn trỏ cùng 1 object.\n this.#syncColumnFilterInPlace(columnFilter || {});\n if (!notReload) {\n if (this.paginator()) {\n this.paginator()!.pageIndex = 0;\n }\n this.#requestReload(false);\n }\n })\n )\n .subscribe();\n this.#subscription.add(this.#filterRegisterSubscription);\n };\n\n // Đồng bộ this.columnFilter với `next` mà GIỮ NGUYÊN reference object.\n // column-filter chia sẻ ref này qua [columnFilter] — reassign clone mới sẽ\n // orphan ref cũ (cf vẫn ghi vào đó do CD lag) khiến clear/giá trị stale.\n #syncColumnFilterInPlace = (next: NonNullable<TableFilterValue['columnFilter']>) => {\n const cur = this.columnFilter ?? (this.columnFilter = {});\n if (cur === next) return;\n for (const key of Object.keys(cur)) {\n if (!(key in next)) delete cur[key];\n }\n Object.assign(cur, next);\n };\n\n #filterLocal = <TItem extends SdTableItem<T> | T>(localItems: TItem[], filterInfo: SdTableFilterRequest<T>) => {\n const result = filterLocalItems(localItems, this.tableOption()!, filterInfo);\n this.#treeSearchPredicate = result.treeSearchPredicate;\n return {\n items: result.items,\n total: result.total,\n };\n };\n\n getFilterRequest = (): SdTableFilterRequest => {\n const { columnOperator, columnFilter, externalFilter } = this.filterRegister.value.get();\n return {\n columnOperator: columnOperator || {},\n rawColumnFilter: columnFilter || {},\n rawExternalFilter: externalFilter || {},\n orderBy: this.sort()?.active || '',\n orderDirection: this.sort()?.direction === 'asc' ? 'ASC' : this.sort()?.direction === 'desc' ? 'DESC' : undefined,\n pageNumber: this.paginator()?.pageIndex || 0,\n pageSize: this.paginator()?.pageSize || this.tableOption()?.paginate?.pageSize || 50,\n visibledColumns: ArrayUtilities.union('field', this.configuration()?.firstColumns || [], this.configuration()?.secondColumns || []),\n };\n };\n\n #isFiltered = (filterReq: SdTableFilterRequest) => {\n const { pageNumber, rawColumnFilter, rawExternalFilter } = filterReq;\n if (pageNumber !== 0) {\n return true;\n }\n if (\n Object.values({ ...rawColumnFilter }).some(val => {\n if (Array.isArray(val)) {\n return !!val.length;\n }\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n if (\n Object.values({ ...rawExternalFilter }).some(val => {\n if (Array.isArray(val)) {\n return !!val.length;\n }\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n return false;\n };\n\n #checkFilter = (filterReq: SdTableFilterRequest) => {\n this.isFiltered.set(this.#isFiltered(filterReq));\n this.requireFiltered.set(!!this.tableOption()?.filter?.externalFilters?.some(e => e.required));\n };\n\n #load = async (\n filterReq: SdTableFilterRequest,\n force = true\n ): Promise<{\n items: SdTableItem<T>[];\n total: number;\n }> => {\n this.loading.set(true);\n this.#ref.detectChanges();\n this.#checkFilter(filterReq);\n\n const opt = this.tableOption()!;\n if (opt.type === 'server') {\n const { items, onFilter } = opt;\n try {\n onFilter?.(filterReq, {\n externalFilterValid: !this.externalFilter()?.form?.invalid,\n });\n } catch (err) {\n console.error(err);\n }\n if (this.externalFilter()?.form?.invalid) {\n this.loading.set(false);\n this.#ref.detectChanges();\n return {\n items: [],\n total: 0,\n };\n }\n const pagingReq = SdConvertToPagingReq(filterReq, {\n columns: opt.columns,\n externalFilters: opt.filter?.externalFilters,\n });\n const data = await items(filterReq, pagingReq).catch(err => {\n console.error(err);\n return {\n items: [] as T[],\n total: 0,\n };\n });\n return {\n items: await this.#tableFormatService\n .format(data?.items, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey)\n .finally(() => {\n this.loading.set(false);\n this.#ref.detectChanges();\n }),\n total: data?.total || 0,\n };\n }\n if (force) {\n const { items } = opt;\n const results = items();\n let data: T[] = [];\n if (results instanceof Promise) {\n data = await results.catch(err => {\n this.#notifyService.warning(this.#i18n.t('core.component.table.error-occurred'));\n console.error(err);\n return [];\n });\n } else {\n data = results;\n }\n if (!Array.isArray(data)) {\n this.#notifyService.warning(this.#i18n.t('core.component.table.not-an-array'));\n data = [];\n }\n this.#localItems = await this.#tableFormatService.format(data, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey);\n }\n this.loading.set(false);\n this.#ref.detectChanges();\n return this.#filterLocal(this.#localItems, filterReq);\n };\n\n #render = async (\n args: { items: SdTableItem<T>[]; total: number },\n scrollTop = true,\n additionArgs?: { fromSource?: 'PAGING' | 'RELOAD' }\n ) => {\n if (scrollTop) {\n this.scroll()?.scrollTop();\n }\n\n const treeOpt = this.tableOption()?.tree;\n const searchNow = !!this.#treeSearchPredicate;\n if (treeOpt) {\n // why: KHÔNG persist trạng thái bung bị ÉP trong lúc search (tránh nhánh\n // tự bung do search bị ghi nhầm thành lựa chọn của user sau khi clear).\n if (!this.#treeSearchActive) {\n saveTreeExpandState(this.items(), this.#treeExpandState);\n }\n // why: search vừa tắt → childItems đang là tập đã prune theo từ khoá cũ;\n // xoá cache để dựng lại đầy đủ children ở chế độ thường.\n if (this.#treeSearchActive && !searchNow) {\n clearTreeChildCache(this.#localItems);\n }\n }\n\n this.items.set(args?.items || []);\n this.total.set(args?.total || 0);\n\n if (treeOpt) {\n initTreeMeta(this.items(), treeOpt, {\n expandState: this.#treeExpandState,\n treeSearchPredicate: this.#treeSearchPredicate,\n });\n await this.#expandDefaultBranches(this.items(), treeOpt);\n this.treeRevision.update(n => n + 1);\n }\n this.#treeSearchActive = searchNow;\n\n // Restore selection từ preservedSelectedMap (chỉ khi preserveSelection bật).\n // Phải chạy TRƯỚC applyDefaultSelected để user-selection ưu tiên hơn default.\n this.#restorePreservedSelection();\n\n // Áp dụng defaultSelected: pre-select các item thỏa predicate\n this.#applyDefaultSelected();\n\n // Resolve style.rowCss 1 lần/row cho lần render này (xem #applyRowStyles).\n this.#applyRowStyles();\n\n await this.tableOption()?.reload?.onReload?.(this.items(), additionArgs);\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n\n setTimeout(() => {\n this.table()?.updateStickyColumnStyles();\n }, 0);\n };\n\n reload = async (force = true, scrollTop = true) => {\n this.externalFilter()?.updateFilter?.();\n // Commit pending column filter value (input/input-number gõ dở chưa enter/blur)\n // vào filterRegister trước khi đọc filter request — tránh storage stale.\n this.filterRegister?.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n notReload: true,\n });\n const data = await this.#load(this.getFilterRequest(), force);\n this.#render(data, scrollTop, { fromSource: 'RELOAD' });\n };\n\n #exportedItems = async (pageNumber = 0, pageSize = 100) => {\n const opt = this.tableOption()!;\n if (opt.export?.type === 'default' && opt.export?.items) {\n let result = opt.export?.items(this.#filterExportInfo(pageNumber, pageSize));\n if (Array.isArray(result)) {\n return result;\n }\n if (isObservable(result)) {\n result = firstValueFrom(result) as typeof result;\n }\n if (isObservable(result)) {\n result = firstValueFrom(result) as typeof result;\n }\n return await result;\n } else {\n const filterReq = this.#filterExportInfo(pageNumber, pageSize);\n if (opt.type === 'server') {\n const pagingReq = SdConvertToPagingReq(filterReq, {\n columns: opt.columns,\n externalFilters: opt.filter?.externalFilters,\n });\n const result = opt.items(filterReq, pagingReq);\n return await result;\n } else {\n let exportedItems: T[] = [];\n if (typeof opt.items === 'function') {\n const results = opt.items();\n if (results instanceof Promise) {\n exportedItems = await results;\n } else {\n exportedItems = results;\n }\n } else {\n exportedItems = opt.items;\n }\n if (opt.tree) {\n exportedItems = flattenDataTree(exportedItems, opt.tree);\n }\n return this.#filterLocal(exportedItems, filterReq);\n }\n }\n };\n\n // Helper tạo Context truyền cho Service\n #createExportContext = (): SdTableExportContext => {\n return {\n option: this.tableOption()!,\n configuration: this.configuration(),\n total: this.total() || 0,\n cacheObjValues: this.#cacheObjValues,\n getFilterInfo: () => this.getFilterRequest(),\n fetchChunk: (pageNumber: number, pageSize: number) => this.#exportedItems(pageNumber, pageSize),\n };\n };\n\n exportExcel = (columns?: SdExcelColumn[]) => {\n this.#tableExportService.exportExcel(this.#createExportContext(), columns);\n };\n\n exportCSV = (columns?: SdExcelColumn[]) => {\n this.#tableExportService.exportCSV(this.#createExportContext(), columns);\n };\n\n exportCustom = () => {\n this.#tableExportService.exportCustom(this.#createExportContext());\n };\n\n #ensureChildItemsFormatted = async (row: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n const treeOpt = opt.tree!;\n const searchActive = !!this.#treeSearchPredicate;\n // Bình thường cache childItems. Khi search, LUÔN dựng lại theo tập đã prune\n // vì tập này phụ thuộc từ khoá (đổi mỗi lần gõ) nên không thể cache.\n if (!searchActive && row.meta.tree?.childItems?.length) return;\n const raw = getVisibleChildrenData(row.data, treeOpt, this.#treeSearchPredicate);\n if (!raw.length) {\n if (searchActive && row.meta.tree) row.meta.tree.childItems = [];\n return;\n }\n const formatted = await this.#tableFormatService.format(raw, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey);\n row.meta.tree!.childItems = formatted;\n initTreeMeta(formatted, treeOpt, {\n level: (row.meta.tree!.level ?? 0) + 1,\n parentId: row.meta.id,\n expandState: this.#treeExpandState,\n treeSearchPredicate: this.#treeSearchPredicate,\n });\n };\n\n #expandDefaultBranches = async (rows: SdTableItem<T>[], option: NonNullable<SdTableOption<T>['tree']>) => {\n const maxDepth = option.maxDepth;\n for (const row of rows) {\n if (!row.meta.tree?.isExpanded || !row.meta.tree.hasChildren) continue;\n const level = row.meta.tree.level ?? 0;\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n await this.#ensureChildItemsFormatted(row);\n const children = row.meta.tree.childItems ?? [];\n if (children.length) {\n await this.#expandDefaultBranches(children, option);\n }\n }\n };\n\n onTreeToggle = async (row: SdTableItem<T>) => {\n const treeOpt = this.tableOption()?.tree;\n if (!treeOpt || !row.meta.tree?.hasChildren || row.meta.tree.isExpanding) return;\n\n if (row.meta.tree.isExpanded) {\n row.meta.tree.isExpanded = false;\n this.#treeExpandState.delete(row.meta.id);\n // why: `rowCss` nhận ctx `{ level, hasChildren, isExpanded }`, nên style của row PHẢI được\n // tính lại khi collapse — không chỉ khi expand. Thiếu dòng này thì `meta.rowStyle` giữ mãi\n // style của trạng thái đang mở.\n this.#applyRowStyles();\n this.treeRevision.update(n => n + 1);\n this.#ref.markForCheck();\n return;\n }\n\n try {\n // isLazyTree() narrow treeOpt về TableOptionTreeLazy → truy cập onExpandChildren an toàn.\n if (isLazyTree(treeOpt) && hasLazyChildren(row, treeOpt)) {\n row.meta.tree.isExpanding = true;\n this.#ref.markForCheck();\n const key = getChildrenKey(treeOpt);\n const result = await Promise.resolve(treeOpt.onExpandChildren(row.data));\n (row.data as Record<string, unknown>)[key] = Array.isArray(result) ? result : [];\n row.meta.tree.hasChildren = resolveHasChildren(row, treeOpt);\n }\n await this.#ensureChildItemsFormatted(row);\n if (!row.meta.tree.childItems?.length && getChildrenFromData(row.data, treeOpt).length === 0) {\n row.meta.tree.hasChildren = false;\n return;\n }\n row.meta.tree.isExpanded = true;\n this.#treeExpandState.set(row.meta.id, true);\n const maxDepth = treeOpt.maxDepth;\n const level = row.meta.tree.level ?? 0;\n if (maxDepth === undefined || level + 1 < maxDepth) {\n await this.#expandDefaultBranches(row.meta.tree.childItems ?? [], treeOpt);\n }\n } catch (err) {\n console.error(err);\n this.#notifyService.warning(this.#i18n.t('core.component.table.error-occurred'));\n } finally {\n if (row.meta.tree) {\n row.meta.tree.isExpanding = false;\n }\n // Children mới format + level/isExpanded vừa đổi → refresh cache rowStyle.\n this.#applyRowStyles();\n this.treeRevision.update(n => n + 1);\n this.#ref.markForCheck();\n }\n };\n\n onFilterChange = () => {\n this.externalFilter()?.updateFilter?.();\n this.filterRegister.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n });\n };\n\n // Blur input filter: chỉ commit giá trị vào filterRegister, KHÔNG trigger reload.\n // Reload chỉ chạy khi user enter hoặc bấm nút tải lại.\n onFilterCommit = () => {\n this.filterRegister?.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n notReload: true,\n });\n };\n\n onExpand = async (rowData: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n if (opt.expand?.always || rowData.meta.expand?.isExpanding) {\n return;\n }\n if (rowData.meta.expand?.isExpanded) {\n rowData.meta.expand.isExpanded = false;\n return;\n }\n const data = opt.expand?.onExpand?.(rowData.data);\n if (!opt.expand?.multiple) {\n this.items().forEach(item => (item.meta.expand!.isExpanding = item.meta.expand!.isExpanded = false));\n }\n if (data instanceof Promise) {\n rowData.meta.expand!.isExpanding = true;\n data\n .then(res => {\n rowData.meta.expand!.data = res;\n rowData.meta.expand!.isExpanded = true;\n })\n .finally(() => (rowData.meta.expand!.isExpanding = false));\n } else {\n rowData.meta.expand!.data = data;\n rowData.meta.expand!.isExpanded = true;\n }\n };\n\n onSelect = (rowData: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n const selectedData = () => this.#getSelectedRowData();\n if (rowData.meta.group?.items?.length) {\n rowData.meta.group.items.forEach(e => (e.meta.selector!.isSelected = rowData.meta.selector!.isSelected));\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n } else {\n if (opt.selector?.single) {\n this.#getSelectionRows()\n .filter(e => e !== rowData)\n .forEach(e => (e.meta.selector!.isSelected = false));\n // single + preserve: chỉ giữ MỘT item trong map (item vừa chọn nếu isSelected,\n // hoặc empty nếu vừa bỏ chọn). Off-page items có thể đã ở trong map → xoá hết\n // trước khi #updateSelectedItems sync entry mới.\n if (this.#preserveEnabled()) {\n this.#preservedSelectedMap.clear();\n }\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.isSelectAll.set(false);\n this.#updateSelectedItems();\n return;\n }\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n }\n };\n\n onSelectAll = () => {\n const opt = this.tableOption();\n const isSelected = this.isSelectAll();\n this.#getSelectionRows().forEach(e => {\n if (e.meta.selector!.selectable && (!opt?.selector?.actions?.length || e.meta.selector!.actions?.length)) {\n e.meta.selector!.isSelected = isSelected;\n }\n });\n opt?.selector?.onSelectAll?.(this.#getSelectedRowData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n };\n\n onClearSelection = (items?: SdTableItem<T>[]) => {\n items = items || this.items();\n this.isSelectAll.set(false);\n items?.forEach(e => (e.meta.selector!.isSelected = false));\n // User explicit X — clear toàn bộ preserved map (bao gồm cả off-page items).\n if (this.#preserveEnabled()) {\n this.#preservedSelectedMap.clear();\n }\n this.#updateSelectedItems();\n };\n\n #getSelectionRows = (): SdTableItem<T>[] => {\n return getSelectionRows(this.items(), this.tableOption()?.tree);\n };\n\n #getSelectedRowData = (): T[] => getSelectedRowData(this.#getSelectionRows());\n\n #applyDefaultSelected = () => {\n applyDefaultSelected(this.items(), this.tableOption()?.tree, this.tableOption()?.selector?.defaultSelected);\n };\n\n #syncSelectAllState = () => {\n this.isSelectAll.set(resolveSelectAllState(this.#getSelectionRows()));\n };\n\n // ==========================================\n // GROUP HELPERS — sync selection + expand state cho group header rows\n // ==========================================\n\n /** Children selectable của 1 group header (lọc bỏ children không selectable). */\n #groupSelectableChildren = (header: SdTableItem<T>): SdTableItem<T>[] => {\n const children = header.meta.group?.items || [];\n return children.filter(c => c.meta.selector?.selectable !== false);\n };\n\n /** true nếu MỌI selectable child trong group đều selected. Group rỗng (không child) → false. */\n isGroupAllSelected = (header: SdTableItem<T>): boolean => {\n const sel = this.#groupSelectableChildren(header);\n return sel.length > 0 && sel.every(c => c.meta.selector!.isSelected);\n };\n\n /** true nếu CÓ MỘT VÀI selectable child selected nhưng KHÔNG phải tất cả. */\n isGroupIndeterminate = (header: SdTableItem<T>): boolean => {\n const sel = this.#groupSelectableChildren(header);\n if (sel.length === 0) return false;\n const some = sel.some(c => c.meta.selector!.isSelected);\n const all = sel.every(c => c.meta.selector!.isSelected);\n return some && !all;\n };\n\n /** Toggle select-all cho 1 group: set isSelected cho mọi selectable child, sync state. */\n onSelectGroup = (header: SdTableItem<T>, checked: boolean) => {\n const sel = this.#groupSelectableChildren(header);\n sel.forEach(c => (c.meta.selector!.isSelected = checked));\n const opt = this.tableOption();\n opt?.selector?.onSelectAll?.(this.#getSelectedRowData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n };\n\n // Map<groupKey, isExpanded> — table own state, pass vào SdGroupPipe arg 3.\n // why: pipe stateless, persist toggle qua các lần re-eval bằng Map external. Mutate Map\n // KHÔNG tự re-trigger pipe (default pure: true) — gọi items.update để invalidate input.\n groupExpandState = new Map<string, boolean>();\n\n /**\n * Cầu nối tới SdGroupPipe (arg 4) — object DUY NHẤT, tạo một lần.\n * why: pipe sinh group header nhưng component mới là nơi biết selection đổi. Pipe đổ\n * header vào `headers` để `#syncGroupSelectionState` cập nhật `meta.group.isSelected` /\n * `indeterminate`, thay cho việc template gọi `isGroupAllSelected()`/`isGroupIndeterminate()`\n * (duyệt toàn bộ children) ở MỖI CD pass.\n */\n readonly groupHost: SdGroupHeaderHost<T> = {\n headers: [],\n toggleExpand: header => this.toggleGroupExpand(header),\n // why: hướng toggle phải tính LIVE. Đọc `meta.group.isSelected` (cache do pipe ghi lúc\n // dựng header, trước khi `selectable` của children được đặt) làm click đầu tiên sau mỗi\n // lần render toggle ngược chiều.\n toggleSelect: header => this.onSelectGroup(header, !this.isGroupAllSelected(header)),\n };\n\n /**\n * Tính lại selection state cho mọi group header của lần render gần nhất.\n *\n * why: giữ `meta.group.isSelected`/`indeterminate` đúng cho consumer đọc meta trực tiếp.\n * Template và `groupContext()` KHÔNG dựa vào nó (chúng tính live) — vì hàm này chạy trong\n * `#render`, trước khi CD kế tiếp cho `SdGroupPipe` dựng lại `groupHost.headers`, nên nó\n * luôn thao tác trên danh sách header của lần render TRƯỚC (rỗng ở lần render đầu).\n */\n #syncGroupSelectionState = () => {\n for (const header of this.groupHost.headers) {\n syncGroupSelectionMeta(header);\n }\n };\n\n /** Toggle expand/collapse cho 1 group (chỉ ý nghĩa khi option.group.collapsible). */\n toggleGroupExpand = (header: SdTableItem<T>) => {\n if (!header.meta.group?.key) return;\n const key = header.meta.group.key;\n const defaultExpanded = !this.tableOption()?.group?.defaultCollapsed;\n const current = this.groupExpandState.has(key) ? !!this.groupExpandState.get(key) : defaultExpanded;\n this.groupExpandState.set(key, !current);\n header.meta.group.isExpanded = !current;\n // why: trigger pipe re-eval — Map mutation không thay đổi reference items() nên cần update.\n this.items.update(arr => [...arr]);\n };\n\n /**\n * Predicate cho matRowDef.when — phân biệt group header row vs data row.\n * Group header row dùng matRowDef riêng với column list ['sdGroupHeader'] (1 cell duy nhất).\n * Data row dùng displayedColumns nguyên vẹn.\n */\n isGroupHeaderRow = (_idx: number, row: SdTableItem<T>): boolean => row?.meta?.group?.isGroupHeader === true;\n isDataRow = (_idx: number, row: SdTableItem<T>): boolean => row?.meta?.group?.isGroupHeader !== true;\n\n /**\n * Colspan cho cell sdGroupHeader trên group row = displayedColumns.length.\n * Span TOÀN BỘ width data row vì group row chỉ có 1 cell.\n */\n sdGroupColspan = computed(() => this.configuration()?.displayedColumns?.length || 1);\n\n /**\n * Context truyền vào template `sdTableGroupDef`.\n *\n * why: bản cũ dựng object MỚI (kèm `items.map(i => i.data)` mới và 2 lần duyệt children\n * qua `isGroupAllSelected`/`isGroupIndeterminate`) ở MỖI CD pass, cho MỖI group row —\n * `ngTemplateOutlet` thấy context đổi reference nên phải dựng lại embedded view. Giờ\n * context được `SdGroupPipe` precompute và cache trên `meta.group`; ở đây chỉ đọc ra\n * (fallback `??=` cho header không do pipe sinh) nên reference ổn định qua các pass.\n *\n * why: 3 field selection/expand thì phải làm TƯƠI mỗi lần đọc — `SdGroupPipe` dựng context\n * lúc header được sinh ra, thời điểm đó `selector.selectable` của children vẫn còn là mặc\n * định `false` (chỉ `SdSelectionVisiblePipe` ở cell BODY mới đặt đúng, mà CDK dựng header\n * trước body). Cache lại giá trị tính ở thời điểm đó là khoá cứng `isSelected = false`.\n * Mutate TẠI CHỖ để `ngTemplateOutlet` vẫn thấy cùng một reference và không dựng lại view.\n */\n groupContext = (header: SdTableItem<T>): SdTableGroupDefContext<T> => {\n const group = header.meta.group;\n if (!group) return buildGroupHeaderContext(header, this.groupHost);\n const context = (group.context ??= buildGroupHeaderContext(header, this.groupHost));\n context.isSelected = this.isGroupAllSelected(header);\n context.indeterminate = this.isGroupIndeterminate(header);\n context.isExpanded = group.isExpanded ?? true;\n return context;\n };\n\n rowStyle = (row: SdTableItem<T>, index?: number): Record<string, string> | null => {\n const fn = this.tableOption()?.style?.rowCss;\n if (!fn) return null;\n const tree = row.meta?.tree;\n const ctx =\n this.tableOption()?.tree && tree ? { level: tree.level, hasChildren: tree.hasChildren, isExpanded: tree.isExpanded } : undefined;\n return fn(row.data, index, ctx);\n };\n\n /**\n * Resolve `style.rowCss` MỘT LẦN cho mỗi row và cache vào `meta.rowStyle`.\n *\n * why: template cũ bind `[ngStyle]=\"rowStyle(row)\"` — mỗi CD pass là một lần gọi callback\n * của consumer cho TỪNG dòng, và callback trả object MỚI nên `NgStyle` phải chạy\n * KeyValueDiffer trên mọi dòng ở mọi pass. Gọi ở cuối `#render` và sau mỗi lần tree\n * toggle (level / isExpanded / children mới format đều là input của `rowCss`).\n */\n #applyRowStyles = () => {\n const hasRowCss = !!this.tableOption()?.style?.rowCss;\n const roots = this.items();\n const rows = this.tableOption()?.tree ? collectFormattedTreeRows(roots) : roots;\n for (const row of rows) {\n row.meta.rowStyle = hasRowCss ? this.rowStyle(row) : null;\n }\n };\n\n // why: khi preserveSelection bật, giữ map nội bộ id → SdTableItem để selection\n // không mất qua filter / paginate / sort / reload (kể cả server re-fetch tạo refs mới).\n // Map chỉ bị clear khi user gọi onClearSelection (nút X) hoặc bỏ chọn từng item.\n #preservedSelectedMap = new Map<string, SdTableItem<T>>();\n\n #preserveEnabled = () => this.tableOption()?.selector?.preserveSelection === true;\n\n // Restore isSelected cho item visible nào id đã có trong preserved map.\n // Đồng thời update reference trong map sang SdTableItem mới (cần thiết khi server\n // re-fetch tạo refs mới, ta muốn map giữ ref hiện hành để các tham chiếu downstream OK).\n #restorePreservedSelection = () => {\n if (!this.#preserveEnabled()) return;\n restorePreservedSelection(this.#getSelectionRows(), this.#preservedSelectedMap);\n };\n\n #updateSelectedItems = () => {\n const rows = this.#getSelectionRows();\n // Selection vừa đổi → cập nhật checkbox state cache của mọi group header.\n this.#syncGroupSelectionState();\n if (this.#preserveEnabled()) {\n // Sync map theo state visible: add nếu selected, remove nếu deselected.\n // Off-page items giữ nguyên trong map (không bị visit ở đây).\n this.selectedTableItems.set(syncPreservedSelection(rows, this.#preservedSelectedMap));\n } else {\n this.selectedTableItems.set(rows.filter(item => item.meta.selector!.isSelected));\n }\n this.#ref.detectChanges();\n };\n\n clearFilter = () => {\n this.filterRegister.value.remove();\n };\n\n setFilter = (args?: Pick<TableFilterValue, 'columnFilter' | 'externalFilter'>) => {\n const { columnFilter, externalFilter } = args || {};\n if (columnFilter) {\n // Giữ reference ổn định cho column-filter (xem #syncColumnFilterInPlace).\n this.#syncColumnFilterInPlace(columnFilter);\n }\n this.filterRegister.value.set({\n columnFilter,\n externalFilter,\n });\n };\n\n get dataItems(): T[] {\n return this.items().map(item => item.data);\n }\n\n get selectedItems(): T[] {\n return this.selectedTableItems().map(item => item.data);\n }\n\n detectChanges = () => this.#ref.detectChanges();\n\n onColumnResize = (field: string, width: string) => {\n // persistColumnWidth ghi storage (silent) và emit widthChange$,\n // subscriber trong constructor đã update configuration() signal đồng bộ.\n this.#configService.persistColumnWidth(field, width);\n\n const onResize = this.tableOption()?.config?.onResize;\n if (!onResize) return;\n onResize(field, width, buildColumnWidthMap(this.configuration()?.column));\n };\n\n onOperatorChange = (column: SdTableColumn, operator: Operator | undefined) => {\n if (operator == null) return;\n this.tableOption()?.filter?.operatorChange?.(column, operator);\n };\n\n trackBy = (index: number, item: SdTableItem) => {\n return item.meta.id;\n };\n\n // Offset STT theo paging — computed memoize, không tính lại trừ khi paginator đổi.\n // Template chỉ cần đọc pageOffset() rồi cộng `i + 1` (rẻ hơn gọi function).\n pageOffset = computed(() => {\n const p = this.paginator();\n return (p?.pageIndex ?? 0) * (p?.pageSize ?? 0);\n });\n\n isReorderDisabled(item: SdTableItem<T>): boolean {\n const opt = this.tableOption()?.rowReorder;\n const idx = this.#itemIndexMap.get(item) ?? -1;\n return isReorderItemDisabled(item, opt, idx);\n }\n\n reorderSortPredicate = (index: number, drag: CdkDrag<SdTableItem<T>>, drop: CdkDropList<SdTableItem<T>[]>): boolean => {\n const opt = this.tableOption()?.rowReorder;\n return canSortReorder({\n enabled: opt?.enabled,\n index,\n dragItem: drag.data,\n allItems: drop.data,\n hasGroup: !!this.tableOption()?.group,\n });\n };\n\n onReorderDrop(event: CdkDragDrop<SdTableItem<T>[]>): void {\n const { previousIndex, currentIndex } = event;\n if (previousIndex === currentIndex) return;\n const result = reorderTableItems({\n items: this.items(),\n renderedItems: event.container.data,\n previousRenderedIndex: previousIndex,\n currentRenderedIndex: currentIndex,\n localItems: this.tableOption()?.type === 'local' ? this.#localItems : undefined,\n });\n this.items.set(result.items);\n if (this.tableOption()?.type === 'local' && result.localItems) {\n this.#localItems = result.localItems;\n }\n this.table()?.renderRows();\n this.tableOption()?.rowReorder?.onChange?.(\n result.items.map(i => i.data),\n event.item.data.data,\n result.fromIndex,\n result.toIndex\n );\n }\n}\n","@let _configuration = configuration();\n@let _tableOption = tableOption()!;\n@let _loading = loading();\n@let _items = items();\n@let _total = total();\n@let _isFiltered = isFiltered();\n@let _requireFiltered = requireFiltered();\n@let _export = _tableOption?.export;\n@let _exporting = exporting();\n@let _titleDef = titleDef();\n@let _autoId = autoId();\n@let _exportTitle = exportTitle();\n@let _cellDef = cellDef();\n@let _footerDef = footerDef();\n@let _sdSubInformation = sdSubInformation();\n@let _configComponent = configComponent();\n@let _mobileFilter = mobileFilter();\n@let _selectedTableItems = selectedTableItems();\n@let _rowCommands = rowCommands();\n<!-- why: tree không còn cột riêng — khi KHÔNG có cột Index, icon expand nhúng vào\n cột data đầu tiên. Đây là field của cột đó (null nếu có Index hoặc không tree). -->\n@let _treeFirstField = _tableOption?.tree && !_tableOption.index?.enabled ? _configuration?.firstColumns?.[0]?.field : null;\n\n@if (_configuration) {\n @if (!_tableOption.filter?.disabled && !!_tableOption.filter?.externalFilters?.length && filterRegister) {\n <external-filter\n class=\"mb-16\"\n [autoId]=\"_autoId\"\n [filterRegister]=\"filterRegister\"\n [filter]=\"_tableOption.filter!\"\n [externalFilters]=\"_tableOption.filter?.externalFilters!\">\n </external-filter>\n }\n @let groupedItems = _items | sdTree: _tableOption.tree : treeRevision() | sdGroup: _tableOption : groupExpandState : groupHost;\n\n <!-- Tree toggle dùng chung: indent (theo cấp) + slot chevron/spinner. Nhúng vào\n cột Index hoặc cột data đầu qua *ngTemplateOutlet (context: { row }). -->\n <ng-template #sdTreeToggle let-row=\"row\">\n @let _tree = row?.meta?.tree;\n @if (_tree) {\n <span class=\"sd-tree-indent\" [style.width.px]=\"(_tree.level ?? 0) * (_tableOption.tree?.indentSize ?? 20)\"></span>\n <span class=\"sd-tree-toggle-slot\">\n @if (_tree.hasChildren) {\n @if (_tree.isExpanding) {\n <span class=\"lds-ring sd-tree-spinner\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </span>\n } @else {\n @let _aid = _autoId;\n <button\n type=\"button\"\n class=\"sd-tree-toggle-btn\"\n [attr.data-autoid]=\"_aid ? _aid + '-tree-toggle-' + row.meta.id : null\"\n (click)=\"onTreeToggle(row); $event.stopPropagation()\">\n <sd-icon [name]=\"_tree.isExpanded ? 'expand_more' : 'chevron_right'\"></sd-icon>\n </button>\n }\n }\n </span>\n }\n </ng-template>\n\n <ng-content select=\"[sdTableTop]\"></ng-content>\n <div class=\"c-container\">\n <!-- why: bảng tải dữ liệu BẤT ĐỒNG BỘ nhưng trước đây chỉ có spinner thuần hình ảnh — screen\n reader không được báo gì cả. role=\"status\" + aria-live=\"polite\" đọc trạng thái ngay khi\n spinner xuất hiện; aria-busy trên vùng bảng cho biết nội dung đang được thay thế. -->\n @if (_loading) {\n <div class=\"c-loading\" role=\"status\" aria-live=\"polite\" [attr.aria-label]=\"'core.component.table.loading' | sdTranslate\">\n <mat-spinner></mat-spinner>\n </div>\n }\n <div\n class=\"c-table\"\n sdScroll\n stickyShadow\n [attr.aria-busy]=\"_loading ? 'true' : null\"\n [style.max-height]=\"_tableOption.style?.maxHeight\"\n [style.min-height]=\"_tableOption.style?.minHeight\">\n <table\n mat-table\n [dataSource]=\"groupedItems\"\n [trackBy]=\"trackBy\"\n matSort\n [matSortDisabled]=\"!_tableOption.sort?.enable\"\n multiTemplateDataRows\n cdkDropList\n [cdkDropListData]=\"groupedItems\"\n [cdkDropListDisabled]=\"!_tableOption.rowReorder?.enabled\"\n [cdkDropListSortPredicate]=\"reorderSortPredicate\"\n (cdkDropListDropped)=\"onReorderDrop($event)\">\n @if (_tableOption.rowReorder?.enabled) {\n <ng-container matColumnDef=\"sdReorder\">\n <th mat-header-cell *matHeaderCellDef class=\"sd-reorder-header\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td mat-cell *matCellDef=\"let row\" class=\"sd-reorder-cell\">\n @if (!row.meta?.group?.items?.length) {\n <sd-icon cdkDragHandle [class.sd-reorder-disabled]=\"isReorderDisabled(row)\" [name]=\"_tableOption.rowReorder?.icon || 'drag_indicator'\"></sd-icon>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n }\n\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"_configuration.displayedColumns.length\">\n @if (_sdSubInformation?.templateRef) {\n @if (_tableOption.expand?.always) {\n <ng-container *ngTemplateOutlet=\"_sdSubInformation?.templateRef!; context: { item: item }\"> </ng-container>\n } @else {\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\n @if (item.isExpanded) {\n <ng-container *ngTemplateOutlet=\"_sdSubInformation?.templateRef!; context: { item: item }\"> </ng-container>\n }\n </div>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td mat-cell *matCellDef=\"let element\">\n @if (!element.isExpanding && !_tableOption.expand?.always) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-expand-' + element.meta.id : null\"\n type=\"text\"\n [prefixIcon]=\"element.isExpanded ? 'expand_less' : 'expand_more'\"\n (click)=\"onExpand(element)\"\n width=\"35px\">\n </sd-button>\n }\n @if (element.isExpanding) {\n <div class=\"lds-ring\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n }\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"sdSelection\" sticky>\n <th class=\"sd-selection-cell p-0\" mat-header-cell *matHeaderCellDef [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n @if (visibleSelectAll()) {\n <mat-checkbox\n class=\"c-selection px-8\"\n color=\"primary\"\n [ngModel]=\"isSelectAll()\"\n (ngModelChange)=\"isSelectAll.set($event)\"\n (change)=\"onSelectAll()\">\n </mat-checkbox>\n }\n </th>\n\n <td class=\"sd-selection-cell p-0\" mat-cell *matCellDef=\"let item\">\n @let visible = item | selectionVisible: _tableOption.selector;\n @if (visible) {\n @if (_tableOption.selector?.single) {\n <mat-radio-button\n class=\"c-selection px-8\"\n color=\"primary\"\n [checked]=\"item.meta.selector.isSelected\"\n (change)=\"item.meta.selector.isSelected = true; onSelect(item)\"\n [disabled]=\"_selectedTableItems | selectionDisabled: item : _tableOption.selector!\">\n </mat-radio-button>\n } @else {\n <mat-checkbox\n class=\"c-selection px-8\"\n color=\"primary\"\n [(ngModel)]=\"item.meta.selector.isSelected\"\n (change)=\"onSelect(item)\"\n [disabled]=\"_selectedTableItems | selectionDisabled: item : _tableOption.selector!\">\n </mat-checkbox>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n @if (_tableOption.index?.enabled) {\n @let _pageOffset = pageOffset();\n @let _indexWidth = _tableOption.index?.width || '50px';\n <!-- why: khi tree, cột Index \"ôm\" thêm chevron + indent. Dùng width:1px +\n nowrap (.sd-tree-index-cell) để cột co SÁT nội dung, không chiếm chỗ\n thừa; header \"#\" canh trái lùi vào (.sd-tree-index-header) cho thẳng số. -->\n @let _treeIndex = !!_tableOption.tree;\n <ng-container matColumnDef=\"sdIndex\" sticky>\n <th\n [class.p-0]=\"!_treeIndex\"\n [class.text-center]=\"!_treeIndex\"\n [class.sd-tree-index-cell]=\"_treeIndex\"\n [class.sd-tree-index-header]=\"_treeIndex\"\n mat-header-cell\n *matHeaderCellDef\n [style.width]=\"_treeIndex ? '1px' : _indexWidth\"\n [style.min-width]=\"_treeIndex ? null : _indexWidth\"\n [style.max-width]=\"_treeIndex ? null : _indexWidth\"\n [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n {{ _tableOption.index?.title || '#' }}\n </th>\n <td\n [class.px-4]=\"!_treeIndex\"\n [class.text-center]=\"!_treeIndex\"\n [class.sd-tree-index-cell]=\"_treeIndex\"\n mat-cell\n *matCellDef=\"let item; let i = dataIndex\"\n [style.width]=\"_treeIndex ? '1px' : null\"\n [style.min-width]=\"_treeIndex ? null : _indexWidth\"\n [style.max-width]=\"_treeIndex ? null : _indexWidth\">\n @if (!item?.meta?.group?.isGroupHeader) {\n @if (_treeIndex) {\n <!-- why: tree → chevron + indent + STT phân cấp (1, 1.2, 1.2.1). Tô đậm root (level 0). -->\n <span class=\"sd-tree-line\">\n <ng-container *ngTemplateOutlet=\"sdTreeToggle; context: { row: item }\"></ng-container>\n @if (item?.meta?.tree?.indexPath?.length) {\n <span class=\"sd-tree-stt\" [class.sd-stt-root]=\"(item.meta.tree.level ?? 0) === 0\">\n {{ item.meta.tree.indexPath.join('.') }}\n </span>\n }\n </span>\n } @else {\n {{ _pageOffset + i + 1 }}\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef [style.width]=\"_treeIndex ? '1px' : null\" [style.min-width]=\"_treeIndex ? null : _indexWidth\" [style.max-width]=\"_treeIndex ? null : _indexWidth\"></td>\n </ng-container>\n }\n <ng-container\n matColumnDef=\"sdCommand\"\n [sticky]=\"_tableOption.command?.align !== 'right'\"\n [stickyEnd]=\"_tableOption.command?.align === 'right'\">\n <!-- why: ô header của cột command vốn để trống. Cho consumer chiếm chỗ đó bằng\n `sdTableCommandHeaderDef` (thường là nút thêm dòng) thì hành động cấp bảng nằm ngay\n trên cụm nút của từng dòng, thay vì phải dựng thêm một dải riêng dưới bảng. -->\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 50px\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n @if (sdCommandHeaderDef(); as _commandHeaderDef) {\n <div class=\"sd-command-header d-flex align-items-center justify-content-center\">\n <ng-container *ngTemplateOutlet=\"_commandHeaderDef.templateRef\"></ng-container>\n </div>\n }\n </th>\n <!-- why: `dataIndex` do CDK cấp sẵn. Bản cũ dùng `groupedItems.indexOf(item)` —\n quét toàn mảng cho MỖI dòng render ở MỖI CD pass (O(n²) trên đường render),\n và còn trả sai index khi 2 dòng trùng reference. -->\n <td class=\"px-8\" mat-cell *matCellDef=\"let item; let i = dataIndex\">\n <desktop-command [autoId]=\"_autoId\" [commands]=\"_rowCommands\" [item]=\"item\" [itemIndex]=\"i\"></desktop-command>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <!-- why: group header row dùng matRowDef RIÊNG với column list ['sdGroupHeader']\n qua predicate when:isGroupHeaderRow. Cell colspan = displayedColumns.length để\n span TOÀN BỘ width data row. Tránh colspan trick overflow row khi các TD khác render. -->\n <ng-container matColumnDef=\"sdGroupHeader\">\n <td\n class=\"p-0 sd-group-header-cell\"\n mat-cell\n *matCellDef=\"let item\"\n [attr.colspan]=\"sdGroupColspan()\">\n <div class=\"sd-group-row d-flex align-items-center py-8\">\n <!-- why: slot 42px khớp width với sd-selection-cell data row → checkbox group căn TRỤC dọc đúng với checkbox data. -->\n @if (_tableOption.selector?.visible && !_tableOption.selector?.single) {\n <div class=\"sd-group-selection-slot d-flex align-items-center justify-content-center\">\n <!-- why: PHẢI tính live, KHÔNG đọc cache trên meta.group. `selector.selectable`\n mặc định là `false` (table-item.model.ts) và chỉ được `SdSelectionVisiblePipe`\n đặt đúng khi cell BODY render — mà CDK dựng header TRƯỚC body. Cache do\n `SdGroupPipe` ghi lúc dựng header vì thế luôn thấy `total = 0` và khoá cứng\n checkbox ở trạng thái bỏ chọn, kể cả khi defaultSelected/preserveSelection\n vừa chọn hết. Pipe là pure nên giá trị đó không bao giờ tự sửa.\n Chỉ có MỘT group header mỗi group (không phải mỗi row) nên chi phí duyệt ở\n đây nhỏ; phần đắt (dựng object context + map data) vẫn được cache. -->\n <mat-checkbox\n class=\"c-selection\"\n color=\"primary\"\n [checked]=\"isGroupAllSelected(item)\"\n [indeterminate]=\"isGroupIndeterminate(item)\"\n (change)=\"onSelectGroup(item, $event.checked)\">\n </mat-checkbox>\n </div>\n } @else {\n <div class=\"sd-group-selection-slot\"></div>\n }\n @if (_tableOption.group?.collapsible) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-group-toggle-' + (item.meta.group?.key || item.meta.id) : null\"\n type=\"text\"\n [prefixIcon]=\"item.meta.group.isExpanded ? 'expand_more' : 'chevron_right'\"\n width=\"32px\"\n (click)=\"toggleGroupExpand(item)\">\n </sd-button>\n }\n @if (sdGroupDef()?.templateRef; as tpl) {\n <!-- why: groupContext() giờ trả context đã precompute trên meta.group (cùng\n một reference qua mọi CD pass). Bản cũ dựng object mới + mảng\n `items.map(i => i.data)` mới mỗi pass → ngTemplateOutlet phải dựng lại\n embedded view của mọi group row. -->\n <ng-container *ngTemplateOutlet=\"tpl; context: groupContext(item)\"></ng-container>\n } @else {\n <span class=\"T14R\">{{ item.meta.group.values | json }}</span>\n }\n </div>\n </td>\n </ng-container>\n <!-- why: filler column ở cuối hấp thụ leftover space khi tổng width các cột data < container — giữ cho selection/STT/command không bị dãn. -->\n <ng-container matColumnDef=\"sdFiller\">\n <th class=\"sd-filler-cell p-0\" mat-header-cell *matHeaderCellDef [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td class=\"sd-filler-cell p-0\" mat-cell *matCellDef=\"let item\"></td>\n <td class=\"sd-filler-cell p-0\" mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n @for (column of _configuration.firstColumns; track column.field) {\n <ng-container [matColumnDef]=\"column.field\" [sticky]=\"_configuration.fixedColumn[column.field]\">\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"px-8 py-8 c-th\"\n [sdColumnResize]=\"!!_tableOption.config?.resizable && column.type !== 'children'\"\n [minWidth]=\"column.minWidth\"\n [maxWidth]=\"column.maxWidth\"\n (resizeEnd)=\"onColumnResize(column.field, $event)\"\n [style.width]=\"column.width\"\n [style.min-width]=\"column.minWidth || column.width\"\n [style.max-width]=\"column.maxWidth\"\n [attr.rowspan]=\"_configuration.multipleHeader && column.type !== 'children' ? 2 : 1\"\n [attr.colspan]=\"column.type === 'children' ? column.children.length : 1\">\n <div>\n <!-- why: bỏ aria-hidden=\"true\" khỏi header. `mat-sort-header` tự gắn role=\"button\",\n tabindex và aria-sort lên chính div này — aria-hidden khiến header vẫn tab tới\n được nhưng không đọc được tên cột lẫn hướng sắp xếp, tức người dùng screen\n reader mất hoàn toàn khả năng sắp xếp bảng. -->\n @if (column.type === 'children') {\n <div\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n } @else {\n <div\n mat-sort-header\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\"\n [disabled]=\"!column.sortable\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n @let hideInlineFilter =\n _tableOption.filter?.disabled ||\n _tableOption.filter?.hideInlineFilter === true ||\n (_tableOption.filter?.hideInlineFilter === 'auto' && !_isFiltered && _total! <= 10);\n @if (!hideInlineFilter) {\n <ng-container *sdDesktop>\n <column-filter\n [autoId]=\"_autoId\"\n [value]=\"columnFilter?.[column.field!]!\"\n [operator]=\"columnOperator[column.field]\"\n (operatorChange)=\"columnOperator[column.field] = $event!; onOperatorChange(column, $event)\"\n [columnFilter]=\"columnFilter!\"\n [cacheValues]=\"cacheValues\"\n [column]=\"column\"\n (filterChange)=\"onFilterChange()\"\n (filterCommit)=\"onFilterCommit()\">\n </column-filter>\n </ng-container>\n }\n }\n </div>\n </th>\n <td\n class=\"c-td px-0\"\n [class.d-none]=\"column.type === 'children'\"\n mat-cell\n *matCellDef=\"let item\"\n [sdHoverCopy]=\"(item.data && item.data[column.field]) || ''\"\n [sdHoverCopyDisabled]=\"!column.cell?.copiable\">\n @if (column.type !== 'children' && !item?.meta?.group?.isGroupHeader) {\n @if (_treeFirstField && column.field === _treeFirstField) {\n <!-- why: không có cột Index → chevron + indent nhúng vào cột data đầu (như file explorer). -->\n <span class=\"sd-tree-line px-8\">\n <ng-container *ngTemplateOutlet=\"sdTreeToggle; context: { row: item }\"></ng-container>\n <desktop-cell class=\"d-block\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"></desktop-cell>\n </span>\n } @else {\n <desktop-cell class=\"d-block px-8\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"> </desktop-cell>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <ng-container *ngIf=\"_footerDef[column.field]\">\n <ng-container *ngTemplateOutlet=\"_footerDef[column.field].templateRef; context: { items: _items, column: column }\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n }\n @for (column of _configuration.secondColumns; track column.field) {\n <ng-container [matColumnDef]=\"column.field\">\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"c-th px-8\"\n [style.width]=\"column.width\"\n [style.min-width]=\"column.minWidth || column.width\"\n [style.max-width]=\"column.maxWidth\">\n <div>\n <!-- why: xem chú thích ở header nhóm trên — mat-sort-header là control thật,\n aria-hidden xoá tên cột + aria-sort khỏi accessibility tree. -->\n <div\n mat-sort-header\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\"\n [disabled]=\"!column.sortable\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n @if (!_tableOption.filter?.disabled && !_tableOption.filter?.hideInlineFilter && columnOperator) {\n <ng-container *sdDesktop>\n <column-filter\n [autoId]=\"_autoId\"\n [value]=\"columnFilter?.[column.field!]!\"\n [operator]=\"columnOperator[column.field]\"\n [columnFilter]=\"columnFilter!\"\n [cacheValues]=\"cacheValues\"\n [column]=\"column\"\n (operatorChange)=\"columnOperator[column.field] = $event!; onOperatorChange(column, $event)\"\n (filterChange)=\"onFilterChange()\"\n (filterCommit)=\"onFilterCommit()\">\n </column-filter>\n </ng-container>\n }\n </div>\n </th>\n <td\n class=\"c-td px-0\"\n mat-cell\n *matCellDef=\"let item\"\n [sdHoverCopy]=\"item[column.field]\"\n [sdHoverCopyDisabled]=\"!column.cell?.copiable\">\n @if (column.type !== 'children') {\n <desktop-cell class=\"d-block px-8\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"> </desktop-cell>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <ng-container *ngIf=\"_footerDef[column.field]\">\n <ng-container *ngTemplateOutlet=\"_footerDef[column.field].templateRef; context: { items: _items, column: column }\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n }\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"_configuration.firstHeaders; sticky: true\"></tr>\n @if (!!_configuration.secondHeaders.length) {\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"_configuration.secondHeaders; sticky: true\"></tr>\n }\n <!-- Group header row — chỉ 1 cell sdGroupHeader colspan toàn width. -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['sdGroupHeader']; when: isGroupHeaderRow\"\n class=\"c-group-row-tr\"></tr>\n\n <!-- Data row — dùng displayedColumns đầy đủ; when isDataRow để loại trừ group header. -->\n <!-- why: [ngStyle] đọc meta.rowStyle — style.rowCss đã được resolve 1 lần mỗi lần\n render. Bản cũ gọi rowStyle(row) ngay trong binding → chạy callback của consumer\n cho TỪNG dòng ở MỖI CD pass, và vì trả object MỚI nên NgStyle phải chạy lại\n KeyValueDiffer trên mọi dòng ở mọi pass. -->\n <tr\n mat-row\n cdkDrag\n [cdkDragData]=\"row\"\n [cdkDragDisabled]=\"\n !_tableOption.rowReorder?.enabled ||\n !!row.meta?.group?.items?.length ||\n (row.meta?.tree?.level ?? 0) > 0 ||\n isReorderDisabled(row)\n \"\n *matRowDef=\"let row; columns: _configuration.displayedColumns; when: isDataRow\"\n matRipple\n class=\"c-row\"\n [class.sd-tree-row]=\"!!_tableOption.tree\"\n [ngClass]=\"_tableOption.tree ? 'sd-tree-level-' + (row.meta?.tree?.level ?? 0) : null\"\n [ngStyle]=\"row.meta.rowStyle\"\n [class.selected]=\"row.meta.selector.isSelected\"></tr>\n\n <!-- Sub-information row — also gated bởi isDataRow để KHÔNG render empty expand row dưới group header. -->\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']; when: isDataRow\" class=\"c-detail-row\"></tr>\n @if (hasFooter() && !!_configuration.displayedFooters.length) {\n <tr mat-footer-row *matFooterRowDef=\"_configuration.displayedFooters; sticky: true\"></tr>\n }\n </table>\n <!-- why: trạng thái rỗng cũng xuất hiện BẤT ĐỒNG BỘ sau khi fetch xong; không có live region\n thì người dùng screen reader chờ mãi mà không biết bảng đã trả về 0 dòng. -->\n @if (!_loading && !_total) {\n <div class=\"c-no-data-row\" role=\"status\" aria-live=\"polite\">\n @if (_isFiltered) {\n @if (tableConfiguration?.images?.filterEmpty) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.filterEmpty\" alt=\"filter-empty\" />\n } @else {\n <img class=\"c-image sd-image-filter-empty\" alt=\"filter-empty\" />\n }\n <div class=\"T16M\">{{ 'core.component.table.no-results' | sdTranslate }}</div>\n <div class=\"T16R text-secondary\">{{ 'core.component.table.no-results-hint' | sdTranslate }}</div>\n } @else {\n @if (_requireFiltered) {\n @if (tableConfiguration?.images?.filterRequired) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.filterRequired\" alt=\"filter-required\" />\n } @else {\n <img class=\"c-image sd-image-filter-required\" alt=\"filter-required\" />\n }\n <div class=\"T16R text-secondary\">{{ 'core.component.table.choose-filter-hint' | sdTranslate }}</div>\n } @else {\n @if (tableConfiguration?.images?.dataEmpty) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.dataEmpty\" alt=\"data-empty\" />\n } @else {\n <img class=\"c-image sd-image-data-empty\" alt=\"data-empty\" />\n }\n <div class=\"T16R text-secondary\">{{ 'core.component.table.no-data' | sdTranslate }}</div>\n }\n }\n </div>\n }\n </div>\n <div class=\"c-paginator\">\n <div class=\"c-action\">\n <ng-container *sdDesktop>\n @if (_tableOption.reload?.visible) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-reload' : null\"\n class=\"mr-8\"\n [title]=\"'core.component.table.reload' | sdTranslate\"\n prefixIcon=\"refresh\"\n (click)=\"reload()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n @if (_export && _items.length) {\n @if (_export.type === 'custom') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportCustom()\" type=\"text\"> </sd-button>\n } @else {\n @if (_export.visible) {\n @if (_exporting) {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [loading]=\"_exporting\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" type=\"text\"> </sd-button>\n } @else {\n @if (_export.visible === 'ALL' || !_export.visible) {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" [matMenuTriggerFor]=\"menu\" type=\"text\"> </sd-button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item [attr.data-autoid]=\"_autoId ? _autoId + '-export-excel' : null\" (click)=\"exportExcel()\" type=\"button\">\n <sd-icon name=\"file_download\"></sd-icon>\n <span> {{ 'core.component.table.export-excel' | sdTranslate }}</span>\n </button>\n <button mat-menu-item [attr.data-autoid]=\"_autoId ? _autoId + '-export-csv' : null\" (click)=\"exportCSV()\" type=\"button\">\n <sd-icon name=\"file_download\"></sd-icon>\n <span> {{ 'core.component.table.export-csv' | sdTranslate }}</span>\n </button>\n </mat-menu>\n } @else if (_export.visible === 'EXCEL') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export-excel' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportExcel()\" type=\"text\"> </sd-button>\n } @else if (_export.visible === 'CSV') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export-csv' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportCSV()\" type=\"text\"> </sd-button>\n }\n }\n }\n }\n }\n\n <ng-container *sdDesktop>\n @if (_configComponent) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config' : null\"\n class=\"mr-8\"\n [title]=\"'core.component.table.setup-short' | sdTranslate\"\n prefixIcon=\"settings\"\n (click)=\"_configComponent.open()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n <!-- Mobile: nút Filter mở mobile-filter drawer (inline filter ẩn trên mobile) -->\n <ng-container *sdMobile>\n @if (!_tableOption.filter?.disabled && _mobileFilter) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-mobile-filter-open' : null\"\n class=\"mr-8\"\n prefixIcon=\"filter_alt\"\n (click)=\"_mobileFilter.open()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n </div>\n @let hidePaginator = !_tableOption.paginate?.pageSize || _total === undefined || _total <= _tableOption.paginate?.pageSize!;\n <!-- Desktop paginator: full config (pageSize dropdown, first/last buttons) -->\n <ng-container *sdDesktop>\n <mat-paginator\n [class.d-none]=\"_tableOption.paginate?.hidden || hidePaginator\"\n [length]=\"_total\"\n [pageSize]=\"_tableOption.paginate?.pageSize\"\n [pageSizeOptions]=\"_tableOption.paginate?.pages!\"\n [showFirstLastButtons]=\"_tableOption.paginate?.showFirstLastButtons\"\n [hidePageSize]=\"_tableOption.paginate?.hidePageSize\"></mat-paginator>\n </ng-container>\n <!-- Mobile paginator: ẩn pageSize dropdown + first/last buttons để tiết kiệm không gian -->\n <ng-container *sdMobile>\n <mat-paginator\n [class.d-none]=\"_tableOption.paginate?.hidden || hidePaginator\"\n [length]=\"_total\"\n [pageSize]=\"_tableOption.paginate?.pageSize\"\n [showFirstLastButtons]=\"false\"\n hidePageSize></mat-paginator>\n </ng-container>\n <!-- \"Đang hiển thị...\" chỉ desktop -->\n <ng-container *sdDesktop>\n @if (!_tableOption.paginate?.hidden && hidePaginator && _total !== undefined && _total > 0) {\n <div class=\"T14R c-summary\">\n {{ 'core.component.table.showing' | sdTranslate }} <span class=\"T14M ml-2\">1-{{ _total }}/{{ _total }}</span>\n </div>\n }\n </ng-container>\n </div>\n </div>\n <selector-action [autoId]=\"_autoId\" [tableOption]=\"_tableOption\" [selectedTableItems]=\"_selectedTableItems\" (clear)=\"onClearSelection(groupedItems)\" />\n @if (_tableOption.config?.visible) {\n <config [autoId]=\"_autoId\" [tableOption]=\"_tableOption\" />\n }\n <!-- Mobile filter drawer — chỉ instantiate khi cần render trên mobile -->\n @if (!_tableOption.filter?.disabled && filterRegister) {\n <mobile-filter\n [autoId]=\"_autoId\"\n [filter]=\"_tableOption.filter!\"\n [externalFilters]=\"_tableOption.filter?.externalFilters!\"\n [columns]=\"_configuration.firstColumns\"\n [filterDefs]=\"sdFilterDefs()\"\n [filterRegister]=\"filterRegister\"\n [cacheValues]=\"cacheValues\">\n </mobile-filter>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","SdConfirmService","i3","isReorderItemDisabled","i4"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sdcorejs-angular-components-table.mjs","sources":["../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-cell-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-command-header-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-expand-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-filter-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-footer-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-group-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-title-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-filter/table-filter.model.ts","../../../projects/sdcorejs-angular/components/table/src/components/column-title/column-title.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/column-title/column-title.component.html","../../../projects/sdcorejs-angular/components/table/src/components/filter/column-filter/column-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/column-filter/column-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/pipes/filter-values.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/tree/tree.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/sd-tree.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/external-filter/external-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/external-filter/external-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/components/filter/mobile-filter/mobile-filter.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/filter/mobile-filter/mobile-filter.component.html","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/action-filter.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/selector-action.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/selector-action/selector-action.component.html","../../../projects/sdcorejs-angular/components/table/src/configurations/table.configuration.ts","../../../projects/sdcorejs-angular/components/table/src/services/config.service.ts","../../../projects/sdcorejs-angular/components/table/src/components/config/config.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/config/config.component.html","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/view/view.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/view/view.component.html","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/desktop-cell.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/desktop-cell/desktop-cell.component.html","../../../projects/sdcorejs-angular/components/table/src/components/command/pipes/command.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/pipes/filter.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/desktop-command.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/command/desktop-command.component.html","../../../projects/sdcorejs-angular/components/table/src/components/popup-export/popup-export.component.ts","../../../projects/sdcorejs-angular/components/table/src/components/popup-export/popup-export.component.html","../../../projects/sdcorejs-angular/components/table/src/directives/sd-table-column-filter-def.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sticky-shadow.directive.ts","../../../projects/sdcorejs-angular/components/table/src/directives/sd-column-resize.directive.ts","../../../projects/sdcorejs-angular/components/table/src/models/table-item.model.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-selection/table-selection.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/sd-group.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-disabled.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-selection/selection-action.util.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-visible.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-export/table-export.service.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-format/table-format.service.ts","../../../projects/sdcorejs-angular/components/table/src/services/column-width.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-local/table-local.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-reorder/table-reorder.util.ts","../../../projects/sdcorejs-angular/components/table/src/services/table-filter/table-filter.service.ts","../../../projects/sdcorejs-angular/components/table/src/table.component.ts","../../../projects/sdcorejs-angular/components/table/src/table.component.html","../../../projects/sdcorejs-angular/components/table/sdcorejs-angular-components-table.ts"],"sourcesContent":["import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n item: T;\n column: SdTableColumn<T>;\n autoId: string;\n}\n\n@Directive({\n selector: '[sdTableCellDef]',\n})\nexport class SdTableCellDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableCellDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableCellDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\n\n/**\n * Nội dung cho ô HEADER của cột command.\n *\n * Ô đó vốn để trống — chỉ giữ chỗ cho các nút thao tác bên dưới — nên đây là chỗ tự nhiên để đặt\n * một hành động cấp bảng (thường là \"thêm dòng\") mà không tốn thêm một dải riêng dưới bảng.\n *\n * Không có input: cột command chỉ có một, khác `sdTableCellDef` / `sdTableTitleDef` vốn phải chỉ\n * đích danh field.\n *\n * ```html\n * <sd-table [option]=\"option\">\n * <ng-template sdTableCommandHeaderDef>\n * <sd-button prefixIcon=\"add\" type=\"text\" (click)=\"addRow()\"></sd-button>\n * </ng-template>\n * </sd-table>\n * ```\n */\n@Directive({\n selector: '[sdTableCommandHeaderDef]',\n})\nexport class SdTableCommandHeaderDefDirective {\n templateRef: TemplateRef<unknown> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { SdTableItem } from '../models/table-item.model';\n\ninterface Context<T = any> {\n item: SdTableItem<T>;\n}\n\n@Directive({\n selector: '[sdTableExpandDef]',\n})\nexport class SdTableExpandDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableExpandDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, booleanAttribute, inject, input } from '@angular/core';\n\ninterface Context {\n externalFilter?: Record<string, unknown>;\n}\n\n@Directive({\n selector: '[sdTableFilterDef]',\n})\nexport class SdTableFilterDefDirective {\n static ngTemplateContextGuard(_dir: SdTableFilterDefDirective, _ctx: unknown): _ctx is Context {\n return true;\n }\n\n sdTableFilterDef = input.required<string>();\n defaultShowing = input(false, { transform: booleanAttribute });\n templateRef: TemplateRef<Context> | null = inject(TemplateRef, { optional: true });\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\nimport { SdTableItem } from '../models/table-item.model';\n\ninterface Context<T = any> {\n items: SdTableItem<T>[];\n column: SdTableColumn<T>;\n}\n\n@Directive({\n selector: '[sdTableFooterDef]',\n})\nexport class SdMaterialFooterDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdMaterialFooterDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableFooterDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject } from '@angular/core';\nimport { SdTableItem } from '../models/table-item.model';\n\nexport interface SdTableGroupDefContext<T = any> {\n /** Children items thuộc group hiện tại (kèm wrapper SdTableItem). */\n items: SdTableItem<T>[];\n /** Children raw data (đã unwrap khỏi SdTableItem) — tiện dùng trong template. */\n data: T[];\n /** Hash key của group (Utilities.hash(values)). */\n key: string;\n /** Resolved giá trị các field group — vd `{ customerId: 1, customerName: 'A' }`. */\n values: Record<string, any>;\n /** true nếu group đang expand, false nếu collapse (chỉ ý nghĩa khi option.group.collapsible). */\n isExpanded: boolean;\n /** true nếu mọi children selectable đều selected. */\n isSelected: boolean;\n /** true nếu một phần children selected (partial). */\n indeterminate: boolean;\n /** Toggle expand/collapse (chỉ chạy nếu collapsible). */\n toggleExpand: () => void;\n /** Toggle select-all cho cả group (chỉ chạy nếu selector visible). */\n toggleSelect: () => void;\n}\n\n/**\n * Directive cung cấp custom template render group header row trong sd-table.\n * Thay thế cho htmlTemplate callback cũ — cho phép Angular template binding,\n * pipes, components con (sd-badge, sd-button, …) bên trong.\n *\n * Ví dụ:\n * ```html\n * <sd-table [option]=\"opt\">\n * <ng-template sdTableGroupDef let-values=\"values\" let-items=\"items\" let-indeterminate=\"indeterminate\">\n * <b>Khách hàng: {{ values.customerName }}</b>\n * <span>{{ items.length }} đơn hàng</span>\n * </ng-template>\n * </sd-table>\n * ```\n */\n@Directive({ selector: '[sdTableGroupDef]' })\nexport class SdTableGroupDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableGroupDefDirective<T>, _ctx: unknown): _ctx is SdTableGroupDefContext<T> {\n return true;\n }\n templateRef: TemplateRef<SdTableGroupDefContext<T>> = inject(TemplateRef);\n}\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n column: SdTableColumn<T>;\n}\n\n@Directive({\n selector: '[sdTableTitleDef]',\n})\nexport class SdTableTitleDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableTitleDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableTitleDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","import { TemplateRef } from '@angular/core';\nimport type { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { Filter, NestedKeyOf, Operator, Order, PagingReq } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\nimport { SdTableColumn, SdTableColumnAnyRow } from '../../models/table-column.model';\n\nexport interface SdTableQuickFilter {\n code: string;\n columnFilter: Record<string, any>;\n externalFilter: Record<string, any>;\n}\n\nexport interface TableFilterConfiguration {\n // selectedQuickFilter: string;\n // quickFilters: SdGridMaterialQuickFilter[];\n // columnFilter?: Record<string, any>; // Giá trị filter column\n inlineExternal: Record<string, boolean>; // Ẩn hiện filter external\n // externalFilter?: Record<string, any>; // Giá trị filter external\n}\n\nexport interface TableFilterValue {\n columnOperator?: Record<string, Operator>;\n\n columnFilter?: Record<string, any>; // Giá trị filter column\n\n externalFilter?: Record<string, any>; // Giá trị filter external\n\n notReload?: boolean; // Để nhận biết là chỉ set giá trị, không trigger change\n\n filtered?: boolean; // Để nhận biết là có đang lọc hay không\n}\n\nexport interface SdTableFilterRequest<T = unknown> {\n columnOperator: Record<NestedKeyOf<T>, Operator>;\n rawColumnFilter: Record<NestedKeyOf<T>, any>;\n rawExternalFilter: Record<string, any>;\n pageNumber: number;\n pageSize: number;\n orderBy?: string;\n orderDirection?: Order['direction'];\n isExported?: boolean;\n visibledColumns?: SdTableColumn[];\n}\n\nexport interface SdTableOptionFilter<T = unknown> {\n /** Key định danh nếu muốn lưu cache */\n key?: string;\n\n /** Có bật cache giá trị filter hay không */\n cacheable?: boolean;\n\n /** Vô hiệu toàn bộ filter */\n disabled?: boolean;\n\n /** Ẩn tất cả inline filter (chỉ còn external), nếu chọn auto thì sẽ ẩn khi total row <= 10, phù hợp cho các màn detail có ít dữ liệu */\n hideInlineFilter?: boolean | 'auto';\n\n /** Hàm xử lý khi đổi Operator của filter column */\n operatorChange?: (column?: SdTableColumn, operator?: Operator) => void;\n\n /** Danh sách external filter */\n externalFilters?: SdTableExternalFilter[];\n\n /** Số lượng cột external filter trên mỗi hàng (mặc định: 6) */\n externalFilterPerRow?: 4 | 6;\n\n /** Chế độ thủ công: phải nhấn nút áp dụng mới gửi filter */\n manualFilter?: boolean;\n\n /** Có thể thu gọn bộ lọc hay không */\n collapsible?: boolean;\n\n /** Ẩn toolbar (xóa bộ lọc, thiết lập) của external filter, khi có ít external filter user không cần chức năng này */\n hideExternalFilterToolbar?: boolean;\n\n /** Hàm xử lý khi trigger clear filter từ external filter */\n onClearFilter?: () => void;\n}\n\n// why: `columns` nhận `SdTableColumnAnyRow[]` (= `SdTableColumn<never>[]`). Hàm chỉ đọc\n// `field` / `type` / `filter.operator.default` — không bao giờ chạm dữ liệu hàng — nên không cần generic\n// theo `T`; `never` ở vị trí contravariant khiến mọi `SdTableColumn<T>` vẫn truyền vào được sau khi\n// default generic siết từ `any` sang `unknown`.\nexport const SdConvertToPagingReq = (\n filterRequest: SdTableFilterRequest,\n args: {\n columns?: SdTableColumnAnyRow[];\n externalFilters?: SdTableExternalFilter[];\n fieldMapping?: Record<string, string>;\n orders?: Order[];\n }\n): PagingReq => {\n const { externalFilters, columns, fieldMapping } = args;\n const req: PagingReq = {\n filters: [],\n orders: args?.orders || [],\n pageNumber: filterRequest.pageNumber,\n pageSize: filterRequest.pageSize,\n };\n const { filters } = req;\n const { rawExternalFilter, rawColumnFilter, columnOperator, orderBy, orderDirection } = filterRequest;\n // Xử lý external filter\n for (const externalFilter of externalFilters || []) {\n const value = rawExternalFilter?.[externalFilter.field];\n const field = fieldMapping?.[externalFilter.field] || externalFilter.field;\n // Nếu có giá trị thì mới xử lý filter\n if (value !== undefined && value !== null && value !== '') {\n if (externalFilter.type === 'string') {\n if (externalFilter.defaultOperator === 'EQUAL' && typeof value === 'string' && value.includes(',')) {\n filters!.push({\n field,\n operator: 'IN',\n data: value.split(',').map(val => val.trim()),\n });\n } else {\n filters!.push({\n field,\n operator: externalFilter.defaultOperator || 'CONTAIN',\n data: value,\n } as Filter);\n }\n } else if (externalFilter.type === 'boolean') {\n filters!.push({\n field,\n operator: 'EQUAL',\n data: value === true || value === 1 || value === 'true' || value === '1',\n });\n } else if (externalFilter.type === 'daterange') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n }\n } else if (externalFilter.type === 'date' || externalFilter.type === 'datetime') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else if (DateUtilities.isDate(value)) {\n if (externalFilter.type === 'date') {\n if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value)!.toISOString(),\n });\n }\n if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value, 1))!.toISOString(),\n });\n }\n } else {\n if (externalFilter.defaultOperator === 'GREATER_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: new Date(value).toISOString(),\n });\n }\n if (externalFilter.defaultOperator === 'LESS_OR_EQUAL') {\n filters!.push({\n field,\n operator: 'LESS_OR_EQUAL',\n data: new Date(value).toISOString(),\n });\n }\n }\n }\n } else {\n if (Array.isArray(value)) {\n if (value.length) {\n filters!.push({\n field,\n operator: 'IN',\n data: value,\n });\n }\n } else if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n }\n if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else {\n filters!.push({\n field,\n operator: externalFilter.defaultOperator || 'EQUAL',\n data: value,\n } as Filter);\n }\n }\n }\n }\n // Xử lý column filter\n for (const column of columns || []) {\n const value = rawColumnFilter?.[column.field];\n const field = fieldMapping?.[column.field] || column.field;\n const operator = columnOperator?.[column.field] || column.filter?.operator?.default;\n // Nếu có giá trị thì mới xử lý filter\n if (value !== undefined && value !== null && value !== '') {\n if (column.type === 'string') {\n filters!.push({\n field,\n operator: operator || 'CONTAIN',\n data: value,\n } as Filter);\n } else if (column.type === 'boolean') {\n filters!.push({\n field,\n operator: 'EQUAL',\n data: value === true || value === 1 || value === 'true' || value === '1',\n });\n } else if (column.type === 'date' || column.type === 'datetime') {\n if (typeof value === 'object' && 'from' in value && 'to' in value) {\n if (value?.from && value?.to) {\n filters!.push({\n field,\n operator: 'BETWEEN',\n data: {\n from: DateUtilities.begin(value?.from)!.toISOString(),\n to: DateUtilities.end(value?.to)!.toISOString(),\n },\n });\n } else if (value?.from) {\n filters!.push({\n field,\n operator: 'GREATER_OR_EQUAL',\n data: DateUtilities.begin(value?.from)!.toISOString(),\n });\n } else if (value?.to) {\n filters!.push({\n field,\n operator: 'LESS_THAN',\n data: DateUtilities.begin(DateUtilities.addDays(value?.to, 1))!.toISOString(),\n });\n }\n } else {\n if (DateUtilities.isDate(value)) {\n filters!.push({\n field,\n operator: 'BETWEEN',\n data: {\n from: DateUtilities.begin(value)!.toISOString(),\n to: DateUtilities.end(value)!.toISOString(),\n },\n });\n }\n }\n } else {\n if (Array.isArray(value)) {\n if (value.length) {\n filters!.push({\n field,\n operator: 'IN',\n data: value,\n });\n }\n } else {\n filters!.push({\n field,\n operator: operator || 'EQUAL',\n data: value,\n } as Filter);\n }\n }\n }\n }\n // Xử lý orders\n if (orderBy && orderDirection) {\n req.orders!.push({\n field: orderBy,\n direction: orderDirection,\n });\n }\n return req;\n};\n\nexport declare type SdTableExternalFilter<TData = unknown> =\n | TextFilter<TData>\n | DateFilter<TData>\n | DateTimeFilter<TData>\n | DateRangeFilter<TData>\n | NumberFilter<TData>\n | ValuesFilter<TData>\n | LazyValuesFilter<TData>\n | BooleanFilter<TData>\n | CustomFilter<TData>;\n\ninterface BaseFilter<TData = unknown> {\n field: string;\n title: string;\n defaultShowing?: boolean;\n required?: boolean; // Bật lên nếu bắt buộc phải có giá trị- mới thực hiện gọi API filter\n hidden?: boolean; // Ẩn filter\n defaultOperator?: Operator; // Đôi lúc cột string nhưng lại muốn tìm kiếm chính xác\n data?: TData; // Các tham số muốn truyền thêm để đánh dấu/nhận biết ..., ví dụ mappingField\n onChange?: (value: any) => void;\n}\n\ninterface TextFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'string';\n default?: string;\n}\n\ninterface DateFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'date';\n default?: Date | string;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n}\n\ninterface DateTimeFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'datetime';\n default?: Date | string;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n}\n\ninterface DateRangeFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'daterange';\n enableTime?: boolean;\n minDate?: string | number | Date;\n maxDate?: string | number | Date;\n default?: {\n from?: Date | string;\n to?: Date | string;\n };\n}\n\ninterface NumberFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'number';\n default?: number;\n}\n\ninterface ValuesFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'values';\n option: {\n valueField: string;\n displayField: string;\n items: any[] | (() => Promise<any[]>);\n selection?: 'AUTOCOMPLETE' | 'MULTIPLE' | 'MULTIPLEAUTOCOMPLETE';\n };\n default?: string | string[];\n}\n\ninterface LazyValuesFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'lazy-values';\n option: {\n valueField: string;\n displayField: string;\n items: SdSearch; // Filter\n selection?: 'MULTIPLE';\n };\n default?: string | string[];\n}\n\ninterface BooleanFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'boolean';\n option?: {\n displayOnTrue?: string;\n displayOnFalse?: string;\n };\n default?: boolean;\n}\n\ninterface CustomFilter<TData = unknown> extends BaseFilter<TData> {\n type: 'custom';\n // filterDef?: TemplateRef<SdTableFilterDefDirective>;\n filterDef?: TemplateRef<any>;\n default?: any;\n}\n\nexport interface TableFilterRegister {\n configuration: {\n get: () => TableFilterConfiguration;\n set: (configuration: Partial<TableFilterConfiguration>) => TableFilterConfiguration;\n remove: () => void;\n observer: Observable<TableFilterConfiguration>;\n };\n value: {\n get: () => TableFilterValue;\n set: (value: Partial<TableFilterValue>) => TableFilterValue;\n remove: () => void;\n observer: Observable<TableFilterValue>;\n };\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { SdTableTitleDefDirective } from '../../directives/sd-table-title-def.directive';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { NgTemplateOutlet } from '@angular/common';\n\n@Component({\n selector: 'column-title',\n templateUrl: './column-title.component.html',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [NgTemplateOutlet],\n})\nexport class ColumnTitleComponent {\n column = input.required<SdTableColumn>();\n titleDef = input<SdTableTitleDefDirective | undefined>(undefined);\n\n templateRef = computed(() => {\n const title = this.column()?.title;\n if (typeof title === 'object') {\n return title?.templateRef || this.titleDef()?.templateRef;\n }\n return this.titleDef()?.templateRef;\n });\n}\n","@let _column = column();\n@let _templateRef = templateRef();\n\n@if (_templateRef) {\n <ng-container *ngTemplateOutlet=\"_templateRef\"></ng-container>\n} @else {\n {{ _column.title }}\n}\n","import { CommonModule } from '@angular/common';\nimport {\n booleanAttribute,\n ChangeDetectionStrategy,\n Component,\n computed,\n effect,\n input,\n isSignal,\n model,\n output,\n Signal,\n} from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdOperator } from '@sdcorejs/angular/components/operator';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport type { SdSearch } from '@sdcorejs/angular/forms/models';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { OPERATORS } from '@sdcorejs/utils/constants';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableColumn } from '../../../models/table-column.model';\n\n@Component({\n selector: 'column-filter',\n templateUrl: './column-filter.component.html',\n styleUrl: './column-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdOperator, SdInput, SdInputNumber, SdSelect, SdDate, SdDateRange, SdBadge],\n})\nexport class ColumnFilterComponent {\n #lastOnChangeValueHash?: string;\n\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n column = input.required<SdTableColumn>();\n columnFilter = input<Record<string, any>>({});\n cacheValues = input<Record<string, any[]> | undefined>(undefined);\n // Parent vẫn truyền `value` vào — giữ input để không phá hợp đồng (template không dùng trực tiếp).\n value = input<any>();\n // 2-way bind từ parent: parent đọc/ghi operator hiện tại của column.\n operator = model<Operator | undefined>(undefined);\n // Khi true (mobile context): gán column.title vào [label] của các control con\n // để parent không phải render <label> riêng. Default false (desktop inline).\n isMobile = input(false, { transform: booleanAttribute });\n\n // ==========================================\n // 2. SIGNAL OUTPUTS\n // ==========================================\n filterChange = output<void>();\n filterCommit = output<void>();\n\n // ==========================================\n // 3. COMPUTED\n // ==========================================\n // autoId final = `${base}-inline-${column.field}`\n autoId = computed(() => {\n const base = this.autoIdInput();\n const field = this.column()?.field ?? '';\n return base ? `${base}-inline-${field}` : '';\n });\n\n // Cho phép parent custom filter qua templateRef (column.filter.filterDef).\n templateRef = computed(() => this.column()?.filter?.filterDef);\n\n // Label cho control con khi isMobile=true. column.title có thể là string hoặc { title, templateRef }.\n // Trả undefined khi không phải mobile → control không hiển thị label (giữ behavior desktop cũ).\n label = computed<string | undefined>(() => {\n if (!this.isMobile()) return undefined;\n const col = this.column();\n const title = col?.title;\n if (!title) return col?.field;\n return typeof title === 'string' ? title : title.title || col?.field;\n });\n\n // Danh sách operator hiển thị dựa trên column config\n operators = computed(() => {\n const col = this.column();\n if (!col?.filter?.disabled && col?.filter?.operator?.enable) {\n return OPERATORS.filter(e => col.filter?.operator?.list?.includes?.(e.value));\n }\n return [];\n });\n\n // Chỉ các Operator value cho phép — truyền vào <sd-operator [operators]>.\n operatorValues = computed(() => this.operators().map(o => o.value));\n\n // Items cho sd-select khi column type = values / lazy-values\n items = computed<any[] | Signal<any[]> | SdSearch>(() => {\n const col = this.column();\n const cache = this.cacheValues();\n if (col?.type === 'values') {\n const optItems = col.option?.items;\n if (Array.isArray(optItems)) return optItems;\n if (isSignal(optItems)) return optItems as Signal<any[]>;\n return cache?.[col.field] || [];\n }\n if (col?.type === 'lazy-values') {\n return col.option.items;\n }\n return [];\n });\n\n constructor() {\n // Khởi tạo default { from: null, to: null } cho split-date / split-number / daterange.\n // Chạy trước lần render đầu nên template thấy giá trị đã init — không cần markForCheck.\n effect(() => {\n const col = this.column();\n const filter = this.columnFilter();\n if (!col || !filter) return;\n if (col.type === 'date' || col.type === 'time' || col.type === 'datetime') {\n if (col.filter?.type !== 'date') {\n filter[col.field] = filter[col.field] || { from: null, to: null };\n }\n }\n if (col.type === 'number' && col.filter?.type === 'split-number') {\n filter[col.field] = filter[col.field] || { from: null, to: null };\n }\n this.#lastOnChangeValueHash = this.#filterValueHash(filter[col.field]);\n });\n }\n\n // ==========================================\n // 4. HANDLERS\n // ==========================================\n onFilterChange = () => {\n this.#emitFilterOnChange();\n this.filterChange.emit();\n };\n\n // Blur input: commit giá trị KHÔNG trigger reload.\n onFilterCommit = () => {\n this.#emitFilterOnChange();\n this.filterCommit.emit();\n };\n\n #emitFilterOnChange = () => {\n const col = this.column();\n const filter = this.columnFilter();\n if (!col?.filter?.onChange || !filter) return;\n\n const value = filter[col.field];\n const hash = this.#filterValueHash(value);\n if (hash === this.#lastOnChangeValueHash) return;\n\n this.#lastOnChangeValueHash = hash;\n col.filter.onChange(value, col, filter);\n };\n\n #filterValueHash = (value: any): string => Utilities.hash({ value });\n}\n","@let _column = column();\n@let _columnFilter = columnFilter();\n@let _autoId = autoId();\n@let _templateRef = templateRef();\n@let _operators = operators();\n@let _items = items();\n@let _label = label();\n@let _context = { columnFilter: _columnFilter, autoId: _autoId };\n\n<div class=\"d-flex c-inline-column align-items-center\" style=\"width: 100%; max-width: 100%\">\n @if (\n _column.type === 'string' ||\n _column.type === 'number' ||\n _column.type === 'boolean' ||\n _column.type === 'values' ||\n _column.type === 'lazy-values' ||\n _column.type === 'date' ||\n _column.type === 'datetime' ||\n _column.type === 'time'\n ) {\n <!-- Operator filter -->\n @if (_operators.length) {\n <sd-operator class=\"mr-4\" [(model)]=\"operator\" [operators]=\"operatorValues()\" />\n }\n\n <!-- Nếu filter nhận vào template -->\n @if (_templateRef) {\n <ng-container *ngTemplateOutlet=\"_templateRef; context: _context\"></ng-container>\n }\n <!-- Mặc định theo type và giá trị values defined của column -->\n @else {\n @if (_column.type === 'string') {\n <sd-input\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n type=\"text\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (keyupEnter)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-input>\n } @else if (_column.type === 'number') {\n @if (!_column.filter?.type) {\n <sd-input-number\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (keyupEnter)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n } @else if (_column.filter?.type === 'split-number') {\n <ng-container *ngTemplateOutlet=\"splitNumberTpl; context: { field: _column.field, disabled: _column.filter?.disabled }\">\n </ng-container>\n }\n } @else if (_column.type === 'boolean') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"[\n { value: '1', display: _column.option?.displayOnTrue || 'True' },\n { value: '0', display: _column.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n hideInlineError>\n <ng-template sdItemDef let-item=\"item\">\n @if (item.value === '1') {\n <sd-badge color=\"success\" [title]=\"_column.option?.displayOnTrue || 'True'\"> </sd-badge>\n } @else {\n <sd-badge color=\"error\" [title]=\"_column.option?.displayOnFalse || 'False'\"> </sd-badge>\n }\n </ng-template>\n </sd-select>\n } @else if (_column.type === 'values') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"_items\"\n [valueField]=\"_column.option.valueField\"\n [displayField]=\"_column.option.displayField\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n [multiple]=\"_column.option.selection === 'MULTIPLE'\"\n hideInlineError>\n </sd-select>\n } @else if (_column.type === 'lazy-values') {\n <sd-select\n minWidthPanel=\"200px\"\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n [style.width]=\"'100%'\"\n size=\"sm\"\n [label]=\"_label\"\n [items]=\"_items\"\n [valueField]=\"_column.option.valueField\"\n [displayField]=\"_column.option.displayField\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n [multiple]=\"_column.option.selection === 'MULTIPLE'\"\n hideInlineError>\n </sd-select>\n } @else if (_column.type === 'date' || _column.type === 'datetime' || _column.type === 'time') {\n @if (!_column.filter?.type || _column.filter?.type === 'daterange') {\n <sd-date-range\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n hideInlineError>\n </sd-date-range>\n } @else if (_column.filter?.type === 'date') {\n <sd-date\n [autoId]=\"_autoId\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[_column.field]\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"_column.filter?.disabled\"\n clearable\n hideInlineError>\n </sd-date>\n } @else if (_column.filter?.type === 'split-date') {\n <ng-container *ngTemplateOutlet=\"splitDateTpl; context: { field: _column.field, disabled: _column.filter?.disabled }\">\n </ng-container>\n }\n }\n }\n } @else {\n <sd-input [autoId]=\"_autoId\" style=\"flex: 1 1 0%; min-width: 0\" type=\"text\" size=\"sm\" disabled></sd-input>\n }\n</div>\n\n<!-- ================================================ -->\n<!-- Split from/to templates (đưa xuống cuối file) -->\n<!-- ================================================ -->\n<ng-template #splitNumberTpl let-field=\"field\" let-disabled=\"disabled\">\n <div class=\"d-flex align-items-center\" style=\"flex: 1 1 0%; min-width: 0\">\n <sd-input-number\n [autoId]=\"_autoId + '-from'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[field].from\"\n (sdChange)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n <div class=\"mx-4\">-</div>\n <sd-input-number\n [autoId]=\"_autoId + '-to'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n size=\"sm\"\n [(model)]=\"_columnFilter[field].to\"\n (sdChange)=\"onFilterChange()\"\n (sdBlur)=\"onFilterCommit()\"\n (cleared)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-input-number>\n </div>\n</ng-template>\n\n<ng-template #splitDateTpl let-field=\"field\" let-disabled=\"disabled\">\n <div class=\"d-flex align-items-center\" style=\"flex: 1 1 0%; min-width: 0\">\n <sd-date\n [autoId]=\"_autoId + '-from'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [label]=\"_label\"\n [(model)]=\"_columnFilter[field].from\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-date>\n <div class=\"mx-4\">-</div>\n <sd-date\n [autoId]=\"_autoId + '-to'\"\n style=\"flex: 1 1 0%; min-width: 0\"\n type=\"date\"\n size=\"sm\"\n [(model)]=\"_columnFilter[field].to\"\n (sdChange)=\"onFilterChange()\"\n [disabled]=\"disabled\"\n clearable\n hideInlineError>\n </sd-date>\n </div>\n</ng-template>\n","import { Pipe, PipeTransform } from '@angular/core';\n\n// Đối với filter loại values, items có thể là 1 mảng, có thể là 1 hàm, do đó cần xử lý nếu là hàm có thể xử lý gọi API\n@Pipe({\n name: 'filterValues',\n})\nexport class FilterValuesPipe implements PipeTransform {\n constructor() {}\n async transform(items: any[] | (() => Promise<any[]>) | undefined | null): Promise<any[]> {\n if (Array.isArray(items)) {\n return items;\n }\n if (typeof items === 'function') {\n const results = await items();\n if (Array.isArray(results)) {\n return results;\n }\n }\n return [];\n }\n}\n","import { SdTableOptionTree, TableOptionTreeLazy } from '../../models/table-option-tree.model';\nimport { SdTableItem } from '../../models/table-item.model';\n\n/**\n * Type-guard: tree có nạp children lười (lazy) hay không.\n * Dùng để narrow discriminated union `SdTableOptionTree` một cách an toàn —\n * thay vì truy cập `option.onExpandChildren` trực tiếp trên union (chỉ tồn tại\n * ở nhánh lazy).\n */\nexport const isLazyTree = <T = unknown>(option?: SdTableOptionTree<T>): option is TableOptionTreeLazy<T> => option?.loadType === 'lazy';\n\n/**\n * Key chứa mảng children trên object row.\n * - `static`: lấy `childrenKey` đã cấu hình, mặc định `'children'`.\n * - `lazy`: không có `childrenKey` riêng → luôn dùng `'children'` làm nơi lưu\n * kết quả nạp lười.\n */\nexport const getChildrenKey = (option?: SdTableOptionTree): string =>\n (option?.loadType === 'static' ? option.childrenKey : undefined) ?? 'children';\n\nexport const getChildrenFromData = <T>(data: T, option?: SdTableOptionTree): T[] => {\n const key = getChildrenKey(option);\n const raw = (data as Record<string, unknown>)?.[key];\n return Array.isArray(raw) ? (raw as T[]) : [];\n};\n\n/**\n * Trạng thái bung mặc định cho một cấp.\n * Chỉ `static` mới có `defaultExpanded`; lazy luôn trả `false` (không thể bung\n * mặc định nhánh chưa nạp).\n */\nexport const resolveDefaultExpanded = (level: number, option?: SdTableOptionTree): boolean => {\n const def = option?.loadType === 'static' ? (option.defaultExpanded ?? false) : false;\n if (def === true) return true;\n if (def === false) return false;\n if (typeof def === 'number') return level < def;\n return false;\n};\n\n/**\n * Row có khả năng có children hay không (để hiện nút bung).\n * - Có children embedded → true.\n * - Lazy tree: dùng `hasChildren(row.data)` nếu được cấu hình; không thì luôn\n * true (chưa biết cho tới khi nạp).\n */\nexport const resolveHasChildren = <T>(row: SdTableItem<T>, option?: SdTableOptionTree<T>): boolean => {\n const embedded = getChildrenFromData(row.data, option);\n if (embedded.length > 0) return true;\n if (isLazyTree(option)) return option.hasChildren ? option.hasChildren(row.data) : true;\n return false;\n};\n\n/** Row cần nạp lười (lazy) khi bung: là lazy tree và chưa có children embedded. */\nexport const hasLazyChildren = <T>(row: SdTableItem<T>, option?: SdTableOptionTree): boolean => {\n if (!isLazyTree(option)) return false;\n return getChildrenFromData(row.data, option).length === 0;\n};\n\n/**\n * True nếu `data` HOẶC bất kỳ hậu duệ nào (theo `childrenKey`) thoả `predicate`.\n *\n * Dùng cho search ở cấp con (static tree, table `type: 'local'`): một nhánh\n * gốc được giữ lại trong kết quả lọc nếu subtree của nó có ít nhất một node\n * khớp từ khoá. `visited` chống đệ quy vô hạn khi data có circular reference.\n */\nexport const subtreeMatches = <T>(\n data: T,\n predicate: (data: T) => boolean,\n option?: SdTableOptionTree,\n visited: Set<unknown> = new Set()\n): boolean => {\n if (data == null || visited.has(data)) return false;\n visited.add(data);\n if (predicate(data)) return true;\n for (const child of getChildrenFromData(data, option)) {\n if (subtreeMatches(child, predicate, option, visited)) return true;\n }\n return false;\n};\n\n/**\n * Lọc mảng children: chỉ giữ child có subtree khớp `predicate`.\n *\n * Trả về MẢNG MỚI nhưng GIỮ NGUYÊN object reference của từng child (không clone)\n * — nhờ vậy `meta.id` (bám theo identity của object data, hoặc theo `option.rowKey`)\n * ổn định, selection / trạng thái bung không bị mất khi từ khoá search đổi. Đây là\n * bước \"prune\" của tính năng search-con.\n */\nexport const filterMatchingChildren = <T>(children: T[], predicate: (data: T) => boolean, option?: SdTableOptionTree): T[] =>\n children.filter(child => subtreeMatches(child, predicate, option));\n\nexport const getVisibleChildrenData = <T>(data: T, option: SdTableOptionTree<T>, predicate?: (data: T) => boolean): T[] => {\n const children = getChildrenFromData(data, option);\n return predicate ? filterMatchingChildren(children, predicate, option) : children;\n};\n\nexport const saveTreeExpandState = <T>(rows: SdTableItem<T>[], expandState: Map<string, boolean>): void => {\n for (const row of rows) {\n if (row.meta.tree?.isExpanded) {\n expandState.set(row.meta.id, true);\n }\n const children = row.meta.tree?.childItems;\n if (children?.length) {\n saveTreeExpandState(children, expandState);\n }\n }\n};\n\nexport const clearTreeChildCache = <T>(rows: SdTableItem<T>[]): void => {\n for (const row of rows) {\n const children = row.meta.tree?.childItems;\n if (children?.length) {\n clearTreeChildCache(children);\n row.meta.tree!.childItems = undefined;\n }\n }\n};\n\nexport const initTreeMeta = <T>(\n rows: SdTableItem<T>[],\n option: SdTableOptionTree<T>,\n args: {\n expandState?: Map<string, boolean>;\n treeSearchPredicate?: (data: T) => boolean;\n level?: number;\n parentId?: string;\n } = {}\n): void => {\n const { expandState, treeSearchPredicate, level = 0, parentId } = args;\n const searchActive = !!treeSearchPredicate;\n for (const row of rows) {\n const saved = expandState?.get(row.meta.id);\n const hasChildren = searchActive\n ? getVisibleChildrenData(row.data, option, treeSearchPredicate).length > 0\n : resolveHasChildren(row, option);\n row.meta.tree = {\n ...row.meta.tree,\n level,\n parentId,\n hasChildren,\n isExpanded: searchActive ? hasChildren : (saved ?? resolveDefaultExpanded(level, option)),\n isExpanding: false,\n };\n }\n};\n\nexport const flattenTree = <T>(roots: SdTableItem<T>[], option?: SdTableOptionTree, visited: Set<string> = new Set()): SdTableItem<T>[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: SdTableItem<T>[] = [];\n\n const walk = (rows: SdTableItem<T>[], level: number, parentPath: number[]) => {\n rows.forEach((row, siblingIdx) => {\n if (visited.has(row.meta.id)) return;\n visited.add(row.meta.id);\n row.meta.tree ??= { level, hasChildren: false, isExpanded: false };\n row.meta.tree.level = level;\n // why: hierarchical numbering (1, 1.2, 1.2.1, ...) — STT template join('.').\n const indexPath = [...parentPath, siblingIdx + 1];\n row.meta.tree.indexPath = indexPath;\n result.push(row);\n\n const canDescend = row.meta.tree.isExpanded && row.meta.tree.hasChildren;\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!canDescend || !depthOk) return;\n\n const children = row.meta.tree.childItems ?? [];\n walk(children, level + 1, indexPath);\n });\n };\n\n walk(roots, 0, []);\n return result;\n};\n\n/** Thu thập mọi SdTableItem đã format trong cây (kể cả node đang collapse). */\nexport const collectFormattedTreeRows = <T>(roots: SdTableItem<T>[]): SdTableItem<T>[] => {\n const result: SdTableItem<T>[] = [];\n const walk = (rows: SdTableItem<T>[]) => {\n for (const row of rows) {\n result.push(row);\n const children = row.meta.tree?.childItems;\n if (children?.length) walk(children);\n }\n };\n walk(roots);\n return result;\n};\n\n/** Flatten ALL nodes regardless of expand state — used for export */\nexport const flattenTreeAll = <T>(\n roots: SdTableItem<T>[],\n option?: SdTableOptionTree,\n visited: Set<string> = new Set()\n): SdTableItem<T>[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: SdTableItem<T>[] = [];\n\n const walk = (rows: SdTableItem<T>[], level: number) => {\n for (const row of rows) {\n if (visited.has(row.meta.id)) continue;\n visited.add(row.meta.id);\n result.push(row);\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n const children = row.meta.tree?.childItems ?? [];\n walk(children, level + 1);\n }\n };\n\n walk(roots, 0);\n return result;\n};\n\n/** Flatten raw data tree for export (ignores expand state) */\nexport const flattenDataTree = <T>(roots: T[], option?: SdTableOptionTree, visited: Set<unknown> = new Set()): T[] => {\n if (!option) return roots;\n const maxDepth = option.maxDepth;\n const result: T[] = [];\n\n const walk = (rows: T[], level: number) => {\n for (const row of rows) {\n if (visited.has(row as object)) continue;\n visited.add(row as object);\n result.push(row);\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n walk(getChildrenFromData(row, option), level + 1);\n }\n };\n\n walk(roots, 0);\n return result;\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableOptionTree } from '../models/table-option-tree.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { flattenTree } from '../services/tree/tree.util';\n\n@Pipe({ name: 'sdTree' })\nexport class SdTreePipe implements PipeTransform {\n transform(items: SdTableItem[], treeOption?: SdTableOptionTree, _revision = 0): SdTableItem[] {\n if (!treeOption) return items;\n return flattenTree(items, treeOption);\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormGroup } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdSection } from '@sdcorejs/angular/components/section';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { BrowserUtilities } from '@sdcorejs/utils/fns';\nimport { FilterValuesPipe } from '../../../pipes';\nimport { SdTableExternalFilter, SdTableOptionFilter, TableFilterRegister } from '../../../services/table-filter/table-filter.model';\n\n@Component({\n selector: 'external-filter',\n templateUrl: './external-filter.component.html',\n styleUrl: './external-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n MatMenuModule,\n MatCheckboxModule,\n SdSection,\n SdInput,\n SdInputNumber,\n SdSelect,\n SdDate,\n SdDatetime,\n SdDateRange,\n SdButton,\n FilterValuesPipe,\n SdCheckbox,\n SdTranslatePipe,\n ],\n})\nexport class ExternalFilterComponent {\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n filter = input<SdTableOptionFilter | undefined>(undefined);\n externalFilters = input<SdTableExternalFilter[] | null | undefined>([]);\n filterRegister = input<TableFilterRegister | undefined>(undefined);\n\n // ==========================================\n // 2. INJECT\n // ==========================================\n readonly #ref = inject(ChangeDetectorRef);\n\n // ==========================================\n // 3. STATE (signals)\n // ==========================================\n externalFilter = signal<Record<string, any>>({});\n inlineExternal = signal<Record<string, boolean>>({});\n filtered = signal<boolean>(false);\n isMobileOrTablet = BrowserUtilities.isMobile();\n // FormGroup là instance, parent đọc qua viewChild — giữ readonly field.\n readonly form = new FormGroup({});\n\n // ==========================================\n // 4. COMPUTED\n // ==========================================\n // autoId base = `<input>-external-` — template ghép tiếp `<field>` cho mỗi control.\n autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-external-` : '';\n });\n\n // Layout column: 4 filter/row → 3 cột; mặc định 6 filter/row → 2 cột.\n col = computed<2 | 3>(() => (this.filter()?.externalFilterPerRow === 4 ? 3 : 2));\n\n // Normalize externalFilters về mảng (input có thể null/undefined).\n filterItems = computed(() => this.externalFilters() || []);\n\n constructor() {\n // Subscribe filterRegister observers — re-subscribe khi input đổi, cleanup khi đổi/destroy.\n // QUAN TRỌNG: phải wrap untracked(). Observer có startWith() → emit ĐỒNG BỘ ngay khi\n // subscribe, callback đọc this.externalFilter() (qua #filtered) sẽ bị effect track →\n // externalFilter.set({}) tạo ref mới → effect rerun → resubscribe → loop vô hạn → OOM.\n effect(onCleanup => {\n const register = this.filterRegister();\n if (!register) return;\n\n untracked(() => {\n const cfgSub = register.configuration.observer.subscribe(cfg => {\n this.inlineExternal.set(cfg.inlineExternal || {});\n });\n\n const valSub = register.value.observer.subscribe(val => {\n this.externalFilter.set(val.externalFilter || {});\n this.filtered.set(this.#filtered());\n });\n\n onCleanup(() => {\n cfgSub.unsubscribe();\n valSub.unsubscribe();\n });\n });\n });\n\n // Khi form values đổi → cập nhật filtered. takeUntilDestroyed() tự lấy DestroyRef từ injection context.\n this.form.valueChanges.pipe(takeUntilDestroyed()).subscribe(() => {\n this.filtered.set(this.#filtered());\n this.#ref.markForCheck();\n });\n }\n\n // ==========================================\n // 5. HANDLERS\n // ==========================================\n onKeyupEnter = () => {\n this.onSubmit();\n };\n\n onFilter = (externalFilter: SdTableExternalFilter) => {\n externalFilter?.onChange?.(this.externalFilter()?.[externalFilter.field]);\n // Nếu không phải manual filter thì submit luôn; manual → đợi user bấm nút Search.\n if (!this.filter()?.manualFilter) {\n this.onSubmit();\n }\n };\n\n onSubmit = () => {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n this.filterRegister()?.value.set({\n externalFilter: this.externalFilter(),\n });\n };\n\n // Public API — table.component gọi để commit pending value vào filterRegister mà không trigger reload.\n updateFilter = () => {\n this.filterRegister()?.value.set({\n externalFilter: this.externalFilter(),\n notReload: true,\n });\n };\n\n clearFilter = (event?: Event) => {\n event?.stopPropagation();\n this.filterRegister()?.value.remove();\n this.filter()?.onClearFilter?.();\n };\n\n onCheckboxChange = (event: Event, externalFilter: SdTableExternalFilter) => {\n event?.stopPropagation();\n const next = { ...this.inlineExternal() };\n next[externalFilter.field] = !next[externalFilter.field];\n this.inlineExternal.set(next);\n this.filterRegister()?.configuration.set({\n inlineExternal: next,\n });\n };\n\n // ==========================================\n // 6. INTERNAL\n // ==========================================\n #filtered = (): boolean => {\n return Object.values({ ...this.externalFilter() }).some(val => {\n // Mảng có phần tử → coi như có filter\n if (Array.isArray(val)) return !!val.length;\n // Object (date) có from/to → có filter\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) return true;\n if ('to' in val && !!val.to) return true;\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n });\n };\n}\n","@let _filter = filter();\n@let _autoId = autoId();\n@let _filterItems = filterItems();\n@let _externalFilter = externalFilter();\n@let _inlineExternal = inlineExternal();\n@let _filtered = filtered();\n@let _col = col();\n\n@if (!_filter?.disabled) {\n @if (!isMobileOrTablet && _filterItems.length) {\n <sd-section\n [hideHeader]=\"_filter?.hideExternalFilterToolbar\"\n icon=\"filter_alt\"\n iconColor=\"secondary\"\n [title]=\"'core.component.table.filter' | sdTranslate\"\n [collapsible]=\"_filter?.collapsible ?? true\">\n <div class=\"d-flex mr-4\" sdHeaderRight>\n <sd-button\n [autoId]=\"_autoId + 'clear'\"\n [disabled]=\"!_filtered\"\n type=\"text\"\n prefixIcon=\"cleaning_services\"\n [tooltip]=\"'core.component.table.clear-selection' | sdTranslate\"\n (click)=\"$event.stopPropagation(); clearFilter($event)\"></sd-button>\n <sd-button\n [autoId]=\"_autoId + 'setting'\"\n type=\"text\"\n prefixIcon=\"settings\"\n [tooltip]=\"'core.component.table.customize' | sdTranslate\"\n [matMenuTriggerFor]=\"menu\"\n (click)=\"$event.stopPropagation()\"></sd-button>\n <mat-menu #menu=\"matMenu\" class=\"sd-custom-panel-filter-configuration\" [attr.data-autoid]=\"_autoId + 'setting-menu'\">\n @for (externalFilter of _filterItems; track externalFilter.field) {\n <button\n [attr.data-autoid]=\"_autoId + 'setting-' + externalFilter.field\"\n mat-menu-item\n (click)=\"onCheckboxChange($event, externalFilter)\"\n [disabled]=\"externalFilter.required\">\n <sd-checkbox\n [autoId]=\"_autoId + 'setting-' + externalFilter.field + '-checkbox'\"\n [label]=\"externalFilter.title\"\n [model]=\"_inlineExternal[externalFilter.field]\"\n [disabled]=\"externalFilter.required\" />\n </button>\n }\n </mat-menu>\n </div>\n <div class=\"row mx-0\" style=\"row-gap: 16px\">\n @for (item of _filterItems; track item.field) {\n @if (_inlineExternal[item.field]) {\n <div class=\"col-md-3 col-sm-6 px-8\" [class.col-lg-2]=\"_col === 2\" [class.col-lg-3]=\"_col === 3\">\n @if (item.type === 'string') {\n <sd-input\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n type=\"text\"\n [(model)]=\"_externalFilter[item.field]\"\n (keyupEnter)=\"onKeyupEnter()\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n clearable\n hideInlineError>\n </sd-input>\n } @else if (item.type === 'number') {\n <sd-input-number\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (keyupEnter)=\"onKeyupEnter()\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n clearable\n hideInlineError>\n </sd-input-number>\n } @else if (item.type === 'boolean') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"[\n { value: true, display: item.option?.displayOnTrue || 'True' },\n { value: false, display: item.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'date') {\n <sd-date\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n clearable\n hideInlineError>\n </sd-date>\n } @else if (item.type === 'datetime') {\n <sd-datetime\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n clearable\n hideInlineError>\n </sd-datetime>\n } @else if (item.type === 'daterange') {\n <sd-date-range\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n [form]=\"form\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n appearance=\"outline\"\n hideInlineError>\n </sd-date-range>\n } @else if (item.type === 'values') {\n @if (item.option.selection === 'MULTIPLE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.option.selection === 'AUTOCOMPLETE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.option.selection === 'MULTIPLEAUTOCOMPLETE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n }\n } @else if (item.type === 'lazy-values') {\n @if (item.option.selection === 'MULTIPLE') {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n multiple\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else {\n <sd-select\n [autoId]=\"_autoId + item.field\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_externalFilter[item.field]\"\n (sdChange)=\"onFilter(item)\"\n appearance=\"outline\"\n [form]=\"form\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n }\n } @else if (item.type === 'custom' && item.filterDef) {\n <ng-container\n *ngTemplateOutlet=\"\n item.filterDef;\n context: { form: form, externalFilter: _externalFilter, autoId: _autoId + item.field }\n \">\n </ng-container>\n }\n </div>\n }\n }\n </div>\n @if (_filter?.manualFilter) {\n <div class=\"d-flex justify-content-end mt-16 px-8\">\n <sd-button\n [autoId]=\"_autoId + 'submit'\"\n [disabled]=\"form.invalid\"\n type=\"fill\"\n color=\"primary\"\n [title]=\"'core.component.table.search' | sdTranslate\"\n prefixIcon=\"filter_alt\"\n (click)=\"onSubmit()\">\n </sd-button>\n </div>\n }\n </sd-section>\n }\n}\n","import { CommonModule } from '@angular/common';\nimport { ChangeDetectionStrategy, Component, computed, input, signal, viewChild } from '@angular/core';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdSideDrawer } from '@sdcorejs/angular/components/side-drawer';\nimport { SdDate } from '@sdcorejs/angular/forms/date';\nimport { SdDateRange } from '@sdcorejs/angular/forms/date-range';\nimport { SdDatetime } from '@sdcorejs/angular/forms/datetime';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdInputNumber } from '@sdcorejs/angular/forms/input-number';\nimport { SdSelect } from '@sdcorejs/angular/forms/select';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableFilterDefDirective } from '../../../directives/sd-table-filter-def.directive';\nimport { SdTableColumn } from '../../../models/table-column.model';\nimport { FilterValuesPipe } from '../../../pipes';\nimport { SdTableExternalFilter, SdTableOptionFilter, TableFilterRegister } from '../../../services/table-filter/table-filter.model';\nimport { ColumnFilterComponent } from '../column-filter/column-filter.component';\n\n/**\n * Mobile-filter — side-drawer chiếm ~90% width thiết bị. Dùng cho table khi\n * render trên màn hình điện thoại (inline filter bị ẩn).\n *\n * Layout (mỗi filter 1 hàng, size='sm'):\n * 1. External filter (render inline — KHÔNG reuse external-filter component\n * vì component đó dùng grid 2/3 cột + có chọn ẩn/hiện không phù hợp mobile).\n * 2. filterDefs — custom templates do app khai báo qua `[sdTableFilterDef]`.\n * 3. Column filter — 1 column-filter / column.\n *\n * State: local working copy. Cancel = đóng (không ghi). Apply = flush vào\n * filterRegister + đóng.\n */\n@Component({\n selector: 'mobile-filter',\n templateUrl: './mobile-filter.component.html',\n styleUrl: './mobile-filter.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [\n CommonModule,\n SdSideDrawer,\n SdButton,\n ColumnFilterComponent,\n SdInput,\n SdInputNumber,\n SdSelect,\n SdDate,\n SdDatetime,\n SdDateRange,\n FilterValuesPipe,\n SdTranslatePipe,\n ],\n})\nexport class MobileFilterComponent {\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n filter = input<SdTableOptionFilter | undefined>(undefined);\n externalFilters = input<SdTableExternalFilter[] | null | undefined>([]);\n columns = input<SdTableColumn[] | null | undefined>([]);\n filterDefs = input<readonly SdTableFilterDefDirective[] | null | undefined>([]);\n filterRegister = input<TableFilterRegister | undefined>(undefined);\n cacheValues = input<Record<string, any[]> | undefined>(undefined);\n\n // ==========================================\n // 2. VIEW QUERY\n // ==========================================\n drawer = viewChild.required(SdSideDrawer);\n\n // ==========================================\n // 3. STATE — local working copies; chỉ flush khi Apply.\n // ==========================================\n workingColumnFilter = signal<Record<string, any>>({});\n workingColumnOperator = signal<Record<string, Operator>>({});\n workingExternalFilter = signal<Record<string, any>>({});\n\n // ==========================================\n // 4. COMPUTED\n // ==========================================\n autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-mobile-filter-` : '';\n });\n\n externalFilterItems = computed(() => this.externalFilters() || []);\n columnItems = computed(() => this.columns() || []);\n filterDefItems = computed(() => this.filterDefs() || []);\n\n // ==========================================\n // 5. PUBLIC API\n // ==========================================\n open = () => {\n const reg = this.filterRegister();\n const val = reg?.value.get();\n const cloned = (o: any) => (o ? JSON.parse(JSON.stringify(o)) : {});\n this.workingColumnFilter.set(cloned(val?.columnFilter));\n this.workingColumnOperator.set(cloned(val?.columnOperator));\n this.workingExternalFilter.set(cloned(val?.externalFilter));\n this.drawer().open();\n };\n\n close = () => this.drawer().close();\n\n // ==========================================\n // 6. HANDLERS\n // ==========================================\n onApply = () => {\n this.filterRegister()?.value.set({\n columnFilter: this.workingColumnFilter(),\n columnOperator: this.workingColumnOperator(),\n externalFilter: this.workingExternalFilter(),\n });\n this.drawer().close();\n };\n\n onCancel = () => {\n // Local working state — không ghi gì khi cancel, chỉ đóng drawer.\n this.drawer().close();\n };\n}\n","@let _autoId = autoId();\n@let _externalFilterItems = externalFilterItems();\n@let _columnItems = columnItems();\n@let _filterDefItems = filterDefItems();\n@let _workingColumnFilter = workingColumnFilter();\n@let _workingColumnOperator = workingColumnOperator();\n@let _workingExternalFilter = workingExternalFilter();\n@let _cacheValues = cacheValues();\n\n<sd-side-drawer\n #drawer\n [title]=\"'core.component.table.filter' | sdTranslate\"\n width=\"90vw\">\n <div class=\"mobile-filter-body\">\n <!-- ============================ -->\n <!-- 1. External filters (inline) -->\n <!-- ============================ -->\n @if (_externalFilterItems.length) {\n <section class=\"mobile-filter-section\">\n @for (item of _externalFilterItems; track item.field) {\n <div class=\"mobile-filter-row\">\n @if (item.type === 'string') {\n <sd-input\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n type=\"text\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-input>\n } @else if (item.type === 'number') {\n <sd-input-number\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-input-number>\n } @else if (item.type === 'boolean') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"[\n { value: true, display: item.option?.displayOnTrue || 'True' },\n { value: false, display: item.option?.displayOnFalse || 'False' },\n ]\"\n valueField=\"value\"\n displayField=\"display\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'date') {\n <sd-date\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n hideInlineError>\n </sd-date>\n } @else if (item.type === 'datetime') {\n <sd-datetime\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n hideInlineError>\n </sd-datetime>\n } @else if (item.type === 'daterange') {\n <sd-date-range\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n [required]=\"item.required\"\n [min]=\"item.minDate\"\n [max]=\"item.maxDate\"\n appearance=\"outline\"\n hideInlineError>\n </sd-date-range>\n } @else if (item.type === 'values') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"item.option.items | filterValues | async\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [multiple]=\"item.option.selection === 'MULTIPLE' || item.option.selection === 'MULTIPLEAUTOCOMPLETE'\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'lazy-values') {\n <sd-select\n [autoId]=\"_autoId + 'ext-' + item.field\"\n size=\"sm\"\n [label]=\"item.title\"\n [items]=\"item.option.items\"\n [valueField]=\"item.option.valueField\"\n [displayField]=\"item.option.displayField\"\n [(model)]=\"_workingExternalFilter[item.field]\"\n appearance=\"outline\"\n [multiple]=\"item.option.selection === 'MULTIPLE'\"\n [required]=\"item.required\"\n hideInlineError>\n </sd-select>\n } @else if (item.type === 'custom' && item.filterDef) {\n <ng-container\n *ngTemplateOutlet=\"\n item.filterDef;\n context: { externalFilter: _workingExternalFilter, autoId: _autoId + 'ext-' + item.field }\n \">\n </ng-container>\n }\n </div>\n }\n </section>\n }\n\n <!-- ============================ -->\n <!-- 2. Custom filterDef templates -->\n <!-- ============================ -->\n @if (_filterDefItems.length) {\n <section class=\"mobile-filter-section\">\n @for (def of _filterDefItems; track def.sdTableFilterDef()) {\n <div class=\"mobile-filter-row\" [attr.data-autoid]=\"_autoId + 'def-' + def.sdTableFilterDef()\">\n <ng-container\n *ngTemplateOutlet=\"def.templateRef!; context: { externalFilter: _workingExternalFilter }\">\n </ng-container>\n </div>\n }\n </section>\n }\n\n <!-- ============================ -->\n <!-- 3. Column filters -->\n <!-- ============================ -->\n @if (_columnItems.length) {\n <section class=\"mobile-filter-section\">\n @for (column of _columnItems; track column.field) {\n <div class=\"mobile-filter-row\" [attr.data-autoid]=\"_autoId + 'col-' + column.field\">\n <column-filter\n [autoId]=\"_autoId + 'col'\"\n [column]=\"column\"\n [columnFilter]=\"_workingColumnFilter\"\n [operator]=\"$any(_workingColumnOperator[column.field])\"\n (operatorChange)=\"_workingColumnOperator[column.field] = $event!\"\n [cacheValues]=\"_cacheValues\"\n isMobile>\n </column-filter>\n </div>\n }\n </section>\n }\n </div>\n\n <ng-container sdFooterRight>\n <div class=\"mobile-filter-footer\">\n <sd-button\n [autoId]=\"_autoId + 'cancel'\"\n class=\"mobile-filter-action\"\n (click)=\"onCancel()\"\n [title]=\"'core.confirm.no' | sdTranslate\"\n type=\"text\"\n color=\"secondary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId + 'apply'\"\n class=\"mobile-filter-action\"\n (click)=\"onApply()\"\n [title]=\"'core.confirm.yes' | sdTranslate\"\n type=\"fill\"\n color=\"primary\">\n </sd-button>\n </div>\n </ng-container>\n</sd-side-drawer>\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableAction, SdTableActionNormal } from '../../models/table-option-selector.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';\n/**\n * Resolves the bulk actions a selection is allowed to run.\n *\n * why: tách khỏi pipe để component đọc được cùng KẾT QUẢ trong `computed()` — quick-action chỉ\n * được mở khi danh sách này KHÔNG rỗng, mà điều đó phải quyết định trong TS chứ không thể suy ra\n * từ một pipe chỉ chạy trong template.\n */\nexport function sdResolveTableActions(selectedItems: SdTableItem[] | undefined, actions: SdTableAction[] | undefined): Action[] {\n const results: SdTableAction[] = [];\n if (!actions?.length || !selectedItems?.length) {\n return [];\n }\n for (const action of actions) {\n if ('children' in action) {\n const children: SdTableActionNormal[] = [];\n for (const childAction of action.children) {\n const key = Utilities.hash(childAction);\n if (selectedItems.every(e => e?.meta?.selector?.actions?.includes(key))) {\n children.push(childAction);\n }\n }\n if (children.length > 0) {\n results.push({ ...action, children });\n }\n } else {\n const key = Utilities.hash(action);\n if (selectedItems.every(e => e?.meta?.selector?.actions?.includes(key))) {\n results.push(action);\n }\n }\n }\n return results.map(result => convertAction(result));\n}\n\nfunction convertAction(action: SdTableAction): Action {\n if ('children' in action) {\n return {\n variant: 'children',\n title: action.title,\n icon: action.icon,\n fontSet: action.fontSet,\n tooltip: action.tooltip,\n color: action.color,\n type: action.type,\n children: action.children.map(e => ({\n variant: 'normal',\n title: e.title,\n icon: e.icon,\n color: action.color,\n type: action.type,\n fontSet: e.fontSet,\n tooltip: e.tooltip,\n click: e.click,\n })),\n };\n }\n return {\n variant: 'normal',\n title: action.title,\n icon: action.icon,\n color: action.color,\n type: action.type,\n fontSet: action.fontSet,\n tooltip: action.tooltip,\n click: action.click,\n };\n}\n\n@Pipe({\n name: 'actionFilter',\n})\nexport class ActionFilterPipe implements PipeTransform {\n transform = (selectedItems: SdTableItem[] | undefined, actions: SdTableAction[] | undefined): Action[] =>\n sdResolveTableActions(selectedItems, actions);\n}\n\nexport type Action<T = any> = ActionNormal<T> | ActionChildren<T>;\n\ninterface ActionNormal<T = any> {\n variant: 'normal';\n icon?: string;\n fontSet?: SdUnwrapSignal<SdButton['fontSet']>;\n tooltip?: SdUnwrapSignal<SdButton['tooltip']>;\n title?: SdUnwrapSignal<SdButton['title']>;\n color?: SdUnwrapSignal<SdButton['color']>;\n type?: SdUnwrapSignal<SdButton['type']>;\n click: (selectedItems?: T[]) => void;\n}\n\ninterface ActionChildren<T = any> {\n variant: 'children';\n icon?: string;\n fontSet?: SdUnwrapSignal<SdButton['fontSet']>;\n tooltip?: SdUnwrapSignal<SdButton['tooltip']>;\n title?: SdUnwrapSignal<SdButton['title']>;\n color?: SdUnwrapSignal<SdButton['color']>;\n type?: SdUnwrapSignal<SdButton['type']>;\n children: ActionNormal<T>[];\n}\n","import { ChangeDetectionStrategy, Component, computed, inject, input, output } from '@angular/core';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdQuickAction } from '@sdcorejs/angular/components/quick-action';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { Action, sdResolveTableActions } from './action-filter.pipe';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'selector-action',\n templateUrl: './selector-action.component.html',\n styleUrl: './selector-action.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [SdIcon, MatMenuModule, SdButton, SdQuickAction],\n})\nexport class SelectorActionComponent {\n // ==========================================\n // 1. SIGNAL INPUTS / OUTPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n tableOption = input<SdTableOption | undefined>(undefined);\n selectedTableItems = input<SdTableItem[] | undefined>(undefined);\n clear = output<void>();\n\n // Base autoId (đã là `components-table-<scope>` từ parent), '' khi parent không set.\n autoId = computed(() => this.autoIdInput() || '');\n\n // ==========================================\n // 2. INJECT\n // ==========================================\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 3. COMPUTED\n // ==========================================\n message = computed<string>(() => {\n const msg = this.tableOption()?.selector?.message;\n if (!msg) return this.#i18n.t('core.component.table.selector-action.default-msg');\n if (typeof msg === 'function') {\n return msg(this.selectedTableItems()?.map(e => e.data));\n }\n return msg;\n });\n\n /** Bulk actions the current selection is allowed to run. */\n actions = computed<Action[]>(() => sdResolveTableActions(this.selectedTableItems(), this.tableOption()?.selector?.actions));\n\n // why: chọn dòng mà KHÔNG có action nào chạy được thì thanh quick-action chỉ còn đúng một nút ✕ —\n // nó che nội dung bảng để đổi lấy thông tin người dùng đã thấy (dòng đang highlight + checkbox).\n // Không có action ⇒ không mở thanh; bỏ chọn bằng chính checkbox ở header/dòng.\n opened = computed(() => !!this.selectedTableItems()?.length && this.actions().length > 0);\n\n // ==========================================\n // 4. HANDLERS\n // ==========================================\n onClear = () => this.clear.emit();\n\n onClickAction = (action: Action) => {\n if (action?.variant === 'normal' && action.click) {\n action.click(this.selectedTableItems()?.map(e => e.data));\n }\n };\n}\n","@let _actions = actions();\n@let _selectedTableItems = selectedTableItems();\n@let _autoId = autoId();\n\n<sd-quick-action [opened]=\"opened()\">\n <div class=\"d-flex align-items-center\" sdMessage>\n <div class=\"c-bg-length\">\n <span class=\"c-length\">{{ _selectedTableItems?.length }}</span>\n </div>\n <div class=\"c-message\">\n {{ message() }}\n </div>\n </div>\n\n <div class=\"d-flex align-items-center mr-8\" sdAction>\n @for (action of _actions; track $index) {\n @if (action.variant === 'normal') {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-action-' + $index : null\"\n class=\"ml-4\"\n [tooltip]=\"action.tooltip\"\n [prefixIcon]=\"action.icon\"\n [color]=\"action.color\"\n [type]=\"action.type || 'light'\"\n [fontSet]=\"action.fontSet\"\n [title]=\"action.title\"\n (click)=\"onClickAction(action)\"></sd-button>\n } @else if (action.variant === 'children') {\n @let _actionIndex = $index;\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-action-' + _actionIndex : null\"\n class=\"ml-4\"\n [tooltip]=\"action.tooltip\"\n [prefixIcon]=\"action.icon || 'more_vert'\"\n [color]=\"action.color || 'secondary'\"\n [type]=\"action.type || 'light'\"\n [fontSet]=\"action.fontSet\"\n [title]=\"action.title\"\n [matMenuTriggerFor]=\"menu\">\n </sd-button>\n <mat-menu #menu=\"matMenu\">\n <span>\n @for (child of action.children; track $index) {\n <button\n mat-menu-item\n [attr.data-autoid]=\"_autoId ? _autoId + '-action-' + _actionIndex + '-' + $index : null\"\n (click)=\"onClickAction(child)\">\n @if (child.icon) {\n <sd-icon [fontSet]=\"child.fontSet\" class=\"c-icon\" [name]=\"child.icon\"></sd-icon>\n }\n <span> {{ child.title }}</span>\n </button>\n }\n </span>\n </mat-menu>\n }\n }\n <!-- why: thanh này chỉ mở khi CÓ action (xem `opened`), nên nút ✕ luôn đi kèm ít nhất một\n action — nó là lối thoát nhanh, không còn là nội dung duy nhất của thanh. -->\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-clear-selection' : null\"\n class=\"ml-4\"\n prefixIcon=\"close\"\n color=\"secondary\"\n type=\"outline\"\n (click)=\"onClear()\"\n width=\"35px\"></sd-button>\n </div>\n</sd-quick-action>\n","import { InjectionToken } from '@angular/core';\nimport { SdTableOptionPaginate } from '../models/table-option-paginate.model';\nimport { SdTableOptionFilter } from '../services/table-filter/table-filter.model';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { SdTableColumn } from '../models';\n\nexport interface ISdTableConfiguration {\n paginate?: {\n /** Số dòng mỗi trang. */\n pageSize?: SdTableOptionPaginate['pageSize'];\n\n /** Danh sách các tuỳ chọn số dòng/trang mà người dùng có thể chọn. */\n pages?: SdTableOptionPaginate['pages'];\n\n showFirstLastButtons?: SdTableOptionPaginate['showFirstLastButtons'];\n };\n filter?: {\n /** Ẩn bộ lọc dưới cột, nếu không cấu hình thì giá trị mặc định là false */\n hideInlineFilter?: SdTableOptionFilter['hideInlineFilter'];\n\n /** Số lượng external filter mỗi dòng, mặc định là 6 */\n externalFilterPerRow?: SdTableOptionFilter['externalFilterPerRow'];\n\n /** Kích hoạt chế độ lọc thủ công, hiển thị nút áp dụng, mặc định là false */\n manualFilter?: SdTableOptionFilter['manualFilter'];\n\n /** Ẩn toolbar (xóa bộ lọc, thiết lập) của external filter, khi có ít external filter user không cần chức năng này, mặc định là false */\n hideExternalFilterToolbar?: SdTableOptionFilter['hideExternalFilterToolbar'];\n\n operator?: {\n list?: Partial<Record<SdTableColumn['type'], Operator[]>>;\n default?: Partial<Record<SdTableColumn['type'], Operator>>;\n };\n };\n images?: {\n filterRequired?: string; // Link ảnh cho table ở trạng thái cần nhập filter\n dataEmpty?: string; // Link ảnh cho table ở trạng thái không có dữ liệu\n filterEmpty?: string; // Link ảnh cho table ở trạng thái filter không có dữ liệu\n };\n}\n\nexport const DEFAULT_TABLE_CONFIG: ISdTableConfiguration = {\n paginate: {\n pageSize: 20,\n pages: [20, 50, 100, 200],\n },\n};\n\nexport const SD_TABLE_CONFIGURATION = new InjectionToken<ISdTableConfiguration>('sd-table.configuration');\n","import { DestroyRef, inject, Injectable } from '@angular/core';\nimport { SdStorageService, SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { Subject } from 'rxjs';\nimport { ConfiguredColumn, ConfiguredTable, ConfiguredTableResult } from '../models/table-option-config.model';\nimport { SdTableOption } from '../models/table-option.model';\nimport { ISdTableConfiguration, SD_TABLE_CONFIGURATION } from '../configurations';\nimport { Utilities } from '@sdcorejs/utils/fns';\n\n@Injectable()\nexport class ConfigService {\n #COLUMNS = {\n SUBINFORMATION: 'sdSubInformationAction',\n COMMAND: 'sdCommand',\n SELECTION: 'sdSelection',\n GROUP: 'sdGroup',\n REORDER: 'sdReorder',\n INDEX: 'sdIndex',\n FILLER: 'sdFiller',\n };\n #prefix = 'TABLE_CONFIG';\n #storage?: SdStorageWithDefault<ConfiguredTable>;\n #widthChange = new Subject<{ field: string; width: string }>();\n widthChange$ = this.#widthChange.asObservable();\n private readonly storageService = inject(SdStorageService);\n readonly #destroyRef = inject(DestroyRef);\n public readonly tableConfiguration: ISdTableConfiguration | null = inject(SD_TABLE_CONFIGURATION, { optional: true });\n\n constructor() {\n this.#destroyRef.onDestroy(() => {\n this.#storage?.destroy();\n this.#storage = undefined;\n });\n }\n\n #loadConfiguredTable = (option: SdTableOption): SdStorageWithDefault<ConfiguredTable> => {\n // Nếu không có key thì không lấy được setting\n if (!option?.key) {\n return this.storageService.create<ConfiguredTable>(Utilities.hash(option), {\n type: 'session', // Nếu không có key thì lưu theo session\n default: this.#default(option),\n });\n }\n // Key của setting là tổ hợp từ key truyền vào và prefix để tránh chung key với các tính năng khác cũng dùng key trong core table\n return this.storageService.create<ConfiguredTable>(\n { prefix: this.#prefix, key: option?.key },\n {\n default: this.#default(option),\n }\n );\n };\n\n loadConfiguredTable = (option: SdTableOption) => {\n // Nếu không có key thì trả về thông tin mặc định\n if (!option?.key) {\n return this.#default(option);\n }\n const storage = this.#loadConfiguredTable(option);\n try {\n return storage.get();\n } finally {\n storage.destroy();\n }\n };\n\n loadConfigurationResult = (option: SdTableOption, configuration: ConfiguredTable): ConfiguredTableResult => {\n const result: ConfiguredTableResult = {\n column: {},\n fixedColumn: {},\n firstColumns: [],\n secondColumns: [],\n firstHeaders: [],\n secondHeaders: [],\n displayedColumns: [],\n displayedFooters: [],\n multipleHeader: false,\n };\n const { selector, group } = option || {};\n const commands = option?.command?.commands || option?.commands || [];\n const isCommandRight = option?.command?.align === 'right' || false; // 👈 thêm dòng này\n const columns = option?.columns?.filter(e => !e.hidden) || [];\n if (selector?.visible) {\n result.firstHeaders.push(this.#COLUMNS.SELECTION);\n result.displayedColumns.push(this.#COLUMNS.SELECTION);\n }\n // why: tree toggle KHÔNG còn là cột riêng — icon expand được nhúng vào cột\n // đầu tiên (cột Index nếu có, ngược lại là cột data đầu). Xem table.component.html.\n // 👇 Chỉ push vào đầu nếu là left (mặc định)\n if (commands?.length && !isCommandRight) {\n result.firstHeaders.push(this.#COLUMNS.COMMAND);\n result.displayedColumns.push(this.#COLUMNS.COMMAND);\n }\n // why: group header row dùng matRowDef RIÊNG với column list ['sdGroupHeader'] qua predicate\n // when:isGroupHeader — KHÔNG inject vào displayedColumns/firstHeaders để tránh colspan trick\n // (TDs khác vẫn render gây overflow row). Data row dùng displayedColumns nguyên vẹn.\n // group option vẫn cần khai báo (qua option.group) để SdGroupPipe biết bucket items.\n // sdIndex đặt sau selector / tree / command-left / group, ngay trước data columns\n if (option.index?.enabled) {\n result.firstHeaders.push(this.#COLUMNS.INDEX);\n result.displayedColumns.push(this.#COLUMNS.INDEX);\n }\n configuration?.columns\n ?.filter(col => !col.invisible)\n .forEach(col => {\n // Kiểm tra column trong config có còn được khai báo trong option\n // Nếu không thì ẩn column đó đi\n const column = columns.find(e => e.field === col.origin.field);\n if (column) {\n const title =\n typeof column.title === 'string' ? col.title || col.origin.title : { ...column.title, title: col.title || col.origin.title };\n const cell = {\n ...column.cell,\n truncate: {\n ...column.cell?.truncate,\n enable: col?.truncate ?? col.origin.truncate,\n type: column?.cell?.truncate?.type ?? 'tooltip',\n },\n };\n\n result.column[col.origin.field] = {\n title: col.title || col.origin.title,\n width: col.width || col.origin.width,\n };\n\n if (col.fixed) {\n result.fixedColumn[col.origin.field] = {\n title: col.title || col.origin.title,\n width: col.width || col.origin.width,\n };\n }\n\n result.firstColumns.push({\n ...column,\n title: title,\n width: col.width || col.origin.width,\n cell: cell,\n });\n result.firstHeaders.push(col.origin.field);\n result.displayedColumns.push(col.origin.field);\n\n if (column.type === 'children') {\n column.children?.forEach(childColumn => {\n result.secondColumns.push(childColumn);\n result.secondHeaders.push(childColumn.field);\n result.displayedColumns.push(childColumn.field);\n });\n }\n }\n });\n // Nếu có thêm các column mới, chèn các column đó vào cuối\n columns\n ?.filter(column => !configuration?.columns?.some(e => e.origin.field === column.field))\n .forEach(column => {\n result.firstColumns.push({\n ...column,\n title: column.title,\n width: column.width,\n });\n result.firstHeaders.push(column.field);\n result.displayedColumns.push(column.field);\n if (column.type === 'children') {\n column.children?.forEach(childColumn => {\n result.secondColumns.push(childColumn);\n result.secondHeaders.push(childColumn.field);\n result.displayedColumns.push(childColumn.field);\n });\n }\n });\n if (option.expand) {\n result.firstHeaders.push(this.#COLUMNS.SUBINFORMATION);\n result.displayedColumns.push(this.#COLUMNS.SUBINFORMATION);\n }\n if (commands?.length && isCommandRight) {\n result.firstHeaders.push(this.#COLUMNS.COMMAND);\n result.displayedColumns.push(this.#COLUMNS.COMMAND);\n }\n // why: filler column ở cuối hấp thụ leftover space — opt-in qua option.filler.enabled.\n // Khi bật, ngăn các cột utility (selection, index, command) bị table-layout auto stretch trên màn rộng.\n if (option.filler?.enabled) {\n result.firstHeaders.push(this.#COLUMNS.FILLER);\n result.displayedColumns.push(this.#COLUMNS.FILLER);\n }\n result.multipleHeader = result.secondHeaders.length > 0;\n // Sub infomation không thể có footer; filler cũng không cần footer cell.\n result.displayedFooters = result.displayedColumns.filter(val => val !== this.#COLUMNS.SUBINFORMATION && val !== this.#COLUMNS.FILLER);\n if (option.filler?.enabled) {\n // Footer cũng cần filler cuối để giữ width đồng bộ với data row\n result.displayedFooters.push(this.#COLUMNS.FILLER);\n }\n if (option?.rowReorder?.enabled) {\n result.displayedColumns.unshift(this.#COLUMNS.REORDER);\n result.firstHeaders.unshift(this.#COLUMNS.REORDER);\n result.displayedFooters.unshift(this.#COLUMNS.REORDER);\n }\n return result;\n };\n\n init = (tableOption: SdTableOption) => {\n this.#storage?.destroy();\n this.#storage = this.#loadConfiguredTable(tableOption);\n return this.#storage;\n };\n\n persistColumnWidth = (field: string, width: string) => {\n if (!this.#storage) return;\n const current = this.#storage.get();\n const columns = current?.columns ? [...current.columns] : [];\n const idx = columns.findIndex(c => c.origin.field === field);\n if (idx < 0) {\n // Cột chưa có trong storage (vd cột mới thêm vào option) — bỏ qua;\n // sẽ được pick up qua flow loadConfigurationResult bình thường.\n return;\n }\n columns[idx] = { ...columns[idx], width };\n this.#storage.setSilent({ ...current, columns });\n this.#widthChange.next({ field, width });\n };\n\n #default = (tableOption: SdTableOption): ConfiguredTable => {\n const columns: ConfiguredColumn[] =\n tableOption?.columns\n ?.filter(e => !e.hidden)\n .map(e => ({\n origin: {\n field: e.field,\n title: typeof e.title === 'string' ? e.title : e.title?.title,\n width: e.width,\n invisible: e.invisible,\n fixed: e.fixed,\n truncate: e?.cell?.truncate?.enable,\n },\n title: typeof e.title === 'string' ? e.title : e.title?.title,\n width: e.width,\n invisible: e.invisible,\n fixed: e.fixed,\n truncate: e?.cell?.truncate?.enable,\n })) || [];\n return {\n columns,\n };\n };\n}\n","import { DragDropModule, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { CdkTableModule } from '@angular/cdk/table';\nimport { CommonModule } from '@angular/common';\nimport { ChangeDetectorRef, Component, computed, inject, input, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent } from 'rxjs';\nimport { FormsModule } from '@angular/forms';\nimport { MatTable, MatTableModule } from '@angular/material/table';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdCheckbox } from '@sdcorejs/angular/forms/checkbox';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\nimport { SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { SdConfirmService } from '@sdcorejs/angular/services/confirm';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { ConfiguredColumn, ConfiguredTable, ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { ConfigService } from '../../services/config.service';\n\n@Component({\n selector: 'config',\n templateUrl: './config.component.html',\n styleUrl: './config.component.scss',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n MatTableModule,\n CdkTableModule,\n DragDropModule,\n SdButton,\n SdCheckbox,\n SdIcon,\n SdInput,\n SdModal,\n SdTranslatePipe,\n ],\n providers: [ConfigService],\n})\nexport class ConfigComponent {\n // ==========================================\n // 1. SIGNAL INPUTS / OUTPUTS\n // ==========================================\n autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n tableOption = input<SdTableOption | undefined>(undefined);\n changes = output<ConfiguredTableResult>();\n\n // Base autoId (đã là `components-table-<scope>` từ parent), '' khi parent không set.\n autoId = computed(() => this.autoIdInput() || '');\n\n // ==========================================\n // 2. SIGNAL QUERIES\n // ==========================================\n modal = viewChild<SdModal>(SdModal);\n table = viewChild.required<MatTable<SdTableColumn>>(MatTable);\n\n // ==========================================\n // 3. INJECT\n // ==========================================\n readonly #ref = inject(ChangeDetectorRef);\n readonly #confirmService = inject(SdConfirmService);\n readonly #configService = inject(ConfigService);\n readonly #i18n = inject(I18nService);\n\n // ==========================================\n // 4. STATE\n // ==========================================\n configuration = signal<ConfiguredTable | undefined>(undefined);\n // dragDisabled không nên là signal (mutated trong drag handlers, không trigger render).\n dragDisabled = true;\n #setting?: SdStorageWithDefault<ConfiguredTable>;\n\n // ==========================================\n // 5. WINDOW MOUSEUP — tự destroy qua takeUntilDestroyed (thay @HostListener)\n // ==========================================\n constructor() {\n fromEvent(window, 'mouseup')\n .pipe(takeUntilDestroyed())\n .subscribe(() => {\n this.dragDisabled = true;\n });\n }\n\n // ==========================================\n // 6. PUBLIC API\n // ==========================================\n open = async () => {\n const opt = this.tableOption();\n if (!opt) return;\n this.#setting = this.#configService.init(opt)!;\n this.configuration.set(this.#setting?.get());\n this.modal()?.open();\n };\n\n close = () => {\n this.modal()?.close();\n };\n\n onSave = () => {\n const cfg = this.configuration();\n if (cfg) this.#setting?.set(cfg);\n this.modal()?.close();\n this.#ref.detectChanges();\n };\n\n onReset = async () => {\n this.#confirmService.confirm(this.#i18n.t('core.component.table.config.confirm-reset')).then(() => {\n this.#setting?.remove();\n this.modal()?.close();\n this.#ref.detectChanges();\n });\n };\n\n /**\n * Cột đang tắt hiển thị thì tiêu đề / độ rộng / cố định / giới hạn ký tự đều vô nghĩa —\n * khoá chúng lại để row nói rõ trạng thái, chỉ chừa ô \"Hiển thị\" để bật lại.\n */\n isRowDisabled = (item: ConfiguredColumn): boolean => !!item?.invisible;\n\n dropTable(event: any) {\n const cols = this.configuration()?.columns;\n if (!cols) return;\n moveItemInArray(cols, event.previousIndex, event.currentIndex);\n this.table().renderRows();\n }\n\n handleMouseDown() {\n this.dragDisabled = false;\n }\n\n handleMouseUp() {\n this.dragDisabled = true;\n }\n}\n","@let _configuration = configuration();\n@let _autoId = autoId();\n@let _columns = ['invisible', 'title', 'width', 'fixed', 'truncate'];\n\n<sd-modal width=\"sm\" [title]=\"'core.component.table.setup' | sdTranslate\" #modal>\n @if (_configuration) {\n <div class=\"c-container sd-table-config\">\n <!-- why: drag handle là affordance duy nhất cho việc đổi thứ tự cột, và nó không tự nói ra\n điều đó — một dòng hint tránh việc người dùng không bao giờ phát hiện tính năng.\n Ký hiệu ⠿ nằm SẴN trong chuỗi i18n (đúng vị trí trong câu), nên không kèm icon riêng. -->\n <p class=\"c-hint\">{{ 'core.component.table.config.drag-hint' | sdTranslate }}</p>\n\n <div class=\"c-table\">\n <table\n mat-table\n [dataSource]=\"_configuration.columns!\"\n cdkDropList\n [cdkDropListData]=\"_configuration.columns\"\n (cdkDropListDropped)=\"dropTable($event)\">\n <ng-container matColumnDef=\"invisible\">\n <th mat-header-cell class=\"c-th\" *matHeaderCellDef>\n {{ 'core.component.form-builder.display' | sdTranslate }}\n </th>\n <td mat-cell *matCellDef=\"let item\">\n <div class=\"c-display-cell\">\n <button\n type=\"button\"\n class=\"c-handle\"\n [title]=\"'core.component.table.config.drag-handle' | sdTranslate\"\n [attr.aria-label]=\"'core.component.table.config.drag-handle' | sdTranslate\"\n (mousedown)=\"handleMouseDown()\"\n (mouseup)=\"handleMouseUp()\">\n <sd-icon name=\"drag_indicator\" aria-hidden=\"true\"></sd-icon>\n </button>\n <!-- why: ô \"Hiển thị\" KHÔNG bao giờ bị khoá — nó là đường duy nhất để bật lại một\n cột đã tắt. -->\n <sd-checkbox [model]=\"!item.invisible\" (modelChange)=\"item.invisible = !item.invisible\" />\n </div>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"title\">\n <th mat-header-cell class=\"c-th\" *matHeaderCellDef>\n {{ 'core.component.table.column-header' | sdTranslate }}\n </th>\n <td mat-cell *matCellDef=\"let item\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"item?.origin?.title\"\n [(model)]=\"item.title\"\n [disabled]=\"isRowDisabled(item)\"\n hideInlineError></sd-input>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"width\">\n <th mat-header-cell class=\"c-th c-col-width\" *matHeaderCellDef>\n {{ 'core.component.table.width' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-width\" *matCellDef=\"let item\">\n <sd-input\n size=\"sm\"\n [placeholder]=\"item?.origin?.width\"\n [(model)]=\"item.width\"\n [disabled]=\"isRowDisabled(item)\"\n hideInlineError></sd-input>\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"fixed\">\n <th mat-header-cell class=\"c-th c-col-toggle\" *matHeaderCellDef>\n {{ 'core.component.table.fixed' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-toggle\" *matCellDef=\"let item\">\n <sd-checkbox [(model)]=\"item.fixed\" [disabled]=\"isRowDisabled(item)\" />\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"truncate\">\n <th mat-header-cell class=\"c-th c-col-toggle\" *matHeaderCellDef>\n {{ 'core.component.table.char-limit' | sdTranslate }}\n </th>\n <td mat-cell class=\"c-col-toggle\" *matCellDef=\"let item\">\n <sd-checkbox [(model)]=\"item.truncate\" [disabled]=\"isRowDisabled(item)\" />\n </td>\n </ng-container>\n\n <tr mat-header-row *matHeaderRowDef=\"_columns; sticky: true\"></tr>\n <tr\n mat-row\n *matRowDef=\"let row; columns: _columns\"\n [class.c-row-hidden]=\"isRowDisabled(row)\"\n cdkDrag\n [cdkDragData]=\"row\"\n cdkDragLockAxis=\"y\"\n [cdkDragDisabled]=\"dragDisabled\">\n </tr>\n </table>\n </div>\n </div>\n }\n <ng-container sdFooterRight>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-skip' : null\"\n (click)=\"close()\"\n [title]=\"'core.component.table.skip' | sdTranslate\"\n color=\"secondary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-reset' : null\"\n (click)=\"onReset()\"\n [title]=\"'core.component.form-builder.default' | sdTranslate\"\n color=\"primary\">\n </sd-button>\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config-apply' : null\"\n (click)=\"onSave()\"\n [title]=\"'core.component.table.apply' | sdTranslate\"\n type=\"fill\"\n color=\"primary\">\n </sd-button>\n </ng-container>\n</sd-modal>\n","import { CommonModule } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Pipe,\n PipeTransform,\n computed,\n effect,\n inject,\n input,\n signal,\n viewChild,\n} from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\nimport { SdTooltipDirective } from '@sdcorejs/angular/directives';\nimport { SdTableColumn } from '../../../models/table-column.model';\nimport { SdTableItem } from '../../../models/table-item.model';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Pipe({\n name: 'asString',\n standalone: true,\n})\nexport class ToStringPipe implements PipeTransform {\n transform(value: any): string {\n return value !== null && value !== undefined ? String(value) : '';\n }\n}\n\n@Component({\n selector: 'view',\n templateUrl: './view.component.html',\n styleUrl: './view.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdBadge, SdSafeHtmlPipe, SdTooltipDirective, ToStringPipe, SdTranslatePipe],\n})\nexport class ViewComponent {\n // Inject\n #cdr = inject(ChangeDetectorRef);\n\n contentContainer = viewChild<ElementRef<HTMLElement>>('contentContainer');\n\n isCollapsed = signal<boolean>(true);\n isOverflowing = signal<boolean>(false);\n\n // Inputs\n autoId = input.required<string | undefined | null>();\n column = input.required<SdTableColumn>();\n item = input.required<SdTableItem>();\n\n truncateEnable = computed(() => {\n return this.column()?.cell?.truncate?.enable;\n });\n\n truncateWidth = computed(() => {\n return this.column()?.width;\n });\n\n constructor() {\n effect(() => {\n this.truncateWidth();\n const container = this.contentContainer();\n if (container) {\n this.#checkOverflow(container.nativeElement);\n }\n });\n }\n\n #checkOverflow = (element: HTMLElement) => {\n // Ném vào queue để đợi DOM render\n setTimeout(() => {\n const hasOverflow = element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;\n if (this.isOverflowing() !== hasOverflow) {\n this.isOverflowing.set(hasOverflow);\n this.#cdr.markForCheck();\n }\n });\n };\n\n toggle = () => {\n this.isCollapsed.update(current => !current);\n };\n\n // why: ô HTML có `view.click` nay là role=\"button\" + tabindex=\"0\" nên Enter/Space phải chạy\n // đúng như click. `view.data` là HTML do consumer cung cấp và có thể chứa control riêng —\n // chỉ xử lý khi CHÍNH ô đang giữ focus để không kích hoạt hai lần.\n onViewKeydown = (event: KeyboardEvent) => {\n if (event.target !== event.currentTarget) return;\n // why: chặn Space cuộn trang.\n event.preventDefault();\n this.item().meta.display[this.column().field]?.click?.();\n };\n}\n","@let _column = column();\n@let _item = item();\n@let _autoId = autoId();\n\n@let view = _item.meta.display[_column.field];\n@let _truncateEnable = truncateEnable();\n@let _truncateWidth = truncateWidth();\n@let _isCollapsed = isCollapsed();\n@let isExpandByMore = isOverflowing() && _column?.cell?.truncate?.type === 'more';\n@let isExpandByTooltip = isOverflowing() && _column?.cell?.truncate?.type === 'tooltip';\n\n@if (view) {\n @if (view.isHtml) {\n @if (view.click) {\n <!-- why: bỏ aria-hidden=\"true\" — ô này có (click) thật nên nó là một control; aria-hidden\n vừa xoá nội dung ô khỏi accessibility tree vừa để lại một vùng bấm chuột \"câm\".\n Nay là role=\"button\" + tabindex=\"0\" + Enter/Space chạy đúng như click. -->\n <div\n #contentContainer\n [attr.data-autoId]=\"_autoId\"\n role=\"button\"\n tabindex=\"0\"\n (click)=\"view.click()\"\n (keydown.enter)=\"onViewKeydown($event)\"\n (keydown.space)=\"onViewKeydown($event)\"\n class=\"text-break cursor-pointer\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? htmlClickTooltip : '')\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"_truncateEnable\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n\n <ng-template #htmlClickTooltip>\n <div\n class=\"c-tooltip-inner-content\"\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <div [innerHTML]=\"view.data | sdSafeHtml\"></div>\n </div>\n </ng-template>\n } @else {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"_isCollapsed\"\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? htmlTooltip : '')\"\n containerClass=\"c-tooltip-html-d374bd93-f136-425c-bcc2-2d88cb163e44\"\n container=\"body\"\n placement=\"bottom\"\n [sdTooltipDelay]=\"100\"\n [style]=\"view.cellStyle\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n\n <ng-template #htmlTooltip>\n <div\n class=\"c-tooltip-inner-content\"\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <div [innerHTML]=\"view.data | sdSafeHtml\"></div>\n </div>\n </ng-template>\n\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">{{ _isCollapsed ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}</button>\n }\n } @else {\n <div\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [sdTooltip]=\"view.tooltip || ''\"\n [style]=\"view.cellStyle\"\n [innerHTML]=\"view.data | sdSafeHtml\"></div>\n }\n <!-- End -->\n }\n } @else {\n <!-- Nếu là giá trị lấy hiển thị lấy trực tiếp từ field -->\n @if (view.badge) {\n @if (view.data) {\n <sd-badge\n [attr.data-autoId]=\"_autoId\"\n [type]=\"view.badge.type\"\n [title]=\"view.data\"\n [color]=\"view.badge.color\"\n [icon]=\"view.badge.icon\"\n [sdTooltip]=\"view.tooltip || ''\"\n (click)=\"!!view.click && view.click()\">\n </sd-badge>\n }\n } @else {\n @if (view.click) {\n <div\n #contentContainer\n class=\"text-break\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis]=\"_truncateEnable\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? view.data : '') | asString\">\n <a [attr.data-autoId]=\"_autoId\" href=\"javascript:;\" (click)=\"view.click()\">\n {{ view.data }}\n </a>\n </div>\n } @else {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [attr.data-autoId]=\"_autoId\"\n class=\"text-break\"\n [style]=\"view.cellStyle\"\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis]=\"_isCollapsed\"\n [sdTooltip]=\"view.tooltip || (isExpandByTooltip ? view.data : '') | asString\">\n {{ view.data }}\n </div>\n\n <!-- Nếu option xem full thông tin là \"btn xem thêm\" -->\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">{{ _isCollapsed ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}</button>\n }\n } @else {\n <div [attr.data-autoId]=\"_autoId\" class=\"text-break\" [style]=\"view.cellStyle\" [sdTooltip]=\"view.tooltip || ''\">\n {{ view.data }}\n </div>\n }\n <!-- End -->\n }\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n signal,\n TemplateRef,\n viewChild,\n computed,\n effect,\n inject,\n ChangeDetectorRef,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { SdTableCellDefDirective } from '../../directives/sd-table-cell-def.directive';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTooltipDirective } from '@sdcorejs/angular/directives';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ViewComponent } from './view/view.component';\nimport { SdTranslatePipe } from '@sdcorejs/angular/i18n';\n\n@Component({\n selector: 'desktop-cell',\n templateUrl: './desktop-cell.component.html',\n styleUrl: './desktop-cell.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [CommonModule, SdTooltipDirective, ViewComponent, SdTranslatePipe],\n})\nexport class DesktopCellComponent {\n // Inject\n #cdr = inject(ChangeDetectorRef);\n\n // ViewChild\n contentContainer = viewChild<ElementRef<HTMLElement>>('contentContainer');\n\n // Inputs\n column = input.required<SdTableColumn>();\n item = input.required<SdTableItem>();\n cellDef = input.required<Record<string, SdTableCellDefDirective>>({});\n\n value = computed(() => {\n return Utilities.getNestedValue(this.item()?.data, this.column()?.field);\n });\n\n key = computed(() => {\n const data = this.item()?.data;\n return data?.id?.toString() || data?.code?.toString() || data?.value?.toString() || '';\n });\n\n autoId = computed(() => {\n const column = this.column();\n const key = this.key();\n return `${key}_${column.field}`;\n });\n\n truncateEnable = computed(() => {\n return this.column()?.cell?.truncate?.enable;\n });\n\n truncateWidth = computed(() => {\n return this.column()?.width;\n });\n\n // why: widen to TemplateRef<any> so ng-packagr doesn't try to surface the\n // directive's internal Context type through this public computed.\n templateRef = computed<TemplateRef<any> | undefined>(() => {\n const cellDef = this.cellDef();\n const column = this.column();\n return cellDef[column?.field]?.templateRef || column?.cell?.templateRef;\n });\n\n isCollapsed = signal<boolean>(true);\n isOverflowing = signal<boolean>(false);\n\n constructor() {\n effect(() => {\n this.truncateWidth();\n const container = this.contentContainer();\n if (container) {\n this.#checkOverflow(container.nativeElement);\n }\n });\n }\n\n toggle = () => {\n this.isCollapsed.update(current => !current);\n };\n\n #checkOverflow = (element: HTMLElement): void => {\n // Ném vào queue để đợi DOM render\n setTimeout(() => {\n const hasOverflow = element.scrollWidth > element.clientWidth || element.scrollHeight > element.clientHeight;\n if (this.isOverflowing() !== hasOverflow) {\n this.isOverflowing.set(hasOverflow);\n this.#cdr.markForCheck();\n }\n });\n };\n}\n","@let _column = column();\n@let _item = item();\n@let _autoId = autoId();\n\n@let _truncateEnable = truncateEnable();\n@let _truncateWidth = truncateWidth();\n@let isExpandByMore = isOverflowing() && _column?.cell?.truncate?.type === 'more';\n@let isExpandByTooltip = isOverflowing() && _column?.cell?.truncate?.type === 'tooltip';\n\n@let _templateRef = templateRef();\n@let context =\n {\n item: _item.data,\n column: _column,\n autoId: _autoId,\n };\n\n@if (_templateRef) {\n <!-- Nếu column có bật \"giới hạn ký tự\" -->\n @if (_truncateEnable) {\n <div\n #contentContainer\n [style.max-width]=\"_truncateWidth\"\n [class.c-ellipsis-html]=\"isCollapsed()\"\n [sdTooltip]=\"isExpandByTooltip ? htmlTooltip : ''\">\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n </div>\n\n <!-- Nếu option xem full thông tin là \"tooltip\" -->\n <ng-template #htmlTooltip>\n <div\n [style.max-width]=\"'calc(' + _truncateWidth + ' * 1.5)'\"\n style=\"max-height: 200px; overflow-y: auto; scrollbar-width: thin\">\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n </div>\n </ng-template>\n\n <!-- Nếu option xem full thông tin là \"btn xem thêm\" -->\n @if (isExpandByMore) {\n <button (click)=\"toggle()\" class=\"c-collapse\">\n {{ isCollapsed() ? ('core.component.form-builder.show-more' | sdTranslate) : ('core.component.form-builder.show-less' | sdTranslate) }}\n </button>\n }\n } @else {\n <ng-container *ngTemplateOutlet=\"_templateRef; context: context\" />\n }\n} @else {\n <view [column]=\"column()\" [item]=\"item()\" [autoId]=\"context.autoId\" />\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableCommand, SdTableCommandNormal } from '../../../models/table-command.model';\nimport { SdTableItem } from '../../../models/table-item.model';\n\n/**\n * Resolves command metadata for the current row once, then lets the template reuse it with `@let`.\n */\n@Pipe({ name: 'command', standalone: true })\nexport class CommandPipe implements PipeTransform {\n transform(item: SdTableItem, command: SdTableCommand): CommandMeta {\n return {\n disabled: this.#disabled(item, command),\n title: this.#title(item, command),\n icon: this.#icon(item, command),\n htmlTemplate: this.#htmlTemplate(item, command),\n };\n }\n\n #disabled = (item: SdTableItem, command: SdTableCommand): boolean => {\n const d = command?.disabled;\n if (d == null) return false;\n return typeof d === 'boolean' ? d : d(item.data);\n };\n\n #title = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.title) return '';\n return typeof command.title === 'string' ? command.title : command.title(item.data);\n };\n\n #icon = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.icon) return '';\n return typeof command.icon === 'string' ? command.icon : command.icon(item.data);\n };\n\n // Only child commands can provide htmlTemplate.\n #htmlTemplate = (item: SdTableItem, command: SdTableCommand): string | undefined => {\n const tpl = (command as SdTableCommandNormal)?.htmlTemplate;\n return typeof tpl === 'function' ? tpl(item.data) : undefined;\n };\n}\n\nexport interface CommandMeta {\n disabled: boolean;\n title: string;\n icon: string;\n htmlTemplate: string | undefined;\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { StringUtilities } from '@sdcorejs/utils/fns';\nimport { SdTableCommand, SdTableCommandChildren, SdTableCommandNormal } from '../../../models/table-command.model';\nimport { SdTableItem } from '../../../models/table-item.model';\n\n/**\n * Filters visible commands and pre-resolves icon, title, and stable key for the current row.\n */\n@Pipe({ name: 'filter', standalone: true })\nexport class CommandFilterPipe implements PipeTransform {\n async transform(item: SdTableItem, commands: SdTableCommand[]): Promise<Command[]> {\n const results: Command[] = [];\n if (!commands) return results;\n\n for (const command of commands) {\n if (!(await this.#visible(item, command))) continue;\n\n const icon = this.#icon(item, command);\n const title = this.#title(item, command);\n\n if ('children' in command) {\n const children: CommandNormal[] = [];\n for (const child of command.children) {\n if (!(await this.#visible(item, child))) continue;\n children.push({\n ...child,\n type: 'normal',\n icon: this.#icon(item, child),\n title: this.#title(item, child),\n key: this.#key(item, child),\n });\n }\n if (children.length > 0) {\n results.push({\n ...command,\n type: 'children',\n icon,\n title,\n key: this.#key(item, command),\n children,\n });\n }\n } else {\n results.push({\n ...command,\n type: 'normal',\n icon,\n title,\n key: this.#key(item, command),\n });\n }\n }\n return results;\n }\n\n #visible = async (item: SdTableItem, command: SdTableCommand): Promise<boolean> => {\n const { hidden } = command;\n if (hidden === undefined) return true;\n if (typeof hidden === 'boolean') return !hidden;\n const result = hidden(item.data);\n return !(result instanceof Promise ? await result : result);\n };\n\n #icon = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.icon) return 'more_vert';\n return typeof command.icon === 'string' ? command.icon : command.icon(item.data);\n };\n\n #title = (item: SdTableItem, command: SdTableCommand): string => {\n if (!command?.title) return '';\n return typeof command.title === 'string' ? command.title : command.title(item.data);\n };\n\n // Stable autoId key generated from resolved icon and title.\n #key = (item: SdTableItem, command: SdTableCommand): string => {\n const icon = this.#icon(item, command);\n const title = this.#title(item, command);\n return `${icon || 'noicon'}-${StringUtilities.changeAliasLowerCase(title) || 'notitle'}`;\n };\n}\n\ntype Command<T = any> = CommandNormal<T> | CommandChildren<T>;\n\ninterface CommandNormal<T = any> extends SdTableCommandNormal<T> {\n type: 'normal';\n key: string;\n title: string;\n icon: string;\n}\n\ninterface CommandChildren<T = any> extends SdTableCommandChildren<T> {\n type: 'children';\n key: string;\n title: string;\n icon: string;\n children: CommandNormal<T>[];\n}\n","import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatTooltipModule } from '@angular/material/tooltip';\nimport { SdTableCommand } from '../../models/table-command.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { CommandPipe } from './pipes/command.pipe';\nimport { CommandFilterPipe } from './pipes/filter.pipe';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'desktop-command',\n templateUrl: './desktop-command.component.html',\n styleUrl: './desktop-command.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n host: {\n '[attr.data-autoid]': 'autoId()',\n },\n imports: [SdIcon, CommonModule, MatTooltipModule, MatMenuModule, MatButtonModule, CommandPipe, CommandFilterPipe],\n})\nexport class DesktopCommand {\n readonly autoIdInput = input<string | null | undefined>(undefined, { alias: 'autoId' });\n readonly item = input.required<SdTableItem>();\n readonly itemIndex = input.required<number>();\n readonly commands = input<SdTableCommand[] | null | undefined>([]);\n\n // Row key for autoId: prefer id, then code, then value, then itemIndex.\n readonly itemKey = computed(() => {\n const data = this.item()?.data as Record<string, unknown> | undefined;\n return data?.['id']?.toString() || data?.['code']?.toString() || data?.['value']?.toString() || this.itemIndex().toString();\n });\n\n // Host autoId: `<base>-command-<itemKey>`. Template appends command and child keys.\n readonly autoId = computed(() => {\n const base = this.autoIdInput();\n return base ? `${base}-command-${this.itemKey()}` : '';\n });\n\n readonly _commands = computed(() => this.commands() || []);\n}\n","@let _autoId = autoId();\n@let _item = item();\n@let filteredCommands = _item | filter: _commands() | async;\n\n@if (filteredCommands?.length) {\n @for (command of filteredCommands; track command.key) {\n @let _meta = _item | command: command;\n @if (command.type === 'normal') {\n <!-- why: bỏ aria-hidden=\"true\" — đây là <button> THẬT, vẫn nhận tab focus nhưng screen reader\n không đọc được gì (nút chỉ có icon, không có text). Thay bằng aria-label lấy từ chính\n tiêu đề command đang hiển thị ở tooltip. -->\n <button\n type=\"button\"\n [attr.data-autoid]=\"_autoId + '-' + command.key\"\n (click)=\"command.click(_item.data)\"\n [matTooltip]=\"_meta.title\"\n [attr.aria-label]=\"_meta.title\"\n [disabled]=\"_meta.disabled\"\n mat-icon-button>\n <sd-icon class=\"c-icon\" [color]=\"command.color || 'secondary'\" [fontSet]=\"command.fontSet\" [name]=\"_meta.icon\"></sd-icon>\n </button>\n } @else {\n <!-- why: nút mở menu con — cũng bỏ aria-hidden và gắn aria-label + aria-haspopup=\"menu\". -->\n <button\n type=\"button\"\n [attr.data-autoid]=\"_autoId + '-' + command.key\"\n [matMenuTriggerFor]=\"menu\"\n [attr.aria-label]=\"_meta.title\"\n aria-haspopup=\"menu\"\n mat-icon-button>\n @if (_meta.icon) {\n <sd-icon class=\"c-icon\" [fontSet]=\"command.fontSet\" [name]=\"_meta.icon\"></sd-icon>\n } @else {\n <sd-icon class=\"c-icon\" [fontSet]=\"command.fontSet\" name=\"more_vert\"></sd-icon>\n }\n </button>\n <mat-menu #menu=\"matMenu\" [attr.data-autoid]=\"_autoId + '-' + command.key + '-menu'\">\n <span>\n @for (childCommand of command.children; track childCommand.key) {\n @let _childMeta = _item | command: childCommand;\n <button\n [attr.data-autoid]=\"_autoId + '-' + command.key + '-' + childCommand.key\"\n mat-menu-item\n (click)=\"childCommand.click(_item.data)\"\n [disabled]=\"_childMeta.disabled\">\n @if (_childMeta.htmlTemplate) {\n <div [innerHTML]=\"_childMeta.htmlTemplate\"></div>\n } @else {\n <span class=\"sd-command-menu-item__content\">\n <sd-icon class=\"sd-command-menu-item__icon\"\n [color]=\"childCommand.color || 'secondary'\"\n [fontSet]=\"childCommand.fontSet\" [name]=\"_childMeta.icon\"></sd-icon>\n <span class=\"sd-command-menu-item__title\">{{ _childMeta.title }}</span>\n </span>\n }\n </button>\n }\n </span>\n </mat-menu>\n }\n }\n}\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, ViewChild, inject, input, output } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\n\nimport { CommonModule } from '@angular/common';\nimport { FormGroup } from '@angular/forms';\nimport { MatChipsModule } from '@angular/material/chips';\nimport { MatSelectionList } from '@angular/material/list';\nimport { MatTableModule } from '@angular/material/table';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdModal } from '@sdcorejs/angular/components/modal';\nimport { SdInput } from '@sdcorejs/angular/forms/input';\nimport { SdConfirmService, SdExcelColumn, SdExcelService, SdLoadingService, SdNotifyService } from '@sdcorejs/angular/services';\n// import hash from 'object-hash';\nimport { SdTableColumn, SdTableOption } from '../../models';\nimport { ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOptionExportDefault } from '../../models/table-option-export.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdExcelSheet } from '@sdcorejs/angular/services/excel';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Component({\n selector: 'sd-popup-export',\n templateUrl: './popup-export.component.html',\n styleUrl: './popup-export.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n standalone: true,\n imports: [SdIcon, CommonModule, MatTableModule, MatChipsModule, SdButton, SdInput, SdModal],\n})\nexport class SdPopupExport {\n private ref = inject(ChangeDetectorRef);\n private loadingService = inject(SdLoadingService);\n private excelService = inject(SdExcelService);\n private notifyService = inject(SdNotifyService);\n private confirmService = inject(SdConfirmService);\n\n tableOption!: SdTableOption;\n columns: SdExcelColumn[] = [];\n templateName?: string | null;\n enableCreating = false;\n @ViewChild('modal') modal?: SdModal;\n @ViewChild('listGroups') listGroups?: MatSelectionList;\n\n selected: Record<string, boolean> = {};\n files: any[] = [];\n\n readonly export = output<{\n file: any | null;\n columns: SdExcelColumn[];\n isCSV?: boolean;\n }>();\n form = new FormGroup({});\n\n exportOption?: SdTableOptionExportDefault;\n @Input('tableOption') set _tableOption(option: SdTableOption) {\n this.tableOption = option;\n if (option.export?.type === 'default') {\n this.exportOption = option.export;\n }\n this.columns = this.#getExportableColumns();\n }\n readonly configuration = input<ConfiguredTableResult>();\n private get key(): string | null {\n const prefix = '93889e78-f971-4a1d-8c73-fe2321af9233';\n if (!this.exportOption?.key) {\n return null;\n }\n return Utilities.hash({\n prefix,\n key: this.exportOption?.key,\n });\n }\n\n private get tableColumns() {\n const columns: SdExcelColumn[] = [];\n this.tableOption.columns\n .filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children\n ?.filter(e => !e.export?.disabled)\n .forEach(childColumn => {\n columns.push({\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n field: childColumn.field,\n width: childColumn.width,\n });\n });\n return;\n }\n columns.push({\n title: typeof column.title === 'string' ? column.title : column.title?.title,\n field: column.field,\n width: column.width,\n });\n });\n return columns.map(e => ({\n field: e.field,\n title: e.title,\n description: e.description,\n width: e.width,\n }));\n }\n private get additionalColumns() {\n return (this.exportOption?.columns?.filter(e => !e.export?.disabled) || []).map(e => ({\n field: e.field,\n title: e.title,\n description: e.description,\n width: e.width,\n }));\n }\n\n #getExportableColumns = (): SdExcelColumn[] => {\n return [...this.tableColumns, ...this.additionalColumns];\n };\n\n readonly #i18n = inject(I18nService);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {}\n\n open = async () => {\n if (!this.key) {\n this.exportDefault();\n return;\n }\n this.loadFiles();\n this.selected = {};\n this.modal?.open();\n this.ref.detectChanges();\n };\n\n #getExportColumns = (): SdExcelColumn[] => {\n const configuration = this.configuration();\n if (configuration) {\n const columns = [...this.tableColumns];\n const { firstColumns, secondColumns } = configuration;\n const displayColumns: SdTableColumn[] = [...firstColumns, ...secondColumns].reduce<SdTableColumn[]>((first, next) => {\n const column = this.tableOption.columns.find(e => e.field === next.field);\n if (!column) {\n return first;\n }\n if (column.type !== 'children') {\n return [...first, column];\n }\n return [...first, ...column.children];\n }, []);\n const results = displayColumns\n .map(e => ({\n ...e,\n data: columns.find(e1 => e1.field === e.field),\n }))\n .filter(e => !!e.data)\n .map(e => e.data!);\n return [...results, ...this.additionalColumns];\n } else {\n return this.columns;\n }\n };\n\n exportDefault = () => {\n this.export.emit({\n file: null,\n columns: this.#getExportColumns(),\n isCSV: false,\n });\n };\n\n exportCSV = () => {\n this.export.emit({\n file: null,\n columns: this.#getExportColumns(),\n isCSV: true,\n });\n };\n\n loadFiles = async (group: string | undefined = undefined) => {\n // TODO: Fix\n // this.files = await this.exportService.filesInFolder({\n // key: this.key!,\n // group,\n // });\n // this.ref.markForCheck();\n };\n\n #initTemplate = async (fileName?: string) => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.exportOption?.sheets)) {\n for (const sheet of this.exportOption.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n return await this.excelService.generateTemplate({\n fileName: fileName || this.exportOption?.fileName,\n columns: this.columns,\n sheets,\n });\n };\n\n generateTemplate = async () => {\n this.loadingService.start();\n await this.#initTemplate().finally(this.loadingService.stop);\n };\n\n generateAndUploadTemplate = async (fileName?: string) => {\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(this.exportOption?.sheets)) {\n for (const sheet of this.exportOption.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n if (Array.isArray(sheet.items)) {\n sheets.push({\n name: sheet.name,\n items: sheet.items,\n headers: sheet.headers,\n });\n } else {\n sheets.push({\n name: sheet.name,\n items: await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n }\n // TODO: Fix\n // return await this.exportService.generateUploadTemplate({\n // key: this.key!,\n // template: {\n // fileName: fileName || this.tableOption?.export?.fileName,\n // columns: this.columns.filter(e => this.selected[e.field]),\n // sheets,\n // },\n // });\n };\n\n onExport = (file: any) => {\n this.export.emit({\n file,\n columns: this.columns,\n });\n this.ref.detectChanges();\n };\n\n uploadTemplate = async () => {\n // TODO: Fix\n // const file = await this.exportService.uploadTemplate({\n // key: this.key!,\n // });\n // if (file) {\n // this.files = [...this.files, file];\n // this.ref.detectChanges();\n // }\n };\n\n removeFile = (file: any) => {\n this.confirmService.confirm('Remove template').then(() => {\n // TODO: Fix\n // this.exportService.removeFile({\n // key: this.key!,\n // fileName: file.fileName,\n // });\n const idx = this.files.indexOf(file);\n this.files.splice(idx, 1);\n this.files = [...this.files];\n this.ref.detectChanges();\n });\n };\n\n createTemplate = async () => {\n if (this.form.invalid) {\n this.form.markAllAsTouched();\n return;\n }\n if (!this.columns.some(e => this.selected[e.field])) {\n this.notifyService.warning(this.#i18n.t('core.component.table.popup-export.select-columns'));\n return;\n }\n this.loadingService.start();\n const fileName = this.templateName + '.xlsx';\n try {\n const result = await this.generateAndUploadTemplate(fileName);\n // TODO: Fix\n // if (result?.filePath) {\n // const file: SdExportFile = {\n // filePath: result.filePath,\n // fileName: result.fileName,\n // };\n // this.onExport(file);\n // this.templateName = null;\n // this.enableCreating = false;\n // this.files = [...this.files, file];\n // this.ref.detectChanges();\n // }\n } finally {\n this.loadingService.stop();\n }\n };\n\n templateNameValidator = (val: string): string => {\n const regex = /^[A-Za-z0-9 _]*[A-Za-z0-9][A-Za-z0-9 _]*$/;\n if (!val) {\n return 'Please enter your template name';\n }\n if (val.length > 50) {\n return 'Template name is too long';\n }\n if (!regex.test(val)) {\n return 'Template name only contains letters, numbers and spaces';\n }\n return '';\n };\n}\n","<sd-modal width=\"907px\" [title]=\"'Exported template'\" #modal>\n <div class=\"row\">\n <div *ngIf=\"!files?.length\" class=\"col-12\">\n <div class=\"c-empty\">\n <img class=\"sd-image-data-empty\" alt=\"empty-image\" />\n <div class=\"T14R\">{{ 'There are no exported templates' }}</div>\n </div>\n </div>\n <ng-container *ngIf=\"files?.length\">\n <div class=\"col-12\">\n <div class=\"c-table\" style=\"max-height: 50vh\">\n <table mat-table [dataSource]=\"files\">\n <ng-container matColumnDef=\"stt\">\n <th mat-header-cell class=\"c-th text-center px-5\" *matHeaderCellDef style=\"width: 50px\">#</th>\n <td class=\"text-center px-5\" mat-cell *matCellDef=\"let item; let idx = index\">\n {{ idx + 1 }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"fileName\">\n <th mat-header-cell class=\"c-th px-5\" *matHeaderCellDef>\n {{ 'File name' }}\n </th>\n <td class=\"px-5\" mat-cell *matCellDef=\"let item\">\n {{ item.fileName }}\n </td>\n </ng-container>\n <ng-container matColumnDef=\"action\">\n <th mat-header-cell class=\"c-th px-5\" *matHeaderCellDef style=\"width: 80px\"></th>\n <td class=\"px-5\" mat-cell *matCellDef=\"let item\">\n <div class=\"d-flex\">\n <button mat-icon-button aria-label=\"delete\" (click)=\"removeFile(item)\">\n <sd-icon name=\"delete\"></sd-icon>\n </button>\n <button mat-icon-button aria-label=\"download\" (click)=\"onExport(item)\">\n <sd-icon name=\"download\"></sd-icon>\n </button>\n </div>\n </td>\n </ng-container>\n <tr mat-header-row *matHeaderRowDef=\"['stt', 'fileName', 'action']; sticky: true\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['stt', 'fileName', 'action']\"></tr>\n </table>\n </div>\n </div>\n <div *ngIf=\"files.length < 5\" class=\"col-12 mt-10\">\n <sd-button class=\"mr-4\" [title]=\"'New template'\" (click)=\"enableCreating = true\" color=\"info\" [disabled]=\"enableCreating\">\n </sd-button>\n <sd-button *ngIf=\"exportOption?.enableUpload\" [title]=\"'Upload template'\" (click)=\"uploadTemplate()\" type=\"outline\">\n </sd-button>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableCreating || !files?.length\">\n <div class=\"col-12 mt-20\">\n <div class=\"T14R\">{{ 'Select columns for creating template' }}:</div>\n </div>\n <div class=\"col-12\">\n <mat-chip-listbox selectable=\"true\" multiple=\"true\">\n <ng-container *ngFor=\"let column of columns\">\n <mat-chip-option [selected]=\"selected[column.field]\" (click)=\"selected[column.field] = !selected[column.field]\">\n {{ column.title }}\n </mat-chip-option>\n </ng-container>\n </mat-chip-listbox>\n </div>\n <div class=\"col-12 row\">\n <div class=\"col-10\">\n <sd-input [form]=\"form\" [label]=\"'Template name'\" [(model)]=\"templateName\" [validator]=\"templateNameValidator\"></sd-input>\n </div>\n <div class=\"col-2 mt-8\">\n <sd-button width=\"100%\" [title]=\"'Save'\" color=\"info\" (click)=\"createTemplate()\"> </sd-button>\n </div>\n </div>\n </ng-container>\n </div>\n</sd-modal>\n","import { Directive, TemplateRef, inject, input } from '@angular/core';\nimport { SdTableColumn } from '../models/table-column.model';\n\ninterface Context<T = any> {\n column: SdTableColumn<T>;\n field: string;\n disabled?: boolean;\n}\n\n@Directive({\n selector: '[sdTableColumnFilterDef]',\n})\nexport class SdTableColumnFilterDefDirective<T = any> {\n static ngTemplateContextGuard<T>(_dir: SdTableColumnFilterDefDirective<T>, _ctx: unknown): _ctx is Context<T> {\n return true;\n }\n\n sdTableColumnFilterDef = input.required<string>();\n templateRef: TemplateRef<Context<T>> = inject(TemplateRef);\n}\n","// sticky-shadow.directive.ts\nimport { afterNextRender, Directive, DestroyRef, ElementRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { fromEvent, Subject } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\n\n/** Cửa sổ gộp (ms) cho cả scroll lẫn mutation — xem chú thích ở constructor. */\nconst SHADOW_UPDATE_DEBOUNCE_MS = 10;\n\n/**\n * Directive thêm hiệu ứng đổ bóng (elevation-2) vào cột sticky cuối cùng bên trái\n * và cột sticky đầu tiên bên phải, tạo ngăn cách trực quan với phần được scroll.\n *\n * Chỉ dùng nội bộ trong sd-table, không chìa ra ngoài.\n *\n * Gắn vào scroll container của table:\n * @example\n * <div class=\"c-table\" stickyShadow>...</div>\n */\n@Directive({\n selector: '[stickyShadow]',\n standalone: true,\n})\nexport class StickyShadowDirective {\n readonly #el = inject(ElementRef<HTMLElement>);\n readonly #destroyRef = inject(DestroyRef);\n\n constructor() {\n afterNextRender(() => {\n const container = this.#el.nativeElement;\n\n // why: MutationObserver bắn callback theo TỪNG batch DOM, mà CDK render row theo\n // nhiều batch liên tiếp; `#updateShadow` lại chạy `querySelectorAll` toàn bảng cho\n // MỖI cột sticky → render một trang 50 dòng quét lại bảng hàng chục lần. Gộp về\n // đúng 1 lần cho mỗi cụm mutation bằng cùng debounce với đường scroll (đã gộp sẵn).\n const mutation$ = new Subject<void>();\n mutation$.pipe(debounceTime(SHADOW_UPDATE_DEBOUNCE_MS), takeUntilDestroyed(this.#destroyRef)).subscribe(() => {\n this.#updateShadow(container);\n });\n\n // Dùng MutationObserver để detect khi CDK render rows mới vào table\n // (data load async, phân trang, ...) — lúc này td mới có đủ sticky classes\n const mutationObserver = new MutationObserver(() => mutation$.next());\n\n mutationObserver.observe(container, {\n childList: true, // Theo dõi thêm/bớt các node con\n subtree: true, // Bao gồm tất cả các cấp con cháu\n });\n\n // Cập nhật shadow mỗi khi user scroll ngang\n fromEvent(container, 'scroll')\n .pipe(debounceTime(SHADOW_UPDATE_DEBOUNCE_MS), takeUntilDestroyed(this.#destroyRef))\n .subscribe(() => this.#updateShadow(container));\n\n // Disconnect MutationObserver khi directive bị destroy\n this.#destroyRef.onDestroy(() => {\n mutationObserver.disconnect();\n mutation$.complete();\n });\n });\n }\n\n /**\n * Toggle class shadow lên tất cả th và td của một cột.\n * Dùng cdk-column-{field} để xác định cột vì Angular CDK\n * add class này đồng nhất lên cả th lẫn td.\n */\n #setShadow(container: HTMLElement, colClass: string, shadowClass: string, add: boolean) {\n container.querySelectorAll<HTMLElement>(`th.${colClass}, td.${colClass}`).forEach(el => {\n el.classList.toggle(shadowClass, add);\n // Cần position relative để ::after absolute hoạt động\n if (add) {\n el.style.position = 'sticky'; // Các cell sticky đã có sẵn, chỉ đảm bảo\n el.style.overflow = 'visible';\n }\n });\n }\n\n /**\n * Tính toán và cập nhật shadow dựa trên vị trí scroll hiện tại.\n *\n * Angular Material đánh dấu sticky left bằng class `mat-mdc-table-sticky-border-elem-left`\n * và sticky right bằng `mat-mdc-table-sticky-border-elem-right` — dùng các class này\n * để detect thay vì getComputedStyle vì reliable hơn.\n *\n * Chỉ apply shadow cho:\n * - Cột cuối cùng trong nhóm sticky-left (sát phần scroll)\n * - Cột đầu tiên trong nhóm sticky-right (sát phần scroll)\n */\n #updateShadow(container: HTMLElement) {\n const scrollLeft = container.scrollLeft;\n const scrollRight = container.scrollWidth - container.clientWidth - scrollLeft;\n\n // Query trên header row đầu tiên để xác định các cột sticky\n // td sẽ được xử lý thông qua #setShadow theo cdk-column class\n const headerRow = container.querySelector<HTMLElement>('tr.c-first-header');\n if (!headerRow) return;\n\n const allStickyLeft = Array.from(headerRow.querySelectorAll<HTMLElement>('th.mat-mdc-table-sticky-border-elem-left'));\n const allStickyRight = Array.from(headerRow.querySelectorAll<HTMLElement>('th.mat-mdc-table-sticky-border-elem-right'));\n\n // Reset shadow toàn bộ các cột sticky trước khi tính lại\n allStickyLeft.forEach(th => {\n const colClass = [...th.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-right', false);\n });\n allStickyRight.forEach(th => {\n const colClass = [...th.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-left', false);\n });\n\n // Chỉ cột cuối cùng sticky-left có shadow khi đang scroll sang phải\n const lastStickyLeft = allStickyLeft.at(-1);\n if (lastStickyLeft && scrollLeft > 0) {\n const colClass = [...lastStickyLeft.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-right', true);\n }\n\n // Chỉ cột đầu tiên sticky-right có shadow khi chưa scroll hết sang phải\n const firstStickyRight = allStickyRight.at(0);\n if (firstStickyRight && scrollRight > 0) {\n const colClass = [...firstStickyRight.classList].find(c => c.startsWith('cdk-column-'));\n if (colClass) this.#setShadow(container, colClass, 'sticky-shadow-left', true);\n }\n }\n}\n","import { Directive, ElementRef, NgZone, OnDestroy, Renderer2, effect, inject, input, output } from '@angular/core';\n\n@Directive({\n selector: '[sdColumnResize]',\n standalone: true,\n})\nexport class SdColumnResizeDirective implements OnDestroy {\n // Bật/tắt resize cho cell này\n sdColumnResize = input.required<boolean>();\n // min/max width tùy chọn (chuỗi 'NNpx'); nếu không phải px sẽ bỏ qua\n minWidth = input<string | undefined>();\n maxWidth = input<string | undefined>();\n // Emit width cuối cùng dạng 'NNpx' khi mouseup\n resizeEnd = output<string>();\n\n #el = inject(ElementRef<HTMLElement>);\n #renderer = inject(Renderer2);\n #zone = inject(NgZone);\n\n #handle?: HTMLElement;\n #unlistenMousedown?: () => void;\n #unlistenMove?: () => void;\n #unlistenUp?: () => void;\n #unlistenBlur?: () => void;\n\n #startX = 0;\n #startWidth = 0;\n #currentWidth = 0;\n\n constructor() {\n effect(() => {\n const enabled = this.sdColumnResize();\n if (enabled) {\n this.#enable();\n } else {\n this.#disable();\n }\n });\n }\n\n ngOnDestroy() {\n this.#disable();\n }\n\n #enable() {\n if (this.#handle) return;\n const th = this.#el.nativeElement;\n this.#renderer.addClass(th, 'sd-col-resize-host');\n\n const handle = this.#renderer.createElement('span');\n this.#renderer.addClass(handle, 'sd-col-resize-handle');\n this.#renderer.appendChild(th, handle);\n this.#handle = handle;\n\n // mousedown listen ngoài Angular zone — drag không trigger CD\n this.#zone.runOutsideAngular(() => {\n this.#unlistenMousedown = this.#renderer.listen(handle, 'mousedown', (e: MouseEvent) => this.#onMousedown(e));\n });\n }\n\n #disable() {\n this.#cleanupDrag();\n this.#unlistenMousedown?.();\n this.#unlistenMousedown = undefined;\n if (this.#handle) {\n this.#renderer.removeChild(this.#el.nativeElement, this.#handle);\n this.#handle = undefined;\n }\n this.#renderer.removeClass(this.#el.nativeElement, 'sd-col-resize-host');\n }\n\n #onMousedown = (event: MouseEvent) => {\n event.preventDefault();\n // stopPropagation để không trigger mat-sort khi click vào handle\n event.stopPropagation();\n\n const th = this.#el.nativeElement;\n this.#startX = event.clientX;\n this.#startWidth = th.getBoundingClientRect().width;\n this.#currentWidth = this.#startWidth;\n\n this.#renderer.setStyle(document.body, 'cursor', 'col-resize');\n this.#renderer.addClass(th, 'sd-resizing');\n\n this.#zone.runOutsideAngular(() => {\n this.#unlistenMove = this.#renderer.listen('document', 'mousemove', (e: MouseEvent) => this.#onMousemove(e));\n this.#unlistenUp = this.#renderer.listen('document', 'mouseup', () => this.#onMouseup());\n // Nếu user kéo ra ngoài window: cleanup an toàn\n this.#unlistenBlur = this.#renderer.listen('window', 'blur', () => this.#onMouseup());\n });\n };\n\n #onMousemove = (event: MouseEvent) => {\n const delta = event.clientX - this.#startX;\n const minPx = this.#parsePx(this.minWidth()) ?? 40;\n const maxPx = this.#parsePx(this.maxWidth()) ?? Number.POSITIVE_INFINITY;\n const w = Math.min(maxPx, Math.max(minPx, this.#startWidth + delta));\n this.#currentWidth = w;\n\n const th = this.#el.nativeElement;\n const px = `${w}px`;\n this.#renderer.setStyle(th, 'width', px);\n this.#renderer.setStyle(th, 'min-width', px);\n this.#renderer.setStyle(th, 'max-width', px);\n };\n\n #onMouseup = () => {\n const finalPx = `${Math.round(this.#currentWidth)}px`;\n this.#cleanupDrag();\n // emit trong Angular zone để consumer chạy CD bình thường\n this.#zone.run(() => this.resizeEnd.emit(finalPx));\n };\n\n #cleanupDrag() {\n this.#unlistenMove?.();\n this.#unlistenMove = undefined;\n this.#unlistenUp?.();\n this.#unlistenUp = undefined;\n this.#unlistenBlur?.();\n this.#unlistenBlur = undefined;\n this.#renderer.removeStyle(document.body, 'cursor');\n if (this.#el?.nativeElement) {\n this.#renderer.removeClass(this.#el.nativeElement, 'sd-resizing');\n }\n }\n\n #parsePx(value?: string): number | null {\n if (!value) return null;\n const m = /^(\\d+(?:\\.\\d+)?)px$/i.exec(value.trim());\n return m ? parseFloat(m[1]) : null;\n }\n}\n","import { isDevMode } from '@angular/core';\nimport { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';\nimport type { SdTableGroupDefContext } from '../directives/sd-table-group-def.directive';\n// import hash from 'object-hash';\nexport interface SdTableMetaSelector {\n selectable?: boolean;\n isSelected?: boolean;\n actions?: string[];\n}\n\nexport interface SdTableMetaExpand {\n isExpanded?: boolean;\n isExpanding?: boolean;\n data?: any;\n}\n\nexport interface SdTableMetaTree<T = any> {\n level: number;\n hasChildren: boolean;\n isExpanded: boolean;\n isExpanding?: boolean;\n parentId?: string;\n /** Cached formatted child SdTableItem[] — populated on first expand/format */\n childItems?: SdTableItem<T>[];\n /**\n * Hierarchical index path từ root tới row hiện tại — sibling-index (1-based) per level.\n * Vd root thứ nhất = [1], child thứ 2 của root đó = [1, 2], grandchild thứ 1 = [1, 2, 1].\n * Template STT join('.') → \"1\", \"1.2\", \"1.2.1\". Populate trong `flattenTree`.\n */\n indexPath?: number[];\n}\n\nexport interface SdTableDisplay {\n tooltip?: string;\n badge?: {\n type: SdUnwrapSignal<SdBadge['type']>;\n color: SdUnwrapSignal<SdBadge['color']>;\n icon?: SdUnwrapSignal<SdBadge['icon']>;\n title?: SdUnwrapSignal<SdBadge['title']>;\n };\n cellStyle?: Record<string, string>;\n data: string | number | undefined | null;\n isHtml: boolean;\n click?: () => void;\n}\n\nexport interface SdTableMetaGroup<T = any> {\n /** Children items thuộc group này (chỉ set trên group header row). */\n items?: SdTableItem<T>[];\n /**\n * Raw data của children (`items.map(i => i.data)`).\n * why: precompute 1 lần lúc SdGroupPipe dựng header — trước đây `groupContext()`\n * map lại mảng này ở MỖI change-detection pass cho MỖI group row.\n */\n data?: T[];\n /** true = row này là synthetic group header (sinh bởi SdGroupPipe). */\n isGroupHeader?: boolean;\n /** Hash key của group (= Utilities.hash(values)). */\n key?: string;\n /** Resolved group-field values (vd `{ customerId: 1, customerName: 'A' }`). */\n values?: Record<string, any>;\n /** Trạng thái expand. Chỉ ý nghĩa khi `option.group.collapsible = true`. */\n isExpanded?: boolean;\n /**\n * true nếu MỌI selectable child trong group đã được chọn.\n * why: cache thay cho `isGroupAllSelected(item)` gọi trong template — hàm đó duyệt\n * toàn bộ children mỗi CD pass. Cập nhật ở selection sync path (`#updateSelectedItems`).\n */\n isSelected?: boolean;\n /** true nếu chỉ MỘT PHẦN children được chọn (partial). Cache — xem `isSelected`. */\n indeterminate?: boolean;\n /**\n * Context ổn định truyền cho template `sdTableGroupDef`.\n * why: giữ NGUYÊN reference qua các CD pass để `ngTemplateOutlet` không phải\n * dựng lại embedded view; giá trị bên trong được mutate tại chỗ khi selection đổi.\n */\n context?: SdTableGroupDefContext<T>;\n}\n\nexport interface SdTableMeta<T> {\n id: string;\n display: Record<string, SdTableDisplay>;\n selector?: SdTableMetaSelector;\n expand?: SdTableMetaExpand;\n group?: SdTableMetaGroup<T>;\n tree?: SdTableMetaTree<T>;\n /**\n * Style inline của cả row, resolve từ `option.style.rowCss` MỘT LẦN mỗi lần render.\n * why: template bind `[ngStyle]` trực tiếp vào đây; gọi `rowCss(...)` trong binding\n * trả object MỚI mỗi CD pass → KeyValueDiffer phải diff lại toàn bộ row mỗi pass.\n */\n rowStyle?: Record<string, string> | null;\n}\n\nexport interface SdTableItem<T = any> {\n meta: SdTableMeta<T>;\n data: T;\n}\n\n// why: id của row TUYỆT ĐỐI không được suy ra từ NỘI DUNG. Hash content khiến 2 row\n// trùng dữ liệu dùng chung 1 id → mat-table `trackBy` tái dùng nhầm view, và các Map\n// keyed theo id (`#treeExpandState`, preserved-selection) đụng key. Thay bằng:\n// 1. `option.rowKey` — field định danh do caller khai báo (ổn định, đọc được, sống\n// qua re-fetch của server);\n// 2. fallback: id sinh theo bộ đếm và ghim vào CHÍNH object data qua WeakMap, nên\n// wrap lại cùng một object (re-format children của tree, filter local) vẫn ra\n// đúng id cũ — ổn định theo IDENTITY chứ không theo nội dung.\nconst rowIdByData = new WeakMap<object, string>();\nlet rowIdSequence = 0;\n\nconst nextRowId = (): string => `sd-row-${++rowIdSequence}`;\n\n/** Resolve id cho một row data. Xem chú thích ở `rowIdByData` để biết thứ tự ưu tiên. */\nexport const resolveTableItemId = <T = any>(item: T, rowKey?: string): string => {\n if (rowKey) {\n const raw = Utilities.getNestedValue(item as Record<string, unknown>, rowKey);\n // why: CHỈ nhận giá trị nguyên thuỷ. `rowKey` trỏ vào object/array thì `String(raw)` cho ra\n // `'[object Object]'` với MỌI row — trùng key `trackBy` (CDK tái dùng view sai) và `visited`\n // Set trong `flattenTree` gộp cả cây thành một row. Rơi về id sinh tự động và cảnh báo ở dev.\n if (raw !== undefined && raw !== null && raw !== '') {\n const kind = typeof raw;\n if (kind === 'string' || kind === 'number' || kind === 'bigint' || kind === 'boolean') return String(raw);\n if (isDevMode()) {\n console.error(\n `[sd-table] option.rowKey \"${rowKey}\" trả về giá trị kiểu ${kind}, không phải nguyên thuỷ. ` +\n `Bỏ qua và dùng id sinh tự động. Trỏ rowKey vào một field định danh (string/number).`\n );\n }\n }\n }\n if (item !== null && typeof item === 'object') {\n const cached = rowIdByData.get(item as object);\n if (cached) return cached;\n const generated = nextRowId();\n rowIdByData.set(item as object, generated);\n return generated;\n }\n // why: row data nguyên thuỷ (mảng string/number) KHÔNG vào được WeakMap. Sinh id mới mỗi lần\n // `format()` sẽ làm `trackBy`, `#treeExpandState` và preserved-selection churn sau mỗi lần\n // reload. Với một giá trị nguyên thuỷ thì NỘI DUNG chính là identity, nên khoá theo\n // `typeof + value` là đúng ngữ nghĩa (khác hẳn hash nội dung của một object).\n return `sd-row-lit-${typeof item}-${String(item)}`;\n};\n\nexport const MapToSdTableItem = <T = any>(item: T, rowKey?: string): SdTableItem<T> => ({\n data: item,\n meta: {\n id: resolveTableItemId(item, rowKey),\n display: {},\n expand: {\n isExpanding: false,\n isExpanded: false,\n },\n group: {},\n selector: { actions: [], isSelected: false, selectable: false },\n tree: { level: 0, hasChildren: false, isExpanded: false, isExpanding: false },\n rowStyle: null,\n },\n});\n","import { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOptionTree } from '../../models/table-option-tree.model';\nimport type { SdTableGroupDefContext } from '../../directives/sd-table-group-def.directive';\nimport { collectFormattedTreeRows, flattenTree } from '../tree/tree.util';\n\nexport const getSelectionRows = <T>(roots: SdTableItem<T>[], treeOpt?: SdTableOptionTree<T>): SdTableItem<T>[] =>\n treeOpt ? flattenTree(roots, treeOpt) : roots;\n\nexport const getSelectedRowData = <T>(rows: SdTableItem<T>[]): T[] =>\n rows.filter(row => row.meta.selector!.isSelected).map(row => row.data);\n\nexport const applyDefaultSelected = <T>(\n roots: SdTableItem<T>[],\n treeOpt: SdTableOptionTree<T> | undefined,\n defaultSelected?: (row: T) => boolean\n): void => {\n if (!defaultSelected) return;\n const rows = treeOpt ? collectFormattedTreeRows(roots) : roots;\n rows.forEach(item => {\n item.meta.selector!.isSelected = defaultSelected(item.data);\n });\n};\n\nexport const resolveSelectAllState = <T>(visibleRows: SdTableItem<T>[]): boolean => {\n const selectableRows = visibleRows.filter(row => row.meta.selector?.selectable);\n return selectableRows.length > 0 && selectableRows.every(row => row.meta.selector?.isSelected);\n};\n\nexport const restorePreservedSelection = <T>(visibleRows: SdTableItem<T>[], preservedSelectedMap: Map<string, SdTableItem<T>>): void => {\n visibleRows.forEach(item => {\n if (preservedSelectedMap.has(item.meta.id)) {\n item.meta.selector!.isSelected = true;\n preservedSelectedMap.set(item.meta.id, item);\n }\n });\n};\n\nexport const syncPreservedSelection = <T>(\n visibleRows: SdTableItem<T>[],\n preservedSelectedMap: Map<string, SdTableItem<T>>\n): SdTableItem<T>[] => {\n visibleRows.forEach(item => {\n const id = item.meta.id;\n if (item.meta.selector!.isSelected) {\n preservedSelectedMap.set(id, item);\n } else {\n preservedSelectedMap.delete(id);\n }\n });\n return Array.from(preservedSelectedMap.values());\n};\n\n// ==========================================\n// GROUP HEADER — selection state + template context\n// ==========================================\n\n/**\n * Cầu nối giữa `SdGroupPipe` (nơi group header được sinh ra) và `SdTable`.\n *\n * why: pipe dựng header nhưng KHÔNG biết method của component, còn component thì không\n * giữ mảng output của pipe. Host là một object DUY NHẤT, ổn định do component sở hữu:\n * pipe đổ header vào `headers` để component sync lại selection state sau này, và mượn\n * `toggleExpand`/`toggleSelect` để gắn vào template context.\n */\nexport interface SdGroupHeaderHost<T = any> {\n /** Sink các group header của lần transform gần nhất. Pipe clear + fill lại mỗi lần. */\n headers: SdTableItem<T>[];\n toggleExpand: (header: SdTableItem<T>) => void;\n toggleSelect: (header: SdTableItem<T>) => void;\n}\n\n/**\n * Tính lại `isSelected` / `indeterminate` của một group header và ĐỒNG BỘ sang context.\n *\n * why: template trước đây bind `[checked]=\"isGroupAllSelected(item)\"` +\n * `[indeterminate]=\"isGroupIndeterminate(item)\"` — mỗi binding duyệt toàn bộ children,\n * mỗi CD pass, cho mỗi group row (và `groupContext()` duyệt thêm lần nữa). Giờ tính MỘT\n * lần ở selection sync path rồi cache lên meta; template chỉ đọc property.\n * Một vòng duyệt duy nhất thay cho cặp `every` + `some`.\n */\nexport const syncGroupSelectionMeta = <T>(header: SdTableItem<T>): void => {\n const group = header.meta.group;\n if (!group?.isGroupHeader) return;\n let total = 0;\n let selected = 0;\n for (const child of group.items ?? []) {\n if (child.meta.selector?.selectable === false) continue;\n total++;\n if (child.meta.selector?.isSelected) selected++;\n }\n group.isSelected = total > 0 && selected === total;\n group.indeterminate = total > 0 && selected > 0 && selected < total;\n const context = group.context;\n if (context) {\n // Mutate TẠI CHỖ — giữ nguyên reference để ngTemplateOutlet không dựng lại view.\n context.isSelected = group.isSelected;\n context.indeterminate = group.indeterminate;\n context.isExpanded = group.isExpanded ?? true;\n }\n};\n\n/**\n * Dựng context truyền cho template `sdTableGroupDef`.\n * Chỉ gọi MỘT lần cho mỗi header (lúc pipe sinh header); sau đó reference được giữ\n * nguyên và giá trị bên trong cập nhật qua `syncGroupSelectionMeta`.\n */\nexport const buildGroupHeaderContext = <T>(header: SdTableItem<T>, host?: SdGroupHeaderHost<T>): SdTableGroupDefContext<T> => {\n const group = header.meta.group;\n const items = group?.items ?? [];\n return {\n items,\n data: group?.data ?? items.map(i => i.data),\n key: group?.key || '',\n values: group?.values || {},\n isExpanded: group?.isExpanded ?? true,\n isSelected: group?.isSelected ?? false,\n indeterminate: group?.indeterminate ?? false,\n toggleExpand: () => host?.toggleExpand(header),\n toggleSelect: () => host?.toggleSelect(header),\n };\n};\n","import { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableOption } from '../models/table-option.model';\nimport { MapToSdTableItem, SdTableItem } from '../models/table-item.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { buildGroupHeaderContext, SdGroupHeaderHost, syncGroupSelectionMeta } from '../services/table-selection/table-selection.util';\n\n@Pipe({ name: 'sdGroup' })\nexport class SdGroupPipe implements PipeTransform {\n /**\n * Nhóm items theo `option.group.fields`. Mỗi group sinh ra 1 synthetic SdTableItem\n * (group header) đặt trước children. Header có `meta.group.isGroupHeader = true` + `key`\n * + `values` + `items` + `isExpanded` để template + table consume.\n *\n * Khi `option.group.collapsible = true` + group đang collapse → children bị lọc khỏi output.\n *\n * `expandState` (optional, owned by component) — Map<key, expanded> giữ trạng thái\n * expand/collapse qua các lần transform. Pipe đọc state từ Map; nếu key chưa tồn tại,\n * dùng `!option.group.defaultCollapsed`. Pipe ghi state về Map cho lần read sau.\n *\n * `host` (optional, owned by component) — nhận danh sách header vừa sinh (để component\n * sync selection state) và cung cấp callback toggle cho template context.\n *\n * @example\n * `_items | sdGroup: _tableOption : groupExpandState : groupHost`\n */\n transform(items: SdTableItem[], gridOption: SdTableOption, expandState?: Map<string, boolean>, host?: SdGroupHeaderHost): SdTableItem[] {\n // why: sink do component sở hữu, pipe reset TẠI CHỖ mỗi lần transform (không gán\n // mảng mới) để reference bên component luôn ổn định.\n if (host) host.headers.length = 0;\n if (gridOption?.tree) {\n if (typeof ngDevMode !== 'undefined' && ngDevMode && gridOption.group) {\n console.warn('[sd-table] option.tree and option.group cannot be used together. group is ignored.');\n }\n return items;\n }\n const group = gridOption?.group;\n if (!group?.fields?.length) return items;\n const fields = group.fields;\n const collapsible = !!group.collapsible;\n const defaultExpanded = !group.defaultCollapsed;\n\n // Bucket items theo combined field-value hash.\n // Field hỗ trợ dot-notation (vd 'customer.id') — resolve qua getNestedValue.\n const buckets = new Map<string, { values: Record<string, any>; items: SdTableItem[] }>();\n for (const item of items) {\n const values: Record<string, any> = {};\n for (const f of fields) values[f as string] = Utilities.getNestedValue(item.data, f as string);\n const key = Utilities.hash(values);\n let bucket = buckets.get(key);\n if (!bucket) {\n bucket = { values, items: [] };\n buckets.set(key, bucket);\n }\n bucket.items.push(item);\n }\n\n const result: SdTableItem[] = [];\n buckets.forEach((bucket, key) => {\n const isExpanded = expandState?.has(key) ? !!expandState.get(key) : defaultExpanded;\n if (collapsible && expandState) expandState.set(key, isExpanded);\n\n const header = MapToSdTableItem({} as any);\n // why: `MapToSdTableItem({})` sinh id cho một object rỗng MỚI mỗi lần transform →\n // trackBy của mat-table đổi liên tục (và trước kia, khi id là hash nội dung, MỌI\n // header dùng CHUNG một id). Khoá id theo group key: duy nhất giữa các group và\n // ổn định qua mọi lần re-eval.\n header.meta.id = `sd-group-${key}`;\n header.meta.group = {\n isGroupHeader: true,\n key,\n values: bucket.values,\n items: bucket.items,\n // why: precompute 1 lần — template/context không map lại mỗi CD pass nữa.\n data: bucket.items.map(i => i.data),\n isExpanded,\n };\n header.meta.selector!.selectable = false;\n header.meta.group.context = buildGroupHeaderContext(header, host);\n syncGroupSelectionMeta(header);\n host?.headers.push(header);\n result.push(header);\n\n if (!collapsible || isExpanded) {\n for (const child of bucket.items) result.push(child);\n }\n });\n return result;\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdTableOptionSelector } from '../models/table-option-selector.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { Utilities } from '@sdcorejs/utils/fns';\n@Pipe({\n name: 'selectionDisabled',\n})\nexport class SdSelectionDisabledPipe implements PipeTransform {\n transform = <T>(selectedItems: SdTableItem<T>[], rowData: SdTableItem<T>, selection: SdTableOptionSelector<T>): boolean => {\n const { disabled, actions } = selection;\n const selectedData = selectedItems.map(e => e.data);\n const setDisabled = (isDisabled: boolean): boolean => {\n rowData.meta.selector!.selectable = !isDisabled;\n return isDisabled;\n };\n if (rowData.meta.selector!.isSelected) {\n return setDisabled(false);\n }\n // Kiểm tra có bị disabled theo function không\n // Dữ liệu chưa được check thì kiểm tra hàm disable nếu có\n if (disabled?.(rowData.data, selectedData)) {\n return setDisabled(true);\n }\n if (!actions?.length) {\n return setDisabled(false);\n }\n // Lọc các action theo selectedItems hiện tại\n const availableActions = actions.filter(action => {\n if ('children' in action) {\n for (const childAction of action.children) {\n const key = Utilities.hash(childAction);\n if (selectedItems.every(e => e.meta.selector?.actions?.includes(key))) {\n return true;\n }\n }\n return false;\n } else {\n const key = Utilities.hash(action);\n return selectedItems.every(e => e.meta.selector?.actions?.includes(key));\n }\n });\n // Kiểm tra rowData có action nào thỏa hay ko, nếu ko thì disabled\n for (const action of availableActions) {\n if ('children' in action) {\n for (const childAction of action.children) {\n if (rowData.meta.selector?.actions?.includes(Utilities.hash(childAction))) {\n return setDisabled(false);\n }\n }\n } else {\n if (rowData.meta.selector?.actions?.includes(Utilities.hash(action))) {\n return setDisabled(false);\n }\n }\n }\n return setDisabled(true);\n };\n}\n","import { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableAction, SdTableOptionSelector } from '../../models/table-option-selector.model';\n\n/** Một action hiển thị được với row này hay không (`hidden` có thể là cờ tĩnh hoặc predicate). */\nconst isActionVisible = <T>(hidden: SdTableAction<T>['hidden'], data: T): boolean =>\n typeof hidden === 'function' ? !hidden(data) : !hidden;\n\n/**\n * Thu thập danh sách action key khả dụng cho MỘT row.\n *\n * why: ghi thẳng vào 2 mảng do caller cấp (in-place) thay vì `return` mảng mới —\n * hàm này chạy trong đường render (mỗi CD pass, mỗi row) nên không được cấp phát\n * mảng mới mỗi lần gọi. Caller reset độ dài mảng trước khi gọi.\n *\n * Key = `Utilities.hash(action)`, khớp với `ActionFilterPipe` để action bar lọc\n * đúng action chung của mọi item đang chọn.\n */\nexport const collectRowActionKeys = <T>(\n rowData: SdTableItem<T>,\n selection: SdTableOptionSelector | undefined,\n actions: string[],\n groupedActions: string[]\n): void => {\n for (const action of selection?.actions ?? []) {\n if ('children' in action) {\n let flag = false;\n let hasGroup = false;\n for (const child of action.children) {\n const { hidden, isGrouped } = child;\n if (isGrouped) {\n hasGroup = true;\n }\n if (isActionVisible(hidden, rowData.data)) {\n flag = true;\n const key = Utilities.hash(child);\n actions.push(key);\n if (isGrouped) {\n groupedActions.push(key);\n }\n }\n }\n if (flag) {\n const key = Utilities.hash(action);\n actions.push(key);\n if (hasGroup) {\n groupedActions.push(key);\n }\n }\n } else {\n const { hidden, isGrouped } = action;\n if (isActionVisible(hidden, rowData.data)) {\n const key = Utilities.hash(action);\n actions.push(key);\n if (isGrouped) {\n groupedActions.push(key);\n }\n }\n }\n }\n};\n\n/**\n * Checkbox \"chọn tất cả\" ở header có hiển thị hay không.\n *\n * why: trước đây là pure pipe `async` với `await setTimeout(500)` bên trong. Sleep đó\n * che một vấn đề THỨ TỰ change-detection: pipe đọc `meta.selector.actions` — mảng do\n * `SdSelectionVisiblePipe` ghi ở cell BODY, mà CDK render header TRƯỚC body, nên ở pass\n * đầu mảng luôn rỗng. Hệ quả: checkbox hiện trễ 500ms và mỗi lần re-eval lại đẻ thêm\n * một timer không ai dọn. Ở đây tự tính key action từ `selection` nên không phụ thuộc\n * pipe nào chạy trước → quyết định được ngay trong pass hiện tại, không cần timer.\n */\nexport const resolveSelectAllVisible = <T>(items: SdTableItem<T>[], selection: SdTableOptionSelector | undefined): boolean => {\n // Nếu chỉ chọn 1 thì không có select all\n if (selection?.single) return false;\n if (!items.length) return false;\n if (!selection?.actions?.length) return true;\n if (selection.actions.some(e => ('children' in e && e.children.some(e1 => e1.isGrouped)) || e.isGrouped)) return false;\n\n const keysPerRow: string[][] = [];\n for (const item of items) {\n const actions: string[] = [];\n collectRowActionKeys(item, selection, actions, []);\n if (actions.length) keysPerRow.push(actions);\n }\n if (!keysPerRow.length) return false;\n // Có ít nhất 1 action chung cho MỌI row còn action → cho phép select all.\n return keysPerRow[0].some(action => keysPerRow.every(keys => keys.includes(action)));\n};\n","import { Pipe, PipeTransform } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdTableOptionSelector } from '../models/table-option-selector.model';\nimport { SdTableItem } from '../models/table-item.model';\nimport { collectRowActionKeys } from '../services/table-selection/selection-action.util';\n\n@Pipe({\n name: 'selectionVisible',\n})\nexport class SdSelectionVisiblePipe implements PipeTransform {\n transform = (rowData: SdTableItem, selection: SdTableOptionSelector | undefined): boolean => {\n const selector = rowData.meta.selector!;\n const actions = (selector.actions ??= []);\n if (!selection?.actions?.length) {\n selector.selectable = true;\n return selector.selectable;\n }\n // why: pipe là pure nhưng lại GHI vào chính input (`meta.selector.actions`). Bản cũ\n // chỉ `actions = actions || []` rồi push, không bao giờ reset — mỗi lần re-eval cho\n // cùng một row (mỗi CD pass) lại nối thêm bản sao của các key vào MẢNG CŨ, tăng vô\n // hạn; `selectable` và `ActionFilterPipe`/select-all sau đó đọc mảng đã nhiễm.\n // Reset TẠI CHỖ (giữ nguyên reference, không cấp phát mảng mới mỗi pass) rồi mới\n // tính lại → transform trở nên idempotent.\n actions.length = 0;\n const groupedActions: string[] = [];\n collectRowActionKeys(rowData, selection, actions, groupedActions);\n\n selector.selectable = !!actions.length;\n if (!selector.selectable || !groupedActions.length || rowData?.meta.group?.items?.length) {\n return selector.selectable;\n }\n // Đối với trường hợp grouped, tuy selectable là true nhưng vẫn ẩn đi checkbox\n // nếu các action đều thuộc groupedActions và rowData ko phải là dòng group\n return actions.some(action => !groupedActions.includes(action));\n };\n}\n","import { Injectable, computed, inject, signal } from '@angular/core';\nimport { I18nService } from '@sdcorejs/angular/i18n';\nimport { SdExcelColumn, SdExcelService } from '@sdcorejs/angular/services';\nimport { SdExcelSheet } from '@sdcorejs/angular/services/excel';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { DateUtilities } from '@sdcorejs/utils/fns';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { ConfiguredTableResult } from '../../models/table-option-config.model';\nimport { SdTableOptionExportColumn } from '../../models/table-option-export.model';\nimport { SdTableOption } from '../../models/table-option.model';\nimport { SdTableFilterRequest } from '../table-filter/table-filter.model';\n\nexport interface SdTableExportContext<T = any> {\n option: SdTableOption<T>;\n configuration?: ConfiguredTableResult;\n total: number;\n cacheObjValues: Record<string, Record<string, string>>;\n\n // Hàm callback để Service gọi ngược lại Component xin dữ liệu từng trang\n fetchChunk: (\n pageNumber: number,\n pageSize: number\n ) => Promise<\n | T[]\n | {\n items: any[];\n total: number;\n }\n >;\n\n // Dành cho custom export\n getFilterInfo: () => SdTableFilterRequest;\n}\n\n@Injectable()\nexport class TableExportService {\n #excelService = inject(SdExcelService);\n #i18n = inject(I18nService);\n\n // ==========================================\n // SIGNAL STATE (Component sẽ bind trực tiếp vào đây)\n // ==========================================\n exporting = signal(false);\n\n // Phần trăm tiến độ export; null = đang rảnh (nút hiện nhãn mặc định).\n #exportPercent = signal<number | null>(null);\n\n // WHY computed + i18n: trước đây đây là signal('Export') hard-code tiếng Anh nên\n // app chạy tiếng Việt vẫn hiện \"Export\". Đọc qua I18nService.t() để nhãn nút bám\n // theo catalog ngôn ngữ hiện tại.\n exportTitle = computed(() => {\n const percent = this.#exportPercent();\n return percent === null ? this.#i18n.t('core.component.table.export') : this.#i18n.t('core.component.table.exporting', { percent });\n });\n\n /** Đặt tiến độ export (0-100), hoặc null để trả nút về nhãn mặc định. */\n setExportProgress = (percent: number | null): void => {\n this.#exportPercent.set(percent === null ? null : Math.min(Math.max(percent, 0), 100));\n };\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n\n exportExcel = (context: SdTableExportContext, columns?: SdExcelColumn[]) => {\n return this.#processExport(context, { columns, isCSV: false });\n };\n\n exportCSV = (context: SdTableExportContext, columns?: SdExcelColumn[]) => {\n return this.#processExport(context, { columns, isCSV: true });\n };\n\n exportCustom = (context: SdTableExportContext) => {\n const { option, getFilterInfo } = context;\n if (option?.export?.type === 'custom') {\n this.exporting.set(true);\n option.export\n .onExport(getFilterInfo())\n .catch(err => {\n console.error(err);\n throw err;\n })\n .finally(() => {\n this.exporting.set(false);\n });\n }\n };\n\n // ==========================================\n // PRIVATE LOGIC\n // ==========================================\n\n async #processExport(context: SdTableExportContext, args: { columns?: SdExcelColumn[]; isCSV?: boolean }) {\n const { option, total, fetchChunk, cacheObjValues } = context;\n\n // `type` là optional trên SdTableOptionExportDefault — undefined cũng coi như 'default'.\n // Chỉ chặn nhánh 'custom' (đã có exportCustom xử lý riêng).\n if (option.export?.type === 'custom') return;\n\n const { isCSV } = args;\n try {\n const columns = this.#getExportColumns(context, args.columns);\n const pageSize = option.export?.maxItemsPerRequest || 1000;\n const batch = option.export?.batch || 1;\n\n let pageNumber = 0;\n let exportItems: any[] = [];\n let currentTotal = total; // Biến cục bộ để track total trả về từ fetchChunk\n\n this.exporting.set(true);\n const items: any[] = [];\n let promises: Promise<any[] | { items: any[]; total: number }>[] = [];\n\n const handleData = async () => {\n const results = await Promise.all(promises);\n promises = [];\n exportItems = [];\n\n for (const result of results) {\n if (result && 'items' in result) {\n exportItems = [...exportItems, ...result.items];\n currentTotal = result.total;\n } else if (Array.isArray(result)) {\n exportItems = [...exportItems, ...result];\n }\n }\n\n if (option.export?.type !== 'custom' && option.export?.mapping) {\n const mappedResults = option.export.mapping(exportItems);\n exportItems = mappedResults instanceof Promise ? await mappedResults : mappedResults;\n }\n\n const totalPage = Math.max(1, currentTotal / pageSize);\n const percent = Math.round(((pageNumber - 1) * 100.0) / totalPage);\n // Đảm bảo percent không vượt quá 100\n this.setExportProgress(percent);\n\n const allColumns = this.#allColumns(option);\n const allExportedColumns = this.#allExportedColumns(option);\n\n for (const item of exportItems) {\n const obj: any = {};\n\n const handle = async (exportColumn: SdExcelColumn) => {\n obj[exportColumn.field] = Utilities.getNestedValue(item, exportColumn.field);\n\n const column = allColumns.find(e => e.field === exportColumn.field);\n const exportedColumn = allExportedColumns.find(e => e.field === exportColumn.field);\n\n if (exportedColumn?.transform) {\n obj[exportedColumn.field] = exportedColumn.transform(Utilities.getNestedValue(item, exportedColumn.field), item);\n return;\n }\n if (!column) return;\n\n if (column.type === 'children') {\n column?.children?.forEach(childColumn =>\n handle({\n field: childColumn.field,\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n width: childColumn.width,\n })\n );\n return;\n }\n if (!columns.some(e => e.field === column.field)) return;\n\n const itemValue = Utilities.getNestedValue(item, column.field as string);\n const fieldStr = column.field as string;\n\n if (column.transform) {\n const transform = column.transform(itemValue, item, { isExport: true });\n obj[fieldStr] = transform instanceof Promise ? await transform : transform;\n obj[fieldStr] = obj[fieldStr] ?? '';\n } else if (itemValue === undefined || itemValue === null || itemValue === '') {\n obj[fieldStr] = '';\n } else if (column.type === 'string' || column.type === 'number') {\n obj[fieldStr] = itemValue;\n } else if (column.type === 'boolean') {\n if (itemValue) {\n obj[fieldStr] = column.option?.displayOnTrue || 'True';\n } else if (obj[fieldStr] !== undefined && obj[fieldStr] !== null) {\n obj[fieldStr] = column.option?.displayOnFalse || 'False';\n }\n } else if (column.type === 'date') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'yyyy/MM/dd');\n } else if (column.type === 'datetime') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'yyyy/MM/dd HH:mm:ss');\n } else if (column.type === 'time') {\n obj[fieldStr] = DateUtilities.toFormat(itemValue, 'HH:mm:ss');\n } else if (column.type === 'values' || column.type === 'lazy-values') {\n const vals = (Array.isArray(itemValue) ? itemValue : [itemValue]).filter(e => !!e?.toString());\n obj[fieldStr] = vals.map(val => cacheObjValues[fieldStr]?.[val]?.[column.option.displayField as any] || val)?.join(', ');\n } else {\n obj[fieldStr] = itemValue;\n }\n };\n\n for (const exportColumn of columns) {\n await handle(exportColumn);\n }\n items.push(obj);\n }\n };\n\n // Vòng lặp lấy dữ liệu\n while (pageNumber * pageSize < currentTotal) {\n promises.push(fetchChunk(pageNumber, pageSize));\n pageNumber++;\n if (promises.length < batch) continue;\n await handleData();\n }\n\n if (promises.length > 0) {\n await handleData();\n }\n\n // Xuất file\n if (isCSV) {\n await this.#excelService.exportCSV({\n columns,\n items,\n fileName: option.export?.fileName,\n });\n return;\n }\n\n const sheets: SdExcelSheet[] = [];\n if (Array.isArray(option.export?.sheets)) {\n for (const sheet of option.export.sheets) {\n if (sheet.name && sheet.items && sheet.headers) {\n sheets.push({\n name: sheet.name,\n items: Array.isArray(sheet.items) ? sheet.items : await sheet.items(),\n headers: sheet.headers,\n });\n }\n }\n }\n\n await this.#excelService.export({\n columns,\n items,\n fileName: option.export?.fileName,\n sheets,\n });\n } finally {\n this.exporting.set(false);\n this.setExportProgress(null);\n }\n }\n\n #getExportColumns(context: SdTableExportContext, explicitColumns?: SdExcelColumn[]): SdExcelColumn[] {\n const { option, configuration } = context;\n let tableColumns: SdExcelColumn[] = [];\n\n option.columns\n .filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children\n ?.filter(e => !e.export?.disabled)\n .forEach(childColumn => {\n tableColumns.push({\n field: childColumn.field as string,\n title: typeof childColumn.title === 'string' ? childColumn.title : childColumn.title?.title,\n description: childColumn.export?.description,\n width: childColumn.width,\n });\n });\n return;\n }\n tableColumns.push({\n field: column.field as string,\n title: typeof column.title === 'string' ? column.title : column.title?.title,\n description: column.export?.description,\n width: column.width,\n });\n });\n\n if (configuration) {\n const displayColumns = [...configuration.firstColumns, ...configuration.secondColumns].reduce<SdTableColumn[]>((first, next) => {\n const column = option.columns.find(e => e.field === next.field);\n if (!column) return first;\n if (column.type !== 'children') return [...first, column];\n return [...first, ...column.children];\n }, []);\n\n tableColumns = displayColumns\n .map(e => ({ ...e, data: tableColumns.find(e1 => e1.field === e.field) }))\n .filter(e => !!e.data)\n .map(e => e.data!);\n }\n\n const columnFields = explicitColumns?.map(e => e.field) || [];\n\n if (option.export?.type !== 'custom') {\n return [...tableColumns, ...(option.export?.columns?.filter(e => !e.export?.disabled) || [])].filter(\n column => !columnFields?.length || columnFields.includes(column.field)\n );\n } else {\n return tableColumns.filter(column => !columnFields?.length || columnFields.includes(column.field));\n }\n }\n\n #allColumns(option: SdTableOption): SdTableColumn[] {\n const columns: SdTableColumn[] = [];\n option.columns\n ?.filter(e => !e.export?.disabled)\n .forEach(column => {\n if (column.type === 'children') {\n column.children?.filter(e => !e.export?.disabled).forEach(childColumn => columns.push(childColumn));\n return;\n }\n columns.push(column);\n });\n return columns;\n }\n\n #allExportedColumns(option: SdTableOption): SdTableOptionExportColumn[] {\n if (option.export?.type !== 'default') return [];\n return option.export?.columns?.filter(e => !e.export?.disabled) || [];\n }\n}\n","import { Injectable, inject, isSignal } from '@angular/core';\nimport { SdFormatDatePipe, SdFormatDatetimePipe, SdFormatNumberPipe } from '@sdcorejs/angular/pipes';\nimport { EMPTY_STR } from '@sdcorejs/utils/constants';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ArrayUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\n\nimport { SdTableColumn, SdTableColumnNormal } from '../../models/table-column.model';\nimport { MapToSdTableItem, SdTableDisplay, SdTableItem } from '../../models/table-item.model';\n\n@Injectable()\nexport class TableFormatService {\n // Keep table display formatting aligned with the public template pipes.\n #formatDatePipe = inject(SdFormatDatePipe);\n #formatDatetimePipe = inject(SdFormatDatetimePipe);\n #formatNumberPipe = inject(SdFormatNumberPipe);\n\n // ==========================================\n // PUBLIC METHODS\n // ==========================================\n\n /**\n * Tải và cache các giá trị từ điển cho cột 'values'\n */\n async loadValues(\n columns: SdTableColumn[],\n cacheValues: Record<string, any[]>,\n cacheObjValues: Record<string, Record<string, string>>\n ): Promise<void> {\n const promises: Promise<{\n key: string;\n valueField: string;\n displayField: string;\n data: any[];\n }>[] = [];\n\n for (const column of columns) {\n if (column.type === 'values' && !cacheValues[column.field]) {\n // TRƯỜNG HỢP 1: Nếu items là một Signal\n if (isSignal(column.option.items)) {\n // Đọc giá trị hiện tại của Signal\n const data = column.option.items();\n\n cacheValues[column.field] = (Array.isArray(data) ? data : []).map(e => ({\n ...e,\n [column.option.valueField]: Utilities.getNestedValue(e, column.option.valueField),\n [column.option.displayField]: Utilities.getNestedValue(e, column.option.displayField),\n }));\n\n cacheObjValues[column.field] = ArrayUtilities.toObject(column.option.valueField, cacheValues[column.field]);\n }\n // TRƯỜNG HỢP 2: Nếu items là hàm trả về Promise (API Call)\n else if (typeof column.option.items === 'function') {\n promises.push(\n column.option.items().then(data => ({\n key: column.field,\n valueField: column.option.valueField,\n displayField: column.option.displayField,\n data: Array.isArray(data) ? data : [],\n }))\n // ... catch error giữ nguyên\n );\n }\n\n // TRƯỜNG HỢP 3: Mảng tĩnh (K[]) bình thường\n else {\n cacheValues[column.field] = column.option.items.map(e => ({\n ...e,\n [column.option.valueField]: Utilities.getNestedValue(e, column.option.valueField),\n [column.option.displayField]: Utilities.getNestedValue(e, column.option.displayField),\n }));\n\n cacheObjValues[column.field] = ArrayUtilities.toObject(column.option.valueField, cacheValues[column.field]);\n }\n }\n }\n\n if (promises.length) {\n const results = await Promise.all(promises);\n for (const result of results) {\n cacheValues[result.key] = result.data.map(e => ({\n ...e,\n [result.valueField]: Utilities.getNestedValue(e, result.valueField),\n [result.displayField]: Utilities.getNestedValue(e, result.displayField),\n }));\n cacheObjValues[result.key] = ArrayUtilities.toObject(result.valueField, cacheValues[result.key]);\n }\n }\n }\n\n /**\n * Chuyển đổi dữ liệu thô thành SdTableItem kèm các thiết lập hiển thị (Display Meta)\n */\n // why: `columns` phải là `SdTableColumn<T>` chứ không phải `SdTableColumn` (mặc định `unknown`).\n // Cột mang callback nhận `rowData: T` (`transform`, `tooltip`, `click`, `useBadge`) nên tham số\n // đứng ở vị trí contravariant — khi default generic còn là `any` thì mọi thứ gán được cho nhau nhờ\n // bivariance của `any`; đổi default sang `unknown` làm lộ ra rằng service đang nhận cột \"kiểu khác\"\n // với hàng nó format. Ràng buộc theo cùng `T` là cách sửa đúng, không phải cast.\n async format<T = unknown>(\n rawItems: T[],\n columns: SdTableColumn<T>[],\n cacheValues: Record<string, any[]>,\n cacheObjValues: Record<string, Record<string, string>>,\n rowKey?: string\n ): Promise<SdTableItem<T>[]> {\n // why: KHÔNG dùng `rawItems.map(MapToSdTableItem)` — `map` truyền cả index làm\n // tham số thứ 2, tức index sẽ bị nhận nhầm thành `rowKey`.\n const items = rawItems.map(item => MapToSdTableItem(item, rowKey));\n const execute = async (column: SdTableColumnNormal<T>) => {\n const { field, click, tooltip, htmlTemplate, transform } = column;\n const fieldStr = field;\n\n // Xử lý nạp từ điển động (lazy-values)\n if (!transform && !htmlTemplate && column.type === 'lazy-values' && typeof column.option.views === 'function') {\n const {\n option: { views, valueField, displayField },\n } = column;\n\n cacheObjValues[fieldStr] = cacheObjValues[fieldStr] || {};\n\n const values = ArrayUtilities.distinct(\n items\n .map(item => Utilities.getNestedValue(item.data, fieldStr))\n .filter(val => val?.toString())\n .reduce<string[]>((current, next) => [...current, ...(Array.isArray(next) ? next : [next])], [])\n .filter(val => !Object.keys(cacheObjValues[fieldStr]).includes(val))\n );\n\n if (values.length) {\n const lazyItems: any[] = (\n await views(values).catch((err: any) => {\n console.error(err);\n return [];\n })\n )\n .filter((item: any) => values.includes(Utilities.getNestedValue(item, valueField)))\n .map((e: any) => ({\n [valueField]: Utilities.getNestedValue(e, valueField),\n [displayField]: Utilities.getNestedValue(e, displayField),\n }));\n Object.assign(cacheObjValues[fieldStr], ArrayUtilities.toObject(valueField, lazyItems) || {});\n }\n }\n\n // Format dữ liệu cho từng hàng\n for (const item of items) {\n const rowData = item.data;\n const value = Utilities.getNestedValue(rowData, fieldStr);\n item.meta.display[fieldStr] = {\n badge: undefined,\n cellStyle: column.align === 'right' ? { 'text-align': 'right!important' } : undefined,\n data: value,\n isHtml: false,\n tooltip: typeof tooltip === 'function' ? tooltip(value, rowData) : undefined,\n click: typeof click === 'function' ? () => click(value, rowData) : undefined,\n };\n\n const display = item.meta.display[fieldStr];\n\n if (typeof htmlTemplate === 'function') {\n display.isHtml = true;\n display.data = htmlTemplate(value, rowData);\n } else if (typeof transform === 'function') {\n const newValue = transform(value, rowData);\n display.data = newValue instanceof Promise ? await newValue : newValue;\n } else {\n // Xử lý các type cơ bản\n if (column.type === 'date' || column.type === 'datetime' || column.type === 'time') {\n display.data = this.#formatDateDisplay(value, column.type);\n display.isHtml = column.type === 'datetime';\n }\n if (column.type === 'values' || column.type === 'lazy-values') {\n display.data = this.#processValuesDisplay(value, column, fieldStr, cacheObjValues);\n }\n if (column.type === 'number' && NumberUtilities.isNumber(value)) {\n display.data = this.#formatNumberPipe.transform(value);\n }\n if (column.type === 'boolean') {\n const { option } = column;\n if (value != null && value !== '') {\n display.data = value === true ? option?.displayOnTrue || 'True' : option?.displayOnFalse || 'False';\n } else {\n display.data = '';\n }\n }\n\n // Xử lý Badge\n const badgeResult = this.#createBadge(column, value, rowData, cacheValues);\n if (badgeResult) {\n display.badge = badgeResult.badge;\n if (badgeResult.title) {\n display.data = badgeResult.title;\n }\n }\n\n if (display.data === null || display.data === undefined || display.data === '') {\n display.data = EMPTY_STR;\n display.badge = undefined;\n }\n }\n }\n };\n\n // Duyệt qua tất cả các cột\n for (const column of columns.filter(e => !e.hidden)) {\n if (column.type === 'children') {\n for (const childColumn of column.children?.filter(e => !e.hidden) || []) {\n await execute(childColumn);\n }\n } else {\n await execute(column);\n }\n }\n return items;\n }\n\n // ==========================================\n // PRIVATE HELPERS\n // ==========================================\n\n #formatDateDisplay(value: any, type: 'date' | 'datetime' | 'time'): string {\n const date = this.#formatDatePipe.transform(value);\n const time = this.#formatDatetimePipe.transform(value, 'HH:mm:ss');\n if (type === 'datetime') {\n return time && date ? `<div class=\"T14R\">${date}<span class=\"T14R text-secondary ml-4\">${time}</span></div>` : '';\n }\n if (type === 'date') return date ?? '';\n if (type === 'time') return time ?? '';\n return '';\n }\n\n #processValuesDisplay<T>(\n value: any,\n column: SdTableColumnNormal<T> & { type: 'values' | 'lazy-values' },\n field: string,\n cacheObjValues: Record<string, Record<string, string>>\n ): string {\n const vals = (Array.isArray(value) ? value : [value]).filter(e => e?.toString());\n return vals.map(val => cacheObjValues[field]?.[val]?.[column.option.displayField as any] || val).join(', ');\n }\n\n #createBadge<T>(\n column: SdTableColumnNormal<T>,\n value: any,\n rowData: T,\n cacheValues: Record<string, any[]>\n ): { badge: SdTableDisplay['badge']; title?: string | number | null } | undefined {\n if (column.useBadge) {\n const badge = column.type === 'values' ? column.useBadge(value, rowData, cacheValues[column.field]) : column.useBadge(value, rowData);\n\n if (badge) {\n return {\n badge: {\n type: badge.type ?? 'round',\n color: badge.color,\n icon: badge.icon,\n },\n title: badge.title,\n };\n }\n }\n if (column.type === 'boolean') {\n return {\n badge: {\n type: 'round',\n color: value ? 'success' : 'error',\n },\n };\n }\n return undefined;\n }\n}\n","/**\n * Build Record<field, width> từ map column hiện tại trong ConfiguredTableResult.\n * Loại bỏ field có width undefined để consumer luôn nhận chuỗi 'NNpx'.\n */\nexport const buildColumnWidthMap = (column: Record<string, { width?: string }> | undefined | null): Record<string, string> => {\n const result: Record<string, string> = {};\n if (!column) return result;\n for (const key of Object.keys(column)) {\n const w = column[key]?.width;\n if (w) result[key] = w;\n }\n return result;\n};\n","import { DateUtilities } from '@sdcorejs/utils/fns';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdTableColumn, SdTableColumnLazyValues, SdTableColumnValues } from '../../models/table-column.model';\nimport { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOptionTree } from '../../models/table-option-tree.model';\nimport { SdTableFilterRequest } from '../table-filter/table-filter.model';\nimport { subtreeMatches } from '../tree/tree.util';\n\nexport interface FilterLocalItemsOption<T> {\n type: 'local' | 'server';\n columns: SdTableColumn<T>[];\n tree?: SdTableOptionTree<T>;\n}\n\nexport interface FilterLocalItemsResult<T, TItem> {\n items: TItem[];\n total: number;\n treeSearchPredicate?: (data: T) => boolean;\n}\n\ntype LocalFilterItem<T> = SdTableItem<T> | T;\n\nconst isTableItem = <T>(item: LocalFilterItem<T>): item is SdTableItem<T> =>\n !!item && typeof item === 'object' && 'data' in item && 'meta' in item;\n\nconst resolveItemData = <T>(item: LocalFilterItem<T>): T => (isTableItem(item) ? item.data : (item as T));\n\nexport const hasActiveColumnFilter = <T>(rawColumnFilter: Partial<Record<string, any>> = {}, columns: SdTableColumn<T>[] = []): boolean =>\n columns.some(col => {\n const v = rawColumnFilter[col.field];\n if (Array.isArray(v)) return v.length > 0;\n if (v && typeof v === 'object') return !!v.from || !!v.to;\n return v !== undefined && v !== null && v !== '';\n });\n\nexport const matchesColumnFilter = <T>(\n data: T,\n columns: SdTableColumn<T>[] = [],\n rawColumnFilter: Partial<Record<string, any>> = {}\n): boolean => {\n for (const column of columns) {\n const { field, type } = column;\n const filterValue: string = (rawColumnFilter[field] || '').toString().trim().toLowerCase();\n const rawColVal = Utilities.getNestedValue(data, field);\n const columnValue: string = (rawColVal || '').toString().trim().toLowerCase();\n\n if (filterValue) {\n if (!columnValue && type !== 'datetime' && type !== 'date' && type !== 'time') {\n return false;\n }\n if (type === 'string') {\n if (columnValue.indexOf(filterValue) === -1) {\n return false;\n }\n } else if (type === 'values' || type === 'lazy-values') {\n const columnType = column as SdTableColumnValues<T> | SdTableColumnLazyValues<T>;\n // why: chọn nhánh theo HÌNH DẠNG GIÁ TRỊ, không theo `option.selection`. Inline filter dropdown\n // multiple luôn phát ra mảng, còn dữ liệu hàng thường là scalar; trước đây nhánh lại chọn theo\n // array-ness của DỮ LIỆU HÀNG nên scalar row rơi xuống so sánh `===` với `['A','B'].toString()`\n // = 'a,b' và không bao giờ khớp (chọn 1 giá trị thì vô tình đúng, chọn từ 2 là mất hết dòng).\n const rawFilterValue = rawColumnFilter[field];\n const filterValues: string[] = (Array.isArray(rawFilterValue) ? rawFilterValue : [rawFilterValue])\n .map((v: any) => (v ?? '').toString().trim().toLowerCase())\n .filter(v => !!v);\n const columnValues: string[] = Array.isArray(rawColVal)\n ? rawColVal.map((i: any) => (Utilities.getNestedValue(i, columnType.option.valueField) ?? '').toString().trim().toLowerCase())\n : [columnValue];\n // why: nhiều giá trị = OR, khớp đúng operator `IN` mà SdConvertToPagingReq gửi cho server.\n if (filterValues.length && !filterValues.some(fv => columnValues.includes(fv))) {\n return false;\n }\n } else if (type === 'number') {\n const fValue = +filterValue.replace('>=', '').replace('<=', '').replace('>', '').replace('<', '');\n const cValue = +columnValue;\n if (fValue || fValue === 0) {\n if (!cValue && cValue !== 0) {\n return false;\n }\n if (filterValue.indexOf('>=') > -1 && cValue < fValue) {\n return false;\n } else if (filterValue.indexOf('<=') > -1 && cValue > fValue) {\n return false;\n } else if (filterValue.indexOf('<') > -1 && cValue >= fValue) {\n return false;\n } else if (filterValue.indexOf('>') > -1 && cValue <= fValue) {\n return false;\n } else if (cValue !== fValue) {\n return false;\n }\n }\n } else if (type === 'boolean') {\n if ((filterValue === '1' || filterValue === 'true') && columnValue !== '1' && columnValue !== 'true') {\n return false;\n } else if ((filterValue === '0' || filterValue === 'false') && columnValue !== '0' && columnValue !== 'false') {\n return false;\n }\n } else if (type === 'datetime' || type === 'date' || type === 'time') {\n const from = rawColumnFilter[field]?.from ?? rawColumnFilter[field];\n const to = rawColumnFilter[field]?.to ?? rawColumnFilter[field];\n const fromDate = DateUtilities.begin(from);\n const toDate = DateUtilities.end(to);\n if (fromDate || toDate) {\n if (!columnValue) {\n return false;\n }\n\n const columnTime = new Date(columnValue).getTime();\n const fromDateTime = fromDate?.getTime() || null;\n const toDateTime = toDate?.getTime() || null;\n\n if (fromDateTime && fromDateTime > columnTime) {\n return false;\n }\n if (toDateTime && columnTime > toDateTime) {\n return false;\n }\n }\n }\n }\n }\n return true;\n};\n\nexport const filterLocalItems = <T, TItem extends LocalFilterItem<T>>(\n localItems: TItem[],\n option: FilterLocalItemsOption<T>,\n filterInfo: SdTableFilterRequest<T>\n): FilterLocalItemsResult<T, TItem> => {\n const { columns } = option;\n const { rawColumnFilter, orderBy, orderDirection, pageSize, pageNumber } = filterInfo;\n const matchesData = (data: T) => matchesColumnFilter(data, columns, rawColumnFilter);\n const treeOpt = option.tree;\n const treeSearch = option.type === 'local' && treeOpt?.loadType === 'static' && hasActiveColumnFilter(rawColumnFilter, columns);\n const treeSearchPredicate = treeSearch ? matchesData : undefined;\n\n const items = treeSearch\n ? localItems.filter(item => subtreeMatches(resolveItemData<T>(item), matchesData, treeOpt))\n : localItems.filter(item => matchesData(resolveItemData<T>(item)));\n\n if (orderBy && orderDirection) {\n const column = columns.find(e => e.field === orderBy);\n if (column) {\n const { type, field } = column;\n items.sort((tableItemCurrent, tableItemNext) => {\n const dataVal = Utilities.getNestedValue(resolveItemData<T>(tableItemCurrent), field);\n const nextVal = Utilities.getNestedValue(resolveItemData<T>(tableItemNext), field);\n\n if (type === 'number') {\n return (dataVal || 0) - (nextVal || 0);\n }\n if (type === 'date' || type === 'datetime' || type === 'time') {\n const d1 = new Date(dataVal || '').getTime();\n const d2 = new Date(nextVal || '').getTime();\n return d1 - d2;\n }\n const s1 = (dataVal || '').toString();\n const s2 = (nextVal || '').toString();\n if (s1 > s2) {\n return 1;\n }\n if (s1 < s2) {\n return -1;\n }\n return 0;\n });\n if (orderDirection === 'DESC') {\n items.reverse();\n }\n }\n }\n\n return {\n items: items.filter((item, index) => index >= pageNumber * pageSize && index < (pageNumber + 1) * pageSize),\n total: items.length,\n treeSearchPredicate,\n };\n};\n","import { SdTableItem } from '../../models/table-item.model';\n\nexport interface TableReorderOption<T> {\n disabled?: (row: T, index: number) => boolean;\n}\n\nexport interface CanSortReorderArgs<T> {\n enabled?: boolean;\n index: number;\n dragItem: SdTableItem<T>;\n allItems?: SdTableItem<T>[];\n hasGroup?: boolean;\n}\n\nexport interface ReorderTableItemsArgs<T> {\n items: SdTableItem<T>[];\n renderedItems: SdTableItem<T>[];\n previousRenderedIndex: number;\n currentRenderedIndex: number;\n localItems?: SdTableItem<T>[];\n}\n\nexport interface ReorderTableItemsResult<T> {\n items: SdTableItem<T>[];\n localItems?: SdTableItem<T>[];\n fromIndex: number;\n toIndex: number;\n}\n\nconst isGroupHeader = <T>(item?: SdTableItem<T>): boolean => !!item?.meta?.group?.items?.length;\nconst isChildRow = <T>(item?: SdTableItem<T>): boolean => (item?.meta.tree?.level ?? 0) > 0;\nconst isRootReorderRow = <T>(item?: SdTableItem<T>): boolean => !!item && !isGroupHeader(item) && !isChildRow(item);\n\nconst moveItem = <T>(items: T[], fromIndex: number, toIndex: number): T[] => {\n const next = [...items];\n const [moved] = next.splice(fromIndex, 1);\n if (!moved) return next;\n next.splice(toIndex, 0, moved);\n return next;\n};\n\nexport const isReorderDisabled = <T>(item: SdTableItem<T>, option?: TableReorderOption<T>, index = -1): boolean => {\n if (isChildRow(item)) return true;\n if (!option?.disabled || isGroupHeader(item)) return false;\n return option.disabled(item.data, index);\n};\n\nexport const sameReorderGroup = <T>(a: SdTableItem<T>, b: SdTableItem<T>, allItems: SdTableItem<T>[]): boolean => {\n const groupOf = (item: SdTableItem<T>): number => {\n let lastGroupIdx = -1;\n for (let i = 0; i < allItems.length; i++) {\n if (isGroupHeader(allItems[i])) lastGroupIdx = i;\n if (allItems[i] === item) return lastGroupIdx;\n }\n return -1;\n };\n return groupOf(a) === groupOf(b);\n};\n\nexport const canSortReorder = <T>({ enabled, index, dragItem, allItems = [], hasGroup }: CanSortReorderArgs<T>): boolean => {\n if (!enabled) return false;\n const targetItem = allItems[index];\n if (!isRootReorderRow(targetItem)) return false;\n if (isChildRow(dragItem)) return false;\n if (hasGroup) {\n return sameReorderGroup(dragItem, targetItem, allItems);\n }\n return true;\n};\n\nexport const toReorderItemsIndex = <T>(renderedItems: SdTableItem<T>[], renderedIndex: number): number => {\n let count = 0;\n for (let i = 0; i < renderedIndex; i++) {\n if (isRootReorderRow(renderedItems[i])) count++;\n }\n return count;\n};\n\nexport const reorderTableItems = <T>({\n items,\n renderedItems,\n previousRenderedIndex,\n currentRenderedIndex,\n localItems,\n}: ReorderTableItemsArgs<T>): ReorderTableItemsResult<T> => {\n const fromIndex = toReorderItemsIndex(renderedItems, previousRenderedIndex);\n const toIndex = toReorderItemsIndex(renderedItems, currentRenderedIndex);\n const nextItems = moveItem(items, fromIndex, toIndex);\n let nextLocalItems = localItems;\n\n if (localItems) {\n const localPositions = items.map(item => localItems.indexOf(item));\n if (localPositions.every(p => p >= 0)) {\n nextLocalItems = [...localItems];\n nextItems.forEach((item, i) => {\n nextLocalItems![localPositions[i]] = item;\n });\n }\n }\n\n return {\n items: nextItems,\n localItems: nextLocalItems,\n fromIndex,\n toIndex,\n };\n};\n","import { DestroyRef, Injectable, inject } from '@angular/core';\n// import hash from 'object-hash';\nimport { SdStorageService, SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { Operator } from '@sdcorejs/utils/models';\nimport { map, startWith } from 'rxjs/operators';\nimport { SdTableFilterDefDirective } from '../../directives/sd-table-filter-def.directive';\nimport { SdTableColumnAnyRow } from '../../models/table-column.model';\nimport {\n SdTableExternalFilter,\n SdTableOptionFilter,\n TableFilterConfiguration,\n TableFilterRegister,\n TableFilterValue,\n} from './table-filter.model';\n\n@Injectable()\nexport class SdTableFilterService {\n private storageService = inject(SdStorageService);\n readonly #destroyRef = inject(DestroyRef);\n\n #filterConfiguration = 'GRID-FILTER-CONFIGURATION';\n #filterValue = 'GRID-FILTER-VALUE';\n #cache: Record<string, TableFilterRegister> = {};\n readonly #storageHandles = new Map<\n string,\n {\n configuration: SdStorageWithDefault<TableFilterConfiguration>;\n value: SdStorageWithDefault<TableFilterValue>;\n }\n >();\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n constructor() {\n this.#destroyRef.onDestroy(() => {\n for (const key of [...this.#storageHandles.keys()]) this.#destroyStorageHandles(key);\n });\n }\n\n #hasOwnValue = (values: Record<string, unknown> | undefined, field: string): boolean => {\n return !!values && Object.prototype.hasOwnProperty.call(values, field);\n };\n\n #resolveKey = (\n filter: SdTableOptionFilter | undefined,\n args: {\n id: string;\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n }\n ) => {\n const { id, columns, externalFilters } = args;\n const tempKey = Utilities.hash({\n id,\n columns: columns?.map(e => e.field).filter(field => !!field) || [],\n externalFilters: externalFilters?.map(e => e.field).filter(field => !!field) || [],\n });\n return {\n tempKey,\n key: filter?.key || tempKey,\n cacheSession: !filter?.key,\n };\n };\n\n // why: `columns` khai báo `SdTableColumnAnyRow[]` (= `SdTableColumn<never>[]`) chứ không phải\n // `SdTableColumn[]`. Service filter chỉ đọc `field`/`type`/`filter` trên cột, không bao giờ chạm dữ\n // liệu hàng; sau khi default generic siết `any → unknown` thì `SdTableColumn<T>` hết tự khớp với\n // `SdTableColumn<unknown>` (T ở vị trí contravariant), nên đây là kiểu đúng thay vì quay lại `any`.\n register = (\n filter: SdTableOptionFilter | undefined,\n args: {\n id: string;\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n columnOperator?: Record<string, Operator>;\n force?: boolean;\n }\n ) => {\n const { key, tempKey, cacheSession } = this.#resolveKey(filter, args);\n if (args.force) {\n this.#destroyStorageHandles(key);\n delete this.#cache[key];\n }\n if (!this.#cache[key]) {\n // Setting của filter configuration\n const filterConfiguration = this.storageService.create<TableFilterConfiguration>(\n {\n prefix: this.#filterConfiguration,\n key,\n },\n {\n default: this.#defaultConfiguration(args),\n type: cacheSession ? 'session' : undefined,\n }\n );\n let filterValue: SdStorageWithDefault<TableFilterValue> | undefined;\n try {\n // Lấy giá trị configuration merge với giá trị defaultShowing của args nếu như args có thay đổi\n filterConfiguration.set(this.#initConfiguration(args, filterConfiguration.get()));\n // Setting của filter value\n filterValue = this.storageService.create<TableFilterValue>(\n {\n prefix: this.#filterValue,\n key: !filter?.cacheable ? tempKey : key,\n },\n {\n default: this.#defaultValue(args),\n type: cacheSession || !filter?.cacheable ? 'session' : undefined,\n }\n );\n // Lấy giá trị value merge với giá trị default của args nếu như args có thay đổi\n filterValue.set(this.#initValue(args, filterValue.get()));\n } catch (error: unknown) {\n filterValue?.destroy();\n filterConfiguration.destroy();\n throw error;\n }\n const activeFilterValue = filterValue;\n this.#storageHandles.set(key, { configuration: filterConfiguration, value: activeFilterValue });\n this.#cache[key] = {\n configuration: {\n get: (): TableFilterConfiguration => {\n return filterConfiguration.get();\n },\n set: (configuration: Partial<TableFilterConfiguration>): TableFilterConfiguration => {\n const { inlineExternal } = configuration;\n filterConfiguration.set({\n inlineExternal: inlineExternal!,\n });\n return {\n inlineExternal: inlineExternal!,\n };\n },\n remove: () => {\n filterConfiguration.set(this.#defaultConfiguration(args));\n },\n observer: filterConfiguration.observer.pipe(\n startWith(filterConfiguration.get()),\n // Sử dụng mặc định nếu bị reset\n map(configuration => configuration || this.#defaultConfiguration(args))\n ),\n },\n value: {\n get: (): TableFilterValue => {\n return activeFilterValue.get();\n },\n set: (value: Partial<TableFilterValue>): TableFilterValue => {\n const keys = Object.keys(value || {});\n const current = activeFilterValue.get();\n const { columnOperator, columnFilter, externalFilter } = current;\n const updatedFilter = {\n // Filter column\n columnOperator: keys.includes('columnOperator') ? value?.columnOperator || {} : columnOperator,\n columnFilter: keys.includes('columnFilter') ? value?.columnFilter || {} : columnFilter,\n // Filter external\n externalFilter: keys.includes('externalFilter') ? value?.externalFilter || {} : externalFilter,\n // Force\n notReload: !!value?.notReload,\n };\n activeFilterValue.set({\n ...updatedFilter,\n // Kiểm tra có đang lọc hay không\n filtered: this.#filtered(value),\n });\n return updatedFilter;\n },\n remove: () => {\n activeFilterValue.set(this.#defaultValue(args));\n },\n observer: activeFilterValue.observer.pipe(\n startWith(activeFilterValue.get()),\n // Sử dụng mặc định nếu bị reset\n map(value => value || this.#defaultValue(args))\n ),\n },\n };\n }\n return this.#cache[key];\n };\n\n #destroyStorageHandles = (key: string): void => {\n const handles = this.#storageHandles.get(key);\n if (!handles) return;\n this.#storageHandles.delete(key);\n handles.configuration.destroy();\n handles.value.destroy();\n };\n\n #filtered = (filterReq: Partial<TableFilterValue>): boolean => {\n const { columnFilter, externalFilter } = filterReq;\n if (\n Object.values({ ...columnFilter, ...externalFilter }).some(val => {\n // Nếu là mảng và mảng có phần tử thì xem như là có filter\n if (Array.isArray(val)) {\n return !!val.length;\n }\n // Nếu là object (date) và có from/to thì xem như là có filter\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n return false;\n };\n\n #defaultConfiguration = (args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n }): TableFilterConfiguration => {\n const { externalFilters } = args;\n const inlineExternal: Record<string, boolean> = {};\n // Filter external\n for (const item of externalFilters || []) {\n inlineExternal[item.field] = !!item?.defaultShowing;\n }\n return {\n // Filter external\n inlineExternal,\n };\n };\n\n #defaultValue = (args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n columnOperator?: Record<string, Operator>;\n }): TableFilterValue => {\n const columnFilter: Record<string, unknown> = {};\n const externalFilter: Record<string, unknown> = {};\n const columnOperator: Record<string, Operator> = args.columnOperator || {};\n const { columns, externalFilters } = args;\n // Filter column\n for (const item of columns || []) {\n columnFilter[item.field] = item?.filter?.default;\n if (item?.filter?.operator?.enable && item?.filter?.operator?.default) {\n columnOperator[item.field] = item.filter.operator.default;\n }\n }\n // Filter external\n for (const item of externalFilters || []) {\n if (item.type === 'daterange') {\n externalFilter[item.field] = {\n from: item.default?.from,\n to: item.default?.to,\n };\n } else {\n externalFilter[item.field] = item?.default;\n }\n // externalFilter[item.field] = item?.default;\n }\n return {\n // Filter column\n columnFilter,\n // Filter external\n externalFilter,\n // columnOperator\n columnOperator,\n };\n };\n\n #initConfiguration = (\n args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n },\n configuration: TableFilterConfiguration\n ): TableFilterConfiguration => {\n const { externalFilters } = args;\n const inlineExternal: Record<string, boolean> = {};\n // Filter external\n for (const item of externalFilters || []) {\n inlineExternal[item.field] = configuration?.inlineExternal?.[item.field] ?? item?.defaultShowing;\n }\n return {\n // Filter external\n inlineExternal,\n };\n };\n\n #initValue = (\n args: {\n columns: SdTableColumnAnyRow[] | undefined;\n externalFilters: SdTableExternalFilter[] | undefined;\n filterDefs: SdTableFilterDefDirective[] | undefined;\n columnOperator?: Record<string, Operator>;\n },\n value: TableFilterValue\n ): TableFilterValue => {\n const columnFilter: Record<string, unknown> = {};\n const externalFilter: Record<string, unknown> = {};\n const columnOperator: Record<string, Operator> = args.columnOperator || {};\n const { columns, externalFilters } = args;\n // Filter column\n for (const item of columns || []) {\n // why: null is a deliberate cached clear from SD controls; only a missing key should fall back to default.\n columnFilter[item.field] = this.#hasOwnValue(value?.columnFilter, item.field)\n ? value?.columnFilter?.[item.field]\n : item?.filter?.default;\n if (item?.filter?.operator?.enable && item?.filter?.operator?.default) {\n columnOperator[item.field] = item.filter.operator.default;\n }\n }\n // Filter external\n for (const item of externalFilters || []) {\n const hasExternalValue = this.#hasOwnValue(value?.externalFilter, item.field);\n if (item.type === 'daterange') {\n externalFilter[item.field] = {\n from: hasExternalValue ? value?.externalFilter?.[item.field]?.from : item.default?.from,\n to: hasExternalValue ? value?.externalFilter?.[item.field]?.to : item.default?.to,\n };\n } else {\n externalFilter[item.field] = hasExternalValue ? value?.externalFilter?.[item.field] : item?.default;\n }\n }\n return {\n // Filter column\n columnFilter,\n // Filter external\n externalFilter,\n // columnOperator\n columnOperator,\n };\n };\n}\n","import { animate, state, style, transition, trigger } from '@angular/animations';\nimport {\n AfterViewInit,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n Injectable,\n OnDestroy,\n computed,\n contentChild,\n contentChildren,\n effect,\n inject,\n input,\n signal,\n untracked,\n viewChild,\n} from '@angular/core';\nimport { MatPaginator, MatPaginatorIntl, MatPaginatorModule } from '@angular/material/paginator';\nimport { MatSort, MatSortModule } from '@angular/material/sort';\nimport { MatTable, MatTableModule } from '@angular/material/table';\nimport { SdExcelColumn, SdNotifyService } from '@sdcorejs/angular/services';\nimport { Subject, Subscription, firstValueFrom, isObservable } from 'rxjs';\nimport { debounceTime, map, startWith, switchMap } from 'rxjs/operators';\nimport { SdTableCellDefDirective } from './directives/sd-table-cell-def.directive';\nimport { SdTableExpandDefDirective } from './directives/sd-table-expand-def.directive';\nimport { SdTableGroupDefDirective, SdTableGroupDefContext } from './directives/sd-table-group-def.directive';\nimport { SdTableFilterDefDirective } from './directives/sd-table-filter-def.directive';\nimport { SdMaterialFooterDefDirective } from './directives/sd-table-footer-def.directive';\nimport { SdTableTitleDefDirective } from './directives/sd-table-title-def.directive';\nimport { SdTableCommandHeaderDefDirective } from './directives/sd-table-command-header-def.directive';\nimport { SdTableColumn } from './models/table-column.model';\nimport { SdTableCommand } from './models/table-command.model';\nimport { SdTableOption } from './models/table-option.model';\nimport {\n SdConvertToPagingReq,\n SdTableFilterRequest,\n TableFilterRegister,\n TableFilterValue,\n} from './services/table-filter/table-filter.model';\n\nimport { CdkColumnDef } from '@angular/cdk/table';\nimport { CdkDrag, CdkDragDrop, CdkDropList, DragDropModule } from '@angular/cdk/drag-drop';\nimport { CommonModule, DatePipe, DecimalPipe } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { MatCheckboxModule } from '@angular/material/checkbox';\nimport { MatRadioModule } from '@angular/material/radio';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\nimport { SdButton } from '@sdcorejs/angular/components/button';\nimport { SdQuickAction } from '@sdcorejs/angular/components/quick-action';\nimport { SdDesktopDirective, SdHoverCopyDirective, SdMobileDirective, SdScrollDirective } from '@sdcorejs/angular/directives';\nimport { SdSafeHtmlPipe } from '@sdcorejs/angular/pipes';\n\nimport { Operator } from '@sdcorejs/utils/models';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { ArrayUtilities, NumberUtilities } from '@sdcorejs/utils/fns';\n\nimport { ColumnFilterComponent, ColumnTitleComponent, ExternalFilterComponent, MobileFilterComponent } from './components';\nimport { ConfigComponent } from './components/config/config.component';\nimport { DesktopCellComponent } from './components/desktop-cell/desktop-cell.component';\nimport { DesktopCommand } from './components/command/desktop-command.component';\nimport { SdPopupExport } from './components/popup-export/popup-export.component';\nimport { SelectorActionComponent } from './components/selector-action/selector-action.component';\nimport { DEFAULT_TABLE_CONFIG, ISdTableConfiguration, SD_TABLE_CONFIGURATION } from './configurations';\nimport { SdColumnResizeDirective, StickyShadowDirective } from './directives';\nimport { SdTableItem } from './models/table-item.model';\nimport { ConfiguredTableResult } from './models/table-option-config.model';\nimport { SdGroupPipe } from './pipes/sd-group.pipe';\nimport { SdTreePipe } from './pipes/sd-tree.pipe';\nimport { SdSelectionDisabledPipe } from './pipes/selection-disabled.pipe';\nimport { SdSelectionVisiblePipe } from './pipes/selection-visible.pipe';\nimport { SdTableExportContext, TableExportService, TableFormatService } from './services';\nimport { ConfigService } from './services/config.service';\nimport { buildColumnWidthMap } from './services/column-width.util';\nimport { filterLocalItems } from './services/table-local/table-local.util';\nimport { canSortReorder, isReorderDisabled as isReorderItemDisabled, reorderTableItems } from './services/table-reorder/table-reorder.util';\nimport {\n applyDefaultSelected,\n buildGroupHeaderContext,\n getSelectedRowData,\n getSelectionRows,\n resolveSelectAllState,\n restorePreservedSelection,\n SdGroupHeaderHost,\n syncGroupSelectionMeta,\n syncPreservedSelection,\n} from './services/table-selection/table-selection.util';\nimport { resolveSelectAllVisible } from './services/table-selection/selection-action.util';\nimport { SdTableFilterService } from './services/table-filter/table-filter.service';\nimport {\n clearTreeChildCache,\n collectFormattedTreeRows,\n flattenDataTree,\n getChildrenFromData,\n getChildrenKey,\n getVisibleChildrenData,\n hasLazyChildren,\n initTreeMeta,\n isLazyTree,\n resolveHasChildren,\n saveTreeExpandState,\n} from './services/tree/tree.util';\nimport { I18nService, SdTranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n// why: tên cũ `MatPaginatorIntlCro` là vết copy-paste từ ví dụ locale Croatia — lớp này chỉ phục vụ\n// nhãn phân trang của `<sd-table>` (VI/EN), không liên quan gì tới tiếng Croatia. Tên cũ lại còn\n// mang tiền tố `Mat`, dễ bị hiểu nhầm là API của Angular Material thay vì export public của lib này.\n@Injectable()\nexport class SdTablePaginatorIntl extends MatPaginatorIntl {\n // i18n labels resolved at construction. Reads VI/EN from I18nService.\n readonly #i18n = inject(I18nService);\n override firstPageLabel = this.#i18n.t('core.component.table.paginator.first-page');\n override lastPageLabel = this.#i18n.t('core.component.table.paginator.last-page');\n override itemsPerPageLabel = this.#i18n.t('core.component.table.paginator.items-per-page');\n override nextPageLabel = this.#i18n.t('core.component.table.paginator.next-page');\n override previousPageLabel = this.#i18n.t('core.component.table.paginator.previous-page');\n\n override getRangeLabel = (page: number, pageSize: number, length: number) => {\n if (length === 0 || pageSize === 0) {\n return '';\n }\n const from = page * pageSize + 1;\n const to = from + (length - page * pageSize > pageSize ? pageSize : length - page * pageSize) - 1;\n return `${from}-${to}/${NumberUtilities.toISO(length)}`;\n };\n}\n\n/** Mảng rỗng dùng chung — tránh cấp phát `[]` mới trong binding mỗi CD pass. */\nconst EMPTY_COMMANDS: SdTableCommand[] = [];\n\n@Component({\n selector: 'sd-table',\n templateUrl: './table.component.html',\n styleUrls: ['./table.component.scss', 'table-sticky-shadow.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n animations: [\n trigger('detailExpand', [\n state('collapsed', style({ height: '0', minHeight: '0', visibility: 'hidden' })),\n state('expanded', style({ height: '*', visibility: 'visible' })),\n transition('expanded <=> collapsed', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')),\n ]),\n ],\n host: {\n '[attr.data-autoid]': 'autoId()',\n '[attr.data-loading]': 'loading() ? \"true\" : \"false\"',\n },\n providers: [\n DatePipe,\n DecimalPipe,\n CdkColumnDef,\n SdTableFilterService,\n TableFormatService,\n TableExportService,\n ConfigService,\n {\n provide: MatPaginatorIntl,\n useClass: SdTablePaginatorIntl,\n },\n ],\n imports: [\n SdIcon,\n CommonModule,\n FormsModule,\n MatMenuModule,\n MatPaginatorModule,\n MatTableModule,\n MatSortModule,\n MatProgressSpinnerModule,\n MatCheckboxModule,\n MatRadioModule,\n DragDropModule,\n SdButton,\n DesktopCommand,\n DesktopCellComponent,\n ColumnTitleComponent,\n ExternalFilterComponent,\n ConfigComponent,\n ColumnFilterComponent,\n MobileFilterComponent,\n SdGroupPipe,\n SdTreePipe,\n SdSelectionVisiblePipe,\n SdSafeHtmlPipe,\n SdSelectionDisabledPipe,\n SdScrollDirective,\n SdDesktopDirective,\n SdMobileDirective,\n SdHoverCopyDirective,\n SelectorActionComponent,\n StickyShadowDirective,\n SdColumnResizeDirective,\n SdTranslatePipe,\n ],\n})\nexport class SdTable<T = unknown> implements AfterViewInit, OnDestroy {\n // ... (Giữ nguyên toàn bộ phần khai báo biến, constructor, lifecycle hooks và các hàm filter, load, export, v.v...)\n // ==========================================\n // 1. SIGNAL INPUTS\n // ==========================================\n autoIdInput = input<string | undefined | null>(undefined, { alias: 'autoId' });\n autoId = computed(() => (this.autoIdInput() ? `components-table-${this.autoIdInput()}` : undefined));\n option = input.required<SdTableOption<T>>();\n\n // ==========================================\n // 2. SIGNAL QUERIES\n // ==========================================\n table = viewChild(MatTable);\n configComponent = viewChild(ConfigComponent);\n sdPopupExport = viewChild(SdPopupExport);\n scroll = viewChild(SdScrollDirective);\n quickAction = viewChild(SdQuickAction);\n externalFilter = viewChild(ExternalFilterComponent);\n mobileFilter = viewChild(MobileFilterComponent);\n paginator = viewChild(MatPaginator);\n sort = viewChild(MatSort);\n\n sdSubInformation = contentChild(SdTableExpandDefDirective);\n sdGroupDef = contentChild(SdTableGroupDefDirective);\n sdCellDefs = contentChildren(SdTableCellDefDirective);\n /** Nội dung tuỳ chọn cho ô header của cột command (mặc định ô này để trống). */\n sdCommandHeaderDef = contentChild(SdTableCommandHeaderDefDirective);\n sdFooterDefs = contentChildren(SdMaterialFooterDefDirective);\n sdFilterDefs = contentChildren(SdTableFilterDefDirective);\n sdTitleDefs = contentChildren(SdTableTitleDefDirective);\n\n // ==========================================\n // 3. COMPUTED FROM QUERIES\n // ==========================================\n cellDef = computed(() => {\n const map: Record<string, SdTableCellDefDirective> = {};\n for (const def of this.sdCellDefs()) {\n const field = def.sdTableCellDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n footerDef = computed(() => {\n const map: Record<string, SdMaterialFooterDefDirective> = {};\n for (const def of this.sdFooterDefs()) {\n const field = def.sdTableFooterDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n hasFooter = computed(() => Object.keys(this.footerDef()).length > 0);\n\n titleDef = computed(() => {\n const map: Record<string, SdTableTitleDefDirective> = {};\n for (const def of this.sdTitleDefs()) {\n const field = def.sdTableTitleDef();\n if (field) map[field] = def;\n }\n return map;\n });\n\n // ==========================================\n // 4. SIGNAL STATE\n // ==========================================\n tableOption = signal<SdTableOption<T> | undefined>(undefined);\n configuration = signal<ConfiguredTableResult | undefined>(undefined);\n\n items = signal<SdTableItem<T>[]>([]);\n selectedTableItems = signal<SdTableItem<T>[]>([]);\n total = signal<number | undefined>(undefined);\n\n loading = signal(false);\n isSelectAll = signal(false);\n\n /**\n * Checkbox \"chọn tất cả\" ở header có hiển thị không.\n *\n * why: trước đây là `_items | selectionVisibleSelectAll: … | async` — pipe `async`\n * với `await setTimeout(500)` bên trong. Sleep đó CHE một vấn đề thứ tự\n * change-detection: pipe đọc `meta.selector.actions`, mảng chỉ được `SdSelectionVisiblePipe`\n * ghi khi cell BODY render, mà CDK dựng header TRƯỚC body → pass đầu luôn đọc ra rỗng.\n * Hệ quả: checkbox hiện trễ 500ms, và vì `transform` là `async` nên MỖI lần re-eval lại\n * trả một Promise mới + đặt thêm một timer không ai dọn. Computed tự tính từ\n * `items()` + `selector` nên không phụ thuộc pipe nào chạy trước → bỏ hẳn timer.\n */\n visibleSelectAll = computed(() => resolveSelectAllVisible(this.items(), this.tableOption()?.selector));\n\n /**\n * Danh sách command của row, memoize theo option.\n * why: template cũ bind `_tableOption.command?.commands || _tableOption.commands || []`\n * — nhánh `[]` cấp phát mảng MỚI mỗi CD pass và đẩy vào `input()` của `desktop-command`,\n * làm child OnPush bị đánh dấu dirty mỗi pass cho từng dòng.\n */\n rowCommands = computed(() => {\n const opt = this.tableOption();\n return opt?.command?.commands || opt?.commands || EMPTY_COMMANDS;\n });\n\n isFiltered = signal(false);\n requireFiltered = signal(false);\n\n #tableId = Utilities.generateUuid();\n filterRegister!: TableFilterRegister;\n key = Utilities.generateUuid();\n\n columnOperator: Record<string, Operator> = {};\n columnFilter?: NonNullable<TableFilterValue['columnFilter']> = {};\n\n #localItems: SdTableItem<T>[] = [];\n #subscription = new Subscription();\n #configurationSubscription?: Subscription;\n #filterRegisterSubscription?: Subscription;\n #optionInstance?: SdTableOption<T>;\n #optionRevision = 0;\n #reload = new Subject<{ force: boolean; revision: number }>();\n #loadCompleted = false;\n\n cacheValues: Record<string, unknown[]> = {};\n #cacheObjValues: Record<string, Record<string, string>> = {};\n #itemIndexMap = new WeakMap<SdTableItem<T>, number>();\n #treeExpandState = new Map<string, boolean>();\n treeRevision = signal(0);\n // Search ở cấp con (static tree + type 'local'): predicate khớp 1 dòng theo\n // column filter hiện hành. Set ở #filterLocal khi có filter active, đọc lại ở\n // #render/#ensureChildItemsFormatted dùng predicate này để prune + auto-expand các\n // nhánh có node con khớp. undefined = không search → cây render bình thường.\n #treeSearchPredicate?: (data: T) => boolean;\n // Lần render trước có đang ở chế độ search hay không (để xử lý chuyển trạng thái).\n #treeSearchActive = false;\n\n // 1. Private Services\n #ref = inject(ChangeDetectorRef);\n #configService = inject(ConfigService);\n #gridFilterService = inject(SdTableFilterService);\n #notifyService = inject(SdNotifyService);\n readonly #i18n = inject(I18nService);\n #tableFormatService = inject(TableFormatService);\n #tableExportService = inject(TableExportService);\n\n // Expose state signals từ TableExportService cho template binding.\n exporting = this.#tableExportService.exporting;\n exportTitle = this.#tableExportService.exportTitle;\n\n // 2. Public & Optional Token\n tableConfiguration = inject<ISdTableConfiguration>(SD_TABLE_CONFIGURATION, { optional: true });\n\n constructor() {\n effect(() => {\n const option = this.option();\n if (option) {\n untracked(() => {\n if (this.#optionInstance !== option) {\n this.#optionInstance = option;\n this.#resetStateForNewOption();\n }\n const optionRevision = this.#optionRevision;\n const initOpt = this.#initConfiguration({ ...option });\n this.tableOption.set(initOpt);\n this.#loadCompleted = false;\n\n const storage = this.#configService.init(initOpt);\n this.#configurationSubscription?.unsubscribe();\n this.#configurationSubscription = storage.observer.pipe(startWith(storage.subject.getValue())).subscribe(() => {\n if (optionRevision !== this.#optionRevision) return;\n const configurationResult = this.#configService.loadConfigurationResult(initOpt, storage.get());\n const displayColumns = configurationResult.displayedColumns || [];\n this.#ref.detectChanges();\n this.#tableFormatService\n .loadValues(\n initOpt.columns.filter(column => displayColumns.includes(column.field)),\n this.cacheValues,\n this.#cacheObjValues\n )\n .then(() => {\n if (optionRevision !== this.#optionRevision) return;\n this.configuration.set(configurationResult);\n this.#loadFilterRegister();\n if (this.filterRegister) {\n this.#requestReload(true);\n }\n })\n .finally(() => {\n if (optionRevision !== this.#optionRevision) return;\n this.#ref.detectChanges();\n });\n });\n this.#subscription.add(this.#configurationSubscription);\n });\n }\n });\n\n effect(() => {\n const paginator = this.paginator();\n if (paginator) {\n untracked(() => {\n this.#subscription.add(paginator.page.subscribe(() => this.#requestReload(false)));\n });\n }\n });\n\n effect(() => {\n const sort = this.sort();\n if (sort) {\n untracked(() => {\n this.#subscription.add(sort.sortChange.subscribe(() => this.#requestReload(false)));\n });\n }\n });\n\n effect(() => {\n const items = this.items();\n this.#itemIndexMap = new WeakMap();\n items.forEach((item, idx) => this.#itemIndexMap.set(item, idx));\n });\n\n this.#subscription.add(\n this.#configService.widthChange$.subscribe(({ field, width }) => {\n // Update configuration signal local — KHÔNG gọi loadValues/reload\n const conf = this.configuration();\n if (!conf) return;\n const firstColumns = conf.firstColumns.map(c => (c.field === field ? { ...c, width } : c));\n const column = { ...conf.column };\n if (column[field]) {\n column[field] = { ...column[field], width };\n }\n const fixedColumn = { ...conf.fixedColumn };\n if (fixedColumn[field]) {\n fixedColumn[field] = { ...fixedColumn[field], width };\n }\n this.configuration.set({ ...conf, firstColumns, column, fixedColumn });\n })\n );\n }\n\n ngAfterViewInit() {\n this.#subscription.add(\n this.#reload\n .pipe(\n debounceTime(200),\n switchMap(async data => {\n if (data.revision !== this.#optionRevision || !this.filterRegister) return undefined;\n const filterInfo = this.getFilterRequest();\n const result = await this.#load(filterInfo, !this.#loadCompleted || data.force);\n if (data.revision !== this.#optionRevision) return undefined;\n this.#loadCompleted = true;\n return {\n result,\n revision: data.revision,\n };\n })\n )\n .subscribe(loadResult => {\n if (!loadResult || loadResult.revision !== this.#optionRevision) return;\n this.#render(loadResult.result);\n })\n );\n }\n\n ngOnDestroy() {\n this.#subscription.unsubscribe();\n }\n\n // --- GIỮ NGUYÊN TẤT CẢ CÁC HÀM FILTER VÀ EXPORT CŨ CỦA BẠN ---\n #filterExportInfo = (pageNumber: number, pageSize: number): SdTableFilterRequest => {\n const { columnOperator, columnFilter, externalFilter } = this.filterRegister.value.get();\n return {\n columnOperator: columnOperator || {},\n rawColumnFilter: columnFilter || {},\n rawExternalFilter: externalFilter || {},\n orderBy: this.sort()?.active || '',\n orderDirection: this.sort()?.direction === 'asc' ? 'ASC' : this.sort()?.direction === 'desc' ? 'DESC' : undefined,\n pageNumber,\n pageSize,\n isExported: true,\n };\n };\n\n #requestReload = (force: boolean) => {\n this.#reload.next({ force, revision: this.#optionRevision });\n };\n\n #resetStateForNewOption = () => {\n this.#optionRevision += 1;\n this.#configurationSubscription?.unsubscribe();\n this.#configurationSubscription = undefined;\n this.#filterRegisterSubscription?.unsubscribe();\n this.#filterRegisterSubscription = undefined;\n this.filterRegister = undefined!;\n\n this.#tableId = Utilities.generateUuid();\n this.key = Utilities.generateUuid();\n this.#loadCompleted = false;\n\n this.tableOption.set(undefined);\n this.configuration.set(undefined);\n this.items.set([]);\n this.selectedTableItems.set([]);\n this.total.set(undefined);\n this.loading.set(false);\n this.isSelectAll.set(false);\n this.isFiltered.set(false);\n this.requireFiltered.set(false);\n\n this.columnOperator = {};\n this.#syncColumnFilterInPlace({});\n this.#localItems = [];\n this.cacheValues = {};\n this.#cacheObjValues = {};\n this.#itemIndexMap = new WeakMap();\n this.#treeExpandState.clear();\n this.#treeSearchPredicate = undefined;\n this.#treeSearchActive = false;\n this.groupExpandState.clear();\n this.#preservedSelectedMap.clear();\n this.treeRevision.update(n => n + 1);\n\n if (this.paginator()) {\n this.paginator()!.pageIndex = 0;\n }\n const sort = this.sort();\n if (sort) {\n sort.active = '';\n sort.direction = '';\n }\n };\n\n #initConfiguration = (option: SdTableOption): SdTableOption => {\n option.paginate = {\n hidden: option?.paginate?.hidden,\n pageSize: option?.paginate?.pageSize ?? this.tableConfiguration?.paginate?.pageSize ?? DEFAULT_TABLE_CONFIG.paginate?.pageSize,\n pages: option?.paginate?.pages ?? this.tableConfiguration?.paginate?.pages ?? DEFAULT_TABLE_CONFIG.paginate?.pages,\n showFirstLastButtons: option?.paginate?.showFirstLastButtons ?? this.tableConfiguration?.paginate?.showFirstLastButtons ?? false,\n hidePageSize: option?.paginate?.hidePageSize ?? false,\n };\n option.filter = option.filter || {};\n option.filter.hideInlineFilter = option?.filter?.hideInlineFilter ?? this.tableConfiguration?.filter?.hideInlineFilter;\n option.filter.externalFilterPerRow = option?.filter?.externalFilterPerRow ?? this.tableConfiguration?.filter?.externalFilterPerRow;\n option.filter.manualFilter = option?.filter?.manualFilter ?? this.tableConfiguration?.filter?.manualFilter;\n option.filter.hideExternalFilterToolbar =\n option?.filter?.hideExternalFilterToolbar ?? this.tableConfiguration?.filter?.hideExternalFilterToolbar;\n for (const column of option.columns || []) {\n if (column.filter?.operator?.enable) {\n if (!column.filter?.operator?.list?.length) {\n column.filter.operator.list = this.tableConfiguration?.filter?.operator?.list?.[column.type] || [];\n }\n\n const defaultOperator = this.tableConfiguration?.filter?.operator?.default?.[column.type];\n if (defaultOperator) {\n this.columnOperator[column.field] = defaultOperator;\n }\n if (column.filter.operator.default && column.filter.operator.list?.some(el => el === column.filter?.operator?.default)) {\n this.columnOperator[column.field] = column.filter.operator.default;\n }\n }\n }\n return option;\n };\n\n #loadFilterRegister = () => {\n const opt = this.tableOption();\n if (!opt || this.filterRegister) return;\n\n this.filterRegister = this.#gridFilterService.register(opt?.filter, {\n id: this.#tableId,\n columns: opt?.columns,\n externalFilters: opt?.filter?.externalFilters,\n filterDefs: [...this.sdFilterDefs()],\n columnOperator: this.columnOperator,\n force: true,\n });\n\n const { columnOperator, columnFilter } = this.filterRegister.value.get();\n this.columnOperator = columnOperator || {};\n this.#syncColumnFilterInPlace(columnFilter || {});\n\n this.#filterRegisterSubscription?.unsubscribe();\n this.#filterRegisterSubscription = this.filterRegister.value.observer\n .pipe(\n debounceTime(500),\n map(filterValue => {\n const { columnOperator, columnFilter, notReload } = filterValue;\n this.columnOperator = columnOperator || {};\n // Sync IN PLACE — không gán object clone mới. column-filter chia sẻ\n // reference this.columnFilter qua [columnFilter] input; nếu gán clone\n // mới, cf giữ ref cũ (do OnPush + reload async lag) → ghi clear vào\n // object orphan → giá trị cũ persist. Giữ ref ổn định để cf + table\n // luôn trỏ cùng 1 object.\n this.#syncColumnFilterInPlace(columnFilter || {});\n if (!notReload) {\n if (this.paginator()) {\n this.paginator()!.pageIndex = 0;\n }\n this.#requestReload(false);\n }\n })\n )\n .subscribe();\n this.#subscription.add(this.#filterRegisterSubscription);\n };\n\n // Đồng bộ this.columnFilter với `next` mà GIỮ NGUYÊN reference object.\n // column-filter chia sẻ ref này qua [columnFilter] — reassign clone mới sẽ\n // orphan ref cũ (cf vẫn ghi vào đó do CD lag) khiến clear/giá trị stale.\n #syncColumnFilterInPlace = (next: NonNullable<TableFilterValue['columnFilter']>) => {\n const cur = this.columnFilter ?? (this.columnFilter = {});\n if (cur === next) return;\n for (const key of Object.keys(cur)) {\n if (!(key in next)) delete cur[key];\n }\n Object.assign(cur, next);\n };\n\n #filterLocal = <TItem extends SdTableItem<T> | T>(localItems: TItem[], filterInfo: SdTableFilterRequest<T>) => {\n const result = filterLocalItems(localItems, this.tableOption()!, filterInfo);\n this.#treeSearchPredicate = result.treeSearchPredicate;\n return {\n items: result.items,\n total: result.total,\n };\n };\n\n getFilterRequest = (): SdTableFilterRequest => {\n const { columnOperator, columnFilter, externalFilter } = this.filterRegister.value.get();\n return {\n columnOperator: columnOperator || {},\n rawColumnFilter: columnFilter || {},\n rawExternalFilter: externalFilter || {},\n orderBy: this.sort()?.active || '',\n orderDirection: this.sort()?.direction === 'asc' ? 'ASC' : this.sort()?.direction === 'desc' ? 'DESC' : undefined,\n pageNumber: this.paginator()?.pageIndex || 0,\n pageSize: this.paginator()?.pageSize || this.tableOption()?.paginate?.pageSize || 50,\n visibledColumns: ArrayUtilities.union('field', this.configuration()?.firstColumns || [], this.configuration()?.secondColumns || []),\n };\n };\n\n #isFiltered = (filterReq: SdTableFilterRequest) => {\n const { pageNumber, rawColumnFilter, rawExternalFilter } = filterReq;\n if (pageNumber !== 0) {\n return true;\n }\n if (\n Object.values({ ...rawColumnFilter }).some(val => {\n if (Array.isArray(val)) {\n return !!val.length;\n }\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n if (\n Object.values({ ...rawExternalFilter }).some(val => {\n if (Array.isArray(val)) {\n return !!val.length;\n }\n if (val && typeof val === 'object') {\n if ('from' in val && !!val.from) {\n return true;\n }\n if ('to' in val && !!val.to) {\n return true;\n }\n return false;\n }\n return val !== undefined && val !== null && val !== '';\n })\n ) {\n return true;\n }\n return false;\n };\n\n #checkFilter = (filterReq: SdTableFilterRequest) => {\n this.isFiltered.set(this.#isFiltered(filterReq));\n this.requireFiltered.set(!!this.tableOption()?.filter?.externalFilters?.some(e => e.required));\n };\n\n #load = async (\n filterReq: SdTableFilterRequest,\n force = true\n ): Promise<{\n items: SdTableItem<T>[];\n total: number;\n }> => {\n this.loading.set(true);\n this.#ref.detectChanges();\n this.#checkFilter(filterReq);\n\n const opt = this.tableOption()!;\n if (opt.type === 'server') {\n const { items, onFilter } = opt;\n try {\n onFilter?.(filterReq, {\n externalFilterValid: !this.externalFilter()?.form?.invalid,\n });\n } catch (err) {\n console.error(err);\n }\n if (this.externalFilter()?.form?.invalid) {\n this.loading.set(false);\n this.#ref.detectChanges();\n return {\n items: [],\n total: 0,\n };\n }\n const pagingReq = SdConvertToPagingReq(filterReq, {\n columns: opt.columns,\n externalFilters: opt.filter?.externalFilters,\n });\n const data = await items(filterReq, pagingReq).catch(err => {\n console.error(err);\n return {\n items: [] as T[],\n total: 0,\n };\n });\n return {\n items: await this.#tableFormatService\n .format(data?.items, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey)\n .finally(() => {\n this.loading.set(false);\n this.#ref.detectChanges();\n }),\n total: data?.total || 0,\n };\n }\n if (force) {\n const { items } = opt;\n const results = items();\n let data: T[] = [];\n if (results instanceof Promise) {\n data = await results.catch(err => {\n this.#notifyService.warning(this.#i18n.t('core.component.table.error-occurred'));\n console.error(err);\n return [];\n });\n } else {\n data = results;\n }\n if (!Array.isArray(data)) {\n this.#notifyService.warning(this.#i18n.t('core.component.table.not-an-array'));\n data = [];\n }\n this.#localItems = await this.#tableFormatService.format(data, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey);\n }\n this.loading.set(false);\n this.#ref.detectChanges();\n return this.#filterLocal(this.#localItems, filterReq);\n };\n\n #render = async (\n args: { items: SdTableItem<T>[]; total: number },\n scrollTop = true,\n additionArgs?: { fromSource?: 'PAGING' | 'RELOAD' }\n ) => {\n if (scrollTop) {\n this.scroll()?.scrollTop();\n }\n\n const treeOpt = this.tableOption()?.tree;\n const searchNow = !!this.#treeSearchPredicate;\n if (treeOpt) {\n // why: KHÔNG persist trạng thái bung bị ÉP trong lúc search (tránh nhánh\n // tự bung do search bị ghi nhầm thành lựa chọn của user sau khi clear).\n if (!this.#treeSearchActive) {\n saveTreeExpandState(this.items(), this.#treeExpandState);\n }\n // why: search vừa tắt → childItems đang là tập đã prune theo từ khoá cũ;\n // xoá cache để dựng lại đầy đủ children ở chế độ thường.\n if (this.#treeSearchActive && !searchNow) {\n clearTreeChildCache(this.#localItems);\n }\n }\n\n this.items.set(args?.items || []);\n this.total.set(args?.total || 0);\n\n if (treeOpt) {\n initTreeMeta(this.items(), treeOpt, {\n expandState: this.#treeExpandState,\n treeSearchPredicate: this.#treeSearchPredicate,\n });\n await this.#expandDefaultBranches(this.items(), treeOpt);\n this.treeRevision.update(n => n + 1);\n }\n this.#treeSearchActive = searchNow;\n\n // Restore selection từ preservedSelectedMap (chỉ khi preserveSelection bật).\n // Phải chạy TRƯỚC applyDefaultSelected để user-selection ưu tiên hơn default.\n this.#restorePreservedSelection();\n\n // Áp dụng defaultSelected: pre-select các item thỏa predicate\n this.#applyDefaultSelected();\n\n // Resolve style.rowCss 1 lần/row cho lần render này (xem #applyRowStyles).\n this.#applyRowStyles();\n\n await this.tableOption()?.reload?.onReload?.(this.items(), additionArgs);\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n\n setTimeout(() => {\n this.table()?.updateStickyColumnStyles();\n }, 0);\n };\n\n reload = async (force = true, scrollTop = true) => {\n this.externalFilter()?.updateFilter?.();\n // Commit pending column filter value (input/input-number gõ dở chưa enter/blur)\n // vào filterRegister trước khi đọc filter request — tránh storage stale.\n this.filterRegister?.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n notReload: true,\n });\n const data = await this.#load(this.getFilterRequest(), force);\n this.#render(data, scrollTop, { fromSource: 'RELOAD' });\n };\n\n #exportedItems = async (pageNumber = 0, pageSize = 100) => {\n const opt = this.tableOption()!;\n if (opt.export?.type === 'default' && opt.export?.items) {\n let result = opt.export?.items(this.#filterExportInfo(pageNumber, pageSize));\n if (Array.isArray(result)) {\n return result;\n }\n if (isObservable(result)) {\n result = firstValueFrom(result) as typeof result;\n }\n if (isObservable(result)) {\n result = firstValueFrom(result) as typeof result;\n }\n return await result;\n } else {\n const filterReq = this.#filterExportInfo(pageNumber, pageSize);\n if (opt.type === 'server') {\n const pagingReq = SdConvertToPagingReq(filterReq, {\n columns: opt.columns,\n externalFilters: opt.filter?.externalFilters,\n });\n const result = opt.items(filterReq, pagingReq);\n return await result;\n } else {\n let exportedItems: T[] = [];\n if (typeof opt.items === 'function') {\n const results = opt.items();\n if (results instanceof Promise) {\n exportedItems = await results;\n } else {\n exportedItems = results;\n }\n } else {\n exportedItems = opt.items;\n }\n if (opt.tree) {\n exportedItems = flattenDataTree(exportedItems, opt.tree);\n }\n return this.#filterLocal(exportedItems, filterReq);\n }\n }\n };\n\n // Helper tạo Context truyền cho Service\n #createExportContext = (): SdTableExportContext => {\n return {\n option: this.tableOption()!,\n configuration: this.configuration(),\n total: this.total() || 0,\n cacheObjValues: this.#cacheObjValues,\n getFilterInfo: () => this.getFilterRequest(),\n fetchChunk: (pageNumber: number, pageSize: number) => this.#exportedItems(pageNumber, pageSize),\n };\n };\n\n exportExcel = (columns?: SdExcelColumn[]) => {\n this.#tableExportService.exportExcel(this.#createExportContext(), columns);\n };\n\n exportCSV = (columns?: SdExcelColumn[]) => {\n this.#tableExportService.exportCSV(this.#createExportContext(), columns);\n };\n\n exportCustom = () => {\n this.#tableExportService.exportCustom(this.#createExportContext());\n };\n\n #ensureChildItemsFormatted = async (row: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n const treeOpt = opt.tree!;\n const searchActive = !!this.#treeSearchPredicate;\n // Bình thường cache childItems. Khi search, LUÔN dựng lại theo tập đã prune\n // vì tập này phụ thuộc từ khoá (đổi mỗi lần gõ) nên không thể cache.\n if (!searchActive && row.meta.tree?.childItems?.length) return;\n const raw = getVisibleChildrenData(row.data, treeOpt, this.#treeSearchPredicate);\n if (!raw.length) {\n if (searchActive && row.meta.tree) row.meta.tree.childItems = [];\n return;\n }\n const formatted = await this.#tableFormatService.format(raw, opt.columns, this.cacheValues, this.#cacheObjValues, opt.rowKey);\n row.meta.tree!.childItems = formatted;\n initTreeMeta(formatted, treeOpt, {\n level: (row.meta.tree!.level ?? 0) + 1,\n parentId: row.meta.id,\n expandState: this.#treeExpandState,\n treeSearchPredicate: this.#treeSearchPredicate,\n });\n };\n\n #expandDefaultBranches = async (rows: SdTableItem<T>[], option: NonNullable<SdTableOption<T>['tree']>) => {\n const maxDepth = option.maxDepth;\n for (const row of rows) {\n if (!row.meta.tree?.isExpanded || !row.meta.tree.hasChildren) continue;\n const level = row.meta.tree.level ?? 0;\n const depthOk = maxDepth === undefined || level < maxDepth;\n if (!depthOk) continue;\n await this.#ensureChildItemsFormatted(row);\n const children = row.meta.tree.childItems ?? [];\n if (children.length) {\n await this.#expandDefaultBranches(children, option);\n }\n }\n };\n\n onTreeToggle = async (row: SdTableItem<T>) => {\n const treeOpt = this.tableOption()?.tree;\n if (!treeOpt || !row.meta.tree?.hasChildren || row.meta.tree.isExpanding) return;\n\n if (row.meta.tree.isExpanded) {\n row.meta.tree.isExpanded = false;\n this.#treeExpandState.delete(row.meta.id);\n // why: `rowCss` nhận ctx `{ level, hasChildren, isExpanded }`, nên style của row PHẢI được\n // tính lại khi collapse — không chỉ khi expand. Thiếu dòng này thì `meta.rowStyle` giữ mãi\n // style của trạng thái đang mở.\n this.#applyRowStyles();\n this.treeRevision.update(n => n + 1);\n this.#ref.markForCheck();\n return;\n }\n\n try {\n // isLazyTree() narrow treeOpt về TableOptionTreeLazy → truy cập onExpandChildren an toàn.\n if (isLazyTree(treeOpt) && hasLazyChildren(row, treeOpt)) {\n row.meta.tree.isExpanding = true;\n this.#ref.markForCheck();\n const key = getChildrenKey(treeOpt);\n const result = await Promise.resolve(treeOpt.onExpandChildren(row.data));\n (row.data as Record<string, unknown>)[key] = Array.isArray(result) ? result : [];\n row.meta.tree.hasChildren = resolveHasChildren(row, treeOpt);\n }\n await this.#ensureChildItemsFormatted(row);\n if (!row.meta.tree.childItems?.length && getChildrenFromData(row.data, treeOpt).length === 0) {\n row.meta.tree.hasChildren = false;\n return;\n }\n row.meta.tree.isExpanded = true;\n this.#treeExpandState.set(row.meta.id, true);\n const maxDepth = treeOpt.maxDepth;\n const level = row.meta.tree.level ?? 0;\n if (maxDepth === undefined || level + 1 < maxDepth) {\n await this.#expandDefaultBranches(row.meta.tree.childItems ?? [], treeOpt);\n }\n } catch (err) {\n console.error(err);\n this.#notifyService.warning(this.#i18n.t('core.component.table.error-occurred'));\n } finally {\n if (row.meta.tree) {\n row.meta.tree.isExpanding = false;\n }\n // Children mới format + level/isExpanded vừa đổi → refresh cache rowStyle.\n this.#applyRowStyles();\n this.treeRevision.update(n => n + 1);\n this.#ref.markForCheck();\n }\n };\n\n onFilterChange = () => {\n this.externalFilter()?.updateFilter?.();\n this.filterRegister.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n });\n };\n\n // Blur input filter: chỉ commit giá trị vào filterRegister, KHÔNG trigger reload.\n // Reload chỉ chạy khi user enter hoặc bấm nút tải lại.\n onFilterCommit = () => {\n this.filterRegister?.value.set({\n columnOperator: this.columnOperator || {},\n columnFilter: this.columnFilter,\n notReload: true,\n });\n };\n\n onExpand = async (rowData: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n if (opt.expand?.always || rowData.meta.expand?.isExpanding) {\n return;\n }\n if (rowData.meta.expand?.isExpanded) {\n rowData.meta.expand.isExpanded = false;\n return;\n }\n const data = opt.expand?.onExpand?.(rowData.data);\n if (!opt.expand?.multiple) {\n this.items().forEach(item => (item.meta.expand!.isExpanding = item.meta.expand!.isExpanded = false));\n }\n if (data instanceof Promise) {\n rowData.meta.expand!.isExpanding = true;\n data\n .then(res => {\n rowData.meta.expand!.data = res;\n rowData.meta.expand!.isExpanded = true;\n })\n .finally(() => (rowData.meta.expand!.isExpanding = false));\n } else {\n rowData.meta.expand!.data = data;\n rowData.meta.expand!.isExpanded = true;\n }\n };\n\n onSelect = (rowData: SdTableItem<T>) => {\n const opt = this.tableOption()!;\n const selectedData = () => this.#getSelectedRowData();\n if (rowData.meta.group?.items?.length) {\n rowData.meta.group.items.forEach(e => (e.meta.selector!.isSelected = rowData.meta.selector!.isSelected));\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n } else {\n if (opt.selector?.single) {\n this.#getSelectionRows()\n .filter(e => e !== rowData)\n .forEach(e => (e.meta.selector!.isSelected = false));\n // single + preserve: chỉ giữ MỘT item trong map (item vừa chọn nếu isSelected,\n // hoặc empty nếu vừa bỏ chọn). Off-page items có thể đã ở trong map → xoá hết\n // trước khi #updateSelectedItems sync entry mới.\n if (this.#preserveEnabled()) {\n this.#preservedSelectedMap.clear();\n }\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.isSelectAll.set(false);\n this.#updateSelectedItems();\n return;\n }\n opt.selector?.onSelect?.(rowData.data, selectedData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n }\n };\n\n onSelectAll = () => {\n const opt = this.tableOption();\n const isSelected = this.isSelectAll();\n this.#getSelectionRows().forEach(e => {\n if (e.meta.selector!.selectable && (!opt?.selector?.actions?.length || e.meta.selector!.actions?.length)) {\n e.meta.selector!.isSelected = isSelected;\n }\n });\n opt?.selector?.onSelectAll?.(this.#getSelectedRowData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n };\n\n onClearSelection = (items?: SdTableItem<T>[]) => {\n items = items || this.items();\n this.isSelectAll.set(false);\n items?.forEach(e => (e.meta.selector!.isSelected = false));\n // User explicit X — clear toàn bộ preserved map (bao gồm cả off-page items).\n if (this.#preserveEnabled()) {\n this.#preservedSelectedMap.clear();\n }\n this.#updateSelectedItems();\n };\n\n #getSelectionRows = (): SdTableItem<T>[] => {\n return getSelectionRows(this.items(), this.tableOption()?.tree);\n };\n\n #getSelectedRowData = (): T[] => getSelectedRowData(this.#getSelectionRows());\n\n #applyDefaultSelected = () => {\n applyDefaultSelected(this.items(), this.tableOption()?.tree, this.tableOption()?.selector?.defaultSelected);\n };\n\n #syncSelectAllState = () => {\n this.isSelectAll.set(resolveSelectAllState(this.#getSelectionRows()));\n };\n\n // ==========================================\n // GROUP HELPERS — sync selection + expand state cho group header rows\n // ==========================================\n\n /** Children selectable của 1 group header (lọc bỏ children không selectable). */\n #groupSelectableChildren = (header: SdTableItem<T>): SdTableItem<T>[] => {\n const children = header.meta.group?.items || [];\n return children.filter(c => c.meta.selector?.selectable !== false);\n };\n\n /** true nếu MỌI selectable child trong group đều selected. Group rỗng (không child) → false. */\n isGroupAllSelected = (header: SdTableItem<T>): boolean => {\n const sel = this.#groupSelectableChildren(header);\n return sel.length > 0 && sel.every(c => c.meta.selector!.isSelected);\n };\n\n /** true nếu CÓ MỘT VÀI selectable child selected nhưng KHÔNG phải tất cả. */\n isGroupIndeterminate = (header: SdTableItem<T>): boolean => {\n const sel = this.#groupSelectableChildren(header);\n if (sel.length === 0) return false;\n const some = sel.some(c => c.meta.selector!.isSelected);\n const all = sel.every(c => c.meta.selector!.isSelected);\n return some && !all;\n };\n\n /** Toggle select-all cho 1 group: set isSelected cho mọi selectable child, sync state. */\n onSelectGroup = (header: SdTableItem<T>, checked: boolean) => {\n const sel = this.#groupSelectableChildren(header);\n sel.forEach(c => (c.meta.selector!.isSelected = checked));\n const opt = this.tableOption();\n opt?.selector?.onSelectAll?.(this.#getSelectedRowData());\n this.#updateSelectedItems();\n this.#syncSelectAllState();\n };\n\n // Map<groupKey, isExpanded> — table own state, pass vào SdGroupPipe arg 3.\n // why: pipe stateless, persist toggle qua các lần re-eval bằng Map external. Mutate Map\n // KHÔNG tự re-trigger pipe (default pure: true) — gọi items.update để invalidate input.\n groupExpandState = new Map<string, boolean>();\n\n /**\n * Cầu nối tới SdGroupPipe (arg 4) — object DUY NHẤT, tạo một lần.\n * why: pipe sinh group header nhưng component mới là nơi biết selection đổi. Pipe đổ\n * header vào `headers` để `#syncGroupSelectionState` cập nhật `meta.group.isSelected` /\n * `indeterminate`, thay cho việc template gọi `isGroupAllSelected()`/`isGroupIndeterminate()`\n * (duyệt toàn bộ children) ở MỖI CD pass.\n */\n readonly groupHost: SdGroupHeaderHost<T> = {\n headers: [],\n toggleExpand: header => this.toggleGroupExpand(header),\n // why: hướng toggle phải tính LIVE. Đọc `meta.group.isSelected` (cache do pipe ghi lúc\n // dựng header, trước khi `selectable` của children được đặt) làm click đầu tiên sau mỗi\n // lần render toggle ngược chiều.\n toggleSelect: header => this.onSelectGroup(header, !this.isGroupAllSelected(header)),\n };\n\n /**\n * Tính lại selection state cho mọi group header của lần render gần nhất.\n *\n * why: giữ `meta.group.isSelected`/`indeterminate` đúng cho consumer đọc meta trực tiếp.\n * Template và `groupContext()` KHÔNG dựa vào nó (chúng tính live) — vì hàm này chạy trong\n * `#render`, trước khi CD kế tiếp cho `SdGroupPipe` dựng lại `groupHost.headers`, nên nó\n * luôn thao tác trên danh sách header của lần render TRƯỚC (rỗng ở lần render đầu).\n */\n #syncGroupSelectionState = () => {\n for (const header of this.groupHost.headers) {\n syncGroupSelectionMeta(header);\n }\n };\n\n /** Toggle expand/collapse cho 1 group (chỉ ý nghĩa khi option.group.collapsible). */\n toggleGroupExpand = (header: SdTableItem<T>) => {\n if (!header.meta.group?.key) return;\n const key = header.meta.group.key;\n const defaultExpanded = !this.tableOption()?.group?.defaultCollapsed;\n const current = this.groupExpandState.has(key) ? !!this.groupExpandState.get(key) : defaultExpanded;\n this.groupExpandState.set(key, !current);\n header.meta.group.isExpanded = !current;\n // why: trigger pipe re-eval — Map mutation không thay đổi reference items() nên cần update.\n this.items.update(arr => [...arr]);\n };\n\n /**\n * Predicate cho matRowDef.when — phân biệt group header row vs data row.\n * Group header row dùng matRowDef riêng với column list ['sdGroupHeader'] (1 cell duy nhất).\n * Data row dùng displayedColumns nguyên vẹn.\n */\n isGroupHeaderRow = (_idx: number, row: SdTableItem<T>): boolean => row?.meta?.group?.isGroupHeader === true;\n isDataRow = (_idx: number, row: SdTableItem<T>): boolean => row?.meta?.group?.isGroupHeader !== true;\n\n /**\n * Colspan cho cell sdGroupHeader trên group row = displayedColumns.length.\n * Span TOÀN BỘ width data row vì group row chỉ có 1 cell.\n */\n sdGroupColspan = computed(() => this.configuration()?.displayedColumns?.length || 1);\n\n /**\n * Context truyền vào template `sdTableGroupDef`.\n *\n * why: bản cũ dựng object MỚI (kèm `items.map(i => i.data)` mới và 2 lần duyệt children\n * qua `isGroupAllSelected`/`isGroupIndeterminate`) ở MỖI CD pass, cho MỖI group row —\n * `ngTemplateOutlet` thấy context đổi reference nên phải dựng lại embedded view. Giờ\n * context được `SdGroupPipe` precompute và cache trên `meta.group`; ở đây chỉ đọc ra\n * (fallback `??=` cho header không do pipe sinh) nên reference ổn định qua các pass.\n *\n * why: 3 field selection/expand thì phải làm TƯƠI mỗi lần đọc — `SdGroupPipe` dựng context\n * lúc header được sinh ra, thời điểm đó `selector.selectable` của children vẫn còn là mặc\n * định `false` (chỉ `SdSelectionVisiblePipe` ở cell BODY mới đặt đúng, mà CDK dựng header\n * trước body). Cache lại giá trị tính ở thời điểm đó là khoá cứng `isSelected = false`.\n * Mutate TẠI CHỖ để `ngTemplateOutlet` vẫn thấy cùng một reference và không dựng lại view.\n */\n groupContext = (header: SdTableItem<T>): SdTableGroupDefContext<T> => {\n const group = header.meta.group;\n if (!group) return buildGroupHeaderContext(header, this.groupHost);\n const context = (group.context ??= buildGroupHeaderContext(header, this.groupHost));\n context.isSelected = this.isGroupAllSelected(header);\n context.indeterminate = this.isGroupIndeterminate(header);\n context.isExpanded = group.isExpanded ?? true;\n return context;\n };\n\n rowStyle = (row: SdTableItem<T>, index?: number): Record<string, string> | null => {\n const fn = this.tableOption()?.style?.rowCss;\n if (!fn) return null;\n const tree = row.meta?.tree;\n const ctx =\n this.tableOption()?.tree && tree ? { level: tree.level, hasChildren: tree.hasChildren, isExpanded: tree.isExpanded } : undefined;\n return fn(row.data, index, ctx);\n };\n\n /**\n * Resolve `style.rowCss` MỘT LẦN cho mỗi row và cache vào `meta.rowStyle`.\n *\n * why: template cũ bind `[ngStyle]=\"rowStyle(row)\"` — mỗi CD pass là một lần gọi callback\n * của consumer cho TỪNG dòng, và callback trả object MỚI nên `NgStyle` phải chạy\n * KeyValueDiffer trên mọi dòng ở mọi pass. Gọi ở cuối `#render` và sau mỗi lần tree\n * toggle (level / isExpanded / children mới format đều là input của `rowCss`).\n */\n #applyRowStyles = () => {\n const hasRowCss = !!this.tableOption()?.style?.rowCss;\n const roots = this.items();\n const rows = this.tableOption()?.tree ? collectFormattedTreeRows(roots) : roots;\n for (const row of rows) {\n row.meta.rowStyle = hasRowCss ? this.rowStyle(row) : null;\n }\n };\n\n // why: khi preserveSelection bật, giữ map nội bộ id → SdTableItem để selection\n // không mất qua filter / paginate / sort / reload (kể cả server re-fetch tạo refs mới).\n // Map chỉ bị clear khi user gọi onClearSelection (nút X) hoặc bỏ chọn từng item.\n #preservedSelectedMap = new Map<string, SdTableItem<T>>();\n\n #preserveEnabled = () => this.tableOption()?.selector?.preserveSelection === true;\n\n // Restore isSelected cho item visible nào id đã có trong preserved map.\n // Đồng thời update reference trong map sang SdTableItem mới (cần thiết khi server\n // re-fetch tạo refs mới, ta muốn map giữ ref hiện hành để các tham chiếu downstream OK).\n #restorePreservedSelection = () => {\n if (!this.#preserveEnabled()) return;\n restorePreservedSelection(this.#getSelectionRows(), this.#preservedSelectedMap);\n };\n\n #updateSelectedItems = () => {\n const rows = this.#getSelectionRows();\n // Selection vừa đổi → cập nhật checkbox state cache của mọi group header.\n this.#syncGroupSelectionState();\n if (this.#preserveEnabled()) {\n // Sync map theo state visible: add nếu selected, remove nếu deselected.\n // Off-page items giữ nguyên trong map (không bị visit ở đây).\n this.selectedTableItems.set(syncPreservedSelection(rows, this.#preservedSelectedMap));\n } else {\n this.selectedTableItems.set(rows.filter(item => item.meta.selector!.isSelected));\n }\n this.#ref.detectChanges();\n };\n\n clearFilter = () => {\n this.filterRegister.value.remove();\n };\n\n setFilter = (args?: Pick<TableFilterValue, 'columnFilter' | 'externalFilter'>) => {\n const { columnFilter, externalFilter } = args || {};\n if (columnFilter) {\n // Giữ reference ổn định cho column-filter (xem #syncColumnFilterInPlace).\n this.#syncColumnFilterInPlace(columnFilter);\n }\n this.filterRegister.value.set({\n columnFilter,\n externalFilter,\n });\n };\n\n get dataItems(): T[] {\n return this.items().map(item => item.data);\n }\n\n get selectedItems(): T[] {\n return this.selectedTableItems().map(item => item.data);\n }\n\n detectChanges = () => this.#ref.detectChanges();\n\n onColumnResize = (field: string, width: string) => {\n // persistColumnWidth ghi storage (silent) và emit widthChange$,\n // subscriber trong constructor đã update configuration() signal đồng bộ.\n this.#configService.persistColumnWidth(field, width);\n\n const onResize = this.tableOption()?.config?.onResize;\n if (!onResize) return;\n onResize(field, width, buildColumnWidthMap(this.configuration()?.column));\n };\n\n onOperatorChange = (column: SdTableColumn, operator: Operator | undefined) => {\n if (operator == null) return;\n this.tableOption()?.filter?.operatorChange?.(column, operator);\n };\n\n trackBy = (index: number, item: SdTableItem) => {\n return item.meta.id;\n };\n\n // Offset STT theo paging — computed memoize, không tính lại trừ khi paginator đổi.\n // Template chỉ cần đọc pageOffset() rồi cộng `i + 1` (rẻ hơn gọi function).\n pageOffset = computed(() => {\n const p = this.paginator();\n return (p?.pageIndex ?? 0) * (p?.pageSize ?? 0);\n });\n\n isReorderDisabled(item: SdTableItem<T>): boolean {\n const opt = this.tableOption()?.rowReorder;\n const idx = this.#itemIndexMap.get(item) ?? -1;\n return isReorderItemDisabled(item, opt, idx);\n }\n\n reorderSortPredicate = (index: number, drag: CdkDrag<SdTableItem<T>>, drop: CdkDropList<SdTableItem<T>[]>): boolean => {\n const opt = this.tableOption()?.rowReorder;\n return canSortReorder({\n enabled: opt?.enabled,\n index,\n dragItem: drag.data,\n allItems: drop.data,\n hasGroup: !!this.tableOption()?.group,\n });\n };\n\n onReorderDrop(event: CdkDragDrop<SdTableItem<T>[]>): void {\n const { previousIndex, currentIndex } = event;\n if (previousIndex === currentIndex) return;\n const result = reorderTableItems({\n items: this.items(),\n renderedItems: event.container.data,\n previousRenderedIndex: previousIndex,\n currentRenderedIndex: currentIndex,\n localItems: this.tableOption()?.type === 'local' ? this.#localItems : undefined,\n });\n this.items.set(result.items);\n if (this.tableOption()?.type === 'local' && result.localItems) {\n this.#localItems = result.localItems;\n }\n this.table()?.renderRows();\n this.tableOption()?.rowReorder?.onChange?.(\n result.items.map(i => i.data),\n event.item.data.data,\n result.fromIndex,\n result.toIndex\n );\n }\n}\n","@let _configuration = configuration();\n@let _tableOption = tableOption()!;\n@let _loading = loading();\n@let _items = items();\n@let _total = total();\n@let _isFiltered = isFiltered();\n@let _requireFiltered = requireFiltered();\n@let _export = _tableOption?.export;\n@let _exporting = exporting();\n@let _titleDef = titleDef();\n@let _autoId = autoId();\n@let _exportTitle = exportTitle();\n@let _cellDef = cellDef();\n@let _footerDef = footerDef();\n@let _sdSubInformation = sdSubInformation();\n@let _configComponent = configComponent();\n@let _mobileFilter = mobileFilter();\n@let _selectedTableItems = selectedTableItems();\n@let _rowCommands = rowCommands();\n<!-- why: tree không còn cột riêng — khi KHÔNG có cột Index, icon expand nhúng vào\n cột data đầu tiên. Đây là field của cột đó (null nếu có Index hoặc không tree). -->\n@let _treeFirstField = _tableOption?.tree && !_tableOption.index?.enabled ? _configuration?.firstColumns?.[0]?.field : null;\n\n@if (_configuration) {\n @if (!_tableOption.filter?.disabled && !!_tableOption.filter?.externalFilters?.length && filterRegister) {\n <external-filter\n class=\"mb-16\"\n [autoId]=\"_autoId\"\n [filterRegister]=\"filterRegister\"\n [filter]=\"_tableOption.filter!\"\n [externalFilters]=\"_tableOption.filter?.externalFilters!\">\n </external-filter>\n }\n @let groupedItems = _items | sdTree: _tableOption.tree : treeRevision() | sdGroup: _tableOption : groupExpandState : groupHost;\n\n <!-- Tree toggle dùng chung: indent (theo cấp) + slot chevron/spinner. Nhúng vào\n cột Index hoặc cột data đầu qua *ngTemplateOutlet (context: { row }). -->\n <ng-template #sdTreeToggle let-row=\"row\">\n @let _tree = row?.meta?.tree;\n @if (_tree) {\n <span class=\"sd-tree-indent\" [style.width.px]=\"(_tree.level ?? 0) * (_tableOption.tree?.indentSize ?? 20)\"></span>\n <span class=\"sd-tree-toggle-slot\">\n @if (_tree.hasChildren) {\n @if (_tree.isExpanding) {\n <span class=\"lds-ring sd-tree-spinner\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </span>\n } @else {\n @let _aid = _autoId;\n <button\n type=\"button\"\n class=\"sd-tree-toggle-btn\"\n [attr.data-autoid]=\"_aid ? _aid + '-tree-toggle-' + row.meta.id : null\"\n (click)=\"onTreeToggle(row); $event.stopPropagation()\">\n <sd-icon [name]=\"_tree.isExpanded ? 'expand_more' : 'chevron_right'\"></sd-icon>\n </button>\n }\n }\n </span>\n }\n </ng-template>\n\n <ng-content select=\"[sdTableTop]\"></ng-content>\n <div class=\"c-container\">\n <!-- why: bảng tải dữ liệu BẤT ĐỒNG BỘ nhưng trước đây chỉ có spinner thuần hình ảnh — screen\n reader không được báo gì cả. role=\"status\" + aria-live=\"polite\" đọc trạng thái ngay khi\n spinner xuất hiện; aria-busy trên vùng bảng cho biết nội dung đang được thay thế. -->\n @if (_loading) {\n <div class=\"c-loading\" role=\"status\" aria-live=\"polite\" [attr.aria-label]=\"'core.component.table.loading' | sdTranslate\">\n <mat-spinner></mat-spinner>\n </div>\n }\n <div\n class=\"c-table\"\n sdScroll\n stickyShadow\n [attr.aria-busy]=\"_loading ? 'true' : null\"\n [style.max-height]=\"_tableOption.style?.maxHeight\"\n [style.min-height]=\"_tableOption.style?.minHeight\">\n <table\n mat-table\n [dataSource]=\"groupedItems\"\n [trackBy]=\"trackBy\"\n matSort\n [matSortDisabled]=\"!_tableOption.sort?.enable\"\n multiTemplateDataRows\n cdkDropList\n [cdkDropListData]=\"groupedItems\"\n [cdkDropListDisabled]=\"!_tableOption.rowReorder?.enabled\"\n [cdkDropListSortPredicate]=\"reorderSortPredicate\"\n (cdkDropListDropped)=\"onReorderDrop($event)\">\n @if (_tableOption.rowReorder?.enabled) {\n <ng-container matColumnDef=\"sdReorder\">\n <th mat-header-cell *matHeaderCellDef class=\"sd-reorder-header\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td mat-cell *matCellDef=\"let row\" class=\"sd-reorder-cell\">\n @if (!row.meta?.group?.items?.length) {\n <sd-icon cdkDragHandle [class.sd-reorder-disabled]=\"isReorderDisabled(row)\" [name]=\"_tableOption.rowReorder?.icon || 'drag_indicator'\"></sd-icon>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n }\n\n <ng-container matColumnDef=\"sdSubInformation\" sticky>\n <td class=\"p-0\" mat-cell *matCellDef=\"let item\" [attr.colspan]=\"_configuration.displayedColumns.length\">\n @if (_sdSubInformation?.templateRef) {\n @if (_tableOption.expand?.always) {\n <ng-container *ngTemplateOutlet=\"_sdSubInformation?.templateRef!; context: { item: item }\"> </ng-container>\n } @else {\n <div [@detailExpand]=\"item.isExpanded ? 'expanded' : 'collapsed'\">\n @if (item.isExpanded) {\n <ng-container *ngTemplateOutlet=\"_sdSubInformation?.templateRef!; context: { item: item }\"> </ng-container>\n }\n </div>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n\n <ng-container matColumnDef=\"sdSubInformationAction\" stickyEnd>\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 1px\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td mat-cell *matCellDef=\"let element\">\n @if (!element.isExpanding && !_tableOption.expand?.always) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-expand-' + element.meta.id : null\"\n type=\"text\"\n [prefixIcon]=\"element.isExpanded ? 'expand_less' : 'expand_more'\"\n (click)=\"onExpand(element)\"\n width=\"35px\">\n </sd-button>\n }\n @if (element.isExpanding) {\n <div class=\"lds-ring\">\n <div></div>\n <div></div>\n <div></div>\n <div></div>\n </div>\n }\n </td>\n </ng-container>\n\n <ng-container matColumnDef=\"sdSelection\" sticky>\n <th class=\"sd-selection-cell p-0\" mat-header-cell *matHeaderCellDef [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n @if (visibleSelectAll()) {\n <mat-checkbox\n class=\"c-selection px-8\"\n color=\"primary\"\n [ngModel]=\"isSelectAll()\"\n (ngModelChange)=\"isSelectAll.set($event)\"\n (change)=\"onSelectAll()\">\n </mat-checkbox>\n }\n </th>\n\n <td class=\"sd-selection-cell p-0\" mat-cell *matCellDef=\"let item\">\n @let visible = item | selectionVisible: _tableOption.selector;\n @if (visible) {\n @if (_tableOption.selector?.single) {\n <mat-radio-button\n class=\"c-selection px-8\"\n color=\"primary\"\n [checked]=\"item.meta.selector.isSelected\"\n (change)=\"item.meta.selector.isSelected = true; onSelect(item)\"\n [disabled]=\"_selectedTableItems | selectionDisabled: item : _tableOption.selector!\">\n </mat-radio-button>\n } @else {\n <mat-checkbox\n class=\"c-selection px-8\"\n color=\"primary\"\n [(ngModel)]=\"item.meta.selector.isSelected\"\n (change)=\"onSelect(item)\"\n [disabled]=\"_selectedTableItems | selectionDisabled: item : _tableOption.selector!\">\n </mat-checkbox>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n @if (_tableOption.index?.enabled) {\n @let _pageOffset = pageOffset();\n @let _indexWidth = _tableOption.index?.width || '50px';\n <!-- why: khi tree, cột Index \"ôm\" thêm chevron + indent. Dùng width:1px +\n nowrap (.sd-tree-index-cell) để cột co SÁT nội dung, không chiếm chỗ\n thừa; header \"#\" canh trái lùi vào (.sd-tree-index-header) cho thẳng số. -->\n @let _treeIndex = !!_tableOption.tree;\n <ng-container matColumnDef=\"sdIndex\" sticky>\n <th\n [class.p-0]=\"!_treeIndex\"\n [class.text-center]=\"!_treeIndex\"\n [class.sd-tree-index-cell]=\"_treeIndex\"\n [class.sd-tree-index-header]=\"_treeIndex\"\n mat-header-cell\n *matHeaderCellDef\n [style.width]=\"_treeIndex ? '1px' : _indexWidth\"\n [style.min-width]=\"_treeIndex ? null : _indexWidth\"\n [style.max-width]=\"_treeIndex ? null : _indexWidth\"\n [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n {{ _tableOption.index?.title || '#' }}\n </th>\n <td\n [class.px-4]=\"!_treeIndex\"\n [class.text-center]=\"!_treeIndex\"\n [class.sd-tree-index-cell]=\"_treeIndex\"\n mat-cell\n *matCellDef=\"let item; let i = dataIndex\"\n [style.width]=\"_treeIndex ? '1px' : null\"\n [style.min-width]=\"_treeIndex ? null : _indexWidth\"\n [style.max-width]=\"_treeIndex ? null : _indexWidth\">\n @if (!item?.meta?.group?.isGroupHeader) {\n @if (_treeIndex) {\n <!-- why: tree → chevron + indent + STT phân cấp (1, 1.2, 1.2.1). Tô đậm root (level 0). -->\n <span class=\"sd-tree-line\">\n <ng-container *ngTemplateOutlet=\"sdTreeToggle; context: { row: item }\"></ng-container>\n @if (item?.meta?.tree?.indexPath?.length) {\n <span class=\"sd-tree-stt\" [class.sd-stt-root]=\"(item.meta.tree.level ?? 0) === 0\">\n {{ item.meta.tree.indexPath.join('.') }}\n </span>\n }\n </span>\n } @else {\n {{ _pageOffset + i + 1 }}\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef [style.width]=\"_treeIndex ? '1px' : null\" [style.min-width]=\"_treeIndex ? null : _indexWidth\" [style.max-width]=\"_treeIndex ? null : _indexWidth\"></td>\n </ng-container>\n }\n <ng-container\n matColumnDef=\"sdCommand\"\n [sticky]=\"_tableOption.command?.align !== 'right'\"\n [stickyEnd]=\"_tableOption.command?.align === 'right'\">\n <!-- why: ô header của cột command vốn để trống. Cho consumer chiếm chỗ đó bằng\n `sdTableCommandHeaderDef` (thường là nút thêm dòng) thì hành động cấp bảng nằm ngay\n trên cụm nút của từng dòng, thay vì phải dựng thêm một dải riêng dưới bảng. -->\n <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 50px\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\">\n @if (sdCommandHeaderDef(); as _commandHeaderDef) {\n <div class=\"sd-command-header d-flex align-items-center justify-content-center\">\n <ng-container *ngTemplateOutlet=\"_commandHeaderDef.templateRef\"></ng-container>\n </div>\n }\n </th>\n <!-- why: `dataIndex` do CDK cấp sẵn. Bản cũ dùng `groupedItems.indexOf(item)` —\n quét toàn mảng cho MỖI dòng render ở MỖI CD pass (O(n²) trên đường render),\n và còn trả sai index khi 2 dòng trùng reference. -->\n <td class=\"px-8\" mat-cell *matCellDef=\"let item; let i = dataIndex\">\n <desktop-command [autoId]=\"_autoId\" [commands]=\"_rowCommands\" [item]=\"item\" [itemIndex]=\"i\"></desktop-command>\n </td>\n <td mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n <!-- why: group header row dùng matRowDef RIÊNG với column list ['sdGroupHeader']\n qua predicate when:isGroupHeaderRow. Cell colspan = displayedColumns.length để\n span TOÀN BỘ width data row. Tránh colspan trick overflow row khi các TD khác render. -->\n <ng-container matColumnDef=\"sdGroupHeader\">\n <td\n class=\"p-0 sd-group-header-cell\"\n mat-cell\n *matCellDef=\"let item\"\n [attr.colspan]=\"sdGroupColspan()\">\n <div class=\"sd-group-row d-flex align-items-center py-8\">\n <!-- why: slot 42px khớp width với sd-selection-cell data row → checkbox group căn TRỤC dọc đúng với checkbox data. -->\n @if (_tableOption.selector?.visible && !_tableOption.selector?.single) {\n <div class=\"sd-group-selection-slot d-flex align-items-center justify-content-center\">\n <!-- why: PHẢI tính live, KHÔNG đọc cache trên meta.group. `selector.selectable`\n mặc định là `false` (table-item.model.ts) và chỉ được `SdSelectionVisiblePipe`\n đặt đúng khi cell BODY render — mà CDK dựng header TRƯỚC body. Cache do\n `SdGroupPipe` ghi lúc dựng header vì thế luôn thấy `total = 0` và khoá cứng\n checkbox ở trạng thái bỏ chọn, kể cả khi defaultSelected/preserveSelection\n vừa chọn hết. Pipe là pure nên giá trị đó không bao giờ tự sửa.\n Chỉ có MỘT group header mỗi group (không phải mỗi row) nên chi phí duyệt ở\n đây nhỏ; phần đắt (dựng object context + map data) vẫn được cache. -->\n <mat-checkbox\n class=\"c-selection\"\n color=\"primary\"\n [checked]=\"isGroupAllSelected(item)\"\n [indeterminate]=\"isGroupIndeterminate(item)\"\n (change)=\"onSelectGroup(item, $event.checked)\">\n </mat-checkbox>\n </div>\n } @else {\n <div class=\"sd-group-selection-slot\"></div>\n }\n @if (_tableOption.group?.collapsible) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-group-toggle-' + (item.meta.group?.key || item.meta.id) : null\"\n type=\"text\"\n [prefixIcon]=\"item.meta.group.isExpanded ? 'expand_more' : 'chevron_right'\"\n width=\"32px\"\n (click)=\"toggleGroupExpand(item)\">\n </sd-button>\n }\n @if (sdGroupDef()?.templateRef; as tpl) {\n <!-- why: groupContext() giờ trả context đã precompute trên meta.group (cùng\n một reference qua mọi CD pass). Bản cũ dựng object mới + mảng\n `items.map(i => i.data)` mới mỗi pass → ngTemplateOutlet phải dựng lại\n embedded view của mọi group row. -->\n <ng-container *ngTemplateOutlet=\"tpl; context: groupContext(item)\"></ng-container>\n } @else {\n <span class=\"T14R\">{{ item.meta.group.values | json }}</span>\n }\n </div>\n </td>\n </ng-container>\n <!-- why: filler column ở cuối hấp thụ leftover space khi tổng width các cột data < container — giữ cho selection/STT/command không bị dãn. -->\n <ng-container matColumnDef=\"sdFiller\">\n <th class=\"sd-filler-cell p-0\" mat-header-cell *matHeaderCellDef [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n <td class=\"sd-filler-cell p-0\" mat-cell *matCellDef=\"let item\"></td>\n <td class=\"sd-filler-cell p-0\" mat-footer-cell *matFooterCellDef></td>\n </ng-container>\n @for (column of _configuration.firstColumns; track column.field) {\n <ng-container [matColumnDef]=\"column.field\" [sticky]=\"_configuration.fixedColumn[column.field]\">\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"px-8 py-8 c-th\"\n [sdColumnResize]=\"!!_tableOption.config?.resizable && column.type !== 'children'\"\n [minWidth]=\"column.minWidth\"\n [maxWidth]=\"column.maxWidth\"\n (resizeEnd)=\"onColumnResize(column.field, $event)\"\n [style.width]=\"column.width\"\n [style.min-width]=\"column.minWidth || column.width\"\n [style.max-width]=\"column.maxWidth\"\n [attr.rowspan]=\"_configuration.multipleHeader && column.type !== 'children' ? 2 : 1\"\n [attr.colspan]=\"column.type === 'children' ? column.children.length : 1\">\n <div>\n <!-- why: bỏ aria-hidden=\"true\" khỏi header. `mat-sort-header` tự gắn role=\"button\",\n tabindex và aria-sort lên chính div này — aria-hidden khiến header vẫn tab tới\n được nhưng không đọc được tên cột lẫn hướng sắp xếp, tức người dùng screen\n reader mất hoàn toàn khả năng sắp xếp bảng. -->\n @if (column.type === 'children') {\n <div\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n } @else {\n <div\n mat-sort-header\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\"\n [disabled]=\"!column.sortable\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n @let hideInlineFilter =\n _tableOption.filter?.disabled ||\n _tableOption.filter?.hideInlineFilter === true ||\n (_tableOption.filter?.hideInlineFilter === 'auto' && !_isFiltered && _total! <= 10);\n @if (!hideInlineFilter) {\n <ng-container *sdDesktop>\n <column-filter\n [autoId]=\"_autoId\"\n [value]=\"columnFilter?.[column.field!]!\"\n [operator]=\"columnOperator[column.field]\"\n (operatorChange)=\"columnOperator[column.field] = $event!; onOperatorChange(column, $event)\"\n [columnFilter]=\"columnFilter!\"\n [cacheValues]=\"cacheValues\"\n [column]=\"column\"\n (filterChange)=\"onFilterChange()\"\n (filterCommit)=\"onFilterCommit()\">\n </column-filter>\n </ng-container>\n }\n }\n </div>\n </th>\n <td\n class=\"c-td px-0\"\n [class.d-none]=\"column.type === 'children'\"\n mat-cell\n *matCellDef=\"let item\"\n [sdHoverCopy]=\"(item.data && item.data[column.field]) || ''\"\n [sdHoverCopyDisabled]=\"!column.cell?.copiable\">\n @if (column.type !== 'children' && !item?.meta?.group?.isGroupHeader) {\n @if (_treeFirstField && column.field === _treeFirstField) {\n <!-- why: không có cột Index → chevron + indent nhúng vào cột data đầu (như file explorer). -->\n <span class=\"sd-tree-line px-8\">\n <ng-container *ngTemplateOutlet=\"sdTreeToggle; context: { row: item }\"></ng-container>\n <desktop-cell class=\"d-block\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"></desktop-cell>\n </span>\n } @else {\n <desktop-cell class=\"d-block px-8\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"> </desktop-cell>\n }\n }\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <ng-container *ngIf=\"_footerDef[column.field]\">\n <ng-container *ngTemplateOutlet=\"_footerDef[column.field].templateRef; context: { items: _items, column: column }\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n }\n @for (column of _configuration.secondColumns; track column.field) {\n <ng-container [matColumnDef]=\"column.field\">\n <th\n mat-header-cell\n *matHeaderCellDef\n class=\"c-th px-8\"\n [style.width]=\"column.width\"\n [style.min-width]=\"column.minWidth || column.width\"\n [style.max-width]=\"column.maxWidth\">\n <div>\n <!-- why: xem chú thích ở header nhóm trên — mat-sort-header là control thật,\n aria-hidden xoá tên cột + aria-sort khỏi accessibility tree. -->\n <div\n mat-sort-header\n class=\"c-header-title\"\n [class.justify-content-end]=\"column.align === 'right'\"\n [class.text-right]=\"column.align === 'right'\"\n [disabled]=\"!column.sortable\">\n <column-title [column]=\"column\" [titleDef]=\"_titleDef[column.field]\"></column-title>\n </div>\n @if (!_tableOption.filter?.disabled && !_tableOption.filter?.hideInlineFilter && columnOperator) {\n <ng-container *sdDesktop>\n <column-filter\n [autoId]=\"_autoId\"\n [value]=\"columnFilter?.[column.field!]!\"\n [operator]=\"columnOperator[column.field]\"\n [columnFilter]=\"columnFilter!\"\n [cacheValues]=\"cacheValues\"\n [column]=\"column\"\n (operatorChange)=\"columnOperator[column.field] = $event!; onOperatorChange(column, $event)\"\n (filterChange)=\"onFilterChange()\"\n (filterCommit)=\"onFilterCommit()\">\n </column-filter>\n </ng-container>\n }\n </div>\n </th>\n <td\n class=\"c-td px-0\"\n mat-cell\n *matCellDef=\"let item\"\n [sdHoverCopy]=\"item[column.field]\"\n [sdHoverCopyDisabled]=\"!column.cell?.copiable\">\n @if (column.type !== 'children') {\n <desktop-cell class=\"d-block px-8\" [column]=\"column\" [item]=\"item\" [cellDef]=\"_cellDef\"> </desktop-cell>\n }\n </td>\n <td mat-footer-cell *matFooterCellDef>\n <ng-container *ngIf=\"_footerDef[column.field]\">\n <ng-container *ngTemplateOutlet=\"_footerDef[column.field].templateRef; context: { items: _items, column: column }\">\n </ng-container>\n </ng-container>\n </td>\n </ng-container>\n }\n <tr class=\"c-first-header\" mat-header-row *matHeaderRowDef=\"_configuration.firstHeaders; sticky: true\"></tr>\n @if (!!_configuration.secondHeaders.length) {\n <tr class=\"c-second-header\" mat-header-row *matHeaderRowDef=\"_configuration.secondHeaders; sticky: true\"></tr>\n }\n <!-- Group header row — chỉ 1 cell sdGroupHeader colspan toàn width. -->\n <tr\n mat-row\n *matRowDef=\"let row; columns: ['sdGroupHeader']; when: isGroupHeaderRow\"\n class=\"c-group-row-tr\"></tr>\n\n <!-- Data row — dùng displayedColumns đầy đủ; when isDataRow để loại trừ group header. -->\n <!-- why: [ngStyle] đọc meta.rowStyle — style.rowCss đã được resolve 1 lần mỗi lần\n render. Bản cũ gọi rowStyle(row) ngay trong binding → chạy callback của consumer\n cho TỪNG dòng ở MỖI CD pass, và vì trả object MỚI nên NgStyle phải chạy lại\n KeyValueDiffer trên mọi dòng ở mọi pass. -->\n <tr\n mat-row\n cdkDrag\n [cdkDragData]=\"row\"\n [cdkDragDisabled]=\"\n !_tableOption.rowReorder?.enabled ||\n !!row.meta?.group?.items?.length ||\n (row.meta?.tree?.level ?? 0) > 0 ||\n isReorderDisabled(row)\n \"\n *matRowDef=\"let row; columns: _configuration.displayedColumns; when: isDataRow\"\n matRipple\n class=\"c-row\"\n [class.sd-tree-row]=\"!!_tableOption.tree\"\n [ngClass]=\"_tableOption.tree ? 'sd-tree-level-' + (row.meta?.tree?.level ?? 0) : null\"\n [ngStyle]=\"row.meta.rowStyle\"\n [class.selected]=\"row.meta.selector.isSelected\"></tr>\n\n <!-- Sub-information row — also gated bởi isDataRow để KHÔNG render empty expand row dưới group header. -->\n <tr mat-row *matRowDef=\"let row; columns: ['sdSubInformation']; when: isDataRow\" class=\"c-detail-row\"></tr>\n @if (hasFooter() && !!_configuration.displayedFooters.length) {\n <tr mat-footer-row *matFooterRowDef=\"_configuration.displayedFooters; sticky: true\"></tr>\n }\n </table>\n <!-- why: trạng thái rỗng cũng xuất hiện BẤT ĐỒNG BỘ sau khi fetch xong; không có live region\n thì người dùng screen reader chờ mãi mà không biết bảng đã trả về 0 dòng. -->\n @if (!_loading && !_total) {\n <div class=\"c-no-data-row\" role=\"status\" aria-live=\"polite\">\n @if (_isFiltered) {\n @if (tableConfiguration?.images?.filterEmpty) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.filterEmpty\" alt=\"filter-empty\" />\n } @else {\n <img class=\"c-image sd-image-filter-empty\" alt=\"filter-empty\" />\n }\n <div class=\"T16M\">{{ 'core.component.table.no-results' | sdTranslate }}</div>\n <div class=\"T16R text-secondary\">{{ 'core.component.table.no-results-hint' | sdTranslate }}</div>\n } @else {\n @if (_requireFiltered) {\n @if (tableConfiguration?.images?.filterRequired) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.filterRequired\" alt=\"filter-required\" />\n } @else {\n <img class=\"c-image sd-image-filter-required\" alt=\"filter-required\" />\n }\n <div class=\"T16R text-secondary\">{{ 'core.component.table.choose-filter-hint' | sdTranslate }}</div>\n } @else {\n @if (tableConfiguration?.images?.dataEmpty) {\n <img class=\"c-image\" [src]=\"tableConfiguration!.images!.dataEmpty\" alt=\"data-empty\" />\n } @else {\n <img class=\"c-image sd-image-data-empty\" alt=\"data-empty\" />\n }\n <div class=\"T16R text-secondary\">{{ 'core.component.table.no-data' | sdTranslate }}</div>\n }\n }\n </div>\n }\n </div>\n <div class=\"c-paginator\">\n <div class=\"c-action\">\n <ng-container *sdDesktop>\n @if (_tableOption.reload?.visible) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-reload' : null\"\n class=\"mr-8\"\n [title]=\"'core.component.table.reload' | sdTranslate\"\n prefixIcon=\"refresh\"\n (click)=\"reload()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n @if (_export && _items.length) {\n @if (_export.type === 'custom') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportCustom()\" type=\"text\"> </sd-button>\n } @else {\n @if (_export.visible) {\n @if (_exporting) {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [loading]=\"_exporting\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" type=\"text\"> </sd-button>\n } @else {\n @if (_export.visible === 'ALL' || !_export.visible) {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" [matMenuTriggerFor]=\"menu\" type=\"text\"> </sd-button>\n <mat-menu #menu=\"matMenu\">\n <button mat-menu-item [attr.data-autoid]=\"_autoId ? _autoId + '-export-excel' : null\" (click)=\"exportExcel()\" type=\"button\">\n <sd-icon name=\"file_download\"></sd-icon>\n <span> {{ 'core.component.table.export-excel' | sdTranslate }}</span>\n </button>\n <button mat-menu-item [attr.data-autoid]=\"_autoId ? _autoId + '-export-csv' : null\" (click)=\"exportCSV()\" type=\"button\">\n <sd-icon name=\"file_download\"></sd-icon>\n <span> {{ 'core.component.table.export-csv' | sdTranslate }}</span>\n </button>\n </mat-menu>\n } @else if (_export.visible === 'EXCEL') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export-excel' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportExcel()\" type=\"text\"> </sd-button>\n } @else if (_export.visible === 'CSV') {\n <sd-button [autoId]=\"_autoId ? _autoId + '-export-csv' : null\" class=\"mr-8\" [title]=\"_exportTitle\" prefixIcon=\"get_app\" (click)=\"exportCSV()\" type=\"text\"> </sd-button>\n }\n }\n }\n }\n }\n\n <ng-container *sdDesktop>\n @if (_configComponent) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-config' : null\"\n class=\"mr-8\"\n [title]=\"'core.component.table.setup-short' | sdTranslate\"\n prefixIcon=\"settings\"\n (click)=\"_configComponent.open()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n <!-- Mobile: nút Filter mở mobile-filter drawer (inline filter ẩn trên mobile) -->\n <ng-container *sdMobile>\n @if (!_tableOption.filter?.disabled && _mobileFilter) {\n <sd-button\n [autoId]=\"_autoId ? _autoId + '-mobile-filter-open' : null\"\n class=\"mr-8\"\n prefixIcon=\"filter_alt\"\n (click)=\"_mobileFilter.open()\"\n type=\"text\">\n </sd-button>\n }\n </ng-container>\n </div>\n @let hidePaginator = !_tableOption.paginate?.pageSize || _total === undefined || _total <= _tableOption.paginate?.pageSize!;\n <!-- Desktop paginator: full config (pageSize dropdown, first/last buttons) -->\n <ng-container *sdDesktop>\n <mat-paginator\n [class.d-none]=\"_tableOption.paginate?.hidden || hidePaginator\"\n [length]=\"_total\"\n [pageSize]=\"_tableOption.paginate?.pageSize\"\n [pageSizeOptions]=\"_tableOption.paginate?.pages!\"\n [showFirstLastButtons]=\"_tableOption.paginate?.showFirstLastButtons\"\n [hidePageSize]=\"_tableOption.paginate?.hidePageSize\"></mat-paginator>\n </ng-container>\n <!-- Mobile paginator: ẩn pageSize dropdown + first/last buttons để tiết kiệm không gian -->\n <ng-container *sdMobile>\n <mat-paginator\n [class.d-none]=\"_tableOption.paginate?.hidden || hidePaginator\"\n [length]=\"_total\"\n [pageSize]=\"_tableOption.paginate?.pageSize\"\n [showFirstLastButtons]=\"false\"\n hidePageSize></mat-paginator>\n </ng-container>\n <!-- \"Đang hiển thị...\" chỉ desktop -->\n <ng-container *sdDesktop>\n @if (!_tableOption.paginate?.hidden && hidePaginator && _total !== undefined && _total > 0) {\n <div class=\"T14R c-summary\">\n {{ 'core.component.table.showing' | sdTranslate }} <span class=\"T14M ml-2\">1-{{ _total }}/{{ _total }}</span>\n </div>\n }\n </ng-container>\n </div>\n </div>\n <selector-action [autoId]=\"_autoId\" [tableOption]=\"_tableOption\" [selectedTableItems]=\"_selectedTableItems\" (clear)=\"onClearSelection(groupedItems)\" />\n @if (_tableOption.config?.visible) {\n <config [autoId]=\"_autoId\" [tableOption]=\"_tableOption\" />\n }\n <!-- Mobile filter drawer — chỉ instantiate khi cần render trên mobile -->\n @if (!_tableOption.filter?.disabled && filterRegister) {\n <mobile-filter\n [autoId]=\"_autoId\"\n [filter]=\"_tableOption.filter!\"\n [externalFilters]=\"_tableOption.filter?.externalFilters!\"\n [columns]=\"_configuration.firstColumns\"\n [filterDefs]=\"sdFilterDefs()\"\n [filterRegister]=\"filterRegister\"\n [cacheValues]=\"cacheValues\">\n </mobile-filter>\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2","i1","SdConfirmService","i3","isReorderItemDisabled","i4"],"mappings":"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"}
|