{"version":3,"file":"eqproject-eqp-table.mjs","sources":["../../../projects/eqp-table/src/lib/eqp-table.service.ts","../../../projects/eqp-table/src/lib/internal-components/filter-component/filter.component.ts","../../../projects/eqp-table/src/lib/internal-components/filter-component/filter.component.html","../../../projects/eqp-table/src/lib/helpers/translateTable.helper.ts","../../../projects/eqp-table/src/lib/internal-components/eqp-table-exporter/eqp-table-exporter.component.ts","../../../projects/eqp-table/src/lib/internal-components/eqp-table-exporter/eqp-table-exporter.component.html","../../../projects/eqp-table/src/lib/helpers/enum.helper.ts","../../../projects/eqp-table/src/lib/helpers/columnValue.helper.ts","../../../projects/eqp-table/src/lib/helpers/columnAccessibility.helper.ts","../../../projects/eqp-table/src/lib/helpers/columnStyle.helper.ts","../../../projects/eqp-table/src/lib/internal-components/custom-buttons/custom-buttons.component.ts","../../../projects/eqp-table/src/lib/internal-components/custom-buttons/custom-buttons.component.html","../../../projects/eqp-table/src/lib/internal-components/boolean-column/boolean-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/boolean-column/boolean-column.component.html","../../../projects/eqp-table/src/lib/internal-components/color-column/color-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/color-column/color-column.component.html","../../../projects/eqp-table/src/lib/internal-components/date-column/date-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/date-column/date-column.component.html","../../../projects/eqp-table/src/lib/internal-components/enum-column/enum-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/enum-column/enum-column.component.html","../../../projects/eqp-table/src/lib/internal-components/checkbox-column/checkbox-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/checkbox-column/checkbox-column.component.html","../../../projects/eqp-table/src/lib/internal-components/icon-column/icon-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/icon-column/icon-column.component.html","../../../projects/eqp-table/src/lib/internal-components/hyperlink-column/hyperlink-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/hyperlink-column/hyperlink-column.component.html","../../../projects/eqp-table/src/lib/internal-components/image-column/image-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/image-column/image-column.component.html","../../../projects/eqp-table/src/lib/helpers/columnPipe.helper.ts","../../../projects/eqp-table/src/lib/internal-components/standard-column/standard-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/standard-column/standard-column.component.html","../../../projects/eqp-table/src/lib/internal-components/navigate-column/navigate-column.component.ts","../../../projects/eqp-table/src/lib/internal-components/navigate-column/navigate-column.component.html","../../../projects/eqp-table/src/lib/internal-components/goto-page/goto-page.component.ts","../../../projects/eqp-table/src/lib/internal-components/goto-page/goto-page.component.html","../../../projects/eqp-table/src/lib/helpers/paginator-intl.helper.ts","../../../projects/eqp-table/src/lib/internal-components/base-component/base.component.ts","../../../projects/eqp-table/src/lib/helpers/searchFilter.helper.ts","../../../projects/eqp-table/src/lib/helpers/sorting.helper.ts","../../../projects/eqp-table/src/lib/helpers/resize.helper.ts","../../../projects/eqp-table/src/lib/directives/mat-table-exporter.directive.ts","../../../projects/eqp-table/src/lib/eqp-table.component.ts","../../../projects/eqp-table/src/lib/eqp-table.component.html","../../../projects/eqp-table/src/lib/modules/material.module.ts","../../../projects/eqp-table/src/lib/eqp-table.module.ts","../../../projects/eqp-table/src/public-api.ts","../../../projects/eqp-table/src/eqproject-eqp-table.ts"],"sourcesContent":["import { registerLocaleData } from '@angular/common';\r\nimport { Injectable } from '@angular/core';\r\nimport localeIT from '@angular/common/locales/it';\r\nimport localeEN from '@angular/common/locales/en';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\nexport class EqpTableService {\r\n\r\n  selectedLanguage: string = \"it-IT\";\r\n  currentCultureSelected: string;\r\n  currentLocaleSelected: string;\r\n\r\n  constructor() { }\r\n\r\n  setLanguage(languageType: string) {\r\n    if (!languageType)\r\n      return;\r\n\r\n    this.selectedLanguage = languageType;\r\n  }\r\n\r\n  getLanguage() {\r\n    return this.selectedLanguage;\r\n  }\r\n\r\n  getDatePipe() {\r\n    return this.currentCultureSelected;\r\n  }\r\n\r\n  getCurrentLocale() {\r\n    return this.currentLocaleSelected;\r\n  }\r\n\r\n  initPossibileLanguages() {\r\n    if (this.getLanguage() == \"it-IT\") {\r\n      registerLocaleData(localeIT);\r\n      this.currentCultureSelected = \"it-IT\";\r\n      this.currentLocaleSelected = \"it\";\r\n    }\r\n    else if (this.getLanguage() == \"en-US\") {\r\n      registerLocaleData(localeEN);\r\n      this.currentCultureSelected = \"en-US\";\r\n      this.currentLocaleSelected = \"en\";\r\n    }\r\n  }\r\n\r\n}\r\n","import { Component, Input, OnInit, input, output } from \"@angular/core\";\r\nimport { EqpFiltersModule } from \"@eqproject/eqp-filters\";\r\nimport { FilterObject } from \"./filter.model\";\r\nimport { FilterMode, FilterResultType } from \"@eqproject/eqp-common\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-filter\",\r\n  templateUrl: \"./filter.component.html\",\r\n  styleUrl: \"./filter.component.scss\",\r\n  standalone: true,\r\n  imports: [EqpFiltersModule],\r\n})\r\nexport class EqpTableFilterComponent implements OnInit {\r\n  readonly tableColumnFields = input<Array<ConfigColumn>>(undefined);\r\n  /**\r\n   * Mantenuto come @Input() perché viene riassegnato in createStandardFilterObject()\r\n   * (this.filterObject = {...}) — signal-input non è scrivibile.\r\n   */\r\n  @Input() filterObject: FilterObject;\r\n  readonly filtersSelected = output<any>();\r\n  readonly customFiltersSavedValueLoaded = output<any>();\r\n  defaultFilters: FilterObject;\r\n\r\n  constructor() {}\r\n\r\n  ngOnInit(): void {\r\n    this.createStandardFilterObject();\r\n\r\n    //Visto che il campo è nullable, se non viene passato come proprietà nell'oggetto dell'array viene considerato null\r\n    //quindi in quel caso lo considero come true di default\r\n    if (this.filterObject != null) {\r\n      this.tableColumnFields().forEach((element) => {\r\n        element.isFilterable =\r\n          element.isFilterable == null ? true : element.isFilterable;\r\n      });\r\n    }\r\n  }\r\n\r\n  createStandardFilterObject() {\r\n    this.initializeDefaultFilters();\r\n    // Definizione dei valori predefiniti per tutte le proprietà\r\n    this.filterObject = {\r\n      resultType:\r\n        this.filterObject?.resultType ?? this.defaultFilters.resultType,\r\n      usingMode: this.filterObject?.usingMode ?? this.defaultFilters.usingMode,\r\n      filterTitle:\r\n        this.filterObject?.filterTitle ?? this.defaultFilters.filterTitle,\r\n      filterAppliedTitle:\r\n        this.filterObject?.filterAppliedTitle ??\r\n        this.defaultFilters.filterAppliedTitle,\r\n      applyFilterLabel:\r\n        this.filterObject?.applyFilterLabel ??\r\n        this.defaultFilters.applyFilterLabel,\r\n      resetAllFilterLabel:\r\n        this.filterObject?.resetAllFilterLabel ??\r\n        this.defaultFilters.resetAllFilterLabel,\r\n      restoreAllFilterLabel:\r\n        this.filterObject?.restoreAllFilterLabel ??\r\n        this.defaultFilters.restoreAllFilterLabel,\r\n      clearFilterTooltip:\r\n        this.filterObject?.clearFilterTooltip ??\r\n        this.defaultFilters.clearFilterTooltip,\r\n      showExpandend:\r\n        this.filterObject?.showExpandend ?? this.defaultFilters.showExpandend,\r\n      currentCultureSelected:\r\n        this.filterObject?.currentCultureSelected ??\r\n        this.defaultFilters.currentCultureSelected,\r\n      applyOnInit:\r\n        this.filterObject?.applyOnInit ?? this.defaultFilters.applyOnInit,\r\n      saveFilter:\r\n        this.filterObject?.saveFilter ?? this.defaultFilters.saveFilter,\r\n      saveFilterID:\r\n        this.filterObject?.saveFilterID ?? this.defaultFilters.saveFilterID,\r\n      saveFilterButtonLabel:\r\n        this.filterObject?.saveFilterButtonLabel ??\r\n        this.defaultFilters.saveFilterButtonLabel,\r\n      saveFilterTitle:\r\n        this.filterObject?.saveFilterTitle ??\r\n        this.defaultFilters.saveFilterTitle,\r\n      saveFilterConfirmLabel:\r\n        this.filterObject?.saveFilterConfirmLabel ??\r\n        this.defaultFilters.saveFilterConfirmLabel,\r\n      saveFilterAbortLabel:\r\n        this.filterObject?.saveFilterAbortLabel ??\r\n        this.defaultFilters.saveFilterAbortLabel,\r\n      savedFilterLabel:\r\n        this.filterObject?.savedFilterLabel ??\r\n        this.defaultFilters.savedFilterLabel,\r\n      restoreSavedFilterTooltip:\r\n        this.filterObject?.restoreSavedFilterTooltip ??\r\n        this.defaultFilters.restoreSavedFilterTooltip,\r\n      removeSavedFilterTooltip:\r\n        this.filterObject?.removeSavedFilterTooltip ??\r\n        this.defaultFilters.removeSavedFilterTooltip,\r\n      useInitialValueOnReset:\r\n        this.filterObject?.useInitialValueOnReset ??\r\n        this.defaultFilters.useInitialValueOnReset,\r\n      filterPreventRemovalTooltip:\r\n        this.filterObject?.filterPreventRemovalTooltip ??\r\n        this.defaultFilters.filterPreventRemovalTooltip,\r\n      saveLastFilter:\r\n        this.filterObject?.saveLastFilter ?? this.defaultFilters.saveLastFilter,\r\n      savedLastFilterName:\r\n        this.filterObject?.savedLastFilterName ??\r\n        this.defaultFilters.savedLastFilterName,\r\n      leftCollapseIcon:\r\n        this.filterObject?.leftCollapseIcon ??\r\n        this.defaultFilters.leftCollapseIcon,\r\n      showAppliedFiltersIcon:\r\n        this.filterObject?.showAppliedFiltersIcon ??\r\n        this.defaultFilters.showAppliedFiltersIcon,\r\n      complexFilters:\r\n        this.filterObject?.complexFilters ?? this.defaultFilters.complexFilters,\r\n    };\r\n  }\r\n\r\n  private initializeDefaultFilters() {\r\n    this.defaultFilters = {\r\n      resultType: FilterResultType.BASIC,\r\n      usingMode: FilterMode.WITH_CARD,\r\n      filterTitle: \"Filtri\",\r\n      filterAppliedTitle: \"Filtri applicati:\",\r\n      applyFilterLabel: \"Filtra\",\r\n      resetAllFilterLabel: \"Reset\",\r\n      restoreAllFilterLabel: \"Ripristina filtri iniziali\",\r\n      clearFilterTooltip: \"Clicca per rimuovere questo filtro\",\r\n      showExpandend: false,\r\n      currentCultureSelected: \"it-IT\",\r\n      applyOnInit: false,\r\n      saveFilter: false,\r\n      saveFilterID: null,\r\n      saveFilterButtonLabel: \"Salva filtro\",\r\n      saveFilterTitle: \"Inserire il nome per questo filtro\",\r\n      saveFilterConfirmLabel: \"Conferma\",\r\n      saveFilterAbortLabel: \"Annulla\",\r\n      savedFilterLabel: \"Filtri salvati\",\r\n      restoreSavedFilterTooltip: \"Ricarica filtro\",\r\n      removeSavedFilterTooltip: \"Elimina filtro\",\r\n      useInitialValueOnReset: true,\r\n      filterPreventRemovalTooltip: \"Non è possibile rimuovere questo filtro\",\r\n      saveLastFilter: false,\r\n      savedLastFilterName: \"Ultimi filtri usati\",\r\n      leftCollapseIcon: true,\r\n      showAppliedFiltersIcon: false,\r\n      complexFilters: [],\r\n    };\r\n  }\r\n\r\n  tableFiltersSelected(event) {\r\n    this.filtersSelected.emit(event);\r\n  }\r\n\r\n  tableCustomFiltersSavedValueLoaded(event) {\r\n    this.customFiltersSavedValueLoaded.emit(event);\r\n  }\r\n}\r\n","<div class=\"row\" style=\"margin-top: 20px\">\r\n  <div class=\"col-12\" style=\"margin: auto\">\r\n    <eqp-dynamic-filters\r\n      [saveLastFilter]=\"filterObject.saveLastFilter\"\r\n      [saveFilter]=\"filterObject.saveFilter\"\r\n      [saveFilterID]=\"filterObject.saveFilterID\"\r\n      [useInitialValueOnReset]=\"filterObject.useInitialValueOnReset\"\r\n      [saveFilterID]=\"filterObject.saveFilterID\"\r\n      [usingMode]=\"filterObject.usingMode\"\r\n      [resultType]=\"filterObject.resultType\"\r\n      [applyOnInit]=\"filterObject.applyOnInit\"\r\n      [leftCollapseIcon]=\"filterObject.leftCollapseIcon\"\r\n      [showAppliedFiltersIcon]=\"filterObject.showAppliedFiltersIcon\"\r\n      [eqpTableConfigColumns]=\"tableColumnFields()\"\r\n      [eqpTableAdditionalFilters]=\"filterObject.complexFilters\"\r\n      (customFiltersSavedValueLoaded)=\"\r\n        tableCustomFiltersSavedValueLoaded($event)\r\n      \"\r\n      (filtersSelected)=\"tableFiltersSelected($event)\"\r\n    >\r\n    </eqp-dynamic-filters>\r\n  </div>\r\n</div>\r\n<!--  -->\r\n\r\n<!-- <ng-template #externalFilter let-filter=\"filter\">\r\n    <mat-form-field>\r\n        <mat-label>{{ filter.Label }}</mat-label>\r\n        <input matInput [(ngModel)]=\"customFilterValue\" />\r\n    </mat-form-field>\r\n</ng-template> -->\r\n","import { Injectable, EventEmitter } from '@angular/core';\r\nimport { TranslateService } from '@ngx-translate/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\n\r\nexport class TranslateTableHelper {\r\n\r\n  /**\r\n   * Istanza del translate service, sarà necessario passare in input tutta l'istanza dal progetto dal quale lo si vuole utilizzare\r\n   */\r\n  translateService: TranslateService;\r\n\r\n  currentLanguage: string;\r\n\r\n  constructor() { }\r\n\r\n  /**\r\n   * \r\n   * @param key data una stringa presente nel json delle traduzioni, restituisco il suo valore tradotto secondo la lingua settata in precedenza\r\n   * @param multilanguagePrefixKey stringa dove sarà contenuto il prefisso della key, NB. è necessario inserire tutto il prefisso come scritto nel json(compresi i separatori)\r\n   */\r\n  returnTranslateValue(key: string, multilanguagePrefixKey: string) {\r\n    let tempPrefixKey = (multilanguagePrefixKey != null && multilanguagePrefixKey != undefined) ? multilanguagePrefixKey + key : key;\r\n    return this.translateService.instant(tempPrefixKey);\r\n  }\r\n\r\n  /**\r\n   * Data in input tutta l'istanza del servizio, viene utilizzata all'interno del componente\r\n   * @param translateServiceInput\r\n   */\r\n  loadTranslateService(translateServiceInput: TranslateService) {\r\n    this.translateService = translateServiceInput;\r\n  }\r\n\r\n  setTableLanguage(value: string) {\r\n    this.currentLanguage = value;\r\n  }\r\n\r\n  getCurrentLanguage() {\r\n    if (this.currentLanguage == null)\r\n      return this.currentLanguage = 'it-IT';\r\n    else\r\n      return this.currentLanguage;\r\n  }\r\n\r\n}\r\n","import { Component, Input, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { TranslateTableHelper } from \"../../helpers/translateTable.helper\";\r\nimport {\r\n  ConfigColumn,\r\n  ExportEqpTable,\r\n  TypeColumn,\r\n} from \"@eqproject/eqp-common\";\r\nimport { EqpMatTableExporterDirective } from \"../../directives/mat-table-exporter.directive\";\r\n\r\nexport enum ExportType {\r\n  XLS = \"xls\",\r\n  XLSX = \"xlsx\",\r\n  CSV = \"csv\",\r\n  TXT = \"txt\", // Nota: la direttiva mappa TXT su XLSX o CSV a seconda dell'implementazione, verifica se ti serve\r\n  JSON = \"json\",\r\n  PDF = \"pdf\",\r\n}\r\n\r\n@Component({\r\n  selector: \"eqp-table-exporter\",\r\n  templateUrl: \"eqp-table-exporter.component.html\", // Assicurati che l'HTML chiami runTableExporter(tipo)\r\n  styleUrls: [\"eqp-table-exporter.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatButtonModule, MatMenuModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class EqpTableExporterComponent implements OnInit {\r\n  //#region Definizione INPUT\r\n\r\n  /**\r\n   * Mantenuto come @Input() perché viene mutato in-place in configureExport()\r\n   * e normalizeTableExporterHiddenColumns() — signal-input non è scrivibile.\r\n   */\r\n  @Input(\"exportEqpTable\") exportEqpTable: ExportEqpTable;\r\n\r\n  readonly isMultiLanguage = input<boolean>(false);\r\n\r\n  /**\r\n   * Se true, considera che la colonna 0 della tabella HTML sia quella delle checkbox\r\n   */\r\n  readonly selectionEnabled = input<boolean>(false);\r\n\r\n  readonly tableColumns = input<Array<ConfigColumn>>(new Array<ConfigColumn>());\r\n\r\n  /** * Riferimento alla direttiva (passata dal padre o via ViewChild)\r\n   */\r\n  readonly exporterInstance = input<EqpMatTableExporterDirective>(undefined);\r\n\r\n  //#endregion\r\n\r\n  //#region Proprietà\r\n\r\n  exportValidTypes: string[] = [];\r\n\r\n  // Default types se non specificati\r\n  exportDefaultValidTypes: string[] = [\r\n    ExportType.XLSX,\r\n    ExportType.CSV,\r\n    ExportType.PDF,\r\n    ExportType.TXT,\r\n  ];\r\n\r\n  exportTypeEnum = ExportType;\r\n\r\n  //#endregion\r\n\r\n  constructor(private translateTableHelper: TranslateTableHelper) {}\r\n\r\n  ngOnInit() {\r\n    this.configureExport();\r\n  }\r\n\r\n  /**\r\n   * Configura i formati disponibili e le traduzioni\r\n   */\r\n  configureExport() {\r\n    if (!this.exportEqpTable) return;\r\n\r\n    // 1. Gestione Tipi di Export\r\n    if (this.exportEqpTable.exportFileType) {\r\n      this.exportValidTypes = Array.isArray(this.exportEqpTable.exportFileType)\r\n        ? this.exportEqpTable.exportFileType\r\n        : [this.exportEqpTable.exportFileType];\r\n    } else {\r\n      // Usa i valori dell'Enum filtrati sui default\r\n      this.exportValidTypes = Object.values(ExportType).filter((t) =>\r\n        this.exportDefaultValidTypes.includes(t)\r\n      );\r\n    }\r\n\r\n    // 2. Gestione Traduzioni (Pulsante e Tooltip)\r\n    if (this.isMultiLanguage() && this.translateTableHelper?.translateService) {\r\n      if (this.exportEqpTable.buttonTextTranslateKey) {\r\n        this.exportEqpTable.buttonText =\r\n          this.translateTableHelper.returnTranslateValue(\r\n            this.exportEqpTable.buttonTextTranslateKey,\r\n            null\r\n          );\r\n      }\r\n      if (this.exportEqpTable.tooltipTextTranslateKey) {\r\n        this.exportEqpTable.tooltipText =\r\n          this.translateTableHelper.returnTranslateValue(\r\n            this.exportEqpTable.tooltipTextTranslateKey,\r\n            null\r\n          );\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Calcola quali colonne (indici DOM) nascondere all'exporter.\r\n   * Include: Colonne Azioni (Menu/Simple), Checkbox di selezione, e colonne nascoste manualmente.\r\n   */\r\n  private normalizeTableExporterHiddenColumns() {\r\n    if (!this.exportEqpTable.hiddenColumns) {\r\n      this.exportEqpTable.hiddenColumns = [];\r\n    }\r\n\r\n    // A. Se la selezione è attiva, la colonna 0 (checkbox) va sempre nascosta\r\n    if (\r\n      this.selectionEnabled() &&\r\n      !this.exportEqpTable.hiddenColumns.includes(0)\r\n    ) {\r\n      this.exportEqpTable.hiddenColumns.push(0);\r\n    }\r\n\r\n    // B. Analizza le colonne configurate (ConfigColumn) per trovare quelle di azione\r\n    const tableColumns = this.tableColumns();\r\n    if (tableColumns) {\r\n      tableColumns.forEach((col, index) => {\r\n        const isActionCol =\r\n          col.type === TypeColumn.MenuAction ||\r\n          col.type === TypeColumn.SimpleAction;\r\n\r\n        if (isActionCol) {\r\n          // Calcola l'indice reale nel DOM\r\n          // Se c'è la selezione, le colonne dati sono shiftate di +1\r\n          const domIndex = this.selectionEnabled() ? index + 1 : index;\r\n\r\n          if (!this.exportEqpTable.hiddenColumns.includes(domIndex)) {\r\n            this.exportEqpTable.hiddenColumns.push(domIndex);\r\n          }\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Invoca l'export sulla direttiva\r\n   */\r\n  runTableExporter(exportType: string) {\r\n    //ExportType enum values\r\n    const exporterInstance = this.exporterInstance();\r\n    if (!exporterInstance) {\r\n      console.error(\"EqpTableExporter: Istanza della direttiva non trovata.\");\r\n      return;\r\n    }\r\n\r\n    this.normalizeTableExporterHiddenColumns();\r\n\r\n    // Passa le colonne nascoste alla direttiva\r\n    exporterInstance.hiddenColumns = this.exportEqpTable.hiddenColumns;\r\n\r\n    // Nome file\r\n    const fileName =\r\n      this.exportEqpTable.exportFileName || `Export_${new Date().getTime()}`;\r\n\r\n    // Lancia l'export\r\n    exporterInstance.exportTable(exportType, fileName);\r\n  }\r\n\r\n  /**\r\n   * Gestisce il click sul pulsante di export.\r\n   * Se esiste una funzione custom per quell'indice, esegue quella.\r\n   * Altrimenti lancia l'export standard.\r\n   */\r\n  handleExportClick(exportType: string, index: number) {\r\n    if (\r\n      this.exportEqpTable.customExportFunction &&\r\n      this.exportEqpTable.customExportFunction[index]\r\n    ) {\r\n      // Esegue la funzione custom fornita dall'utente\r\n      this.exportEqpTable.customExportFunction[index]();\r\n    } else {\r\n      // Esegue l'export standard della direttiva\r\n      this.runTableExporter(exportType);\r\n    }\r\n  }\r\n}\r\n","<div class=\"text-end exportButtonContainer\">\r\n  @if (exportValidTypes?.length > 1) {\r\n  <button\r\n    type=\"button\"\r\n    mat-button\r\n    [matMenuTriggerFor]=\"exportMenu\"\r\n    [matTooltip]=\"exportEqpTable.tooltipText\"\r\n    [matTooltipPosition]=\"exportEqpTable.tooltipPosition || 'below'\"\r\n    [ngStyle]=\"{\r\n      'box-shadow': exportEqpTable.showButtonBorder === false ? 'none' : null\r\n    }\"\r\n  >\r\n    <mat-icon>{{ exportEqpTable.buttonIcon }}</mat-icon>\r\n    @if (exportEqpTable.buttonText) {\r\n    <span style=\"margin-left: 5px\">{{ exportEqpTable.buttonText }}</span>\r\n    }\r\n  </button>\r\n  <mat-menu #exportMenu=\"matMenu\">\r\n    @for (exportType of exportValidTypes; track exportType; let i = $index) {\r\n    <button\r\n      type=\"button\"\r\n      mat-menu-item\r\n      [matTooltip]=\"exportType | uppercase\"\r\n      [matTooltipPosition]=\"exportEqpTable.tooltipPosition || 'below'\"\r\n      (click)=\"handleExportClick(exportType, i)\"\r\n    >\r\n      <i\r\n        class=\"fa\"\r\n        [ngClass]=\"{\r\n          'fa-file-excel': exportType === 'xls' || exportType === 'xlsx',\r\n          'fa-file-csv': exportType === 'csv',\r\n          'fa-file-pdf': exportType === 'pdf',\r\n          'fa-file-code': exportType === 'json' || exportType === 'txt',\r\n          'fa-file': exportType === 'other'\r\n        }\"\r\n        style=\"font-size: 1.2rem; margin-right: 10px\"\r\n      ></i>\r\n      <span>{{ exportType | uppercase }}</span>\r\n    </button>\r\n    }\r\n  </mat-menu>\r\n  } @if (exportValidTypes?.length === 1) {\r\n  <button\r\n    type=\"button\"\r\n    mat-raised-button\r\n    [matTooltip]=\"exportEqpTable.tooltipText\"\r\n    [matTooltipPosition]=\"exportEqpTable.tooltipPosition || 'below'\"\r\n    [ngStyle]=\"{\r\n      'box-shadow': exportEqpTable.showButtonBorder === false ? 'none' : null\r\n    }\"\r\n    (click)=\"handleExportClick(exportValidTypes[0], 0)\"\r\n  >\r\n    <mat-icon>{{ exportEqpTable.buttonIcon }}</mat-icon>\r\n    {{ exportEqpTable.buttonText }}\r\n  </button>\r\n  }\r\n</div>\r\n","import { TranslateTableHelper } from './translateTable.helper';\r\nimport { Injectable } from '@angular/core';\r\n\r\n@Injectable({\r\n  providedIn: 'root'\r\n})\r\n\r\n/**\r\n * N.B. Ricordarsi in caso di modifica di questo helper, di riportare la modifica in tutti gli altri progetti dove è stato usato\r\n * in quanto per la build della library è necessario che il file venga ripetuto in ogni progetto e non può essere istanziato\r\n * globalmente\r\n */\r\nexport class EnumHelper {\r\n\r\n  /**\r\n   * Contiene i singoli valori key value dell'enumeratore separati \r\n   */\r\n  indexEnumerator;\r\n\r\n  /**\r\n   * Definisco l'array che dovrà essere filtrato a seconda di indexEnumerator e poi successivamente iterato\r\n   */\r\n  arrayToCompare;\r\n\r\n  /**\r\n   * Array dove sarà ricostruito l'enumeratore e dopo essere clonato sarà restituito per ricavare la Label interessata \r\n   */\r\n  arrayIterated = [];\r\n\r\n  constructor(private translateTableHelper: TranslateTableHelper) { }\r\n\r\n  /**\r\n   * Funzione che si occupa di restituire un array di oggetti con chiave-valore (key-value) ottenuto dalla mappatura dell'enum richiesto.\r\n   * La funzione, dato il tipo dell'enumeratore, ricostruisce un array con tanti oggetti quanti sono i nodi dell'enum; ciascun oggetto\r\n   * dell'array avrà la proprietà 'key' uguale al valore dell'enum mentre la proprietà 'value' con l'etichetta dell'enum (eventualmente tradotta)\r\n   * @param enumObject \r\n   * @param isMultilanguage \r\n   * @param multilanguagePrefixKey \r\n   * @returns \r\n   */\r\n  getEnumArray<T extends { [name: string]: any }>(enumObject: T, isMultilanguage: boolean, multilanguagePrefixKey: string) {\r\n    this.indexEnumerator = Object.keys(enumObject);\r\n    this.arrayToCompare = this.indexEnumerator.filter(x => !isNaN(x));\r\n\r\n    this.arrayToCompare.forEach(index => {\r\n      let object = { key: parseInt(index), value: this.translateTableHelper.translateService != null && isMultilanguage == true ? this.translateTableHelper.returnTranslateValue(enumObject[index], multilanguagePrefixKey) : enumObject[index] }\r\n      this.arrayIterated.push(object);\r\n    });\r\n\r\n    //Dovendo svuotare l'arrayIterated creo un clone da passare come oggetto finale\r\n    let clonedArray = JSON.parse(JSON.stringify(this.arrayIterated));\r\n\r\n    this.arrayIterated = [];\r\n\r\n    return clonedArray;\r\n  }\r\n\r\n  /**\r\n   * Funzione che riceve in input il tipo dell'enumeratore e il valore selezionato e si occupa di restituisce la relativa etichetta associata.\r\n   * Se per l'enumeratore è gestito il multilingua allora si occupa di restituisce l'etichetta opportunamente tradotta (questa funzionalità è utilizzabile solo se\r\n   * la tabella ha isMultiLanguage = TRUE e solo se è stato passato il TranslateService opportunamente configurato)\r\n   * @param enumObject Type dell'enumeratore\r\n   * @param value Valore impostato per l'enumeratore\r\n   * @param isMultilanguage TRUE se per l'enumeratore richiesto si sta gestendo il multilingua\r\n   * @param multilanguagePrefixKey Eventuale prefisso per la ricerca del valore dell'enum all'interno del dizionario di traduzione\r\n   * @returns Restituisce una stringa corrispondente all'etichetta (eventualmente tradotta) del valore dell'enum passato in input\r\n   */\r\n  getEnumLabel<T extends { [name: string]: any }>(enumObject: T, value?: number, isMultilanguage?: boolean, multilanguagePrefixKey?: string) {\r\n    let enumArray = this.getEnumArray(enumObject, isMultilanguage, multilanguagePrefixKey);\r\n    if (value != null && value != undefined)\r\n      return enumArray.filter(x => x.key == value).length > 0 ? enumArray.find(x => x.key == value).value : null;\r\n    else\r\n      return null;\r\n  }\r\n\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { EnumHelper } from './enum.helper';\r\n\r\n/**\r\n * Servizio di helper che espone le funzioni statiche che hanno il compito di ricavare l'effettivo valore da mostrare nelle celle della tabella.\r\n */\r\n@Injectable()\r\nexport class ColumnValueHelper {\r\n\r\n    /**\r\n     * Proprietà (popolata nell'inizializzazione del component EqpTableComponent) e serve per capire se per la tabella corrente\r\n     * è stato richiesto il multilingua oppure no\r\n     */\r\n    isMultiLanguage: boolean = false;\r\n\r\n    // /**\r\n    //  * Proprietà (popolata nell'inizializzazione del component EqpTableComponent) e serve per passare a questo servizio\r\n    //  * l'istanza dell'EnumHelper in cui sono contenute le funzioni utilità per la gestione del multilingua sugli enumeratori\r\n    //  */\r\n    // enumHelper: EnumHelper = null;\r\n\r\n    constructor(private enumHelper: EnumHelper) {\r\n\r\n    }\r\n\r\n    /**\r\n     * Restituisce il valore booleano corretto in base all'elemento bindato alla riga e alla configurazione della colonna\r\n     * @param element Elemento bindato alla riga della tabella\r\n     * @param column Configurazione della colonna\r\n     * @param columnValue Valore contenuto nella colonna\r\n     * @returns \r\n     */\r\n    getBooleanValue(element, column, columnValue = null) {\r\n\r\n        let currentColumnValue = null;\r\n\r\n        if (columnValue == null)\r\n            currentColumnValue = this.getValue(element, column);\r\n        else\r\n            currentColumnValue = columnValue;\r\n\r\n        if (currentColumnValue != null && currentColumnValue != undefined)\r\n            return column.booleanValues[currentColumnValue];\r\n        else\r\n            return null;\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire l'etichetta corretta (eventualmente tradotta) da associare al valore dell'enum\r\n     * bindato all'oggetto contenuto nella riga.\r\n     * La funzione utilizza l'enumHelper in cui è contenuta la logica per il recupero dell'etichetta e dell'eventuale traduzione\r\n     * @param inputEnum Type dell'enumeratore\r\n     * @param element Elemento bindato alla riga della tabella\r\n     * @param col Configurazione della colonna di tipo ENUM\r\n     * @param columnValue Valore della colonna (opzionale)\r\n     * @returns Restituisce l'etichetta (eventualmente tradotta) da associare al valore dell'enum passato\r\n     */\r\n    getEnumValue(inputEnum, element, col, columnValue = null) {\r\n        let currentColumnValue = null;\r\n\r\n        if (columnValue == null)\r\n            currentColumnValue = this.getValue(element, col);\r\n        else\r\n            currentColumnValue = columnValue;\r\n\r\n        if (currentColumnValue != null && currentColumnValue != undefined && this.enumHelper) {\r\n            return this.enumHelper.getEnumLabel(inputEnum, currentColumnValue, this.isMultiLanguage, col.multilanguagePrefixKey);\r\n        }\r\n        else\r\n            return null;\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire il valore booleano corretto da bindare alla checkbox contenuta nella colonna\r\n     * @param element Elemento bindato alla riga della tabella\r\n     * @param column Configurazione della colonna\r\n     * @returns \r\n     */\r\n    getCheckboxValue(element, column) {\r\n        let currentColumnValue = this.getValue(element, column);\r\n        if (currentColumnValue != null && currentColumnValue != undefined)\r\n            return currentColumnValue;\r\n        else\r\n            return null;\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire l'url da usare come hyperlink per le colonne di questo tipo.\r\n     * Se il nodo hyperlinUrl della colonna contiene un valore statico allora restituisce quel valore altrimenti se è una funzione la invoca\r\n     * passando come input l'elemento bindato alla riga\r\n     * @param col Configurazione della colonna\r\n     * @param element Elemento bindato alla riga\r\n     * @returns Restituisce il valore da usare come URL per la colonna di tipo Hypwerlink\r\n     */\r\n    getHyperlinkUrlValue(col, element) {\r\n        if (!col.hyperlink)\r\n            return;\r\n\r\n        if (col.hyperlink.hyperlinkUrl) {\r\n            if (typeof (col.hyperlink.hyperlinkUrl) == \"string\") {\r\n                return col.hyperlink.hyperlinkUrl;\r\n            } else {\r\n                return col.hyperlink.hyperlinkUrl(element);\r\n            }\r\n        }\r\n\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire il testo da mostrare in una cella di tipo Hyperlink.\r\n     * Se il nodo hyperlinkText della colonna contiene un valore statico allora restituisce quel valore altrimenti se è una funzione la invoca\r\n     * passando come input l'elemento bindato alla riga\r\n     * @param col Configurazione della colonna\r\n     * @param element Elemento bindato alla riga\r\n     * @returns Restituisce il valore da usare come testo per la colonna di tipo Hypwerlink\r\n     */\r\n    getHyperlinkTextValue(col, element) {\r\n        if (!col.hyperlink)\r\n            return;\r\n\r\n        //Aggiorno la proprietà value così da non dover cambiare il metodo getValue\r\n        col.value = col.hyperlink.hyperlinkText;\r\n\r\n        let currentColumnValue = this.getValue(element, col);\r\n        if (currentColumnValue != null && currentColumnValue != undefined)\r\n            return currentColumnValue;\r\n        else\r\n            return col.value;\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire l'icona da usare per le action dei pulsanti della tabella.\r\n     * Se il nodo icon della action contiene un valore statico allora restituisce quel valore altrimenti se è una funzione la invoca\r\n     * passando come input l'elemento bindato alla riga\r\n     * @param col Configurazione della colonna\r\n     * @param element Elemento bindato alla riga\r\n     * @returns Restituisce il valore da usare come icona del pulsante\r\n     */\r\n    getIconValue(action, element) {\r\n        if (!action.icon)\r\n            return;\r\n\r\n        if (typeof (action.icon) == \"string\") {\r\n            return action.icon;\r\n        } else {\r\n            return action.icon(element);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire il valore generico da mostrare nella cella della tabella.\r\n     * Se la cella contiene un valore semplice allora lo restituisce direttamente altrimenti se contiene oggetti complessi o funzioni \r\n     * allora li ispeziona per ricavare il valore da visualizzare\r\n     * @param element Elemento bindato alla riga\r\n     * @param col Configurazione della colonna\r\n     * @returns Restituisce il valore da mostrare nella cella della eqp-table\r\n     */\r\n    getValue(element, col) {\r\n        if (col.value && typeof (col.value) == \"string\" && (col.value.indexOf(',') == null || col.value.indexOf(',') == -1)) {\r\n            return col.value.split('.').reduce(this.getRealValue, element);\r\n        }\r\n        else if (col.value && typeof (col.value) == \"string\" && (col.value.indexOf(',') != null && col.value.indexOf(',') != -1)) {\r\n            return col.value.split('.').reduce(this.getConcatValue, element);\r\n        }\r\n        else if (col.value && typeof (col.value) == \"function\") {\r\n            return col.value(element);\r\n        }\r\n        else if (typeof (element) == \"string\") {\r\n            return element;\r\n        }\r\n        else {\r\n            return element[col.key];\r\n        }\r\n    }\r\n\r\n\r\n    /**\r\n     * TODO\r\n     * @param initialValue \r\n     * @param currentValue \r\n     * @returns \r\n     */\r\n    private getRealValue(initialValue, currentValue) {\r\n        return initialValue != null && initialValue != undefined ? initialValue[currentValue] : null;\r\n    }\r\n\r\n    /**\r\n     * TODO\r\n     * @param initialValue \r\n     * @param currentValue \r\n     * @returns \r\n     */\r\n    private getConcatValue(initialValue, currentValue) {\r\n        let retrievedList: Array<string> = currentValue.split(\",\");\r\n        let concatenatedString: string;\r\n\r\n        retrievedList.forEach(element => {\r\n            let value = initialValue[element];\r\n            concatenatedString = concatenatedString == undefined ? value : (concatenatedString + \" \" + value);\r\n        });\r\n\r\n        return concatenatedString;\r\n    }\r\n\r\n    /**\r\n    * Funzione che si occupa di restituire il valore di tipo \"Date\" corretto da bindare alla cella della colonna\r\n    * @param element Elemento bindato alla riga della tabella\r\n    * @param column Configurazione della colonna\r\n    * @returns \r\n    */\r\n    getDateValue(element, column) {\r\n        let currentColumnValue = this.getValue(element, column);\r\n        if (currentColumnValue != null && currentColumnValue != undefined && this.isDateValid(currentColumnValue))\r\n            return currentColumnValue;\r\n        else\r\n            return null;\r\n    }\r\n\r\n    private isDateValid(value: any): boolean {\r\n        const date = new Date(value);\r\n        return !isNaN(date.getTime());\r\n    }\r\n\r\n    /**\r\n     * Funzione che si occupa di restituire il percorso dell'URL per la navigazione alla pagina successiva\r\n     * @param col configurazione della colonna\r\n     * @param element contenuto della riga\r\n     * @returns \r\n     */\r\n    getRouterLinkPath(col: any, element: any): any[] {\r\n        if (!col.navigate) return [];\r\n\r\n        const routeUrl = col.navigate.routeUrl || '';\r\n\r\n        // Recupera le chiavi\r\n        const paramKeyString = col.navigate.paramKey || col.key;\r\n\r\n        const keys = paramKeyString\r\n            ? paramKeyString.split(',').map(k => k.trim())\r\n            : [];\r\n\r\n        // Estrae i valori reali\r\n        const values = keys\r\n            .map(k => this.getDeepValue(element, k))\r\n            .filter(v => v !== null && v !== undefined && v !== '');\r\n\r\n        // Prepara URL\r\n        let segments = routeUrl.split('/');\r\n        if (segments.length > 1 && segments[segments.length - 1] === '') {\r\n            segments.pop();\r\n        }\r\n\r\n        let valueIndex = 0;\r\n\r\n        // Percorso finale\r\n        const finalPath = segments.map(segment => {\r\n            // Se il segmento è un param (inizia con :), usa il prossimo valore disponibile\r\n            if (segment.startsWith(':')) {\r\n                if (valueIndex < values.length) {\r\n                    return values[valueIndex++];\r\n                }\r\n                return segment;\r\n            }\r\n            return segment;\r\n        });\r\n\r\n        // Se avanzano dei valori, li accodo\r\n        while (valueIndex < values.length) {\r\n            finalPath.push(values[valueIndex++]);\r\n        }\r\n\r\n        return finalPath;\r\n    }\r\n\r\n    //Funzione di supporto per estrarre valori profondi da un oggetto dato un percorso in notazione puntata es: \"address.street.name\"\r\n    private getDeepValue(obj: any, path: string): any {\r\n        if (!path || !obj) return null;\r\n        return path.split('.').reduce((prev, curr) => prev ? prev[curr] : null, obj);\r\n    }\r\n\r\n    /**\r\n     * Recupera il testo da mostrare nel link\r\n     */\r\n    getNavigateText(col, element: any): string {\r\n        if (col.navigate && col.navigate.text) {\r\n            if (typeof col.navigate.text === 'function') {\r\n                return col.navigate.text(element);\r\n            }\r\n            return col.navigate.text;\r\n        }\r\n        // Fallback: mostra il valore della cella\r\n        return this.getValue(col, element); // Assumo tu abbia un metodo generico getValue\r\n    }\r\n\r\n    /**\r\n     * Recupera i query params\r\n     */\r\n    getNavigateQueryParams(col, element: any): any {\r\n        if (col.navigate && col.navigate.queryParams) {\r\n            if (typeof col.navigate.queryParams === 'function') {\r\n                return col.navigate.queryParams(element);\r\n            }\r\n            return col.navigate.queryParams;\r\n        }\r\n        return null;\r\n    }\r\n\r\n}\r\n\r\n","import { Injectable } from \"@angular/core\";\r\n\r\n/**\r\n * Servizio di helper che espone funzioni statiche per il controllo sull'accessibilità delle colonne.\r\n * Espone quindi funzioni per: gestione tooltip, verifica stato disabilitazione pulsanti, verifica stato dell'attributo hidden\r\n * dei pulsanti, verifica stato disabilitazione di una riga\r\n */\r\n@Injectable()\r\nexport class ColumnAccessibilityHelper {\r\n\r\n  /**\r\n   * Permette di disabilitare visivamente la riga. Accetta una stringa contentente il nome di una proprietà che deve essere contenuta nella tabella\r\n   * e che DEVE restituire valori booleani, altrimenti accetta una Function con lo stesso funzionamento\r\n   * oppure un valore booelano\r\n   */\r\n  disableRow: string | Function | boolean = null;\r\n\r\n  /**\r\n   * Valore di default da usare come colore per l'applicazione dello stile 'disabled'\r\n   */\r\n  disableRowColor: string = null;\r\n\r\n  /**\r\n   * Restituisce il testo da mostrare come tooltip per la cella della colonna richiesta.\r\n   * Se per la configurazione della colonna il nodo tooltip.tooltipText riporta un valore statico allora restituisce quel valore,\r\n   * altrimenti se a tale nodo è legata una funzione allora richiama tale funzione passando come parametro l'elemento bindato alla riga\r\n   * @param col Configurazione colonna per cui mostrare il tooltip\r\n   * @param element Elemento bindato alla riga per cui recuperare il tooltip\r\n   * @returns Restituisce il testo da mostrare come tooltip\r\n   */\r\n  getTooltipInfo(col, element) {\r\n    if (!col.tooltip)\r\n      return;\r\n\r\n    if (typeof (col.tooltip.tooltipText) == \"string\") {\r\n      return col.tooltip.tooltipText;\r\n    } else {\r\n      return col.tooltip.tooltipText(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Restituisce il valore da attribuire allo stato disabled del pulsante della tabella.\r\n   * Se per la configurazione dell'action passata come parametro il nodo disabled riporta un valore statico allora restituisce quel valore, \r\n   * altrimenti se a tale nodo è legata una funzione allora richiama tale funzione passando come parametro l'elemento bindato alla riga\r\n  */\r\n  getDisableInfo(action, element) {\r\n    if (!action.disabled)\r\n      return;\r\n\r\n    if (typeof (action.disabled) == \"boolean\") {\r\n      return action.disabled;\r\n    } else {\r\n      return action.disabled(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Restituisce il valore da attribuire allo stato hidden del pulsante della tabella.\r\n  * Se per la configurazione dell'action passata come parametro il nodo hidden riporta un valore statico allora restituisce quel valore,\r\n  * altrimenti se a tale nodo è legata una funzione allora richiama tale funzione passando come parametro l'elemento bindato alla riga\r\n  */\r\n  getHiddenInfo(action, element) {\r\n    if (!action.hidden)\r\n      return;\r\n\r\n    if (typeof (action.hidden) == \"boolean\") {\r\n      return action.hidden;\r\n    } else {\r\n      return action.hidden(element);\r\n    }\r\n  }\r\n\r\n  /**\r\n  * Restituisce il valore da attribuire allo stato disabled della riga della tabella a cui è bindato l'elemento ricevuto in input.\r\n  * Se l'input disableRow è una stringa contenente il nome della proprietà allora restituisce il valore della proprietà ricercata nell'elemento di input, \r\n  * se invece disableRow è un booleano allora restituisce tale valore, infine se disableRow è una funzione passata dall'esterno allora invoca tale funzione\r\n  * passando come input l'elemento bindato alla riga\r\n  * @param element Elemento bindato alla riga\r\n  * @returns Restituisce il valore da attribuire al tag 'disabled' della riga della tabella\r\n  */\r\n  isRowDisabled(element) {\r\n    if (!this.disableRow)\r\n      return;\r\n\r\n    if (typeof (this.disableRow) == \"string\") {\r\n      let currentValue = this.disableRow;\r\n      return element[currentValue];\r\n    }\r\n\r\n    if (typeof (this.disableRow) == \"boolean\") {\r\n      let currentValue = this.disableRow;\r\n      return currentValue;\r\n    }\r\n\r\n    //se non è string ed è definito sarà sicuramente una funzione\r\n    else if (this.disableRow != null) {\r\n      return this.disableRow(element);\r\n    }\r\n  }\r\n}\r\n\r\n","import { Injectable } from '@angular/core';\r\nimport { ColumnAccessibilityHelper } from './columnAccessibility.helper';\r\n\r\n/**\r\n * Servizio di helper che espone funzioni statiche per la gestione dello stile dell'eqp-table\r\n */\r\n@Injectable()\r\nexport class ColumnStyleHelper {\r\n\r\n    constructor(private columnAccessibilityHelper: ColumnAccessibilityHelper) {\r\n\r\n    }\r\n\r\n\r\n    /**\r\n     * A partire dalla configurazione della colonna ricevuta in input restituisce il nodo containerStyle associato.\r\n     * Se tale nodo assume un valore statico allora restituisce quel valore altrimenti, se è una funzione allora la invoca passando come input \r\n     * l'elemento bindato alla riga (ricevuto nel secondo parametro della firma).\r\n     * Infine, dopo aver ottenuto il nodo relativo allo stile si occupa di settare il colore della riga se quest'ultima risulta disabilitata\r\n     * @param col Configurazione della colonna per cui recuperare lo stile\r\n     * @param element Elemento bindato alla riga della tabella\r\n     * @returns Restituisce lo stile da applicare alla colonna\r\n     */\r\n    getNgStyle(col, element) {\r\n\r\n        var styleObject = {};\r\n        if (typeof (col.containerStyle) == \"object\") {\r\n            styleObject = col.containerStyle;\r\n        } else if (col.containerStyle instanceof Function) {\r\n            styleObject = col.containerStyle(element);\r\n        }\r\n\r\n        if (styleObject == null)\r\n            styleObject = {};\r\n\r\n        if (!this.columnAccessibilityHelper.isRowDisabled(element) == false && styleObject['color'] == null)\r\n            styleObject['color'] = this.columnAccessibilityHelper.isRowDisabled(element) ? this.columnAccessibilityHelper.disableRowColor : 'inherit';\r\n\r\n        if (this.columnAccessibilityHelper.isRowDisabled(element) == true) {\r\n            styleObject['color'] = this.columnAccessibilityHelper.disableRowColor;\r\n        } else if (styleObject['color'] == null) {\r\n            styleObject['color'] = 'inherit'\r\n        }\r\n        return styleObject;\r\n    }\r\n}\r\n\r\n","import { Component, Input, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { CustomButton } from \"@eqproject/eqp-common\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { TranslateTableHelper } from \"../../helpers/translateTable.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-custom-buttons\",\r\n  templateUrl: \"./custom-buttons.component.html\",\r\n  styleUrls: [\"./custom-buttons.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatButtonModule, MatIconModule, MatTooltipModule],\r\n})\r\nexport class CustomButtonsComponent implements OnInit {\r\n  /**\r\n   * Mantenuto come @Input() perché viene mutato in-place in checkButtonOrder()\r\n   * (sort) e checkTranslateButtonText() (forEach).\r\n   */\r\n  @Input(\"customButtons\") customButtons: Array<CustomButton>;\r\n  readonly isMultiLanguage = input<boolean>(false);\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    private translateTableHelper: TranslateTableHelper,\r\n    public columnStyleHelper: ColumnStyleHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    this.checkButtonOrder();\r\n    this.checkTranslateButtonText();\r\n  }\r\n\r\n  checkButtonOrder() {\r\n    if (\r\n      this.customButtons != null &&\r\n      this.customButtons.find((x) => x.order != null)\r\n    ) {\r\n      this.customButtons.sort((a, b) => {\r\n        // Gestisce il caso in cui \"order\" sia assente in uno o entrambi gli oggetti\r\n        const orderA = a.order || 0;\r\n        const orderB = b.order || 0;\r\n\r\n        return orderA - orderB;\r\n      });\r\n    }\r\n  }\r\n\r\n  checkTranslateButtonText() {\r\n    //Se è stato passato il buttonTextTranslateKey e la tabella è gestita col multilingua allora\r\n    //sovrascrive il buttonText con la traduzione associata alla buttonTextTranslateKey (recuperara dal json di traduzione caricata per la tabella)\r\n    if (\r\n      this.customButtons.find((x) => x.buttonTextTranslateKey != null) &&\r\n      this.isMultiLanguage() == true &&\r\n      this.translateTableHelper.translateService != null\r\n    ) {\r\n      this.customButtons.forEach((element) => {\r\n        element.buttonText = this.translateTableHelper.returnTranslateValue(\r\n          element.buttonTextTranslateKey,\r\n          null\r\n        );\r\n      });\r\n    }\r\n  }\r\n\r\n  checkTranslateTooltipText() {\r\n    //Se è stato passato il buttonTextTranslateKey e la tabella è gestita col multilingua allora\r\n    //sovrascrive il buttonText con la traduzione associata alla buttonTextTranslateKey (recuperara dal json di traduzione caricata per la tabella)\r\n    if (\r\n      this.customButtons.find((x) => x.tooltipTextTranslateKey != null) &&\r\n      this.isMultiLanguage() == true &&\r\n      this.translateTableHelper.translateService != null\r\n    ) {\r\n      this.customButtons.forEach((element) => {\r\n        element.tooltipText = this.translateTableHelper.returnTranslateValue(\r\n          element.tooltipTextTranslateKey,\r\n          null\r\n        );\r\n      });\r\n    }\r\n  }\r\n\r\n  getButtonDisabledState(customButton: any): boolean {\r\n    if (typeof customButton.isDisabled === \"function\") {\r\n      return customButton.isDisabled();\r\n    }\r\n    return !!customButton.isDisabled; // Ritorna il booleano o false se undefined\r\n  }\r\n}\r\n","<div class=\"custom-button-container\">\r\n  @for (customButton of customButtons; track customButton; let i = $index) { @if\r\n  (customButton.buttonText) {\r\n  <button\r\n    [ngStyle]=\"columnStyleHelper.getNgStyle(customButton, null)\"\r\n    mat-button\r\n    class=\"custom-button\"\r\n    [matTooltip]=\"customButton.tooltipText\"\r\n    [disabled]=\"getButtonDisabledState(customButton)\"\r\n    [matTooltipPosition]=\"\r\n      customButton.tooltipPosition != null\r\n        ? customButton.tooltipPosition\r\n        : 'below'\r\n    \"\r\n    (click)=\"customButton.customButtonFunction()\"\r\n  >\r\n    {{ customButton.buttonText }}\r\n    @if (!customButton.fontawesome) {\r\n    <ng-container [ngTemplateOutlet]=\"matIcon\"></ng-container>\r\n    } @else {\r\n    <i\r\n      class=\"custom-icon-size\"\r\n      [ngStyle]=\"{ color: customButton.color }\"\r\n      style=\"font-size: 24px !important; margin-left: 3px\"\r\n      class=\"{{ columnValueHelper.getIconValue(customButton, null) }}\"\r\n    ></i>\r\n    }\r\n  </button>\r\n  } @else {\r\n  <button\r\n    [ngStyle]=\"columnStyleHelper.getNgStyle(customButton, null)\"\r\n    mat-icon-button\r\n    class=\"custom-button\"\r\n    [matTooltip]=\"customButton.tooltipText\"\r\n    [disabled]=\"getButtonDisabledState(customButton)\"\r\n    [matTooltipPosition]=\"\r\n      customButton.tooltipPosition != null\r\n        ? customButton.tooltipPosition\r\n        : 'below'\r\n    \"\r\n    (click)=\"customButton.customButtonFunction()\"\r\n  >\r\n    @if (!customButton.fontawesome) {\r\n    <ng-container [ngTemplateOutlet]=\"matIcon\"></ng-container>\r\n    } @else {\r\n    <i\r\n      class=\"custom-icon-size\"\r\n      [ngStyle]=\"{ color: customButton.color }\"\r\n      style=\"font-size: 24px !important; margin-left: 3px\"\r\n      class=\"{{ columnValueHelper.getIconValue(customButton, null) }}\"\r\n    ></i>\r\n    }\r\n  </button>\r\n  }\r\n  <ng-template #matIcon>\r\n    <mat-icon class=\"custom-icon-size\" [ngStyle]=\"{ color: customButton.color }\"\r\n      >{{ columnValueHelper.getIconValue(customButton, null) }}\r\n    </mat-icon>\r\n  </ng-template>\r\n  }\r\n</div>\r\n","import { Component, OnInit, ViewChild, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ColumnAccessibilityHelper } from \"../../helpers/columnAccessibility.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { TranslateTableHelper } from \"../../helpers/translateTable.helper\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-boolean-column\",\r\n  templateUrl: \"boolean-column.component.html\",\r\n  styleUrls: [\"boolean-column.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableBooleanColumnComponent implements OnInit {\r\n  /**\r\n   * Configurazione della colonna di tipo boolean\r\n   */\r\n  readonly col = input<ConfigColumn>(undefined);\r\n\r\n  /**\r\n   * Elemento bindato alla riga\r\n   */\r\n  readonly element = input<any>(undefined);\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibiltyHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibiltyHelper: ColumnAccessibilityHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string =\r\n        \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n}\r\n","<ng-container>\r\n  <span style=\"display: none\">\r\n    {{ element()[col().key] ? \"Sì\" : \"No\" }}\r\n  </span>\r\n\r\n  <span\r\n    [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\"\r\n    [innerHTML]=\"columnValueHelper.getBooleanValue(element(), col())\"\r\n    [matTooltip]=\"columnAccessibiltyHelper.getTooltipInfo(col(), element())\"\r\n    [matTooltipPosition]=\"\r\n      col().tooltip?.tooltipPosition != null\r\n        ? col().tooltip?.tooltipPosition\r\n        : 'below'\r\n    \"\r\n  ></span>\r\n</ng-container>\r\n","import { Component, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ColumnAccessibilityHelper } from \"../../helpers/columnAccessibility.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-color-column\",\r\n  templateUrl: \"color-column.component.html\",\r\n  styleUrls: [\"color-column.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableColorColumnComponent implements OnInit {\r\n  /**\r\n   * Configurazione della colonna di tipo boolean\r\n   */\r\n  readonly col = input<ConfigColumn>(undefined);\r\n\r\n  /**\r\n   * Elemento bindato alla riga\r\n   */\r\n  readonly element = input<any>(undefined);\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibiltyHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibiltyHelper: ColumnAccessibilityHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string =\r\n        \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n}\r\n","<ng-container>\r\n  <div\r\n    style=\"height: 25px\"\r\n    [ngStyle]=\"{\r\n      'background-color': columnValueHelper.getValue(element(), col())\r\n    }\"\r\n    [matTooltip]=\"columnAccessibiltyHelper.getTooltipInfo(col(), element())\"\r\n    [matTooltipPosition]=\"\r\n      col().tooltip?.tooltipPosition != null\r\n        ? col().tooltip?.tooltipPosition\r\n        : 'below'\r\n    \"\r\n  ></div>\r\n</ng-container>\r\n","import { Component, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ColumnAccessibilityHelper } from \"../../helpers/columnAccessibility.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-date-column\",\r\n  templateUrl: \"date-column.component.html\",\r\n  styleUrls: [\"date-column.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableDateColumnComponent implements OnInit {\r\n  /**\r\n   * Configurazione della colonna di tipo boolean\r\n   */\r\n  readonly col = input.required<ConfigColumn>();\r\n\r\n  /**\r\n   * Elemento bindato alla riga\r\n   */\r\n  readonly element = input.required<any>();\r\n\r\n  /**\r\n   * Culture da usare per le date\r\n   */\r\n  readonly currentCultureSelected = input<string>(undefined);\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibiltyHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibiltyHelper: ColumnAccessibilityHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string =\r\n        \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n}\r\n","<ng-container>\n  <!-- Visualizzazione data senza nessun formato specificato come input -->\n  @if (!col().format) {\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{\n      columnValueHelper.getDateValue(element(), col())\n        | date : \"shortDate\" : \"\" : currentCultureSelected()\n    }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n  }\n\n  <!-- Visualizzazione data con formato specifico -->\n  @if (col().format) {\n  <span>\n    {{\n      columnValueHelper.getDateValue(element(), col())\n        | date\n          : (col().format ? col().format : \"shortDate\")\n          : \"\"\n          : currentCultureSelected()\n    }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}</span\n  >\n  }\n\n  <!-- Gestione tooltip -->\n  @if (col().tooltip && columnAccessibiltyHelper.getTooltipInfo(col(),element()) !=\n  null && columnAccessibiltyHelper.getTooltipInfo(col(),element()) != '') {\n  <i\n    [matTooltip]=\"columnAccessibiltyHelper.getTooltipInfo(col(), element())\"\n    [matTooltipPosition]=\"\n      col().tooltip?.tooltipPosition != null\n        ? col().tooltip?.tooltipPosition\n        : 'below'\n    \"\n    style=\"margin-left: 5px\"\n    class=\"fa-solid fa-circle-info\"\n  ></i>\n  }\n</ng-container>\n","import { Component, OnInit, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ColumnAccessibilityHelper } from '../../helpers/columnAccessibility.helper';\r\nimport { ColumnStyleHelper } from '../../helpers/columnStyle.helper';\r\nimport { ColumnValueHelper } from '../../helpers/columnValue.helper';\r\nimport { ConfigColumn } from '@eqproject/eqp-common';\r\n\r\n@Component({\r\n    selector: 'eqp-table-enum-column',\r\n    templateUrl: 'enum-column.component.html',\r\n    styleUrls: ['enum-column.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableEnumColumnComponent implements OnInit {\r\n\r\n    /**\r\n    * Configurazione della colonna di tipo boolean\r\n    */\r\n    readonly col = input.required<ConfigColumn>();\r\n\r\n    /**\r\n    * Elemento bindato alla riga\r\n    */\r\n    readonly element = input.required<any>();\r\n\r\n    // public columnValueHelper = ColumnValueHelper;\r\n    // public columnStyleHelper = ColumnStyleHelper;\r\n    // public columnAccessibilityHelper = ColumnAccessibilityHelper;\r\n\r\n    constructor(public columnValueHelper: ColumnValueHelper, public columnStyleHelper: ColumnStyleHelper, public columnAccessibilityHelper: ColumnAccessibilityHelper) {\r\n    }\r\n\r\n    ngOnInit() {\r\n        //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n        if (!this.col() || !this.element()) {\r\n            let errorMessage: string = \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n            console.log(errorMessage);\r\n            throw new Error(errorMessage);\r\n        }\r\n    }\r\n}\r\n","<ng-container>\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{ columnValueHelper.getEnumValue(col().enumModel, element(), col()) }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n\n  @if (col().tooltip && columnAccessibilityHelper.getTooltipInfo(col(),element()) !=\n  null && columnAccessibilityHelper.getTooltipInfo(col(),element()) != '') {\n  <i\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(col(), element())\"\n    [matTooltipPosition]=\"\n      col().tooltip?.tooltipPosition != null\n        ? col().tooltip?.tooltipPosition\n        : 'below'\n    \"\n    style=\"margin-left: 5px\"\n    class=\"fa-solid fa-circle-info\"\n  ></i>\n  }\n</ng-container>\n","import { Component, OnInit, ViewChild, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ColumnAccessibilityHelper } from '../../helpers/columnAccessibility.helper';\r\nimport { ColumnStyleHelper } from '../../helpers/columnStyle.helper';\r\nimport { ColumnValueHelper } from '../../helpers/columnValue.helper';\r\nimport { ConfigColumn } from '@eqproject/eqp-common';\r\n\r\n@Component({\r\n    selector: 'eqp-table-checkbox-column',\r\n    templateUrl: 'checkbox-column.component.html',\r\n    styleUrls: ['checkbox-column.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, MatCheckboxModule, MatTooltipModule],\r\n})\r\nexport class EqpTableCheckboxColumnComponent implements OnInit {\r\n\r\n  /**\r\n  * Configurazione della colonna di tipo boolean\r\n  */\r\n  readonly col = input.required<ConfigColumn>();\r\n\r\n  /**\r\n  * Elemento bindato alla riga\r\n  */\r\n  readonly element = input.required<any>();\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibiltyHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(public columnValueHelper: ColumnValueHelper, public columnStyleHelper: ColumnStyleHelper, public columnAccessibiltyHelper: ColumnAccessibilityHelper) {\r\n  }\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string = \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n\r\n  changeCheckboxRow(event, element, column) {\r\n\r\n    let keyValue = column.value ? column.value : column.key;\r\n\r\n    if (event.checked == false) {\r\n      element[keyValue] = false;\r\n    } else if (event.checked == true) {\r\n      element[keyValue] = true;\r\n    }\r\n  }\r\n}\r\n","<ng-container>\n  <mat-checkbox\n    (click)=\"$event.stopPropagation()\"\n    [disabled]=\"\n      col().disabled != null\n        ? columnAccessibiltyHelper.getDisableInfo(col(), element())\n        : columnAccessibiltyHelper.isRowDisabled(element())\n    \"\n    [checked]=\"columnValueHelper.getCheckboxValue(element(), col())\"\n    (change)=\"changeCheckboxRow($event, element(), col())\"\n  >\n  </mat-checkbox>\n\n  <!-- Gestione tooltip -->\n  @if (col().tooltip && columnAccessibiltyHelper.getTooltipInfo(col(),element()) !=\n  null && columnAccessibiltyHelper.getTooltipInfo(col(),element()) != '') {\n  <i\n    [matTooltip]=\"columnAccessibiltyHelper.getTooltipInfo(col(), element())\"\n    [matTooltipPosition]=\"\n      col().tooltip?.tooltipPosition != null\n        ? col().tooltip?.tooltipPosition\n        : 'below'\n    \"\n    style=\"margin-left: 5px\"\n    class=\"fa-solid fa-circle-info\"\n  ></i>\n  }\n</ng-container>\n","import { Component, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ColumnAccessibilityHelper } from \"../../helpers/columnAccessibility.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-icon-column\",\r\n  templateUrl: \"icon-column.component.html\",\r\n  styleUrls: [\"icon-column.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableIconColumnComponent implements OnInit {\r\n  /**\r\n   * Configurazione della colonna di tipo boolean\r\n   */\r\n  readonly col = input<ConfigColumn>(undefined);\r\n\r\n  /**\r\n   * Elemento bindato alla riga\r\n   */\r\n  readonly element = input<any>(undefined);\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibilityHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibilityHelper: ColumnAccessibilityHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string =\r\n        \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n}\r\n","<ng-container>\r\n  @for (icon of columnValueHelper.getValue(element(),col()); track icon) {\r\n  <div>\r\n    <i\r\n      [ngStyle]=\"\r\n        columnAccessibilityHelper.isRowDisabled(element())\r\n          ? { color: columnAccessibilityHelper.disableRowColor, cursor: 'none' }\r\n          : { cursor: 'pointer' }\r\n      \"\r\n      [ngClass]=\"icon.className\"\r\n      [matTooltip]=\"icon.tooltip\"\r\n    ></i>\r\n  </div>\r\n  }\r\n</ng-container>\r\n","import { Component, OnInit, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ColumnAccessibilityHelper } from '../../helpers/columnAccessibility.helper';\r\nimport { ColumnStyleHelper } from '../../helpers/columnStyle.helper';\r\nimport { ColumnValueHelper } from '../../helpers/columnValue.helper';\r\nimport { ConfigColumn } from '@eqproject/eqp-common';\r\n\r\n@Component({\r\n    selector: 'eqp-table-hyperlink-column',\r\n    templateUrl: 'hyperlink-column.component.html',\r\n    styleUrls: ['hyperlink-column.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableHyperlinkColumnComponent implements OnInit {\r\n\r\n    /**\r\n    * Configurazione della colonna di tipo boolean\r\n    */\r\n    readonly col = input.required<ConfigColumn>();\r\n\r\n    /**\r\n    * Elemento bindato alla riga\r\n    */\r\n    readonly element = input.required<any>();\r\n\r\n    constructor(public columnValueHelper: ColumnValueHelper, public columnStyleHelper: ColumnStyleHelper, public columnAccessibilityHelper: ColumnAccessibilityHelper) {\r\n    }\r\n\r\n    ngOnInit() {\r\n        //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n        if (!this.col() || !this.element()) {\r\n            let errorMessage: string = \"It is mandatory to indicate the configuration and the element to be used for the hyperlink column\";\r\n            console.log(errorMessage);\r\n            throw new Error(errorMessage);\r\n        }\r\n    }\r\n}\r\n","<ng-container>\n  <!-- Link per aprire una nuova scheda -->\n  @if (col().hyperlink.isTargetBlank) {\n  <a\n    target=\"_blank\"\n    [href]=\"columnValueHelper.getHyperlinkUrlValue(col(), element())\"\n  >\n    {{\n      col().hyperlink.hyperlinkText\n        ? columnValueHelper.getHyperlinkTextValue(col(), element())\n        : columnValueHelper.getHyperlinkUrlValue(col(), element())\n    }}\n  </a>\n  }\n\n  <!-- Link da aprire nella scheda corrente -->\n  @if (!col().hyperlink.isTargetBlank) {\n  <a [href]=\"columnValueHelper.getHyperlinkUrlValue(col(), element())\">\n    {{\n      col().hyperlink.hyperlinkText\n        ? columnValueHelper.getHyperlinkTextValue(col(), element())\n        : columnValueHelper.getHyperlinkUrlValue(col(), element())\n    }}\n  </a>\n  }\n\n  <!-- Gestione tooltip -->\n  @if (col().tooltip && columnAccessibilityHelper.getTooltipInfo(col(),element()) !=\n  null && columnAccessibilityHelper.getTooltipInfo(col(),element()) != '') {\n  <i\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(col(), element())\"\n    [matTooltipPosition]=\"\n      col().tooltip?.tooltipPosition != null\n        ? col().tooltip?.tooltipPosition\n        : 'below'\n    \"\n    style=\"margin-left: 5px\"\n    class=\"fa-solid fa-circle-info\"\n  ></i>\n  }\n</ng-container>\n","import { Component, OnInit, input } from \"@angular/core\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { ColumnAccessibilityHelper } from \"../../helpers/columnAccessibility.helper\";\r\nimport { ColumnStyleHelper } from \"../../helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"../../helpers/columnValue.helper\";\r\nimport { ConfigColumn } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  selector: \"eqp-table-image-column\",\r\n  templateUrl: \"image-column.component.html\",\r\n  styleUrls: [\"image-column.component.scss\"],\r\n  standalone: true,\r\n  imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableImageColumnComponent implements OnInit {\r\n  /**\r\n   * Configurazione della colonna di tipo boolean\r\n   */\r\n  readonly col = input.required<ConfigColumn>();\r\n\r\n  /**\r\n   * Elemento bindato alla riga\r\n   */\r\n  readonly element = input<any>(undefined);\r\n\r\n  // public columnValueHelper = ColumnValueHelper;\r\n  // public columnStyleHelper = ColumnStyleHelper;\r\n  // public columnAccessibilityHelper = ColumnAccessibilityHelper;\r\n\r\n  constructor(\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibiltyHelper: ColumnAccessibilityHelper\r\n  ) {}\r\n\r\n  ngOnInit() {\r\n    //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n    if (!this.col() || !this.element()) {\r\n      let errorMessage: string =\r\n        \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n      console.log(errorMessage);\r\n      throw new Error(errorMessage);\r\n    }\r\n  }\r\n\r\n  getImagePreviewValue(col, element) {\r\n    if (!col.image) return;\r\n\r\n    if (typeof col.image.imagePreview == \"string\") {\r\n      return col.image.imagePreview;\r\n    } else {\r\n      return col.image.imagePreview(element);\r\n    }\r\n  }\r\n\r\n  getImageFullValue(col, element) {\r\n    if (!col.image) return;\r\n\r\n    if (typeof col.image.imageFull == \"string\") {\r\n      return col.image.imageFull;\r\n    } else {\r\n      return col.image.imageFull(element);\r\n    }\r\n  }\r\n}\r\n","<ng-container>\n  <!-- Immagine a dimensioni reali -->\n  @if (!col().image.imageFull) {\n  <img [src]=\"getImagePreviewValue(col(), element())\" />\n  }\n\n  <!-- Immagine in dimensione 'preview' -->\n  @if (col().image.imageFull) {\n  <img\n    [src]=\"getImagePreviewValue(col(), element())\"\n    [matTooltip]=\"getImageFullValue(col(), element())\"\n    [matTooltipPosition]=\"'below'\"\n    style=\"margin-left: 5px\"\n  />\n  }\n</ng-container>\n","import { Injectable } from '@angular/core';\r\nimport { ConfigColumn } from '@eqproject/eqp-common';\r\n\r\n/**\r\n * Classe di helper che espone funzioni statiche per la gestione dei pipe\r\n */\r\n@Injectable()\r\nexport class ColumnPipeHelper {\r\n\r\n  /**\r\n   * Restituisce il pipe da utilizzare per il tipo currency.\r\n   * Se il nodo currencyPipeCode della colonna assume un valore statico allora viene restituito quel valore altrimenti\r\n   * se il nodo risulta essere una funzione allora viene invocata passando come input l'elemento bindato alla riga della tabella\r\n   * @param column Configurazione della colonna per cui ottenere il pipe\r\n   * @param element Elemento bindato alla riga\r\n   * @returns Restituisce il pipe currency da applicare\r\n   */\r\n  getCurrencyPipe(column: ConfigColumn, element) {\r\n    if (column.currencyPipeCode && typeof (column.currencyPipeCode) == \"function\") {\r\n      return column.currencyPipeCode(element);\r\n    }\r\n    else\r\n      return column.currencyPipeCode;\r\n  }\r\n}\r\n\r\n","import { Component, OnInit, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ColumnAccessibilityHelper } from '../../helpers/columnAccessibility.helper';\r\nimport { ColumnPipeHelper } from '../../helpers/columnPipe.helper';\r\nimport { ColumnStyleHelper } from '../../helpers/columnStyle.helper';\r\nimport { ColumnValueHelper } from '../../helpers/columnValue.helper';\r\nimport { ConfigColumn, NumberColumnPipe } from '@eqproject/eqp-common';\r\n\r\n@Component({\r\n    selector: 'eqp-table-standard-column',\r\n    templateUrl: 'standard-column.component.html',\r\n    styleUrls: ['standard-column.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, MatTooltipModule],\r\n})\r\nexport class EqpTableStandardColumnComponent implements OnInit {\r\n\r\n    /**\r\n    * Configurazione della colonna di tipo boolean\r\n    */\r\n    readonly col = input.required<ConfigColumn>();\r\n\r\n    /**\r\n    * Elemento bindato alla riga\r\n    */\r\n    readonly element = input.required<any>();\r\n\r\n    /**\r\n    * Culture da usare\r\n    */\r\n    readonly currentCultureSelected = input<string>(undefined);\r\n\r\n\r\n    /**\r\n   * Locale da usare\r\n   */\r\n    readonly currentLocaleSelected = input<string>(undefined);\r\n\r\n    // public columnValueHelper = ColumnValueHelper;\r\n    // public columnStyleHelper = ColumnStyleHelper;\r\n    // public columnAccessibilityHelper = ColumnAccessibilityHelper;\r\n    // public columnPipeHelper = ColumnPipeHelper;\r\n\r\n    numberPipeEnum = NumberColumnPipe;\r\n    constructor(public columnValueHelper: ColumnValueHelper, public columnStyleHelper: ColumnStyleHelper, public columnAccessibilityHelper: ColumnAccessibilityHelper, public columnPipeHelper: ColumnPipeHelper) {\r\n    }\r\n\r\n    ngOnInit() {\r\n        //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n        if (!this.col() || !this.element()) {\r\n            let errorMessage: string = \"It is mandatory to indicate the configuration and the element to be used for the boolean column\";\r\n            console.log(errorMessage);\r\n            throw new Error(errorMessage);\r\n        }\r\n    }\r\n}\r\n","<ng-container>\n  <!-- Caso testo semplice senza PIPE definito -->\n  @if (col().numberPipe == null || col().numberPipe == undefined) {\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{ columnValueHelper.getValue(element(), col()) }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n  }\n\n  <!-- Caso testo semplice con PIPE: DECIMAL -->\n  @if (col().numberPipe == numberPipeEnum.DECIMAL) {\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{\n      columnValueHelper.getValue(element(), col())\n        | number\n          : (col().format ? col().format : \"1.0-3\")\n          : (currentCultureSelected() ? currentCultureSelected() : \"it-IT\")\n    }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n  }\n\n  <!-- Caso testo semplice con PIPE: PERCENT -->\n  @if (col().numberPipe == numberPipeEnum.PERCENT) {\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{ columnValueHelper.getValue(element(), col()) | percent }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n  }\n\n  <!-- Caso testo semplice con PIPE: CURRENCY -->\n  @if (col().numberPipe == numberPipeEnum.CURRENCY) {\n  <span [ngStyle]=\"columnStyleHelper.getNgStyle(col(), element())\">\n    {{\n      columnValueHelper.getValue(element(), col())\n        | currency\n          : columnPipeHelper.getCurrencyPipe(col(), element())\n          : \"symbol\"\n          : (col().format ? col().format : \"\")\n          : (currentLocaleSelected() ? currentLocaleSelected() : \"it\")\n    }}\n    {{ col().additionalValue != null ? col().additionalValue : \"\" }}\n  </span>\n  }\n\n  <!-- Gestione tooltip -->\n  @if (col().tooltip && columnAccessibilityHelper.getTooltipInfo(col(),element()) !=\n  null && columnAccessibilityHelper.getTooltipInfo(col(),element()) != '') {\n  <i\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(col(), element())\"\n    [matTooltipPosition]=\"\n      col().tooltip?.tooltipPosition != null\n        ? col().tooltip?.tooltipPosition\n        : 'below'\n    \"\n    style=\"margin-left: 5px\"\n    class=\"fa-solid fa-circle-info\"\n  ></i>\n  }\n</ng-container>\n","import { Component, OnInit, input } from '@angular/core';\r\nimport { CommonModule } from '@angular/common';\r\nimport { RouterModule } from '@angular/router';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { ColumnAccessibilityHelper } from '../../helpers/columnAccessibility.helper';\r\nimport { ColumnStyleHelper } from '../../helpers/columnStyle.helper';\r\nimport { ColumnValueHelper } from '../../helpers/columnValue.helper';\r\nimport { ConfigColumn } from '@eqproject/eqp-common';\r\n// import { ConfigColumn } from '@eqproject/eqp-common';\r\n\r\n@Component({\r\n    selector: 'eqp-table-navigate-column',\r\n    templateUrl: 'navigate-column.component.html',\r\n    styleUrls: ['navigate-column.component.scss'],\r\n    standalone: true,\r\n    imports: [CommonModule, RouterModule, MatTooltipModule],\r\n})\r\nexport class EqpTableNavigateColumnComponent implements OnInit {\r\n\r\n    /**\r\n    * Configurazione della colonna di tipo boolean\r\n    */\r\n    readonly col = input.required<ConfigColumn>();\r\n\r\n    /**\r\n    * Elemento bindato alla riga\r\n    */\r\n    readonly element = input.required<any>();\r\n\r\n    constructor(public columnValueHelper: ColumnValueHelper, public columnStyleHelper: ColumnStyleHelper, public columnAccessibilityHelper: ColumnAccessibilityHelper) {\r\n    }\r\n\r\n    ngOnInit() {\r\n        //Verifica che siano stati passati gli input obbligatori relativi alla configurazione della colonna e all'elemento bindato alla riga\r\n        if (!this.col() || !this.element()) {\r\n            let errorMessage: string = \"It is mandatory to indicate the configuration and the element to be used for the navigate column\";\r\n            console.log(errorMessage);\r\n            throw new Error(errorMessage);\r\n        }\r\n    }\r\n}\r\n","<ng-container>\n  <a\n    [routerLink]=\"columnValueHelper.getRouterLinkPath(col(), element())\"\n    [queryParams]=\"columnValueHelper.getNavigateQueryParams(col(), element())\"\n  >\n    {{ columnValueHelper.getNavigateText(col(), element()) }}\n  </a>\n\n  @if (col().tooltip && columnAccessibilityHelper.getTooltipInfo(col(),element())) {\n  <i\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(col(), element())\"\n    class=\"fa-solid fa-circle-info\"\n    style=\"margin-left: 5px\"\n  ></i>\n  }\n</ng-container>\n","import { CommonModule } from \"@angular/common\";\nimport {\n  ChangeDetectionStrategy,\n  Component,\n  computed,\n  effect,\n  input,\n  signal,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { MatPaginator, PageEvent } from \"@angular/material/paginator\";\nimport { TranslateModule } from \"@ngx-translate/core\";\n\n@Component({\n  selector: \"eqp-table-goto-page\",\n  templateUrl: \"./goto-page.component.html\",\n  styleUrls: [\"./goto-page.component.scss\"],\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [CommonModule, FormsModule, TranslateModule],\n})\nexport class EqpTableGotoPageComponent {\n  readonly paginator = input.required<MatPaginator>();\n  readonly label = input<string>(\"Vai a pagina\");\n\n  readonly pageInput = signal<number>(1);\n  private readonly pageLength = signal<number>(0);\n  private readonly pageSizeSig = signal<number>(0);\n\n  readonly pageCount = computed(() => {\n    const size = this.pageSizeSig();\n    if (!size) return 1;\n    return Math.max(1, Math.ceil(this.pageLength() / size));\n  });\n\n  constructor() {\n    effect((onCleanup) => {\n      const paginator = this.paginator();\n      if (!paginator) return;\n\n      this.pageInput.set(paginator.pageIndex + 1);\n      this.pageLength.set(paginator.length);\n      this.pageSizeSig.set(paginator.pageSize);\n\n      const sub = paginator.page.subscribe((evt: PageEvent) => {\n        this.pageInput.set(evt.pageIndex + 1);\n        this.pageLength.set(evt.length);\n        this.pageSizeSig.set(evt.pageSize);\n      });\n      onCleanup(() => sub.unsubscribe());\n    });\n  }\n\n  goto() {\n    const paginator = this.paginator();\n    if (!paginator || !paginator.pageSize) return;\n\n    const length = paginator.length;\n    const pageSize = paginator.pageSize;\n    const pageCount = Math.max(1, Math.ceil(length / pageSize));\n\n    let target = Number(this.pageInput());\n    if (!Number.isFinite(target) || target < 1) target = 1;\n    if (target > pageCount) target = pageCount;\n    this.pageInput.set(target);\n\n    const previousPageIndex = paginator.pageIndex;\n    const newPageIndex = target - 1;\n    if (newPageIndex === previousPageIndex) return;\n\n    paginator.pageIndex = newPageIndex;\n    paginator.page.emit({\n      length,\n      pageIndex: newPageIndex,\n      pageSize,\n      previousPageIndex,\n    });\n  }\n}\n","<span class=\"eqp-goto-label\">{{ label() }}</span>\n<input\n  type=\"number\"\n  min=\"1\"\n  [max]=\"pageCount()\"\n  [ngModel]=\"pageInput()\"\n  (ngModelChange)=\"pageInput.set($event)\"\n  (keydown.enter)=\"goto()\"\n  (blur)=\"goto()\"\n  class=\"eqp-goto-input\"\n  aria-label=\"Page number\"\n/>\n<span class=\"eqp-goto-separator\">/ {{ pageCount() }}</span>\n","import { Injectable, OnDestroy } from \"@angular/core\";\nimport { MatPaginatorIntl } from \"@angular/material/paginator\";\nimport { TranslateService } from \"@ngx-translate/core\";\nimport { Subscription } from \"rxjs\";\n\nconst KEY_PREFIX = \"EQP_TABLE.PAGINATOR.\";\n\nconst DEFAULTS = {\n  ITEMS_PER_PAGE_LABEL: \"Elementi per pagina:\",\n  NEXT_PAGE_LABEL: \"Pagina successiva\",\n  PREVIOUS_PAGE_LABEL: \"Pagina precedente\",\n  FIRST_PAGE_LABEL: \"Prima pagina\",\n  LAST_PAGE_LABEL: \"Ultima pagina\",\n  RANGE_LABEL_OF: \"di\",\n  RANGE_LABEL_EMPTY: \"0 di {{length}}\",\n};\n\n@Injectable()\nexport class EqpTablePaginatorIntl\n  extends MatPaginatorIntl\n  implements OnDestroy\n{\n  private langChangeSub?: Subscription;\n\n  constructor(private translate: TranslateService) {\n    super();\n    this.applyTranslations();\n    this.langChangeSub = this.translate.onLangChange.subscribe(() =>\n      this.applyTranslations()\n    );\n  }\n\n  override getRangeLabel = (\n    page: number,\n    pageSize: number,\n    length: number\n  ): string => {\n    const total = Math.max(length, 0);\n    if (total === 0 || pageSize === 0) {\n      return this.t(\"RANGE_LABEL_EMPTY\", { length: total });\n    }\n    const start = page * pageSize;\n    const end = start < total ? Math.min(start + pageSize, total) : start + pageSize;\n    return `${start + 1} – ${end} ${this.t(\"RANGE_LABEL_OF\")} ${total}`;\n  };\n\n  ngOnDestroy() {\n    this.langChangeSub?.unsubscribe();\n  }\n\n  private applyTranslations() {\n    this.itemsPerPageLabel = this.t(\"ITEMS_PER_PAGE_LABEL\");\n    this.nextPageLabel = this.t(\"NEXT_PAGE_LABEL\");\n    this.previousPageLabel = this.t(\"PREVIOUS_PAGE_LABEL\");\n    this.firstPageLabel = this.t(\"FIRST_PAGE_LABEL\");\n    this.lastPageLabel = this.t(\"LAST_PAGE_LABEL\");\n    this.changes.next();\n  }\n\n  private t(suffix: keyof typeof DEFAULTS, params?: Record<string, unknown>): string {\n    const fullKey = KEY_PREFIX + suffix;\n    const value = this.translate.instant(fullKey, params);\n    if (value === fullKey || value == null) {\n      return this.interpolate(DEFAULTS[suffix], params);\n    }\n    return value;\n  }\n\n  private interpolate(template: string, params?: Record<string, unknown>): string {\n    if (!params) return template;\n    return template.replace(/\\{\\{\\s*(\\w+)\\s*\\}\\}/g, (_, k) =>\n      params[k] != null ? String(params[k]) : \"\"\n    );\n  }\n}\n","import { Component, EventEmitter, Input, OnInit, Output, input, output } from \"@angular/core\";\r\nimport {\r\n  ConfigColumn,\r\n  CustomButton,\r\n  ExportEqpTable,\r\n} from \"@eqproject/eqp-common\";\r\nimport { FilterObject } from \"../filter-component/filter.model\";\r\n// import { TableColumnField } from '@eqproject/eqp-common';\r\nimport {\r\n  CdkDragDrop,\r\n  CdkDragEnd,\r\n  CdkDragRelease,\r\n  CdkDragStart,\r\n} from \"@angular/cdk/drag-drop\";\r\nimport { TableColumnField } from \"@eqproject/eqp-common\";\r\n\r\n@Component({\r\n  template: \"\",\r\n  standalone: true,\r\n})\r\n/**\r\n * Componente base che conterrà tutti gli input e gli output in modo da rendere più leggibile il codice di EqpTableComponent\r\n */\r\nexport class EqpTableBaseComponent implements OnInit {\r\n  //#region Definizione INPUT del componente\r\n\r\n  /**\r\n   * Titolo della testata (opzionale)\r\n   */\r\n  readonly headerTitle = input<any>();\r\n\r\n  /**\r\n   * Array generico di dati da dare in input alla tabella\r\n   */\r\n  @Input(\"data\") data = [];\r\n\r\n  /**\r\n   * Configurazione delle colonne da dare alla tabella, Tipo: Array<ConfigColumn>\r\n   * DEPRECATO\r\n   */\r\n  @Input(\"columns\") tableColumns: Array<ConfigColumn>;\r\n\r\n  /**\r\n   * Configurazione delle colonne da dare alla tabella, Tipo: Array<TableColumnField>\r\n   */\r\n  @Input(\"tableColumnFields\") tableColumnFields: Array<TableColumnField>;\r\n\r\n  /**\r\n   * Se true, verrà creata una mat-card come contenitore della tabella\r\n   */\r\n  readonly createMatCard = input<boolean>(false);\r\n\r\n  /**\r\n   * Se true, verrà creato una mat-card-header come contenitore della tabella\r\n   */\r\n  readonly createMatCardHeader = input<boolean>(false);\r\n\r\n  /**\r\n   * Opzionale => può essere definito il nome della tabella, attualmente utilizzato per salvare la paginazione della tabella specifica che si vuole modificare\r\n   */\r\n  readonly tableName = input<string>();\r\n\r\n  /**\r\n   * Permette di definire un'array di numeri per indicare le possibili dimensioni di paginazione della tabella, default: [5, 10, 25, 100]\r\n   */\r\n  readonly matPaginatorLength = input<Array<number>>([5, 10, 25, 100]);\r\n\r\n  /**\r\n   * Permette di definire il numero di default da usare per gli elementi da visualizzare in ogni pagina\r\n   */\r\n  @Input(\"matPaginatorSize\") matPaginatorSize: number;\r\n\r\n  /**\r\n   * Permette di definire l'indice dell'array delle dimensione di pagina da usare da impostare di default.\r\n   */\r\n  readonly matPaginatorIndex = input<number>(undefined);\r\n\r\n  /**\r\n   *\r\n   */\r\n  readonly matPaginatorCount = input<number>(undefined);\r\n\r\n  /**\r\n   * Permette di mostrare/nascondere la paginazione sotto la tabella, default true.\r\n   * Se viene impostato a FALSE allora la tabella non avrà paginazione\r\n   */\r\n  readonly paginatorVisible = input<boolean>(true);\r\n\r\n  /**\r\n   * Se true, viene aggiunta la funzionalità di selezione singola sulla tabella (default: false)\r\n   */\r\n  readonly selection = input<boolean>(false);\r\n\r\n  /**\r\n   * Se assume il valore true e se l'input 'selection' assume il valore true allora aggiunge la funzionalità di selezione multipla\r\n   * delle righe della tabella\r\n   */\r\n  readonly isMultipleSelection = input<boolean>(false);\r\n\r\n  /**\r\n   * Testo da mostrare nel caso in cui la tabella sia vuota (opzionale)\r\n   */\r\n  readonly emptyTableMessage = input<any>(undefined);\r\n\r\n  /**\r\n   * Visibilità del campo ricerca sopra la tabella, default true.\r\n   * Se False allora il campo di ricerca viene nascosto\r\n   */\r\n  readonly isTableSearcheable = input<boolean>(true);\r\n\r\n  /**\r\n   * Disabilita visivamente la riga. Accetta una stringa contentente il nome di una proprietà che deve essere contenuta nella tabella\r\n   * e che DEVE restituire valori booleani, altrimenti accetta una Function con lo stesso funzionamento oppure un valore booelano\r\n   */\r\n  readonly disableRow = input<string | Function | boolean>();\r\n\r\n  /**\r\n   * Se true, allora verrà utilizzato un emitter all'interno del translateHelper per gestire la sincronia delle chiamate con l'enumhelper\r\n   * che si dovrà occupare di ritornare (nel caso di enumeratore) l'elenco tradotto (default: false)\r\n   */\r\n  readonly isMultiLanguage = input<boolean>(false);\r\n\r\n  /**\r\n   * Definizione delle cultureInfo da utilizzare per il formato del filtro dati nella tabella (default: it-IT)\r\n   */\r\n  readonly cultureInfo = input<string>(\"it-IT\");\r\n\r\n  /**\r\n   * Se true, vengono mostrati 2 bottoni nel fondo della card a cui saranno passate delle funzioni dall'utente\r\n   */\r\n  readonly showFunctionButtons = input<boolean>(false);\r\n\r\n  /**\r\n   * Testo del pulsante Conferma, di default restituirà 'Conferma'\r\n   */\r\n  readonly functionButtonConfirmText = input<string>(undefined);\r\n\r\n  /**\r\n   * Testo del pulsante Esci, di default restituirà 'Esci'\r\n   */\r\n  readonly functionButtonExitText = input<string>(undefined);\r\n\r\n  /**\r\n   * Definisce se la tabella evidenzia la riga selezionata (passando un'evento di output per la riga)\r\n   */\r\n  readonly isHighlight = input<boolean>(false);\r\n\r\n  /**\r\n   * Definizione del colore dell'highlight, di default è #E4E5E6(grigio), N.B. deve essere RGB\r\n   */\r\n  readonly highlightColor = input<string>(\"#E4E5E6\");\r\n\r\n  /**\r\n   * Definizione della colore della tabella\r\n   */\r\n  readonly tableColor = input(undefined);\r\n\r\n  /**\r\n   * Definizione del colore del paginator\r\n   */\r\n  readonly paginatorColor = input(undefined);\r\n\r\n  /**\r\n   * Indica il nome del file che si sta esportando, se non definito verrà attribuito il nome \"New\"\r\n   */\r\n  @Input(\"exportEqpTable\") exportEqpTable: ExportEqpTable;\r\n\r\n  /**\r\n   * Vengono passati i pulsanti custom all'header dell'eqp-table (di fianco al cerca)\r\n   */\r\n  readonly customButtons = input<Array<CustomButton>>();\r\n\r\n  /**\r\n   * Etichetta da applicare al campo di ricerca testuale\r\n   */\r\n  readonly searchText = input<string>(undefined);\r\n\r\n  /**\r\n   * Gestione dell'espansione del menù a tendina dei filtri singoli\r\n   */\r\n  @Input(\"singleFilterColumnVisible\") singleFilterColumnVisible: boolean = true;\r\n\r\n  /**\r\n   * Testo del pulsante in caso devono essere mostrati i filtri singolo\r\n   */\r\n  readonly showFilterText = input<string>(\"Mostra filtri\");\r\n\r\n  /**\r\n   * Testo del pulsante in caso devono essere nascosti i filtri singolo\r\n   */\r\n  readonly hideFilterText = input<string>(\"Nascondi filtri\");\r\n\r\n  /**\r\n   * Se è stato richiesto l'utilizzo dei filtri su singola colonna, attraverso quest'input sarà possibile\r\n   * aprire/chiudere l'accordion tra l'header e il body della tabella in cui sono contenuti i filtri su singola colonna\r\n   */\r\n  readonly showSingleFilterButton = input<boolean>(true);\r\n\r\n  /**\r\n   * Testo del tooltip del pulsante di switch in caso devono essere mostrati i filtri generici\r\n   */\r\n  readonly switchFilterToGenericText = input<string>(\"Usa filtro generico\");\r\n\r\n  /**\r\n   * Testo del tooltip del pulsante di switch in caso devono essere mostrati i filtri a singola colonna\r\n   */\r\n  readonly switchFilterToSingleText = input<string>(\r\n    \"Usa filtro per singola colonna\"\r\n  );\r\n\r\n  /**\r\n   * Possibilità di utilizzare lo switch dei filtri (singolo o generico)\r\n   */\r\n  readonly switchFilterType = input<boolean>(false);\r\n\r\n  /**\r\n   * Definisce se il filtro è per colonna singola\r\n   */\r\n  @Input(\"isSingleColumnFilter\") isSingleColumnFilter: boolean = false;\r\n\r\n  /**\r\n   *\r\n   */\r\n  readonly currencyFilterToReplace = input<string>(undefined);\r\n\r\n  /**\r\n   *\r\n   */\r\n  readonly currencyFilterToUse = input<string>(undefined);\r\n\r\n  /**\r\n   * Visualizzazione tasto \"Vai a prima-ultima pagina\"\r\n   */\r\n  readonly showFirstLastButtons = input<boolean>(false);\r\n\r\n  /**\r\n   * Se true, accanto al mat-paginator viene mostrato un controllo \"Vai a pagina N\" (default: false)\r\n   */\r\n  readonly gotoPageEnabled = input<boolean>(false);\r\n\r\n  /**\r\n   * Se richiesto, disabilito il salvataggio delle informazioni della pagina nel localstorage\r\n   */\r\n  readonly disablePageStorageSave = input<boolean>(false);\r\n\r\n  readonly disableRowColor = input<string>(\"#8080808c\");\r\n\r\n  /**\r\n   * Se true, gestisce dinamicamente le colonne della tabella e al resize le mette in una riga di detail espandibile\r\n   */\r\n  readonly autoResizeColumns = input<boolean>(false);\r\n\r\n  /**\r\n   * Se true, l'utente può scegliere quali colonne mostrare/nascondere dinamicamente\r\n   */\r\n  readonly chooseColumnsToShow = input<boolean>(false);\r\n\r\n  readonly chooseColumnsToShowText = input<string>(\"Visualizza colonne\");\r\n\r\n  /**\r\n   * Stringa contenente tutte le classi che verrano applicate alla mat-row\r\n   */\r\n  readonly rowCssClass = input<Function | string>();\r\n\r\n  /**\r\n   * Stringa contenente tutte le classi che verrano applicate alla mat-cell\r\n   */\r\n  readonly cellCssClass = input<Function | string>();\r\n\r\n  /**\r\n   * Stringa contenente tutte le classi che verrano applicate alla mat-header\r\n   */\r\n  readonly headerCellCssClass = input<Function | string>();\r\n\r\n  /**\r\n   * Se true, l'header della tabella sarà sticky verticalmente\r\n   */\r\n  readonly isStickyHeader = input<boolean>(false);\r\n\r\n  /**\r\n   * Nome della proprietà che sarà assegnata alla selezione di un valore nella checkbox, di default\r\n   * verrà chiamata isSelected\r\n   */\r\n  readonly isSelectedPropertyName = input<string>(\"isSelected\");\r\n\r\n  /**\r\n   * Proprietà che fa in modo che le righe siano draggable\r\n   */\r\n  @Input(\"enableDragAndDrop\") enableDragAndDrop: boolean = false;\r\n\r\n  /**\r\n   * Se enableDragAndDrop è true, permette di cambiare la posizione delle righe della tabella trascinandole\r\n   */\r\n  readonly changeDragRowPosition = input<boolean>(false);\r\n\r\n  readonly enableDragColumn = input<boolean>(false);\r\n\r\n  /**\r\n   * Se true, i filtri vengono generati automaticamente dall'oggetto ConfigColumn\r\n   */\r\n  readonly enableFilters = input<boolean>(false);\r\n\r\n  readonly filterObject = input<FilterObject>(undefined);\r\n\r\n  readonly filtersSelected = output<any>();\r\n\r\n  readonly customFiltersSavedValueLoaded = output<any>();\r\n\r\n  //#endregion\r\n\r\n  //#region Defizione OUTPUT del componente\r\n\r\n  /**\r\n   * Espone tutti gli elementi selezionati con la checkbox\r\n   */\r\n  readonly checkboxInfo = output<any>();\r\n\r\n  /**\r\n   * Espone l'elemento appena selezionato/deselezionato\r\n   */\r\n  readonly checkboxJustSelectedInfo = output<any>();\r\n\r\n  /**\r\n   * Espone in caso di paginazione lato server l'emitter contente: previousSize, pageIndex, pageSize\r\n   */\r\n  @Output() pageChange = new EventEmitter<any>();\r\n\r\n  /**\r\n   * Evento scatenato al change del sort, all'interno dell'evento viene passato il nome della colonna e il verso\r\n   */\r\n  readonly sortChange = output<any>();\r\n\r\n  /**\r\n   * Espone la riga selezionata con l'highlight\r\n   */\r\n  readonly highlightSelected = output<any>();\r\n\r\n  /**\r\n   * Viene scatenato alla deselezione dell'highlight\r\n   */\r\n  readonly highlightDeselected = output<any>();\r\n\r\n  /**\r\n   * Evento di conferma scatenato al click del tasto, se abbinato con l'evento di checkbox restituirà gli elementi selezionati\r\n   */\r\n  readonly functionButtonConfirm = output<any>();\r\n\r\n  /**\r\n   * Evento di uscita scatenato al click del tasto\r\n   */\r\n  readonly functionButtonExit = output<any>();\r\n\r\n  /**\r\n   * Evento scatenato all'avvio della funzione di esportazione della tabella\r\n   */\r\n  readonly eqpExportStarted = output();\r\n\r\n  /**\r\n   * Evento scatenato al termine della funzione di esportazione della tabella\r\n   */\r\n  readonly eqpExportCompleted = output();\r\n\r\n  /** Eventi drag and drop per ogni stato */\r\n  readonly dragStartedEvent = output<{\r\n    event: CdkDragStart<any>;\r\n    row: any;\r\n  }>();\r\n  readonly dragReleasedEvent = output<{\r\n    event: CdkDragRelease<any>;\r\n    row: any;\r\n  }>();\r\n  readonly dragEndedEvent = output<{\r\n    event: CdkDragEnd<any>;\r\n    row: any;\r\n  }>();\r\n  readonly dragDropEvent = output<{\r\n    event: CdkDragDrop<any>;\r\n    row: any;\r\n  }>();\r\n\r\n  /**\r\n   * Evento scatenato dalla ricerca della tabella (singola e multipla)\r\n   */\r\n  readonly filteredColumns = output<any>();\r\n\r\n  //#endregion\r\n\r\n  constructor() {}\r\n\r\n  ngOnInit() {}\r\n}\r\n","import { ConfigColumn, TypeColumn } from \"@eqproject/eqp-common\";\r\nimport { ColumnValueHelper } from \"./columnValue.helper\";\r\nimport { DatePipe } from '@angular/common';\r\nimport { MatTableDataSource } from \"@angular/material/table\";\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n/**\r\n* Costante per definire i caratteri speciali possibili da utilizzare come separatore nel formato data.\r\n*/\r\nconst SPLIT_CHARACTERS: string = \"*|/,:;.-\";\r\n\r\n/**\r\n * Servizio di helper contenente le funzioni di utilità per l'utilizzo dei filtri di ricerca\r\n */\r\n@Injectable()\r\nexport class SearchFilterHelper {\r\n\r\n  datePipe: DatePipe = null;\r\n  tableColumns: Array<ConfigColumn> = null;\r\n  cultureInfo: string = null;\r\n  currencyFilterToReplace: string = null;\r\n  currencyFilterToUse: string = null;\r\n\r\n  constructor(private columnValueHelper: ColumnValueHelper) {\r\n\r\n  }\r\n\r\n  /**\r\n     * Funzione richiamata nella costruzione del FilterPredicate custom,si occupa di comporre (per ciascun elemento della tabella) una stringa\r\n     * ottenuta dalla concatenazione di tutti i valori mostrati nelle colonne valide per la ricerca.\r\n     *\r\n     * La stringa risultante sarà poi usata per l'applicazione del filtro nel metodo reloadDatatable\r\n     *\r\n     * N.B. La funzione, tramite il reduce richiamato nella funzione del filter predicate, viene richiamata per ogni proprietà dell'oggetto\r\n     * bindato alla riga della tabella\r\n     *\r\n     * @param searchString Stringa costruita ricorsivamente (dall'accumulator) che contiene la concatenazione dei valori delle proprietà dell'elemento cu sui fare la ricerca\r\n     * @param rowItem Elemento bindato alla riga\r\n     * @param columnKey Chiave della ConfigColumn\r\n     * @returns\r\n     */\r\n  createFilterRow(searchString, rowItem, itemPropertyName) {\r\n\r\n    if (searchString == null || searchString == undefined)\r\n      searchString = \"\";\r\n\r\n    //Recupera tutte le colonne della tabella associate alla property name corrente (potrebbero esserci più colonne che nel value utilizzano la stessa proprietà quindi è necessario recuperarle tutte)\r\n    let propertyObjectColumns = this.tableColumns.filter(x => x.key == itemPropertyName || (x.value != null && x.value.toString().toLowerCase().includes(itemPropertyName.toLowerCase()) == true));\r\n\r\n    //Se non ci sono colonne associate alla proprietà esce restituendo una stringa vuota\r\n    if (propertyObjectColumns == null || propertyObjectColumns == undefined || propertyObjectColumns.length == 0) {\r\n      searchString += \"\";\r\n    }\r\n    else {\r\n      //Filtra le colonne recuperate escludendo tutte quelle di tipo SIMPLE_ACTION, MENU_ACTION, ICON, IMAGE o CHECKBOX (non servono per la ricerca)\r\n      //più tutte quelle per cui la proprietà isSearchable è stata impostata a FALSE\r\n      let validColumns = propertyObjectColumns.filter(c => c.isSearchable != false && this.isColumnTypeValidForSearch(c.type, c.isSearchable));\r\n\r\n      //Se non ci sono colonne valide esce restituendo una stringa vuota\r\n      if (validColumns == null || validColumns.length == 0) {\r\n        searchString += \"\";\r\n      }\r\n      else {\r\n        //Cicla le colonne valide e per ciascuna di esse ricostruisce il valore mostrato nella colonna e lo aggiunge alla stringa su cui verrà fatta la ricerca finale\r\n        for (var colIndex = 0; colIndex < validColumns.length; colIndex++) {\r\n          //Concateno alla searchString il valore mostrato nella colonna corrente, ricostruito con gli stessi metodi\r\n          //usati nelle diverse celle della tabella\r\n          let currentColumn = validColumns[colIndex];\r\n          if (currentColumn.type == TypeColumn.Enum) {\r\n            searchString += this.columnValueHelper.getEnumValue(currentColumn.enumModel, rowItem, currentColumn);\r\n          }\r\n          else if (currentColumn.type == TypeColumn.Boolean) {\r\n            searchString += this.columnValueHelper.getBooleanValue(rowItem, currentColumn);\r\n          }\r\n          else if (currentColumn.type == TypeColumn.Date) {\r\n            //Recupero il valore della data w e poi lo riscrivo nel formato visualizzato in base alla lingua\r\n            let data = this.columnValueHelper.getDateValue(rowItem, currentColumn);\r\n            let currentDate: any = null;\r\n            if (data == null) {\r\n              searchString += \"\";\r\n              return searchString;\r\n            }\r\n            else if (typeof data === \"string\") {\r\n              currentDate = new Date(data);\r\n\r\n            }\r\n            else {\r\n              currentDate = data;\r\n            }\r\n\r\n            let currentDateText: string = this.datePipe.transform(currentDate, currentColumn.format ?? \"shortDate\", null, this.cultureInfo);\r\n            let arrayOfSplChars: Array<string> = Array.from(SPLIT_CHARACTERS);\r\n            let usedSplChar: string;\r\n\r\n            arrayOfSplChars.forEach(element => {\r\n              if (currentDateText.includes(element)) {\r\n                usedSplChar = element;\r\n                let splittedDate = currentDateText.split(element);\r\n                splittedDate.forEach(function (singleDate, index) {\r\n                  if (singleDate.length <= 1) {\r\n                    splittedDate[index] = singleDate.padStart(2, \"0\");\r\n                  }\r\n                });\r\n                currentDateText = splittedDate.join(usedSplChar);\r\n              }\r\n            });\r\n\r\n            searchString += currentDateText;\r\n          }\r\n          else if (currentColumn.type == TypeColumn.ExternalTemplate) {\r\n            try {\r\n              if (rowItem[itemPropertyName] == null || rowItem[itemPropertyName] == undefined) {\r\n                searchString += \"\";\r\n              }\r\n              else if (Array.isArray(rowItem[itemPropertyName]) || typeof (rowItem[itemPropertyName] === 'object')) {\r\n\r\n                searchString += JSON.stringify(rowItem[itemPropertyName]);\r\n              }\r\n              else {\r\n                searchString += rowItem[itemPropertyName].toString().toLowerCase();\r\n              }\r\n            }\r\n            catch (Error) {\r\n              searchString += \"\";\r\n            }\r\n          }\r\n          else {\r\n            searchString += this.columnValueHelper.getValue(rowItem, currentColumn);\r\n          }\r\n        }\r\n      }\r\n    }\r\n    return searchString;\r\n  }\r\n\r\n  /**\r\n   * Restituisce TRUE se il type della colonna risulta essere valido per la ricerca altrimenti restituisce FALSE\r\n   * @param c Colonna della tabella per cui verificare la validità del type per la ricerca\r\n   * @returns\r\n   */\r\n  isColumnTypeValidForSearch(type: TypeColumn, isSearchable: boolean): boolean {\r\n    return type != TypeColumn.Icon && type != TypeColumn.Checkbox && type != TypeColumn.Image && type != TypeColumn.MenuAction && type != TypeColumn.SimpleAction && type != TypeColumn.Color && isSearchable != false\r\n  }\r\n\r\n  /**\r\n   * Si occupa di costruire il predicato da associare al filterPredicate del datasource della mat-table\r\n   * @param dataSource Datasource della mat-table\r\n   * @param isSingleColumnFilter Input di eqp-table che specifica se si sta usando la ricerca globale o su singola colonna\r\n   * @param selectedColumnToSearch Chiave della colonna su cui applicare il filtro (usata solo se isSingleColumnFIlter = true)\r\n   * @param row Riga della mat-table\r\n   * @param filter Valore del filtro inserito dall'utente\r\n   * @returns Restituisce un booleano con valore TRUE per le righe che soddisfano il filtro, altrimenti restituisce FALSE\r\n   */\r\n  createFilterPredicate(dataSource: MatTableDataSource<any>, isSingleColumnFilter: boolean, selectedColumnToSearch: string, row, filter: string): boolean {\r\n    // Se è un filtro a colonna singola, controlla se il row esiste nei dati filtrati\r\n    if (isSingleColumnFilter && dataSource.filteredData != null && dataSource.filteredData.find(x => x === row) === null) {\r\n      return false; // Esplicitamente restituisce false se la riga non è nei dati filtrati\r\n    }\r\n\r\n    // Creazione dell'accumulatore per la stringa dei dati da confrontare con il filtro\r\n    const accumulator = (currentTerm, key) => {\r\n      return this.createFilterRow(currentTerm, row, key);\r\n    };\r\n\r\n    // Crea la stringa da filtrare in base al tipo di filtro (colonna singola o multipla)\r\n    const dataStr = !isSingleColumnFilter\r\n      ? Object.keys(row).reduce(accumulator, '').toLowerCase().replace(/\\s/g, '')\r\n      : this.createFilterRow(null, row, selectedColumnToSearch).toLowerCase().replace(/\\s/g, '');\r\n\r\n    // Pulizia del filtro da spazi bianchi\r\n    filter = filter.replace(/\\s/g, '');\r\n\r\n    // Gestione del filtro per valute, se configurato\r\n    if (this.currencyFilterToReplace != null) {\r\n      if (this.currencyFilterToUse == null) {\r\n        throw new Error(\"Attenzione, la proprietà currencyFilterToUse è obbligatoria!\");\r\n      }\r\n      filter = filter.split(this.currencyFilterToReplace).join(this.currencyFilterToUse);\r\n    }\r\n\r\n    // Trasformazione del filtro in minuscolo\r\n    const transformedFilter = filter.toString().trim().toLowerCase();\r\n\r\n    // Restituisce true se la stringa del dato contiene il filtro\r\n    return dataStr.indexOf(transformedFilter) !== -1;\r\n  }\r\n\r\n  addExternalTemplateFilters() {\r\n\r\n  }\r\n}\r\n\r\n","import { Injectable } from \"@angular/core\";\r\nimport { TypeColumn } from \"@eqproject/eqp-common\";\r\n\r\n/**\r\n * Servizio di helper contenente le funzioni di utilità per la gestione dell'ordinamento\r\n */\r\n@Injectable()\r\nexport class SortingHelper {\r\n\r\n    /**\r\n     * Funzione custom per il sort\r\n     * @param tableColumns AAA\r\n     * @param obj Elemento bindato alla riga\r\n     * @param path Nome proprietà\r\n     * @returns String | Number\r\n    */\r\n    getSortOrder(tableColumns, row, path) {\r\n\r\n        //Trovo la colonna che corrisponde al path nel key o nel value\r\n        let foundedColumn = tableColumns.find(x => x.key == path || x.value == path);\r\n\r\n        if (foundedColumn.value != null) {\r\n\r\n            //Se un template ha la funzione di ricerca, filtro per quella funzione altrimenti restituisco il valore dalla row\r\n            if (foundedColumn.type == TypeColumn.ExternalTemplate)\r\n                if (foundedColumn.externalTemplateSearchFunction != null)\r\n                    return foundedColumn.externalTemplateSearchFunction(row);\r\n                else\r\n                    return row[path];\r\n\r\n            // Se è una funzione, chiamala con la riga come argomento e usa il suo risultato per il sorting\r\n            if (typeof foundedColumn.value === 'function') {\r\n                return foundedColumn.value(row);\r\n\r\n                //Se è una stringa concatena (es: Nome, Cognome), splitto la prima parola e cerco per quella\r\n            } else if (foundedColumn.value.toString().includes(\",\")) {\r\n                let stringArray = \"\";\r\n\r\n                foundedColumn.value.toString().split(',').forEach(propertyPath => {\r\n                    stringArray += row[propertyPath];\r\n                });\r\n\r\n                return stringArray;\r\n\r\n            } else {\r\n                //Faccio il reduce di una proprietà complessa (es: object.Nome), tipico caso dell'utilizzo del tipo value\r\n                return foundedColumn.value.toString().split('.').reduce((o, p) => o && o[p], row)\r\n            }\r\n        } else {\r\n            return row[path];\r\n        }\r\n\r\n    }\r\n}\r\n","import { Injectable, ChangeDetectorRef } from \"@angular/core\";\r\nimport { EqpTableComponent } from \"../eqp-table.component\";\r\n\r\n@Injectable()\r\nexport class ResizeHelper {\r\n  tableContext: EqpTableComponent;\r\n\r\n  constructor(private cd: ChangeDetectorRef) {}\r\n\r\n  public initializeEqpTableContext(eqpTableComponent: EqpTableComponent) {\r\n    this.tableContext = eqpTableComponent;\r\n  }\r\n\r\n  doResize(tableContext: EqpTableComponent) {\r\n    this.getDetailColumns();\r\n    this.cd.detectChanges();\r\n\r\n    tableContext.dataSource.data.forEach((row) => {\r\n      row.expanded = false;\r\n    });\r\n  }\r\n\r\n  toggleRow(element: { expanded: boolean }) {\r\n    //Se non ci sono elementi, non faccio aprire il dettaglio\r\n    if (\r\n      this.tableContext.detailColumns == null ||\r\n      this.tableContext.detailColumns.length === 0\r\n    ) {\r\n      element.expanded = false;\r\n      this.cd.markForCheck();\r\n      return;\r\n    }\r\n    this.getDetailColumns();\r\n    element.expanded = !element.expanded;\r\n    this.cd.markForCheck();\r\n  }\r\n\r\n  // Restituisce la lista delle colonne visibili nel riepilogo e popola la lista di colonne visibili nel dettaglio\r\n  getKeysInViewPort(keys: Array<string>): Array<string> {\r\n    if (keys == null) return keys;\r\n\r\n    if (keys.find((x) => x == \"Detail\") == null) keys.unshift(\"Detail\");\r\n\r\n    this.tableContext.detailColumns = [];\r\n    const visibleColumns = []; // Array per tenere traccia delle colonne visibili\r\n    const addingColumns = []; // Array per tenere traccia delle colonne aggiunte\r\n    let continueCanAddColumn: boolean = true;\r\n    for (let index = 0; index < keys.length; index++) {\r\n      if (this.isInViewport(keys[index]) !== true) {\r\n        if (\r\n          continueCanAddColumn == true &&\r\n          this.canAddColumn(keys[index], addingColumns) == true\r\n        ) {\r\n          const columnIndex = visibleColumns.indexOf(keys[index]);\r\n          if (columnIndex !== -1) visibleColumns.splice(columnIndex, 1);\r\n        } else {\r\n          continueCanAddColumn = false;\r\n          this.tableContext.detailColumns.push(keys[index]);\r\n        }\r\n      } else {\r\n        visibleColumns.push(keys[index]);\r\n      }\r\n    }\r\n\r\n    keys = keys.filter((x) => !this.tableContext.detailColumns.includes(x));\r\n\r\n    //Se non ci sono le colonne del dettaglio, rimuovo la colonna Detail\r\n    if (this.tableContext.detailColumns.length == 0)\r\n      keys = keys.filter((x) => x != \"Detail\");\r\n\r\n    return keys;\r\n  }\r\n\r\n  calculateVisibleColumnsWidth(addingColumns: Array<string>) {\r\n    const firstRow = document.querySelector(\"table > tbody > tr\");\r\n    const tableWidth = this.tableContext\r\n      .tableContainer()\r\n      .nativeElement.getBoundingClientRect();\r\n    const visibleColumns = Array.from(firstRow.querySelectorAll(\"td\")).filter(\r\n      (cell) => {\r\n        const rect = cell.getBoundingClientRect();\r\n        return (\r\n          rect.width !== 0 &&\r\n          rect.height !== 0 &&\r\n          rect.left - tableWidth.left < tableWidth.width\r\n        );\r\n      }\r\n    );\r\n\r\n    let totalWidth = 0;\r\n\r\n    for (let key of visibleColumns) {\r\n      const column = this.tableContext.tableColumns.find(\r\n        (cd) =>\r\n          cd.key ===\r\n          Array.from(key.classList)\r\n            .find((x) => x.includes(\"mat-column-\"))\r\n            .replace(\"mat-column-\", \"\")\r\n      );\r\n\r\n      if (column) {\r\n        const flex = column.styles?.flex;\r\n        const minWidth = column.styles?.minWidth;\r\n        const maxWidth = column.styles?.maxWidth;\r\n        let columnWidth;\r\n\r\n        if (minWidth) {\r\n          // Calcola la larghezza in base alla proprietà min-width\r\n          columnWidth = parseFloat(minWidth);\r\n        } else if (maxWidth) {\r\n          // Calcola la larghezza in base alla proprietà max-width\r\n          columnWidth = parseFloat(maxWidth);\r\n        } else if (flex) {\r\n          // Calcola la larghezza in base alla proprietà flex\r\n          const flexValues = flex.split(\" \");\r\n          const flexBasis = flexValues[2];\r\n          columnWidth = (parseFloat(flexBasis) / 100) * tableWidth.width;\r\n        } else {\r\n          // Default: usa standardFlexValue (es. \"0 0 10%\")\r\n          const defaultFlex = this.tableContext.standardFlexValue.split(\" \");\r\n          const defaultBasis = parseFloat(defaultFlex[2]);\r\n          columnWidth = (defaultBasis / 100) * tableWidth.width;\r\n        }\r\n\r\n        totalWidth += columnWidth;\r\n      }\r\n    }\r\n\r\n    const visibleColumnKeys = Array.from(visibleColumns).map((column) => {\r\n      const classList = Array.from(column.classList);\r\n      const keyClass = classList.find((className) =>\r\n        className.includes(\"mat-column-\")\r\n      );\r\n      return keyClass.replace(\"mat-column-\", \"\");\r\n    });\r\n\r\n    for (let key of addingColumns) {\r\n      let column = this.tableContext.tableColumns.find((cd) => cd.key === key);\r\n\r\n      //Se la chiave è già presente, metto la colonna a null perchè non deve essere calcolata\r\n      if (visibleColumnKeys.find((x) => x == key)) {\r\n        column = null;\r\n      }\r\n\r\n      if (column) {\r\n        const flex = column.styles?.flex;\r\n        const minWidth = column.styles?.minWidth;\r\n        const maxWidth = column.styles?.maxWidth;\r\n        let columnWidth;\r\n\r\n        if (minWidth) {\r\n          // Calcola la larghezza in base alla proprietà min-width\r\n          columnWidth = parseFloat(minWidth);\r\n        } else if (maxWidth) {\r\n          // Calcola la larghezza in base alla proprietà max-width\r\n          columnWidth = parseFloat(maxWidth);\r\n        } else if (flex) {\r\n          // Calcola la larghezza in base alla proprietà flex\r\n          const flexValues = flex.split(\" \");\r\n          const flexBasis = flexValues[2];\r\n          columnWidth = (parseFloat(flexBasis) / 100) * tableWidth.width;\r\n        } else {\r\n          // Default: usa standardFlexValue (es. \"0 0 10%\")\r\n          const defaultFlex = this.tableContext.standardFlexValue.split(\" \");\r\n          const defaultBasis = parseFloat(defaultFlex[2]);\r\n          columnWidth = (defaultBasis / 100) * tableWidth.width;\r\n        }\r\n\r\n        totalWidth += columnWidth;\r\n      }\r\n    }\r\n\r\n    return totalWidth;\r\n  }\r\n\r\n  // Verifica se è possibile aggiungere una colonna di dettaglio nella tabella attuale\r\n  canAddColumn(key: string, addingColumns: Array<string>): boolean {\r\n    const column = this.tableContext.tableColumns.find((cd) => cd.key === key);\r\n\r\n    if (column == null) return false;\r\n\r\n    if (addingColumns.find((x) => x == key) == null) addingColumns.push(key);\r\n\r\n    const tableWidth =\r\n      this.tableContext.tableContainer().nativeElement.clientWidth;\r\n    const visibleColumnsWidth =\r\n      this.calculateVisibleColumnsWidth(addingColumns); // Passa l'array delle colonne visibili\r\n    const marginVisibleColumns = 30;\r\n    // Se la larghezza delle colonne visibili è minore o uguale alla larghezza della tabella, è possibile aggiungere la colonna\r\n    if (visibleColumnsWidth + marginVisibleColumns < tableWidth == true)\r\n      return true;\r\n    else {\r\n      // addingColumns.pop();\r\n      return false;\r\n    }\r\n\r\n    // return (visibleColumnsWidth + columnWidth) <= tableWidth;\r\n  }\r\n\r\n  // Verifica se la colonna corrente è completamente visibile nella tabella\r\n  isInViewport(key): boolean {\r\n    const fullKey = \"mat-column-\" + key;\r\n    const elementToSearch = document.getElementsByClassName(fullKey);\r\n\r\n    // Se l'elemento cercato non esiste o non è visibile, restituisci true (se non lo trova, ritorna sempre un array vuoto)\r\n    if (elementToSearch == null || elementToSearch.length === 0) return true;\r\n\r\n    //Se lo trova ma è nella tabella sbagliata, dico che non è nel viewport\r\n    if (\r\n      elementToSearch[0].parentElement.parentElement.parentElement.id !=\r\n      \"eqp-table\"\r\n    )\r\n      return false;\r\n\r\n    const elementRect = elementToSearch[0].getBoundingClientRect();\r\n    // if (elementRect.bottom == 0 && elementRect.right == 0 && elementRect.left == 0 && elementRect.top == 0)\r\n    // return\r\n    const tableRect = this.tableContext\r\n      .tableContainer()\r\n      .nativeElement.getBoundingClientRect();\r\n\r\n    const leftMargin = 0;\r\n    const rightMargin = 20;\r\n\r\n    const leftVisible = elementRect.left >= tableRect.left + leftMargin;\r\n    const rightVisible = elementRect.right <= tableRect.right - rightMargin;\r\n\r\n    return leftVisible && rightVisible;\r\n  }\r\n\r\n  getDetailColumns() {\r\n    if (this.tableContext.displayedColumns == null) return;\r\n\r\n    this.tableContext.detailConfigColumns =\r\n      this.tableContext.tableColumns.filter((x) =>\r\n        this.tableContext.detailColumns.includes(x.key)\r\n      );\r\n  }\r\n}\r\n","import { Directive, ElementRef, Input, input, output } from \"@angular/core\";\r\nimport * as XLSX from \"xlsx\";\r\nimport jsPDF from \"jspdf\";\r\nimport autoTable from \"jspdf-autotable\";\r\nimport { ExportEqpTable } from \"@eqproject/eqp-common\";\r\nimport { MatPaginator } from \"@angular/material/paginator\";\r\n\r\n@Directive({\r\n  selector: \"[eqpMatTableExporter]\",\r\n  exportAs: \"eqpMatTableExporter\",\r\n  standalone: true,\r\n})\r\nexport class EqpMatTableExporterDirective {\r\n  @Input() hiddenColumns: number[] = [];\r\n  readonly exportEqpTable = input<ExportEqpTable>(undefined);\r\n  @Input() tableElement!: ElementRef<HTMLTableElement>;\r\n  readonly paginator = input<MatPaginator | undefined>(undefined);\r\n\r\n  readonly exportStarted = output<void>();\r\n  readonly exportCompleted = output<void>();\r\n\r\n  constructor(private el: ElementRef) {}\r\n\r\n  async exportTable(fileType: string = \"xlsx\", fileName?: string) {\r\n    this.exportStarted.emit();\r\n\r\n    const table: HTMLTableElement =\r\n      this.tableElement?.nativeElement ||\r\n      this.el.nativeElement.querySelector(\"table\");\r\n    if (!table) {\r\n      console.warn(\"Nessuna <table> trovata nel componente.\");\r\n      return;\r\n    }\r\n\r\n    const type = fileType || this.exportEqpTable()?.exportFileType || \"xlsx\";\r\n    const name = fileName || this.exportEqpTable()?.exportFileName || \"export\";\r\n    const needsSanitization = [\"xlsx\", \"xls\", \"csv\", \"txt\"].includes(\r\n      type.toLowerCase()\r\n    );\r\n\r\n    const headers = this.extractTableHeaders(table);\r\n    const data = await this.extractAllTableRowsPaged(table, needsSanitization);\r\n\r\n    const allRows = [headers, ...data];\r\n\r\n    switch (type) {\r\n      case \"csv\":\r\n        this.exportAsCSV(allRows, name);\r\n        break;\r\n\r\n      case \"json\":\r\n        this.exportAsJSON(headers, data, name);\r\n        break;\r\n\r\n      case \"pdf\":\r\n        this.exportAsPDF(headers, data, name);\r\n        break;\r\n\r\n      case \"txt\":\r\n        this.exportAsTXT(allRows, name);\r\n        break;\r\n\r\n      default:\r\n        this.exportAsXLSX(allRows, name);\r\n        break;\r\n    }\r\n\r\n    this.exportCompleted.emit();\r\n  }\r\n\r\n  private exportAsCSV(data: string[][], fileName: string): void {\r\n    const csv = XLSX.utils.sheet_to_csv(XLSX.utils.aoa_to_sheet(data));\r\n    this.downloadFile(\r\n      \"\\uFEFF\" + csv,\r\n      `${fileName}.csv`,\r\n      \"text/csv;charset=utf-8;\"\r\n    );\r\n  }\r\n\r\n  private exportAsJSON(\r\n    headers: string[],\r\n    data: string[][],\r\n    fileName: string\r\n  ): void {\r\n    const json = data.map((row) =>\r\n      Object.fromEntries(headers.map((header, i) => [header, row[i]]))\r\n    );\r\n    this.downloadFile(\r\n      JSON.stringify(json, null, 2),\r\n      `${fileName}.json`,\r\n      \"application/json\"\r\n    );\r\n  }\r\n\r\n  private exportAsPDF(\r\n    headers: string[],\r\n    data: string[][],\r\n    fileName: string\r\n  ): void {\r\n    const doc = new jsPDF();\r\n    const autoTableFn = (autoTable as any).default || autoTable;\r\n\r\n    if (typeof autoTableFn === \"function\") {\r\n      autoTableFn(doc, {\r\n        head: [headers],\r\n        body: data,\r\n        styles: { fontSize: 10 },\r\n        margin: { top: 20 },\r\n      });\r\n      doc.save(`${fileName}.pdf`);\r\n    } else {\r\n      console.error(\r\n        \"Errore: Impossibile caricare il plugin jspdf-autotable correttamente.\"\r\n      );\r\n    }\r\n  }\r\n\r\n  private exportAsXLSX(data: string[][], fileName: string): void {\r\n    const ws = XLSX.utils.aoa_to_sheet(data);\r\n\r\n    // Applica i tipi colonna\r\n    const exportEqpTable = this.exportEqpTable();\r\n    if (exportEqpTable?.columnTypes) {\r\n      // 1. TRASFORMAZIONE SICURA:\r\n      // Gestiamo il caso in cui columnTypes non sia un array (evita l'errore .filter is not a function)\r\n      const rawTypes = exportEqpTable.columnTypes;\r\n      const typesArray = Array.isArray(rawTypes)\r\n        ? rawTypes\r\n        : rawTypes\r\n        ? Object.values(rawTypes)\r\n        : [];\r\n\r\n      // 2. ALLINEAMENTO TIPI:\r\n      // Filtriamo l'array dei tipi usando lo stesso criterio delle colonne nascoste.\r\n      // In questo modo l'indice colIndex nel loop corrisponderà esattamente al tipo corretto.\r\n      const filteredTypes = typesArray.filter(\r\n        (_, index) => !this.hiddenColumns || !this.hiddenColumns.includes(index)\r\n      );\r\n\r\n      data.forEach((row, rowIndex) => {\r\n        // Salta la riga di intestazione (rowIndex === 0)\r\n        if (rowIndex === 0) return;\r\n\r\n        row.forEach((value, colIndex) => {\r\n          const cellRef = XLSX.utils.encode_cell({ r: rowIndex, c: colIndex });\r\n\r\n          // Usiamo il tipo filtrato e allineato\r\n          const type = filteredTypes[colIndex];\r\n\r\n          if (type && ws[cellRef]) {\r\n            // Normalizziamo il tipo a stringa per gestire Enum o stringhe\r\n            const typeStr = type.toString().toLowerCase();\r\n\r\n            switch (typeStr) {\r\n              case \"number\":\r\n              case \"decimal\":\r\n                const numericValue = value\r\n                  ?.toString()\r\n                  .replace(/\\./g, \"\")\r\n                  .replace(\",\", \".\");\r\n                const parsedValue = parseFloat(numericValue);\r\n\r\n                ws[cellRef].t = \"n\";\r\n                ws[cellRef].v = isNaN(parsedValue) ? 0 : parsedValue;\r\n\r\n                const hasDecimals = numericValue?.includes(\".\");\r\n                ws[cellRef].z = hasDecimals ? \"#,##0.00\" : \"0\";\r\n                break;\r\n              case \"date\":\r\n                const parsedDate = this.parseSmartDate(value?.toString() || \"\");\r\n                if (parsedDate) {\r\n                  ws[cellRef].t = \"d\";\r\n                  ws[cellRef].v = parsedDate;\r\n                  ws[cellRef].z = \"dd/mm/yyyy\";\r\n                }\r\n                break;\r\n              default:\r\n                ws[cellRef].t = \"s\";\r\n                break;\r\n            }\r\n          }\r\n        });\r\n      });\r\n    }\r\n\r\n    const wb = XLSX.utils.book_new();\r\n    XLSX.utils.book_append_sheet(wb, ws, \"Sheet1\");\r\n    XLSX.writeFile(wb, `${fileName}.xlsx`);\r\n  }\r\n\r\n  private exportAsTXT(data: string[][], fileName: string): void {\r\n    // Unisce le colonne con un TAB (\\t) e le righe con un A Capo (\\n)\r\n    const txtContent = data.map((row) => row.join(\"\\t\")).join(\"\\n\");\r\n\r\n    this.downloadFile(\r\n      txtContent,\r\n      `${fileName}.txt`,\r\n      \"text/plain;charset=utf-8;\"\r\n    );\r\n  }\r\n\r\n  //Si occupa di riformattare le date nei formati standard se presenti nelle regex sottostanti\r\n  private parseSmartDate(value: string): Date | null {\r\n    if (!value) return null;\r\n\r\n    const cleanValue = value.trim();\r\n\r\n    const formats = [\r\n      // dd/MM/yy | dd-MM-yy | dd.MM.yy\r\n      /^(?:(\\d{2})[\\/\\-.](\\d{2})[\\/\\-.](\\d{2}))$/,\r\n      // dd/MM/yyyy | dd-MM-yyyy | dd.MM.yyyy\r\n      /^(?:(\\d{2})[\\/\\-.](\\d{2})[\\/\\-.](\\d{4}))$/,\r\n      // yyyy/MM/dd | yyyy-MM-dd | yyyy.MM.dd\r\n      /^(\\d{4})[\\/\\-.](\\d{2})[\\/\\-.](\\d{2})$/,\r\n    ];\r\n\r\n    for (const format of formats) {\r\n      const match = cleanValue.match(format);\r\n      if (match) {\r\n        let day: string, month: string, year: string;\r\n\r\n        if (format === formats[0]) {\r\n          // dd/MM/yy\r\n          [, day, month, year] = match;\r\n          const yearNum = parseInt(year, 10);\r\n          year = (yearNum >= 50 ? 1900 + yearNum : 2000 + yearNum).toString();\r\n        } else if (format === formats[1]) {\r\n          // dd/MM/yyyy\r\n          [, day, month, year] = match;\r\n        } else {\r\n          // yyyy/MM/dd\r\n          [, year, month, day] = match;\r\n        }\r\n\r\n        const date = new Date(Number(year), Number(month) - 1, Number(day));\r\n        return isNaN(date.getTime()) ? null : date;\r\n      }\r\n    }\r\n\r\n    return null;\r\n  }\r\n\r\n  private downloadFile(content: string, fileName: string, mime: string): void {\r\n    const blob = new Blob([content], { type: mime });\r\n    const url = URL.createObjectURL(blob);\r\n\r\n    const a = document.createElement(\"a\");\r\n    a.href = url;\r\n    a.download = fileName;\r\n    a.click();\r\n\r\n    // Rilascio la memoria dell'URL object dopo il download\r\n    setTimeout(() => {\r\n      URL.revokeObjectURL(url);\r\n    }, 1000);\r\n  }\r\n\r\n  private async extractAllTableRowsPaged(\r\n    table: HTMLTableElement,\r\n    sanitize: boolean\r\n  ): Promise<string[][]> {\r\n    const allData: string[][] = [];\r\n\r\n    const paginator = this.paginator();\r\n    if (!paginator) {\r\n      console.warn(\r\n        \"Paginator non disponibile. Verranno estratte solo le righe visibili.\"\r\n      );\r\n      return this.extractCurrentRows(table, sanitize);\r\n    }\r\n\r\n    const totalPages = Math.ceil(paginator.length / paginator.pageSize);\r\n    const originalPageIndex = paginator.pageIndex;\r\n\r\n    for (let pageIndex = 0; pageIndex < totalPages; pageIndex++) {\r\n      paginator.pageIndex = pageIndex;\r\n      paginator._changePageSize(paginator.pageSize);\r\n      await this.waitForRender();\r\n\r\n      const pageRows = this.extractCurrentRows(table, sanitize);\r\n      allData.push(...pageRows);\r\n    }\r\n\r\n    // Ripristina la pagina originale\r\n    paginator.pageIndex = originalPageIndex;\r\n    paginator._changePageSize(paginator.pageSize);\r\n    await this.waitForRender();\r\n\r\n    return allData;\r\n  }\r\n\r\n  // Estrae le intestazioni della tabella, escludendo le colonne nascoste\r\n  private extractTableHeaders(table: HTMLTableElement): string[] {\r\n    const headerRow = table.tHead?.rows?.[0];\r\n    return Array.from(headerRow?.cells || [])\r\n      .map((cell, index) =>\r\n        this.hiddenColumns?.includes(index) ? null : cell.textContent?.trim()\r\n      )\r\n      .filter((cell): cell is string => cell !== null);\r\n  }\r\n\r\n  //Estrapola le righe attualmente visibili nella tabella, escludendo le colonne nascoste\r\n  private extractCurrentRows(\r\n    table: HTMLTableElement,\r\n    sanitize: boolean\r\n  ): string[][] {\r\n    const bodyRows = Array.from(table.tBodies?.[0]?.rows || []);\r\n    return bodyRows.map((row) =>\r\n      Array.from(row.cells)\r\n        .map((cell, index) => {\r\n          // Se la colonna è nascosta, torna null\r\n          if (this.hiddenColumns?.includes(index)) return null;\r\n\r\n          // Recupera il testo\r\n          let text = cell.textContent || \"\";\r\n\r\n          // APPLICA SANITIZZAZIONE SE RICHIESTO\r\n          if (sanitize) {\r\n            text = this.sanitizeForCsvInjection(text);\r\n          } else {\r\n            text = text.trim();\r\n          }\r\n\r\n          return text;\r\n        })\r\n        .filter((cell): cell is string => cell !== null)\r\n    );\r\n  }\r\n\r\n  // Attende un breve periodo per garantire che la tabella sia renderizzata correttamente durante il cambio pagina\r\n  private waitForRender(): Promise<void> {\r\n    return new Promise((resolve) => setTimeout(resolve, 100));\r\n  }\r\n\r\n  // --- CSV INJECTION ---\r\n  private sanitizeForCsvInjection(value: string | undefined | null): string {\r\n    if (!value) return \"\";\r\n\r\n    // Rimuoviamo spazi iniziali/finali\r\n    const cleanValue = value.trim();\r\n\r\n    // Caratteri che scatenano l'esecuzione di formule in Excel\r\n    const dangerousPrefixes = [\"=\", \"+\", \"-\", \"@\"];\r\n\r\n    // Se inizia con uno di questi caratteri, anteponiamo l'apice singolo\r\n    if (dangerousPrefixes.includes(cleanValue.charAt(0))) {\r\n      return \"'\" + cleanValue;\r\n    }\r\n\r\n    return cleanValue;\r\n  }\r\n}\r\n","import {\r\n  Component,\r\n  OnInit,\r\n  effect,\r\n  signal,\r\n  SimpleChanges,\r\n  ChangeDetectorRef,\r\n  ChangeDetectionStrategy,\r\n  Inject,\r\n  AfterViewInit,\r\n  ElementRef,\r\n  DOCUMENT,\r\n  viewChild,\r\n  NgZone,\r\n  DestroyRef,\r\n  inject,\r\n  OnDestroy,\r\n} from \"@angular/core\";\r\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\r\nimport { CommonModule } from \"@angular/common\";\r\nimport { FormsModule } from \"@angular/forms\";\r\nimport { MatTableModule } from \"@angular/material/table\";\r\nimport { MatSortModule } from \"@angular/material/sort\";\r\nimport { MatPaginatorModule } from \"@angular/material/paginator\";\r\nimport { MatCheckboxModule } from \"@angular/material/checkbox\";\r\nimport { MatButtonModule } from \"@angular/material/button\";\r\nimport { MatIconModule } from \"@angular/material/icon\";\r\nimport { MatMenuModule } from \"@angular/material/menu\";\r\nimport { MatFormFieldModule } from \"@angular/material/form-field\";\r\nimport { MatInputModule } from \"@angular/material/input\";\r\nimport { MatCardModule } from \"@angular/material/card\";\r\nimport { MatTooltipModule } from \"@angular/material/tooltip\";\r\nimport { DragDropModule } from \"@angular/cdk/drag-drop\";\r\nimport { EqpTableFilterComponent } from \"./internal-components/filter-component/filter.component\";\r\nimport { EqpTableExporterComponent } from \"./internal-components/eqp-table-exporter/eqp-table-exporter.component\";\r\nimport { CustomButtonsComponent } from \"./internal-components/custom-buttons/custom-buttons.component\";\r\nimport { EqpTableBooleanColumnComponent } from \"./internal-components/boolean-column/boolean-column.component\";\r\nimport { EqpTableColorColumnComponent } from \"./internal-components/color-column/color-column.component\";\r\nimport { EqpTableDateColumnComponent } from \"./internal-components/date-column/date-column.component\";\r\nimport { EqpTableEnumColumnComponent } from \"./internal-components/enum-column/enum-column.component\";\r\nimport { EqpTableCheckboxColumnComponent } from \"./internal-components/checkbox-column/checkbox-column.component\";\r\nimport { EqpTableIconColumnComponent } from \"./internal-components/icon-column/icon-column.component\";\r\nimport { EqpTableHyperlinkColumnComponent } from \"./internal-components/hyperlink-column/hyperlink-column.component\";\r\nimport { EqpTableImageColumnComponent } from \"./internal-components/image-column/image-column.component\";\r\nimport { EqpTableStandardColumnComponent } from \"./internal-components/standard-column/standard-column.component\";\r\nimport { EqpTableNavigateColumnComponent } from \"./internal-components/navigate-column/navigate-column.component\";\r\nimport { EqpTableGotoPageComponent } from \"./internal-components/goto-page/goto-page.component\";\r\nimport {\r\n  TypeColumn,\r\n  HeaderFilter,\r\n  CellAlignmentEnum,\r\n  ConfigColumn,\r\n} from \"@eqproject/eqp-common\";\r\nimport { TableColumnField, EqpCommonService } from \"@eqproject/eqp-common\";\r\nimport { MatTable, MatTableDataSource } from \"@angular/material/table\";\r\nimport { MatPaginator, MatPaginatorIntl } from \"@angular/material/paginator\";\r\nimport { MatSort } from \"@angular/material/sort\";\r\nimport { EqpTablePaginatorIntl } from \"./helpers/paginator-intl.helper\";\r\nimport { EnumHelper } from \"./helpers/enum.helper\";\r\nimport {\r\n  animate,\r\n  state,\r\n  style,\r\n  transition,\r\n  trigger,\r\n} from \"@angular/animations\";\r\nimport { EqpTableService } from \"./eqp-table.service\";\r\nimport { DatePipe } from \"@angular/common\";\r\nimport { TranslateTableHelper } from \"./helpers/translateTable.helper\";\r\nimport { ColumnStyleHelper } from \"./helpers/columnStyle.helper\";\r\nimport { ColumnValueHelper } from \"./helpers/columnValue.helper\";\r\nimport { ColumnAccessibilityHelper } from \"./helpers/columnAccessibility.helper\";\r\nimport { ColumnPipeHelper } from \"./helpers/columnPipe.helper\";\r\nimport { EqpTableBaseComponent } from \"./internal-components/base-component/base.component\";\r\nimport { SearchFilterHelper } from \"./helpers/searchFilter.helper\";\r\nimport { SortingHelper } from \"./helpers/sorting.helper\";\r\nimport { ResizeHelper } from \"./helpers/resize.helper\";\r\nimport {\r\n  CdkDragDrop,\r\n  CdkDragEnd,\r\n  CdkDragStart,\r\n  moveItemInArray,\r\n} from \"@angular/cdk/drag-drop\";\r\nimport { EqpMatTableExporterDirective } from \"./directives/mat-table-exporter.directive\";\r\n\r\n/**\r\n * Costante per definire i caratteri speciali possibili da utilizzare come separatore nel formato data.\r\n */\r\nconst SPLIT_CHARACTERS: string = \"*|/,:;.-\";\r\n\r\n@Component({\r\n  selector: \"eqp-table\",\r\n  templateUrl: \"eqp-table.component.html\",\r\n  styleUrls: [\"eqp-table.component.scss\", \"eqp-table-mobile.scss\"],\r\n  animations: [\r\n    trigger(\"detailExpand\", [\r\n      state(\"collapsed\", style({ height: \"0px\", minHeight: \"0\" })),\r\n      state(\"expanded\", style({ height: \"*\" })),\r\n      transition(\r\n        \"expanded <=> collapsed\",\r\n        animate(\"225ms cubic-bezier(0.4, 0.0, 0.2, 1)\")\r\n      ),\r\n    ]),\r\n    trigger(\"iconTransition\", [\r\n      state(\"true\", style({ transform: \"rotate(180deg)\" })),\r\n      state(\"false\", style({ transform: \"rotate(0deg)\" })),\r\n      transition(\"true <=> false\", animate(\"200ms ease-out\")),\r\n    ]),\r\n  ],\r\n  providers: [\r\n    DatePipe,\r\n    ColumnValueHelper,\r\n    ColumnStyleHelper,\r\n    ColumnAccessibilityHelper,\r\n    ColumnPipeHelper,\r\n    SearchFilterHelper,\r\n    SortingHelper,\r\n    ResizeHelper,\r\n    { provide: MatPaginatorIntl, useClass: EqpTablePaginatorIntl },\r\n  ],\r\n  standalone: true,\r\n  changeDetection: ChangeDetectionStrategy.OnPush,\r\n  imports: [\r\n    CommonModule,\r\n    FormsModule,\r\n    MatTableModule,\r\n    MatSortModule,\r\n    MatPaginatorModule,\r\n    MatCheckboxModule,\r\n    MatButtonModule,\r\n    MatIconModule,\r\n    MatMenuModule,\r\n    MatFormFieldModule,\r\n    MatInputModule,\r\n    MatCardModule,\r\n    MatTooltipModule,\r\n    DragDropModule,\r\n    EqpMatTableExporterDirective,\r\n    EqpTableFilterComponent,\r\n    EqpTableExporterComponent,\r\n    CustomButtonsComponent,\r\n    EqpTableBooleanColumnComponent,\r\n    EqpTableColorColumnComponent,\r\n    EqpTableDateColumnComponent,\r\n    EqpTableEnumColumnComponent,\r\n    EqpTableCheckboxColumnComponent,\r\n    EqpTableIconColumnComponent,\r\n    EqpTableHyperlinkColumnComponent,\r\n    EqpTableImageColumnComponent,\r\n    EqpTableStandardColumnComponent,\r\n    EqpTableNavigateColumnComponent,\r\n    EqpTableGotoPageComponent,\r\n  ],\r\n})\r\nexport class EqpTableComponent\r\n  extends EqpTableBaseComponent\r\n  implements OnInit, AfterViewInit, OnDestroy {\r\n  //N.B. LA DEFINIZIONE DI INPUT E OUTPUT DEL COMPONENTE E' FATTA SU EqpTableMainComponent\r\n\r\n  private ngZone = inject(NgZone);\r\n  private destroyRef = inject(DestroyRef);\r\n  private resizeObserver: ResizeObserver | null = null;\r\n\r\n  expandedElement: any | null;\r\n  dataSource: MatTableDataSource<any> = new MatTableDataSource();\r\n  public TypeEnum = TypeColumn;\r\n  public paginator: MatPaginator;\r\n  private sort: MatSort;\r\n  searchActive = signal(false); // Stato della ricerca\r\n  public mediaQuery: MediaQueryList;\r\n  readonly searchInput = viewChild<ElementRef>(\"searchInput\"); // Riferimento all'elemento di input\r\n  readonly table = viewChild<MatTable<any>>(\"matTableRef\");\r\n  readonly tableContainer = viewChild(\"tableContainer\", { read: ElementRef });\r\n  readonly exporter = viewChild<EqpMatTableExporterDirective>(\"exporter\");\r\n  readonly tableRef = viewChild.required(\"tableElementRef\", {\r\n    read: ElementRef,\r\n  });\r\n  public columnsDataSource: any[] = [];\r\n\r\n  readonly matSort = viewChild(MatSort);\r\n  readonly matPaginator = viewChild(MatPaginator);\r\n\r\n  //#region Proprietà per gestione culture e lingua\r\n\r\n  currentCultureSelected: string;\r\n  currentLocaleSelected: string;\r\n\r\n  //#endregion\r\n\r\n  //#region Proprietà per gestione configurazione colonne\r\n\r\n  /**\r\n   * Ricalcola l'array delle colonne visibili.\r\n   * L'ordine dei push determina l'ordine visivo delle colonne nella tabella.\r\n   */\r\n  public refreshDisplayedColumns() {\r\n    // 2. NORMALIZZAZIONE: Decidi quale input usare (Nuovo vs Vecchio)\r\n    // Se tableColumns ha dati, usa quello, altrimenti fallback su tableColumnFields\r\n    const sourceColumns =\r\n      this.tableColumnFields && this.tableColumnFields.length > 0\r\n        ? this.tableColumnFields\r\n        : this.tableColumns;\r\n\r\n    // 3. AGGIORNA LA SORGENTE PER IL TEMPLATE\r\n    // Importante: Aggiorniamo la variabile che il @for userà nell'HTML\r\n    this.columnsDataSource = sourceColumns || [];\r\n\r\n    // 4. CRUCIALE: Forza Angular a renderizzare i <matColumnDef> ORA\r\n    // Senza questo, i def non esistono ancora quando calcoliamo displayedColumns\r\n    this.cd.detectChanges();\r\n\r\n    // 5. CALCOLO DISPLAYED COLUMNS (Ora è sicuro farlo)\r\n    setTimeout(() => {\r\n      const newDisplayedColumns: string[] = [];\r\n\r\n      if (this.detailColumns?.length) newDisplayedColumns.push(\"Detail\");\r\n      if (this.selection()) newDisplayedColumns.push(\"Checkbox\");\r\n      if (this.enableDragAndDrop) newDisplayedColumns.push(\"Drag\");\r\n\r\n      // Usa columnsDataSource che è appena stato aggiornato\r\n      if (this.columnsDataSource.length > 0) {\r\n        const dataColumns = this.columnsDataSource\r\n          .filter((col) => !col.isHidden)\r\n          .map((col) => col.key);\r\n\r\n        newDisplayedColumns.push(...dataColumns);\r\n      }\r\n\r\n      // Assegna le colonne da visualizzare\r\n      // NORMALIZZAZIONE: Assicura unicità per evitare duplicazioni da MDC/Resize\r\n      this.displayedColumns = Array.from(new Set(newDisplayedColumns));\r\n\r\n      // Rileva le modifiche finali per aggiornare l'header della tabella\r\n      this.cd.detectChanges();\r\n    }, 0);\r\n  }\r\n  /**\r\n   * Restituisce la mappatura di tutte le colonne dell'eqp-table\r\n   */\r\n  getColumnKeys(): string[] {\r\n    let keysToReturn: string[];\r\n\r\n    //Nel caso in cui non sia stata passata una chiave, la creo io runtime\r\n    if (this.tableColumns.filter((e) => e.key == null).length > 0) {\r\n      var counter = 0;\r\n      this.tableColumns.forEach((column) => {\r\n        if (column.key == null) {\r\n          column.key = \"Key_\" + counter;\r\n          counter++;\r\n        }\r\n      });\r\n    }\r\n\r\n    let currentArray: string[] = this.tableColumns\r\n      .filter((x) => !x.isHidden)\r\n      .map(({ key }) => key as string);\r\n\r\n    if (this.enableDragColumn()) {\r\n      let dragColumnToAdd = \"Drag\";\r\n      currentArray.unshift(dragColumnToAdd);\r\n    }\r\n\r\n    if (this.isMultipleSelection() || this.selection()) {\r\n      let checkboxToAdd = \"Checkbox\";\r\n      currentArray.unshift(checkboxToAdd);\r\n    }\r\n\r\n    //Riassegno il currentArray dopo aver fatto tutte le aggiunte custom\r\n    keysToReturn = currentArray;\r\n\r\n    //Dopo i controlli, verifico quali sono nel viewport\r\n    if (this.autoResizeColumns() == true) {\r\n      const mediaQuery = window.matchMedia(\"(min-width: 961px)\");\r\n\r\n      // Verifica se il media screen è superiore a 961px\r\n      if (mediaQuery.matches) {\r\n        keysToReturn = this.resizeHelper.getKeysInViewPort(keysToReturn);\r\n      }\r\n    }\r\n\r\n    // NORMALIZZAZIONE: Assicura unicità per evitare duplicazioni (es: pulsante Detail o Checkbox)\r\n    return Array.from(new Set(keysToReturn));\r\n  }\r\n\r\n  /**\r\n   * Conterrà ogni volta il nome della colonna nel quale si sta facendo il filtro singolo\r\n   */\r\n  selectedColumnToSearch: string;\r\n\r\n  /**\r\n   * Variabile d'appoggio per poter usare l'uguaglianza direttamente con i valori dell'enum sull'HTML.\r\n   * In questo modo si evita di usare i numeri associati all'enum ma direttamente la loro etichetta (molto più parlante)\r\n   */\r\n  cellAlingmentEnum = CellAlignmentEnum;\r\n\r\n  /**\r\n   * Valore di default per la grandezza delle colonne\r\n   */\r\n  standardFlexValue: string = \"0 0 10%\";\r\n\r\n  //#endregion\r\n\r\n  //#region Proprietà per gestione selezione su tabella\r\n\r\n  /**\r\n   * Contiene tutta la riga selezionata\r\n   */\r\n  selectedRow = signal<any>(null);\r\n\r\n  /**\r\n   * Array di appoggio dove andranno a finire tutte le checkbox selezionate, con le relative informazioni di ogni riga\r\n   */\r\n  allSelectedValue: Array<any> = new Array<any>();\r\n\r\n  // Variabile booleana che viene aggiornata nella selezione/deselezione delle checkbox (in caso di colonna checkbox)\r\n  isAllSelected = signal(false);\r\n\r\n  displayedColumns: Array<string>;\r\n  detailColumns: Array<string> = [];\r\n  detailConfigColumns: Array<ConfigColumn> = new Array<ConfigColumn>();\r\n\r\n  //#endregion\r\n\r\n  //#region Proprietà e funzioni per filtri su singola colonna\r\n\r\n  /**\r\n   * Proprietà readonly che restituisce la definizione delle colonne su cui dover applicare i filtri per singola colonna\r\n   */\r\n  getHeaderFiltersColumnDefinitions() {\r\n    if (this.isSingleColumnFilter == null || this.isSingleColumnFilter == false)\r\n      return [];\r\n\r\n    return this.headersFilters.map(({ column }) => column);\r\n  }\r\n\r\n  headersFilters: Array<HeaderFilter> = new Array<HeaderFilter>();\r\n  filtersModel = [];\r\n  filterKeys = {};\r\n  doit;\r\n  private resizeTimeout: any;\r\n\r\n  //#endregion\r\n\r\n  constructor(\r\n    private enumHelper: EnumHelper,\r\n    private eqpTableService: EqpTableService,\r\n    private cd: ChangeDetectorRef,\r\n    private translateTableHelper: TranslateTableHelper,\r\n    private datePipe: DatePipe,\r\n    @Inject(DOCUMENT) private _doc: any,\r\n    public columnValueHelper: ColumnValueHelper,\r\n    public columnStyleHelper: ColumnStyleHelper,\r\n    public columnAccessibilityHelper: ColumnAccessibilityHelper,\r\n    public columnPipeHelper: ColumnPipeHelper,\r\n    public searchFilterHelper: SearchFilterHelper,\r\n    public sortingHelper: SortingHelper,\r\n    public resizeHelper: ResizeHelper\r\n  ) {\r\n    super();\r\n\r\n    this.languagePipesConfigurations();\r\n\r\n    effect(() => {\r\n      this.sort = this.matSort();\r\n      this.reloadDatatable();\r\n    });\r\n\r\n    effect(() => {\r\n      if (\r\n        this.pageChange.observers != null &&\r\n        this.pageChange.observers.length == 0\r\n      ) {\r\n        this.paginator = this.matPaginator();\r\n        this.reloadDatatable();\r\n      }\r\n    });\r\n  }\r\n\r\n  //#region Funzioni di inizializzazione\r\n\r\n  /**\r\n   * Quando la tabella viene inizializzata vengono inizializzati gli helper statici, configurati i filtri e normalizzate le eventuali colonne da\r\n   * escludere nell'export (es: colonne con pulsanti)\r\n   */\r\n  ngOnInit(): void {\r\n    super.ngOnInit();\r\n\r\n    if (this.tableColumnFields != null) this.checkAndConvertTableColumn();\r\n\r\n    this.initializeHelpers();\r\n\r\n    this.normalizeColumnsValueAttributeForSearch();\r\n    this.normalizeTableExporterHiddenColumns();\r\n\r\n    // Inizializzo il datasource, il sort e il paginator\r\n    this.reloadDatatable(true);\r\n\r\n    if (this.autoResizeColumns() === true) this.onResize();\r\n\r\n    //Faccio fare la mappatura singola dei filtri solo se viene passato true nell'input\r\n    if (this.isSingleColumnFilter == true || this.switchFilterType() != null)\r\n      this.getHeaderFilters();\r\n\r\n    this.displayedColumns = this.getColumnKeys();\r\n  }\r\n\r\n  ngAfterViewInit(): void {\r\n    if (this.autoResizeColumns() === true) {\r\n      this.onResize();\r\n      this.setupResizeObserver();\r\n    }\r\n\r\n    //Assegno l'istanza HTML all'exporter, \"forzatura\" dovuta al doppio viewChild sullo stesso element table\r\n    this.exporter().tableElement = this.tableRef();\r\n    if (this.exportEqpTable)\r\n      this.exportEqpTable.columnTypes = this.getColumnTypesFromConfig();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    if (this.resizeObserver) {\r\n      this.resizeObserver.disconnect();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Configura un ResizeObserver sul contenitore della tabella.\r\n   * Eseguito fuori dalla zona Angular per evitare eccessivi cicli di change detection durante il resize.\r\n   */\r\n  private setupResizeObserver() {\r\n    const container = this.tableContainer()?.nativeElement;\r\n    if (!container) return;\r\n\r\n    this.ngZone.runOutsideAngular(() => {\r\n      this.resizeObserver = new ResizeObserver(() => {\r\n        // Debounce manuale o tramite timeout per evitare flickering\r\n        clearTimeout(this.resizeTimeout);\r\n        this.resizeTimeout = setTimeout(() => {\r\n          this.ngZone.run(() => {\r\n            this.onResize();\r\n            this.cd.detectChanges();\r\n          });\r\n        }, 150);\r\n      });\r\n      this.resizeObserver.observe(container);\r\n    });\r\n  }\r\n\r\n  getColumnTypesFromConfig(): {\r\n    [index: number]: \"string\" | \"number\" | \"date\";\r\n  } {\r\n    const map: { [index: number]: \"string\" | \"number\" | \"date\" } = {};\r\n\r\n    this.tableColumns.forEach((col, index) => {\r\n      if (col.type === TypeColumn.Date) {\r\n        map[index] = \"date\";\r\n      } else if (col.numberPipe != null) {\r\n        map[index] = \"number\";\r\n      } else {\r\n        map[index] = \"string\";\r\n      }\r\n    });\r\n    return map;\r\n  }\r\n\r\n  // @HostListener(\"window:resize\") // Rimosso a favore di ResizeObserver per performance\r\n  onResize() {\r\n    this.mediaQuery = window.matchMedia(\"(min-width: 961px)\");\r\n    this.callResizeHelper();\r\n  }\r\n\r\n  callResizeHelper() {\r\n    this.displayedColumns = this.getColumnKeys();\r\n    this.resizeHelper.doResize(this);\r\n  }\r\n\r\n  /**\r\n   * Normalizza le colonne da nascondere all'exporter includendo tutte le colonne di tipo MenuAction, SimpleAction e, se attiva la selezione, anche la colonna di selezione\r\n   */\r\n  normalizeTableExporterHiddenColumns() {\r\n    if (this.exportEqpTable == null || this.exportEqpTable == undefined) return;\r\n\r\n    //Aggiunge di default le colonne che contengono pulsanti tra le colonne nascoste per l'esportazione\r\n    if (this.exportEqpTable.hiddenColumns == null) {\r\n      this.exportEqpTable.hiddenColumns = [];\r\n    }\r\n\r\n    //Se la selezione è attiva allora aggiunge sempre l'indice 0 che coincide con la colonna di selezione (che non va esportata)\r\n    const selection = this.selection();\r\n    if (\r\n      selection == true &&\r\n      this.exportEqpTable.hiddenColumns.find((p) => p == 0) == null\r\n    )\r\n      this.exportEqpTable.hiddenColumns.push(0);\r\n\r\n    //Legge gli indici delle colonne di tipo SIMPLE_ACTION e MENU_ACTION e li aggiunge all'hiddenColumns\r\n    for (let colIndex = 0; colIndex < this.tableColumns.length; colIndex++) {\r\n      if (\r\n        this.exportEqpTable.hiddenColumns.find((c) => c == colIndex) == null &&\r\n        (this.tableColumns[colIndex].type == TypeColumn.MenuAction ||\r\n          this.tableColumns[colIndex].type == TypeColumn.SimpleAction)\r\n      ) {\r\n        const hiddenColumnIndex = selection == true ? colIndex + 1 : colIndex;\r\n        if (\r\n          this.exportEqpTable.hiddenColumns.find(\r\n            (p) => p == hiddenColumnIndex\r\n          ) == null\r\n        )\r\n          this.exportEqpTable.hiddenColumns.push(hiddenColumnIndex);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Inizializza le proprietà statiche dei diversi helper.\r\n   * Questa procedura è necessaria per fare in modo che i diversi helper, condivisi sia da eqp-table che dai componenti più interni,\r\n   * possano lavorare sulle stesse istanze degli INPUT o dei servizi iniettati tramite D.I.\r\n   */\r\n  initializeHelpers() {\r\n    this.columnAccessibilityHelper.disableRow = this.disableRow();\r\n    this.columnAccessibilityHelper.disableRowColor = this.disableRowColor();\r\n    this.columnValueHelper.isMultiLanguage = this.isMultiLanguage();\r\n    this.searchFilterHelper.datePipe = this.datePipe;\r\n    this.searchFilterHelper.tableColumns = this.tableColumns;\r\n    this.searchFilterHelper.cultureInfo = this.cultureInfo();\r\n    this.searchFilterHelper.currencyFilterToReplace =\r\n      this.currencyFilterToReplace();\r\n    this.searchFilterHelper.currencyFilterToUse = this.currencyFilterToUse();\r\n    this.resizeHelper.initializeEqpTableContext(this);\r\n  }\r\n\r\n  /**\r\n   * Cicla tutte le colonne per cui è stata definita solo la key (e che quindi il value undefined) e riporta lo stesso valore\r\n   * anche per la proprietà value in modo da averle tutte allineate.\r\n   *\r\n   * Il ciclo viene eseguito per tutte le colonne definite, fatta eccezione per quelle che contengono pulsanti o icone o immagini\r\n   */\r\n  normalizeColumnsValueAttributeForSearch() {\r\n    if (this.tableColumns == null || this.tableColumns == undefined) return;\r\n\r\n    this.tableColumns\r\n      .filter(\r\n        (t) =>\r\n          (t.value == undefined || t.value == null) &&\r\n          this.searchFilterHelper.isColumnTypeValidForSearch(\r\n            t.type,\r\n            t.isSearchable\r\n          )\r\n      )\r\n      .forEach((t) => {\r\n        t.value = t.key;\r\n      });\r\n  }\r\n\r\n  languagePipesConfigurations() {\r\n    this.eqpTableService.initPossibileLanguages();\r\n    this.currentCultureSelected = this.eqpTableService.getDatePipe();\r\n    this.currentLocaleSelected = this.eqpTableService.getCurrentLocale();\r\n  }\r\n\r\n  getHeaderFilters() {\r\n    if (this.tableColumns == null || this.tableColumns.length == 0) return;\r\n\r\n    var counter = 0;\r\n    this.tableColumns.forEach((element) => {\r\n      let headerFilter = new HeaderFilter();\r\n      headerFilter.column = element.key + \"_\" + counter;\r\n      headerFilter.key = this.searchFilterHelper.isColumnTypeValidForSearch(\r\n        element.type,\r\n        element.isSearchable\r\n      )\r\n        ? element.value.toString()\r\n        : element.key;\r\n      headerFilter.styles = element.styles;\r\n      headerFilter.isSearchable =\r\n        element.isSearchable != null ? element.isSearchable : true;\r\n      headerFilter.type = element.type;\r\n      this.headersFilters.push(headerFilter);\r\n      counter++;\r\n    });\r\n\r\n    if (this.selection() == true) {\r\n      let checkboxToAdd: HeaderFilter = new HeaderFilter();\r\n      checkboxToAdd.column = \"CheckboxColumn\";\r\n      checkboxToAdd.isSearchable = false;\r\n      checkboxToAdd.key = \"Checkbox\";\r\n      this.headersFilters.unshift(checkboxToAdd);\r\n    }\r\n\r\n    if (this.autoResizeColumns() == true) {\r\n      const detailToAdd: HeaderFilter = new HeaderFilter();\r\n      detailToAdd.column = \"DetailColumn\";\r\n      detailToAdd.isSearchable = false;\r\n      detailToAdd.key = \"Detail\";\r\n      this.headersFilters.unshift(detailToAdd);\r\n    }\r\n  }\r\n\r\n  // In caso di chiamata asincrona, aggiorno il datasource come arrivano i dati\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    // only run when property \"data\" changed\r\n    if (changes[\"data\"] != undefined) {\r\n      this.data =\r\n        changes.data.currentValue != undefined ? changes.data.currentValue : [];\r\n      this.reloadDatatable(true);\r\n    }\r\n\r\n    if (\r\n      changes[\"tableColumns\"] ||\r\n      changes[\"tableColumnFields\"] ||\r\n      changes[\"selection\"] ||\r\n      changes[\"enableDragAndDrop\"] ||\r\n      changes[\"detailColumns\"]\r\n    ) {\r\n      this.refreshDisplayedColumns();\r\n    }\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Funzioni per reload datasource e gestione paginazione e ordinamento\r\n\r\n  /**\r\n   * Ricarica la datatable ridefinendo, oltre al datasource, anche la paginazione, l'ordinamento, il predicato di ricerca.\r\n   * Ridefinisce inoltre l'originalIndex di ogni elemento.\r\n   * @param firstLoading Serve principalmente per il isSingleColumnFilter, perchè non devono essere sempre riaggiornati i dati ma solo all'init e alla modifica (vedere onChanges)\r\n   */\r\n  public reloadDatatable(firstLoading: boolean = false) {\r\n    var self = this;\r\n\r\n    if (this.dataSource == undefined)\r\n      this.dataSource = new MatTableDataSource();\r\n\r\n    //Nel caso in cui data contiene un element di tipo string, allora assegno forzatamente una key a quell'elemento\r\n    if (\r\n      this.isSingleColumnFilter != true ||\r\n      (this.isSingleColumnFilter == true && firstLoading == true)\r\n    ) {\r\n      var counter = 0;\r\n      this.data.forEach((element) => {\r\n        this.data[counter][\"originalIndex\"] = counter;\r\n        counter++;\r\n      });\r\n      this.dataSource.data = this.data;\r\n    }\r\n\r\n    this.dataSource.sortingDataAccessor = (obj, property) =>\r\n      this.sortingHelper.getSortOrder(this.tableColumns, obj, property);\r\n\r\n    this.dataSource.sort = this.sort;\r\n    this.dataSource.paginator = this.paginator;\r\n\r\n    //Recupero il pageIndex della tabella attuale dal localStorage(se definito)\r\n    const tableKey = this.tableName() != null\r\n      ? this.tableName()\r\n      : (this.table() != null && this.table()![\"_rowDefs\"]?.[0]?.columns\r\n          ? btoa(JSON.stringify(this.table()![\"_rowDefs\"][0].columns))\r\n          : null);\r\n\r\n    if (tableKey != null) {\r\n      const stored = localStorage.getItem(this._doc.title + \" Table => \" + tableKey);\r\n      if (stored != null) {\r\n        this.matPaginatorSize = Number(stored);\r\n        this.cd.detectChanges();\r\n      }\r\n    }\r\n\r\n    //Ricostruisce il predicato da usare come filtro di ricerca dei dati della tabella\r\n    this.dataSource.filterPredicate = function (row, filter: string): boolean {\r\n      row = self.getExternalTemplateFilterValues(row);\r\n      return self.searchFilterHelper.createFilterPredicate(\r\n        self.dataSource,\r\n        self.isSingleColumnFilter,\r\n        self.selectedColumnToSearch,\r\n        row,\r\n        filter\r\n      );\r\n    };\r\n\r\n    this.cd.markForCheck();\r\n  }\r\n\r\n  getExternalTemplateFilterValues(row) {\r\n    for (let element of this.tableColumns.filter(\r\n      (x) => x.type == TypeColumn.ExternalTemplate\r\n    )) {\r\n      if (element.externalTemplateSearchFunction != null) {\r\n        row = {\r\n          ...row,\r\n          [element.key]:\r\n            typeof element.externalTemplateSearchFunction == \"string\"\r\n              ? element.externalTemplateSearchFunction\r\n              : element.externalTemplateSearchFunction(row),\r\n        };\r\n      }\r\n    }\r\n    return row;\r\n  }\r\n\r\n  /**\r\n   * Richiama il metodo renderRows della mat-table in modo da forzare il caricamento dei dati nel DOM\r\n   */\r\n  renderRows() {\r\n    this.table()?.renderRows();\r\n  }\r\n\r\n  /**\r\n   * Funzione che si occupa di memorizzare nel localStorage la dimensione di pagina impostata per la tabella (in modo da recuperarla all'init)\r\n   * e, inoltre, invoca l'evento di output pageChange per notificare il cambio di pagina (utile se ad esempio si sta usando la paginazione lato server)\r\n   * @param event\r\n   */\r\n  pageChanged(event) {\r\n    //Aggiorno il matPaginatorSize attuale e salvo nel localStorage il pageIndex selezionato\r\n    //N.B. lo associo alla tabella se è stato definito il suo tableName altrimenti genero un nome composto dalle colonne della tabella stessa\r\n    this.matPaginatorSize = event.pageSize;\r\n\r\n    if (!this.disablePageStorageSave())\r\n      localStorage.setItem(\r\n        this._doc.title +\r\n        \" Table => \" +\r\n        (this.tableName() != null\r\n          ? this.tableName()\r\n          : btoa(JSON.stringify(this.table()![\"_rowDefs\"][0].columns))),\r\n        this.matPaginatorSize.toString()\r\n      );\r\n\r\n    let pageIndex = event.pageIndex;\r\n    let pageSize = event.pageSize;\r\n\r\n    //let previousIndex = event.previousPageIndex;\r\n    let previousSize = pageSize * pageIndex;\r\n\r\n    let infoToSend = {\r\n      previousSize,\r\n      pageIndex,\r\n      pageSize,\r\n    };\r\n\r\n    this.pageChange.emit(infoToSend);\r\n  }\r\n\r\n  /**\r\n   * Funzione che si occupa di invocare l'evento di output sortChange per notificare il cambio di ordinamento (utile se ad esempio si sta usando la paginazione/ordinamento lato server)\r\n   * @param event\r\n   */\r\n  sortChanged(event) {\r\n    this.sortChange.emit(event);\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Funzioni di gestione selezione singola/multipla delle righe\r\n\r\n  /**\r\n   * Gestione seleziona/deseleziona tutte le checkbox\r\n   */\r\n  selectUnselectAll() {\r\n    this.isAllSelected.update(v => !v);\r\n\r\n    if (this.isAllSelected()) {\r\n      this.allSelectedValue = [];\r\n      let currentIndex = 0;\r\n      this.dataSource.filteredData.forEach((element) => {\r\n        // Recupero la proprietà da usare poi come indice dell'element\r\n        const dr = this.disableRow();\r\n        let currentValue =\r\n          (dr != null && typeof dr === \"string\") ||\r\n            typeof dr === \"boolean\"\r\n            ? dr\r\n            : dr != null && typeof dr === \"function\"\r\n              ? (dr as Function)()\r\n              : null;\r\n\r\n        // Se non è stato definito il disableRow oppure la proprietà del disableRow esiste e ha come valore false allora lo includo nella lista allSelectedValue\r\n        if (\r\n          dr == null ||\r\n          currentValue === false ||\r\n          (element.hasOwnProperty(dr) &&\r\n            !element[currentValue] === true)\r\n        ) {\r\n          element[\"index\"] = currentIndex;\r\n          element[this.isSelectedPropertyName()] = true;\r\n          this.allSelectedValue.push(element);\r\n        } else {\r\n        }\r\n        currentIndex++;\r\n      });\r\n    } else if (!this.isAllSelected()) {\r\n      this.allSelectedValue = [];\r\n      this.dataSource.filteredData.forEach((element) => {\r\n        element[this.isSelectedPropertyName()] = false;\r\n      });\r\n    }\r\n\r\n    this.checkboxInfo.emit(this.allSelectedValue);\r\n  }\r\n\r\n  /**\r\n   * Costruzione della colonna di checkbox con i relativi possibili comportamenti e casistiche\r\n   */\r\n  changeCheckboxRowSelection(event, element, index) {\r\n    //Controllo gli elementi già presenti nel datasource e li aggiungo alla list su cui farò l'emit\r\n    //se hanno la proprietà isSelected già a true e NON sono già presenti\r\n    this.dataSource.filteredData.forEach((element) => {\r\n      if (\r\n        element[this.isSelectedPropertyName()] &&\r\n        element[this.isSelectedPropertyName()] == true &&\r\n        !this.allSelectedValue.includes(element)\r\n      )\r\n        this.allSelectedValue.push(element);\r\n    });\r\n\r\n    const isMultipleSelection = this.isMultipleSelection();\r\n    if (!isMultipleSelection) {\r\n      if (event.checked == false) {\r\n        element[this.isSelectedPropertyName()] = false;\r\n        this.allSelectedValue = [];\r\n      } else if (event.checked == true) {\r\n        if (this.allSelectedValue.length > 0)\r\n          this.allSelectedValue[0][this.isSelectedPropertyName()] = false;\r\n\r\n        this.allSelectedValue = [];\r\n        element[this.isSelectedPropertyName()] = true;\r\n        this.allSelectedValue.push(element);\r\n      }\r\n    } else if (isMultipleSelection) {\r\n      element[\"index\"] = index;\r\n      if (event.checked == true) {\r\n        element[this.isSelectedPropertyName()] = true;\r\n        this.allSelectedValue.push(element);\r\n      } else if (event.checked == false) {\r\n        let indexToRemove = this.allSelectedValue.findIndex(\r\n          (x) => x.index == element.index\r\n        );\r\n        element[this.isSelectedPropertyName()] = false;\r\n        this.allSelectedValue.splice(indexToRemove, 1);\r\n      }\r\n    }\r\n\r\n    if (\r\n      this.allSelectedValue.length == this.dataSource.filteredData.length &&\r\n      isMultipleSelection == true\r\n    ) {\r\n      this.isAllSelected.set(true);\r\n    } else {\r\n      this.isAllSelected.set(false);\r\n    }\r\n\r\n    this.checkboxInfo.emit(this.allSelectedValue);\r\n    this.checkboxJustSelectedInfo.emit(element);\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Gestione eventi di output per AVVIO e FINE esportazione tabella\r\n\r\n  /**\r\n   * Viene scatenato quando viene avviata la procedura di export della tabella (procedura standard e non custom)\r\n   */\r\n  exportStart() {\r\n    this.eqpExportStarted.emit();\r\n  }\r\n\r\n  /**\r\n   * Viene scatenato quando viene completata la procedura di export della tabella (procedura standard e non custom)\r\n   */\r\n  exportComplete() {\r\n    this.eqpExportCompleted.emit();\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region  Gestione eventi di output per pulsanti CONFIRM e EXIT\r\n\r\n  executeConfirmFunction() {\r\n    this.functionButtonConfirm.emit(this.allSelectedValue);\r\n  }\r\n\r\n  executeExitFunction() {\r\n    this.functionButtonExit.emit(null);\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Funzioni per evidenziazione riga selezionata\r\n\r\n  /**\r\n   * Vengono applicate le classi passate alla mat-row, mat-cell e mat-header-cell\r\n   * @param row\r\n   * @returns\r\n   */\r\n  getMatRowCss(row): string {\r\n    const rc = this.rowCssClass();\r\n    if (rc != null)\r\n      return typeof rc == \"string\" ? rc : (rc as Function)(row);\r\n\r\n    return \"\";\r\n  }\r\n\r\n  getCellCss(element, col): string {\r\n    const cc = this.cellCssClass();\r\n    if (cc != null)\r\n      return typeof cc == \"string\" ? cc : (cc as Function)(element, col);\r\n\r\n    return \"\";\r\n  }\r\n\r\n  getHeaderCellCss(col: any): string {\r\n    let classes = \"\";\r\n    const hcc = this.headerCellCssClass();\r\n    if (hcc != null) {\r\n      classes = typeof hcc === \"string\" ? hcc : (hcc as Function)(col);\r\n    }\r\n\r\n    // 2. Aggiungo la classe di allineamento basata sulla configurazione\r\n    if (col.styles?.cellAlignment === this.cellAlingmentEnum.RIGHT) {\r\n      classes += \" align-header-right\";\r\n    } else if (col.styles?.cellAlignment === this.cellAlingmentEnum.CENTER) {\r\n      classes += \" align-header-center\";\r\n    } else {\r\n      // Default o esplicito LEFT\r\n      classes += \" align-header-left\";\r\n    }\r\n\r\n    return classes.trim();\r\n  }\r\n\r\n  /**\r\n   * Gestisce il toggle della riga di dettaglio espandibile.\r\n   * Ferma la propagazione, esegue il toggle e forza il detectChanges sincrono\r\n   * per garantire che il contenuto venga renderizzato prima del calcolo dell'animazione.\r\n   */\r\n  toggleDetailRow(element: any, event: Event): void {\r\n    event.stopPropagation();\r\n    this.resizeHelper.toggleRow(element);\r\n    this.cd.detectChanges();\r\n  }\r\n\r\n  /**\r\n   * Se l'input isHighlight è impostato a TRUE allora si occupa di evidenziare la riga selezionata\r\n   * @param row Riga da evidenziare\r\n   */\r\n  highlight(row) {\r\n    if (this.isHighlight() == true) {\r\n      if (row != null && this.selectedRow() !== row) {\r\n        this.selectedRow.set(row);\r\n        this.highlightSelected.emit(this.selectedRow());\r\n      } else {\r\n        this.highlightDeselected.emit(this.selectedRow());\r\n        this.selectedRow.set(null);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Permette di rimuovere l'evidenziatura dalla riga selezionata.\r\n   * COmporta la deselezione della riga\r\n   */\r\n  public deselectHighlight() {\r\n    if (this.selectedRow() != null) this.selectedRow.set(null);\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Funzioni di ricerca e applicazioni filtri\r\n\r\n  /**\r\n   * Funzione richiamata quando l'utente scrivo nel campo di ricerca testuale globale.\r\n   * Si occupa di applicare il filtro sui dati in base alla configurazione delle colonne.\r\n   * @param filterValue Testo scritto nell'input di testo\r\n   */\r\n  applyFilter(filterValue: string) {\r\n    if (filterValue != null && filterValue != \"\")\r\n      filterValue = filterValue.replace(/\\s/g, \"\");\r\n\r\n    this.dataSource.filter = filterValue.trim().toLowerCase();\r\n    this.filteredColumns.emit(this.dataSource.filteredData);\r\n  }\r\n\r\n  toggleSearch() {\r\n    this.searchActive.update(v => !v);\r\n    //Resetto l'input e riapplico il filtro\r\n    const searchInput = this.searchInput();\r\n    if (!this.searchActive()) {\r\n      searchInput.nativeElement.value = \"\";\r\n      this.applyFilter(\"\");\r\n    }\r\n\r\n    if (this.searchActive()) searchInput.nativeElement.focus();\r\n  }\r\n\r\n  /**\r\n   * Funzione richiamata quando l'utente inizia la ricerca su una specifica colonna.\r\n   * Si occupa di filtrare i dati cercando il testo inserito dall'utente solo in una specifica colonna\r\n   * @param filterValue Valore di ricerca inserito dall'utente\r\n   * @param column Colonna su cui va applicato il filtro\r\n   */\r\n  applyFilterSingleColumn(filterValue: string, column: string) {\r\n    //Resetto il datasource al punto di partenza ogni volta che riparte la ricerca\r\n    this.dataSource.data = this.data;\r\n    this.dataSource.filteredData = this.data;\r\n    this.cd.detectChanges();\r\n\r\n    //Ciclo le chiavi presenti nelle singole colonne creando un dizionario {Colonna => Testo}\r\n    this.filtersModel.forEach((each, ind) => {\r\n      if (this.selection() == true) {\r\n        this.filterKeys[this.tableColumns[ind - 1].value.toString()] =\r\n          each || null;\r\n      } else {\r\n        this.filterKeys[this.tableColumns[ind].value.toString()] = each || null;\r\n      }\r\n    });\r\n\r\n    //Per ogni chiave del dizionario, faccio partire la ricerca\r\n    //N.B l'else finale è\r\n    for (let key in this.filterKeys) {\r\n      if (this.filterKeys[key] == null) this.filterKeys[key] = \"\";\r\n\r\n      this.selectedColumnToSearch = key;\r\n      this.applyFilter(this.filterKeys[key]);\r\n      this.dataSource.data = this.dataSource.filteredData;\r\n      this.cd.detectChanges();\r\n    }\r\n  }\r\n\r\n  //Al Change dell'evento di checkbox delle hidden columns, aggiorno la proprietà isHidden\r\n  isColumnToShowChecked(cd) {\r\n    cd.isHidden = !cd.isHidden;\r\n    if (this.autoResizeColumns() == true) this.onResize();\r\n  }\r\n\r\n  //#endregion\r\n\r\n  //#region Gestione TableColumn\r\n\r\n  /**\r\n   * Controllo se è tutto configurato correttamente ed eventualmente converto l'array di TableColumn nel\r\n   * modello base utilizzato nel componente (ConfigColumn)\r\n   */\r\n  checkAndConvertTableColumn() {\r\n    this.checkTableColumn();\r\n\r\n    //Se mi viene passato direttamente un array di BaseFieldModel, prima lo converto in un array di TableFields\r\n    if (EqpCommonService.isBaseField(this.tableColumnFields))\r\n      this.tableColumnFields = EqpCommonService.convertAs<TableColumnField>(\r\n        this.tableColumnFields,\r\n        TableColumnField,\r\n        this.tableColumnFields.map((x) => x.key)\r\n      );\r\n\r\n    this.tableColumns = TableColumnField.createConfigColumns(\r\n      this.tableColumnFields\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Faccio i controlli del caso, per capire se è stata configurata correttamente la nuova tabella\r\n   */\r\n  private checkTableColumn() {\r\n    if (this.tableColumns != null && this.tableColumnFields != null) {\r\n      throw new Error(\r\n        \"Can't use simultaneously tableColumns and tableColumnFields\"\r\n      );\r\n    }\r\n  }\r\n\r\n  //#endregion\r\n\r\n  tableFiltersSelected(event) {\r\n    this.filtersSelected.emit(event);\r\n  }\r\n\r\n  tableCustomFiltersSavedValueLoaded(event) {\r\n    this.customFiltersSavedValueLoaded.emit(event);\r\n  }\r\n\r\n  //#region Eventi drag and drop\r\n  dragReleased(event: any, row: any) {\r\n    this.dragReleasedEvent.emit({ event, row });\r\n  }\r\n\r\n  dragStarted(event: CdkDragStart<any>, row: any) {\r\n    this.dragStartedEvent.emit({ event, row });\r\n  }\r\n\r\n  dragEnded(event: CdkDragEnd<any>, row: any) {\r\n    if (this.enableDragColumn()) this.enableDragAndDrop = false;\r\n\r\n    this.dragEndedEvent.emit({ event, row });\r\n  }\r\n\r\n  drop(event: CdkDragDrop<any>): void {\r\n    const previousIndex = event.previousIndex;\r\n    const row = this.dataSource.data[previousIndex];\r\n\r\n    if (this.changeDragRowPosition() == true) {\r\n      moveItemInArray(\r\n        this.dataSource.data,\r\n        event.previousIndex,\r\n        event.currentIndex\r\n      );\r\n\r\n      this.dataSource.data.forEach((item, index) => {\r\n        item.originalIndex = index;\r\n      });\r\n\r\n      this.dataSource.data = [...this.dataSource.data];\r\n    }\r\n\r\n    if (this.enableDragColumn()) this.enableDragAndDrop = false;\r\n\r\n    this.dragDropEvent.emit({ event, row });\r\n  }\r\n\r\n  //#endregion Eventi drag and drop\r\n}\r\n","<!--\r\nContenitore principale della tabella.\r\nLa direttiva @if controlla se la tabella deve essere renderizzata all'interno di una mat-card per un layout strutturato,\r\noppure direttamente nel DOM per una maggiore flessibilità.\r\n-->\r\n@if (createMatCard()) {\r\n<!-- Wrapper Mat Card: fornisce un contenitore stilizzato con sfondo personalizzabile. -->\r\n<mat-card appearance=\"outlined\" [ngStyle]=\"{ background: tableColor() ?? 'white' }\">\r\n  @if (createMatCardHeader()) {\r\n  <!-- Header della Card: ospita il titolo e i componenti dei filtri. -->\r\n  <mat-card-header>\r\n    <ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n  </mat-card-header>\r\n  }\r\n  <!-- Contenuto della Card: contiene la logica principale della tabella, inclusa la barra degli strumenti e la tabella stessa. -->\r\n  <mat-card-content>\r\n    <ng-container *ngTemplateOutlet=\"bodyTemplate\"></ng-container>\r\n  </mat-card-content>\r\n  <!-- Footer della Card: contiene i pulsanti di azione globali come \"Conferma\" e \"Esci\". -->\r\n  <mat-card-footer>\r\n    <ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n  </mat-card-footer>\r\n</mat-card>\r\n} @else {\r\n<!-- Rendering diretto senza Mat Card per un'integrazione più semplice in layout esistenti. -->\r\n<ng-container *ngTemplateOutlet=\"headerTemplate\"></ng-container>\r\n<ng-container *ngTemplateOutlet=\"bodyTemplate\"></ng-container>\r\n<ng-container *ngTemplateOutlet=\"footerTemplate\"></ng-container>\r\n}\r\n\r\n<!--\r\nTEMPLATE HEADER:\r\nContiene gli elementi visualizzati sopra la tabella.\r\n-->\r\n<ng-template #headerTemplate>\r\n  <!-- Componente per i filtri personalizzati, visualizzato se [enableFilters] è true. -->\r\n  @if (enableFilters() && tableColumns) {\r\n  <eqp-table-filter [filterObject]=\"filterObject()\" [tableColumnFields]=\"tableColumns\"\r\n    (filtersSelected)=\"tableFiltersSelected($event)\"\r\n    (customFiltersSavedValueLoaded)=\"tableCustomFiltersSavedValueLoaded($event)\">\r\n  </eqp-table-filter>\r\n  }\r\n</ng-template>\r\n\r\n<!--\r\nTEMPLATE BODY:\r\nContiene la barra degli strumenti (controlli) e la tabella dati.\r\n-->\r\n<ng-template #bodyTemplate>\r\n  <!-- Barra degli strumenti della tabella: include ricerca, esportazione, configurazione colonne e filtri. -->\r\n  <div style=\"justify-content: flex-end\" class=\"row\">\r\n    <div class=\"table-header\">\r\n      <!-- Titolo principale della tabella, impostato tramite l'input [headerTitle]. -->\r\n      @if (headerTitle()) {\r\n      <div style=\"margin-right: auto\">\r\n        <h4 class=\"table-title\">{{ headerTitle() }}</h4>\r\n      </div>\r\n      }\r\n      <!--\r\n      Ricerca Globale:\r\n      Visualizzata se la tabella è ricercabile ([isTableSearcheable]) e non è attiva la modalità di filtro per colonna singola.\r\n      Il campo di ricerca si espande e si contrae, e il filtro viene applicato a ogni input.\r\n      -->\r\n      @if (isTableSearcheable() && !isSingleColumnFilter) {\r\n      <div class=\"search-container\">\r\n        <mat-form-field class=\"search-input\" [class.active]=\"searchActive()\">\r\n          <input matInput #searchInput (input)=\"applyFilter(searchInput.value)\" placeholder=\"Cerca\" />\r\n          @if (searchActive()) {\r\n          <button type=\"button\" matSuffix mat-icon-button (click)=\"toggleSearch()\">\r\n            <mat-icon>close</mat-icon>\r\n          </button>\r\n          }\r\n        </mat-form-field>\r\n        <button type=\"button\" mat-icon-button class=\"search-icon\" (click)=\"toggleSearch()\">\r\n          <mat-icon>search</mat-icon>\r\n        </button>\r\n      </div>\r\n      }\r\n\r\n      <!-- Componente per l'esportazione dei dati (es. in Excel), visibile se [exportEqpTable] è configurato. -->\r\n      @if (exportEqpTable) {\r\n      <eqp-table-exporter [exportEqpTable]=\"exportEqpTable\" [isMultiLanguage]=\"isMultiLanguage()\"\r\n        [selectionEnabled]=\"selection()\" [tableColumns]=\"tableColumns\" [exporterInstance]=\"exporter\">\r\n      </eqp-table-exporter>\r\n      }\r\n\r\n      <!-- Menu per la configurazione delle colonne, permette all'utente di mostrare/nascondere colonne dinamicamente. -->\r\n      @if (chooseColumnsToShow()) {\r\n      <button mat-icon-button [matMenuTriggerFor]=\"menu\" class=\"table-config-menu\">\r\n        <mat-icon>settings</mat-icon>\r\n        <mat-menu #menu=\"matMenu\">\r\n          <span class=\"table-config-menu-label\">{{\r\n            chooseColumnsToShowText()\r\n            }}</span>\r\n          <div class=\"table-config-menu-options\">\r\n            @for (cd of tableColumns; track cd.key) {\r\n            <mat-checkbox (change)=\"isColumnToShowChecked(cd)\" (click)=\"\r\n                displayedColumns = getColumnKeys(); $event.stopPropagation()\r\n              \" [checked]=\"!cd.isHidden\">\r\n              {{ cd.display }}\r\n            </mat-checkbox>\r\n            }\r\n          </div>\r\n        </mat-menu>\r\n      </button>\r\n      }\r\n\r\n      <!-- Pulsante per attivare/disattivare la visibilità dei filtri per colonna singola. -->\r\n      @if (isTableSearcheable() && isSingleColumnFilter &&\r\n      showSingleFilterButton()) {\r\n      <div style=\"float: right\">\r\n        <button style=\"cursor: pointer; margin: 0 auto; display: block\" mat-raised-button type=\"button\"\r\n          matTooltip=\"Search\" (click)=\"\r\n            $event.stopPropagation();\r\n            singleFilterColumnVisible = !singleFilterColumnVisible\r\n          \">\r\n          <mat-icon>search</mat-icon>\r\n          <span>{{\r\n            !singleFilterColumnVisible ? showFilterText() : hideFilterText()\r\n            }}</span>\r\n        </button>\r\n      </div>\r\n      }\r\n\r\n      <!-- Pulsante per alternare tra ricerca globale e filtro per colonna singola, se [switchFilterType] è abilitato. -->\r\n      @if (isTableSearcheable() && switchFilterType()) {\r\n      <div style=\"float: right; display: flex; align-items: center\">\r\n        <button style=\"cursor: pointer\" mat-raised-button type=\"button\" [matTooltip]=\"\r\n            !isSingleColumnFilter\r\n              ? switchFilterToSingleText()\r\n              : switchFilterToGenericText()\r\n          \" (click)=\"\r\n            $event.stopPropagation();\r\n            isSingleColumnFilter = !isSingleColumnFilter\r\n          \">\r\n          <mat-icon>youtube_searched_for</mat-icon>\r\n          <span>{{\r\n            !isSingleColumnFilter\r\n            ? switchFilterToSingleText()\r\n            : switchFilterToGenericText()\r\n            }}</span>\r\n        </button>\r\n      </div>\r\n      }\r\n\r\n      <!-- Componente per pulsanti personalizzati, permette di aggiungere azioni custom nella barra degli strumenti. -->\r\n      @if (customButtons()) {\r\n      <eqp-table-custom-buttons [customButtons]=\"customButtons()\" [isMultiLanguage]=\"isMultiLanguage()\">\r\n      </eqp-table-custom-buttons>\r\n      }\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Contenitore principale della tabella con elevazione (ombra) e classe per l'espansione. -->\r\n  <div [ngClass]=\"{ expandableTable: autoResizeColumns() && mediaQuery?.matches }\" class=\"mat-table__wrapper\">\r\n    <div #tableContainer>\r\n      <!--\r\n      Tabella Material Design.\r\n      - eqpMatTableExporter: Direttiva per l'esportazione.\r\n      - multiTemplateDataRows: Abilita righe multiple per un singolo dato (usato per le righe espandibili).\r\n      - matSort: Abilita l'ordinamento.\r\n      - cdkDropList: Definisce la tabella come contenitore per il drag-and-drop.\r\n      -->\r\n      <table mat-table #matTableRef #tableElementRef [ngStyle]=\"{ background: tableColor() ?? 'white' }\"\r\n        eqpMatTableExporter multiTemplateDataRows (exportCompleted)=\"exportComplete()\" (exportStarted)=\"exportStart()\"\r\n        [hiddenColumns]=\"exportEqpTable?.hiddenColumns\" matSort [dataSource]=\"dataSource\"\r\n        #exporter=\"eqpMatTableExporter\" id=\"eqp-table\" (matSortChange)=\"sortChanged($event)\" cdkDropList\r\n        (cdkDropListDropped)=\"drop($event)\" [tableElement]=\"tableRef()\" [paginator]=\"paginator\"\r\n        [exportEqpTable]=\"exportEqpTable\">\r\n        <!-- COLONNA DETTAGLI: Pulsante per espandere/collassare la riga e mostrare dettagli aggiuntivi. -->\r\n        <ng-container matColumnDef=\"Detail\">\r\n          <th mat-header-cell [ngStyle]=\"{ flex: detailColumns?.length ? '0 0 5%' : '0 0 0' }\" *matHeaderCellDef></th>\r\n          <td mat-cell [ngStyle]=\"{ flex: detailColumns?.length ? '0 0 5%' : '0 0 0' }\" *matCellDef=\"let element\">\r\n            @if (detailColumns?.length) {\r\n            <!-- Il click commuta lo stato 'expanded' dell'elemento, attivando l'animazione. -->\r\n            <button mat-button (click)=\"toggleDetailRow(element, $event)\">\r\n              <mat-icon [@iconTransition]=\"element.expanded\">{{\r\n                element.expanded ? \"remove_circle\" : \"add_circle\"\r\n                }}</mat-icon>\r\n            </button>\r\n            }\r\n          </td>\r\n        </ng-container>\r\n\r\n        <!-- COLONNA CHECKBOX: Per la selezione singola o multipla delle righe. -->\r\n        <ng-container matColumnDef=\"Checkbox\">\r\n          <th mat-header-cell style=\"flex: 0 0 5%\" *matHeaderCellDef>\r\n            <!-- Checkbox nell'header per selezionare/deselezionare tutte le righe (solo in modalità selezione multipla). -->\r\n            <mat-checkbox [disabled]=\"!isMultipleSelection() || disableRow()\" [checked]=\"isAllSelected()\"\r\n              (change)=\"isMultipleSelection() ? selectUnselectAll() : null\">\r\n            </mat-checkbox>\r\n          </th>\r\n          <td mat-cell style=\"flex: 0 0 5%\" *matCellDef=\"let element; let i = dataIndex\">\r\n            <!-- Checkbox per la singola riga. Disabilitata se la riga è non selezionabile tramite la logica di `isRowDisabled`. -->\r\n            <mat-checkbox (click)=\"$event.stopPropagation()\" [checked]=\"element[isSelectedPropertyName()]\"\r\n              [disabled]=\"columnAccessibilityHelper.isRowDisabled(element)\"\r\n              (change)=\"changeCheckboxRowSelection($event, element, i)\">\r\n            </mat-checkbox>\r\n          </td>\r\n        </ng-container>\r\n\r\n        <!-- COLONNA DRAG: Handle per il drag-and-drop delle righe. -->\r\n        <ng-container matColumnDef=\"Drag\">\r\n          <th mat-header-cell style=\"flex: 0 0 5%\" *matHeaderCellDef></th>\r\n          <td mat-cell style=\"flex: 0 0 5%\" *matCellDef=\"let element\">\r\n            <!-- L'icona funge da \"maniglia\" (cdkDragHandle) per avviare il trascinamento. -->\r\n            <mat-icon cdkDragHandle (touchstart)=\"enableDragAndDrop = true\" (mousedown)=\"enableDragAndDrop = true\"\r\n              style=\"cursor: move\">open_with</mat-icon>\r\n          </td>\r\n        </ng-container>\r\n\r\n        <!--\r\n        COLONNE DATI DINAMICHE:\r\n        Questo ciclo @for crea una definizione di colonna (matColumnDef) per ogni colonna configurata in `columnsDataSource`.\r\n        -->\r\n        @for (col of columnsDataSource; track col.key) {\r\n        <ng-container [matColumnDef]=\"col.key\" [sticky]=\"col.isSticky\" [stickyEnd]=\"col.isStickyEnd\">\r\n          <!-- Header della colonna con ordinamento e stili dinamici. -->\r\n          <th mat-header-cell style=\"padding: 5px\" [ngClass]=\"getHeaderCellCss(col)\" [ngStyle]=\"{\r\n              flex:\r\n                col.styles?.flex ??\r\n                (col.styles?.minWidth || col.styles?.maxWidth\r\n                  ? ''\r\n                  : standardFlexValue),\r\n              'min-width': col.styles?.minWidth ?? '',\r\n              'max-width': col.styles?.maxWidth ?? '',\r\n              'text-align':\r\n                col.styles?.cellAlignment &&\r\n                col.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? col.styles.cellAlignment == cellAlingmentEnum.RIGHT\r\n                    ? 'right'\r\n                    : 'center'\r\n                  : 'unset',\r\n              'justify-content':\r\n                col.styles?.cellAlignment &&\r\n                col.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? col.styles.cellAlignment == cellAlingmentEnum.RIGHT\r\n                    ? 'flex-end'\r\n                    : 'center'\r\n                  : 'unset'\r\n            }\" mat-sort-header *matHeaderCellDef [disabled]=\"\r\n              col.isSortable == false ||\r\n              !searchFilterHelper.isColumnTypeValidForSearch(\r\n                col.type,\r\n                col.isSearchable\r\n              )\r\n            \">\r\n            <span>{{ col.display }}</span>\r\n          </th>\r\n\r\n          <!-- Cella della colonna con stili dinamici e rendering del contenuto tramite template. -->\r\n          <td mat-cell *matCellDef=\"let element; let elementIndex = index\" [ngClass]=\"getCellCss(element, col)\"\r\n            [ngStyle]=\"{\r\n              flex:\r\n                col.styles?.flex ??\r\n                (col.styles?.minWidth || col.styles?.maxWidth\r\n                  ? ''\r\n                  : standardFlexValue),\r\n              'min-width': col.styles?.minWidth ?? '',\r\n              'max-width': col.styles?.maxWidth ?? '',\r\n              color: col.styles?.color ?? 'inherit',\r\n              'text-align':\r\n                col.styles?.cellAlignment &&\r\n                col.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? col.styles.cellAlignment == cellAlingmentEnum.RIGHT\r\n                    ? 'right'\r\n                    : 'center'\r\n                  : 'unset',\r\n              'justify-content':\r\n                col.styles?.cellAlignment &&\r\n                col.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? col.styles.cellAlignment == cellAlingmentEnum.RIGHT\r\n                    ? 'flex-end'\r\n                    : 'center'\r\n                  : 'unset'\r\n            }\" [attr.data-label]=\"col.display\">\r\n            <!-- Utilizza un template riutilizzabile (columnCellRenderer) per renderizzare il contenuto della cella in base al tipo di colonna. -->\r\n            <ng-container *ngTemplateOutlet=\"\r\n                columnCellRenderer;\r\n                context: {\r\n                  col: col,\r\n                  element: element,\r\n                  index: element.originalIndex\r\n                }\r\n              \"></ng-container>\r\n          </td>\r\n        </ng-container>\r\n        }\r\n\r\n        <!--\r\n        RIGHE FILTRI PER COLONNA SINGOLA:\r\n        Questo ciclo @for crea una riga di header aggiuntiva contenente i campi di input per filtrare ogni singola colonna.\r\n        Questa riga è visibile solo quando `singleFilterColumnVisible` è true.\r\n        -->\r\n        @for (headersFilter of headersFilters; track headersFilter.column; let i\r\n        = $index) {\r\n        <ng-container [matColumnDef]=\"headersFilter.column\">\r\n          @if (i == 0 && selection()) {\r\n          <th mat-header-cell style=\"flex: 0 0 5%\" *matHeaderCellDef></th>\r\n          } @if (!selection() || i > 0) {\r\n          <th mat-header-cell id=\"filter\" [ngStyle]=\"{\r\n              flex:\r\n                headersFilter.styles?.flex ??\r\n                (headersFilter.styles?.minWidth ||\r\n                headersFilter.styles?.maxWidth\r\n                  ? ''\r\n                  : standardFlexValue),\r\n              'min-width': headersFilter.styles?.minWidth ?? '',\r\n              'max-width': headersFilter.styles?.maxWidth ?? '',\r\n              'text-align':\r\n                headersFilter.styles?.cellAlignment &&\r\n                headersFilter.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? headersFilter.styles.cellAlignment ==\r\n                    cellAlingmentEnum.RIGHT\r\n                    ? 'right'\r\n                    : 'center'\r\n                  : 'unset',\r\n              'justify-content':\r\n                headersFilter.styles?.cellAlignment &&\r\n                headersFilter.styles.cellAlignment != cellAlingmentEnum.LEFT\r\n                  ? headersFilter.styles.cellAlignment ==\r\n                    cellAlingmentEnum.RIGHT\r\n                    ? 'flex-end'\r\n                    : 'center'\r\n                  : 'unset'\r\n            }\" *matHeaderCellDef>\r\n            <div class=\"filters-container\" [class.animate]=\"singleFilterColumnVisible\">\r\n              <!-- Campo di input per il filtro, visibile solo se la colonna è ricercabile. -->\r\n              @if (headersFilter.isSearchable != false &&\r\n              searchFilterHelper.isColumnTypeValidForSearch(headersFilter.type,\r\n              headersFilter.isSearchable)) {\r\n              <mat-form-field style=\"width: 100%\" appearance=\"outline\">\r\n                @if (!filtersModel[i]) {\r\n                <mat-icon matPrefix>search</mat-icon>\r\n                }\r\n                <input [(ngModel)]=\"filtersModel[i]\" matInput (keyup)=\"\r\n                    applyFilterSingleColumn(\r\n                      $event.target['value'],\r\n                      headersFilter.key\r\n                    )\r\n                  \" />\r\n              </mat-form-field>\r\n              }\r\n            </div>\r\n          </th>\r\n          }\r\n        </ng-container>\r\n        }\r\n\r\n        <!-- CONTENUTO RIGA ESPANSA: Template per i dettagli aggiuntivi. -->\r\n        <ng-container matColumnDef=\"expandedDetail\">\r\n          <td mat-cell *matCellDef=\"let element; let templateIndex = dataIndex\" class=\"example-detail-cell\">\r\n            <!-- L'animazione 'detailExpand' gestisce l'effetto di espansione/collasso. -->\r\n            <div class=\"example-element-detail\" [@detailExpand]=\"element.expanded ? 'expanded' : 'collapsed'\">\r\n              <ng-template [ngTemplateOutlet]=\"detailTableTemplate\" [ngTemplateOutletContext]=\"{\r\n                  row: element,\r\n                  templateIndex: templateIndex\r\n                }\"></ng-template>\r\n            </div>\r\n          </td>\r\n        </ng-container>\r\n\r\n        <!-- RIGA HEADER PRINCIPALE: Definisce la riga dell'intestazione con le colonne visibili. -->\r\n        <tr mat-header-row style=\"width: 100%\" *matHeaderRowDef=\"displayedColumns; sticky: isStickyHeader()\"></tr>\r\n\r\n        <!-- RIGA FILTRI AGGIUNTIVA: Visualizzata solo su desktop se i filtri per colonna sono attivi. -->\r\n        @if (!autoResizeColumns() && !mediaQuery?.matches) {\r\n        <tr mat-header-row style=\"height: unset; min-height: unset\"\r\n          *matHeaderRowDef=\"getHeaderFiltersColumnDefinitions()\"></tr>\r\n        }\r\n\r\n        <!--\r\n          RIGHE DATI:\r\n          Definisce come ogni riga di dati viene renderizzata.\r\n          - ngClass: Applica classi CSS personalizzate.\r\n          - ngStyle: Applica lo stile di highlight per la riga selezionata.\r\n          - (click): Gestisce la selezione/highlight della riga.\r\n          - cdkDrag: Abilita il drag-and-drop per la riga.\r\n          -->\r\n        <tr mat-row style=\"width: 100%\" class=\"example-element-row\" [class.example-expanded-row]=\"row.expanded\"\r\n          [ngClass]=\"getMatRowCss(row)\" [ngStyle]=\"{\r\n            background:\r\n              isHighlight() && selectedRow() == row ? highlightColor() : ''\r\n          }\" (click)=\"highlight(row)\" *matRowDef=\"let row; columns: displayedColumns\" cdkDrag\r\n          [cdkDragDisabled]=\"!enableDragAndDrop\" (cdkDragStarted)=\"dragStarted($event, row)\"\r\n          (cdkDragReleased)=\"dragReleased($event, row)\" (cdkDragEnded)=\"dragEnded($event, row)\"></tr>\r\n\r\n        <!-- RIGA DETTAGLI ESPANSI: Riga aggiuntiva che appare sotto la riga principale quando viene espansa. -->\r\n        @if (autoResizeColumns() && mediaQuery?.matches) {\r\n        <tr mat-row *matRowDef=\"let row; columns: ['expandedDetail']\" class=\"example-detail-row\"\r\n          [class.collapsed]=\"!row.expanded\"></tr>\r\n        }\r\n      </table>\r\n\r\n      <!-- Messaggio visualizzato quando la tabella non ha dati da mostrare. -->\r\n      @if (dataSource.filteredData.length === 0) {\r\n      <div [ngStyle]=\"{ background: tableColor() ?? 'unset' }\" class=\"no-records\">\r\n        {{ emptyTableMessage() ?? \"Nessun dato trovato\" }}\r\n      </div>\r\n      }\r\n    </div>\r\n  </div>\r\n\r\n  <!-- Paginatore: Controlli per la navigazione tra le pagine della tabella. -->\r\n  @if (paginatorVisible()) {\r\n  <div class=\"eqp-paginator-row\" [ngStyle]=\"{ background: paginatorColor() ?? 'unset' }\">\r\n    <mat-paginator #paginatorRef [ngStyle]=\"{ background: paginatorColor() ?? 'unset' }\"\r\n      (page)=\"pageChanged($event)\" [pageSizeOptions]=\"matPaginatorLength()\" [pageSize]=\"matPaginatorSize\"\r\n      [length]=\"matPaginatorCount()\" [pageIndex]=\"matPaginatorIndex()\"\r\n      [showFirstLastButtons]=\"showFirstLastButtons()\">\r\n    </mat-paginator>\r\n    @if (gotoPageEnabled()) {\r\n    <eqp-table-goto-page [paginator]=\"paginatorRef\"></eqp-table-goto-page>\r\n    }\r\n  </div>\r\n  }\r\n</ng-template>\r\n\r\n<!--\r\n  TEMPLATE FOOTER:\r\n  Contiene i pulsanti di azione finali, come Conferma e Esci.\r\n  -->\r\n<ng-template #footerTemplate>\r\n  @if (showFunctionButtons()) {\r\n  <div class=\"row\">\r\n    <div class=\"col-sm-12 text-end\">\r\n      <button type=\"button\" (click)=\"executeConfirmFunction()\" class=\"btn btn-primary mat-raised-button\">\r\n        {{ functionButtonConfirmText() ?? \"Conferma\" }}\r\n      </button>\r\n      <button type=\"button\" (click)=\"executeExitFunction()\" class=\"btn mat-raised-button\">\r\n        {{ functionButtonExitText() ?? \"Esci\" }}\r\n      </button>\r\n    </div>\r\n  </div>\r\n  }\r\n</ng-template>\r\n\r\n<!--\r\n  TEMPLATE DETTAGLI TABELLA:\r\n  Questo template definisce la struttura della tabella di dettagli visualizzata all'interno di una riga espansa.\r\n  -->\r\n<ng-template #detailTableTemplate let-row=\"row\" let-templateIndex=\"templateIndex\">\r\n  <div style=\"width: 100%\" class=\"expandTable\">\r\n    <!-- Tabella secondaria per i dettagli -->\r\n    <mat-table [ngStyle]=\"{ background: tableColor() ?? 'white' }\" #matTableRef eqpMatTableExporter\r\n      [dataSource]=\"dataSource\">\r\n      @for (col of detailConfigColumns; track col.key) {\r\n      <ng-container [matColumnDef]=\"col.key\">\r\n        <mat-header-cell style=\"padding: 5px\" [ngStyle]=\"{\r\n            flex:\r\n              col.styles?.flex ??\r\n              (col.styles?.minWidth || col.styles?.maxWidth\r\n                ? ''\r\n                : standardFlexValue)\r\n          }\" *matHeaderCellDef>\r\n          <span>{{ col.display }}</span>\r\n        </mat-header-cell>\r\n\r\n        <mat-cell *matCellDef=\"let element; let elementIndex = index\" [ngStyle]=\"{\r\n            flex:\r\n              col.styles?.flex ??\r\n              (col.styles?.minWidth || col.styles?.maxWidth\r\n                ? ''\r\n                : standardFlexValue)\r\n          }\" [attr.data-label]=\"col.display\">\r\n          <!-- Renderizza il contenuto della cella solo per la riga espansa corrente. -->\r\n          @if (elementIndex == templateIndex) {\r\n          <ng-container *ngTemplateOutlet=\"\r\n              columnCellRenderer;\r\n              context: {\r\n                col: col,\r\n                element: element,\r\n                index: element.originalIndex\r\n              }\r\n            \"></ng-container>\r\n          }\r\n        </mat-cell>\r\n      </ng-container>\r\n      }\r\n\r\n      <mat-header-row *matHeaderRowDef=\"detailColumns\"></mat-header-row>\r\n      <mat-row *matRowDef=\"let row; columns: detailColumns\" class=\"example-detail-row\"></mat-row>\r\n    </mat-table>\r\n  </div>\r\n</ng-template>\r\n\r\n<!--\r\n  TEMPLATE RENDERER PER CELLE:\r\n  Questo template è il cuore del rendering dinamico delle celle.\r\n  Utilizza uno @switch per selezionare il componente o il markup appropriato in base al `col.type`.\r\n  Questo approccio permette di avere celle specializzate per ogni tipo di dato.\r\n  -->\r\n<ng-template #columnCellRenderer let-col=\"col\" let-element=\"element\" let-index=\"index\">\r\n  @switch (col.type) {\r\n\r\n  <!-- Cella booleana: mostra un'icona per true/false. -->\r\n  @case (TypeEnum.Boolean) {\r\n  <eqp-table-boolean-column [col]=\"col\" [element]=\"element\"></eqp-table-boolean-column>\r\n  }\r\n\r\n  <!-- Cella colore: mostra un riquadro con il colore specificato. -->\r\n  @case (TypeEnum.Color) {\r\n  <eqp-table-color-column style=\"width: 100%\" [col]=\"col\" [element]=\"element\"></eqp-table-color-column>\r\n  }\r\n\r\n  <!-- Cella data: formatta una data usando una pipe. -->\r\n  @case (TypeEnum.Date) {\r\n  <eqp-table-date-column [col]=\"col\" [element]=\"element\"\r\n    [currentCultureSelected]=\"currentCultureSelected\"></eqp-table-date-column>\r\n  }\r\n\r\n  <!-- Cella enum: mappa un valore enum a una stringa leggibile. -->\r\n  @case (TypeEnum.Enum) {\r\n  <eqp-table-enum-column [col]=\"col\" [element]=\"element\"></eqp-table-enum-column>\r\n  }\r\n\r\n  <!-- Cella con pulsante di azione: esegue una funzione al click. -->\r\n  @case (TypeEnum.SimpleAction) { @for (action of col.actions; track action) {\r\n  <button type=\"button\" (click)=\"$event.stopPropagation()\" [hidden]=\"\r\n      columnAccessibilityHelper.isRowDisabled(element) ||\r\n      columnAccessibilityHelper.getHiddenInfo(action, element)\r\n    \" [disabled]=\"columnAccessibilityHelper.getDisableInfo(action, element)\"\r\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(action, element)\"\r\n    [matTooltipPosition]=\"action.tooltip?.tooltipPosition ?? 'below'\"\r\n    (click)=\"action.fn ? action.fn(element, index, col) : null\" mat-button>\r\n    @if (!action.fontawesome) {\r\n    <mat-icon [ngStyle]=\"{ color: action.color }\">{{\r\n      columnValueHelper.getIconValue(action, element)\r\n      }}</mat-icon>\r\n    } @if (action.fontawesome) {\r\n    <i [ngStyle]=\"{ color: action.color }\" style=\"font-size: 24px !important\"\r\n      class=\"{{ columnValueHelper.getIconValue(action, element) }}\"></i>\r\n    }\r\n    {{ action.name }}\r\n  </button>\r\n  } }\r\n\r\n  <!-- Cella con menu di azioni: mostra un menu a tendina con più opzioni. -->\r\n  @case (TypeEnum.MenuAction) {\r\n  <button type=\"button\" (click)=\"$event.stopPropagation()\" [hidden]=\"columnAccessibilityHelper.isRowDisabled(element)\"\r\n    [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(col, element)\"\r\n    [matTooltipPosition]=\"col.tooltip?.tooltipPosition ?? 'below'\" mat-button [matMenuTriggerFor]=\"menu\">\r\n    <mat-icon>{{ col.buttonMenuIcon ?? \"settings\" }}</mat-icon>\r\n  </button>\r\n  <mat-menu #menu=\"matMenu\">\r\n    @for (action of col.actions; track action) {\r\n    <button type=\"button\" [hidden]=\"columnAccessibilityHelper.getHiddenInfo(action, element)\"\r\n      [disabled]=\"columnAccessibilityHelper.getDisableInfo(action, element)\" mat-menu-item\r\n      [matTooltip]=\"columnAccessibilityHelper.getTooltipInfo(action, element)\"\r\n      [matTooltipPosition]=\"action.tooltip?.tooltipPosition ?? 'below'\"\r\n      (click)=\"action.fn ? action.fn(element, index, col) : null\">\r\n      @if (!action.fontawesome) {\r\n      <mat-icon [ngStyle]=\"{ color: action.color }\">{{\r\n        columnValueHelper.getIconValue(action, element)\r\n        }}</mat-icon>\r\n      } @if (action.fontawesome) {\r\n      <i [ngStyle]=\"{ color: action.color }\" style=\"font-size: 24px !important\"\r\n        class=\"{{ columnValueHelper.getIconValue(action, element) }}\"></i>\r\n      }\r\n      {{ action.name }}\r\n    </button>\r\n    }\r\n  </mat-menu>\r\n  }\r\n\r\n  <!-- Cella checkbox: mostra una checkbox (spesso usata come dato, non per la selezione della riga). -->\r\n  @case (TypeEnum.Checkbox) {\r\n  <eqp-table-checkbox-column [col]=\"col\" [element]=\"element\"></eqp-table-checkbox-column>\r\n  }\r\n\r\n  <!-- Cella icona: mostra un'icona basata sui dati. -->\r\n  @case (TypeEnum.Icon) {\r\n  <eqp-table-icon-column [col]=\"col\" [element]=\"element\"></eqp-table-icon-column>\r\n  }\r\n\r\n  <!-- Cella hyperlink: crea un link `<a>`. -->\r\n  @case (TypeEnum.Hyperlink) {\r\n  <eqp-table-hyperlink-column [col]=\"col\" [element]=\"element\"></eqp-table-hyperlink-column>\r\n  }\r\n\r\n  <!-- Cella di navigazione: usa il router di Angular per navigare a una nuova vista. -->\r\n  @case (TypeEnum.Navigate) {\r\n  <eqp-table-navigate-column [col]=\"col\" [element]=\"element\"></eqp-table-navigate-column>\r\n  }\r\n\r\n  <!-- Cella immagine: mostra un'immagine. -->\r\n  @case (TypeEnum.Image) {\r\n  <eqp-table-image-column [col]=\"col\" [element]=\"element\"></eqp-table-image-column>\r\n  }\r\n\r\n  <!-- Cella con template esterno: permette di passare un template personalizzato dall'esterno del componente. -->\r\n  @case (TypeEnum.ExternalTemplate) {\r\n  <ng-container [ngTemplateOutlet]=\"col.externalTemplate\"\r\n    [ngTemplateOutletContext]=\"{ row: element, col: col }\"></ng-container>\r\n  }\r\n\r\n  <!-- Cella standard (default): renderizza il testo con pipe opzionali (numeri, valuta, ecc.). -->\r\n  @default {\r\n  <eqp-table-standard-column [col]=\"col\" [element]=\"element\" [currentCultureSelected]=\"currentCultureSelected\"\r\n    [currentLocaleSelected]=\"currentLocaleSelected\">\r\n  </eqp-table-standard-column>\r\n  } }\r\n</ng-template>","import { NgModule } from '@angular/core';\r\n\r\n//Angular Material Components\r\nimport { MatCheckboxModule } from '@angular/material/checkbox';\r\nimport { MatButtonModule } from '@angular/material/button';\r\nimport { MatInputModule } from '@angular/material/input';\r\nimport { MatAutocompleteModule } from '@angular/material/autocomplete';\r\nimport { MatDatepickerModule } from '@angular/material/datepicker';\r\nimport { MatFormFieldModule } from '@angular/material/form-field';\r\nimport { MatRadioModule } from '@angular/material/radio';\r\nimport { MatSelectModule } from '@angular/material/select';\r\nimport { MatSliderModule } from '@angular/material/slider';\r\nimport { MatSlideToggleModule } from '@angular/material/slide-toggle';\r\nimport { MatMenuModule } from '@angular/material/menu';\r\nimport { MatSidenavModule } from '@angular/material/sidenav';\r\nimport { MatToolbarModule } from '@angular/material/toolbar';\r\nimport { MatListModule } from '@angular/material/list';\r\nimport { MatGridListModule } from '@angular/material/grid-list';\r\nimport { MatCardModule } from '@angular/material/card';\r\nimport { MatStepperModule } from '@angular/material/stepper';\r\nimport { MatTabsModule } from '@angular/material/tabs';\r\nimport { MatExpansionModule } from '@angular/material/expansion';\r\nimport { MatButtonToggleModule } from '@angular/material/button-toggle';\r\nimport { MatChipsModule } from '@angular/material/chips';\r\nimport { MatIconModule } from '@angular/material/icon';\r\nimport { MatProgressSpinnerModule } from '@angular/material/progress-spinner';\r\nimport { MatProgressBarModule } from '@angular/material/progress-bar';\r\nimport { MatDialogModule } from '@angular/material/dialog';\r\nimport { MatTooltipModule } from '@angular/material/tooltip';\r\nimport { MatSnackBarModule } from '@angular/material/snack-bar';\r\nimport { MatTableModule } from '@angular/material/table';\r\nimport { MatSortModule } from '@angular/material/sort';\r\nimport { MatPaginatorModule } from '@angular/material/paginator';\r\nimport { MatNativeDateModule } from '@angular/material/core';\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\n@NgModule({\r\n  imports: [\r\n    MatCheckboxModule,\r\n    MatButtonModule,\r\n    MatInputModule,\r\n    MatAutocompleteModule,\r\n    MatDatepickerModule,\r\n    MatFormFieldModule,\r\n    MatRadioModule,\r\n    MatSelectModule,\r\n    MatSliderModule,\r\n    MatSlideToggleModule,\r\n    MatMenuModule,\r\n    MatSidenavModule,\r\n    MatToolbarModule,\r\n    MatListModule,\r\n    MatGridListModule,\r\n    MatCardModule,\r\n    MatStepperModule,\r\n    MatTabsModule,\r\n    MatExpansionModule,\r\n    MatButtonToggleModule,\r\n    MatChipsModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatProgressBarModule,\r\n    MatDialogModule,\r\n    MatTooltipModule,\r\n    MatSnackBarModule,\r\n    MatTableModule,\r\n    MatSortModule,\r\n    MatPaginatorModule,\r\n    MatDatepickerModule,\r\n    MatNativeDateModule,\r\n    DragDropModule\r\n  ],\r\n  exports: [\r\n    MatCheckboxModule,\r\n    MatButtonModule,\r\n    MatInputModule,\r\n    MatAutocompleteModule,\r\n    MatDatepickerModule,\r\n    MatFormFieldModule,\r\n    MatRadioModule,\r\n    MatSelectModule,\r\n    MatSliderModule,\r\n    MatSlideToggleModule,\r\n    MatMenuModule,\r\n    MatSidenavModule,\r\n    MatToolbarModule,\r\n    MatListModule,\r\n    MatGridListModule,\r\n    MatCardModule,\r\n    MatStepperModule,\r\n    MatTabsModule,\r\n    MatExpansionModule,\r\n    MatButtonToggleModule,\r\n    MatChipsModule,\r\n    MatIconModule,\r\n    MatProgressSpinnerModule,\r\n    MatProgressBarModule,\r\n    MatDialogModule,\r\n    MatTooltipModule,\r\n    MatSnackBarModule,\r\n    MatTableModule,\r\n    MatSortModule,\r\n    MatPaginatorModule,\r\n    DragDropModule],\r\n})\r\nexport class MaterialModule { }\r\n","import { TranslateTableHelper } from './helpers/translateTable.helper';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { MaterialModule } from './modules/material.module';\r\nimport { ModuleWithProviders, NgModule } from '@angular/core';\r\nimport { EqpTableComponent } from './eqp-table.component';\r\nimport { CommonModule } from '@angular/common';\r\nimport { TranslateModule } from '@ngx-translate/core';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { TranslateHttpLoader } from '@ngx-translate/http-loader';\r\nimport { DateAdapter } from '@angular/material/core';\r\nimport { EqpTableExporterComponent } from './internal-components/eqp-table-exporter/eqp-table-exporter.component';\r\nimport { EqpTableBooleanColumnComponent } from './internal-components/boolean-column/boolean-column.component';\r\nimport { EqpTableColorColumnComponent } from './internal-components/color-column/color-column.component';\r\nimport { EqpTableDateColumnComponent } from './internal-components/date-column/date-column.component';\r\nimport { EqpTableEnumColumnComponent } from './internal-components/enum-column/enum-column.component';\r\nimport { EqpTableCheckboxColumnComponent } from './internal-components/checkbox-column/checkbox-column.component';\r\nimport { EqpTableIconColumnComponent } from './internal-components/icon-column/icon-column.component';\r\nimport { EqpTableHyperlinkColumnComponent } from './internal-components/hyperlink-column/hyperlink-column.component';\r\nimport { EqpTableImageColumnComponent } from './internal-components/image-column/image-column.component';\r\nimport { EqpTableStandardColumnComponent } from './internal-components/standard-column/standard-column.component';\r\nimport { EqpTableBaseComponent } from './internal-components/base-component/base.component';\r\nimport { CustomButtonsComponent } from './internal-components/custom-buttons/custom-buttons.component';\r\nimport { EqpTableFilterComponent } from './internal-components/filter-component/filter.component';\r\nimport { EqpFiltersModule } from '@eqproject/eqp-filters';\r\nimport { EqpMatTableExporterDirective } from './directives/mat-table-exporter.directive';\r\nimport { EqpTableNavigateColumnComponent } from './internal-components/navigate-column/navigate-column.component';\r\nimport { RouterModule } from '@angular/router';\r\n\r\n@NgModule({\r\n  imports: [\r\n    MaterialModule,\r\n    CommonModule,\r\n    TranslateModule,\r\n    FormsModule,\r\n    EqpFiltersModule,\r\n    RouterModule,\r\n    EqpTableComponent,\r\n    EqpTableBaseComponent,\r\n    EqpTableExporterComponent,\r\n    EqpTableStandardColumnComponent,\r\n    EqpTableBooleanColumnComponent,\r\n    EqpTableColorColumnComponent,\r\n    EqpTableDateColumnComponent,\r\n    EqpTableEnumColumnComponent,\r\n    EqpTableCheckboxColumnComponent,\r\n    EqpTableIconColumnComponent,\r\n    EqpTableHyperlinkColumnComponent,\r\n    EqpTableImageColumnComponent,\r\n    EqpTableNavigateColumnComponent,\r\n    CustomButtonsComponent,\r\n    EqpTableFilterComponent,\r\n    EqpMatTableExporterDirective,\r\n  ],\r\n  exports: [EqpTableComponent, EqpMatTableExporterDirective]\r\n})\r\nexport class EqpTableModule {\r\n\r\n  constructor(private adapter: DateAdapter<any>, private translateHelper: TranslateTableHelper) {\r\n    let currentLanguage = this.translateHelper.getCurrentLanguage();\r\n    this.setDateAdapterLocale(currentLanguage);\r\n  }\r\n\r\n  setDateAdapterLocale(localeString: string): void {\r\n    this.adapter.setLocale(localeString);\r\n  }\r\n\r\n  static forRoot(): ModuleWithProviders<EqpTableModule> {\r\n    return {\r\n      ngModule: EqpTableModule,\r\n      providers: []\r\n    }\r\n  }\r\n}\r\n\r\n","/*\r\n * Public API Surface of eqp-table\r\n */\r\n\r\nexport * from './lib/eqp-table.service';\r\nexport * from './lib/eqp-table.component';\r\nexport * from './lib/internal-components/base-component/base.component';\r\nexport * from './lib/internal-components/boolean-column/boolean-column.component';\r\nexport * from './lib/internal-components/checkbox-column/checkbox-column.component';\r\nexport * from './lib/internal-components/color-column/color-column.component';\r\nexport * from './lib/internal-components/date-column/date-column.component';\r\nexport * from './lib/internal-components/enum-column/enum-column.component';\r\nexport * from './lib/internal-components/eqp-table-exporter/eqp-table-exporter.component';\r\nexport * from './lib/internal-components/hyperlink-column/hyperlink-column.component';\r\nexport * from './lib/internal-components/icon-column/icon-column.component';\r\nexport * from './lib/internal-components/image-column/image-column.component';\r\nexport * from './lib/internal-components/standard-column/standard-column.component';\r\nexport * from './lib/internal-components/navigate-column/navigate-column.component';\r\nexport * from './lib/internal-components/goto-page/goto-page.component';\r\nexport * from './lib/eqp-table.module';\r\nexport * from './lib/helpers/columnPipe.helper';\r\nexport * from './lib/helpers/columnValue.helper';\r\nexport * from './lib/helpers/columnAccessibility.helper';\r\nexport * from './lib/helpers/columnStyle.helper';\r\nexport * from './lib/helpers/enum.helper';\r\nexport * from './lib/helpers/searchFilter.helper';\r\nexport * from './lib/helpers/sorting.helper';\r\nexport * from './lib/helpers/translateTable.helper';\r\nexport * from './lib/helpers/paginator-intl.helper';\r\nexport * from './lib/helpers/resize.helper';\r\nexport * from './lib/directives/mat-table-exporter.directive';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.TranslateTableHelper","i2","i3","i4","i5","i6","i1.EnumHelper","i1.ColumnAccessibilityHelper","i1.ColumnValueHelper","i2.TranslateTableHelper","i3.ColumnStyleHelper","i7","i2.ColumnStyleHelper","i3.ColumnAccessibilityHelper","i4.ColumnPipeHelper","i1","SPLIT_CHARACTERS","i5.ColumnValueHelper","i6.ColumnStyleHelper","i7.ColumnAccessibilityHelper","i8.ColumnPipeHelper","i9.SearchFilterHelper","i10.SortingHelper","i11.ResizeHelper","i12","i17","i18","i19","i23"],"mappings":"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"}