@raintonic/formaui 0.9.0 → 0.9.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/fesm2022/raintonic-formaui-components-accordion.mjs +4 -4
  2. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  3. package/fesm2022/raintonic-formaui-components-alert.mjs +2 -2
  4. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-components-autocomplete.mjs +2 -2
  6. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-components-avatar.mjs +3 -3
  8. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  10. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-button-group.mjs +2 -2
  12. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-card.mjs +78 -8
  14. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  15. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  16. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  17. package/fesm2022/raintonic-formaui-components-chip.mjs +2 -2
  18. package/fesm2022/raintonic-formaui-components-chip.mjs.map +1 -1
  19. package/fesm2022/raintonic-formaui-components-data-table.mjs +80 -11
  20. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-date-picker.mjs +4 -4
  22. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-drawer.mjs +37 -6
  26. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  27. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs +2 -2
  28. package/fesm2022/raintonic-formaui-components-dropdown-menu.mjs.map +1 -1
  29. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs +1 -1
  30. package/fesm2022/raintonic-formaui-components-dual-tier-navigation.mjs.map +1 -1
  31. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  32. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  34. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-form-field.mjs +21 -2
  36. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-input.mjs +14 -0
  38. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  40. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  41. package/fesm2022/raintonic-formaui-components-number-input.mjs +2 -2
  42. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  44. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-password-input.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-progressbar.mjs +2 -2
  50. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  52. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  53. package/fesm2022/raintonic-formaui-components-select.mjs +15 -7
  54. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  55. package/fesm2022/raintonic-formaui-components-side-panel.mjs +40 -6
  56. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  57. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs +4 -4
  58. package/fesm2022/raintonic-formaui-components-sidebar-nav-menu.mjs.map +1 -1
  59. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  60. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  61. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  62. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  63. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  64. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  65. package/fesm2022/raintonic-formaui-components-tab.mjs +2 -2
  66. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  67. package/fesm2022/raintonic-formaui-components-time-picker.mjs +2 -2
  68. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  69. package/fesm2022/raintonic-formaui-components-toggle-group.mjs +19 -8
  70. package/fesm2022/raintonic-formaui-components-toggle-group.mjs.map +1 -1
  71. package/fesm2022/raintonic-formaui-components-toolbar.mjs +10 -4
  72. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  73. package/fesm2022/raintonic-formaui-components-tooltip.mjs +102 -8
  74. package/fesm2022/raintonic-formaui-components-tooltip.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-topbar.mjs +2 -2
  76. package/fesm2022/raintonic-formaui-components-topbar.mjs.map +1 -1
  77. package/fesm2022/raintonic-formaui-components-tree-select.mjs +2 -2
  78. package/fesm2022/raintonic-formaui-components-tree-select.mjs.map +1 -1
  79. package/fesm2022/raintonic-formaui-components-tree-table.mjs +2 -2
  80. package/fesm2022/raintonic-formaui-components-tree-table.mjs.map +1 -1
  81. package/fesm2022/raintonic-formaui-components-tree.mjs +4 -4
  82. package/fesm2022/raintonic-formaui-components-tree.mjs.map +1 -1
  83. package/fesm2022/raintonic-formaui-services-dialog.mjs +8 -4
  84. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  85. package/fesm2022/raintonic-formaui.mjs +1 -1
  86. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  87. package/llms-full.txt +72 -27
  88. package/package.json +1 -1
  89. package/styles/generated/_tokens.scss +9 -9
  90. package/styles/partials/components/_dialog.scss +24 -0
  91. package/styles/styles.css +24 -9
  92. package/types/raintonic-formaui-components-card.d.ts +46 -2
  93. package/types/raintonic-formaui-components-card.d.ts.map +1 -1
  94. package/types/raintonic-formaui-components-data-table.d.ts +50 -3
  95. package/types/raintonic-formaui-components-data-table.d.ts.map +1 -1
  96. package/types/raintonic-formaui-components-drawer.d.ts +20 -2
  97. package/types/raintonic-formaui-components-drawer.d.ts.map +1 -1
  98. package/types/raintonic-formaui-components-form-field.d.ts +10 -0
  99. package/types/raintonic-formaui-components-form-field.d.ts.map +1 -1
  100. package/types/raintonic-formaui-components-input.d.ts +9 -0
  101. package/types/raintonic-formaui-components-input.d.ts.map +1 -1
  102. package/types/raintonic-formaui-components-select.d.ts +8 -1
  103. package/types/raintonic-formaui-components-select.d.ts.map +1 -1
  104. package/types/raintonic-formaui-components-side-panel.d.ts +24 -2
  105. package/types/raintonic-formaui-components-side-panel.d.ts.map +1 -1
  106. package/types/raintonic-formaui-components-toggle-group.d.ts +1 -1
  107. package/types/raintonic-formaui-components-toggle-group.d.ts.map +1 -1
  108. package/types/raintonic-formaui-components-toolbar.d.ts +5 -1
  109. package/types/raintonic-formaui-components-toolbar.d.ts.map +1 -1
  110. package/types/raintonic-formaui-components-tooltip.d.ts +55 -4
  111. package/types/raintonic-formaui-components-tooltip.d.ts.map +1 -1
  112. package/types/raintonic-formaui-services-dialog.d.ts +12 -1
  113. package/types/raintonic-formaui-services-dialog.d.ts.map +1 -1
  114. package/types/raintonic-formaui.d.ts +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-data-table.mjs","sources":["../../../lib/components/data-table/data-table.intl.ts","../../../lib/components/data-table/advanced-data-table.component.ts","../../../lib/components/data-table/advanced-data-table.component.html","../../../lib/components/data-table/raintonic-formaui-components-data-table.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiDataTableIntl extends FuiIntlBase {\r\n tableAriaLabel = 'Data table';\r\n emptyMessage = 'No data available';\r\n selectAllAriaLabel = 'Select all rows';\r\n sortAriaLabel(columnLabel: string): string {\r\n return `Sort by ${columnLabel}`;\r\n }\r\n filterAriaLabel(columnLabel: string): string {\r\n return `Filter ${columnLabel}`;\r\n }\r\n selectRowAriaLabel(rowIndex: number): string {\r\n return `Select row ${rowIndex}`;\r\n }\r\n sortTooltip = 'Sort';\r\n filterTooltip = 'Filter';\r\n selectOperatorPlaceholder = 'Select operator';\r\n enterValuePlaceholder = 'Enter value';\r\n enterFinalValuePlaceholder = 'Enter final value';\r\n selectValuePlaceholder = 'Select value';\r\n applyButtonLabel = 'Apply';\r\n clearButtonLabel = 'Clear';\r\n}\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n output,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FuiDataTableIntl } from './data-table.intl';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\r\nimport { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\nimport { FuiDropdownMenuComponent, FuiDropdownMenuTriggerDirective } from '@raintonic/formaui/components/dropdown-menu';\r\nimport { FuiSelectComponent } from '@raintonic/formaui/components/select';\r\nimport { FuiOptionComponent } from '@raintonic/formaui/components/select';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiBadgeComponent } from '@raintonic/formaui/components/badge';\r\n\r\n/**\r\n * Label configuration for badge rendering in table cells.\r\n * Mirrors IIndexConfigurationLabel from @zero/api-models — duplicated\r\n * intentionally because FormaUI cannot depend on api-models.\r\n */\r\nexport interface AdvancedDataTableLabelConfig {\r\n value: string;\r\n label: string;\r\n color: string;\r\n icon?: string;\r\n}\r\n\r\n/**\r\n * Supported column data types for advanced data table.\r\n * `actions` renders the configured `rowActions` instead of a data field.\r\n */\r\nexport type AdvancedDataTableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'label' | 'actions';\r\n\r\n/** Visual density of the table — controls row height and cell padding. */\r\nexport type AdvancedDataTableDensity = 'standard' | 'compact';\r\n\r\n/**\r\n * A row-level action button rendered in columns of type `'actions'`.\r\n * `onClick` receives the row data and the click event.\r\n */\r\nexport interface AdvancedDataTableRowAction<T = Record<string, unknown>> {\r\n icon: string;\r\n label: string;\r\n ariaLabel?: string;\r\n onClick: (row: T, event: MouseEvent) => void;\r\n disabled?: (row: T) => boolean;\r\n}\r\n\r\n/**\r\n * Configuration for a table header column\r\n */\r\nexport interface AdvancedDataTableHeader {\r\n /**\r\n * Whether this column should be sticky at the start\r\n * Only applies to columns at the start of the array until first false is encountered\r\n */\r\n stickyColumnStart?: boolean;\r\n\r\n /**\r\n * Whether this column should be sticky at the end\r\n * First true value makes all following columns sticky\r\n */\r\n stickyColumnEnd?: boolean;\r\n\r\n /**\r\n * Display label for the column header\r\n */\r\n label: string;\r\n\r\n /**\r\n * Data type of the column\r\n */\r\n type: AdvancedDataTableColumnType;\r\n\r\n /**\r\n * Property path in the data object (e.g., 'user.name', 'address.city')\r\n * Format: <entityName>.<property>, can have multiple levels for nested objects\r\n */\r\n field: string;\r\n\r\n /**\r\n * Whether this column supports sorting\r\n */\r\n hasSort?: boolean;\r\n\r\n /**\r\n * Whether this column supports filtering\r\n */\r\n hasFilter?: boolean;\r\n\r\n labels?: AdvancedDataTableLabelConfig[];\r\n}\r\n\r\n/**\r\n * Configuration for the advanced data table\r\n */\r\n/**\r\n * Processed header with computed sticky positioning\r\n */\r\nexport interface ProcessedDataTableHeader extends AdvancedDataTableHeader {\r\n isStartSticky: boolean;\r\n isEndSticky: boolean;\r\n isLastStartSticky: boolean;\r\n isFirstEndSticky: boolean;\r\n startStickyPosition: number;\r\n endStickyPosition: number;\r\n}\r\n\r\nexport interface AdvancedDataTableConfig {\r\n /**\r\n * Whether the table header should be sticky\r\n */\r\n headerSticky?: boolean;\r\n\r\n /**\r\n * Array of header column configurations\r\n */\r\n headers: AdvancedDataTableHeader[];\r\n\r\n /**\r\n * Whether rows can be selected via checkboxes\r\n */\r\n areRowsSelectable?: boolean;\r\n}\r\n\r\n/**\r\n * Filter operator types\r\n */\r\nexport enum FilterOperator {\r\n // String operators\r\n CONTAINS = 'CONTAINS',\r\n START_WITH = 'START_WITH',\r\n END_WITH = 'END_WITH',\r\n EQUAL = 'EQUAL',\r\n NOT_EQUAL = 'NOT_EQUAL',\r\n\r\n // Number and Date operators\r\n GREATER = 'GREATER',\r\n GREATER_EQUAL = 'GREATER_EQUAL',\r\n LOWER = 'LOWER',\r\n LOWER_EQUAL = 'LOWER_EQUAL',\r\n BETWEEN = 'BETWEEN',\r\n\r\n // Boolean operators\r\n IS_TRUE = 'IS_TRUE',\r\n IS_FALSE = 'IS_FALSE',\r\n}\r\n\r\n/**\r\n * Filter configuration for a column\r\n */\r\nexport interface ColumnFilter {\r\n field: string;\r\n operator: FilterOperator;\r\n value: string | number | boolean | Date | (string | number | Date)[];\r\n}\r\n\r\n/**\r\n * Filter operator option\r\n */\r\ninterface FilterOperatorOption {\r\n value: FilterOperator;\r\n label: string;\r\n requiresInput: boolean;\r\n requiresSecondInput: boolean;\r\n}\r\n\r\n/**\r\n * @component FuiAdvancedDataTableComponent\r\n * @selector fui-advanced-data-table\r\n * @description A feature-rich data table with configurable columns, sticky headers/columns,\r\n * row selection via checkboxes, sorting, column filtering, row highlighting, and badge-based label rendering.\r\n *\r\n * @input config - (required) Table configuration including headers, sticky settings, and row selectability.\r\n * @input data - Array of row data objects. Default [].\r\n * @input enableRowHighlight - Whether clicking a row toggles highlight. Default false.\r\n * @input tableAriaLabel - Accessible label for the table element. Default 'Data table'.\r\n * @input emptyMessage - Message shown when data is empty. Default 'No data available'.\r\n * @input sort - Current sort state: { field, direction } or null.\r\n * @input filters - Array of active column filters.\r\n * @output sortChange - Emits when the user changes sort direction on a column.\r\n * @output filtersChange - Emits when filters are applied or cleared.\r\n * @output rowDblClick - Emits the row data object on double-click.\r\n *\r\n * @example\r\n * <fui-advanced-data-table\r\n * [config]=\"tableConfig\"\r\n * [data]=\"rows\"\r\n * [sort]=\"currentSort\"\r\n * (sortChange)=\"onSort($event)\"\r\n * (filtersChange)=\"onFilter($event)\"\r\n * (rowDblClick)=\"onRowOpen($event)\">\r\n * </fui-advanced-data-table>\r\n */\r\n@Component({\r\n selector: 'fui-advanced-data-table',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n FuiCheckboxComponent,\r\n FuiFormFieldComponent,\r\n FuiInputDirective,\r\n FuiButtonDirective,\r\n FuiDropdownMenuComponent,\r\n FuiDropdownMenuTriggerDirective,\r\n FuiSelectComponent,\r\n FuiOptionComponent,\r\n FuiTooltipDirective,\r\n FuiIconComponent,\r\n FuiBadgeComponent,\r\n ],\r\n templateUrl: './advanced-data-table.component.html',\r\n styleUrl: './advanced-data-table.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-advanced-data-table',\r\n '[class.fui-advanced-data-table--boxed]': 'boxed()',\r\n '[class.fui-advanced-data-table--density-compact]': \"density() === 'compact'\",\r\n },\r\n})\r\nexport class FuiAdvancedDataTableComponent<T = Record<string, unknown>> implements AfterViewInit, OnDestroy {\r\n readonly intl = inject(FuiDataTableIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n /** @internal — bumped when Intl mutates so computeds that read plain intl fields reinvoke. */\r\n private readonly _intlTick = signal(0);\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._intlTick.update((v) => v + 1);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * Table configuration\r\n */\r\n readonly config = input.required<AdvancedDataTableConfig>();\r\n\r\n /**\r\n * Data to display in the table\r\n */\r\n readonly data = input<T[]>([]);\r\n\r\n /**\r\n * Track-by function for row rendering performance.\r\n * Defaults to tracking by index.\r\n */\r\n readonly trackBy = input<(index: number, item: T) => unknown>((index: number) => index);\r\n\r\n /**\r\n * Enable click-to-highlight feature for rows\r\n */\r\n readonly enableRowHighlight = input(false);\r\n\r\n /**\r\n * Wraps the table in a bordered, rounded container — alternative to the\r\n * default full-width index look. Default false.\r\n */\r\n readonly boxed = input(false);\r\n\r\n /**\r\n * Visual density of the table. `compact` reduces row height and cell padding\r\n * for dense data screens. Default `standard`.\r\n */\r\n readonly density = input<AdvancedDataTableDensity>('standard');\r\n\r\n /**\r\n * Action buttons rendered inside columns of type `'actions'`. Empty by default.\r\n * Configure the column with `{ field: 'actions', type: 'actions', label: '' }`\r\n * and pass the buttons via this input.\r\n */\r\n readonly rowActions = input<AdvancedDataTableRowAction<T>[]>([]);\r\n\r\n /**\r\n * Accessible label for the table.\r\n * Default comes from FuiDataTableIntl.tableAriaLabel ('Data table').\r\n */\r\n readonly tableAriaLabel = input<string | undefined>(undefined);\r\n\r\n @ViewChild('liveAnnouncer') private _liveAnnouncer?: ElementRef<HTMLElement>;\r\n @ViewChild('scrollSentinel') private _scrollSentinel?: ElementRef<HTMLElement>;\r\n\r\n /** True once the user has scrolled past the top of the table — used to elevate the header. */\r\n readonly _headerStuck = signal(false);\r\n private _stickyObserver?: IntersectionObserver;\r\n\r\n ngAfterViewInit(): void {\r\n if (typeof IntersectionObserver === 'undefined' || !this._scrollSentinel) {\r\n return;\r\n }\r\n this._stickyObserver = new IntersectionObserver(\r\n ([entry]) => {\r\n // Sentinel intersecting → header is at the top → flat. Sentinel out → elevated.\r\n this._headerStuck.set(!entry.isIntersecting);\r\n },\r\n { threshold: 0 },\r\n );\r\n this._stickyObserver.observe(this._scrollSentinel.nativeElement);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._stickyObserver?.disconnect();\r\n }\r\n\r\n /**\r\n * Message shown when the data array is empty. Pass empty string to hide.\r\n * Default comes from FuiDataTableIntl.emptyMessage ('No data available').\r\n */\r\n readonly emptyMessage = input<string | undefined>(undefined);\r\n\r\n /**\r\n * Resolved accessible label: input override → intl default.\r\n */\r\n readonly resolvedTableAriaLabel = computed(() => {\r\n this._intlTick();\r\n return this.tableAriaLabel() ?? this.intl.tableAriaLabel;\r\n });\r\n\r\n /**\r\n * Resolved empty-state message: input override → intl default.\r\n * Passing an empty string suppresses the empty state row.\r\n */\r\n readonly resolvedEmptyMessage = computed(() => {\r\n this._intlTick();\r\n return this.emptyMessage() ?? this.intl.emptyMessage;\r\n });\r\n\r\n /**\r\n * Current sort configuration\r\n */\r\n readonly sort = input<{ field: string; direction: 'ASC' | 'DESC' } | null>(null);\r\n\r\n /**\r\n * Event emitted when sort changes\r\n */\r\n readonly sortChange = output<{ field: string; direction: 'ASC' | 'DESC' } | null>();\r\n\r\n /**\r\n * Current filters\r\n */\r\n readonly filters = input<ColumnFilter[]>([]);\r\n\r\n /**\r\n * Event emitted when filters change\r\n */\r\n readonly filtersChange = output<ColumnFilter[]>();\r\n\r\n /**\r\n * Row dblClick event\r\n */\r\n readonly rowDblClick = output<T>();\r\n\r\n /**\r\n * Internal state for selected row indices\r\n */\r\n readonly selectedRows = signal(new Set());\r\n\r\n /**\r\n * Internal state for highlighted row indices\r\n */\r\n readonly highlightedRows = signal(new Set());\r\n\r\n /**\r\n * Temporary filter state while editing filter menu\r\n */\r\n readonly tempFilterOperator = signal<FilterOperator | null>(null);\r\n readonly tempFilterValue = signal('');\r\n readonly tempFilterValue2 = signal('');\r\n\r\n /**\r\n * Whether all rows are selected\r\n */\r\n readonly allRowsSelected = computed(() => {\r\n const dataLength = this.data().length;\r\n return dataLength > 0 && this.selectedRows().size === dataLength;\r\n });\r\n\r\n /**\r\n * Whether some (but not all) rows are selected\r\n */\r\n readonly someRowsSelected = computed(() => {\r\n const selected = this.selectedRows().size;\r\n return selected > 0 && selected < this.data().length;\r\n });\r\n\r\n /**\r\n * Computed headers with sticky information\r\n */\r\n readonly processedHeaders = computed(() => {\r\n const headers = this.config().headers;\r\n const processed = headers.map((header) => ({\r\n ...header,\r\n isStartSticky: false,\r\n isEndSticky: false,\r\n isLastStartSticky: false,\r\n isFirstEndSticky: false,\r\n startStickyPosition: 0,\r\n endStickyPosition: 0,\r\n }));\r\n\r\n // Process start sticky columns (consecutive from start)\r\n let startStickyLeft = 0;\r\n let lastStartStickyIndex = -1;\r\n for (let i = 0; i < processed.length; i++) {\r\n if (headers[i].stickyColumnStart) {\r\n processed[i].isStartSticky = true;\r\n processed[i].startStickyPosition = startStickyLeft;\r\n startStickyLeft += 150; // Default column width, will be adjusted by CSS\r\n lastStartStickyIndex = i;\r\n } else {\r\n // Stop once we find a non-sticky-start column\r\n break;\r\n }\r\n }\r\n\r\n // Mark the last sticky-start column for border\r\n if (lastStartStickyIndex >= 0) {\r\n processed[lastStartStickyIndex].isLastStartSticky = true;\r\n }\r\n\r\n // Process end sticky columns (consecutive from end)\r\n // First, find the start index of consecutive stickyColumnEnd columns from the end\r\n let endStickyStartIndex = processed.length;\r\n for (let i = processed.length - 1; i >= 0; i--) {\r\n if (headers[i].stickyColumnEnd) {\r\n endStickyStartIndex = i;\r\n } else {\r\n // Stop once we find a non-sticky-end column\r\n break;\r\n }\r\n }\r\n\r\n // Now calculate positions for sticky end columns (right position accumulates from rightmost)\r\n let endStickyRight = 0;\r\n for (let i = processed.length - 1; i >= endStickyStartIndex; i--) {\r\n processed[i].isEndSticky = true;\r\n processed[i].endStickyPosition = endStickyRight;\r\n endStickyRight += 150; // Default column width, will be adjusted by CSS\r\n }\r\n\r\n // Mark the first sticky-end column for border\r\n if (endStickyStartIndex < processed.length) {\r\n processed[endStickyStartIndex].isFirstEndSticky = true;\r\n }\r\n\r\n return processed;\r\n });\r\n\r\n /**\r\n * Get header classes\r\n */\r\n getHeaderClasses(header: ProcessedDataTableHeader): string {\r\n const classes = ['fui-advanced-data-table__header-cell'];\r\n if (header.isStartSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-start');\r\n }\r\n if (header.isLastStartSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-start-edge');\r\n }\r\n if (header.isEndSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-end');\r\n }\r\n if (header.isFirstEndSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-end-edge');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get cell classes\r\n */\r\n getCellClasses(header: ProcessedDataTableHeader): string {\r\n const classes = ['fui-advanced-data-table__cell'];\r\n if (header.isStartSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-start');\r\n }\r\n if (header.isLastStartSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-start-edge');\r\n }\r\n if (header.isEndSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-end');\r\n }\r\n if (header.isFirstEndSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-end-edge');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get header styles for sticky positioning\r\n */\r\n getHeaderStyles(header: ProcessedDataTableHeader): Record<string, string> {\r\n const styles: Record<string, string> = {};\r\n if (header.isStartSticky) {\r\n styles['left'] = `${header.startStickyPosition}px`;\r\n }\r\n if (header.isEndSticky) {\r\n styles['right'] = `${header.endStickyPosition}px`;\r\n }\r\n return styles;\r\n }\r\n\r\n /**\r\n * Get cell styles for sticky positioning\r\n */\r\n getCellStyles(header: ProcessedDataTableHeader): Record<string, string> {\r\n return this.getHeaderStyles(header);\r\n }\r\n\r\n /**\r\n * Extract value from nested object using dot notation\r\n */\r\n getCellValue(row: T, columnPath: string): unknown {\r\n if (!row || !columnPath) return '';\r\n\r\n const keys = columnPath.split('.');\r\n let value: unknown = row as unknown;\r\n\r\n for (const key of keys) {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n value = (value as Record<string, unknown>)[key];\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n /**\r\n * Format cell value based on type\r\n */\r\n formatCellValue(value: unknown, type: AdvancedDataTableColumnType): string {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n\r\n switch (type.toLowerCase()) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n return typeof value === 'number' ? value.toLocaleString() : String(value);\r\n case 'boolean':\r\n return value ? 'Yes' : 'No';\r\n case 'date':\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n return new Date(value as string | number).toLocaleDateString();\r\n default:\r\n return String(value);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle all rows selection\r\n */\r\n toggleAllRows(): void {\r\n const currentlyAllSelected = this.allRowsSelected();\r\n if (currentlyAllSelected) {\r\n this.selectedRows.set(new Set());\r\n } else {\r\n const allIndices = new Set(this.data().map((_, index) => index));\r\n this.selectedRows.set(allIndices);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle single row selection\r\n */\r\n toggleRow(index: number): void {\r\n const selected = new Set(this.selectedRows());\r\n if (selected.has(index)) {\r\n selected.delete(index);\r\n } else {\r\n selected.add(index);\r\n }\r\n this.selectedRows.set(selected);\r\n }\r\n\r\n /**\r\n * Check if a row is selected\r\n */\r\n isRowSelected(index: number): boolean {\r\n return this.selectedRows().has(index);\r\n }\r\n\r\n /**\r\n * Toggle row highlight (only if enableRowHighlight is true)\r\n */\r\n toggleRowHighlight(index: number): void {\r\n if (!this.enableRowHighlight()) {\r\n return;\r\n }\r\n\r\n const highlighted = new Set(this.highlightedRows());\r\n if (highlighted.has(index)) {\r\n highlighted.delete(index);\r\n } else {\r\n highlighted.add(index);\r\n }\r\n this.highlightedRows.set(highlighted);\r\n }\r\n\r\n /**\r\n * Check if a row is highlighted\r\n */\r\n isRowHighlighted(index: number): boolean {\r\n return this.highlightedRows().has(index);\r\n }\r\n\r\n /**\r\n * Get ARIA sort value for a column header\r\n */\r\n getAriaSortValue(field: string): 'ascending' | 'descending' | 'none' | null {\r\n const currentSort = this.sort();\r\n // Only return aria-sort for sortable columns that have sort config\r\n const header = this.config().headers.find((h) => h.field === field);\r\n if (!header?.hasSort) return null;\r\n\r\n if (currentSort?.field !== field) return 'none';\r\n return currentSort.direction === 'ASC' ? 'ascending' : 'descending';\r\n }\r\n\r\n /**\r\n * Handle sort button click\r\n * Cycles through: ASC → DESC → null (no sort)\r\n */\r\n onSortClick(field: string): void {\r\n const currentSort = this.sort();\r\n\r\n if (currentSort?.field !== field) {\r\n // No sort or different field: set to ASC\r\n this.sortChange.emit({ field, direction: 'ASC' });\r\n this._announce(`Sorted ascending`);\r\n } else if (currentSort.direction === 'ASC') {\r\n // Currently ASC: change to DESC\r\n this.sortChange.emit({ field, direction: 'DESC' });\r\n this._announce(`Sorted descending`);\r\n } else {\r\n // Currently DESC: remove sort\r\n this.sortChange.emit(null);\r\n this._announce(`Sort removed`);\r\n }\r\n }\r\n\r\n /**\r\n * Get sort icon classes for a header\r\n */\r\n getSortIconClasses(field: string): string {\r\n const currentSort = this.sort();\r\n const classes = ['fui-advanced-data-table__sort-icon'];\r\n\r\n if (currentSort?.field === field) {\r\n if (currentSort.direction === 'ASC') {\r\n classes.push('fui-advanced-data-table__sort-icon--asc');\r\n } else {\r\n classes.push('fui-advanced-data-table__sort-icon--desc');\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get available filter operators for a column type\r\n */\r\n getFilterOperators(type: AdvancedDataTableColumnType): FilterOperatorOption[] {\r\n const normalizedType = type.toLowerCase();\r\n\r\n switch (normalizedType) {\r\n case 'string':\r\n return [\r\n { value: FilterOperator.CONTAINS, label: 'Contiene', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.START_WITH, label: 'Inizia con', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.END_WITH, label: 'Finisce con', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n ];\r\n\r\n case 'number':\r\n return [\r\n { value: FilterOperator.GREATER, label: 'Maggiore di', requiresInput: true, requiresSecondInput: false },\r\n {\r\n value: FilterOperator.GREATER_EQUAL,\r\n label: 'Maggiore o uguale',\r\n requiresInput: true,\r\n requiresSecondInput: false,\r\n },\r\n { value: FilterOperator.LOWER, label: 'Minore di', requiresInput: true, requiresSecondInput: false },\r\n {\r\n value: FilterOperator.LOWER_EQUAL,\r\n label: 'Minore o uguale',\r\n requiresInput: true,\r\n requiresSecondInput: false,\r\n },\r\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n ];\r\n\r\n case 'date':\r\n return [\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.GREATER, label: 'Dopo', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.GREATER_EQUAL, label: 'Dal', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.LOWER, label: 'Prima', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.LOWER_EQUAL, label: 'Fino al', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\r\n ];\r\n\r\n case 'boolean':\r\n return [\r\n { value: FilterOperator.IS_TRUE, label: 'Vero', requiresInput: false, requiresSecondInput: false },\r\n { value: FilterOperator.IS_FALSE, label: 'Falso', requiresInput: false, requiresSecondInput: false },\r\n ];\r\n\r\n case 'label':\r\n return [{ value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false }];\r\n\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n getLabelConfig(value: unknown, labels: AdvancedDataTableLabelConfig[]): AdvancedDataTableLabelConfig | null {\r\n return labels.find((l) => l.value === String(value)) ?? null;\r\n }\r\n\r\n /**\r\n * Initialize filter form for a field\r\n * Called when menu is opened\r\n */\r\n initFilterForm(field: string, type: AdvancedDataTableColumnType): void {\r\n if (type === 'label') {\r\n const existingFilter = this.filters().find((f) => f.field === field);\r\n this.tempFilterOperator.set(FilterOperator.EQUAL);\r\n this.tempFilterValue.set(existingFilter ? String(existingFilter.value || '') : '');\r\n this.tempFilterValue2.set('');\r\n return;\r\n }\r\n\r\n // Check if there's an existing filter for this field\r\n const existingFilter = this.filters().find((f) => f.field === field);\r\n if (existingFilter) {\r\n this.tempFilterOperator.set(existingFilter.operator);\r\n if (Array.isArray(existingFilter.value)) {\r\n this.tempFilterValue.set(String(existingFilter.value[0] || ''));\r\n this.tempFilterValue2.set(String(existingFilter.value[1] || ''));\r\n } else {\r\n this.tempFilterValue.set(String(existingFilter.value || ''));\r\n this.tempFilterValue2.set('');\r\n }\r\n } else {\r\n // Set default operator for the type\r\n const operators = this.getFilterOperators(type);\r\n this.tempFilterOperator.set(operators[0]?.value || null);\r\n this.tempFilterValue.set('');\r\n this.tempFilterValue2.set('');\r\n }\r\n }\r\n\r\n /**\r\n * Reset filter form\r\n */\r\n resetFilterForm(): void {\r\n this.tempFilterOperator.set(null);\r\n this.tempFilterValue.set('');\r\n this.tempFilterValue2.set('');\r\n }\r\n\r\n /**\r\n * Apply filter for a field\r\n */\r\n applyFilter(field: string, type: AdvancedDataTableColumnType, menu?: FuiDropdownMenuComponent): void {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n if (!operatorConfig) return;\r\n\r\n let value: string | number | boolean | Date | (string | number | Date)[];\r\n\r\n // For boolean operators, no input is needed\r\n if (!operatorConfig.requiresInput) {\r\n value = operator === FilterOperator.IS_TRUE;\r\n }\r\n // For BETWEEN operator, use array with two values\r\n else if (operatorConfig.requiresSecondInput) {\r\n const val1 = this.parseValueByType(this.tempFilterValue(), type);\r\n const val2 = this.parseValueByType(this.tempFilterValue2(), type);\r\n value = [val1, val2] as (string | number | Date)[];\r\n }\r\n // For single value operators\r\n else {\r\n value = this.parseValueByType(this.tempFilterValue(), type);\r\n }\r\n\r\n // Update filters array\r\n const currentFilters = this.filters().filter((f) => f.field !== field);\r\n const newFilter: ColumnFilter = { field, operator, value };\r\n\r\n this.filtersChange.emit([...currentFilters, newFilter]);\r\n this.resetFilterForm();\r\n this._announce(`Filter applied`);\r\n menu?.close();\r\n }\r\n\r\n /**\r\n * Clear filter for a field\r\n */\r\n clearFilter(field: string, menu?: FuiDropdownMenuComponent): void {\r\n const currentFilters = this.filters().filter((f) => f.field !== field);\r\n this.filtersChange.emit(currentFilters);\r\n this.resetFilterForm();\r\n this._announce(`Filter cleared`);\r\n menu?.close();\r\n }\r\n\r\n /**\r\n * Parse value by column type\r\n */\r\n private parseValueByType(value: string, type: AdvancedDataTableColumnType): string | number | Date {\r\n const normalizedType = type.toLowerCase();\r\n\r\n switch (normalizedType) {\r\n case 'number':\r\n return Number(value);\r\n case 'date':\r\n return new Date(value);\r\n case 'label':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Announce a message to screen readers via live region\r\n */\r\n private _announce(message: string): void {\r\n if (this._liveAnnouncer?.nativeElement) {\r\n this._liveAnnouncer.nativeElement.textContent = message;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a field has an active filter\r\n */\r\n hasActiveFilter(field: string): boolean {\r\n return this.filters().some((f) => f.field === field);\r\n }\r\n\r\n /**\r\n * Get filter icon classes\r\n */\r\n getFilterIconClasses(field: string): string {\r\n const classes = ['fui-advanced-data-table__filter-icon'];\r\n if (this.hasActiveFilter(field)) {\r\n classes.push('fui-advanced-data-table__filter-icon--active');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Check if current operator requires second input\r\n */\r\n requiresSecondInput(type: AdvancedDataTableColumnType): boolean {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return false;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n return operatorConfig?.requiresSecondInput ?? false;\r\n }\r\n\r\n /**\r\n * Check if current operator requires any input\r\n */\r\n requiresInput(type: AdvancedDataTableColumnType): boolean {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return false;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n return operatorConfig?.requiresInput ?? false;\r\n }\r\n}\r\n","<div class=\"fui-advanced-data-table__wrapper\">\r\n <!-- Live region for sort/filter announcements -->\r\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #liveAnnouncer></div>\r\n <!-- Scroll sentinel: tracked by IntersectionObserver to know when the header is stuck. -->\r\n <div class=\"fui-advanced-data-table__scroll-sentinel\" aria-hidden=\"true\" #scrollSentinel></div>\r\n <table\r\n class=\"fui-advanced-data-table__table\"\r\n role=\"grid\"\r\n [attr.aria-label]=\"resolvedTableAriaLabel()\"\r\n [attr.aria-rowcount]=\"data().length\"\r\n >\r\n <!-- Table Header -->\r\n <thead\r\n class=\"fui-advanced-data-table__header\"\r\n [class.fui-advanced-data-table__header--sticky]=\"config().headerSticky\"\r\n [class.fui-advanced-data-table__header--elevated]=\"_headerStuck()\"\r\n >\r\n <tr class=\"fui-advanced-data-table__header-row\">\r\n <!-- Selection Checkbox Column -->\r\n @if (config().areRowsSelectable) {\r\n <th\r\n scope=\"col\"\r\n class=\"fui-advanced-data-table__header-cell fui-advanced-data-table__header-cell--checkbox\"\r\n [class.fui-advanced-data-table__header-cell--sticky-start]=\"\r\n processedHeaders()[0] && processedHeaders()[0].isStartSticky\r\n \"\r\n >\r\n <fui-checkbox\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"allRowsSelected()\"\r\n [indeterminate]=\"someRowsSelected()\"\r\n [aria-label]=\"intl.selectAllAriaLabel\"\r\n (change)=\"toggleAllRows()\"\r\n />\r\n </th>\r\n }\r\n\r\n <!-- Data Columns -->\r\n @for (header of processedHeaders(); track header.field) {\r\n <th\r\n scope=\"col\"\r\n [class]=\"getHeaderClasses(header)\"\r\n [ngStyle]=\"getHeaderStyles(header)\"\r\n [attr.aria-sort]=\"getAriaSortValue(header.field)\"\r\n >\r\n <div class=\"fui-advanced-data-table__header-content\">\r\n <span class=\"fui-advanced-data-table__header-label\">{{ header.label }}</span>\r\n\r\n @if (header.hasSort) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__sort-button\"\r\n [class.fui-advanced-data-table__sort-button--active]=\"sort()?.field === header.field\"\r\n [attr.aria-label]=\"intl.sortAriaLabel(header.label)\"\r\n [fuiTooltip]=\"intl.sortTooltip\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\r\n #sortTooltip=\"fuiTooltip\"\r\n (click)=\"sortTooltip.hide(); onSortClick(header.field)\"\r\n >\r\n <svg\r\n [class]=\"getSortIconClasses(header.field)\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M8 3L12 7H4L8 3Z\" />\r\n <path d=\"M8 13L4 9H12L8 13Z\" />\r\n </svg>\r\n </button>\r\n }\r\n\r\n @if (header.hasFilter) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__filter-button\"\r\n fuiDropdownMenuTrigger\r\n [fuiDropdownMenuTriggerFor]=\"filterMenu\"\r\n [menuTriggerData]=\"{ field: header.field, type: header.type }\"\r\n [attr.aria-label]=\"intl.filterAriaLabel(header.label)\"\r\n [fuiTooltip]=\"intl.filterTooltip\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\r\n #filterTooltip=\"fuiTooltip\"\r\n (click)=\"filterTooltip.hide()\"\r\n >\r\n <svg\r\n [class]=\"getFilterIconClasses(header.field)\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M2 2L6 8V13L10 15V8L14 2H2Z\" />\r\n </svg>\r\n </button>\r\n\r\n <fui-dropdown-menu\r\n #filterMenu\r\n position=\"bottom-end\"\r\n size=\"md\"\r\n (openChange)=\"$event && initFilterForm(header.field, header.type)\"\r\n [closeOnClickOutside]=\"true\"\r\n >\r\n <div class=\"fui-advanced-data-table__filter-menu-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"fui-text-xs\">{{ header.label }}</div>\r\n @if (header.type !== 'label') {\r\n <!-- Operator Selection -->\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <fui-select\r\n [ngModel]=\"tempFilterOperator()\"\r\n (ngModelChange)=\"tempFilterOperator.set($event)\"\r\n [placeholder]=\"intl.selectOperatorPlaceholder\"\r\n >\r\n @for (operator of getFilterOperators(header.type); track operator.value) {\r\n <fui-option [value]=\"operator.value\">\r\n {{ operator.label }}\r\n </fui-option>\r\n }\r\n </fui-select>\r\n </fui-form-field>\r\n\r\n <!-- Value Input(s) -->\r\n @if (requiresInput(header.type)) {\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <input\r\n fuiInput\r\n [type]=\"header.type === 'number' ? 'number' : header.type === 'date' ? 'date' : 'text'\"\r\n [ngModel]=\"tempFilterValue()\"\r\n (ngModelChange)=\"tempFilterValue.set($event)\"\r\n [placeholder]=\"intl.enterValuePlaceholder\"\r\n />\r\n </fui-form-field>\r\n\r\n @if (requiresSecondInput(header.type)) {\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <input\r\n fuiInput\r\n [type]=\"header.type === 'number' ? 'number' : header.type === 'date' ? 'date' : 'text'\"\r\n [ngModel]=\"tempFilterValue2()\"\r\n (ngModelChange)=\"tempFilterValue2.set($event)\"\r\n [placeholder]=\"intl.enterFinalValuePlaceholder\"\r\n />\r\n </fui-form-field>\r\n }\r\n }\r\n } @else {\r\n <!-- Label filter: select dropdown -->\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <fui-select\r\n [ngModel]=\"tempFilterValue()\"\r\n (ngModelChange)=\"tempFilterValue.set($event)\"\r\n [placeholder]=\"intl.selectValuePlaceholder\"\r\n >\r\n @for (labelOpt of header.labels ?? []; track labelOpt.value) {\r\n <fui-option [value]=\"labelOpt.value\">\r\n {{ labelOpt.label }}\r\n </fui-option>\r\n }\r\n </fui-select>\r\n </fui-form-field>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"fui-advanced-data-table__filter-actions\">\r\n <button\r\n fuiButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n (click)=\"applyFilter(header.field, header.type, filterMenu)\"\r\n >\r\n {{ intl.applyButtonLabel }}\r\n </button>\r\n <button fuiButton variant=\"secondary\" size=\"sm\" (click)=\"clearFilter(header.field, filterMenu)\">\r\n {{ intl.clearButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </fui-dropdown-menu>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- Table Body -->\r\n <tbody class=\"fui-advanced-data-table__body\">\r\n @if (data().length === 0 && resolvedEmptyMessage()) {\r\n <tr class=\"fui-advanced-data-table__row fui-advanced-data-table__row--empty\">\r\n <td\r\n class=\"fui-advanced-data-table__cell fui-advanced-data-table__cell--empty\"\r\n [attr.colspan]=\"processedHeaders().length + (config().areRowsSelectable ? 1 : 0)\"\r\n >\r\n <div class=\"fui-advanced-data-table__empty-state\">\r\n <fui-icon\r\n name=\"magnifying-glass\"\r\n class=\"fui-advanced-data-table__empty-state-icon\"\r\n aria-hidden=\"true\"\r\n ></fui-icon>\r\n {{ resolvedEmptyMessage() }}\r\n </div>\r\n </td>\r\n </tr>\r\n } @else {\r\n @for (row of data(); track trackBy()($index, row)) {\r\n <tr\r\n (dblclick)=\"rowDblClick.emit(row)\"\r\n class=\"fui-advanced-data-table__row\"\r\n [class.fui-advanced-data-table__row--selected]=\"isRowSelected($index)\"\r\n [class.fui-advanced-data-table__row--highlighted]=\"isRowHighlighted($index)\"\r\n [class.fui-advanced-data-table__row--clickable]=\"enableRowHighlight()\"\r\n [attr.aria-selected]=\"config().areRowsSelectable ? isRowSelected($index) : null\"\r\n [attr.aria-rowindex]=\"$index + 2\"\r\n (click)=\"toggleRowHighlight($index)\"\r\n >\r\n <!-- Selection Checkbox -->\r\n @if (config().areRowsSelectable) {\r\n <td\r\n class=\"fui-advanced-data-table__cell fui-advanced-data-table__cell--checkbox\"\r\n [class.fui-advanced-data-table__cell--sticky-start]=\"\r\n processedHeaders()[0] && processedHeaders()[0].isStartSticky\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <fui-checkbox\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"isRowSelected($index)\"\r\n [aria-label]=\"intl.selectRowAriaLabel($index + 1)\"\r\n (change)=\"toggleRow($index)\"\r\n />\r\n </td>\r\n }\r\n\r\n <!-- Data Cells -->\r\n @for (header of processedHeaders(); track header.field) {\r\n <td [class]=\"getCellClasses(header)\" [ngStyle]=\"getCellStyles(header)\">\r\n @if (header.type === 'boolean') {\r\n @if (getCellValue(row, header.field)) {\r\n <fui-icon name=\"check-circle\" class=\"fui-advanced-data-table__bool-icon--true\"></fui-icon>\r\n } @else {\r\n <fui-icon name=\"x-circle\" class=\"fui-advanced-data-table__bool-icon--false\"></fui-icon>\r\n }\r\n } @else if (header.type === 'label') {\r\n @let labelConfig = getLabelConfig(getCellValue(row, header.field), header.labels ?? []);\r\n @if (labelConfig) {\r\n <fui-badge\r\n [label]=\"labelConfig.label\"\r\n [customColor]=\"labelConfig.color\"\r\n [icon]=\"labelConfig.icon ?? null\"\r\n size=\"sm\"\r\n />\r\n } @else {\r\n <fui-badge [label]=\"'' + getCellValue(row, header.field)\" variant=\"info\" size=\"sm\" />\r\n }\r\n } @else if (header.type === 'actions') {\r\n <div class=\"fui-advanced-data-table__actions\" (click)=\"$event.stopPropagation()\">\r\n @for (action of rowActions(); track action.label) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__action-button\"\r\n [disabled]=\"action.disabled ? action.disabled(row) : false\"\r\n [attr.aria-label]=\"action.ariaLabel ?? action.label\"\r\n [fuiTooltip]=\"action.label\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"top\"\r\n (click)=\"action.onClick(row, $event)\"\r\n >\r\n <fui-icon [name]=\"action.icon\" size=\"sm\" />\r\n </button>\r\n }\r\n </div>\r\n } @else {\r\n {{ formatCellValue(getCellValue(row, header.field), header.type) }}\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"raintonic-formaui-components-data-table.mjs","sources":["../../../lib/components/data-table/data-table.intl.ts","../../../lib/components/data-table/advanced-data-table.component.ts","../../../lib/components/data-table/advanced-data-table.component.html","../../../lib/components/data-table/raintonic-formaui-components-data-table.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\r\nimport { FuiIntlBase } from '@raintonic/formaui/core';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class FuiDataTableIntl extends FuiIntlBase {\r\n tableAriaLabel = 'Data table';\r\n emptyMessage = 'No data available';\r\n selectAllAriaLabel = 'Select all rows';\r\n sortAriaLabel(columnLabel: string): string {\r\n return `Sort by ${columnLabel}`;\r\n }\r\n filterAriaLabel(columnLabel: string): string {\r\n return `Filter ${columnLabel}`;\r\n }\r\n selectRowAriaLabel(rowIndex: number): string {\r\n return `Select row ${rowIndex}`;\r\n }\r\n sortTooltip = 'Sort';\r\n filterTooltip = 'Filter';\r\n selectOperatorPlaceholder = 'Select operator';\r\n enterValuePlaceholder = 'Enter value';\r\n enterFinalValuePlaceholder = 'Enter final value';\r\n selectValuePlaceholder = 'Select value';\r\n applyButtonLabel = 'Apply';\r\n clearButtonLabel = 'Clear';\r\n}\r\n","import { CommonModule } from '@angular/common';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n OnDestroy,\r\n output,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FuiBadgeComponent, FuiBadgeSize, FuiBadgeVariant } from '@raintonic/formaui/components/badge';\r\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\nimport { FuiCheckboxComponent } from '@raintonic/formaui/components/checkbox';\r\nimport { FuiDropdownMenuComponent, FuiDropdownMenuTriggerDirective } from '@raintonic/formaui/components/dropdown-menu';\r\nimport { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\r\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\r\nimport { FuiOptionComponent, FuiSelectComponent } from '@raintonic/formaui/components/select';\r\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\r\nimport { FuiDataTableIntl } from './data-table.intl';\r\n\r\n/**\r\n * Label configuration for badge rendering in table cells.\r\n * Mirrors IIndexConfigurationLabel from @zero/api-models — duplicated\r\n * intentionally because FormaUI cannot depend on api-models.\r\n */\r\nexport interface AdvancedDataTableLabelConfig {\r\n value: string;\r\n label: string;\r\n variant?: FuiBadgeVariant;\r\n color?: string;\r\n icon?: string;\r\n size?: FuiBadgeSize;\r\n}\r\n\r\n/**\r\n * Supported column data types for advanced data table.\r\n * `actions` renders the configured `rowActions` instead of a data field.\r\n */\r\nexport type AdvancedDataTableColumnType = 'string' | 'number' | 'boolean' | 'date' | 'label' | 'actions';\r\n\r\n/** Visual density of the table — controls row height and cell padding. */\r\nexport type AdvancedDataTableDensity = 'standard' | 'compact';\r\n\r\n/**\r\n * A row-level action button rendered in columns of type `'actions'`.\r\n * `onClick` receives the row data and the click event.\r\n */\r\nexport interface AdvancedDataTableRowAction<T = Record<string, unknown>> {\r\n icon: string;\r\n label: string;\r\n ariaLabel?: string;\r\n onClick: (row: T, event: MouseEvent) => void;\r\n disabled?: (row: T) => boolean;\r\n}\r\n\r\n/**\r\n * Configuration for a table header column\r\n */\r\nexport interface AdvancedDataTableHeader {\r\n /**\r\n * Whether this column should be sticky at the start\r\n * Only applies to columns at the start of the array until first false is encountered\r\n */\r\n stickyColumnStart?: boolean;\r\n\r\n /**\r\n * Whether this column should be sticky at the end\r\n * First true value makes all following columns sticky\r\n */\r\n stickyColumnEnd?: boolean;\r\n\r\n /**\r\n * Display label for the column header\r\n */\r\n label: string;\r\n\r\n /**\r\n * Data type of the column\r\n */\r\n type: AdvancedDataTableColumnType;\r\n\r\n /**\r\n * Property path in the data object (e.g., 'user.name', 'address.city')\r\n * Format: <entityName>.<property>, can have multiple levels for nested objects\r\n */\r\n field: string;\r\n\r\n /**\r\n * Whether this column supports sorting\r\n */\r\n hasSort?: boolean;\r\n\r\n /**\r\n * Whether this column supports filtering\r\n */\r\n hasFilter?: boolean;\r\n\r\n labels?: AdvancedDataTableLabelConfig[];\r\n}\r\n\r\n/**\r\n * Configuration for the advanced data table\r\n */\r\n/**\r\n * Processed header with computed sticky positioning\r\n */\r\nexport interface ProcessedDataTableHeader extends AdvancedDataTableHeader {\r\n isStartSticky: boolean;\r\n isEndSticky: boolean;\r\n isLastStartSticky: boolean;\r\n isFirstEndSticky: boolean;\r\n startStickyPosition: number;\r\n endStickyPosition: number;\r\n}\r\n\r\nexport interface AdvancedDataTableConfig {\r\n /**\r\n * Whether the table header should be sticky\r\n */\r\n headerSticky?: boolean;\r\n\r\n /**\r\n * Array of header column configurations\r\n */\r\n headers: AdvancedDataTableHeader[];\r\n\r\n /**\r\n * Whether rows can be selected via checkboxes\r\n */\r\n areRowsSelectable?: boolean;\r\n}\r\n\r\n/**\r\n * Filter operator types\r\n */\r\nexport enum FilterOperator {\r\n // String operators\r\n CONTAINS = 'CONTAINS',\r\n START_WITH = 'START_WITH',\r\n END_WITH = 'END_WITH',\r\n EQUAL = 'EQUAL',\r\n NOT_EQUAL = 'NOT_EQUAL',\r\n\r\n // Number and Date operators\r\n GREATER = 'GREATER',\r\n GREATER_EQUAL = 'GREATER_EQUAL',\r\n LOWER = 'LOWER',\r\n LOWER_EQUAL = 'LOWER_EQUAL',\r\n BETWEEN = 'BETWEEN',\r\n\r\n // Boolean operators\r\n IS_TRUE = 'IS_TRUE',\r\n IS_FALSE = 'IS_FALSE',\r\n}\r\n\r\n/**\r\n * Filter configuration for a column\r\n */\r\nexport interface ColumnFilter {\r\n field: string;\r\n operator: FilterOperator;\r\n value: string | number | boolean | Date | (string | number | Date)[];\r\n}\r\n\r\n/**\r\n * Filter operator option\r\n */\r\ninterface FilterOperatorOption {\r\n value: FilterOperator;\r\n label: string;\r\n requiresInput: boolean;\r\n requiresSecondInput: boolean;\r\n}\r\n\r\n/**\r\n * @component FuiAdvancedDataTableComponent\r\n * @selector fui-advanced-data-table\r\n * @description A feature-rich data table with configurable columns, sticky headers/columns,\r\n * row selection via checkboxes, sorting, column filtering, row highlighting, and badge-based label rendering.\r\n *\r\n * @input config - (required) Table configuration including headers, sticky settings, and row selectability.\r\n * @input data - Array of row data objects. Default [].\r\n * @input enableRowHighlight - Whether clicking a row toggles highlight. Default false.\r\n * @input tableAriaLabel - Accessible label for the table element. Default 'Data table'.\r\n * @input emptyMessage - Message shown when data is empty. Default 'No data available'.\r\n * @input sort - Current sort state: { field, direction } or null.\r\n * @input filters - Array of active column filters.\r\n * @output sortChange - Emits when the user changes sort direction on a column.\r\n * @output filtersChange - Emits when filters are applied or cleared.\r\n * @output rowDblClick - Emits the row data object on double-click.\r\n * @output rowClick - Emits the row data object on single-click (debounced so a\r\n * double-click does not also emit a single click).\r\n *\r\n * @example\r\n * <fui-advanced-data-table\r\n * [config]=\"tableConfig\"\r\n * [data]=\"rows\"\r\n * [sort]=\"currentSort\"\r\n * (sortChange)=\"onSort($event)\"\r\n * (filtersChange)=\"onFilter($event)\"\r\n * (rowClick)=\"onRowSelect($event)\"\r\n * (rowDblClick)=\"onRowOpen($event)\">\r\n * </fui-advanced-data-table>\r\n */\r\n@Component({\r\n selector: 'fui-advanced-data-table',\r\n standalone: true,\r\n imports: [\r\n CommonModule,\r\n FormsModule,\r\n FuiCheckboxComponent,\r\n FuiFormFieldComponent,\r\n FuiInputDirective,\r\n FuiButtonDirective,\r\n FuiDropdownMenuComponent,\r\n FuiDropdownMenuTriggerDirective,\r\n FuiSelectComponent,\r\n FuiOptionComponent,\r\n FuiTooltipDirective,\r\n FuiIconComponent,\r\n FuiBadgeComponent,\r\n ],\r\n templateUrl: './advanced-data-table.component.html',\r\n styleUrl: './advanced-data-table.component.scss',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-advanced-data-table',\r\n '[class.fui-advanced-data-table--boxed]': 'boxed()',\r\n '[class.fui-advanced-data-table--density-compact]': \"density() === 'compact'\",\r\n },\r\n})\r\nexport class FuiAdvancedDataTableComponent<T = Record<string, unknown>> implements AfterViewInit, OnDestroy {\r\n readonly intl = inject(FuiDataTableIntl);\r\n private readonly _cdr = inject(ChangeDetectorRef);\r\n /** @internal — bumped when Intl mutates so computeds that read plain intl fields reinvoke. */\r\n private readonly _intlTick = signal(0);\r\n\r\n constructor() {\r\n this.intl.changes.pipe(takeUntilDestroyed()).subscribe(() => {\r\n this._intlTick.update((v) => v + 1);\r\n this._cdr.markForCheck();\r\n });\r\n }\r\n\r\n /**\r\n * Table configuration\r\n */\r\n readonly config = input.required<AdvancedDataTableConfig>();\r\n\r\n /**\r\n * Data to display in the table\r\n */\r\n readonly data = input<T[]>([]);\r\n\r\n /**\r\n * Track-by function for row rendering performance.\r\n * Defaults to tracking by index.\r\n */\r\n readonly trackBy = input<(index: number, item: T) => unknown>((index: number) => index);\r\n\r\n /**\r\n * Enable click-to-highlight feature for rows\r\n */\r\n readonly enableRowHighlight = input(false);\r\n\r\n /**\r\n * Enable double-click handling (`rowDblClick`). When true, single clicks are\r\n * debounced by ROW_CLICK_DELAY so a double-click resolves to `rowDblClick`\r\n * only. When false (default) single clicks fire instantly — no lag — because\r\n * there is no double-click to disambiguate from.\r\n */\r\n readonly enableDblClick = input(false);\r\n\r\n /**\r\n * Marks rows as clickable for single-click actions (e.g. open detail). Purely\r\n * a visual affordance: shows a pointer cursor. `rowClick` is emitted\r\n * regardless; this only controls the cursor. Highlight-enabled rows already\r\n * show the pointer.\r\n */\r\n readonly rowClickable = input(false);\r\n\r\n /**\r\n * Wraps the table in a bordered, rounded container — alternative to the\r\n * default full-width index look. Default false.\r\n */\r\n readonly boxed = input(false);\r\n\r\n /**\r\n * Visual density of the table. `compact` reduces row height and cell padding\r\n * for dense data screens. Default `standard`.\r\n */\r\n readonly density = input<AdvancedDataTableDensity>('standard');\r\n\r\n /**\r\n * Action buttons rendered inside columns of type `'actions'`. Empty by default.\r\n * Configure the column with `{ field: 'actions', type: 'actions', label: '' }`\r\n * and pass the buttons via this input.\r\n */\r\n readonly rowActions = input<AdvancedDataTableRowAction<T>[]>([]);\r\n\r\n /**\r\n * Accessible label for the table.\r\n * Default comes from FuiDataTableIntl.tableAriaLabel ('Data table').\r\n */\r\n readonly tableAriaLabel = input<string | undefined>(undefined);\r\n\r\n @ViewChild('liveAnnouncer') private _liveAnnouncer?: ElementRef<HTMLElement>;\r\n @ViewChild('scrollSentinel') private _scrollSentinel?: ElementRef<HTMLElement>;\r\n\r\n /** True once the user has scrolled past the top of the table — used to elevate the header. */\r\n readonly _headerStuck = signal(false);\r\n private _stickyObserver?: IntersectionObserver;\r\n\r\n ngAfterViewInit(): void {\r\n if (typeof IntersectionObserver === 'undefined' || !this._scrollSentinel) {\r\n return;\r\n }\r\n this._stickyObserver = new IntersectionObserver(\r\n ([entry]) => {\r\n // Sentinel intersecting → header is at the top → flat. Sentinel out → elevated.\r\n this._headerStuck.set(!entry.isIntersecting);\r\n },\r\n { threshold: 0 },\r\n );\r\n this._stickyObserver.observe(this._scrollSentinel.nativeElement);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this._stickyObserver?.disconnect();\r\n if (this.rowClickTimer !== null) {\r\n clearTimeout(this.rowClickTimer);\r\n this.rowClickTimer = null;\r\n }\r\n }\r\n\r\n /**\r\n * Message shown when the data array is empty. Pass empty string to hide.\r\n * Default comes from FuiDataTableIntl.emptyMessage ('No data available').\r\n */\r\n readonly emptyMessage = input<string | undefined>(undefined);\r\n\r\n /**\r\n * Resolved accessible label: input override → intl default.\r\n */\r\n readonly resolvedTableAriaLabel = computed(() => {\r\n this._intlTick();\r\n return this.tableAriaLabel() ?? this.intl.tableAriaLabel;\r\n });\r\n\r\n /**\r\n * Resolved empty-state message: input override → intl default.\r\n * Passing an empty string suppresses the empty state row.\r\n */\r\n readonly resolvedEmptyMessage = computed(() => {\r\n this._intlTick();\r\n return this.emptyMessage() ?? this.intl.emptyMessage;\r\n });\r\n\r\n /**\r\n * Current sort configuration\r\n */\r\n readonly sort = input<{ field: string; direction: 'ASC' | 'DESC' } | null>(null);\r\n\r\n /**\r\n * Event emitted when sort changes\r\n */\r\n readonly sortChange = output<{ field: string; direction: 'ASC' | 'DESC' } | null>();\r\n\r\n /**\r\n * Current filters\r\n */\r\n readonly filters = input<ColumnFilter[]>([]);\r\n\r\n /**\r\n * Event emitted when filters change\r\n */\r\n readonly filtersChange = output<ColumnFilter[]>();\r\n\r\n /**\r\n * Row dblClick event\r\n */\r\n readonly rowDblClick = output<T>();\r\n\r\n /**\r\n * Row single-click event. Debounced by ROW_CLICK_DELAY so a double-click does\r\n * NOT also emit a single click (the pending emit is cancelled by rowDblClick).\r\n */\r\n readonly rowClick = output<T>();\r\n\r\n /** Delay (ms) used to disambiguate a single click from a double click. */\r\n private static readonly ROW_CLICK_DELAY = 250;\r\n\r\n /** Pending single-click emit; cancelled when a double-click follows. */\r\n private rowClickTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\n /**\r\n * Internal state for selected row indices\r\n */\r\n readonly selectedRows = signal(new Set());\r\n\r\n /**\r\n * Internal state for highlighted row indices\r\n */\r\n readonly highlightedRows = signal(new Set());\r\n\r\n /**\r\n * Temporary filter state while editing filter menu\r\n */\r\n readonly tempFilterOperator = signal<FilterOperator | null>(null);\r\n readonly tempFilterValue = signal('');\r\n readonly tempFilterValue2 = signal('');\r\n\r\n /**\r\n * Whether all rows are selected\r\n */\r\n readonly allRowsSelected = computed(() => {\r\n const dataLength = this.data().length;\r\n return dataLength > 0 && this.selectedRows().size === dataLength;\r\n });\r\n\r\n /**\r\n * Whether some (but not all) rows are selected\r\n */\r\n readonly someRowsSelected = computed(() => {\r\n const selected = this.selectedRows().size;\r\n return selected > 0 && selected < this.data().length;\r\n });\r\n\r\n /**\r\n * Computed headers with sticky information\r\n */\r\n readonly processedHeaders = computed(() => {\r\n const headers = this.config().headers;\r\n const processed = headers.map((header) => ({\r\n ...header,\r\n isStartSticky: false,\r\n isEndSticky: false,\r\n isLastStartSticky: false,\r\n isFirstEndSticky: false,\r\n startStickyPosition: 0,\r\n endStickyPosition: 0,\r\n }));\r\n\r\n // Process start sticky columns (consecutive from start)\r\n let startStickyLeft = 0;\r\n let lastStartStickyIndex = -1;\r\n for (let i = 0; i < processed.length; i++) {\r\n if (headers[i].stickyColumnStart) {\r\n processed[i].isStartSticky = true;\r\n processed[i].startStickyPosition = startStickyLeft;\r\n startStickyLeft += 150; // Default column width, will be adjusted by CSS\r\n lastStartStickyIndex = i;\r\n } else {\r\n // Stop once we find a non-sticky-start column\r\n break;\r\n }\r\n }\r\n\r\n // Mark the last sticky-start column for border\r\n if (lastStartStickyIndex >= 0) {\r\n processed[lastStartStickyIndex].isLastStartSticky = true;\r\n }\r\n\r\n // Process end sticky columns (consecutive from end)\r\n // First, find the start index of consecutive stickyColumnEnd columns from the end\r\n let endStickyStartIndex = processed.length;\r\n for (let i = processed.length - 1; i >= 0; i--) {\r\n if (headers[i].stickyColumnEnd) {\r\n endStickyStartIndex = i;\r\n } else {\r\n // Stop once we find a non-sticky-end column\r\n break;\r\n }\r\n }\r\n\r\n // Now calculate positions for sticky end columns (right position accumulates from rightmost)\r\n let endStickyRight = 0;\r\n for (let i = processed.length - 1; i >= endStickyStartIndex; i--) {\r\n processed[i].isEndSticky = true;\r\n processed[i].endStickyPosition = endStickyRight;\r\n endStickyRight += 150; // Default column width, will be adjusted by CSS\r\n }\r\n\r\n // Mark the first sticky-end column for border\r\n if (endStickyStartIndex < processed.length) {\r\n processed[endStickyStartIndex].isFirstEndSticky = true;\r\n }\r\n\r\n return processed;\r\n });\r\n\r\n /**\r\n * Get header classes\r\n */\r\n getHeaderClasses(header: ProcessedDataTableHeader): string {\r\n const classes = ['fui-advanced-data-table__header-cell'];\r\n if (header.isStartSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-start');\r\n }\r\n if (header.isLastStartSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-start-edge');\r\n }\r\n if (header.isEndSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-end');\r\n }\r\n if (header.isFirstEndSticky) {\r\n classes.push('fui-advanced-data-table__header-cell--sticky-end-edge');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get cell classes\r\n */\r\n getCellClasses(header: ProcessedDataTableHeader): string {\r\n const classes = ['fui-advanced-data-table__cell'];\r\n if (header.isStartSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-start');\r\n }\r\n if (header.isLastStartSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-start-edge');\r\n }\r\n if (header.isEndSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-end');\r\n }\r\n if (header.isFirstEndSticky) {\r\n classes.push('fui-advanced-data-table__cell--sticky-end-edge');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get header styles for sticky positioning\r\n */\r\n getHeaderStyles(header: ProcessedDataTableHeader): Record<string, string> {\r\n const styles: Record<string, string> = {};\r\n if (header.isStartSticky) {\r\n styles['left'] = `${header.startStickyPosition}px`;\r\n }\r\n if (header.isEndSticky) {\r\n styles['right'] = `${header.endStickyPosition}px`;\r\n }\r\n return styles;\r\n }\r\n\r\n /**\r\n * Get cell styles for sticky positioning\r\n */\r\n getCellStyles(header: ProcessedDataTableHeader): Record<string, string> {\r\n return this.getHeaderStyles(header);\r\n }\r\n\r\n /**\r\n * Extract value from nested object using dot notation\r\n */\r\n getCellValue(row: T, columnPath: string): unknown {\r\n if (!row || !columnPath) return '';\r\n\r\n const keys = columnPath.split('.');\r\n let value: unknown = row as unknown;\r\n\r\n for (const key of keys) {\r\n if (value === null || value === undefined) {\r\n return '';\r\n }\r\n value = (value as Record<string, unknown>)[key];\r\n }\r\n\r\n return value ?? '';\r\n }\r\n\r\n /**\r\n * Format cell value based on type\r\n */\r\n formatCellValue(value: unknown, type: AdvancedDataTableColumnType): string {\r\n if (value === null || value === undefined || value === '') {\r\n return '';\r\n }\r\n\r\n switch (type.toLowerCase()) {\r\n case 'string':\r\n return String(value);\r\n case 'number':\r\n return typeof value === 'number' ? value.toLocaleString() : String(value);\r\n case 'boolean':\r\n return value ? 'Yes' : 'No';\r\n case 'date':\r\n if (value instanceof Date) {\r\n return value.toLocaleDateString();\r\n }\r\n return new Date(value as string | number).toLocaleDateString();\r\n default:\r\n return String(value);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle all rows selection\r\n */\r\n toggleAllRows(): void {\r\n const currentlyAllSelected = this.allRowsSelected();\r\n if (currentlyAllSelected) {\r\n this.selectedRows.set(new Set());\r\n } else {\r\n const allIndices = new Set(this.data().map((_, index) => index));\r\n this.selectedRows.set(allIndices);\r\n }\r\n }\r\n\r\n /**\r\n * Toggle single row selection\r\n */\r\n toggleRow(index: number): void {\r\n const selected = new Set(this.selectedRows());\r\n if (selected.has(index)) {\r\n selected.delete(index);\r\n } else {\r\n selected.add(index);\r\n }\r\n this.selectedRows.set(selected);\r\n }\r\n\r\n /**\r\n * Check if a row is selected\r\n */\r\n isRowSelected(index: number): boolean {\r\n return this.selectedRows().has(index);\r\n }\r\n\r\n /**\r\n * Handle a row single click.\r\n *\r\n * When `enableDblClick` is false (default) the highlight toggle and `rowClick`\r\n * emit fire immediately — instant response, no lag.\r\n *\r\n * When `enableDblClick` is true, both are debounced by ROW_CLICK_DELAY so a\r\n * double-click resolves cleanly to `rowDblClick` only — `onRowDblClick`\r\n * cancels the pending timer. Toggling on the raw click would otherwise fire\r\n * twice per double-click (two native `click` events precede `dblclick`),\r\n * flipping the highlight back to its original state.\r\n */\r\n onRowClick(index: number, row: T): void {\r\n // No double-click consumer → respond instantly, skip the disambiguation delay.\r\n if (!this.enableDblClick()) {\r\n this.toggleRowHighlight(index);\r\n this.rowClick.emit(row);\r\n return;\r\n }\r\n if (this.rowClickTimer !== null) {\r\n clearTimeout(this.rowClickTimer);\r\n }\r\n this.rowClickTimer = setTimeout(() => {\r\n this.rowClickTimer = null;\r\n this.toggleRowHighlight(index);\r\n this.rowClick.emit(row);\r\n }, FuiAdvancedDataTableComponent.ROW_CLICK_DELAY);\r\n }\r\n\r\n /**\r\n * Handle a row double click. Cancels any pending single-click emit before\r\n * emitting `rowDblClick`.\r\n */\r\n onRowDblClick(row: T): void {\r\n if (this.rowClickTimer !== null) {\r\n clearTimeout(this.rowClickTimer);\r\n this.rowClickTimer = null;\r\n }\r\n this.rowDblClick.emit(row);\r\n }\r\n\r\n /**\r\n * Toggle row highlight (only if enableRowHighlight is true)\r\n */\r\n toggleRowHighlight(index: number): void {\r\n if (!this.enableRowHighlight()) {\r\n return;\r\n }\r\n\r\n const highlighted = new Set(this.highlightedRows());\r\n if (highlighted.has(index)) {\r\n highlighted.delete(index);\r\n } else {\r\n highlighted.add(index);\r\n }\r\n this.highlightedRows.set(highlighted);\r\n }\r\n\r\n /**\r\n * Check if a row is highlighted\r\n */\r\n isRowHighlighted(index: number): boolean {\r\n return this.highlightedRows().has(index);\r\n }\r\n\r\n /**\r\n * Get ARIA sort value for a column header\r\n */\r\n getAriaSortValue(field: string): 'ascending' | 'descending' | 'none' | null {\r\n const currentSort = this.sort();\r\n // Only return aria-sort for sortable columns that have sort config\r\n const header = this.config().headers.find((h) => h.field === field);\r\n if (!header?.hasSort) return null;\r\n\r\n if (currentSort?.field !== field) return 'none';\r\n return currentSort.direction === 'ASC' ? 'ascending' : 'descending';\r\n }\r\n\r\n /**\r\n * Handle sort button click\r\n * Cycles through: ASC → DESC → null (no sort)\r\n */\r\n onSortClick(field: string): void {\r\n const currentSort = this.sort();\r\n\r\n if (currentSort?.field !== field) {\r\n // No sort or different field: set to ASC\r\n this.sortChange.emit({ field, direction: 'ASC' });\r\n this._announce(`Sorted ascending`);\r\n } else if (currentSort.direction === 'ASC') {\r\n // Currently ASC: change to DESC\r\n this.sortChange.emit({ field, direction: 'DESC' });\r\n this._announce(`Sorted descending`);\r\n } else {\r\n // Currently DESC: remove sort\r\n this.sortChange.emit(null);\r\n this._announce(`Sort removed`);\r\n }\r\n }\r\n\r\n /**\r\n * Get sort icon classes for a header\r\n */\r\n getSortIconClasses(field: string): string {\r\n const currentSort = this.sort();\r\n const classes = ['fui-advanced-data-table__sort-icon'];\r\n\r\n if (currentSort?.field === field) {\r\n if (currentSort.direction === 'ASC') {\r\n classes.push('fui-advanced-data-table__sort-icon--asc');\r\n } else {\r\n classes.push('fui-advanced-data-table__sort-icon--desc');\r\n }\r\n }\r\n\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Get available filter operators for a column type\r\n */\r\n getFilterOperators(type: AdvancedDataTableColumnType): FilterOperatorOption[] {\r\n const normalizedType = type.toLowerCase();\r\n\r\n switch (normalizedType) {\r\n case 'string':\r\n return [\r\n { value: FilterOperator.CONTAINS, label: 'Contiene', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.START_WITH, label: 'Inizia con', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.END_WITH, label: 'Finisce con', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n ];\r\n\r\n case 'number':\r\n return [\r\n { value: FilterOperator.GREATER, label: 'Maggiore di', requiresInput: true, requiresSecondInput: false },\r\n {\r\n value: FilterOperator.GREATER_EQUAL,\r\n label: 'Maggiore o uguale',\r\n requiresInput: true,\r\n requiresSecondInput: false,\r\n },\r\n { value: FilterOperator.LOWER, label: 'Minore di', requiresInput: true, requiresSecondInput: false },\r\n {\r\n value: FilterOperator.LOWER_EQUAL,\r\n label: 'Minore o uguale',\r\n requiresInput: true,\r\n requiresSecondInput: false,\r\n },\r\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n ];\r\n\r\n case 'date':\r\n return [\r\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.GREATER, label: 'Dopo', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.GREATER_EQUAL, label: 'Dal', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.LOWER, label: 'Prima', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.LOWER_EQUAL, label: 'Fino al', requiresInput: true, requiresSecondInput: false },\r\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\r\n ];\r\n\r\n case 'boolean':\r\n return [\r\n { value: FilterOperator.IS_TRUE, label: 'Vero', requiresInput: false, requiresSecondInput: false },\r\n { value: FilterOperator.IS_FALSE, label: 'Falso', requiresInput: false, requiresSecondInput: false },\r\n ];\r\n\r\n case 'label':\r\n return [{ value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false }];\r\n\r\n default:\r\n return [];\r\n }\r\n }\r\n\r\n getLabelConfig(value: unknown, labels: AdvancedDataTableLabelConfig[]): AdvancedDataTableLabelConfig | null {\r\n return labels.find((l) => l.value === String(value)) ?? null;\r\n }\r\n\r\n /**\r\n * Initialize filter form for a field\r\n * Called when menu is opened\r\n */\r\n initFilterForm(field: string, type: AdvancedDataTableColumnType): void {\r\n if (type === 'label') {\r\n const existingFilter = this.filters().find((f) => f.field === field);\r\n this.tempFilterOperator.set(FilterOperator.EQUAL);\r\n this.tempFilterValue.set(existingFilter ? String(existingFilter.value || '') : '');\r\n this.tempFilterValue2.set('');\r\n return;\r\n }\r\n\r\n // Check if there's an existing filter for this field\r\n const existingFilter = this.filters().find((f) => f.field === field);\r\n if (existingFilter) {\r\n this.tempFilterOperator.set(existingFilter.operator);\r\n if (Array.isArray(existingFilter.value)) {\r\n this.tempFilterValue.set(String(existingFilter.value[0] || ''));\r\n this.tempFilterValue2.set(String(existingFilter.value[1] || ''));\r\n } else {\r\n this.tempFilterValue.set(String(existingFilter.value || ''));\r\n this.tempFilterValue2.set('');\r\n }\r\n } else {\r\n // Set default operator for the type\r\n const operators = this.getFilterOperators(type);\r\n this.tempFilterOperator.set(operators[0]?.value || null);\r\n this.tempFilterValue.set('');\r\n this.tempFilterValue2.set('');\r\n }\r\n }\r\n\r\n /**\r\n * Reset filter form\r\n */\r\n resetFilterForm(): void {\r\n this.tempFilterOperator.set(null);\r\n this.tempFilterValue.set('');\r\n this.tempFilterValue2.set('');\r\n }\r\n\r\n /**\r\n * Apply filter for a field\r\n */\r\n applyFilter(field: string, type: AdvancedDataTableColumnType, menu?: FuiDropdownMenuComponent): void {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n if (!operatorConfig) return;\r\n\r\n let value: string | number | boolean | Date | (string | number | Date)[];\r\n\r\n // For boolean operators, no input is needed\r\n if (!operatorConfig.requiresInput) {\r\n value = operator === FilterOperator.IS_TRUE;\r\n }\r\n // For BETWEEN operator, use array with two values\r\n else if (operatorConfig.requiresSecondInput) {\r\n const val1 = this.parseValueByType(this.tempFilterValue(), type);\r\n const val2 = this.parseValueByType(this.tempFilterValue2(), type);\r\n value = [val1, val2] as (string | number | Date)[];\r\n }\r\n // For single value operators\r\n else {\r\n value = this.parseValueByType(this.tempFilterValue(), type);\r\n }\r\n\r\n // Update filters array\r\n const currentFilters = this.filters().filter((f) => f.field !== field);\r\n const newFilter: ColumnFilter = { field, operator, value };\r\n\r\n this.filtersChange.emit([...currentFilters, newFilter]);\r\n this.resetFilterForm();\r\n this._announce(`Filter applied`);\r\n menu?.close();\r\n }\r\n\r\n /**\r\n * Clear filter for a field\r\n */\r\n clearFilter(field: string, menu?: FuiDropdownMenuComponent): void {\r\n const currentFilters = this.filters().filter((f) => f.field !== field);\r\n this.filtersChange.emit(currentFilters);\r\n this.resetFilterForm();\r\n this._announce(`Filter cleared`);\r\n menu?.close();\r\n }\r\n\r\n /**\r\n * Parse value by column type\r\n */\r\n private parseValueByType(value: string, type: AdvancedDataTableColumnType): string | number | Date {\r\n const normalizedType = type.toLowerCase();\r\n\r\n switch (normalizedType) {\r\n case 'number':\r\n return Number(value);\r\n case 'date':\r\n return new Date(value);\r\n case 'label':\r\n return value;\r\n default:\r\n return value;\r\n }\r\n }\r\n\r\n /**\r\n * Announce a message to screen readers via live region\r\n */\r\n private _announce(message: string): void {\r\n if (this._liveAnnouncer?.nativeElement) {\r\n this._liveAnnouncer.nativeElement.textContent = message;\r\n }\r\n }\r\n\r\n /**\r\n * Check if a field has an active filter\r\n */\r\n hasActiveFilter(field: string): boolean {\r\n return this.filters().some((f) => f.field === field);\r\n }\r\n\r\n /**\r\n * Get filter icon classes\r\n */\r\n getFilterIconClasses(field: string): string {\r\n const classes = ['fui-advanced-data-table__filter-icon'];\r\n if (this.hasActiveFilter(field)) {\r\n classes.push('fui-advanced-data-table__filter-icon--active');\r\n }\r\n return classes.join(' ');\r\n }\r\n\r\n /**\r\n * Check if current operator requires second input\r\n */\r\n requiresSecondInput(type: AdvancedDataTableColumnType): boolean {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return false;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n return operatorConfig?.requiresSecondInput ?? false;\r\n }\r\n\r\n /**\r\n * Check if current operator requires any input\r\n */\r\n requiresInput(type: AdvancedDataTableColumnType): boolean {\r\n const operator = this.tempFilterOperator();\r\n if (!operator) return false;\r\n\r\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\r\n return operatorConfig?.requiresInput ?? false;\r\n }\r\n}\r\n","<div class=\"fui-advanced-data-table__wrapper\">\r\n <!-- Live region for sort/filter announcements -->\r\n <div class=\"fui-sr-only\" aria-live=\"polite\" aria-atomic=\"true\" #liveAnnouncer></div>\r\n <!-- Scroll sentinel: tracked by IntersectionObserver to know when the header is stuck. -->\r\n <div class=\"fui-advanced-data-table__scroll-sentinel\" aria-hidden=\"true\" #scrollSentinel></div>\r\n <table\r\n class=\"fui-advanced-data-table__table\"\r\n role=\"grid\"\r\n [attr.aria-label]=\"resolvedTableAriaLabel()\"\r\n [attr.aria-rowcount]=\"data().length\"\r\n >\r\n <!-- Table Header -->\r\n <thead\r\n class=\"fui-advanced-data-table__header\"\r\n [class.fui-advanced-data-table__header--sticky]=\"config().headerSticky\"\r\n [class.fui-advanced-data-table__header--elevated]=\"_headerStuck()\"\r\n >\r\n <tr class=\"fui-advanced-data-table__header-row\">\r\n <!-- Selection Checkbox Column -->\r\n @if (config().areRowsSelectable) {\r\n <th\r\n scope=\"col\"\r\n class=\"fui-advanced-data-table__header-cell fui-advanced-data-table__header-cell--checkbox\"\r\n [class.fui-advanced-data-table__header-cell--sticky-start]=\"\r\n processedHeaders()[0] && processedHeaders()[0].isStartSticky\r\n \"\r\n >\r\n <fui-checkbox\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"allRowsSelected()\"\r\n [indeterminate]=\"someRowsSelected()\"\r\n [aria-label]=\"intl.selectAllAriaLabel\"\r\n (change)=\"toggleAllRows()\"\r\n />\r\n </th>\r\n }\r\n\r\n <!-- Data Columns -->\r\n @for (header of processedHeaders(); track header.field) {\r\n <th\r\n scope=\"col\"\r\n [class]=\"getHeaderClasses(header)\"\r\n [ngStyle]=\"getHeaderStyles(header)\"\r\n [attr.aria-sort]=\"getAriaSortValue(header.field)\"\r\n >\r\n <div class=\"fui-advanced-data-table__header-content\">\r\n <span class=\"fui-advanced-data-table__header-label\">{{ header.label }}</span>\r\n\r\n @if (header.hasSort) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__sort-button\"\r\n [class.fui-advanced-data-table__sort-button--active]=\"sort()?.field === header.field\"\r\n [attr.aria-label]=\"intl.sortAriaLabel(header.label)\"\r\n [fuiTooltip]=\"intl.sortTooltip\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\r\n #sortTooltip=\"fuiTooltip\"\r\n (click)=\"sortTooltip.hide(); onSortClick(header.field)\"\r\n >\r\n <svg\r\n [class]=\"getSortIconClasses(header.field)\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M8 3L12 7H4L8 3Z\" />\r\n <path d=\"M8 13L4 9H12L8 13Z\" />\r\n </svg>\r\n </button>\r\n }\r\n\r\n @if (header.hasFilter) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__filter-button\"\r\n fuiDropdownMenuTrigger\r\n [fuiDropdownMenuTriggerFor]=\"filterMenu\"\r\n [menuTriggerData]=\"{ field: header.field, type: header.type }\"\r\n [attr.aria-label]=\"intl.filterAriaLabel(header.label)\"\r\n [fuiTooltip]=\"intl.filterTooltip\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\r\n #filterTooltip=\"fuiTooltip\"\r\n (click)=\"filterTooltip.hide()\"\r\n >\r\n <svg\r\n [class]=\"getFilterIconClasses(header.field)\"\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 16 16\"\r\n fill=\"currentColor\"\r\n >\r\n <path d=\"M2 2L6 8V13L10 15V8L14 2H2Z\" />\r\n </svg>\r\n </button>\r\n\r\n <fui-dropdown-menu\r\n #filterMenu\r\n position=\"bottom-end\"\r\n size=\"md\"\r\n (openChange)=\"$event && initFilterForm(header.field, header.type)\"\r\n [closeOnClickOutside]=\"true\"\r\n >\r\n <div class=\"fui-advanced-data-table__filter-menu-content\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"fui-text-xs\">{{ header.label }}</div>\r\n @if (header.type !== 'label') {\r\n <!-- Operator Selection -->\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <fui-select\r\n [ngModel]=\"tempFilterOperator()\"\r\n (ngModelChange)=\"tempFilterOperator.set($event)\"\r\n [placeholder]=\"intl.selectOperatorPlaceholder\"\r\n >\r\n @for (operator of getFilterOperators(header.type); track operator.value) {\r\n <fui-option [value]=\"operator.value\">\r\n {{ operator.label }}\r\n </fui-option>\r\n }\r\n </fui-select>\r\n </fui-form-field>\r\n\r\n <!-- Value Input(s) -->\r\n @if (requiresInput(header.type)) {\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <input\r\n fuiInput\r\n [type]=\"header.type === 'number' ? 'number' : header.type === 'date' ? 'date' : 'text'\"\r\n [ngModel]=\"tempFilterValue()\"\r\n (ngModelChange)=\"tempFilterValue.set($event)\"\r\n [placeholder]=\"intl.enterValuePlaceholder\"\r\n />\r\n </fui-form-field>\r\n\r\n @if (requiresSecondInput(header.type)) {\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <input\r\n fuiInput\r\n [type]=\"header.type === 'number' ? 'number' : header.type === 'date' ? 'date' : 'text'\"\r\n [ngModel]=\"tempFilterValue2()\"\r\n (ngModelChange)=\"tempFilterValue2.set($event)\"\r\n [placeholder]=\"intl.enterFinalValuePlaceholder\"\r\n />\r\n </fui-form-field>\r\n }\r\n }\r\n } @else {\r\n <!-- Label filter: select dropdown -->\r\n <fui-form-field [hideSubscript]=\"true\">\r\n <fui-select\r\n [ngModel]=\"tempFilterValue()\"\r\n (ngModelChange)=\"tempFilterValue.set($event)\"\r\n [placeholder]=\"intl.selectValuePlaceholder\"\r\n >\r\n @for (labelOpt of header.labels ?? []; track labelOpt.value) {\r\n <fui-option [value]=\"labelOpt.value\">\r\n {{ labelOpt.label }}\r\n </fui-option>\r\n }\r\n </fui-select>\r\n </fui-form-field>\r\n }\r\n\r\n <!-- Actions -->\r\n <div class=\"fui-advanced-data-table__filter-actions\">\r\n <button\r\n fuiButton\r\n variant=\"primary\"\r\n size=\"sm\"\r\n (click)=\"applyFilter(header.field, header.type, filterMenu)\"\r\n >\r\n {{ intl.applyButtonLabel }}\r\n </button>\r\n <button fuiButton variant=\"secondary\" size=\"sm\" (click)=\"clearFilter(header.field, filterMenu)\">\r\n {{ intl.clearButtonLabel }}\r\n </button>\r\n </div>\r\n </div>\r\n </fui-dropdown-menu>\r\n }\r\n </div>\r\n </th>\r\n }\r\n </tr>\r\n </thead>\r\n\r\n <!-- Table Body -->\r\n <tbody class=\"fui-advanced-data-table__body\">\r\n @if (data().length === 0 && resolvedEmptyMessage()) {\r\n <tr class=\"fui-advanced-data-table__row fui-advanced-data-table__row--empty\">\r\n <td\r\n class=\"fui-advanced-data-table__cell fui-advanced-data-table__cell--empty\"\r\n [attr.colspan]=\"processedHeaders().length + (config().areRowsSelectable ? 1 : 0)\"\r\n >\r\n <div class=\"fui-advanced-data-table__empty-state\">\r\n <fui-icon\r\n name=\"magnifying-glass\"\r\n class=\"fui-advanced-data-table__empty-state-icon\"\r\n aria-hidden=\"true\"\r\n ></fui-icon>\r\n {{ resolvedEmptyMessage() }}\r\n </div>\r\n </td>\r\n </tr>\r\n } @else {\r\n @for (row of data(); track trackBy()($index, row)) {\r\n <tr\r\n (dblclick)=\"onRowDblClick(row)\"\r\n class=\"fui-advanced-data-table__row\"\r\n [class.fui-advanced-data-table__row--selected]=\"isRowSelected($index)\"\r\n [class.fui-advanced-data-table__row--highlighted]=\"isRowHighlighted($index)\"\r\n [class.fui-advanced-data-table__row--clickable]=\"enableRowHighlight() || rowClickable()\"\r\n [attr.aria-selected]=\"config().areRowsSelectable ? isRowSelected($index) : null\"\r\n [attr.aria-rowindex]=\"$index + 2\"\r\n (click)=\"onRowClick($index, row)\"\r\n >\r\n <!-- Selection Checkbox -->\r\n @if (config().areRowsSelectable) {\r\n <td\r\n class=\"fui-advanced-data-table__cell fui-advanced-data-table__cell--checkbox\"\r\n [class.fui-advanced-data-table__cell--sticky-start]=\"\r\n processedHeaders()[0] && processedHeaders()[0].isStartSticky\r\n \"\r\n (click)=\"$event.stopPropagation()\"\r\n >\r\n <fui-checkbox\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"isRowSelected($index)\"\r\n [aria-label]=\"intl.selectRowAriaLabel($index + 1)\"\r\n (change)=\"toggleRow($index)\"\r\n />\r\n </td>\r\n }\r\n\r\n <!-- Data Cells -->\r\n @for (header of processedHeaders(); track header.field) {\r\n <td [class]=\"getCellClasses(header)\" [ngStyle]=\"getCellStyles(header)\">\r\n @if (header.type === 'boolean') {\r\n @if (getCellValue(row, header.field)) {\r\n <fui-icon name=\"check-circle\" class=\"fui-advanced-data-table__bool-icon--true\"></fui-icon>\r\n } @else {\r\n <fui-icon name=\"x-circle\" class=\"fui-advanced-data-table__bool-icon--false\"></fui-icon>\r\n }\r\n } @else if (header.type === 'label') {\r\n @let labelConfig = getLabelConfig(getCellValue(row, header.field), header.labels ?? []);\r\n @if (labelConfig) {\r\n <fui-badge\r\n [label]=\"labelConfig.label\"\r\n [variant]=\"labelConfig.variant ?? 'info'\"\r\n [customColor]=\"labelConfig.color ?? null\"\r\n [icon]=\"labelConfig.icon ?? null\"\r\n [size]=\"labelConfig.size ?? 'sm'\"\r\n />\r\n } @else {\r\n <fui-badge [label]=\"'' + getCellValue(row, header.field)\" variant=\"info\" size=\"sm\" />\r\n }\r\n } @else if (header.type === 'actions') {\r\n <div class=\"fui-advanced-data-table__actions\" (click)=\"$event.stopPropagation()\">\r\n @for (action of rowActions(); track action.label) {\r\n <button\r\n type=\"button\"\r\n class=\"fui-advanced-data-table__action-button\"\r\n [disabled]=\"action.disabled ? action.disabled(row) : false\"\r\n [attr.aria-label]=\"action.ariaLabel ?? action.label\"\r\n [fuiTooltip]=\"action.label\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"top\"\r\n (click)=\"action.onClick(row, $event)\"\r\n >\r\n <fui-icon [name]=\"action.icon\" size=\"sm\" />\r\n </button>\r\n }\r\n </div>\r\n } @else {\r\n {{ formatCellValue(getCellValue(row, header.field), header.type) }}\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n }\r\n </tbody>\r\n </table>\r\n</div>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}