{"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-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/pipes/sd-group.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-disabled.pipe.ts","../../../projects/sdcorejs-angular/components/table/src/pipes/selection-visible-select-all.pipe.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-selection/table-selection.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';\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/angular/utilities';\nimport { Filter, NestedKeyOf, Operator, Order, PagingReq } from '@sdcorejs/utils/models';\nimport { Observable } from 'rxjs';\nimport { SdTableColumn } 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 = any> {\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 = any> {\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\nexport const SdConvertToPagingReq = (\n  filterRequest: SdTableFilterRequest,\n  args: {\n    columns?: SdTableColumn[];\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 = any> =\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 = any> {\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 = any> extends BaseFilter<TData> {\n  type: 'string';\n  default?: string;\n}\n\ninterface DateFilter<TData = any> 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 = any> 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 = any> 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 = any> extends BaseFilter<TData> {\n  type: 'number';\n  default?: number;\n}\n\ninterface ValuesFilter<TData = any> 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 = any> 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 = any> extends BaseFilter<TData> {\n  type: 'boolean';\n  option?: {\n    displayOnTrue?: string;\n    displayOnFalse?: string;\n  };\n  default?: boolean;\n}\n\ninterface CustomFilter<TData = any> 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` (hash từ data) ổn định, selection / trạng thái bung không\n * bị mất khi từ khoá search đổi. Đây là 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 { TranslatePipe } 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    TranslatePipe,\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' | translate\"\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' | translate\"\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' | translate\"\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' | translate\"\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 { TranslatePipe } 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    TranslatePipe,\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' | translate\"\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' | translate\"\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' | translate\"\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@Pipe({\n  name: 'actionFilter',\n})\nexport class ActionFilterPipe implements PipeTransform {\n  #convert = (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  transform = (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 => this.#convert(result));\n  };\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, ActionFilterPipe } 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, ActionFilterPipe],\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  opened = computed(() => !!this.selectedTableItems()?.length);\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 = selectedTableItems() | actionFilter: tableOption()?.selector?.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    <!-- Nút close luôn hiện kể cả không có action — đảm bảo user có lối thoát clear selection -->\n    <sd-button [autoId]=\"_autoId ? _autoId + '-clear-selection' : null\" class=\"ml-4\" prefixIcon=\"close\" color=\"secondary\" type=\"outline\" (click)=\"onClear()\" 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 { MatSlideToggleModule } from '@angular/material/slide-toggle';\nimport { MatTable, 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 { SdSwitch } from '@sdcorejs/angular/forms/switch';\nimport { I18nService, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdStorageWithDefault } from '@sdcorejs/angular/services';\nimport { SdConfirmService } from '@sdcorejs/angular/services/confirm';\nimport { SdTableColumn } from '../../models/table-column.model';\nimport { 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    MatSlideToggleModule,\n    CdkTableModule,\n    DragDropModule,\n    SdButton,\n    SdInput,\n    SdModal,\n    SdSwitch,\n    TranslatePipe,\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  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\n<sd-modal width=\"sm\" [title]=\"'core.component.table.setup' | translate\" #modal>\n  @if (_configuration) {\n    <div class=\"c-container\">\n      <div class=\"c-table\" style=\"max-height: 70vh\">\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 text-center px-4\" *matHeaderCellDef style=\"width: 96px\">\n              {{ 'core.component.form-builder.display' | translate }}\n            </th>\n            <td class=\"text-center px-4\" mat-cell *matCellDef=\"let item\">\n              <div class=\"d-flex\" style=\"gap: 8px\">\n                <div class=\"c-handle\" (mousedown)=\"handleMouseDown()\" (mouseup)=\"handleMouseUp()\">\n                  <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 0 24 24\" width=\"24px\" fill=\"#5f6368\">\n                    <path d=\"M0 0h24v24H0V0z\" fill=\"none\" />\n                    <path\n                      d=\"M11 18c0 1.1-.9 2-2 2s-2-.9-2-2 .9-2 2-2 2 .9 2 2zm-2-8c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0-6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm6 4c1.1 0 2-.9 2-2s-.9-2-2-2-2 .9-2 2 .9 2 2 2zm0 2c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2zm0 6c-1.1 0-2 .9-2 2s.9 2 2 2 2-.9 2-2-.9-2-2-2z\" />\n                  </svg>\n                </div>\n                <sd-switch [model]=\"!item.invisible\" (modelChange)=\"item.invisible = !item.invisible\" />\n              </div>\n            </td>\n          </ng-container>\n          <ng-container matColumnDef=\"title\">\n            <th mat-header-cell class=\"c-th px-4\" *matHeaderCellDef>\n              {{ 'core.component.table.column-header' | translate }}\n            </th>\n            <td class=\"px-4\" mat-cell *matCellDef=\"let item\">\n              <sd-input class=\"pb-4\" [placeholder]=\"item?.origin?.title\" [(model)]=\"item.title\" hideInlineError></sd-input>\n            </td>\n          </ng-container>\n          <ng-container matColumnDef=\"width\">\n            <th mat-header-cell class=\"c-th px-4\" *matHeaderCellDef style=\"width: 80px\">\n              {{ 'core.component.table.width' | translate }}\n            </th>\n            <td class=\"px-4\" mat-cell *matCellDef=\"let item\">\n              <sd-input class=\"pb-4\" [placeholder]=\"item?.origin?.width\" [(model)]=\"item.width\" hideInlineError></sd-input>\n            </td>\n          </ng-container>\n          <ng-container matColumnDef=\"fixed\">\n            <th mat-header-cell class=\"c-th text-center px-4\" *matHeaderCellDef style=\"width: 80px\">\n              {{ 'core.component.table.fixed' | translate }}\n            </th>\n            <td class=\"text-center px-4\" mat-cell *matCellDef=\"let item\">\n              <sd-switch [(model)]=\"item.fixed\" />\n            </td>\n          </ng-container>\n\n          <ng-container matColumnDef=\"truncate\">\n            <th mat-header-cell class=\"c-th text-center px-4\" *matHeaderCellDef style=\"width: 100px\">\n              {{ 'core.component.table.char-limit' | translate }}\n            </th>\n            <td class=\"text-center px-4\" mat-cell *matCellDef=\"let item\">\n              <sd-switch [(model)]=\"item.truncate\" />\n            </td>\n          </ng-container>\n\n          <tr mat-header-row *matHeaderRowDef=\"['invisible', 'title', 'width', 'fixed', 'truncate']; sticky: true\"></tr>\n          <tr\n            mat-row\n            *matRowDef=\"let row; columns: ['invisible', 'title', 'width', 'fixed', 'truncate']\"\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 [autoId]=\"_autoId ? _autoId + '-config-skip' : null\" class=\"mr-8\" (click)=\"close()\" [title]=\"'core.component.table.skip' | translate\" color=\"secondary\"> </sd-button>\n    <sd-button [autoId]=\"_autoId ? _autoId + '-config-reset' : null\" class=\"mr-8\" (click)=\"onReset()\" [title]=\"'core.component.form-builder.default' | translate\" color=\"primary\"> </sd-button>\n    <sd-button [autoId]=\"_autoId ? _autoId + '-config-apply' : null\" (click)=\"onSave()\" [title]=\"'core.component.table.apply' | translate\" type=\"fill\" color=\"primary\"> </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 { TranslatePipe } 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, TranslatePipe],\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","@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      <div\n        #contentContainer\n        [attr.data-autoId]=\"_autoId\"\n        (click)=\"view.click()\"\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\"\n        aria-hidden=\"true\"></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' | translate) : ('core.component.form-builder.show-less' | translate) }}</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' | translate) : ('core.component.form-builder.show-less' | translate) }}</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 { TranslatePipe } 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, TranslatePipe],\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' | translate) : ('core.component.form-builder.show-less' | translate) }}\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/angular/utilities';\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      <button\n        [attr.data-autoid]=\"_autoId + '-' + command.key\"\n        (click)=\"command.click(_item.data)\"\n        [matTooltip]=\"_meta.title\"\n        aria-hidden=\"true\"\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      <button [attr.data-autoid]=\"_autoId + '-' + command.key\" [matMenuTriggerFor]=\"menu\" aria-hidden=\"true\" 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 } from 'rxjs';\nimport { debounceTime } from 'rxjs/operators';\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      // 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(() => {\n        this.#updateShadow(container);\n      });\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(10), takeUntilDestroyed(this.#destroyRef))\n        .subscribe(() => this.#updateShadow(container));\n\n      // Disconnect MutationObserver khi directive bị destroy\n      this.#destroyRef.onDestroy(() => mutationObserver.disconnect());\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 { SdBadge } from '@sdcorejs/angular/components/badge';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { SdUnwrapSignal } from '@sdcorejs/angular/utilities/models';\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  /** 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\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\nexport interface SdTableItem<T = any> {\n  meta: SdTableMeta<T>;\n  data: T;\n}\n\nexport const MapToSdTableItem = <T = any>(item: T): SdTableItem<T> => ({\n  data: item,\n  meta: {\n    id: Utilities.hash({ data: item }),\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  },\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';\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   * @example\n   * `_items | sdGroup: _tableOption : groupExpandState`\n   */\n  transform(items: SdTableItem[], gridOption: SdTableOption, expandState?: Map<string, boolean>): SdTableItem[] {\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      header.meta.group = {\n        isGroupHeader: true,\n        key,\n        values: bucket.values,\n        items: bucket.items,\n        isExpanded,\n      };\n      header.meta.selector!.selectable = false;\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 { Pipe, PipeTransform } from '@angular/core';\nimport { SdTableOptionSelector } from '../models/table-option-selector.model';\nimport { SdTableItem } from '../models/table-item.model';\n@Pipe({\n  name: 'selectionVisibleSelectAll',\n})\nexport class SdSelectionVisibleSelectAllPipe implements PipeTransform {\n  transform = async (items: SdTableItem[], selector: SdTableOptionSelector | undefined): Promise<boolean> => {\n    // Nếu chỉ chọn 1 thì không có select all\n    if (selector?.single) {\n      return false;\n    }\n    if (!items.length) {\n      return false;\n    }\n    if (!selector?.actions?.length) {\n      return true;\n    }\n    if (selector.actions.some(e => ('children' in e && e.children.some(e1 => e1.isGrouped)) || e.isGrouped)) {\n      return false;\n    }\n    await new Promise(resolve => setTimeout(resolve, 500));\n    const first = items.find(t => t.meta.selector?.actions?.length);\n    if (first) {\n      for (const action of first.meta.selector?.actions ?? []) {\n        if (items.filter(t => t.meta.selector?.actions?.length).every(e => e.meta.selector?.actions?.includes(action))) {\n          return true;\n        }\n      }\n    }\n    return false;\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\n@Pipe({\n  name: 'selectionVisible',\n})\nexport class SdSelectionVisiblePipe implements PipeTransform {\n  transform = (rowData: SdTableItem, selection: SdTableOptionSelector | undefined): boolean => {\n    const groupedActions: string[] = [];\n    rowData.meta.selector!.actions = rowData.meta.selector!.actions || [];\n    if (!selection?.actions?.length) {\n      rowData.meta.selector!.selectable = true;\n      return rowData.meta.selector!.selectable;\n    }\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          const key = Utilities.hash(child);\n          if (isGrouped) {\n            hasGroup = true;\n          }\n          if (typeof hidden === 'function') {\n            if (!hidden(rowData.data)) {\n              flag = true;\n              rowData.meta.selector!.actions.push(key);\n              if (isGrouped) {\n                groupedActions.push(key);\n              }\n            }\n          } else if (!hidden) {\n            flag = true;\n            rowData.meta.selector!.actions.push(key);\n            if (isGrouped) {\n              groupedActions.push(key);\n            }\n          }\n        }\n        if (flag) {\n          rowData.meta.selector!.actions.push(Utilities.hash(action));\n          if (hasGroup) {\n            groupedActions.push(Utilities.hash(action));\n          }\n        }\n      } else {\n        const { hidden, isGrouped } = action;\n        const key = Utilities.hash(action);\n        if (typeof hidden === 'function') {\n          if (!hidden(rowData.data)) {\n            rowData.meta.selector!.actions.push(key);\n            if (isGrouped) {\n              groupedActions.push(key);\n            }\n          }\n        } else if (!hidden) {\n          rowData.meta.selector!.actions.push(key);\n          if (isGrouped) {\n            groupedActions.push(key);\n          }\n        }\n      }\n    }\n    rowData.meta.selector!.selectable = !!rowData.meta.selector!.actions?.length;\n    if (!rowData.meta.selector!.selectable || !groupedActions.length || rowData?.meta.group?.items?.length) {\n      return rowData.meta.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 rowData.meta.selector!.actions.some(action => !groupedActions.includes(action));\n  };\n}\n","import { Injectable, inject, signal } from '@angular/core';\nimport { SdExcelColumn, SdExcelService } from '@sdcorejs/angular/services';\nimport { SdExcelSheet } from '@sdcorejs/angular/services/excel';\nimport { Utilities } from '@sdcorejs/utils/fns';\nimport { DateUtilities } from '@sdcorejs/angular/utilities/extensions';\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\n  // ==========================================\n  // SIGNAL STATE (Component sẽ bind trực tiếp vào đây)\n  // ==========================================\n  exporting = signal(false);\n  exportTitle = signal('Export');\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.exportTitle.set(`Exporting...${Math.min(percent, 100)}%`);\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.exportTitle.set('Export');\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/angular/utilities/extensions';\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  async format<T = any>(\n    rawItems: T[],\n    columns: SdTableColumn[],\n    cacheValues: Record<string, any[]>,\n    cacheObjValues: Record<string, Record<string, string>>\n  ): Promise<SdTableItem<T>[]> {\n    const items = rawItems.map(MapToSdTableItem);\n    const execute = async (column: SdTableColumnNormal) => {\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(\n    value: any,\n    column: SdTableColumnNormal & { 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(\n    column: SdTableColumnNormal,\n    value: any,\n    rowData: any,\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/angular/utilities/extensions';\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 { SdTableItem } from '../../models/table-item.model';\nimport { SdTableOptionTree } from '../../models/table-option-tree.model';\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","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 { SdTableColumn } 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: SdTableColumn[] | 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  register = (\n    filter: SdTableOptionFilter | undefined,\n    args: {\n      id: string;\n      columns: SdTableColumn[] | 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: SdTableColumn[] | 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: SdTableColumn[] | 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: SdTableColumn[] | 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: SdTableColumn[] | 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 { SdTableColumn } from './models/table-column.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/angular/utilities/extensions';\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 { SdSelectionVisibleSelectAllPipe } from './pipes/selection-visible-select-all.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  getSelectedRowData,\n  getSelectionRows,\n  resolveSelectAllState,\n  restorePreservedSelection,\n  syncPreservedSelection,\n} from './services/table-selection/table-selection.util';\nimport { SdTableFilterService } from './services/table-filter/table-filter.service';\nimport {\n  clearTreeChildCache,\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, TranslatePipe } from '@sdcorejs/angular/i18n';\nimport { SdIcon } from '@sdcorejs/angular/modules/icon';\n\n@Injectable()\nexport class MatPaginatorIntlCro 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@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: MatPaginatorIntlCro,\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    SdSelectionVisibleSelectAllPipe,\n    SdSafeHtmlPipe,\n    SdSelectionDisabledPipe,\n    SdScrollDirective,\n    SdDesktopDirective,\n    SdMobileDirective,\n    SdHoverCopyDirective,\n    SelectorActionComponent,\n    StickyShadowDirective,\n    SdColumnResizeDirective,\n    TranslatePipe,\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  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  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.format(data?.items, opt.columns, this.cacheValues, this.#cacheObjValues).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);\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    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);\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      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      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  /** 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  /** Build context object truyền vào SdTableGroupDefDirective template. */\n  groupContext = (header: SdTableItem<T>): SdTableGroupDefContext<T> => {\n    const g = header.meta.group;\n    const items = g?.items || [];\n    return {\n      items,\n      data: items.map(i => i.data),\n      key: g?.key || '',\n      values: g?.values || {},\n      isExpanded: g?.isExpanded ?? true,\n      isSelected: this.isGroupAllSelected(header),\n      indeterminate: this.isGroupIndeterminate(header),\n      toggleExpand: () => this.toggleGroupExpand(header),\n      toggleSelect: () => this.onSelectGroup(header, !this.isGroupAllSelected(header)),\n    };\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  // 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    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<!-- 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;\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    @if (_loading) {\n      <div class=\"c-loading\">\n        <mat-spinner></mat-spinner>\n      </div>\n    }\n    <div\n      class=\"c-table\"\n      sdScroll\n      stickyShadow\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            @let visibleSelectAll = _items | selectionVisibleSelectAll: _tableOption.selector | async;\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          <th class=\"p-0\" mat-header-cell *matHeaderCellDef style=\"width: 50px\" [attr.rowspan]=\"_configuration.multipleHeader ? 2 : 1\"></th>\n          <td class=\"px-8\" mat-cell *matCellDef=\"let item\">\n            <desktop-command\n              [autoId]=\"_autoId\"\n              [commands]=\"_tableOption.command?.commands || _tableOption.commands || []\"\n              [item]=\"item\"\n              [itemIndex]=\"groupedItems.indexOf(item)\"></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                  <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                <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                @if (column.type === 'children') {\n                  <div\n                    aria-hidden=\"true\"\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                    aria-hidden=\"true\"\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                <div\n                  aria-hidden=\"true\"\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        <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]=\"rowStyle(row)\"\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      @if (!_loading && !_total) {\n        <div class=\"c-no-data-row\">\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' | translate }}</div>\n            <div class=\"T16R text-secondary\">{{ 'core.component.table.no-results-hint' | translate }}</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' | translate }}</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' | translate }}</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' | translate\"\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' | translate }}</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' | translate }}</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' | translate\"\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 pr-16\">\n            {{ 'core.component.table.showing' | translate }} <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":["i1","i2","i4","SdConfirmService","i3","DateUtilities","isReorderItemDisabled"],"mappings":"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"}