@raintonic/formaui 0.2.0 → 0.2.1

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 (99) hide show
  1. package/CHANGELOG.md +7 -7
  2. package/README.md +145 -145
  3. package/fesm2022/raintonic-formaui-cdk-drag-drop.mjs.map +1 -1
  4. package/fesm2022/raintonic-formaui-cdk-form-field.mjs.map +1 -1
  5. package/fesm2022/raintonic-formaui-cdk-overlay.mjs +0 -26
  6. package/fesm2022/raintonic-formaui-cdk-overlay.mjs.map +1 -1
  7. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs +2 -2
  8. package/fesm2022/raintonic-formaui-cdk-virtual-scroll.mjs.map +1 -1
  9. package/fesm2022/raintonic-formaui-components-accordion.mjs +2 -2
  10. package/fesm2022/raintonic-formaui-components-accordion.mjs.map +1 -1
  11. package/fesm2022/raintonic-formaui-components-alert.mjs.map +1 -1
  12. package/fesm2022/raintonic-formaui-components-autocomplete.mjs.map +1 -1
  13. package/fesm2022/raintonic-formaui-components-avatar.mjs.map +1 -1
  14. package/fesm2022/raintonic-formaui-components-badge.mjs +2 -2
  15. package/fesm2022/raintonic-formaui-components-badge.mjs.map +1 -1
  16. package/fesm2022/raintonic-formaui-components-big-menu.mjs +2 -2
  17. package/fesm2022/raintonic-formaui-components-big-menu.mjs.map +1 -1
  18. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs +4 -4
  19. package/fesm2022/raintonic-formaui-components-breadcrumb.mjs.map +1 -1
  20. package/fesm2022/raintonic-formaui-components-button-group.mjs.map +1 -1
  21. package/fesm2022/raintonic-formaui-components-button.mjs.map +1 -1
  22. package/fesm2022/raintonic-formaui-components-card.mjs.map +1 -1
  23. package/fesm2022/raintonic-formaui-components-checkbox.mjs +2 -2
  24. package/fesm2022/raintonic-formaui-components-checkbox.mjs.map +1 -1
  25. package/fesm2022/raintonic-formaui-components-data-table.mjs.map +1 -1
  26. package/fesm2022/raintonic-formaui-components-date-picker.mjs +4 -4
  27. package/fesm2022/raintonic-formaui-components-date-picker.mjs.map +1 -1
  28. package/fesm2022/raintonic-formaui-components-divider.mjs +2 -2
  29. package/fesm2022/raintonic-formaui-components-divider.mjs.map +1 -1
  30. package/fesm2022/raintonic-formaui-components-drawer.mjs +2 -2
  31. package/fesm2022/raintonic-formaui-components-drawer.mjs.map +1 -1
  32. package/fesm2022/raintonic-formaui-components-dynamic-form.mjs.map +1 -1
  33. package/fesm2022/raintonic-formaui-components-empty-state.mjs +2 -2
  34. package/fesm2022/raintonic-formaui-components-empty-state.mjs.map +1 -1
  35. package/fesm2022/raintonic-formaui-components-file-upload.mjs +2 -2
  36. package/fesm2022/raintonic-formaui-components-file-upload.mjs.map +1 -1
  37. package/fesm2022/raintonic-formaui-components-form-field.mjs.map +1 -1
  38. package/fesm2022/raintonic-formaui-components-icon.mjs.map +1 -1
  39. package/fesm2022/raintonic-formaui-components-input.mjs.map +1 -1
  40. package/fesm2022/raintonic-formaui-components-list.mjs +4 -4
  41. package/fesm2022/raintonic-formaui-components-list.mjs.map +1 -1
  42. package/fesm2022/raintonic-formaui-components-menu.mjs.map +1 -1
  43. package/fesm2022/raintonic-formaui-components-number-input.mjs +2 -2
  44. package/fesm2022/raintonic-formaui-components-number-input.mjs.map +1 -1
  45. package/fesm2022/raintonic-formaui-components-paginator.mjs +2 -2
  46. package/fesm2022/raintonic-formaui-components-paginator.mjs.map +1 -1
  47. package/fesm2022/raintonic-formaui-components-password-input.mjs +2 -2
  48. package/fesm2022/raintonic-formaui-components-password-input.mjs.map +1 -1
  49. package/fesm2022/raintonic-formaui-components-popover.mjs +2 -2
  50. package/fesm2022/raintonic-formaui-components-popover.mjs.map +1 -1
  51. package/fesm2022/raintonic-formaui-components-progressbar.mjs.map +1 -1
  52. package/fesm2022/raintonic-formaui-components-radio.mjs +4 -4
  53. package/fesm2022/raintonic-formaui-components-radio.mjs.map +1 -1
  54. package/fesm2022/raintonic-formaui-components-select.mjs +24 -24
  55. package/fesm2022/raintonic-formaui-components-select.mjs.map +1 -1
  56. package/fesm2022/raintonic-formaui-components-side-panel.mjs +2 -2
  57. package/fesm2022/raintonic-formaui-components-side-panel.mjs.map +1 -1
  58. package/fesm2022/raintonic-formaui-components-sidebar.mjs +2 -2
  59. package/fesm2022/raintonic-formaui-components-sidebar.mjs.map +1 -1
  60. package/fesm2022/raintonic-formaui-components-skeleton.mjs +2 -2
  61. package/fesm2022/raintonic-formaui-components-skeleton.mjs.map +1 -1
  62. package/fesm2022/raintonic-formaui-components-slider.mjs +2 -2
  63. package/fesm2022/raintonic-formaui-components-slider.mjs.map +1 -1
  64. package/fesm2022/raintonic-formaui-components-spinner.mjs +2 -2
  65. package/fesm2022/raintonic-formaui-components-spinner.mjs.map +1 -1
  66. package/fesm2022/raintonic-formaui-components-stepper.mjs +2 -2
  67. package/fesm2022/raintonic-formaui-components-stepper.mjs.map +1 -1
  68. package/fesm2022/raintonic-formaui-components-tab.mjs +10 -10
  69. package/fesm2022/raintonic-formaui-components-tab.mjs.map +1 -1
  70. package/fesm2022/raintonic-formaui-components-tag.mjs +2 -2
  71. package/fesm2022/raintonic-formaui-components-tag.mjs.map +1 -1
  72. package/fesm2022/raintonic-formaui-components-time-picker.mjs +4 -4
  73. package/fesm2022/raintonic-formaui-components-time-picker.mjs.map +1 -1
  74. package/fesm2022/raintonic-formaui-components-toggle.mjs.map +1 -1
  75. package/fesm2022/raintonic-formaui-components-toolbar.mjs.map +1 -1
  76. package/fesm2022/raintonic-formaui-components-tooltip.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-core.mjs.map +1 -1
  84. package/fesm2022/raintonic-formaui-services-dialog.mjs +36 -36
  85. package/fesm2022/raintonic-formaui-services-dialog.mjs.map +1 -1
  86. package/fesm2022/raintonic-formaui-services-notification.mjs +2 -2
  87. package/fesm2022/raintonic-formaui-services-notification.mjs.map +1 -1
  88. package/fesm2022/raintonic-formaui-services-theme.mjs.map +1 -1
  89. package/fesm2022/raintonic-formaui-test-utils.mjs.map +1 -1
  90. package/fesm2022/raintonic-formaui.mjs.map +1 -1
  91. package/llms-full.txt +3 -97
  92. package/llms.txt +3 -3
  93. package/package.json +1 -1
  94. package/styles/index.scss +3 -3
  95. package/styles/partials/components/_button.scss +367 -0
  96. package/styles/partials/components/_dialog.scss +180 -0
  97. package/styles/partials/components/_overlay.scss +87 -0
  98. package/types/raintonic-formaui-cdk-overlay.d.ts +0 -1
  99. package/types/raintonic-formaui-cdk-overlay.d.ts.map +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-checkbox.mjs","sources":["../../../lib/components/checkbox/checkbox.component.ts","../../../lib/components/checkbox/checkbox.component.html","../../../lib/components/checkbox/raintonic-formaui-components-checkbox.ts"],"sourcesContent":["import {\n Component,\n ChangeDetectionStrategy,\n ViewEncapsulation,\n input,\n output,\n computed,\n signal,\n viewChild,\n ElementRef,\n OutputEmitterRef,\n Signal,\n WritableSignal,\n OnDestroy,\n DoCheck,\n inject,\n effect,\n booleanAttribute,\n} from '@angular/core';\n\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\nimport { Subject } from 'rxjs';\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\n\n/**\n * Checkbox label position\n */\nexport type FuiCheckboxLabelPosition = 'before' | 'after';\n\n/**\n * Checkbox change event interface (compatible with MatCheckboxChange)\n */\nexport interface FuiCheckboxChange {\n /** The source checkbox of the event. */\n source: FuiCheckboxComponent;\n /** The new `checked` value of the checkbox. */\n checked: boolean;\n}\n\n/**\n * # FuiCheckbox Component\n *\n * A checkbox component with full Angular Reactive Forms support.\n * Compatible with Angular Material's mat-checkbox interface.\n *\n * ## Features\n * - Full Reactive Forms integration (ControlValueAccessor)\n * - Indeterminate state support\n * - Label position configuration (before/after)\n * - Built-in validation and error display\n * - Disabled state\n * - Full accessibility support (ARIA)\n * - Compatible with mat-checkbox interface\n *\n * ## Usage\n *\n * ### Basic Checkbox\n * ```html\n * <fui-checkbox>Accept terms</fui-checkbox>\n * ```\n *\n * ### With Reactive Forms\n * ```html\n * <form [formGroup]=\"form\">\n * <fui-checkbox formControlName=\"acceptTerms\">\n * I accept the terms and conditions\n * </fui-checkbox>\n * </form>\n * ```\n *\n * ### Indeterminate State\n * ```html\n * <fui-checkbox [indeterminate]=\"true\">\n * Select all\n * </fui-checkbox>\n * ```\n *\n * ### Label Position\n * ```html\n * <fui-checkbox labelPosition=\"before\">\n * Label before checkbox\n * </fui-checkbox>\n * ```\n */\n@Component({\n selector: 'fui-checkbox',\n standalone: true,\n imports: [],\n templateUrl: './checkbox.component.html',\n styleUrls: ['./checkbox.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-checkbox',\n '[class.fui-checkbox--checked]': 'checked()',\n '[class.fui-checkbox--disabled]': 'disabled() && !readonlyInput()',\n '[class.fui-checkbox--readonly]': 'readonlyInput()',\n '[class.fui-checkbox--indeterminate]': 'indeterminate()',\n '[class.fui-checkbox--label-before]': 'labelPosition() === \"before\"',\n '[class.fui-checkbox--focused]': 'focused()',\n '[class.fui-checkbox--error]': 'errorState()',\n '[attr.id]': 'id',\n '[attr.tabindex]': 'null',\n },\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: FuiCheckboxComponent,\n multi: true,\n },\n ],\n})\nexport class FuiCheckboxComponent implements ControlValueAccessor, DoCheck, OnDestroy {\n // Static properties\n static nextId = 0;\n readonly controlType = 'fui-checkbox';\n\n // Inputs using new signal-based API (mat-checkbox compatible)\n readonly readonlyInput = input<boolean, unknown>(false, {\n alias: 'readonly',\n transform: booleanAttribute,\n });\n readonly checkedInput = input<boolean, unknown>(false, {\n alias: 'checked',\n transform: booleanAttribute,\n });\n readonly disabledInput = input<boolean, unknown>(false, {\n alias: 'disabled',\n transform: booleanAttribute,\n });\n readonly indeterminateInput = input<boolean, unknown>(false, {\n alias: 'indeterminate',\n transform: booleanAttribute,\n });\n readonly requiredInput = input<boolean, unknown>(false, {\n alias: 'required',\n transform: booleanAttribute,\n });\n readonly labelPosition = input<FuiCheckboxLabelPosition>('after');\n readonly name = input<string | null>(null);\n readonly value = input('on');\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\n readonly ariaLabelledby = input<string | null>(null, { alias: 'aria-labelledby' });\n readonly ariaDescribedby = input<string | null>(null, { alias: 'aria-describedby' });\n readonly disableRipple = input<boolean, unknown>(false, { transform: booleanAttribute });\n readonly tabIndex = input(0);\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\n\n // Outputs (mat-checkbox compatible)\n readonly change: OutputEmitterRef<FuiCheckboxChange> = output<FuiCheckboxChange>();\n readonly indeterminateChange: OutputEmitterRef<boolean> = output<boolean>();\n\n // Internal state signals - single source of truth like mat-checkbox\n private readonly _checked: WritableSignal<boolean> = signal(false);\n private readonly _indeterminate: WritableSignal<boolean> = signal(false);\n private readonly _focused: WritableSignal<boolean> = signal(false);\n private readonly _disabled: WritableSignal<boolean> = signal(false);\n\n // Public signals - expose internal state as readonly\n readonly checked: Signal<boolean> = this._checked.asReadonly();\n readonly indeterminate: Signal<boolean> = this._indeterminate.asReadonly();\n readonly focused: Signal<boolean> = this._focused.asReadonly();\n\n // State changes subject for form field compatibility\n readonly stateChanges = new Subject<void>();\n private _uid = `fui-checkbox-${FuiCheckboxComponent.nextId++}`;\n readonly id = this._uid;\n readonly inputId = `${this._uid}-input`;\n\n // Error state\n private readonly _errorState: WritableSignal<boolean> = signal(false);\n readonly errorState = this._errorState.asReadonly();\n\n // Form control references\n private _parentForm = inject(NgForm, { optional: true });\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\n private readonly _ngControlRef = injectNgControl();\n\n get ngControl(): NgControl | null {\n return this._ngControlRef.ngControl;\n }\n\n // Required signal\n private readonly _required: WritableSignal<boolean> = signal(false);\n readonly required: Signal<boolean> = computed(() => this._required() || this.requiredInput());\n\n // NgControl disabled state\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\n readonly disabled: Signal<boolean> = computed(\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\n );\n\n // ViewChild for input element\n readonly inputElement: Signal<ElementRef<HTMLInputElement> | undefined> =\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\n\n // ControlValueAccessor callbacks\n private _onChange: (value: boolean) => void = () => {\n // Intentionally empty: will be replaced by Angular forms\n };\n private _onTouched: () => void = () => {\n // Intentionally empty: will be replaced by Angular forms\n };\n\n // Track if writeValue has been called by a form control\n private _formControlInitialized = false;\n\n constructor() {\n // Set valueAccessor after NgControl is resolved\n void Promise.resolve().then(() => {\n if (this._ngControlRef.ngControl) {\n this._ngControlRef.ngControl.valueAccessor = this;\n }\n });\n\n // Effect to sync checked input to internal state (like mat-checkbox @Input setter)\n // This allows [checked]=\"value\" to work, but form controls take precedence via writeValue\n effect(() => {\n const inputChecked = this.checkedInput();\n // Only apply input value if form control hasn't initialized with writeValue\n if (!this._formControlInitialized) {\n this._checked.set(inputChecked);\n }\n });\n\n // Effect to sync indeterminate input to internal state\n effect(() => {\n const inputIndeterminate = this.indeterminateInput();\n this._indeterminate.set(inputIndeterminate);\n });\n\n // Effect to emit state changes\n effect(() => {\n // Track all reactive inputs and internal signals\n this.checkedInput();\n this.disabledInput();\n this.indeterminateInput();\n this.requiredInput();\n this.labelPosition();\n this.name();\n this.value();\n this.errorStateMatcher();\n this._checked();\n this._indeterminate();\n this._focused();\n this._disabled();\n this._ngControlDisabled();\n this._required();\n this._errorState();\n\n // Emit state change\n this.stateChanges.next();\n });\n }\n\n ngDoCheck(): void {\n if (this.ngControl) {\n updateErrorState(\n this.ngControl,\n this._errorState,\n this.errorStateMatcher(),\n this._defaultErrorStateMatcher,\n this._parentForm,\n this._parentFormGroup,\n this.stateChanges,\n );\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\n }\n }\n\n ngOnDestroy(): void {\n this.stateChanges.complete();\n }\n\n // ControlValueAccessor implementation\n writeValue(value: boolean): void {\n this._formControlInitialized = true;\n this._checked.set(value);\n this.stateChanges.next();\n }\n\n registerOnChange(fn: (value: boolean) => void): void {\n this._onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this._onTouched = fn;\n }\n\n setDisabledState(isDisabled: boolean): void {\n this._disabled.set(isDisabled);\n this.stateChanges.next();\n }\n\n // Event handlers\n onInputChange(event: Event): void {\n event.stopPropagation();\n\n if (this.disabled()) {\n return;\n }\n\n // Read the new checked state from the native input element\n const target = event.target as HTMLInputElement;\n const newChecked = target.checked;\n\n // Update internal state\n this._checked.set(newChecked);\n\n // Clear indeterminate when checking/unchecking\n if (this._indeterminate()) {\n this._indeterminate.set(false);\n this.indeterminateChange.emit(false);\n }\n\n // Emit change events (this updates the form control)\n this._onChange(newChecked);\n this.change.emit({\n source: this,\n checked: newChecked,\n });\n this.stateChanges.next();\n }\n\n onFocus(): void {\n if (!this._focused()) {\n this._focused.set(true);\n this.stateChanges.next();\n }\n }\n\n onBlur(): void {\n if (this._focused()) {\n this._focused.set(false);\n this._onTouched();\n this.stateChanges.next();\n }\n }\n\n // Public methods (mat-checkbox compatible)\n\n /** Toggles the `checked` state of the checkbox. */\n toggle(): void {\n if (!this.disabled()) {\n const newChecked = !this._checked();\n this._checked.set(newChecked);\n\n // Clear indeterminate when toggling\n if (this._indeterminate()) {\n this._indeterminate.set(false);\n this.indeterminateChange.emit(false);\n }\n\n this._onChange(newChecked);\n this.change.emit({\n source: this,\n checked: newChecked,\n });\n this.stateChanges.next();\n }\n }\n\n /** Focuses the checkbox. */\n focus(): void {\n this.inputElement()?.nativeElement.focus();\n }\n\n /** Sets the indeterminate state programmatically. */\n setIndeterminate(value: boolean): void {\n if (this._indeterminate() !== value) {\n this._indeterminate.set(value);\n this.indeterminateChange.emit(value);\n this.stateChanges.next();\n }\n }\n}\n","<label class=\"fui-checkbox__container\" [attr.for]=\"inputId\">\n <!-- Label before checkbox -->\n @if (labelPosition() === 'before') {\n <span class=\"fui-checkbox__label fui-checkbox__label--before\">\n <ng-content></ng-content>\n </span>\n }\n\n <!-- Checkbox wrapper -->\n <span class=\"fui-checkbox__frame\">\n <!-- Hidden native input -->\n <input\n #inputElement\n type=\"checkbox\"\n class=\"fui-checkbox__native-control\"\n [id]=\"inputId\"\n [name]=\"name()\"\n [value]=\"value()\"\n [checked]=\"checked()\"\n [disabled]=\"disabled()\"\n [required]=\"required()\"\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"ariaLabelledby()\"\n [attr.aria-describedby]=\"ariaDescribedby()\"\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\n [attr.aria-required]=\"required() ? 'true' : null\"\n [attr.tabindex]=\"tabIndex()\"\n (change)=\"onInputChange($event)\"\n (focus)=\"onFocus()\"\n (blur)=\"onBlur()\"\n />\n\n <!-- Custom checkbox visual -->\n <span class=\"fui-checkbox__checkmark\">\n <!-- Checkmark icon -->\n @if (checked() && !indeterminate()) {\n <svg\n class=\"fui-checkbox__checkmark-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"20 6 9 17 4 12\"></polyline>\n </svg>\n }\n\n <!-- Indeterminate icon -->\n @if (indeterminate()) {\n <svg\n class=\"fui-checkbox__indeterminate-icon\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"3\"\n stroke-linecap=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\n </svg>\n }\n </span>\n\n <!-- Ripple effect (when not disabled) -->\n @if (!disableRipple() && !disabled()) {\n <span class=\"fui-checkbox__ripple\"></span>\n }\n </span>\n\n <!-- Label after checkbox (default) -->\n @if (labelPosition() === 'after') {\n <span class=\"fui-checkbox__label fui-checkbox__label--after\">\n <ng-content></ng-content>\n </span>\n }\n</label>\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-checkbox.mjs","sources":["../../../lib/components/checkbox/checkbox.component.ts","../../../lib/components/checkbox/checkbox.component.html","../../../lib/components/checkbox/raintonic-formaui-components-checkbox.ts"],"sourcesContent":["import {\r\n Component,\r\n ChangeDetectionStrategy,\r\n ViewEncapsulation,\r\n input,\r\n output,\r\n computed,\r\n signal,\r\n viewChild,\r\n ElementRef,\r\n OutputEmitterRef,\r\n Signal,\r\n WritableSignal,\r\n OnDestroy,\r\n DoCheck,\r\n inject,\r\n effect,\r\n booleanAttribute,\r\n} from '@angular/core';\r\n\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR, NgControl, FormGroupDirective, NgForm } from '@angular/forms';\r\nimport { Subject } from 'rxjs';\r\nimport { DefaultErrorStateMatcher, ErrorStateMatcher } from '@raintonic/formaui/core';\r\nimport { injectNgControl, updateErrorState, syncRequiredState, syncNgControlDisabled } from '@raintonic/formaui/cdk/form-field';\r\n\r\n/**\r\n * Checkbox label position\r\n */\r\nexport type FuiCheckboxLabelPosition = 'before' | 'after';\r\n\r\n/**\r\n * Checkbox change event interface (compatible with MatCheckboxChange)\r\n */\r\nexport interface FuiCheckboxChange {\r\n /** The source checkbox of the event. */\r\n source: FuiCheckboxComponent;\r\n /** The new `checked` value of the checkbox. */\r\n checked: boolean;\r\n}\r\n\r\n/**\r\n * # FuiCheckbox Component\r\n *\r\n * A checkbox component with full Angular Reactive Forms support.\r\n * Compatible with Angular Material's mat-checkbox interface.\r\n *\r\n * ## Features\r\n * - Full Reactive Forms integration (ControlValueAccessor)\r\n * - Indeterminate state support\r\n * - Label position configuration (before/after)\r\n * - Built-in validation and error display\r\n * - Disabled state\r\n * - Full accessibility support (ARIA)\r\n * - Compatible with mat-checkbox interface\r\n *\r\n * ## Usage\r\n *\r\n * ### Basic Checkbox\r\n * ```html\r\n * <fui-checkbox>Accept terms</fui-checkbox>\r\n * ```\r\n *\r\n * ### With Reactive Forms\r\n * ```html\r\n * <form [formGroup]=\"form\">\r\n * <fui-checkbox formControlName=\"acceptTerms\">\r\n * I accept the terms and conditions\r\n * </fui-checkbox>\r\n * </form>\r\n * ```\r\n *\r\n * ### Indeterminate State\r\n * ```html\r\n * <fui-checkbox [indeterminate]=\"true\">\r\n * Select all\r\n * </fui-checkbox>\r\n * ```\r\n *\r\n * ### Label Position\r\n * ```html\r\n * <fui-checkbox labelPosition=\"before\">\r\n * Label before checkbox\r\n * </fui-checkbox>\r\n * ```\r\n */\r\n@Component({\r\n selector: 'fui-checkbox',\r\n standalone: true,\r\n imports: [],\r\n templateUrl: './checkbox.component.html',\r\n styleUrls: ['./checkbox.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n host: {\r\n class: 'fui-checkbox',\r\n '[class.fui-checkbox--checked]': 'checked()',\r\n '[class.fui-checkbox--disabled]': 'disabled() && !readonlyInput()',\r\n '[class.fui-checkbox--readonly]': 'readonlyInput()',\r\n '[class.fui-checkbox--indeterminate]': 'indeterminate()',\r\n '[class.fui-checkbox--label-before]': 'labelPosition() === \"before\"',\r\n '[class.fui-checkbox--focused]': 'focused()',\r\n '[class.fui-checkbox--error]': 'errorState()',\r\n '[attr.id]': 'id',\r\n '[attr.tabindex]': 'null',\r\n },\r\n providers: [\r\n {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: FuiCheckboxComponent,\r\n multi: true,\r\n },\r\n ],\r\n})\r\nexport class FuiCheckboxComponent implements ControlValueAccessor, DoCheck, OnDestroy {\r\n // Static properties\r\n static nextId = 0;\r\n readonly controlType = 'fui-checkbox';\r\n\r\n // Inputs using new signal-based API (mat-checkbox compatible)\r\n readonly readonlyInput = input<boolean, unknown>(false, {\r\n alias: 'readonly',\r\n transform: booleanAttribute,\r\n });\r\n readonly checkedInput = input<boolean, unknown>(false, {\r\n alias: 'checked',\r\n transform: booleanAttribute,\r\n });\r\n readonly disabledInput = input<boolean, unknown>(false, {\r\n alias: 'disabled',\r\n transform: booleanAttribute,\r\n });\r\n readonly indeterminateInput = input<boolean, unknown>(false, {\r\n alias: 'indeterminate',\r\n transform: booleanAttribute,\r\n });\r\n readonly requiredInput = input<boolean, unknown>(false, {\r\n alias: 'required',\r\n transform: booleanAttribute,\r\n });\r\n readonly labelPosition = input<FuiCheckboxLabelPosition>('after');\r\n readonly name = input<string | null>(null);\r\n readonly value = input('on');\r\n readonly ariaLabel = input<string | null>(null, { alias: 'aria-label' });\r\n readonly ariaLabelledby = input<string | null>(null, { alias: 'aria-labelledby' });\r\n readonly ariaDescribedby = input<string | null>(null, { alias: 'aria-describedby' });\r\n readonly disableRipple = input<boolean, unknown>(false, { transform: booleanAttribute });\r\n readonly tabIndex = input(0);\r\n readonly errorStateMatcher = input<ErrorStateMatcher | null>(null);\r\n\r\n // Outputs (mat-checkbox compatible)\r\n readonly change: OutputEmitterRef<FuiCheckboxChange> = output<FuiCheckboxChange>();\r\n readonly indeterminateChange: OutputEmitterRef<boolean> = output<boolean>();\r\n\r\n // Internal state signals - single source of truth like mat-checkbox\r\n private readonly _checked: WritableSignal<boolean> = signal(false);\r\n private readonly _indeterminate: WritableSignal<boolean> = signal(false);\r\n private readonly _focused: WritableSignal<boolean> = signal(false);\r\n private readonly _disabled: WritableSignal<boolean> = signal(false);\r\n\r\n // Public signals - expose internal state as readonly\r\n readonly checked: Signal<boolean> = this._checked.asReadonly();\r\n readonly indeterminate: Signal<boolean> = this._indeterminate.asReadonly();\r\n readonly focused: Signal<boolean> = this._focused.asReadonly();\r\n\r\n // State changes subject for form field compatibility\r\n readonly stateChanges = new Subject<void>();\r\n private _uid = `fui-checkbox-${FuiCheckboxComponent.nextId++}`;\r\n readonly id = this._uid;\r\n readonly inputId = `${this._uid}-input`;\r\n\r\n // Error state\r\n private readonly _errorState: WritableSignal<boolean> = signal(false);\r\n readonly errorState = this._errorState.asReadonly();\r\n\r\n // Form control references\r\n private _parentForm = inject(NgForm, { optional: true });\r\n private _parentFormGroup = inject(FormGroupDirective, { optional: true });\r\n private _defaultErrorStateMatcher = inject(DefaultErrorStateMatcher);\r\n private readonly _ngControlRef = injectNgControl();\r\n\r\n get ngControl(): NgControl | null {\r\n return this._ngControlRef.ngControl;\r\n }\r\n\r\n // Required signal\r\n private readonly _required: WritableSignal<boolean> = signal(false);\r\n readonly required: Signal<boolean> = computed(() => this._required() || this.requiredInput());\r\n\r\n // NgControl disabled state\r\n private readonly _ngControlDisabled: WritableSignal<boolean> = signal(false);\r\n readonly disabled: Signal<boolean> = computed(\r\n () => this._disabled() || this.disabledInput() || this._ngControlDisabled(),\r\n );\r\n\r\n // ViewChild for input element\r\n readonly inputElement: Signal<ElementRef<HTMLInputElement> | undefined> =\r\n viewChild<ElementRef<HTMLInputElement>>('inputElement');\r\n\r\n // ControlValueAccessor callbacks\r\n private _onChange: (value: boolean) => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n private _onTouched: () => void = () => {\r\n // Intentionally empty: will be replaced by Angular forms\r\n };\r\n\r\n // Track if writeValue has been called by a form control\r\n private _formControlInitialized = false;\r\n\r\n constructor() {\r\n // Set valueAccessor after NgControl is resolved\r\n void Promise.resolve().then(() => {\r\n if (this._ngControlRef.ngControl) {\r\n this._ngControlRef.ngControl.valueAccessor = this;\r\n }\r\n });\r\n\r\n // Effect to sync checked input to internal state (like mat-checkbox @Input setter)\r\n // This allows [checked]=\"value\" to work, but form controls take precedence via writeValue\r\n effect(() => {\r\n const inputChecked = this.checkedInput();\r\n // Only apply input value if form control hasn't initialized with writeValue\r\n if (!this._formControlInitialized) {\r\n this._checked.set(inputChecked);\r\n }\r\n });\r\n\r\n // Effect to sync indeterminate input to internal state\r\n effect(() => {\r\n const inputIndeterminate = this.indeterminateInput();\r\n this._indeterminate.set(inputIndeterminate);\r\n });\r\n\r\n // Effect to emit state changes\r\n effect(() => {\r\n // Track all reactive inputs and internal signals\r\n this.checkedInput();\r\n this.disabledInput();\r\n this.indeterminateInput();\r\n this.requiredInput();\r\n this.labelPosition();\r\n this.name();\r\n this.value();\r\n this.errorStateMatcher();\r\n this._checked();\r\n this._indeterminate();\r\n this._focused();\r\n this._disabled();\r\n this._ngControlDisabled();\r\n this._required();\r\n this._errorState();\r\n\r\n // Emit state change\r\n this.stateChanges.next();\r\n });\r\n }\r\n\r\n ngDoCheck(): void {\r\n if (this.ngControl) {\r\n updateErrorState(\r\n this.ngControl,\r\n this._errorState,\r\n this.errorStateMatcher(),\r\n this._defaultErrorStateMatcher,\r\n this._parentForm,\r\n this._parentFormGroup,\r\n this.stateChanges,\r\n );\r\n syncRequiredState(this.ngControl, this._required, this.stateChanges);\r\n syncNgControlDisabled(this.ngControl, this._ngControlDisabled, this.stateChanges);\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stateChanges.complete();\r\n }\r\n\r\n // ControlValueAccessor implementation\r\n writeValue(value: boolean): void {\r\n this._formControlInitialized = true;\r\n this._checked.set(value);\r\n this.stateChanges.next();\r\n }\r\n\r\n registerOnChange(fn: (value: boolean) => void): void {\r\n this._onChange = fn;\r\n }\r\n\r\n registerOnTouched(fn: () => void): void {\r\n this._onTouched = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this._disabled.set(isDisabled);\r\n this.stateChanges.next();\r\n }\r\n\r\n // Event handlers\r\n onInputChange(event: Event): void {\r\n event.stopPropagation();\r\n\r\n if (this.disabled()) {\r\n return;\r\n }\r\n\r\n // Read the new checked state from the native input element\r\n const target = event.target as HTMLInputElement;\r\n const newChecked = target.checked;\r\n\r\n // Update internal state\r\n this._checked.set(newChecked);\r\n\r\n // Clear indeterminate when checking/unchecking\r\n if (this._indeterminate()) {\r\n this._indeterminate.set(false);\r\n this.indeterminateChange.emit(false);\r\n }\r\n\r\n // Emit change events (this updates the form control)\r\n this._onChange(newChecked);\r\n this.change.emit({\r\n source: this,\r\n checked: newChecked,\r\n });\r\n this.stateChanges.next();\r\n }\r\n\r\n onFocus(): void {\r\n if (!this._focused()) {\r\n this._focused.set(true);\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n onBlur(): void {\r\n if (this._focused()) {\r\n this._focused.set(false);\r\n this._onTouched();\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n // Public methods (mat-checkbox compatible)\r\n\r\n /** Toggles the `checked` state of the checkbox. */\r\n toggle(): void {\r\n if (!this.disabled()) {\r\n const newChecked = !this._checked();\r\n this._checked.set(newChecked);\r\n\r\n // Clear indeterminate when toggling\r\n if (this._indeterminate()) {\r\n this._indeterminate.set(false);\r\n this.indeterminateChange.emit(false);\r\n }\r\n\r\n this._onChange(newChecked);\r\n this.change.emit({\r\n source: this,\r\n checked: newChecked,\r\n });\r\n this.stateChanges.next();\r\n }\r\n }\r\n\r\n /** Focuses the checkbox. */\r\n focus(): void {\r\n this.inputElement()?.nativeElement.focus();\r\n }\r\n\r\n /** Sets the indeterminate state programmatically. */\r\n setIndeterminate(value: boolean): void {\r\n if (this._indeterminate() !== value) {\r\n this._indeterminate.set(value);\r\n this.indeterminateChange.emit(value);\r\n this.stateChanges.next();\r\n }\r\n }\r\n}\r\n","<label class=\"fui-checkbox__container\" [attr.for]=\"inputId\">\r\n <!-- Label before checkbox -->\r\n @if (labelPosition() === 'before') {\r\n <span class=\"fui-checkbox__label fui-checkbox__label--before\">\r\n <ng-content></ng-content>\r\n </span>\r\n }\r\n\r\n <!-- Checkbox wrapper -->\r\n <span class=\"fui-checkbox__frame\">\r\n <!-- Hidden native input -->\r\n <input\r\n #inputElement\r\n type=\"checkbox\"\r\n class=\"fui-checkbox__native-control\"\r\n [id]=\"inputId\"\r\n [name]=\"name()\"\r\n [value]=\"value()\"\r\n [checked]=\"checked()\"\r\n [disabled]=\"disabled()\"\r\n [required]=\"required()\"\r\n [attr.aria-checked]=\"indeterminate() ? 'mixed' : checked()\"\r\n [attr.aria-label]=\"ariaLabel()\"\r\n [attr.aria-labelledby]=\"ariaLabelledby()\"\r\n [attr.aria-describedby]=\"ariaDescribedby()\"\r\n [attr.aria-invalid]=\"errorState() ? 'true' : null\"\r\n [attr.aria-required]=\"required() ? 'true' : null\"\r\n [attr.tabindex]=\"tabIndex()\"\r\n (change)=\"onInputChange($event)\"\r\n (focus)=\"onFocus()\"\r\n (blur)=\"onBlur()\"\r\n />\r\n\r\n <!-- Custom checkbox visual -->\r\n <span class=\"fui-checkbox__checkmark\">\r\n <!-- Checkmark icon -->\r\n @if (checked() && !indeterminate()) {\r\n <svg\r\n class=\"fui-checkbox__checkmark-icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n stroke-linejoin=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\"></polyline>\r\n </svg>\r\n }\r\n\r\n <!-- Indeterminate icon -->\r\n @if (indeterminate()) {\r\n <svg\r\n class=\"fui-checkbox__indeterminate-icon\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n stroke-width=\"3\"\r\n stroke-linecap=\"round\"\r\n aria-hidden=\"true\"\r\n >\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\"></line>\r\n </svg>\r\n }\r\n </span>\r\n\r\n <!-- Ripple effect (when not disabled) -->\r\n @if (!disableRipple() && !disabled()) {\r\n <span class=\"fui-checkbox__ripple\"></span>\r\n }\r\n </span>\r\n\r\n <!-- Label after checkbox (default) -->\r\n @if (labelPosition() === 'after') {\r\n <span class=\"fui-checkbox__label fui-checkbox__label--after\">\r\n <ng-content></ng-content>\r\n </span>\r\n }\r\n</label>\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"raintonic-formaui-components-data-table.mjs","sources":["../../../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 {\n ChangeDetectionStrategy,\n Component,\n computed,\n ElementRef,\n input,\n output,\n signal,\n ViewChild,\n ViewEncapsulation,\n} from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { FormsModule } from '@angular/forms';\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\nimport { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\nimport { FuiMenuComponent, FuiMenuTriggerDirective } from '@raintonic/formaui/components/menu';\nimport { FuiSelectComponent } from '@raintonic/formaui/components/select';\nimport { FuiOptionComponent } from '@raintonic/formaui/components/select';\nimport { FuiTooltipDirective } from '@raintonic/formaui/components/tooltip';\nimport { FuiIconComponent } from '@raintonic/formaui/components/icon';\nimport { FuiBadgeComponent } from '@raintonic/formaui/components/badge';\n\n/**\n * Label configuration for badge rendering in table cells.\n * Mirrors IIndexConfigurationLabel from @zero/api-models — duplicated\n * intentionally because FormaUI cannot depend on api-models.\n */\nexport interface AdvancedDataTableLabelConfig {\n value: string;\n label: string;\n color: string;\n icon?: string;\n}\n\n/**\n * Configuration for a table header column\n */\nexport interface AdvancedDataTableHeader {\n /**\n * Whether this column should be sticky at the start\n * Only applies to columns at the start of the array until first false is encountered\n */\n stickyColumnStart?: boolean;\n\n /**\n * Whether this column should be sticky at the end\n * First true value makes all following columns sticky\n */\n stickyColumnEnd?: boolean;\n\n /**\n * Display label for the column header\n */\n label: string;\n\n /**\n * Data type of the column (e.g., 'string', 'number', 'date', 'boolean')\n */\n type: string;\n\n /**\n * Property path in the data object (e.g., 'user.name', 'address.city')\n * Format: <entityName>.<property>, can have multiple levels for nested objects\n */\n field: string;\n\n /**\n * Whether this column supports sorting\n */\n hasSort?: boolean;\n\n /**\n * Whether this column supports filtering\n */\n hasFilter?: boolean;\n\n labels?: AdvancedDataTableLabelConfig[];\n}\n\n/**\n * Configuration for the advanced data table\n */\n/**\n * Processed header with computed sticky positioning\n */\nexport interface ProcessedDataTableHeader extends AdvancedDataTableHeader {\n isStartSticky: boolean;\n isEndSticky: boolean;\n isLastStartSticky: boolean;\n isFirstEndSticky: boolean;\n startStickyPosition: number;\n endStickyPosition: number;\n}\n\nexport interface AdvancedDataTableConfig {\n /**\n * Whether the table header should be sticky\n */\n headerSticky?: boolean;\n\n /**\n * Array of header column configurations\n */\n headers: AdvancedDataTableHeader[];\n\n /**\n * Whether rows can be selected via checkboxes\n */\n areRowsSelectable?: boolean;\n}\n\n/**\n * Filter operator types\n */\nexport enum FilterOperator {\n // String operators\n CONTAINS = 'CONTAINS',\n START_WITH = 'START_WITH',\n END_WITH = 'END_WITH',\n EQUAL = 'EQUAL',\n NOT_EQUAL = 'NOT_EQUAL',\n\n // Number and Date operators\n GREATER = 'GREATER',\n GREATER_EQUAL = 'GREATER_EQUAL',\n LOWER = 'LOWER',\n LOWER_EQUAL = 'LOWER_EQUAL',\n BETWEEN = 'BETWEEN',\n\n // Boolean operators\n IS_TRUE = 'IS_TRUE',\n IS_FALSE = 'IS_FALSE',\n}\n\n/**\n * Filter configuration for a column\n */\nexport interface ColumnFilter {\n field: string;\n operator: FilterOperator;\n value: string | number | boolean | Date | (string | number | Date)[];\n}\n\n/**\n * Filter operator option\n */\ninterface FilterOperatorOption {\n value: FilterOperator;\n label: string;\n requiresInput: boolean;\n requiresSecondInput: boolean;\n}\n\n/**\n * @component FuiAdvancedDataTableComponent\n * @selector fui-advanced-data-table\n * @description A feature-rich data table with configurable columns, sticky headers/columns,\n * row selection via checkboxes, sorting, column filtering, row highlighting, and badge-based label rendering.\n *\n * @input config - (required) Table configuration including headers, sticky settings, and row selectability.\n * @input data - Array of row data objects. Default [].\n * @input enableRowHighlight - Whether clicking a row toggles highlight. Default false.\n * @input tableAriaLabel - Accessible label for the table element. Default 'Data table'.\n * @input emptyMessage - Message shown when data is empty. Default 'Nessun dato disponibile'.\n * @input sort - Current sort state: { field, direction } or null.\n * @input filters - Array of active column filters.\n * @output sortChange - Emits when the user changes sort direction on a column.\n * @output filtersChange - Emits when filters are applied or cleared.\n * @output rowDblClick - Emits the row data object on double-click.\n *\n * @example\n * <fui-advanced-data-table\n * [config]=\"tableConfig\"\n * [data]=\"rows\"\n * [sort]=\"currentSort\"\n * (sortChange)=\"onSort($event)\"\n * (filtersChange)=\"onFilter($event)\"\n * (rowDblClick)=\"onRowOpen($event)\">\n * </fui-advanced-data-table>\n */\n@Component({\n selector: 'fui-advanced-data-table',\n standalone: true,\n imports: [\n CommonModule,\n FormsModule,\n FuiFormFieldComponent,\n FuiInputDirective,\n FuiButtonDirective,\n FuiMenuComponent,\n FuiMenuTriggerDirective,\n FuiSelectComponent,\n FuiOptionComponent,\n FuiTooltipDirective,\n FuiIconComponent,\n FuiBadgeComponent,\n ],\n templateUrl: './advanced-data-table.component.html',\n styleUrl: './advanced-data-table.component.scss',\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'fui-advanced-data-table',\n },\n})\nexport class FuiAdvancedDataTableComponent<T = Record<string, unknown>> {\n /**\n * Table configuration\n */\n readonly config = input.required<AdvancedDataTableConfig>();\n\n /**\n * Data to display in the table\n */\n readonly data = input<T[]>([]);\n\n /**\n * Track-by function for row rendering performance.\n * Defaults to tracking by index.\n */\n readonly trackBy = input<(index: number, item: T) => unknown>((index: number) => index);\n\n /**\n * Enable click-to-highlight feature for rows\n */\n readonly enableRowHighlight = input(false);\n\n /**\n * Accessible label for the table\n */\n readonly tableAriaLabel = input('Data table');\n\n @ViewChild('liveAnnouncer') private _liveAnnouncer?: ElementRef<HTMLElement>;\n\n /**\n * Message shown when the data array is empty. Pass empty string to hide.\n */\n readonly emptyMessage = input('Nessun dato disponibile');\n\n /**\n * Current sort configuration\n */\n readonly sort = input<{ field: string; direction: 'ASC' | 'DESC' } | null>(null);\n\n /**\n * Event emitted when sort changes\n */\n readonly sortChange = output<{ field: string; direction: 'ASC' | 'DESC' } | null>();\n\n /**\n * Current filters\n */\n readonly filters = input<ColumnFilter[]>([]);\n\n /**\n * Event emitted when filters change\n */\n readonly filtersChange = output<ColumnFilter[]>();\n\n /**\n * Row dblClick event\n */\n readonly rowDblClick = output<T>();\n\n /**\n * Internal state for selected row indices\n */\n readonly selectedRows = signal(new Set());\n\n /**\n * Internal state for highlighted row indices\n */\n readonly highlightedRows = signal(new Set());\n\n /**\n * Temporary filter state while editing filter menu\n */\n tempFilterOperator: FilterOperator | null = null;\n tempFilterValue = '';\n tempFilterValue2 = '';\n\n /**\n * Whether all rows are selected\n */\n readonly allRowsSelected = computed(() => {\n const dataLength = this.data().length;\n return dataLength > 0 && this.selectedRows().size === dataLength;\n });\n\n /**\n * Whether some (but not all) rows are selected\n */\n readonly someRowsSelected = computed(() => {\n const selected = this.selectedRows().size;\n return selected > 0 && selected < this.data().length;\n });\n\n /**\n * Computed headers with sticky information\n */\n readonly processedHeaders = computed(() => {\n const headers = this.config().headers;\n const processed = headers.map((header) => ({\n ...header,\n isStartSticky: false,\n isEndSticky: false,\n isLastStartSticky: false,\n isFirstEndSticky: false,\n startStickyPosition: 0,\n endStickyPosition: 0,\n }));\n\n // Process start sticky columns (consecutive from start)\n let startStickyLeft = 0;\n let lastStartStickyIndex = -1;\n for (let i = 0; i < processed.length; i++) {\n if (headers[i].stickyColumnStart) {\n processed[i].isStartSticky = true;\n processed[i].startStickyPosition = startStickyLeft;\n startStickyLeft += 150; // Default column width, will be adjusted by CSS\n lastStartStickyIndex = i;\n } else {\n // Stop once we find a non-sticky-start column\n break;\n }\n }\n\n // Mark the last sticky-start column for border\n if (lastStartStickyIndex >= 0) {\n processed[lastStartStickyIndex].isLastStartSticky = true;\n }\n\n // Process end sticky columns (consecutive from end)\n // First, find the start index of consecutive stickyColumnEnd columns from the end\n let endStickyStartIndex = processed.length;\n for (let i = processed.length - 1; i >= 0; i--) {\n if (headers[i].stickyColumnEnd) {\n endStickyStartIndex = i;\n } else {\n // Stop once we find a non-sticky-end column\n break;\n }\n }\n\n // Now calculate positions for sticky end columns (right position accumulates from rightmost)\n let endStickyRight = 0;\n for (let i = processed.length - 1; i >= endStickyStartIndex; i--) {\n processed[i].isEndSticky = true;\n processed[i].endStickyPosition = endStickyRight;\n endStickyRight += 150; // Default column width, will be adjusted by CSS\n }\n\n // Mark the first sticky-end column for border\n if (endStickyStartIndex < processed.length) {\n processed[endStickyStartIndex].isFirstEndSticky = true;\n }\n\n return processed;\n });\n\n /**\n * Get header classes\n */\n getHeaderClasses(header: ProcessedDataTableHeader): string {\n const classes = ['fui-advanced-data-table__header-cell'];\n if (header.isStartSticky) {\n classes.push('fui-advanced-data-table__header-cell--sticky-start');\n }\n if (header.isLastStartSticky) {\n classes.push('fui-advanced-data-table__header-cell--sticky-start-edge');\n }\n if (header.isEndSticky) {\n classes.push('fui-advanced-data-table__header-cell--sticky-end');\n }\n if (header.isFirstEndSticky) {\n classes.push('fui-advanced-data-table__header-cell--sticky-end-edge');\n }\n return classes.join(' ');\n }\n\n /**\n * Get cell classes\n */\n getCellClasses(header: ProcessedDataTableHeader): string {\n const classes = ['fui-advanced-data-table__cell'];\n if (header.isStartSticky) {\n classes.push('fui-advanced-data-table__cell--sticky-start');\n }\n if (header.isLastStartSticky) {\n classes.push('fui-advanced-data-table__cell--sticky-start-edge');\n }\n if (header.isEndSticky) {\n classes.push('fui-advanced-data-table__cell--sticky-end');\n }\n if (header.isFirstEndSticky) {\n classes.push('fui-advanced-data-table__cell--sticky-end-edge');\n }\n return classes.join(' ');\n }\n\n /**\n * Get header styles for sticky positioning\n */\n getHeaderStyles(header: ProcessedDataTableHeader): Record<string, string> {\n const styles: Record<string, string> = {};\n if (header.isStartSticky) {\n styles['left'] = `${header.startStickyPosition}px`;\n }\n if (header.isEndSticky) {\n styles['right'] = `${header.endStickyPosition}px`;\n }\n return styles;\n }\n\n /**\n * Get cell styles for sticky positioning\n */\n getCellStyles(header: ProcessedDataTableHeader): Record<string, string> {\n return this.getHeaderStyles(header);\n }\n\n /**\n * Extract value from nested object using dot notation\n */\n getCellValue(row: T, columnPath: string): unknown {\n if (!row || !columnPath) return '';\n\n const keys = columnPath.split('.');\n let value: unknown = row as unknown;\n\n for (const key of keys) {\n if (value === null || value === undefined) {\n return '';\n }\n value = (value as Record<string, unknown>)[key];\n }\n\n return value ?? '';\n }\n\n /**\n * Format cell value based on type\n */\n formatCellValue(value: unknown, type: string): string {\n if (value === null || value === undefined || value === '') {\n return '';\n }\n\n switch (type.toLowerCase()) {\n case 'string':\n return String(value);\n case 'number':\n return typeof value === 'number' ? value.toLocaleString() : String(value);\n case 'boolean':\n return value ? 'Yes' : 'No';\n case 'date':\n if (value instanceof Date) {\n return value.toLocaleDateString();\n }\n return new Date(value as string | number).toLocaleDateString();\n default:\n return String(value);\n }\n }\n\n /**\n * Toggle all rows selection\n */\n toggleAllRows(): void {\n const currentlyAllSelected = this.allRowsSelected();\n if (currentlyAllSelected) {\n this.selectedRows.set(new Set());\n } else {\n const allIndices = new Set(this.data().map((_, index) => index));\n this.selectedRows.set(allIndices);\n }\n }\n\n /**\n * Toggle single row selection\n */\n toggleRow(index: number): void {\n const selected = new Set(this.selectedRows());\n if (selected.has(index)) {\n selected.delete(index);\n } else {\n selected.add(index);\n }\n this.selectedRows.set(selected);\n }\n\n /**\n * Check if a row is selected\n */\n isRowSelected(index: number): boolean {\n return this.selectedRows().has(index);\n }\n\n /**\n * Toggle row highlight (only if enableRowHighlight is true)\n */\n toggleRowHighlight(index: number): void {\n if (!this.enableRowHighlight()) {\n return;\n }\n\n const highlighted = new Set(this.highlightedRows());\n if (highlighted.has(index)) {\n highlighted.delete(index);\n } else {\n highlighted.add(index);\n }\n this.highlightedRows.set(highlighted);\n }\n\n /**\n * Check if a row is highlighted\n */\n isRowHighlighted(index: number): boolean {\n return this.highlightedRows().has(index);\n }\n\n /**\n * Get ARIA sort value for a column header\n */\n getAriaSortValue(field: string): 'ascending' | 'descending' | 'none' | null {\n const currentSort = this.sort();\n // Only return aria-sort for sortable columns that have sort config\n const header = this.config().headers.find((h) => h.field === field);\n if (!header?.hasSort) return null;\n\n if (currentSort?.field !== field) return 'none';\n return currentSort.direction === 'ASC' ? 'ascending' : 'descending';\n }\n\n /**\n * Handle sort button click\n * Cycles through: ASC → DESC → null (no sort)\n */\n onSortClick(field: string): void {\n const currentSort = this.sort();\n\n if (currentSort?.field !== field) {\n // No sort or different field: set to ASC\n this.sortChange.emit({ field, direction: 'ASC' });\n this._announce(`Sorted ascending`);\n } else if (currentSort.direction === 'ASC') {\n // Currently ASC: change to DESC\n this.sortChange.emit({ field, direction: 'DESC' });\n this._announce(`Sorted descending`);\n } else {\n // Currently DESC: remove sort\n this.sortChange.emit(null);\n this._announce(`Sort removed`);\n }\n }\n\n /**\n * Get sort icon classes for a header\n */\n getSortIconClasses(field: string): string {\n const currentSort = this.sort();\n const classes = ['fui-advanced-data-table__sort-icon'];\n\n if (currentSort?.field === field) {\n if (currentSort.direction === 'ASC') {\n classes.push('fui-advanced-data-table__sort-icon--asc');\n } else {\n classes.push('fui-advanced-data-table__sort-icon--desc');\n }\n }\n\n return classes.join(' ');\n }\n\n /**\n * Get available filter operators for a column type\n */\n getFilterOperators(type: string): FilterOperatorOption[] {\n const normalizedType = type.toLowerCase();\n\n switch (normalizedType) {\n case 'string':\n return [\n { value: FilterOperator.CONTAINS, label: 'Contiene', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.START_WITH, label: 'Inizia con', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.END_WITH, label: 'Finisce con', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\n ];\n\n case 'number':\n return [\n { value: FilterOperator.GREATER, label: 'Maggiore di', requiresInput: true, requiresSecondInput: false },\n {\n value: FilterOperator.GREATER_EQUAL,\n label: 'Maggiore o uguale',\n requiresInput: true,\n requiresSecondInput: false,\n },\n { value: FilterOperator.LOWER, label: 'Minore di', requiresInput: true, requiresSecondInput: false },\n {\n value: FilterOperator.LOWER_EQUAL,\n label: 'Minore o uguale',\n requiresInput: true,\n requiresSecondInput: false,\n },\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\n ];\n\n case 'date':\n return [\n { value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.NOT_EQUAL, label: 'Diverso', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.GREATER, label: 'Dopo', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.GREATER_EQUAL, label: 'Dal', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.LOWER, label: 'Prima', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.LOWER_EQUAL, label: 'Fino al', requiresInput: true, requiresSecondInput: false },\n { value: FilterOperator.BETWEEN, label: 'Compreso tra', requiresInput: true, requiresSecondInput: true },\n ];\n\n case 'boolean':\n return [\n { value: FilterOperator.IS_TRUE, label: 'Vero', requiresInput: false, requiresSecondInput: false },\n { value: FilterOperator.IS_FALSE, label: 'Falso', requiresInput: false, requiresSecondInput: false },\n ];\n\n case 'label':\n return [{ value: FilterOperator.EQUAL, label: 'Uguale', requiresInput: true, requiresSecondInput: false }];\n\n default:\n return [];\n }\n }\n\n getLabelConfig(value: unknown, labels: AdvancedDataTableLabelConfig[]): AdvancedDataTableLabelConfig | null {\n return labels.find((l) => l.value === String(value)) ?? null;\n }\n\n /**\n * Initialize filter form for a field\n * Called when menu is opened\n */\n initFilterForm(field: string, type: string): void {\n if (type === 'label') {\n const existingFilter = this.filters().find((f) => f.field === field);\n this.tempFilterOperator = FilterOperator.EQUAL;\n this.tempFilterValue = existingFilter ? String(existingFilter.value || '') : '';\n this.tempFilterValue2 = '';\n return;\n }\n\n // Check if there's an existing filter for this field\n const existingFilter = this.filters().find((f) => f.field === field);\n if (existingFilter) {\n this.tempFilterOperator = existingFilter.operator;\n if (Array.isArray(existingFilter.value)) {\n this.tempFilterValue = String(existingFilter.value[0] || '');\n this.tempFilterValue2 = String(existingFilter.value[1] || '');\n } else {\n this.tempFilterValue = String(existingFilter.value || '');\n this.tempFilterValue2 = '';\n }\n } else {\n // Set default operator for the type\n const operators = this.getFilterOperators(type);\n this.tempFilterOperator = operators[0]?.value || null;\n this.tempFilterValue = '';\n this.tempFilterValue2 = '';\n }\n }\n\n /**\n * Reset filter form\n */\n resetFilterForm(): void {\n this.tempFilterOperator = null;\n this.tempFilterValue = '';\n this.tempFilterValue2 = '';\n }\n\n /**\n * Apply filter for a field\n */\n applyFilter(field: string, type: string, menu?: FuiMenuComponent): void {\n const operator = this.tempFilterOperator;\n if (!operator) return;\n\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\n if (!operatorConfig) return;\n\n let value: string | number | boolean | Date | (string | number | Date)[];\n\n // For boolean operators, no input is needed\n if (!operatorConfig.requiresInput) {\n value = operator === FilterOperator.IS_TRUE;\n }\n // For BETWEEN operator, use array with two values\n else if (operatorConfig.requiresSecondInput) {\n const val1 = this.parseValueByType(this.tempFilterValue, type);\n const val2 = this.parseValueByType(this.tempFilterValue2, type);\n value = [val1, val2] as (string | number | Date)[];\n }\n // For single value operators\n else {\n value = this.parseValueByType(this.tempFilterValue, type);\n }\n\n // Update filters array\n const currentFilters = this.filters().filter((f) => f.field !== field);\n const newFilter: ColumnFilter = { field, operator, value };\n\n this.filtersChange.emit([...currentFilters, newFilter]);\n this.resetFilterForm();\n this._announce(`Filter applied`);\n menu?.close();\n }\n\n /**\n * Clear filter for a field\n */\n clearFilter(field: string, menu?: FuiMenuComponent): void {\n const currentFilters = this.filters().filter((f) => f.field !== field);\n this.filtersChange.emit(currentFilters);\n this.resetFilterForm();\n this._announce(`Filter cleared`);\n menu?.close();\n }\n\n /**\n * Parse value by column type\n */\n private parseValueByType(value: string, type: string): string | number | Date {\n const normalizedType = type.toLowerCase();\n\n switch (normalizedType) {\n case 'number':\n return Number(value);\n case 'date':\n return new Date(value);\n case 'label':\n return value;\n default:\n return value;\n }\n }\n\n /**\n * Announce a message to screen readers via live region\n */\n private _announce(message: string): void {\n if (this._liveAnnouncer?.nativeElement) {\n this._liveAnnouncer.nativeElement.textContent = message;\n }\n }\n\n /**\n * Check if a field has an active filter\n */\n hasActiveFilter(field: string): boolean {\n return this.filters().some((f) => f.field === field);\n }\n\n /**\n * Get filter icon classes\n */\n getFilterIconClasses(field: string): string {\n const classes = ['fui-advanced-data-table__filter-icon'];\n if (this.hasActiveFilter(field)) {\n classes.push('fui-advanced-data-table__filter-icon--active');\n }\n return classes.join(' ');\n }\n\n /**\n * Check if current operator requires second input\n */\n requiresSecondInput(type: string): boolean {\n const operator = this.tempFilterOperator;\n if (!operator) return false;\n\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\n return operatorConfig?.requiresSecondInput ?? false;\n }\n\n /**\n * Check if current operator requires any input\n */\n requiresInput(type: string): boolean {\n const operator = this.tempFilterOperator;\n if (!operator) return false;\n\n const operatorConfig = this.getFilterOperators(type).find((op) => op.value === operator);\n return operatorConfig?.requiresInput ?? false;\n }\n}\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 <table\r\n class=\"fui-advanced-data-table__table\"\r\n role=\"grid\"\r\n [attr.aria-label]=\"tableAriaLabel()\"\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 >\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 <input\r\n type=\"checkbox\"\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"allRowsSelected()\"\r\n [indeterminate]=\"someRowsSelected()\"\r\n (change)=\"toggleAllRows()\"\r\n aria-label=\"Select all rows\"\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 (click)=\"onSortClick(header.field)\"\r\n [attr.aria-label]=\"'Sort by ' + header.label\"\r\n fuiTooltip=\"Ordina\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\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 fuiMenuTrigger\r\n [menuTriggerFor]=\"filterMenu\"\r\n [menuTriggerData]=\"{ field: header.field, type: header.type }\"\r\n [attr.aria-label]=\"'Filter ' + header.label\"\r\n fuiTooltip=\"Filtra\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\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-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 [(ngModel)]=\"tempFilterOperator\" placeholder=\"Seleziona operatore\">\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 placeholder=\"Inserisci valore\"\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 placeholder=\"Inserisci valore finale\"\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 [(ngModel)]=\"tempFilterValue\" placeholder=\"Seleziona valore\">\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 Applica\r\n </button>\r\n <button fuiButton variant=\"outline\" size=\"sm\" (click)=\"clearFilter(header.field, filterMenu)\">\r\n Pulisci\r\n </button>\r\n </div>\r\n </div>\r\n </fui-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 && emptyMessage()) {\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 {{ emptyMessage() }}\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 >\r\n <input\r\n type=\"checkbox\"\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"isRowSelected($index)\"\r\n (change)=\"toggleRow($index)\"\r\n [attr.aria-label]=\"'Select row ' + ($index + 1)\"\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 {\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/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 {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n input,\r\n output,\r\n signal,\r\n ViewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { FuiButtonDirective } from '@raintonic/formaui/components/button';\r\nimport { FuiInputDirective } from '@raintonic/formaui/components/input';\r\nimport { FuiFormFieldComponent } from '@raintonic/formaui/components/form-field';\r\nimport { FuiMenuComponent, FuiMenuTriggerDirective } from '@raintonic/formaui/components/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 * 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 (e.g., 'string', 'number', 'date', 'boolean')\r\n */\r\n type: string;\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 'Nessun dato disponibile'.\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 FuiFormFieldComponent,\r\n FuiInputDirective,\r\n FuiButtonDirective,\r\n FuiMenuComponent,\r\n FuiMenuTriggerDirective,\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 },\r\n})\r\nexport class FuiAdvancedDataTableComponent<T = Record<string, unknown>> {\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 * Accessible label for the table\r\n */\r\n readonly tableAriaLabel = input('Data table');\r\n\r\n @ViewChild('liveAnnouncer') private _liveAnnouncer?: ElementRef<HTMLElement>;\r\n\r\n /**\r\n * Message shown when the data array is empty. Pass empty string to hide.\r\n */\r\n readonly emptyMessage = input('Nessun dato disponibile');\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 tempFilterOperator: FilterOperator | null = null;\r\n tempFilterValue = '';\r\n tempFilterValue2 = '';\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: string): 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: string): 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: string): void {\r\n if (type === 'label') {\r\n const existingFilter = this.filters().find((f) => f.field === field);\r\n this.tempFilterOperator = FilterOperator.EQUAL;\r\n this.tempFilterValue = existingFilter ? String(existingFilter.value || '') : '';\r\n this.tempFilterValue2 = '';\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 = existingFilter.operator;\r\n if (Array.isArray(existingFilter.value)) {\r\n this.tempFilterValue = String(existingFilter.value[0] || '');\r\n this.tempFilterValue2 = String(existingFilter.value[1] || '');\r\n } else {\r\n this.tempFilterValue = String(existingFilter.value || '');\r\n this.tempFilterValue2 = '';\r\n }\r\n } else {\r\n // Set default operator for the type\r\n const operators = this.getFilterOperators(type);\r\n this.tempFilterOperator = operators[0]?.value || null;\r\n this.tempFilterValue = '';\r\n this.tempFilterValue2 = '';\r\n }\r\n }\r\n\r\n /**\r\n * Reset filter form\r\n */\r\n resetFilterForm(): void {\r\n this.tempFilterOperator = null;\r\n this.tempFilterValue = '';\r\n this.tempFilterValue2 = '';\r\n }\r\n\r\n /**\r\n * Apply filter for a field\r\n */\r\n applyFilter(field: string, type: string, menu?: FuiMenuComponent): 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?: FuiMenuComponent): 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: string): 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: string): 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: string): 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 <table\r\n class=\"fui-advanced-data-table__table\"\r\n role=\"grid\"\r\n [attr.aria-label]=\"tableAriaLabel()\"\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 >\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 <input\r\n type=\"checkbox\"\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"allRowsSelected()\"\r\n [indeterminate]=\"someRowsSelected()\"\r\n (change)=\"toggleAllRows()\"\r\n aria-label=\"Select all rows\"\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 (click)=\"onSortClick(header.field)\"\r\n [attr.aria-label]=\"'Sort by ' + header.label\"\r\n fuiTooltip=\"Ordina\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\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 fuiMenuTrigger\r\n [menuTriggerFor]=\"filterMenu\"\r\n [menuTriggerData]=\"{ field: header.field, type: header.type }\"\r\n [attr.aria-label]=\"'Filter ' + header.label\"\r\n fuiTooltip=\"Filtra\"\r\n fuiTooltipSize=\"sm\"\r\n fuiTooltipPosition=\"bottom\"\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-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 [(ngModel)]=\"tempFilterOperator\" placeholder=\"Seleziona operatore\">\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 placeholder=\"Inserisci valore\"\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 placeholder=\"Inserisci valore finale\"\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 [(ngModel)]=\"tempFilterValue\" placeholder=\"Seleziona valore\">\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 Applica\r\n </button>\r\n <button fuiButton variant=\"outline\" size=\"sm\" (click)=\"clearFilter(header.field, filterMenu)\">\r\n Pulisci\r\n </button>\r\n </div>\r\n </div>\r\n </fui-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 && emptyMessage()) {\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 {{ emptyMessage() }}\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 >\r\n <input\r\n type=\"checkbox\"\r\n class=\"fui-advanced-data-table__checkbox\"\r\n [checked]=\"isRowSelected($index)\"\r\n (change)=\"toggleRow($index)\"\r\n [attr.aria-label]=\"'Select row ' + ($index + 1)\"\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 {\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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"}