@esfaenza/es-table 20.3.23 → 20.3.25

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"esfaenza-es-table.mjs","sources":["../../../projects/es-table/src/lib/components/pager/table_pager.component.loc.ts","../../../projects/es-table/src/lib/components/pager/table_pager.component.ts","../../../projects/es-table/src/lib/components/pager/table_pager.component.html","../../../projects/es-table/src/lib/domain/externals/appsearch/AppSearch.ts","../../../projects/es-table/src/lib/domain/internals/PagerInfos.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/ItemsSelection.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupFilter.ts","../../../projects/es-table/src/lib/domain/externals/EsTableModelChange.ts","../../../projects/es-table/src/lib/directives/es_td.directive.ts","../../../projects/es-table/src/lib/directives/es_th.directive.ts","../../../projects/es-table/src/lib/directives/es_td_editor.directive.ts","../../../projects/es-table/src/lib/directives/es_th_td_provider.directive.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.loc.ts","../../../projects/es-table/src/lib/tokens.ts","../../../projects/es-table/src/lib/core/handlers/ExportHandler.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/AppOrdering.ts","../../../projects/es-table/src/lib/domain/internals/EsTableColumn.ts","../../../projects/es-table/src/lib/core/handlers/ColumnMetadataHandler.ts","../../../projects/es-table/src/lib/domain/externals/EsTableColumnsDefinition.ts","../../../projects/es-table/src/lib/core/handlers/DynamicModeHandler.ts","../../../projects/es-table/src/lib/core/handlers/HierarchyModeHandler.ts","../../../projects/es-table/src/lib/core/handlers/ItemsHandler.ts","../../../projects/es-table/src/lib/core/handlers/ReportModeHandler.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/Group.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupAggregation.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupOrAggregation.ts","../../../projects/es-table/src/lib/domain/internals/GroupPager.ts","../../../projects/es-table/src/lib/domain/internals/GroupRouteFragment.ts","../../../projects/es-table/src/lib/core/handlers/RowGroupingHandler.ts","../../../projects/es-table/src/lib/domain/internals/CacheTriptic.ts","../../../projects/es-table/src/lib/core/handlers/SelectionHandler.ts","../../../projects/es-table/src/lib/core/handlers/UtilitiesHandler.ts","../../../projects/es-table/src/lib/core/CopyPasteDetector.ts","../../../projects/es-table/src/lib/core/Logger.ts","../../../projects/es-table/src/lib/components/es-th/es_th.component.ts","../../../projects/es-table/src/lib/components/es-th/es_th.component.html","../../../projects/es-table/src/lib/components/es-td/es_td.component.ts","../../../projects/es-table/src/lib/components/es-td/es_td.component.html","../../../projects/es-table/src/lib/components/pipes/est-format.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-lookup.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-routerlink.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-renderer.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est_editor.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-propinsensitive.pipe.ts","../../../projects/es-table/src/lib/domain/configuration/EsTableDefaultable.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.html","../../../projects/es-table/src/lib/domain/configuration/EsTableModuleConfig.ts","../../../projects/es-table/src/lib/v2/pipes/format.pipe.ts","../../../projects/es-table/src/lib/v2/pipes/lookup.pipe.ts","../../../projects/es-table/src/lib/v2/tokens2.ts","../../../projects/es-table/src/lib/v2/core/row-grouping.ts","../../../projects/es-table/src/lib/v2/core/hierarchy.ts","../../../projects/es-table/src/lib/v2/core/coercion.ts","../../../projects/es-table/src/lib/v2/core/header-groups.ts","../../../projects/es-table/src/lib/v2/core/column-model.ts","../../../projects/es-table/src/lib/v2/core/columns.ts","../../../projects/es-table/src/lib/v2/controllers/export.controller.ts","../../../projects/es-table/src/lib/v2/es-table2-pager.component.ts","../../../projects/es-table/src/lib/v2/es-table2.component.ts","../../../projects/es-table/src/lib/v2/es-table2.component.html","../../../projects/es-table/src/lib/es-table.module.ts","../../../projects/es-table/src/lib/domain/externals/CornerMenuOption.ts","../../../projects/es-table/src/lib/domain/externals/EsTableOperationDefinition.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GenericItem.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/EsTableMultiValue.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportColumn.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportParam.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportRow.ts","../../../projects/es-table/src/lib/domain/externals/ItemPropEditableReference.ts","../../../projects/es-table/src/esfaenza-es-table.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/** Classe di localizzazione per il componente **EsTablePagerComponent** */\r\n@Injectable()\r\nexport class TablePagerLoc extends LocalizationService {\r\n\r\n /** @ignore */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"en->it\", \"All\", [\"Tutto\"]);\r\n super.set(\"en->it\", \"Shown Elements\", [\"Elementi visualizzati\"]);\r\n super.set(\"en->it\", \"Shown Groups\", [\"Gruppi visualizzati\"]);\r\n super.set(\"en->it\", \"Are you sure you want to retrieve all results?\", [\"Si è sicuri di voler caricare tutti i risultati?\"]);\r\n super.set(\"en->it\", \"This might slow down the page and possibly crash the entire application\", [\"L'operazione potrebbe rallentare la pagina fino al crash dell'applicazione\"]);\r\n }\r\n}","// Angular\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, input, Output, ViewEncapsulation } from \"@angular/core\";\r\nimport { signal, computed, Signal, effect, WritableSignal } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { TablePagerLoc } from \"./table_pager.component.loc\";\r\n\r\n/** Componente che si occupa della paginazione di una tabella */\r\n@Component({\r\n selector: \"es-paging\",\r\n viewProviders: [{ provide: LocalizationService, useClass: TablePagerLoc }],\r\n styleUrls: ['./table_pager.component.scss'],\r\n templateUrl: \"./table_pager.component.html\",\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EsTablePagerComponent {\r\n\r\n /** Dimensione di pagina attuale */\r\n CurrentPageSize = input<number|null>(null);\r\n /** View gestita, che può essere un IAppSearch o una ReportView */\r\n View = input<any>();\r\n /** Indica se deve mostrare un warning quando si cercano di solezionare come elementi da visualizzare \"Tutti\" */\r\n WarnOnAll = input<boolean>(true);\r\n /** Indica se dare la possibilità o meno di selezionare \"Tutti\" nelle opzioni di paginazione */\r\n AllSearch = input<boolean | null>(true);\r\n /** Placeholder che identifica il \"Tutti\" */\r\n DefaultAll = input<number>(999999);\r\n /** Indica se attivare la modalità gruppo con stili più snelli per apparire sotto ai raggruppamenti */\r\n GroupMode = input<boolean>(false);\r\n /** Indica se utilizzare il conteggio dei gruppi o degli oggetti */\r\n GroupCount = input<boolean>(false);\r\n /** Indica il testo che va a sostituire \"Oggetti Visualizzati\" in caso si stia facendo qualcosa di custom, Ignorato in caso di gruppi */\r\n CountLabel = input<string | null>(null);\r\n /** Indica se visualizzare il numero totale di oggeti presenti */\r\n ShowCount = input<boolean>(true);\r\n /** Indica se visualizzare il numero totale di oggeti presenti */\r\n ShowPaging = input<boolean>(true);\r\n /** Indica il numero totale di oggeti presenti */\r\n PagerCount = input<number|undefined>(undefined);\r\n /** Indica se mostrare o meno il contenuto @deprecated usata solo da MatrixValuesComponent nella lib relativa */\r\n Hidden = input<boolean>(false);\r\n\r\n /** Output invocato quando il numero di elementi per pagina viene modificato da un click utente */\r\n @Output() pagingSelected = new EventEmitter<number>();\r\n\r\n /** @ignore */\r\n constructor(private msgExts: MessageService, public lc: LocalizationService, public cdr: ChangeDetectorRef) {\r\n effect(() => {\r\n let vv = this.View();\r\n let newModel = vv ? (vv.itemsperpageoverride || 15) : this.CurrentPageSize();\r\n this.Model.set(newModel);\r\n });\r\n }\r\n\r\n /** Modello su cui la select effettua operazioni di selezione */\r\n public Model: WritableSignal<number|null> = signal(null);\r\n\r\n /** Opzioni di paginazione */\r\n private _pagingOptions: number[] = [10, 15, 30, 45, 100];\r\n\r\n public PagingOptionsForSelect: Signal<{ id: number, description: string }[]> = computed(() => {\r\n let defAllValue = this.DefaultAll();\r\n let availableOptions = this._pagingOptions.filter(pOpt => pOpt == defAllValue || (this.PagerCount() || 0) >= pOpt || this.PagerCount() == -1);\r\n if (this.AllSearch())\r\n availableOptions.push(defAllValue);\r\n\r\n return availableOptions.map(p => { return { description: p == defAllValue ? this.lc.loc(\"All\") : p.toString(), id: p } });\r\n });\r\n\r\n /**\r\n * Funzione richiamata dal template quando un utente clicca su un numero di paginazione.\r\n * \r\n * Cliccare 2 volte sullo stesso numero causa comunque un refresh dei dati\r\n * \r\n * @param {number} pageSize Dimensione selezionata lato UI\r\n */\r\n public choice(pageSize: number) {\r\n let prevModel = this.Model();\r\n if (pageSize == this.DefaultAll() && this.WarnOnAll()) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Are you sure you want to retrieve all results?\"),\r\n this.lc.loc(\"This might slow down the page and possibly crash the entire application\"),\r\n () => {\r\n this.pagingSelected.emit(pageSize);\r\n this.Model.set(pageSize);\r\n }, () => {\r\n // NG19, serve un extra refresh\r\n this.Model.set(pageSize);\r\n requestAnimationFrame(() => {\r\n this.Model.set(prevModel);\r\n });\r\n });\r\n }\r\n else {\r\n this.pagingSelected.emit(pageSize);\r\n this.Model.set(pageSize);\r\n }\r\n }\r\n}","@if (!Hidden()) {\n <div [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}:&nbsp;</span>\n @if (ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)) {\n <p-select\n style=\"width: 95px\"\n size=\"small\"\n name=\"input\"\n appendTo=\"body\"\n [options]=\"PagingOptionsForSelect()\"\n optionLabel=\"description\"\n optionValue=\"id\"\n [ngModel]=\"Model()\"\n (ngModelChange)=\"choice($event)\"\n />\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">&nbsp;/&nbsp;</span>\n }\n }\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\n }\n </div>\n }","import { AppOrdering } from './AppOrdering';\r\nimport { ItemsSelection } from './ItemsSelection';\r\nimport { Group } from './Group';\r\nimport { GroupFilter } from './GroupFilter';\r\nimport { GroupOrAggregation } from './GroupOrAggregation';\r\nimport { ReportParam } from '../report/ReportParam';\r\nimport { ReportColumn } from '../report/ReportColumn';\r\n\r\n/**\r\n * Classe che identifica una ricerca paginata in tutte le sue sfumature (di grigio)\r\n */\r\nexport class AppSearch<T> {\r\n\r\n /**\r\n * Costruttore che genera un'istanza coi valori di default e impostando **firstsearch** a **true**\r\n */\r\n constructor() {\r\n this.itemsperpageoverride = 15;\r\n this.items = [];\r\n this.orders = [];\r\n this.columns = [];\r\n this.column_ordering = [];\r\n this.savedstate = false;\r\n this.searchinprogress = false;\r\n this.firstsearch = true;\r\n }\r\n\r\n /** ID della ricerca, sempre inutile a meno che non sia la ricerca dei risultati di un report */\r\n public searchid: string;\r\n /** Descrizione della ricerca, sempre inutile a meno che non sia la ricerca dei risultati di un report */\r\n public searchdescription: string;\r\n /** Indica se la paginazione per questa ricerca è disponibile */\r\n public pagingavailable: boolean;\r\n /** Indica il formato di export disponibile per questa ricerca. Utilizzato solo per la ricerca dei risultati di un report */\r\n public expformat: boolean;\r\n /** Parametri di ricerca per i risultati in modalità report */\r\n public pars: ReportParam[];\r\n /** Indicazione delle colonne presenti nel report */\r\n public report_columns: ReportColumn[];\r\n /** Indica se c'è una ricerca in corso */\r\n public searchinprogress: boolean;\r\n /** Indica il numero totale di pagine trovate dalla ricerca. Ogni pagina è una lista di **itemsperpageoverride** oggetti */\r\n public pages: number;\r\n /** Conteggio totale degli oggetti trovati (inclusi quelli in pagine non attualmente selezionate) */\r\n public objectcount: number;\r\n /** Conteggio totale dei gruppi trovati (inclusi quelli in pagine non attualmente selezionate) */\r\n public groupcount: number;\r\n /** Pagina attualmente in visualizzazione */\r\n public page: number;\r\n /** Numero di oggetti da persentare in ogni pagina. Per convenzione si considera valorizzato a 15 se non fornito */\r\n public itemsperpageoverride: number;\r\n /** Lista degli oggetti nella pagina attualmente in visualizzazione */\r\n public items: T[];\r\n /** Dizionario contenente tutti i gruppi paginati */\r\n public groups: Group[];\r\n /** Lista di colonne per cui ordinare */\r\n public orders: AppOrdering[];\r\n /** Lista di colonne da visualizzare */\r\n public columns: string[];\r\n /** Lista di colonne nell'ordine corretto */\r\n public column_ordering: string[];\r\n /** Indica se la ricerca era salvata. Qualora fosse questo il caso, al caricamento l'es-table si occuperà di ri-effettuare la ricerca ed aggiornare il modello */\r\n public savedstate: boolean;\r\n /** Indica se bisogna ancora effettuare la prima ricerca */\r\n public firstsearch: boolean;\r\n /** Indica se sto effettuando la ricerca post bind */\r\n public selfsearch: boolean;\r\n\r\n /**\r\n * Oggetto che indica la selezione corrente. \r\n * \r\n * Se **all** è **true** vuole dire che è tutto selezionato ed eventualmente ci sono delle esclusioni (**exclusions**)\r\n * Se **all** è **false** vuol dire che sono selezionati **item** specifici\r\n * \r\n * In base all'Input **UseSelectionCache** le proprietà **exclusions** e **items** fanno riferimento o alla pagina corrente (se **false**) \r\n * o all'intera ricerca (se **true**)\r\n */\r\n public selection: ItemsSelection<T>;\r\n\r\n /**\r\n * Indica che la ricerca è stata richiesta dall'estable. Questa variabile NON deve essere toccata. È gestita al 100% dall'es-table. \r\n * \r\n * L'unica cosa che serve è che nel modello lato C# sia presente in modo da non perderla durante la serializzazione\r\n */\r\n public internalsearchrequest: boolean;\r\n\r\n /** Raggruppamenti da fare per questa query. Se impostato e non ci sono **filtergroup** mi aspetto di ricevere oggetti nel campo **groups** */\r\n public groupings: GroupOrAggregation[];\r\n\r\n /**\r\n * Filtro da applicare ai gruppi. Qualora il numero di filtri qui fosse uguale al numero di raggruppamenti mi inizio ad apettare di ricevere oggetti\r\n * sul campo **items**, in caso contrario mi aspetto di ricevere o i gruppi nel campo **groups** o l'N-esimo livello dei gruppi\r\n */\r\n public requestedgroups: GroupFilter[];\r\n\r\n /** \r\n * Permette di resettare un AppSearch ai valori di default. \r\n * Reso statico perché fra una deserializzazione e l'altra si potrebbe perdere il prototype del costruttore \r\n * \r\n * @param {AppSearch<T>} aps AppSearch da resettare\r\n */\r\n public static reset<T extends AppSearch<any>>(aps: T) {\r\n aps.pages = 1;\r\n aps.objectcount = 0;\r\n aps.searchinprogress = false;\r\n aps.firstsearch = false;\r\n aps.page = 1;\r\n aps.itemsperpageoverride = 15;\r\n aps.items = [];\r\n aps.orders = [];\r\n aps.columns = [];\r\n aps.column_ordering = [];\r\n aps.savedstate = false;\r\n aps.selfsearch = false;\r\n }\r\n\r\n /** \r\n * Partendo da un appsearch con filtri impostati permette di crearne la stessa versione solo con la ricerca impostata a \"tutto\"\r\n * \r\n * @param {AppSearch<T>} aps AppSearch da cui partire\r\n */\r\n public static toSelectAll<T extends AppSearch<any>>(aps: T): T {\r\n let niu = this.newref(aps, false);\r\n niu.pages = 1;\r\n niu.itemsperpageoverride = 9999999;\r\n return niu;\r\n }\r\n\r\n /** \r\n * Permette di ottenere un nuovo riferimento all'AppSearch passata come parametro.\r\n * Internamente utilizza il JSON.parse(JSON.stringify(X)) con la differenza che prima stacca il riferimento agli items per evitare di \r\n * reserializzare potenzialmente centinaia di elementi. Il riferimento viene poi ricollegato alla nuova appsearch generata\r\n * \r\n * @param {AppSearch<T>} aps AppSearch di cui estrarre un nuovo riferimento equivalente\r\n */\r\n public static newref<T extends AppSearch<any>>(aps: T, retainItems: boolean = true): T {\r\n var items = aps.items;\r\n aps.items = [];\r\n var newref = JSON.parse(JSON.stringify(aps));\r\n if (retainItems)\r\n newref.items = items;\r\n newref.page = 1;\r\n return newref;\r\n }\r\n}","/** Classe che rappresenta le informazioni di paginazione della tabella attuale */\r\n\r\nexport class PagerInfos {\r\n constructor() {\r\n this.PagerCount = null;\r\n this.ShowCount = true;\r\n this.ShowPaging = true;\r\n this.ShowButtons = true;\r\n this.ShowPagingOptions = true;\r\n this.UsesView = true;\r\n this.View = null;\r\n this.Ready = false;\r\n this.Searches = 'items';\r\n }\r\n PagerCount: number;\r\n ShowCount: boolean;\r\n ShowPaging: boolean;\r\n UsesView: boolean;\r\n ShowButtons: boolean;\r\n ShowPagingOptions: boolean;\r\n View: any;\r\n Ready: boolean;\r\n Searches: 'items' | 'groups';\r\n}\r\n","import { Group } from \"./Group\";\r\n\r\n/** Identifica una selezione applicabile agli oggetti presentati in una tabella */\r\nexport class ItemsSelection<T> {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {T[]} selected Oggetti da considerare selezionati\r\n */\r\n constructor(selected: T[]) {\r\n this.count = selected.length;\r\n this.items = selected;\r\n this.all = false;\r\n this.exclusions = [];\r\n this.groups = [];\r\n this.group_exclusions = [];\r\n }\r\n\r\n /** Conteggio degli oggetti selezionati */\r\n public count: number;\r\n /** Se **all** è **false** indica gli elementi da includere, altrimenti è insensato */\r\n public items: T[]\r\n /** Se **all** è **false** indica i gruppi, altrimenti è insensato */\r\n public groups: Group[];\r\n /** Indica se tutti gli elementi sono da considerarsi selezionati (anche quelli di altre pagine) */\r\n public all: boolean = false;\r\n /** Se **all** è **true**, indica gli elementi da escludere, altrimenti è insensato */\r\n public exclusions: T[] = [];\r\n /** Se **all** è **true**, indica i gruppi da escludere, altrimenti è insensato */\r\n public group_exclusions: Group[] = [];\r\n}","/** Classe che rappresenta un filtro su un gruppo */\r\nexport class GroupFilter {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column ID della colonna gruppata per cui si richiede di filtrare\r\n * @param {string} value Valore del gruppo su questa **column** per cui si richiede di filtrare\r\n */\r\n constructor(\r\n public column: string,\r\n public value: string) { }\r\n}\r\n","/** Classe che rappresenta la modifica ad un singolo oggetto in una singola proprietà */\r\n\r\nexport class EsTableModelChange {\r\n /**\r\n * Costruttore\r\n * @param {any} item Oggetto modificato\r\n * @param {string} header Nome dell'Header che è stato modificato\r\n * @param {string} property Nome della proprietà modificata\r\n * @param {string} old_value Vecchio valore della proprietà **property** dell'oggetto **item**\r\n * @param {string} new_value Nuovo valore della proprietà **property** dell'oggetto **item**\r\n */\r\n constructor(\r\n public item: any,\r\n public header: string,\r\n public property: string,\r\n public old_value: string,\r\n public new_value: string) { }\r\n}","import { Directive, Input, Self, TemplateRef } from '@angular/core';\r\n\r\n/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */\r\n@Directive({\r\n selector: '[td]',\r\n standalone: false\r\n})\r\nexport class EsTdDirective {\r\n\r\n /** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsTdComponent */\r\n public _directive = true;\r\n\r\n /** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */\r\n public _multi = false;\r\n\r\n /** Indica se la cella è visibile o meno di default */\r\n @Input() tdVisible = true;\r\n /** Id della colonna, fa riferimento al **th** padre */\r\n @Input() td: string;\r\n\r\n /** Se questo td viene usato come renderer in questa proprietà è scritto il nome della proprietà dell'oggetto bindato per cui fare apparire il **Template** */\r\n @Input() tdForProperty: string;\r\n\r\n /** Equivalente dell'NgIf sul td */\r\n @Input() tdIf: boolean = true;\r\n /** Eventuali classi da applicare al **td** generato */\r\n @Input() tdClass: string;\r\n\r\n /** In mancanza di **Template** indica qual è la proprietà dell'oggetto contenente le informazioni da mostrare */\r\n @Input() tdPropertyAccessor: string\r\n\r\n /** Allineamento dei valori della tabella */\r\n @Input() tdAlignment: \"Center\" | \"Left\" | \"Right\";\r\n\r\n /** Formato da applicare al valore se applicabile, utilizzabile solo se **tdPropertyAccessor** è valorizzato */\r\n @Input() tdFormat: string;\r\n\r\n /** Se il contenuto di questo td dev'essere un'immagine cliccabile, questa è la classe che la identifica */\r\n @Input() tdIconClass: string;\r\n\r\n /** Campo da controllare per fare apparire/sparire il contenuto di questa cella qualora fosse diverso da **tdConditionValue** */\r\n @Input() tdConditionField: string;\r\n\r\n /** Valore che deve assumere **tdConditionField** per mostrare il contenuto di questa cella */\r\n @Input() tdConditionValue: string;\r\n\r\n /** Titolo HTML di questa cella */\r\n @Input() tdTitle: string;\r\n\r\n /** Contenuto statico di questa cella */\r\n @Input() tdContent: string;\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(@Self() public Template: TemplateRef<any>) { }\r\n}\r\n\r\n","import { Directive, Input, Self, TemplateRef } from \"@angular/core\";\r\n\r\nimport { ThAggregation } from \"../domain/internals/ThAggregation\";\r\n\r\nimport { InputType } from \"../domain/types\";\r\n\r\n/** Direttiva per la dichiarazione snella di un EsTh da emettere come header */\r\n@Directive({\r\n selector: '[th]',\r\n standalone: false\r\n})\r\nexport class EsThDirective {\r\n\r\n /** Variabile interna all'interno della quale viene raccolta la cache delle aggregazioni specificate in thAggregation */\r\n public _thAggregations?: ThAggregation[];\r\n\r\n /** Variabile interna contenente in maniera ordinata i template dei padri */\r\n public _thParents?: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[];\r\n\r\n /** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsThComponent */\r\n public _directive = true;\r\n\r\n /** Variabile interna impostata dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */\r\n public _referenced: boolean = false;\r\n\r\n /** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */\r\n public _multi = false;\r\n\r\n /** Variabile interna che indica il contenuto dell'header in caso di multi */\r\n public _multi_content = \"\";\r\n\r\n /** Id della colonna, dev'essere lo stesso per tutti i **td** relativi */\r\n @Input() th: string = \"\";\r\n /** Indica se la colonna è pinnata o no */\r\n @Input() thPinned: boolean = false;\r\n /** Indica se la colonna è pinnabile o no */\r\n @Input() thPinnable: boolean = true;\r\n /** Indica le dimensioni che deve avere questa colonna quando viene pinnata, senza questo tutte le colonne mi collasserebbero l'una sull'altra */\r\n @Input() thPinnedWidth: number = 150;\r\n /** Indicazione sulla visibilità della colonna */\r\n @Input() thVisible: boolean = true;\r\n /** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */\r\n @Input() thFixed: boolean = false;\r\n /** Indica che la colonna è sotto ad un raggruppamento padre, con questo nome nel **th** */\r\n @Input() thParent: string | null = null;\r\n /** Ordinamento attuale della colonna */\r\n @Input() thOrder?: 'DESC' | 'ASC';\r\n /** Indica se questa colonna è ordinabile o meno */\r\n @Input() thOrderable: boolean = true;\r\n /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */\r\n @Input() thWrap: boolean = false;\r\n /** Indica se le dimnsioni di questa colonna sono modificabili o meno */\r\n @Input() thResizable: boolean = false;\r\n /** Classi da applicare all'Header della colonna */\r\n @Input() thClass?: string;\r\n\r\n /** Classi da applicare all'Header della colonna */\r\n @Input() thShrink?: boolean;\r\n\r\n /** Classi da applicare alle righe quando rappresentano un Gruppo */\r\n @Input() thGroupClass?: string;\r\n /** Equivalente dell'NgIf sul th */\r\n @Input() thIf: boolean = true;\r\n /** Campo particolare che indica che questo header è vuoto. Viene utilizzato solo a livello grafico per ignorare o meno l'emit del template */\r\n @Input() thEmpty: boolean = false;\r\n /** Indica che bisogna fare un raggruppamento su questa colonna */\r\n @Input() thGroup: boolean = false;\r\n /** Indica che bisogna fare una aggregazione su questa colonna, a fronte di almeno un altra con un raggruppamento */\r\n @Input() thAggregation: string | null = null;\r\n\r\n /** Proprietà JS a cui si riferisce questa cella */\r\n @Input() thProperty: string| null = null;\r\n\r\n /** Tipo della proprietà JS a cui si riferisce questa cella. Se valorizzato l'utente la potrà modificare facendo doppio click */\r\n @Input() thType: InputType | string| null = null;\r\n\r\n /** Sorgente dei valori disponibili per questa cella se il **Type** è di tipo 'enum' */\r\n @Input() thSource: { id: string, description: string }[]| null = null;\r\n\r\n /** Indica che questo header deve essere emesso una volta per ogni valore presente nella lista di **EsTableMultiValue** alla proprietà **th** dell'oggetto corrente */\r\n @Input() thMulti?: boolean;\r\n\r\n /** Indica un contenuto statico da mostrare piuttosto che utilizzare il **Template**. Serve in caso questo oggetto venga generato programmaticamente */\r\n @Input() thStaticContent: string| null = null;\r\n\r\n /** Colore del background della cella */\r\n @Input() thBackgroundColor?: string;\r\n\r\n /** Allineamento dei valori della tabella */\r\n @Input() thAlignment?: \"Center\" | \"Left\" | \"Right\";\r\n\r\n /** Formato da applicare al valore se applicabile */\r\n @Input() thFormat?: string;\r\n\r\n /** Nome dell'editor da utilizzare per la modifica di questo campo, ordine di priorità:\r\n * \r\n * 1. Editor con nome **thEditorName**\r\n * \r\n * 2. Editor riferito alla proprietà **thProperty**\r\n * \r\n * 3. Editor di default per **thType**\r\n */\r\n @Input() thEditorName?: string;\r\n\r\n /** Opzioni da applicare all'editor di questa colonna */\r\n @Input() thEditorOptions: { [id : string]: any } = {}\r\n\r\n /** Nome del renderer da utilizzare per visualizzare questo campo. Utilizzato solo per le tabelle dinamiche */\r\n @Input() thRendererName?: string;\r\n\r\n /** Route di navigazione. Es. \"['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]\" */\r\n @Input() thRoutePath?: string;\r\n\r\n /**\r\n * Proprietà da bindare a **routePath** per generare la route completa. \r\n * \r\n * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. [\"idItem\", \"idItem2\"]\r\n */\r\n @Input() thRouteParameterProperties?: string[];\r\n\r\n /** @ignore */\r\n constructor(@Self() public Template: TemplateRef<any> | null) { }\r\n}","import { Directive, Input, Optional, Self, TemplateRef } from '@angular/core';\r\n\r\n/** Direttiva che rappresenta il template dell'editor di una cella all'interno della tabella */\r\n@Directive({\r\n selector: '[editor]',\r\n standalone: false\r\n})\r\nexport class EsTdEditorDirective {\r\n\r\n /** Id dell'Editor */\r\n @Input() editor?: string;\r\n \r\n /** In questa proprietà è scritto il nome della proprietà dell'oggetto bindato per cui fare apparire il **Template** */\r\n @Input() editorForProperty?: string;\r\n\r\n /** @ignore */\r\n constructor(@Self() @Optional() public Template: TemplateRef<any>) { }\r\n}\r\n","import { ContentChildren, Directive, QueryList } from '@angular/core';\r\nimport { EsTdDirective } from './es_td.directive';\r\nimport { EsThDirective } from './es_th.directive';\r\nimport { ReplaySubject } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[td_th_provider]', exportAs: \"tdThProvider\",\r\n standalone: false\r\n})\r\nexport class ThTdProvider {\r\n @ContentChildren(EsTdDirective) EsTdsDirective: QueryList<EsTdDirective>;\r\n @ContentChildren(EsThDirective) EsThsDirective: QueryList<EsThDirective>;\r\n\r\n public LoadedSignal: ReplaySubject<void> = new ReplaySubject<void>();\r\n\r\n public setLoaded() {\r\n requestAnimationFrame(() => {\r\n this.LoadedSignal.next();\r\n this.LoadedSignal.complete();\r\n })\r\n }\r\n\r\n async asyncLoad(){\r\n\r\n }\r\n\r\n async ngOnInit(){\r\n await this.asyncLoad();\r\n this.setLoaded();\r\n }\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/** Classe di localizzazione per il componente **EsTableComponent** */\r\n@Injectable()\r\nexport class EsTableLoc extends LocalizationService {\r\n\r\n /** @ignore */\r\n constructor(injector: Injector) { \r\n super(injector);\r\n \r\n super.set(\"en->it\", \"All the\", [\"Tutti gli\"]);\r\n super.set(\"en->it\", \"All\", [\"Tutto\"]);\r\n super.set(\"en->it\", \"Groups\", [\"Gruppi\"]);\r\n super.set(\"en->it\", \"Cannot export an empty dataset\", [\"Impossibile esportare un dataset vuoto\"]);\r\n super.set(\"en->it\", \"Performing Table bootstrap\", [\"Sto caricando la Tabella\"]);\r\n super.set(\"en->it\", \"Update every\", [\"Aggiorna ogni\"]);\r\n super.set(\"en->it\", \"second/s\", [\"secondo/i\"]);\r\n super.set(\"en->it\", \"Export View\", [\"Esporta Vista\"]);\r\n super.set(\"en->it\", \"Column Name\", [\"Nome Colonna\"]);\r\n super.set(\"en->it\", \"Columns Order\", [\"Ordine Colonne\"]);\r\n super.set(\"en->it\", \"Columns Visibility\", [\"Visibilità Colonne\"]);\r\n super.set(\"en->it\", \"There are no columns configured to be hidden/shown in this view\", [\"Non ci sono colonne configurate per essere visualizzate/nascoste in questa vista dati\"]);\r\n super.set(\"en->it\", \"Columns Visibility and Order\", [\"Visibilità e Ordine Colonne\"]);\r\n super.set(\"en->it\", \"Objects Selected\", [\"Oggetti Selezionati\"]);\r\n super.set(\"en->it\", \"Object Selected\", [\"Oggetto Selezionato\"]);\r\n super.set(\"en->it\", \"Select Everything\", [\"Seleziona Tutto\"]);\r\n super.set(\"en->it\", \"Reset Selection\", [\"Resetta Selezione\"]);\r\n super.set(\"en->it\", \"No operations available\", [\"Nessuna operazione disponibile\"]);\r\n super.set(\"en->it\", \"Close\", [\"Chiudi\"]);\r\n super.set(\"en->it\", \"Confirm\", [\"Conferma\"]);\r\n super.set(\"en->it\", \"Values copied in the clipboard\", [\"Valori copiati nella clipboard\"]);\r\n super.set(\"en->it\", \"Size of copied data is different from the size of the selection\", [\"La dimensione dei dati copiati differisce dalla dimensione della selezione\"]);\r\n super.set(\"en->it\", \"Data for this table cannot be edited\", [\"I dati di questa tabella non possono essere modificati\"]);\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { EsTableDefaultable } from './domain/configuration/EsTableDefaultable';\r\n\r\n/** Token che indica se emettere log a console o meno */\r\nexport const EST_DEBUG: InjectionToken<string> = new InjectionToken<string>('EST_DEBUG');\r\n\r\n/** Token che indica l'espressione ACL da utilizzare (if any) per consentire le operazioni di esportazione */\r\nexport const EST_EXPORT_GLOBAL_ACL: InjectionToken<string> = new InjectionToken<string>('EST_EXPORT_GLOBAL_ACL');\r\n\r\n/** Token che indica i default da assegnare agli Input */\r\nexport const EST_DEFAULTS: InjectionToken<EsTableDefaultable> = new InjectionToken<EsTableDefaultable>('EST_DEFAULTS');","// Angular\r\nimport { Type } from \"@angular/core\";\r\n\r\n// Librerie\r\nimport { CsvHeaders, DateService, ExportService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n\r\n/** Classe contenente la gestione delle importazioni */\r\nexport class ExportHandler {\r\n\r\n private exportInProgress: boolean = false;\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent, private expExts: ExportService, private msgExts: MessageService, private utiExts: UtilityService, private dateExts: DateService) { }\r\n\r\n /**\r\n * Effettua l'esportazione dei dati\r\n *\r\n * @param {string} format Formato di esportazione. Letto solo in modalità Report della tabella\r\n */\r\n public tryExport(format?: 'CSV' | 'XLSX') {\r\n if (!this.est.ExportFunction)\r\n return;\r\n\r\n if (this.exportInProgress) {\r\n this.msgExts.simpleError(\"Un'esportazione è già in corso, si prega di attendere\");\r\n return;\r\n }\r\n\r\n this.exportInProgress = true;\r\n this.est.ExportFunction(async (data: any[], type: Type<any>, cancel: boolean = false) => {\r\n\r\n this.exportInProgress = false;\r\n if (cancel)\r\n return;\r\n \r\n if (data.length == 0) {\r\n this.msgExts.simpleWarning(this.est.lc.loc(\"Cannot export an empty dataset\"));\r\n return;\r\n }\r\n\r\n let drcd = this.est.DynamicRowColumnsDefinition();\r\n let columnsFilter = this.est.ExportOnlyVisibleColumns() ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;\r\n let csvHeadersOverride = drcd && drcd.length > 0 ? drcd.map(t => { return <CsvHeaders>{ label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' }; }) : null;\r\n\r\n this.expExts.export(data, format, this.est.ExportFileName(), type, columnsFilter, csvHeadersOverride);\r\n }, format);\r\n }\r\n}","/**\r\n * Classe che identifica un ordinamento di una colonna\r\n */\r\nexport class AppOrdering {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id ID della colonna a cui si vogliono applicare ordinamenti, deve combaciare all'id messo nella dichiarazione dell'ES-TD/TH\r\n * @param {'DESC' | 'ASC' } order Ordinamento da applicare alla colonna, Discendente/Ascendente, default 'null' per indicare assenza di ordine\r\n */\r\n constructor(public id: string, public order?: 'DESC' | 'ASC') { }\r\n}","import { TemplateRef } from \"@angular/core\";\r\n\r\n/** Definizione di una colonna, utilizzato nella dialog che permette di modificare le posizioni e le visibilità */\r\nexport class EsTableColumn {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Id colonna\r\n * @param {string} description Descrizione (Header)\r\n * @param {boolean} visible Indica se di default mostrarla o meno\r\n * @param {boolean} fixed Indica se è una colonna fixed\r\n * @param {boolean} pinnable Indica se una colonna può essere pinnata\r\n * @param {boolean} pinned Indica se è una colonna pinnata\r\n * @param {number} pinnedWidth Indica la dimensione da assegnare a questa colonna quando è pinnata\r\n * @param {TemplateRef<any>} template Indica il template da usare per mostrare il testo dell'Header\r\n * @param {{ id: string, tmpl: TemplateRef<any>, content: string }[]} parentTemplates Indica la lista di template padri collegata a questo header, rappresentati come Template o come stringa qualora fosse generato automaticamente (caso **Multi**)\r\n * @param {boolean} multi Indica che la colonna deriva da una direttiva **Multi**\r\n * @param {string} multiContent Indica il contenuto della direttiva **Multi** per questa colonna\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string | null,\r\n public visible?: boolean,\r\n public fixed?: boolean,\r\n public pinned?: boolean,\r\n public pinnable?: boolean,\r\n public pinnedWidth?: number,\r\n public template?: TemplateRef<any> | null, \r\n public parentTemplates?: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[],\r\n public multi?: boolean,\r\n public multiContent?: string) { }\r\n\r\n /** Indice precedente in cui si trovava questa colonna in modo da poterla spinnare in maniera super sexy */\r\n public prev_index?: number;\r\n}\r\n","// Angular\r\nimport { CdkDrag, CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\r\nimport { TemplateRef, WritableSignal } from \"@angular/core\";\r\n\r\n// Libs\r\nimport { UtilityService } from \"@esfaenza/extensions\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Handlers\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\nimport { RowGroupingHandler } from \"./RowGroupingHandler\";\r\n\r\n// Modelli\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { EsTableColumn } from \"../../domain/internals/EsTableColumn\";\r\nimport { EsTableMultiValue } from \"../../domain/externals/appsearch/EsTableMultiValue\";\r\nimport { ThGroup } from \"../../domain/internals/ThGroup\";\r\nimport { ThElement } from \"../../domain/internals/ThElement\";\r\nimport { TdElement } from \"../../domain/internals/TdElement\";\r\n\r\n/** Classe che gestisce tutte le informaizoni relative alle colonne: visibilità, posizione, stato di pin/unpin, ecc ecc... */\r\nexport class ColumnMetadataHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler, private utiExts: UtilityService, private prefService: PreferencesService, private rgH: RowGroupingHandler) { }\r\n\r\n /**\r\n * Metodo che gestisce il cambio di Ordinamento di una colonna\r\n *\r\n * @param {string} id ID della colonna il cui oridnamento è cambiato\r\n * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna\r\n */\r\n public handleTHOrderChange(id: string, order: 'DESC' | 'ASC' | undefined) {\r\n let orders = this.est.viewMode() ? (this.est.View as AppSearch<any>).orders : this.est.arrayOrders;\r\n let orderToAdd = true;\r\n let orderToRemove: number | null = null;\r\n\r\n // Se per qualche motivo il costruttore non è passato (cache tarpate o simila) fixo\r\n if (!orders && this.est.viewMode())\r\n (this.est.View as AppSearch<any>).orders = [];\r\n else if (!orders && this.est.arrayMode())\r\n this.est.arrayOrders = [];\r\n\r\n for (let i = 0; i < orders.length; i++) {\r\n let t = orders[i];\r\n if (t.id == id) {\r\n if (order) {\r\n t.order = order;\r\n orderToAdd = false;\r\n }\r\n else\r\n orderToRemove = i;\r\n }\r\n }\r\n\r\n if (orderToRemove != null) {\r\n orders.splice(orderToRemove, 1);\r\n }\r\n else if (orderToAdd) {\r\n if (this.est.MultipleOrderingDirectives())\r\n orders.push(new AppOrdering(id, order));\r\n else {\r\n if (this.est.viewMode())\r\n (this.est.View as AppSearch<any>).orders = [new AppOrdering(id, order)];\r\n else if (this.est.arrayMode())\r\n this.est.arrayOrders = [new AppOrdering(id, order)];\r\n }\r\n }\r\n\r\n //Salvo le preferences di questa view\r\n //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI\r\n if (this.est.SavePreferences()) {\r\n let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View as AppSearch<any>) : null;\r\n this.registerViewPreferences(castedView);\r\n }\r\n\r\n this.est.onOrderChanged.emit({ id, order });\r\n\r\n if (this.est.viewMode()) {\r\n if (this.est.groupSearchRequestsCache.length > 0)\r\n this.rgH.emitRowGroupingSearches(id, orders);\r\n else\r\n this.est.emitSearchRequest(false);\r\n }\r\n else if (this.est.arrayMode())\r\n this.est.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Registra le preference relative alla view passata come parametro\r\n * \r\n * @param {any} castedView View di cui salvare colonne e ordinamento colonne\r\n */\r\n public registerViewPreferences(castedView: AppSearch<any> | null) {\r\n if (!this.est.ngControl.name) {\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per la tabella\");\r\n return false;\r\n }\r\n\r\n if (!this.prefService) {\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n return false;\r\n }\r\n\r\n let arrMode = this.est.arrayMode();\r\n let columns = arrMode ? this.est.arrayColumns : (castedView?.columns || []);\r\n let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : (castedView?.column_ordering || []);\r\n let columnOrders = arrMode ? [] : (castedView?.orders || []);\r\n var toStore = {\r\n columns: this.utiExts.deepClone(columns) as string[],\r\n column_ordering: this.utiExts.deepClone(columnsOrderings) as string[],\r\n orders: this.utiExts.deepClone(columnOrders) as string[]\r\n };\r\n this.prefService.setItem(<string>this.est.ngControl.name, toStore).subscribe();\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsThs** estrappolo la lista di **EsTableColumn** che questa tabella dovrà eventualmente gestire per Visibilità e Ordine\r\n *\r\n * Costo: 1 scan EsThs\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n public reviewColumnsList(ths: EsThDirective[]) {\r\n this.est.TMPColumnsList = [];\r\n if (ths.length == 0)\r\n return;\r\n\r\n // Appena il contentChildren è valorizzato scorro tutti gli header\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n let column = th.th;\r\n // Se non ho un id il th è considerato inerte\r\n if (!column)\r\n continue;\r\n\r\n // Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere\r\n // Di default la visibilità è quella impostata nel componente\r\n if ((this.est.HiddenColumns() || th.thVisible) && th.thIf) {\r\n let previouslyPinned = !this.est.ColumnsList || this.est.ColumnsList.length == 0 ? null : this.est.ColumnsList.find(t => t.id == column) || null;\r\n let toAdd = new EsTableColumn(column, th.thStaticContent, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnable, th.thPinnedWidth, th.Template, th._thParents, th._multi, th._multi_content);\r\n if (previouslyPinned)\r\n toAdd.prev_index = previouslyPinned.prev_index;\r\n this.est.TMPColumnsList.push(toAdd);\r\n }\r\n }\r\n this.est.ColumnsList = [];\r\n this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });\r\n }\r\n\r\n /** In caso siano configurati dei th \"Multi\" (vedere la descrizione del campo **thMulti** di **EsThDirective**) questo metodo li \"srotola\" in tutti i th/td che devono effettivamente diventare */\r\n public expandMultiThsAndTds(ths: EsThDirective[], tds: EsTdDirective[], items: any[]): {expThs: EsThDirective[], expTds: EsTdDirective[]} {\r\n\r\n // Registro le info sui multiprovider\r\n let multiDefs: { [id: string]: { On?: string, thref: EsThDirective, tdref: EsTdDirective | null, thgen: { [id: string]: EsThDirective }, tdgen: { [id: string]: EsTdDirective } } } = { };\r\n \r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n if (!th.thMulti)\r\n continue;\r\n\r\n multiDefs[th.th] = { On: th.th, tdref: null, thref: th, thgen: {}, tdgen: {} };\r\n }\r\n\r\n // Assegno le info anche ai td\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n td._multi = !!multiDefs[td.td];\r\n if(td._multi)\r\n multiDefs[td.td].tdref = td;\r\n }\r\n\r\n // Rimuovo i multitemplate dalle balle\r\n // N.B: Dato che la prima operazione su th e td è questa il riferimento originale viene sovrascritto, questo significa che devo ri-emettere i due nuovi array\r\n ths = ths.filter(t => !t.thMulti);\r\n tds = tds.filter(t => !t._multi);\r\n\r\n let parentThs: { [id: string]: boolean; } = { };\r\n let addedHeaders: { [id: string]: boolean; } = { };\r\n let tdsToAdd: { [id: string] : EsTdDirective} = { };\r\n let thsToAdd: EsThDirective[] = [];\r\n\r\n // Per ogni item vedo se ci sono dei multi per le proprietà che li definiscono\r\n for(let i = 0; i < items.length; i++){\r\n let itm = items[i];\r\n \r\n for (let prop in multiDefs) {\r\n // Se la proprietà del multi esiste nell'oggetto ed ha una lunghezza\r\n if (itm[prop] && itm[prop].length) {\r\n let multiRef = multiDefs[prop];\r\n let reftd = multiRef.tdref!;\r\n let refth = multiRef.thref;\r\n\r\n for (let ii = 0; ii < itm[prop].length; ii++) {\r\n\r\n // Header già aggiunto, non devo inserire altri template di header/colonna\r\n let estmv = <EsTableMultiValue>itm[prop][ii];\r\n if (!estmv._headersHierarchy)\r\n estmv._headersHierarchy = estmv.header_group ? estmv.header_group.split(\">\").map(t => t.trim()) : [];\r\n\r\n let headerValue = estmv.header;\r\n let parent = estmv.header_group || null;\r\n let parentsHier = estmv._headersHierarchy;\r\n\r\n if (addedHeaders[`${parent}_${headerValue}`])\r\n continue;\r\n else\r\n addedHeaders[`${parent}_${headerValue}`] = true;\r\n\r\n // Per ogni valore diverso delle proprietà devo aggiungere un td e un th, quest'ultimo dev'essere eventualmente collegato ad un header\r\n let newtH = new EsThDirective(refth.Template);\r\n newtH._multi = true;\r\n newtH._multi_content = headerValue;\r\n newtH.th = `${prop}_${ii}`;\r\n newtH.thClass = refth.thClass;\r\n newtH.thShrink = refth.thShrink;\r\n newtH.thIf = refth.thIf;\r\n newtH.thVisible = refth.thVisible;\r\n newtH.thWrap = refth.thWrap;\r\n // Il parent è sempre l'ultimo nella gerarchia di padri\r\n newtH.thParent = parentsHier[parentsHier.length - 1];\r\n newtH.thOrderable = false;\r\n\r\n for (let i = 0; i < parentsHier.length; i++) {\r\n let par = parentsHier[i];\r\n if (!parentThs[par])\r\n parentThs[par] = true;\r\n else\r\n continue;\r\n\r\n let thParent = new EsThDirective(null);\r\n thParent.th = par;\r\n thParent._multi_content = par;\r\n thParent.thParent = i > 0 ? parentsHier[i - 1] : null;\r\n thsToAdd.push(thParent);\r\n }\r\n\r\n thsToAdd.push(newtH);\r\n\r\n let newTd = new EsTdDirective(reftd.Template);\r\n newTd._multi = true;\r\n newTd.td = `${prop}_${ii}`;\r\n newTd.tdClass = reftd.tdClass;\r\n newTd.tdIf = reftd.tdIf;\r\n newTd.tdVisible = reftd.tdVisible;\r\n tdsToAdd[newTd.td] = newTd;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Ordino gli header aggiunti in base al Parent, se presente, e li aggiungo alla lista dei th, dopodiché in base allo stesso ordinamento aggiungo i relativi td\r\n let orderedThs = [];\r\n\r\n // Prima metto tutti i th senza parent, poi per ogni parent prendo i th ordinati come li trovo nella lista\r\n for(let i = 0; i < thsToAdd.length; i++){\r\n if(!thsToAdd[i].thParent)\r\n orderedThs.push(thsToAdd[i]);\r\n }\r\n for(let prop in parentThs){\r\n for(let i = 0; i < thsToAdd.length; i++){\r\n let th = thsToAdd[i];\r\n if(th.thParent && th.thParent == prop)\r\n orderedThs.push(th);\r\n }\r\n }\r\n\r\n ths = [...ths, ...thsToAdd];\r\n for (let i = 0; i < thsToAdd.length; i++) {\r\n // Se il th è un header td verrebbe undefined. Lo aggiungo solo se è effettivamente presente\r\n let td = tdsToAdd[thsToAdd[i].th];\r\n if (td)\r\n tds.push(td);\r\n }\r\n\r\n return { expTds: tds, expThs: ths };\r\n }\r\n\r\n /**\r\n * Prende i th e i td in modalità diretive e li ordina in base a se ci sono colonne fixed o meno\r\n */\r\n public moveFixedColumnsAtTheBeginning(ths: EsThDirective[], tds: EsTdDirective[]) {\r\n\r\n let fixeds = 0, pinneds = 0;\r\n let columnsCache: { [index: string]: EsTableColumn; } = {};\r\n let columnsIndexCache: { [index: string]: number; } = {};\r\n\r\n // Creo la cache delle colonne\r\n for (let coli = 0; coli < this.est.ColumnsList.length; coli++) {\r\n let col = this.est.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n\r\n // Anche per le columnslist sposto le pinnate o le fixed all'inizio\r\n if (col.pinned) {\r\n if (coli != pinneds)\r\n this.utilities.arrayMove(this.est.ColumnsList, coli, pinneds);\r\n pinneds++;\r\n }\r\n\r\n // Se una colonna è sia pinnata che fixata la considero unicamente pinnata\r\n if (col.fixed && !col.pinned) {\r\n if (coli != pinneds + fixeds)\r\n this.utilities.arrayMove(ths, coli, pinneds + fixeds);\r\n fixeds++;\r\n }\r\n }\r\n\r\n pinneds = fixeds = 0;\r\n\r\n // Sposto tutti gli header fixed o pinned all'inizio\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n // Riassegno sempre per ripulire valori di partenza o per aggiornarli in caso di modifiche utente\r\n th.thPinned = !!((!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned));\r\n if (th.thPinned) {\r\n if (i != pinneds)\r\n this.utilities.arrayMove(ths, i, pinneds);\r\n pinneds++;\r\n }\r\n\r\n //In questo caso sono informazioni statiche invece, non modificabili dall'utente, quindi non mi dò preoccupazioni\r\n if ((th.thFixed || th.thGroup) && !th.thPinned) {\r\n if (i != pinneds + fixeds)\r\n this.utilities.arrayMove(ths, i, pinneds + fixeds);\r\n fixeds++;\r\n }\r\n }\r\n\r\n // Cache degli indici per riposizionare i td come i th\r\n for (let i = 0; i < ths.length; i++)\r\n columnsIndexCache[(<EsThDirective>ths[i]).th] = i;\r\n\r\n // Riordino le celle per fargli mantenere la stessa struttura dei th\r\n let newTds = new Array(ths.length);\r\n\r\n for (let i = 0; i < tds.length; i++) {\r\n let item = tds[i] as EsTdDirective;\r\n newTds[columnsIndexCache[item.td]] = item;\r\n }\r\n\r\n this.est.HasPinnedColumns.set(pinneds > 0);\r\n }\r\n\r\n /** In base alla configurazione delle colonne calcola le dimenioni delle colonne pinnate */\r\n public evaluatePinnedColumnsWidth() {\r\n if (!this.est.HasPinnedColumns())\r\n return;\r\n\r\n let pcw = 0;\r\n for (let i = 0; i < this.est.ColumnsList.length; i++) {\r\n let col = this.est.ColumnsList[i];\r\n if (col.pinned && col.visible)\r\n pcw += col.pinnedWidth || 0;\r\n }\r\n pcw += this.est.Selection() ? 25 : 0;\r\n\r\n this.est.PinnedContainerWidth.set(pcw);\r\n }\r\n\r\n /**\r\n * Terminato il binding delle colonne da **reviewColumnsList** e della **View** dal **writeValue** questo metodo si occupa\r\n * dell'allineamento delle informazioni fra le colonne calcolate internamente e le informazioni sulle colonne che arrivano dall'AppSearch\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public alignColumnsIfLoadedView(view: AppSearch<any>) {\r\n let emitChanged = this.est.viewMode() && view.savedstate;\r\n let newColset: string[] = [];\r\n\r\n if (!this.est.ColumnsList || this.est.ColumnsList.length == 0)\r\n return;\r\n\r\n let columns = [];\r\n\r\n // Modlaità view ->\r\n if (this.est.viewMode()) {\r\n // colonne dinamiche -> prendo l'insieme delle colonne e operazioni dinamiche definite\r\n // standard -> prendo le colonne della view\r\n if (this.est.DynamicRowColumnsDefinition())\r\n columns = [...(this.est.DynamicRowColumnsDefinition()?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations()?.map(t => t.id) || [])];\r\n else\r\n columns = view.columns;\r\n }\r\n // Modalità array -> prendo le colonne array\r\n else\r\n columns = this.est.arrayColumns\r\n\r\n this.est.ColumnsList.forEach(c => {\r\n // Se la colonna è pinnata mi arriva col simoleon, ma anche se è una composizione di più colonne\r\n let exCl = columns.filter(cc => (cc.startsWith('§') ? cc.substring(1) : cc) == c.id);\r\n\r\n // Se la colonna è pinnata aggiorno l'informazione nella view\r\n if (exCl.length == 1)\r\n c.pinned = exCl[0].startsWith('§');\r\n\r\n // Se l'appsearch viene da uno stato precedente, uso le informazioni sulle colonne che ha dentro, altrimenti sovrascrivo tutto **\r\n if (c.visible && columns.length == 0)\r\n newColset.push(c.id);\r\n\r\n // Se ho una colonna lato AppSearch e nella ColumnList non è visibile, allineo all'AppSearch\r\n else if (exCl.length == 1 && !c.visible && !this.est.useLocalVisibility)\r\n c.visible = true;\r\n\r\n // Allineamento sull'AppSearch per casistiche inverse al di sopra\r\n else if (exCl.length == 0 && c.visible && !this.est.useLocalVisibility)\r\n c.visible = false;\r\n });\r\n\r\n // Non ho colonne nella appsearch, vuol dire che sono al primo binding\r\n if (columns.length == 0) {\r\n if (this.est.viewMode())\r\n view.columns = newColset;\r\n else\r\n this.est.arrayColumns = newColset;\r\n }\r\n\r\n if ((this.est.viewMode() && view.savedstate) && this.est.ColumnsOrdering() && view.column_ordering.length > 0) {\r\n // Scorro gli ordinamenti che avevo salvato e ricreo la ColumnsList in base a loro\r\n let newColList: EsTableColumn[] = [];\r\n view.column_ordering.forEach(co => {\r\n this.est.ColumnsList.forEach(c => {\r\n if (c.id == co)\r\n newColList.push(c);\r\n });\r\n });\r\n\r\n // Recupero anche campi nuovi che nell'iterazione vecchia non c'erano (serve durante lo sviluppo in modo da non perdersi fra un EDIT + F5 e l'altro)\r\n this.est.ColumnsList.forEach(c => {\r\n if (!newColList.find(t => t.id == c.id))\r\n newColList.push(c);\r\n });\r\n\r\n this.est.ColumnsList = newColList;\r\n }\r\n\r\n // In ogni caso questo non mi serve più, lo resetto **\r\n if (this.est.viewMode())\r\n view.savedstate = false;\r\n\r\n // Reset di questa variabile usata one-bind\r\n if (this.est.useLocalVisibility)\r\n this.est.useLocalVisibility = false;\r\n\r\n if (emitChanged)\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * In base alla visibilità registrata nelle **ColumnsList** questo metodo si occupa di prendere tutti i **EsThDirective** ed **EsTdDirective** relativi e nasonderli/mostrarli\r\n *\r\n * Costo: 1 scan ColumnsList, 1 scan EsThDirectives, 1 scan EsTdDirectives\r\n *\r\n * @param {EsThDirective[]} ths Header della tabella\r\n * @param {EsTdDirective[]} tds Celle della tabella\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public refreshColumnsVisibility(ths: EsThDirective[] | null, tds: EsTdDirective[] | null, view: AppSearch<any> | null) {\r\n let newColset = [];\r\n let fixedThs: { [id: string]: boolean; } = {};\r\n let columnsCache: { [index: string]: EsTableColumn; } = {};\r\n for (let coli = 0; coli < this.est.ColumnsList.length; coli++) {\r\n let col = this.est.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n if (col.visible)\r\n newColset.push((col.pinned ? \"§\" : \"\") + col.id);\r\n }\r\n if (view)\r\n view.columns = newColset;\r\n\r\n else\r\n this.est.arrayColumns = newColset;\r\n\r\n // Da qui in poi devono essere eseguiti SOLO in fase di writeValue quindi devo assicurarmi di passarli null in tutti i passaggi diversi da quello\r\n if (ths) {\r\n // Definisco se la colonna è visibile in base alla sua rappresentazione locale in ColumnsList\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n th.thVisible = !!(th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible));\r\n if (th.thFixed || th.thGroup)\r\n fixedThs[th.th] = true;\r\n }\r\n }\r\n\r\n if (tds) {\r\n // Definisco se la cella è visibile in base alla sua rappresentazione locale in ColumnsList\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n td.tdVisible = !!(fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible));\r\n }\r\n }\r\n\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * Allinea gli ordinamenti dati fra le **EsThs** e le informazioni all'interno della View bindata\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n public alignHeadersOrdering(ths: EsThDirective[], view: AppSearch<any>) {\r\n let orders = view ? view.orders : this.est.arrayOrders;\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n th.thOrder = undefined;\r\n for (let i = 0; i < orders.length; i++) {\r\n let or = orders[i];\r\n if (or.id == th.th)\r\n th.thOrder = or.order;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Genera tutte le informazioni che servono per gestire il raggruppamento degli header\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n *\r\n * @returns {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} Oggetto contenente la lista delle foglie (header base), il livello\r\n * massimo di raggruppamento raggiunto, una cache in cui vengono indicati tutti i gruppi che sono \"parent\" (quindi che raggruppano almeno 1 header) e la cache degli header\r\n */\r\n public evaluateHeadersGroupingInfos(ths: EsThDirective[]): { leafs: EsThDirective[]; groupingLevel: number; parentsCache: any; thsCache: any; } {\r\n // Pregiro per trovare i parent\r\n let parentsCache: { [index: string]: boolean; } = {};\r\n let thsCache: { [index: string]: EsThDirective; } = {};\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n thsCache[th.th] = th;\r\n if (th.thParent && !parentsCache[th.thParent])\r\n parentsCache[th.thParent] = true;\r\n }\r\n\r\n // Secondo giro per beccare il livello massimo e la lista di foglie (th senza parent)\r\n let hMaxLevel = 0;\r\n let leafs: any[] = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n // Se sono una foglia vedo quanti livelli ci sono sopra\r\n if (!parentsCache[th.th]) {\r\n leafs.push(th);\r\n let tmp = this.jumpsToFinalParent(th, thsCache);\r\n hMaxLevel = tmp > hMaxLevel ? tmp : hMaxLevel;\r\n }\r\n }\r\n\r\n return { leafs: leafs, groupingLevel: hMaxLevel, parentsCache: parentsCache, thsCache: thsCache };\r\n }\r\n\r\n /**\r\n * Genera gli header groups da una lista di info sui th all'interno della variabile **TMPRowThGroups**\r\n *\r\n * @param {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} infos Informazioni di raggruppamento valutate precedentemente\r\n */\r\n public evaluateHeaderGroups(infos: { leafs: EsThDirective[]; groupingLevel: number; parentsCache: any; thsCache: { [index:string]: EsThDirective}; }) {\r\n if (infos.groupingLevel == 0)\r\n return;\r\n\r\n /****** STEP 1: Creo l'output dei raggruppamenti per header in modo da non dovermi preoccupare di celle non inizializzate ******/\r\n\r\n let expandedGroups: string[][] = [];\r\n let visibleUnpinnedLeafs: EsThDirective[] = (<any[]>infos.leafs).filter((t: EsThDirective) => t.thVisible && t.thIf && !t.thPinned);\r\n for (let l = 0; l < infos.groupingLevel; l++) {\r\n expandedGroups.push([]);\r\n for (let i = 0; i < visibleUnpinnedLeafs.length; i++)\r\n expandedGroups[l].push(\"\");\r\n }\r\n\r\n /****** STEP 2: Ordino le foglie in base agli ordinamenti delle colonne ******/\r\n let orderedLeafs = [];\r\n for (let i = 0; i < this.est.OrderDirectives.length; i++) {\r\n let leaf: EsThDirective = infos.thsCache[this.est.OrderDirectives[i]];\r\n\r\n // Solo se la leaf è presente. Potrebbero esserci ordinamenti su colonne sparite\r\n if (leaf && leaf.thVisible && leaf.thIf && !leaf.thPinned)\r\n orderedLeafs.push(leaf);\r\n }\r\n\r\n /****** STEP 3: Creo l'array group con tutti i riferimenti del caso ******/\r\n let currentParent: string | null = \"\";\r\n for (let i = 0; i < orderedLeafs.length; i++) {\r\n let refTh: EsThDirective = orderedLeafs[i];\r\n let prevTh: EsThDirective | null = i - 1 >= 0 ? orderedLeafs[i - 1] : null;\r\n\r\n // Parent diverso da prima, metto il bordo a sinistra e a destra della cella precedente (se c'è)\r\n // All'ultimo giro metto il bordo a destra. Tutto questo lo rieseguo per ogni cella in modo da ripulire eventuali a cui avevo assegnato tag precedentemente\r\n (<any>refTh)._lbord = refTh.thParent != currentParent;\r\n (<any>refTh)._rbord = visibleUnpinnedLeafs.length == i + 1;\r\n if (prevTh)\r\n (<any>prevTh)._rbord = refTh.thParent != currentParent;\r\n\r\n currentParent = refTh.thParent;\r\n\r\n // Per ogni gruppo srotolo il parent nella matrice dei raggruppamenti\r\n for (let l = 0; l < infos.groupingLevel; l++) {\r\n let parent = refTh.thParent;\r\n if (parent && !refTh.thPinned) {\r\n expandedGroups[l][i] = parent;\r\n refTh = infos.thsCache[parent];\r\n }\r\n }\r\n }\r\n\r\n /****** STEP 4: Compatto nell'elemento finale su cui bindarmi. L'ID assegnato è SOLO per ottimizzare gli ngFor ******/\r\n\r\n currentParent = \"\";\r\n let currentSpan = 0;\r\n let finalHeaders: ThGroup[][] = [];\r\n for (let l = 0; l < expandedGroups.length; l++) {\r\n let levelArray: ThGroup[] = [];\r\n finalHeaders.push(levelArray);\r\n\r\n if (this.est.Selection() || this.est.HasPinnedColumns())\r\n levelArray.push({ ID: \"_base_sel_pinned\", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns() });\r\n\r\n for (let h = 0; h < expandedGroups[l].length; h++) {\r\n let item = expandedGroups[l][h];\r\n if (item == currentParent)\r\n currentSpan++;\r\n else {\r\n if (currentSpan > 0)\r\n levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : undefined, Borders: !!currentParent });\r\n currentSpan = 1;\r\n currentParent = item;\r\n }\r\n }\r\n\r\n // Ultima aggiunta che altrimenti mi rimarrebbe in cache\r\n levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : undefined , Borders: !!currentParent });\r\n\r\n // Aggiungo i pezzettini per la rimozione e gli export, se presenti\r\n if (this.est.Removal())\r\n levelArray.push({ ID: \"_base_removal\", Span: 1, Template: null });\r\n\r\n if (this.est.Export() || this.est.HiddenColumns() || this.est.ColumnsOrdering() || this.est.CornerMenuOptions())\r\n levelArray.push({ ID: \"_base_extra_opts\", Span: 1, Template: null });\r\n\r\n currentSpan = 0;\r\n currentParent = \"\";\r\n }\r\n\r\n /****** STEP 5: Secco le righe in cui non c'è nulla ******/\r\n\r\n this.est.TMPRowThGroups = [];\r\n\r\n for (let i = 0; i < finalHeaders.length; i++) {\r\n let level = finalHeaders[i];\r\n let empty = true;\r\n for (let j = 0; j < level.length; j++) {\r\n let item = level[j];\r\n if (item.Template || item.Content) {\r\n empty = false;\r\n break;\r\n }\r\n }\r\n\r\n if (!empty)\r\n this.est.TMPRowThGroups.push(level);\r\n }\r\n }\r\n\r\n /**\r\n * Calcola il numero di salti da un header foglia all'ultimo parent della catena\r\n *\r\n * @param {EsThDirective} th Header da cui scorrere i padri per capire quanti livelli ci sono sopra\r\n * @param {{ [index: string]: EsThDirective }} thsCache Cache degli header\r\n */\r\n private jumpsToFinalParent(th: EsThDirective, thsCache: { [index: string]: EsThDirective; }) {\r\n let jumps = 0; let parent = null; let parentsPrepend: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[] = [];\r\n let baseThRef = th;\r\n do {\r\n parent = th.thParent;\r\n if (parent) {\r\n th = thsCache[parent];\r\n if (!th.thEmpty && !th._multi_content)\r\n parentsPrepend.unshift({ id: th.th, tmpl: th.Template });\r\n else if (!th.thEmpty && th._multi_content)\r\n parentsPrepend.unshift({ id: th.th, content: th._multi_content });\r\n jumps++;\r\n }\r\n } while (parent);\r\n baseThRef._thParents = parentsPrepend;\r\n return jumps;\r\n }\r\n\r\n /**\r\n * Metodo che genera l'ordine di default delle colonne\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public generateDefaultOrder(ths: EsThDirective[], view: AppSearch<any>) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n //*********************************************** Fix ordinamenti per colonne sparite ****************************** */\r\n // Considero solo gli ordinamenti per colonne effettivamente presenti all'interno della tabella\r\n if (this.est.viewMode())\r\n view.column_ordering = view.column_ordering.filter(ord => ths.find(t => t.th == ord));\r\n //*********************************************** Fix ordinamenti per colonne sparite ****************************** */\r\n\r\n let orderings = this.est.viewMode() ? view.column_ordering : this.est.arrayColumnOrdering;\r\n\r\n // Genero ordinamento di default da 0 fino a dove deve arrivare. Situazione attuale senza hotpotato\r\n if (!orderings || orderings.length == 0) {\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let order = th.th;\r\n this.est.OrderDirectives.push(order);\r\n }\r\n }\r\n else {\r\n this.est.OrderDirectives = orderings;\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let thId = th.th;\r\n if (!this.est.OrderDirectives.find(o => o == thId))\r\n this.est.OrderDirectives.push(thId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applica l'ordine specificato alle varie colonne\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n * @param {boolean} finalize Se **true** significa che non mi aspetto di dover effettuare altre operazioni e posso renderizzare la situazione in base ai RowContext\r\n * Senza finalize significa che mi aspetto altre operazioni che prima o poi richiameranno questa funzione col finalize.\r\n *\r\n * Ad esempio, una volta selezionato ordinamento fisico/logico delle colonne so che parte un altra ricerca che mi rivalorizzerà da \"writeValue\", che già chiama questa funzione.\r\n * Mettendo solo la chiamata da \"writeValue\" come \"finalizzante\" mi assicuro che smanattamenti a frontend non causino flickering fino a quando non servono\r\n */\r\n public applyOrdering(view: AppSearch<any> | null, finalize: boolean) {\r\n // Genero ordinamento per gli header\r\n let newHeaders: ThElement[] = [];\r\n\r\n // Se devo finalizzare aggancio tutte le variabili di bind\r\n if (finalize) {\r\n // Mappa ID -> header costruita una sola volta (evita il .filter() lineare per ogni OrderDirective)\r\n let headersById = new Map<any, ThElement>();\r\n for (let h = 0; h < this.est.TMPRowTHs.length; h++) {\r\n let header = this.est.TMPRowTHs[h];\r\n if (!headersById.has(header.ID))\r\n headersById.set(header.ID, header);\r\n }\r\n this.est.OrderDirectives.forEach(o => {\r\n let heaedrItem = headersById.get(o);\r\n if (heaedrItem)\r\n newHeaders.push(heaedrItem);\r\n });\r\n this.est.TMPRowTHs = newHeaders;\r\n\r\n // Genero ordinamento per le celle\r\n for (let i = 0; i < this.est.RowContexts.length; i++) {\r\n let context = this.est.TMPRowTDs[this.est.RowContexts[i]];\r\n let newContext: WritableSignal<TdElement>[] = [];\r\n\r\n // Mappa ID -> signal costruita una sola volta per riga: il getter del signal viene invocato\r\n // una volta per cella invece di una volta per ogni (colonna × OrderDirective)\r\n let contextById = new Map<any, WritableSignal<TdElement>>();\r\n for (let c = 0; c < context.length; c++) {\r\n let id = context[c]().ID;\r\n if (!contextById.has(id))\r\n contextById.set(id, context[c]);\r\n }\r\n\r\n this.est.OrderDirectives.forEach(o => {\r\n let contextItem = contextById.get(o);\r\n // potrebbe esser undefined nel caso ci fossero colonne sotto thIf\r\n if(contextItem)\r\n newContext.push(contextItem);\r\n });\r\n\r\n this.est.TMPRowTDs[this.est.RowContexts[i]] = newContext;\r\n }\r\n }\r\n\r\n if (this.est.viewMode() && view)\r\n view.column_ordering = this.est.OrderDirectives;\r\n else\r\n this.est.arrayColumnOrdering = this.est.OrderDirectives;\r\n\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" mette la colonna specificata prima della colonna precedente\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public sendUp(columnItem: EsTableColumn) {\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n if (this.est.TMPColumnsList[itemIndex - 1].fixed || this.est.TMPColumnsList[itemIndex - 1].pinned)\r\n return;\r\n this.utiExts.swap(this.est.TMPColumnsList, itemIndex, itemIndex - 1);\r\n\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n let tmp: EsTableColumn[] = [];\r\n this.est.TMPColumnsList.forEach(c => { tmp.push(Object.assign({}, c)); });\r\n this.est.TMPColumnsList = tmp;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" mette la colonna specificata dopo la colonna successiva\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public sendDown(columnItem: EsTableColumn) {\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n this.utiExts.swap(this.est.TMPColumnsList, itemIndex, itemIndex + 1);\r\n\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n let tmp: EsTableColumn[] = [];\r\n this.est.TMPColumnsList.forEach(c => { tmp.push(Object.assign({}, c)); });\r\n this.est.TMPColumnsList = tmp;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" pinna la colonna specificata\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public pinOrUnpinColumn(columnItem?: EsTableColumn) {\r\n if(!columnItem)\r\n return;\r\n\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n if (!columnItem.pinned) {\r\n columnItem.prev_index = itemIndex;\r\n\r\n //Quando pinno devo spostare l'elemento come ultima colonna pinnata o come prima colonna se non ce ne sono di pinnate\r\n for (let i = 0; i < this.est.TMPColumnsList.length; i++) {\r\n if (!this.est.TMPColumnsList[i].pinned) {\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, i);\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n //Quando spinno riporto l'elemento allo stesso indice in cui era prima (se sono stati fatti spostamenti nel mezzo cazzi dell'utente)\r\n if (columnItem.prev_index != null && columnItem.prev_index != undefined)\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, columnItem.prev_index);\r\n else {\r\n // Se spinno senza un prev_index vuol dire che la colonna era pinnata da configurazione. La sposto nel primo punto disponibile\r\n for (let i = 0; i < this.est.TMPColumnsList.length; i++) {\r\n if (!this.est.TMPColumnsList[i].pinned && !this.est.TMPColumnsList[i].fixed) {\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, i - 1);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n columnItem.pinned = !columnItem.pinned;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" inverte le impostazioni di visibilità della colonna\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public columnClicked(item: EsTableColumn) {\r\n this.est.lastSelectedItemID = item.id;\r\n if (!this.est.HiddenColumns || item.fixed)\r\n return;\r\n\r\n item.visible = !item.visible;\r\n this.updateGlobalColVisCheck();\r\n }\r\n\r\n /** All'apertura della dialog \"Ordinamento e Visibilità Colonne\" ricarica le informazioni attuali per permettere la modifica */\r\n public resetColumnVisSelection() {\r\n this.est.TMPColumnsList = [];\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n this.est.TMPColumnsList = [];\r\n this.est.ColumnsList.forEach(c => { this.est.TMPColumnsList.push(Object.assign({}, c)); });\r\n\r\n let reorderedColList: EsTableColumn[] = [];\r\n\r\n if (this.est.ColumnsOrdering()) {\r\n this.est.OrderDirectives.forEach(o => {\r\n let column = this.est.TMPColumnsList.filter(t => t.id == o)[0];\r\n // Potrei non averne nel caso ci sia il flag HiddenColumns a false, evito di inserire degli undefined\r\n if (column)\r\n reorderedColList.push(column);\r\n });\r\n\r\n this.est.TMPColumnsList = reorderedColList;\r\n }\r\n\r\n this.updateGlobalColVisCheck();\r\n }\r\n\r\n /** Riaggiorna le **OrderDirectives** con le informazioni in **ColumnsList** */\r\n private refreshColumnOrdering() {\r\n this.est.OrderDirectives = [];\r\n\r\n for (let c = 0; c < this.est.ColumnsList.length; c++)\r\n this.est.OrderDirectives.push(this.est.ColumnsList[c].id);\r\n }\r\n\r\n /** Effettua la selezione o meno del check globale (**globalColVisCheck**) di visibilità in base a se tutte le **TMPColumnsList** sono visibili o no */\r\n public updateGlobalColVisCheck() {\r\n // TMPColList viene riempita di undefined nel caso in cui sia disattivata la selezione delle colonne nascoste\r\n this.est.globalColVisCheck.set(this.est.TMPColumnsList.every(t => t.visible));\r\n }\r\n\r\n /**\r\n * Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne\r\n * \r\n * @param {CdkDragDrop<EsTableColumn[]>} event Evento di drop della lista\r\n */\r\n public columnReordered(event: CdkDragDrop<EsTableColumn[]>) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n }\r\n\r\n /**\r\n * Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne\r\n * \r\n * @param {number} index Indice in cui voglio droppare l'elemento draggato\r\n * @param {CdkDrag<EsTableColumn>} item Oggetto che sto draggando\r\n * \r\n * @returns {boolean} **true** se la colonna può essere spostata sull'indice **index**, **false** altrimenti\r\n */\r\n public sortPredicate(index: number, item: CdkDrag<EsTableColumn>): boolean {\r\n let itemAtIndex = this.est.ColumnsList[index];\r\n return !itemAtIndex.fixed && !itemAtIndex.pinned && !item.data.pinned && !item.data.pinned;\r\n }\r\n\r\n /**\r\n * Funzione che effettua la conferma della visibilità e dell'ordine delle colonne.\r\n *\r\n * Questa selezione viene inoltre salvata nelle preferenze (**@esfaenza/preferences**), qualora l'Input **SavePreferences** fosse valorizzato\r\n *\r\n * @returns {boolean} **true** se non ci sono problemi, **false** altrimenti\r\n */\r\n public confirmColumnVisibilitySelection(): boolean {\r\n // Non permetto di non selezionare nulla\r\n if (this.est.TMPColumnsList.every(t => !t.visible))\r\n return false;\r\n\r\n let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View as AppSearch<any>) : null;\r\n this.est.ColumnsList = [];\r\n this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });\r\n\r\n this.refreshColumnOrdering();\r\n this.applyOrdering(castedView, false);\r\n\r\n this.refreshColumnsVisibility(null, null, castedView);\r\n\r\n //Salvo le preferences di questa view\r\n //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI\r\n if (this.est.SavePreferences()) \r\n this.registerViewPreferences(castedView);\r\n\r\n // Rieseguo l'ultima ricerca bindata alla tabella\r\n // Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono\r\n if (this.est.viewMode())\r\n setTimeout(() => {\r\n if (this.est.MainGroupView) {\r\n for (let i = 0; i < this.est.groupSearchRequestsCache.length; i++) {\r\n let view = this.est.groupSearchRequestsCache[i].view;\r\n view.columns = this.est.MainGroupView.columns;\r\n view.column_ordering = this.est.MainGroupView.column_ordering;\r\n this.est.emitSearchRequest(true, this.est.groupSearchRequestsCache[i].view);\r\n }\r\n }\r\n\r\n else\r\n this.est.emitSearchRequest(true);\r\n });\r\n else if (this.est.arrayMode())\r\n setTimeout(() => { this.est.internalWriteValue(); });\r\n\r\n // Lo vorrei mettere lato template ma no\r\n this.est.lastSelectedItemID = null;\r\n return true;\r\n }\r\n\r\n /**\r\n * Effettuo l'unpinning di una colonna in maniera programmatica semplicemente eseguendo una per una le operazioni che verrebbero eseguite altrimenti\r\n *\r\n * @param {string} id Codice della colonna da spinnare\r\n */\r\n public unpinColumn(id: string) {\r\n this.resetColumnVisSelection();\r\n this.pinOrUnpinColumn(this.est.TMPColumnsList.find(t => t.id == id));\r\n this.confirmColumnVisibilitySelection();\r\n }\r\n\r\n /** Sul click nella checkbox di selezione globale si scorrono tutte le colonne e si impostano al valore della check globale */\r\n public globalColVisCheckChanged() {\r\n this.est.TMPColumnsList.forEach(t => {\r\n if (!t.fixed)\r\n t.visible = this.est.globalColVisCheck();\r\n });\r\n }\r\n}\r\n","import { InputType } from \"../types\";\r\n\r\n/** Classe che identifica una colonna. Utilizzata in modalità \"Colonne dinamiche\" */\r\nexport class EsTableColumnsDefinition {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} Description Descrizione della colonna\r\n * @param {string} PropertyName Nome della proprietà del modello in cui sono contenuti i dati da visualizzare per questa colonna\r\n * @param {string} RoutePath Route di navigazione. Es. \"['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]\"\r\n * @param {string[]} RouteParameterProperties Proprietà da bindare a **routePath** per generare la route completa. \r\n * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. [\"iditem\", \"iditem2\"]\r\n * @param {'ASC' | 'DESC' } DataOrder Ordinamento dei dati presentati in questa colonna\r\n * @param {number} ColumnOrder Ordinamento di questa colonna\r\n * @param {boolean} Visible Visibilità o meno della colonna\r\n * @param {string} Clss Classe da applicare sia ai TD che ai TH relativi a questa colonna\r\n * @param {boolean} Orderable Indica se la colonna è ordinabile o no (nel senso ASC / DESC / NONE)\r\n * @param {boolean} HeaderWraps Indica se il testo dell'header dev'essere wrappato all'interno del th. Di default no.\r\n * @param {InputType | string} PropertyType Indica il tipo della proprietà identificata da **propertyName**.\r\n * @param {{id: string, description: string}[]} PropertySource Sorgente dati su cui autocompletare/scegliere il valore per la proprietà **propertyName**, ha senso solo per **propType** enum o autocomplete.\r\n * @param {string} EditorName Nome dell'editor da utilizzare per la modifica di questo campo\r\n * @param {string} RendererName Nome del renderer da utilizzare per visualizzare questo campo\r\n * @param {string} Format Nome del renderer da utilizzare per visualizzare questo campo\r\n */\r\n constructor(\r\n public Description: string,\r\n public PropertyName: string,\r\n public RoutePath: string = null,\r\n public RouteParameterProperties: string[] = null,\r\n public DataOrder: 'ASC' | 'DESC' = null,\r\n public ColumnOrder: number = null,\r\n public Visible: boolean = true,\r\n public Clss: string = null,\r\n public Orderable: boolean = true,\r\n public HeaderWraps: boolean = false,\r\n public PropertyType: InputType | string = null,\r\n public PropertySource: { id: string, description: string }[] = [],\r\n public EditorName: string = \"\",\r\n public RendererName: string = \"\",\r\n public EditorOptions: { [id: string]: any } = {},\r\n public Pinned : boolean = false,\r\n public PinnedWidth : number = 150,\r\n public Pinnable : boolean = true,\r\n public Grouping: string = \"\",\r\n public Shrink: boolean = false,\r\n public Format?: string) {\r\n }\r\n\r\n static build(parsObj: any): EsTableColumnsDefinition {\r\n\r\n return new EsTableColumnsDefinition(\r\n parsObj.Description,\r\n parsObj.PropertyName,\r\n parsObj.RoutePath,\r\n parsObj.RouteParameterProperties,\r\n parsObj.DataOrder,\r\n parsObj.ColumnOrder,\r\n parsObj.Visible || true,\r\n parsObj.Clss,\r\n parsObj.Orderable || true,\r\n parsObj.HeaderWraps,\r\n parsObj.PropertyType,\r\n parsObj.PropertySource,\r\n parsObj.EditorName,\r\n parsObj.RendererName,\r\n parsObj.Pinned,\r\n parsObj.Grouping,\r\n parsObj.Shrink,\r\n parsObj.Format\r\n );\r\n }\r\n\r\n}","// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Dominio\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { EsTableOperationDefinition } from \"../../domain/externals/EsTableOperationDefinition\";\r\n\r\n/** Classe contenente le gestioni particolari della modalità dinamica dell'es-table */\r\nexport class DynamicModeHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent) { }\r\n\r\n /** Se non ho l'Input **DynamicRowColumnsDefinition** in modalità dinamica lo riempio con il default nome della colonna = testo della colonna */\r\n public eventuallyReviewDynamicColumns() {\r\n // Senza oggetti esco\r\n if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)\r\n return;\r\n\r\n var useGenericItems = !!this.est.TMPBoundSource[0][\"properties\"];\r\n if (!useGenericItems || (!this.est.FirstBind() && this.est.DynamicRowColumnsDefinition()?.length > 0))\r\n return;\r\n\r\n if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0) {\r\n var props = <Record<string, string>>this.est.TMPBoundSource[0][\"properties\"];\r\n\r\n let drcd = [];\r\n for (let key in props)\r\n drcd.push(new EsTableColumnsDefinition(key, key));\r\n\r\n this.est.DynamicRowColumnsDefinition.set(drcd);\r\n this.est.UserDefinedDynamicCols.set(false);\r\n }\r\n else\r\n this.est.UserDefinedDynamicCols.set(true);\r\n }\r\n\r\n /** Genera partendo dalle **DynamicRowColumnsDefinition** la lista di **EsThDirective** e **EsTdDirective** che servono per la tabella */\r\n public emitThsAndTdsBasedOnDynamicDefinition(): { ths: EsThDirective[], tds: EsTdDirective[] } {\r\n // Senza dynamic columns esco\r\n if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0)\r\n return null;\r\n\r\n let ths = [];\r\n let tds = [];\r\n\r\n for (let i = 0; i < this.est.DynamicOperations().length; i++) {\r\n let op = this.est.DynamicOperations()[i];\r\n \r\n ths.push(this.getThFromOperation(op));\r\n tds.push(this.getTdFromOperation(op));\r\n }\r\n\r\n for (let i = 0; i < this.est.DynamicRowColumnsDefinition().length; i++) {\r\n let col = this.est.DynamicRowColumnsDefinition()[i];\r\n\r\n ths.push(this.getThFromColumnDef(col));\r\n tds.push(this.getTdFromColumnDef(col));\r\n }\r\n return { ths, tds };\r\n }\r\n\r\n /** @ignore Helper */\r\n private getThFromOperation(op: EsTableOperationDefinition): EsThDirective {\r\n let th = new EsThDirective(null);\r\n th.th = op.id;\r\n th.thFixed = true;\r\n th.thVisible = true;\r\n th.thStaticContent = \"\";\r\n return th;\r\n }\r\n\r\n private getTdFromOperation(op: EsTableOperationDefinition): EsTdDirective {\r\n let td = new EsTdDirective(null);\r\n td.td = op.id;\r\n td.tdVisible = true;\r\n td.tdIconClass = op.iconClass;\r\n td.tdConditionField = op.conditionField;\r\n td.tdConditionValue = op.conditionValue;\r\n td.tdTitle = op.title;\r\n td.tdContent = op.text;\r\n return td;\r\n }\r\n\r\n private getThFromColumnDef(col: EsTableColumnsDefinition): EsThDirective {\r\n var ret = new EsThDirective(null);\r\n ret.th = col.PropertyName;\r\n ret.thPinned = col.Pinned;\r\n ret.thPinnable = col.Pinnable;\r\n ret.thPinnedWidth = col.PinnedWidth;\r\n ret.thVisible = col.Visible;\r\n ret.thOrder = col.DataOrder;\r\n ret.thOrderable = col.Orderable;\r\n ret.thWrap = col.HeaderWraps;\r\n ret.thClass = col.Clss;\r\n ret.thProperty = col.PropertyName;\r\n ret.thType = col.PropertyType;\r\n ret.thSource = col.PropertySource;\r\n ret.thEditorName = col.EditorName;\r\n ret.thEditorOptions = col.EditorOptions\r\n ret.thRendererName = col.RendererName;\r\n ret.thRoutePath = col.RoutePath;\r\n ret.thRouteParameterProperties = col.RouteParameterProperties;\r\n ret.thStaticContent = col.Description;\r\n ret.thFormat = col.Format ?? \"\";\r\n\r\n //ret.thFixed = col.Fixed;\r\n //ret.thResizable = col.Resizable;\r\n //ret.thGroupClass = col.GroupClass;\r\n //ret.thGroup = col.Group;\r\n //ret.thAggregation = col.Aggregation;\r\n //ret.thMulti = col.Multi;\r\n //ret.thBackgroundColor = col.BackgroundColor;\r\n //ret.thAlignment = col.Alignment;\r\n //ret.thFormat = col.Format;\r\n return ret;\r\n }\r\n\r\n /** @ignore Helper */\r\n private getTdFromColumnDef(col: EsTableColumnsDefinition): EsTdDirective {\r\n var ret = new EsTdDirective(null);\r\n ret.td = col.PropertyName;\r\n ret.tdClass = col.Clss;\r\n //ret.tdAlignment = col.Alignment;\r\n //ret.tdFormat = col.Format;\r\n return ret;\r\n }\r\n}\r\n","import { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n/** Classe contenente la gestione della modalità gerarchica */\r\nexport class HierarchyModeHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent) { }\r\n\r\n /**\r\n * Data una lista di oggetti assegno il livello gerarchico rispetto alla lista di oggetti passata\r\n *\r\n * @param {any[]} objs Lista di oggetti a cui aggiungere l'informazione del livello gerarchico\r\n */\r\n public assignHierarchyLevels(objs: any[]) {\r\n // Casistica input nullo\r\n if (!objs || !objs.length)\r\n return;\r\n\r\n //Se mancano entrambe le info le cerco di valorizzare in automatico coi default \"parentid\" e \"id\" (posto che le props esistano nell'oggetto)\r\n if (!this.est.ParentKey() && !this.est.OwnKey()) {\r\n if (objs[0]['parentid'] !== undefined)\r\n this.est.ParentKey.set('parentid');\r\n if (objs[0]['id'] !== undefined)\r\n this.est.OwnKey.set('id');\r\n }\r\n\r\n //Check finale per assicurarmi che le props ci siano\r\n if (!this.est.ParentKey() || !this.est.OwnKey()) {\r\n console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');\r\n return;\r\n }\r\n\r\n // Valorizzazione campi level, expanded, e visible per ogni item\r\n let currentLevel = 1;\r\n let assigned = 0;\r\n do {\r\n assigned = this.assignLevel(objs, currentLevel);\r\n currentLevel++;\r\n } while (assigned > 0);\r\n // butto su lato html e poi me la gioco là con padding = 20 * (level - 1) per far capire il diverso livello\r\n\r\n if(this.est.AutoSortHierarchy)\r\n this.orderItemsInPlace(objs);\r\n }\r\n\r\n private orderItemsInPlace(items: any[]) {\r\n let ownKey = this.est.OwnKey();\r\n let parentKey = this.est.ParentKey();\r\n\r\n const childrenMap = new Map();\r\n\r\n // Build parent -> children map\r\n for (const item of items) {\r\n const parent = item[parentKey] || null;\r\n\r\n if (!childrenMap.has(parent))\r\n childrenMap.set(parent, []);\r\n\r\n childrenMap.get(parent).push(item);\r\n }\r\n\r\n // Sort siblings by id\r\n for (const group of childrenMap.values()) {\r\n group.sort((a, b) => a[ownKey] - b[ownKey]);\r\n }\r\n\r\n // Rewrite original array in hierarchical order\r\n let write = 0;\r\n\r\n function visit(parentKey = null) {\r\n const children = childrenMap.get(parentKey);\r\n if (!children) return;\r\n\r\n for (const item of children) {\r\n items[write++] = item;\r\n visit(item[ownKey]);\r\n }\r\n }\r\n\r\n visit(null);\r\n }\r\n\r\n /**\r\n * Per ognuno degli oggetti passati gli assegna un livello di gerarchia in base a **ParentKey** e **OwnKey**\r\n *\r\n * @param {any[]} objs Oggetti a cui assegnare il livello di gerarchia\r\n * @param {number} levelToAssign Livello che sta assegnando attualmente questa iterazione (dato che è ricorsiva)\r\n *\r\n * @returns {number} Numero di oggetti a cui è stato assegnato un livello gerarchico\r\n */\r\n private assignLevel(objs: any[], levelToAssign: number): number {\r\n let assigned = 0;\r\n let own = this.est.OwnKey();\r\n let parent = this.est.ParentKey();\r\n let expanded = this.est.StartsExpanded();\r\n for (let i = 0; i < objs.length; i++) {\r\n let obj = objs[i];\r\n\r\n // Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)\r\n if (!obj[parent] && levelToAssign == 1) {\r\n obj._level = 1;\r\n obj._visible = true;\r\n obj._expanded = expanded;\r\n assigned++;\r\n continue;\r\n }\r\n\r\n // Per i livelli superiore al primo\r\n if (obj[parent] && levelToAssign > 1) {\r\n // trovo il parent\r\n for (let p = 0; p < objs.length; p++) {\r\n let possibleParent = objs[p];\r\n\r\n // Trovato il parent dell'item, assegno all'item il livello giusto\r\n if (possibleParent[own] == obj[parent] && possibleParent._level == levelToAssign - 1) {\r\n obj._level = levelToAssign;\r\n\r\n // So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica\r\n // per la visibilità del figlio\r\n possibleParent._expanded = expanded;\r\n possibleParent.parent = true;\r\n obj._visible = expanded;\r\n assigned++;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return assigned;\r\n }\r\n\r\n /**\r\n * Funzione che permette di effettuare l'espansione di un parent quando la tabella funziona in modalità gerarchica\r\n *\r\n * @param {string} key Chiave del parent da espandere\r\n */\r\n public expandParent(key: string) {\r\n let bs = this.est.boundSource();\r\n let own = this.est.OwnKey();\r\n let parent = this.est.ParentKey();\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let obj = bs[i];\r\n\r\n // Trovo il parent con quell'id e lo espando\r\n if (obj[own] == key) {\r\n obj._expanded = true;\r\n\r\n for (let ic = 0; ic < bs.length; ic++) {\r\n let child = bs[ic];\r\n\r\n // Trovo tutti i child di quel parent e li rendo visibili\r\n if (child[parent] == key)\r\n child._visible = true;\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che permette di effettuare il collapse di un parent quando la tabella funziona in modalità gerarchica\r\n *\r\n * @param {string} key Chiave del parent da collassare\r\n */\r\n public collapseParent(key: string) {\r\n let bs = this.est.boundSource();\r\n let own = this.est.OwnKey();\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let obj = bs[i];\r\n\r\n // Trovo il parent con quell'id e lo collasso\r\n if (obj[own] == key) {\r\n obj._expanded = false;\r\n\r\n // Collasso/nascondo tutti i child del parent\r\n this.collapseChildOfParent(key);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Collassa ricorsivamente tutti i figli di un parent identificato dalla **parentKey**\r\n *\r\n * @param {string} parentKey Chiave del parent di cui collassare i figli\r\n */\r\n private collapseChildOfParent(parentKey: string) {\r\n let bs = this.est.boundSource();\r\n let parent = this.est.ParentKey();\r\n let own = this.est.OwnKey();\r\n\r\n for (let ic = 0; ic < bs.length; ic++) {\r\n let child = bs[ic];\r\n\r\n // Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,\r\n // lo collasso e vado in ricorsione sui figli\r\n if (child[parent] == parentKey && !child.parent)\r\n child._visible = false;\r\n else if (child[parent] == parentKey && child.parent) {\r\n child._expanded = false;\r\n child._visible = false;\r\n this.collapseChildOfParent(child[own]);\r\n }\r\n }\r\n }\r\n}\r\n","// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\n\r\n// Utilities\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n/** Classe che si occupa della gestione del recupero degli oggetti, paginazione e tutto ciò in cui gli elementi caricati vengono manipolati direttamente */\r\nexport class ItemsHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler) { }\r\n\r\n /**\r\n * In base alla modalità specificata (ArrayMode, ViewMode, ecc...) questo metodo recupera l'array di oggetti da bindare ad interfaccia\r\n *\r\n * @param {boolean} onlyselected [false] Indica di prendere solo gli oggetti selezionati\r\n * @param {boolean} refreshPaging [false] Indica se aggiornare le informazioni di paginazione o meno\r\n * @param {boolean} allIfPossible [false] Indica se prendere tutti gli oggetti quaora possibile, usato solo in ArrayMode\r\n *\r\n * @returns {any[]} Lista degli oggetti su cui effettuare il bind lato interfaccia\r\n */\r\n public getItemsByMode(onlyselected: boolean = false, refreshPaging: boolean = false, allIfPossible: boolean = false): any[] {\r\n let items: any[] = [];\r\n\r\n if ((this.est.viewMode() && this.est.View instanceof AppSearch)) {\r\n items = this.getViewItemsBySource();\r\n }\r\n else if (this.est.arrayMode()) {\r\n this.est.View.forEach(itm => { itm._item = true; });\r\n\r\n // Se faccio dei raggruppamenti ignoro la paginazione\r\n if (this.est.UseArrayModePaging() && !allIfPossible) {\r\n\r\n // Se sono in modalità array ma la ricerca dipende da una view devo riallineare gli itemperpage\r\n let fakeView = this.est.SearchView();\r\n if (fakeView) {\r\n this.est.ArraymodeItemsPerPage.set(fakeView.itemsperpageoverride);\r\n this.est.arraymodePage = fakeView.page;\r\n this.est.arraymodePages = fakeView.pages;\r\n }\r\n // Devo chiamare il refresh page solo se vengo richiamato da un binding esterno\r\n else if (refreshPaging)\r\n this.refreshPaging(this.est.ArraymodeItemsPerPage());\r\n\r\n items = this.adaptViewToPaging();\r\n } else {\r\n items = this.est.View as any[];\r\n }\r\n }\r\n\r\n // Se voglio solo i selezionati filtro\r\n if (onlyselected)\r\n return items.filter(t => t._selected);\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Metodo per effettuare il refresh della paginazione sul cambiamento degli oggetti da visualizzare in una singola pagina.\r\n *\r\n * Vale solo per la modalità Array\r\n *\r\n * @param {number} pageSize Dimensione della pagina\r\n */\r\n public refreshPaging(pageSize: number) {\r\n this.est.ArraymodeItemsPerPage.set(pageSize);\r\n this.est.arraymodePages = Math.ceil((this.est.View as any[]).length / pageSize);\r\n this.est.arraymodePage = 1;\r\n\r\n // Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca\r\n this.est.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Ottiene gli oggetti in base alla sorgente\r\n */\r\n private getViewItemsBySource(): any[] {\r\n let castedView = this.est.View as AppSearch<any>;\r\n let groupKeys = castedView.groupings ? castedView.groupings.filter(t => !t.aggregation).length : 0;\r\n\r\n //Gruppi intermedi\r\n if ((castedView.requestedgroups?.length != groupKeys || castedView.requestedgroups?.length == 0) && groupKeys > 0) {\r\n let ret = castedView.groups;\r\n ret.forEach(itm => {\r\n\r\n // Setto variabile interna per capire che questo è in realtà un gruppo\r\n (<any>itm)._group = true;\r\n\r\n // Le informazioni passate come lista le metto dentro a una cache per velocizzarne l'accesso quando devo tirare fuori il display della proprietà\r\n this.utilities.cacheAggregations(itm);\r\n });\r\n return ret;\r\n }\r\n else {\r\n let ret = this.est.ItemSourceProperty() ? (this.est.View as any)[this.est.ItemSourceProperty()] : (this.est.View as any).items;\r\n if (!ret) ret = [];\r\n // Setto variabile interna per specificare che questo è un elemento normale, non un gruppo o altro\r\n ret.forEach(itm => { (<any>itm)._item = true; });\r\n return ret;\r\n }\r\n }\r\n\r\n /** Genera le informazioni di paginazione e taglia la View in modalità array per mostrare solo gli oggetti della pagina specificata */\r\n private adaptViewToPaging() {\r\n let tmpItems: any[] = [];\r\n\r\n // Se ho una search view l'array pulsanti viene calcolato da lei, non devo prendere quello della modalità array,\r\n // inoltre non ho bisogno di fare ragionamenti su quanti elementi ci sono e sulla pagina, dato che viene tutto gestito esternamente, \r\n // unendo al risultato della view tutti gli oggetti addizionali\r\n if (!this.est.SearchView())\r\n this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.arraymodePage, this.est.arraymodePages));\r\n else\r\n return this.est.View as any[];\r\n\r\n // Applico eventuali oridnamenti lato Array prima di tirare fuori la pagina selezionata\r\n let items = (this.est.View as any[]);\r\n if (this.est)\r\n items = this.arrayModeReviewOrderings(items);\r\n\r\n // Poi per tutti i valori dopo compresi fra la pagina - 1 e la pagina\r\n for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage()); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage(); i++) {\r\n if (i <= items.length - 1)\r\n tmpItems.push(items[i]);\r\n }\r\n\r\n return tmpItems;\r\n }\r\n\r\n /** Se in modalità array applica gli ordinamenti ASC-DESC delle colonne */\r\n public arrayModeReviewOrderings(items: any[]): any[] {\r\n let tmp = items;\r\n if (this.est.arrayOrders.length > 0)\r\n this.est.arrayOrders.forEach(t => {\r\n tmp = tmp.sort((a, b) => (a[t.id] > b[t.id] ? 1 : -1) * (t.order == 'DESC' ? -1 : 1));\r\n });\r\n return tmp;\r\n }\r\n}\r\n","// Handlers\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\n\r\n// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\n\r\n/** Classe che gestisce la modalità Report dell'es-table utilizzata nel Metering */\r\nexport class ReportModeHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler) { }\r\n\r\n /** Metodo che si occupa di gestire la grafica della tabella in base alle informazioni di ordinamento colonne e paginazione contenuti nel modello */\r\n public reviewReportBindings() {\r\n\r\n // Allineo le informazioni su eventuali ordinamenti fatti precedentemente\r\n if (this.est.View.orders && this.est.View.orders.length > 0) {\r\n this.est.View.orders.forEach(t => {\r\n this.est.View.report_columns.filter(c => c.id == t.column)[0].order = t.order;\r\n });\r\n }\r\n\r\n // Recupero il count precedente se serve\r\n let count = this.est.View.objectcount;\r\n if (count != -2)\r\n this.est.previousCount = count;\r\n else if (count == -2)\r\n count = this.est.previousCount;\r\n\r\n let ipp = (this.est.View.itemsperpageoverride || 15);\r\n this.est.View.pages = Math.ceil(count / ipp);\r\n this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.View.page, this.est.View.pages));\r\n }\r\n\r\n /**\r\n * Data una AppSearch questo metodo genera la lista di th e td che si possono collegare al giro standard.\r\n * Se non ci fosse questo passaggio intermedio la gestione della modalità report sarebbe 100% custom, \r\n * come poi lo era prima che la facessi passare dal giro che fanno tutte le altre modalità\r\n * \r\n * @param {AppSearch<any>} view View in modalità report contenente le informazioni sulle colonne\r\n * \r\n * @returns {{ ths: EsThDirective[], tds: EsTdDirective[] }} Lista di direttive per gli header e per il body\r\n */\r\n public generateThsAndTdsFromView(view: AppSearch<any>): { ths: EsThDirective[], tds: EsTdDirective[] } {\r\n var ret = { ths: [], tds: [] };\r\n\r\n // Ordinamento per ora commentato... non vorrebbe mi fuckappasse tutto\r\n //view.report_columns.sort((c1, c2) => c1.seq || 0 - c2.seq || 0);\r\n \r\n for (let i = 0; i < view.report_columns.length; i++) {\r\n let clm = view.report_columns[i];\r\n\r\n var th = new EsThDirective(null);\r\n th.th = clm.id;\r\n th.thStaticContent = clm.description || null;\r\n th.thBackgroundColor = clm.color;\r\n th.thAlignment = <\"Center\" | \"Left\" | \"Right\">clm.alignment;\r\n th.thFormat = clm.format;\r\n\r\n var td = new EsTdDirective(null);\r\n td.td = clm.id;\r\n td.tdPropertyAccessor = i.toString();\r\n td.tdAlignment = <\"Center\" | \"Left\" | \"Right\">clm.alignment;\r\n td.tdFormat = clm.format;\r\n\r\n ret.ths.push(th);\r\n ret.tds.push(td);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","import { GroupAggregation } from \"./GroupAggregation\";\r\n\r\n/** Classe che rappresenta un Gruppo con le proprie aggregazioni */\r\nexport class Group {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column ID della colonna raggruppata\r\n * @param {number} count Numero di elementi raggruppati sotto questa colonna\r\n * @param {string} value Valore del Gruppo\r\n */\r\n constructor(\r\n public column: string,\r\n public count: number,\r\n public value: string) {\r\n\r\n this.aggregations = [];\r\n }\r\n\r\n /** Aggregazioni presenti su questo gruppo, valide per tutte le altre colonne (non a loro volta gruppate) */\r\n public aggregations: GroupAggregation[];\r\n}","/** Classe che rappresenta un'aggregazione */\r\nexport class GroupAggregation {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} column ID della colonna aggregata\r\n * @param {'min' | 'max' | 'sum' } aggregation Aggregazione da effettuare su questa colonna\r\n * @param {string} value Valore dell'aggregazione\r\n */\r\n constructor(\r\n public column: string,\r\n public aggregation: 'min' | 'max' | 'sum',\r\n public value: string) { }\r\n}\r\n","/** Classe che rappresenta o un gruppo o una aggregazione su una colonna. Usata solo internamente */\r\nexport class GroupOrAggregation {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column Colonna su cui è presente o un gruppo o un'aggregazione\r\n * @param {'min' | 'max' | 'sum' } aggregation Aggregazione presente sulla **column**. Se questo campo è nullo significa che è un gruppo.\r\n * @param {'string' | 'date' | 'number'} datatype Tipo di dati contenuto nella colonna **column** se non c'è alcuna aggregazione è inutile, pertanto non sarà valorizzato\r\n */\r\n constructor(\r\n public column: string,\r\n public aggregation?: 'min' | 'max' | 'sum',\r\n public datatype?: 'string' | 'date' | 'number') { }\r\n}\r\n","import { AppSearch } from \"../externals/appsearch/AppSearch\";\r\nimport { GroupRouteFragment } from \"./GroupRouteFragment\";\r\n\r\n/** Classe che rappresenta un separatore da inserire fra gli oggetti dell'es-table per le operazioni di paginazione dei raggruppamenti per riga */\r\nexport class GroupPager {\r\n \r\n /**\r\n * Costruttore\r\n * \r\n * @param {number} _grouplevel Livello del gruppo a cui questo separatore fa riferimento\r\n * @param {string} _thisRoute Route che identifica la gerarchia del gruppo e chi sono i parent\r\n * @param {string} _parent Chiave del gruppo parent se esiste\r\n * @param {AppSearch<any>} view Vista di ricerca collegata a questo elemento\r\n * @param {'groups' | 'items'} searches Indica che cosa cerca questo separatore, se sottogruppi o oggetti\r\n */\r\n constructor(\r\n public _grouplevel: number,\r\n public _thisRoute: GroupRouteFragment[],\r\n public _parent: string,\r\n public view: AppSearch<any>,\r\n public searches: 'groups' | 'items') {\r\n\r\n this._sep = true;\r\n this.buttons = [];\r\n this._thisKey = _parent + \"_sep\";\r\n }\r\n\r\n /** Indica che è un separatore, sempre impostato a **true** */\r\n public _sep: boolean;\r\n /** Array dei pulsanti da collegare lato interfaccia per le paginazione */\r\n public buttons: any[];\r\n /** Chiave del separatore, è sempre **parent** + \"_sep\" */\r\n public _thisKey: string;\r\n}","/**\r\n * Classe che rappresenta un singolo frammento di route di un elemento gruppo o non. Un array di questi indica tutte le colonne di gruppo con i loro valori\r\n * per arrivare ad una ricerca su sottogruppi o elementi relativi\r\n */\r\nexport class GroupRouteFragment {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column Colonna di raggruppamento\r\n * @param {string} value Valore della colonna di raggruppamento\r\n */\r\n constructor(\r\n public column: string,\r\n public value: string) { }\r\n}","// Librerie\r\nimport { DateService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive / Componenti\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Modelli\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { Group } from \"../../domain/externals/appsearch/Group\";\r\nimport { GroupAggregation } from \"../../domain/externals/appsearch/GroupAggregation\";\r\nimport { GroupOrAggregation } from \"../../domain/externals/appsearch/GroupOrAggregation\";\r\nimport { GroupPager } from \"../../domain/internals/GroupPager\";\r\nimport { GroupRouteFragment } from \"../../domain/internals/GroupRouteFragment\";\r\nimport { ThAggregation } from \"../../domain/internals/ThAggregation\";\r\n\r\n// Utilities\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n/** Classe che gestisce la modalità Row Grouping dell'es-table */\r\nexport class RowGroupingHandler {\r\n\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi è il gruppo rappresentato */\r\n public rgGroupCache: Map<string, Group> = new Map<string, Group>();\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi sono gli oggetti sottostanti, non dei sottogruppi */\r\n public rgItemCache: Map<string, any[]> = new Map<string, any[]>();\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi sono gli oggetti sottostanti, non dei sottogruppi */\r\n public rgChildGroupsCache: Map<string, Group[]> = new Map<string, Group[]>();\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler, private dateExts: DateService) { }\r\n\r\n /**\r\n * In modalità rowgrouping quando mi arriva un nuovo blocco di oggetti devo aggiungerlo alla vista attuale:\r\n *\r\n * 1) Se non viene richiesto il dettaglio di alcun gruppo significa che devo considerare mi siano arrivati tutti i gruppi principali\r\n * 2) Se viene richiesto il dettaglio di un gruppo diverso dall'ultimo devo aggiungere dopo al gruppo cliccato la lista dei sottogruppi\r\n * 2) Se viene richiesto il dettaglio dell'ultimo gruppo devo aggiungere dopo al gruppo cliccato la lista degli oggetti\r\n *\r\n * @param {any} view AppSearch<T> da cui sono arrivati gli oggetti\r\n * @param {number} groupingKeys Livelli di raggruppamento da aspettarsi sui dati\r\n */\r\n public handleNewDataOnRowGrouping(view: AppSearch<any>, groupingKeys: number) {\r\n // 1) Se non viene richiesto il dettaglio di alcun gruppo significa che la chiamata restituisce la lista paginata dei gruppi principali.\r\n // Li tratto come se fosse una qualsiasi altra query paginata su N elementi\r\n if ((view.requestedgroups?.length || 0) == 0) {\r\n this.est.boundSource.set(this.est.TMPBoundSource);\r\n this.rgGroupCache = new Map<string, Group>();\r\n this.rgItemCache = new Map<string, any[]>();\r\n this.rgChildGroupsCache = new Map<string, Group[]>();\r\n\r\n this.est.TMPBoundSource.forEach(itm => {\r\n itm._thisRoute = itm._group ? [{ column: (<Group>itm).column, value: (<Group>itm).value }] : [];\r\n itm._thisKey = itm._group ? (<Group>itm).value : null;\r\n itm._grouplevel = 0;\r\n\r\n this.rgGroupCache.set(itm._thisKey, itm);\r\n });\r\n\r\n // Resetto la ricerca alla cache di questa \"sessione\"\r\n let firstItem = this.est.TMPBoundSource[0];\r\n this.est.MainGroupView = Object.assign({}, view);\r\n this.est.groupSearchRequestsCache = [{ path: '', route: [{ column: (<Group>firstItem).column, value: (<Group>firstItem).value }], view: this.est.MainGroupView, group_column: (<Group>this.est.TMPBoundSource[0]).column }];\r\n this.est.BaseItemsCount = view.objectcount;\r\n }\r\n else {\r\n // 2) Se viene richiesto il dettaglio di un qualsiasi gruppo diverso dall'ultimo vuol dire che devo aggiungere\r\n // dopo al gruppo che ho cliccato la lista dei gruppi tirata fuori questa volta (intermediateGroup = true)\r\n /*\r\n * GruppoA GruppoA\r\n * GruppoB GruppoB\r\n * GruppoC <- Clicco qui GruppoC\r\n * GruppoD GruppoC1\r\n * GruppoE GruppoC2\r\n * GruppoD\r\n * GruppoE\r\n */\r\n // 3) se i gruppi richiesti dalla view sono uguali ai gruppi presenti vuol dire che sto prendendo gli oggetti veri e propri, sono in\r\n // view.items e quindi in TMPBoundSource, ho inoltre le informazioni di paginazione **per il singolo sottogruppo** (intermediateGroup = false)\r\n /*\r\n * GruppoA GruppoA\r\n * GruppoC1 GruppoC1\r\n * GruppoB GruppoB\r\n * GruppoC GruppoC\r\n * GruppoC1 <-- Clicco qui GruppoC1\r\n * Oggetto1\r\n * Oggetto2\r\n * Oggetto3\r\n * GruppoC2 GruppoC2\r\n * GruppoD GruppoD\r\n * GruppoE GruppoE\r\n */\r\n let intermediateGroup = view.requestedgroups.length != groupingKeys;\r\n\r\n let items = this.est.boundSource();\r\n let insertIndex = 0;\r\n let insertGroup = null;\r\n let groupKey: string = \"\";\r\n let groupRoute: GroupRouteFragment[] = [];\r\n\r\n // Navigo la stuttura dei gruppi ignorando ricorsivamente tutti gli indici fino ai gruppi che mi interessano in modo da non beccare il primo \"GruppoC1\" del caso sopra\r\n for (let i = 0; i < view.requestedgroups.length; i++) {\r\n let rg = view.requestedgroups[i];\r\n groupKey += rg.value;\r\n groupRoute.push({ column: rg.column, value: rg.value });\r\n for (let i = insertIndex; i < items.length; i++) {\r\n let t = items[i];\r\n if (i >= insertIndex && t._group && t.column == rg.column && t.value == rg.value) {\r\n insertIndex = i; insertGroup = t;\r\n // Lo marco expanded dato che questo click sul gruppo potrebbe non essere stato fatto\r\n insertGroup._expanded = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let itemsCacheReference;\r\n let childGroupsCacheReference;\r\n\r\n // Se non è un gruppo intermedio devo ripulire la cache del gruppo su cui ho attualmente cliccato. Gli oggetti saranno riaggiunti dopo\r\n if (!intermediateGroup) {\r\n this.rgItemCache.set(groupKey, []);\r\n itemsCacheReference = this.rgItemCache.get(groupKey);\r\n }\r\n else {\r\n // Se invece è un gruppo intermedio devo ripulire sia tutti i child group ricorsivamente, sia tutti gli item\r\n for (let key of this.rgChildGroupsCache.keys())\r\n if (key.startsWith(groupKey))\r\n this.rgChildGroupsCache.delete(key);\r\n\r\n for (let key of this.rgItemCache.keys())\r\n if (key.startsWith(groupKey))\r\n this.rgItemCache.delete(key);\r\n\r\n this.rgChildGroupsCache.set(groupKey, []);\r\n childGroupsCacheReference = this.rgChildGroupsCache.get(groupKey);\r\n }\r\n\r\n // Assegno un livello ai valori che arrivano da usare per formattare la parte grafica. Il primo gruppo cliccato sarà a livello 1,\r\n // il secondo sarà a livello 2 e così via...\r\n // Li marco inoltre con il parent in modo da poter eliminare i vecchi qualora servisse\r\n this.est.TMPBoundSource.forEach(itm => {\r\n itm._parent = groupKey;\r\n itm._parentRoute = groupRoute;\r\n itm._thisRoute = itm._group ? [...groupRoute, new GroupRouteFragment((<Group>itm).column, (<Group>itm).value)] : [];\r\n itm._thisKey = itm._group ? groupKey + (<Group>itm).value : groupKey;\r\n\r\n // Per le ricerca intermedie metto i gruppi nella cache dei gruppi\r\n if (intermediateGroup) {\r\n itm._grouplevel = view.requestedgroups.length;\r\n this.rgGroupCache.set(itm._thisKey, itm);\r\n childGroupsCacheReference.push(itm);\r\n }\r\n else {\r\n // Metto anche gli oggetti nella cache non ricorsiva\r\n itemsCacheReference.push(itm);\r\n }\r\n });\r\n\r\n let bs = this.est.boundSource();\r\n // Elimino gli oggetti vecchi\r\n // 1) Ricerca intermedia, stato salvato - Elimino tutti gli item e tutti i gruppi la cui route è più lunga della corrente, tutti gli item relativi alla path corrente, e tutte\r\n // le cache di ricerca effettuate su una path più profonda dell'attuale\r\n // 2) Ricerca finale o ricerca intermedia senza stato salvato - Elimino tutti gli item relativi alla path corrente\r\n // Per \"stato salvato\" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse\r\n if (intermediateGroup && view.savedstate) {\r\n bs = bs.filter(t => !(t._item || t._thisRoute.length > groupRoute.length));\r\n this.est.groupSearchRequestsCache = this.est.groupSearchRequestsCache.filter(t => !(t.route.length > groupRoute.length));\r\n }\r\n else if (intermediateGroup)\r\n {\r\n // Se invece lo stato non è salvato vuol dire che c'è stato un cambio di pagina interno ad un gruppo già aperto:\r\n // - Elimino tutti gli elementi riconducibili a questo gruppo che erano già presenti\r\n bs = bs.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));\r\n }\r\n\r\n bs = bs.filter(t => !(t._parent == groupKey));\r\n\r\n let thisGroup = bs[insertIndex];\r\n if (intermediateGroup)\r\n thisGroup._groupscount = (<AppSearch<any>>this.est.View)?.groupcount;\r\n\r\n // Li sostituisco coi nuovi di questa ricerca\r\n bs.splice(insertIndex + 1, 0, ...this.est.TMPBoundSource);\r\n\r\n // Aggiungo un separatore alla fine o all'inizio di questi gruppi che dovrà occuparsi di caricare ALTRI gruppi o oggetti (se sono all'ultimo gruppo)\r\n let addLast = false;\r\n bs.splice(insertIndex + 1 + (addLast ? this.est.TMPBoundSource.length : 0), 0, this.getGroupSeparator(view, groupKey, groupRoute, view.requestedgroups.length, intermediateGroup ? 'groups' : 'items'));\r\n\r\n this.est.boundSource.set(bs);\r\n\r\n // Aggiungo la ricerca alla cache di questa \"sessione\"\r\n let toAdd = { path: groupKey, route: groupRoute, view: Object.assign({}, view), group_column: intermediateGroup ? (<Group>this.est.TMPBoundSource[0]).column : '' };\r\n let prev = this.est.groupSearchRequestsCache.findIndex(t => t.path == toAdd.path && t.group_column == toAdd.group_column);\r\n if (prev == -1)\r\n this.est.groupSearchRequestsCache.push(toAdd);\r\n\r\n else\r\n this.est.groupSearchRequestsCache.splice(prev, 1, toAdd);\r\n }\r\n }\r\n\r\n /**\r\n * Se in modalità array applica i raggruppamenti definiti lato row-grouping\r\n *\r\n * @param {ths: EsThDirective[]} ths Header\r\n */\r\n public arrayModeReviewGroupings(ths: EsThDirective[]) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n let headerGroups: Group[] = [];\r\n let headerAggregations: GroupOrAggregation[] = [];\r\n\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i] as EsThDirective;\r\n\r\n if (th.thGroup)\r\n headerGroups.push(new Group(th.th, 0, \"\"));\r\n else if (th.thAggregation)\r\n headerAggregations = [...headerAggregations, ...this.getGroupAggregations(th)];\r\n }\r\n\r\n if (headerGroups.length > 0) {\r\n // Pulizia delle cache\r\n this.rgGroupCache.clear();\r\n this.rgItemCache.clear();\r\n this.rgChildGroupsCache.clear();\r\n\r\n this.est.ArrayGrouping.set(true);\r\n this.est.boundSource.set(this.getGroupsRecursive(headerGroups, 0, this.est.boundSource(), headerAggregations, null));\r\n }\r\n }\r\n\r\n /**\r\n * Data una direttiva EsTh restituisce la lista delle aggregazioni richiesta per questa colonna o il gruppo che rappresenta\r\n *\r\n * @param {EsThDirective} th Direttiva\r\n *\r\n * @returns {GroupOrAggregation[]} Lista dei gruppi o aggregazioni relativi alla Direttiva passata\r\n */\r\n public getGroupAggregations(th: EsThDirective): GroupOrAggregation[] {\r\n let ret = [];\r\n // Es: '{min:dd/MM/yyyy} - {max:dd/MM/yyyy}'\r\n if (th.thAggregation) {\r\n this.getEsThDirectiveListOfAggregations(th).forEach((agg: ThAggregation) => {\r\n let isdate = agg.format && ['small', 'long', 'verylong'].includes(agg.format);\r\n let isnumber = agg.format && agg.format.startsWith(\"F\") && !Number.isNaN(agg.format.charAt(1)) && agg.format.length == 2;\r\n\r\n if (!isdate && !isnumber && agg.format)\r\n throw \"Le aggergazioni supportate dall'es-table sono solo 'small', 'long', 'verylong' per le date e 'F0-9' per i numeri\";\r\n\r\n ret.push(new GroupOrAggregation(th.th, agg.func, isdate ? 'date' : isnumber ? 'number' : 'string'));\r\n });\r\n }\r\n else if (th.thGroup)\r\n ret.push(new GroupOrAggregation(th.th, null));\r\n\r\n return ret;\r\n }\r\n\r\n\r\n /**\r\n * Data una direttiva con un formato restituisce tutte le coppie Funzione di Aggregazione - Formato\r\n *\r\n * @param {EsThDirective} th Direttiva EsTh di cui calcolare le funzioni di aggregazione usate\r\n *\r\n * @returns {{ func: string, format: string }[]} Lista delle funzioni di aggregazione rilevate\r\n */\r\n private getEsThDirectiveListOfAggregations(th: EsThDirective): ThAggregation[] {\r\n if (!th.thAggregation)\r\n return [];\r\n\r\n // Se ho già effettuato questo calcolo per questo th restituisco la versione in cache\r\n if (th._thAggregations)\r\n return th._thAggregations;\r\n\r\n let ret = [];\r\n let display = th.thAggregation;\r\n var matches = display.match(/{[a-zA-Z0-9\\/:]*}/gi);\r\n if (!matches)\r\n return [];\r\n matches.forEach(m => {\r\n let split = m.split(\":\");\r\n let func = m, format = \"\";\r\n if (split.length > 0) {\r\n // Escludo primo e ultimo carattere (le graffe)\r\n func = split[0].substr(1);\r\n format = split[1].substr(0, split[1].length - 1);\r\n }\r\n\r\n ret.push({ func: <'min' | 'max' | 'sum'>func, format: format, match: m });\r\n });\r\n\r\n th._thAggregations = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Data la definizione dei gruppi da generare da una lista di oggetti, suddivide gli oggetti passati in gruppi e sottogruppi\r\n *\r\n * @param {Group[]} grps Definizione dei gruppi\r\n * @param {number} currentIndex Indice di elaborazione. Al livello 0 ho tutti gli oggetti e devo generare i primi gruppi, a livello 1 ho tutti i gruppi principali e devo\r\n * elaborare i sottogruppi, e così via ricorsivamente...\r\n * @param {any[]} items Oggetti da raggruppare\r\n * @param {GroupOrAggregation[]} aggregations Info di aggregazione\r\n * @param {any} parent Riferimento al gruppo padre\r\n */\r\n private getGroupsRecursive(grps: Group[], currentIndex: number, items: any[], aggregations: GroupOrAggregation[], parent?: any): any[] {\r\n // Se l'indice è 0 devo sicuramente nascondere tutti gli oggetti. Solo i gruppi saranno visualizzati\r\n if (currentIndex == 0)\r\n items.forEach(i => i._visible = false);\r\n\r\n let grp = grps[currentIndex];\r\n let ret: any[] = [];\r\n let last = grps.length == currentIndex + 1;\r\n let groups = this.utilities.groupBy(items, grp.column);\r\n for (let prop in groups) {\r\n let itms = groups[prop];\r\n let gp = new Group(grp.column, itms.length, prop);\r\n gp.aggregations = this.generateAggregations(itms, aggregations);\r\n\r\n let anygp = (<any>gp);\r\n anygp._group = true;\r\n anygp._expanded = false;\r\n if (!parent) {\r\n anygp._thisRoute = [{ column: gp.column, value: gp.value }];\r\n anygp._thisKey = gp.value;\r\n anygp._grouplevel = 0;\r\n }\r\n else {\r\n anygp._parent = parent._thisKey;\r\n anygp._parentRoute = parent._thisRoute;\r\n anygp._thisRoute = [...parent._thisRoute, { column: gp.column, value: gp.value }];\r\n anygp._thisKey = parent._thisKey + gp.value;\r\n anygp._grouplevel = parent._grouplevel + 1;\r\n }\r\n\r\n // Pusho il gruppo, tutti i gruppi del livello sotto, o gli item se io sono l'ultimo gruppo.\r\n // La visibilità è solo per il gruppo a livello 0, tutti gli altri gruppi saranno mostrati o nascosti di conseguenza\r\n if (currentIndex == 0)\r\n anygp._visible = true;\r\n\r\n this.utilities.calculateHash([anygp]);\r\n this.utilities.cacheAggregations(anygp);\r\n\r\n // Aggiungo il gruppo padre\r\n ret.push(anygp);\r\n this.rgGroupCache.set(anygp._thisKey, anygp);\r\n if (!last) {\r\n\r\n //Dal gruppo padre, se non è l'ultimo gruppo della catena, calcolo ricorsivamente tutta la catena sotto\r\n let subGroupsAndItems = this.getGroupsRecursive(grps, currentIndex + 1, itms, aggregations, anygp);\r\n let childgroups = subGroupsAndItems.filter(t => t._group && t._parent == anygp._thisKey);\r\n anygp._groupscount = childgroups.length;\r\n\r\n // Aggiungo la catena del gruppo sotto, aggiungendo alla cache solo i gruppi padre\r\n ret.push(...subGroupsAndItems);\r\n this.rgChildGroupsCache.set(anygp._thisKey, childgroups);\r\n }\r\n else {\r\n // Al gruppo padre, se è l'ultimo assegno tutte le foglie assegnandogli anche la chiave del gruppo\r\n itms.forEach(i => i._thisKey = anygp._thisKey);\r\n\r\n ret.push(...itms);\r\n this.rgItemCache.set(anygp._thisKey, itms);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Data una lista di oggetti genera le aggregazioni specificate. Si considera di avere tutti gli oggetti\r\n *\r\n * @param {any[]} items Oggetti di cui calcolare le aggregazione\r\n * @param {GroupOrAggregation[]} aggregations Aggergazioni da generare\r\n */\r\n private generateAggregations(items: any[], aggregations: GroupOrAggregation[]): GroupAggregation[] {\r\n let rets: GroupAggregation[] = [];\r\n let aggregationValue = \"\", feField = null, stringAgg = null, dateAgg = null, numberAgg = null;\r\n\r\n for (let i = 0; i < aggregations.length; i++) {\r\n let agg = aggregations[i];\r\n feField = agg.column;\r\n if (!feField)\r\n continue;\r\n\r\n switch (agg.datatype) {\r\n case 'string': stringAgg = items.map(i => i[feField].toString()); break;\r\n case 'date': dateAgg = items.map(i => new Date(i[feField]).getTime()); break;\r\n case 'number': numberAgg = items.map(i => parseFloat(i[feField])); break;\r\n }\r\n\r\n switch (agg.aggregation) {\r\n case 'max':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.sort().reverse()[0]; break;\r\n case 'date': aggregationValue = new Date(Math.max(...dateAgg)).toString(); break;\r\n case 'number': aggregationValue = Math.max(...numberAgg).toString(); break;\r\n }\r\n break;\r\n case 'min':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.sort()[0]; break;\r\n case 'date': aggregationValue = new Date(Math.min(...dateAgg)).toString(); break;\r\n case 'number': aggregationValue = Math.min(...numberAgg).toString(); break;\r\n }\r\n break;\r\n case 'sum':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.join(\", \"); break;\r\n case 'date': aggregationValue = \"\"; break;\r\n case 'number': aggregationValue = numberAgg.reduce((pre, curr) => pre + curr, 0).toString(); break;\r\n }\r\n break;\r\n }\r\n rets.push(new GroupAggregation(agg.column, agg.aggregation, aggregationValue));\r\n }\r\n\r\n return rets;\r\n }\r\n\r\n /**\r\n * Ottiene un elemento di separazione fra Gruppi che serve per paginare le ricerche all'interno di ogni singolo gruppo\r\n *\r\n * @param {AppSearch<any>} view View utilizzata per la ricerca. Me ne salvo i parametri nel separatore attuale dato che ne ho bisogno per caricare altri elementi\r\n * facenti riferimento allo stesso contesto\r\n * @param {string} parent Parent path che rappresenta a quale gruppo è affibbiato questo separatore\r\n * @param {GroupRouteFragment[]} route Route path che rappresenta a quale gruppo è affibbiato questo separatore\r\n * @param {number} level Livello del gruppo di cui questo elemento è separatore, viene usato per applicare la classe \"est-lvl-{{level}}\"\r\n *\r\n * @returns {any} Elemento di separazione contenente tutti i bind per presentare una paginazione sotto questo gruppo lato interfaccia\r\n */\r\n public getGroupSeparator(view: AppSearch<any>, parent: string, route: GroupRouteFragment[], level: number, searches: 'groups' | 'items'): GroupPager {\r\n let item = new GroupPager(level, route, parent, Object.assign({}, view), searches);\r\n item.buttons = this.utilities.getPagesArray(6, view.page, view.pages);\r\n this.utilities.calculateHash([item]);\r\n return item;\r\n }\r\n\r\n\r\n /**\r\n * Data una colonna effettua la riemissione di tutte le ricerche relative.\r\n *\r\n * Es. Ho 2 campi di gruppo e ho espanso fino a vedere i valori fino ad un livello qualsiasi.\r\n * Clicco l'ordinamento sul secondo gruppo.\r\n * Tutte le ricerche relative ai primi gruppi devono essere rieseguite. Quando i risultati arriveranno ci penserà il metodo **bindDisplayToLoadedItemsOrGroups**\r\n * a tagliare via gli oggetti non più visualizzati\r\n *\r\n * @param {string} column Colonna su cui si è effettuata un'operazione di ordinamento\r\n * @param {AppOrdering[]} orderings Direttive di ordinamento da applicare alle varie sottoricerche\r\n */\r\n public emitRowGroupingSearches(column: string, orderings: AppOrdering[]) {\r\n // Per tutte le ricerche intermedie che devo rivalutare le re-emitto in modo da aggiornargli i dati\r\n var meaningfulAppSearches = this.est.groupSearchRequestsCache.filter(t => t.group_column == column).map(t => t.view);\r\n\r\n // Se non ne trovo significa che ho fatto l'ordinamento o sugli item, o su colonne relative a un sottogruppo non caricato\r\n if (!meaningfulAppSearches || meaningfulAppSearches.length == 0)\r\n meaningfulAppSearches = this.est.groupSearchRequestsCache.filter(t => !t.group_column).map(t => t.view);\r\n\r\n // Se non ne trovo qui significa che sto ordinando su colonne relative a un sottogruppo non caricato\r\n if (!meaningfulAppSearches || meaningfulAppSearches.length == 0)\r\n return;\r\n\r\n meaningfulAppSearches.forEach(as => {\r\n // Ovviamente gli oridnamenti devono essere quelli appena generati\r\n as.orders = orderings;\r\n as.savedstate = true;\r\n this.est.emitSearchRequest(false, as);\r\n });\r\n }\r\n\r\n /**\r\n * Helper che calcola il contenuto di una cella relativa a un gruppo riga, tenendo conto del formato delle eventuali aggregazioni\r\n *\r\n * @param {Group} grp Gruppo di cui mostrare le celle\r\n * @param {string} cell Cella attuale di cui calcolare il testo\r\n * @param {EsThDirective} header Header relativo alla cella attuale, utilizzata per identificare le informazioni di aggregazione\r\n *\r\n * @returns {string} Testo finale calcolato per la **cell** corrente, in base alle aggregazioni di **header**\r\n */\r\n public getGroupCellDisplay(grp: Group, cell: string, header: EsThDirective): string {\r\n if ((<any>grp)._sep)\r\n return \"\";\r\n let display = header.thAggregation;\r\n if (grp.column == cell) {\r\n let groupsPart = (<any>grp)._groupscount ? \" - \" + (<any>grp)._groupscount + \" \" + this.est.lc.loc(\"Groups\") : \"\";\r\n return grp.value + \" (\" + grp.count + groupsPart + \")\";\r\n }\r\n else {\r\n\r\n let agg = (<Map<string, Map<string, string>>>(<any>grp)._aggregationsCache).get(cell);\r\n if (!agg)\r\n return \"\";\r\n\r\n this.getEsThDirectiveListOfAggregations(header).forEach((itm: ThAggregation) => {\r\n display = display.replace(itm.match, this.formatAggregationValue(agg.get(itm.func), itm.format));\r\n });\r\n\r\n return display;\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che dato un valore lo formatta in base al tipo\r\n *\r\n * @param {string} value Valore che generalemnte può essere una data o un numero\r\n * @param {string} fromat Formato su cui formattare il valore. Può essere ad esempio \"small\", \"long\" \"verylong\" per le date o F{0-9} per i numeri decimali\r\n *\r\n * @returns {string} Valore dell'aggregazione formattato come si deve\r\n */\r\n private formatAggregationValue(value: string, format?: string): string {\r\n if (!format)\r\n return value;\r\n\r\n let isNumber = !Number.isNaN(value) && (!format || format.startsWith(\"F\"));\r\n\r\n if (isNumber && format.startsWith(\"F\") && !Number.isNaN(format.substr(1)))\r\n return parseFloat(value).toFixed(parseInt(format.substr(1)));\r\n\r\n let date = null;\r\n // Alcune versione di extensions rischiano di crashare con cose non date... è stato risolto dopo quindi questo try - catch in realtà\r\n // torna utile solo con versioni vecchie/deprecate della libreria @esfaenza/extensions\r\n try { date = this.dateExts.getDateConvertion(value); } catch { }\r\n\r\n if (date)\r\n return this.dateExts.getFormatted(date, format == 'small', format == 'verylong');\r\n\r\n // Qui ci finisco sia per input che non sono né date né numeri, sia per formati non riconosciuti\r\n return value;\r\n }\r\n}","/** Rappresenta un trittico formato da un array e due cache relative a tale array per un accesso estremamente veloce per tutte le operazioni del caso */\r\nexport class CacheTriptic {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {Map<string, any>} cache Cache Chiave-Oggetto\r\n * @param {Map<string, number>} index_cache Cache Indice-Oggetto\r\n * @param {any[]} array Array contenente gli oggetti\r\n */\r\n constructor(\r\n public cache: Map<string, any>,\r\n public index_cache: Map<string, number>,\r\n public array: any[]) { }\r\n}","// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { ItemsSelection } from \"../../domain/externals/appsearch/ItemsSelection\";\r\nimport { CacheTriptic } from \"../../domain/internals/CacheTriptic\";\r\nimport { ItemPropEditableReference } from \"../../domain/externals/ItemPropEditableReference\";\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { InputType } from '../../domain/types';\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Direttive \r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Handlers\r\nimport { RowGroupingHandler } from \"./RowGroupingHandler\";\r\n\r\n/**\r\n * Dichiarazione della variabile globale dayjs. L'onere di \"crearla\" è affidato all'applicazione che utilizza questa libreria, \r\n * che dovrà importare lo script globale di dayjs nella CLI\r\n */\r\n declare var dayjs: any;\r\n\r\n/** Classe che gestisce le selezioni degli oggetti */\r\nexport class SelectionHandler {\r\n\r\n /** Cache di selezione Hash - Oggetto per la variabile **items** dell'itemSelector. Facilita le operazioni di lookup via hash*/\r\n private itemsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **groups** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private groupsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **exclusions** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private exclusionsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **group_exclusions** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private group_exclusionsCache: Map<string, any> = new Map();\r\n\r\n /** Cache di selezione Hash - Oggetto per la variabile **items** dell'itemSelector. Facilita le operazioni di lookup via indice*/\r\n private i_itemsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **groups** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_groupsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **exclusions** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_exclusionsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **group_exclusions** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_group_exclusionsCache: Map<string, number> = new Map();\r\n\r\n /** Ultima cella selezionata singolarmente */\r\n private lastSingleSelection?: { row: number, column: number };\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private rgHandler: RowGroupingHandler) { }\r\n\r\n /** Ripulisce le cache di selezione */\r\n public clearSelectionCaches() {\r\n this.itemsCache.clear();\r\n this.groupsCache.clear();\r\n this.exclusionsCache.clear();\r\n this.group_exclusionsCache.clear();\r\n\r\n this.i_itemsCache.clear();\r\n this.i_groupsCache.clear();\r\n this.i_exclusionsCache.clear();\r\n this.i_group_exclusionsCache.clear();\r\n }\r\n\r\n /**\r\n * Valuta quali elementi devono essere marcati come selezionati nella vista attuale. Si basa sull'oggetto **selection** interno all'AppSearch\r\n *\r\n * @param {any[]} items Oggetti di cui valutare la selezione\r\n * @param {ItemsSelection<any>} selectionItem Oggetti di selezione derivante dalla view o dall'oggetto per Array\r\n */\r\n public evaluateSelection(items: any[], selectionItem: ItemsSelection<any> | null | undefined) {\r\n if (!selectionItem)\r\n return;\r\n\r\n this.handleSelectionEvaluation(items, selectionItem);\r\n }\r\n\r\n /**\r\n * Precompila le informazioni sullo stato di selezione tutto a false per le celle della tabella\r\n * \r\n * @param {any[]} items Oggetti attualmente bindati sulla tabella\r\n * @param {EsThDirective[]} ths Colonne su cui gli oggetti sono bindati\r\n */\r\n public evaluateSingleCellSelection(items: any[], ths: EsThDirective[], dyn: EsTableColumnsDefinition[]) {\r\n for (let i = 0; i < items.length; i++) {\r\n // items[i]._ordinal dovrebbe essere uguale a \"i\" ma dato che lato HTML il ciclo è esterno e non ho l'indice per convenzione mi baso sull'_ordinal\r\n this.est.selectionStatus[items[i]._ordinal] = {};\r\n if (dyn && dyn.length > 0)\r\n this.fillSelectionStatusByDynamicColumns(items[i], dyn);\r\n else\r\n this.fillSelectionStatusByEsThs(items[i], ths);\r\n \r\n }\r\n }\r\n \r\n /** @ignore */\r\n private fillSelectionStatusByDynamicColumns(item: any, dyn: EsTableColumnsDefinition[]){\r\n for (let k = 0; k < dyn.length; k++) {\r\n let th = dyn[k];\r\n let iper: ItemPropEditableReference = { selected: false, value: th.PropertyName ? item.properties[th.PropertyName] : \"Undefined Property\", type: th.PropertyType, property: th.PropertyName, header: th.PropertyName, item: item };\r\n this.est.selectionStatus[item._ordinal][k] = iper;\r\n\r\n // Funzione assegnata dopo in modo da poterle fare anche aggiornare il valore del riferimento all'oggetto di selezione\r\n iper.val_setter = (value: string): any => {\r\n if (!th.PropertyName) {\r\n item[th.PropertyName] = value;\r\n iper.value = value;\r\n return value;\r\n }\r\n\r\n let valToApply = \"\";\r\n switch (th.PropertyType) {\r\n case \"string\":\r\n if (value.startsWith && value.startsWith('\"') && value.endsWith && value.endsWith('\"'))\r\n valToApply = value.substring(1, value.length - 1);\r\n else\r\n valToApply = value;\r\n break;\r\n\r\n case \"number\":\r\n case \"int\":\r\n case \"boolean\":\r\n case \"enum\":\r\n case \"autocomplete\":\r\n case \"float\":\r\n case \"currency\":\r\n valToApply = value;\r\n break;\r\n\r\n case \"date\":\r\n case \"datetime\":\r\n valToApply = this.est.dateExts.getDateConvertion(value);\r\n break;\r\n case \"time\":\r\n let mydate = this.est.dateExts.getDateConvertion(value);\r\n valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`\r\n break;\r\n // Per evitare di sbiancare senza senso\r\n default:\r\n valToApply = value;\r\n break;\r\n }\r\n item.properties[th.PropertyName] = valToApply;\r\n iper.value = valToApply;\r\n return valToApply;\r\n }\r\n }\r\n }\r\n\r\n /** @ignore */\r\n private fillSelectionStatusByEsThs(item: any, ths: EsThDirective[]) {\r\n for (let k = 0; k < ths.length; k++) {\r\n let th = ths[k];\r\n let iper: ItemPropEditableReference = { selected: false, value: th.thProperty ? item[th.thProperty] : \"Undefined Property\", type: th.thType, property: th.thProperty, header: th.th, item: item };\r\n this.est.selectionStatus[item._ordinal][k] = iper;\r\n\r\n // Funzione assegnata dopo in modo da poterle fare anche aggiornare il valore del riferimento all'oggetto di selezione\r\n iper.val_setter = (value: string): any => {\r\n if (!th.thProperty) {\r\n iper.value = value;\r\n return value;\r\n }\r\n\r\n let valToApply = \"\";\r\n switch (th.thType) {\r\n case \"string\":\r\n if (value.startsWith('\"') && value.endsWith('\"'))\r\n valToApply = value.substring(1, value.length - 1);\r\n else\r\n valToApply = value;\r\n break;\r\n\r\n case \"number\":\r\n case \"int\":\r\n case \"boolean\":\r\n case \"enum\":\r\n case \"autocomplete\":\r\n case \"float\":\r\n case \"currency\":\r\n valToApply = value;\r\n break;\r\n\r\n case \"date\":\r\n case \"datetime\":\r\n valToApply = this.est.dateExts.getDateConvertion(value);\r\n break;\r\n case \"time\":\r\n let mydate = this.est.dateExts.getDateConvertion(value);\r\n valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`\r\n break;\r\n \r\n // Per evitare di sbiancare senza senso\r\n default:\r\n valToApply = value;\r\n break;\r\n }\r\n item[th.thProperty] = valToApply;\r\n iper.value = valToApply;\r\n return valToApply;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implementazione agnostica della valutazione delle selezioni degli oggetti. Richiede gli oggetti della vista attuale e l'itemSelector\r\n *\r\n * @param {any[]} items Oggetti di cui aggiornare lo stato di selezione\r\n * @param {ItemsSelection<any>} selectionItem Oggetto contenente lo stato attuale di selezione\r\n */\r\n private handleSelectionEvaluation(items: any[], selectionItem: ItemsSelection<any>) {\r\n for (let i = 0; i < items.length; i++) {\r\n let itm = items[i];\r\n let hash = itm._hash;\r\n let itemGroup = itm._group ? null : this.getItemGroup(itm);\r\n // Reidrato la cache di selezione coi nuovi oggetti altrimenti non riuscirei a beccare gli indici giusti\r\n // Dopodiché la uso per calcolare istantaneamente se gli oggetti sono selezionati o no\r\n this.rehidrateCache(itm);\r\n\r\n if (itm._item) {\r\n if (selectionItem.all)\r\n itm._selected = !this.exclusionsCache.has(hash) && ((!this.groupsCache.has(itemGroup?._hash) && this.itemsCache.has(hash)) || !this.group_exclusionsCache.has(itemGroup?._hash));\r\n else\r\n itm._selected = !this.exclusionsCache.has(hash) && (this.groupsCache.has(itemGroup?._hash) || this.itemsCache.has(hash) || (this.parentTreeStatus(itemGroup) == 'included' && !this.group_exclusionsCache.has(itemGroup?._hash)));\r\n }\r\n else if (itm._group) {\r\n if (selectionItem.all)\r\n itm._selected = !this.group_exclusionsCache.has(hash) && this.parentTreeStatus(itm) != 'excluded';\r\n else\r\n itm._selected = this.groupsCache.has(hash) || (this.parentTreeStatus(itm) == 'included' && !this.group_exclusionsCache.has(hash));\r\n }\r\n }\r\n\r\n // Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true\r\n // Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni\r\n this.est.globalCheck.set(this.est.boundSource().length > 0 && this.est.boundSource().filter(t => t._group || t._item).every(t => t._selected));\r\n this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());\r\n\r\n // Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella\r\n // Comunque costa 0 quindi mi permetto di refreshare\r\n if (this.est.arrayMode()) {\r\n let prevSelected = this.est.selectedObjects();\r\n this.finalizeSelectionInformations(selectionItem);\r\n if (this.est.selectedObjects() != prevSelected)\r\n this.est.onSelectionChanged.emit(selectionItem);\r\n }\r\n }\r\n\r\n /**\r\n * Dato un oggetto trova la cella di cache in cui è registrato e aggiorna il contenuto\r\n * \r\n * @param {any} item Oggetto da aggiornare\r\n */\r\n private rehidrateCache(item: any) {\r\n let ctx = item._hash;\r\n if (this.itemsCache.has(ctx))\r\n this.itemsCache.set(ctx, item);\r\n\r\n if (this.group_exclusionsCache.has(ctx))\r\n this.group_exclusionsCache.set(ctx, item);\r\n\r\n if (this.groupsCache.has(ctx))\r\n this.groupsCache.set(ctx, item);\r\n\r\n if (this.exclusionsCache.has(ctx))\r\n this.exclusionsCache.set(ctx, item);\r\n }\r\n\r\n /**\r\n * Dato un gruppo controlla ricorsivamente l'albero di cui fa parte se c'è stata una inclusione o esclusione diretta\r\n * \r\n * @param {any} grp Gruppo da controllare\r\n * \r\n * @returns {'none' | 'excluded' | 'included'} \r\n * 'none' se non ci sono informazioni su inclusioni o esclusioni \r\n * 'included' se il gruppo controllato è stato incluso in maniera esplicita dall'albero dei gruppi padri\r\n * 'excluded' se il gruppo controllato è stato escluso in maniera esplicita dall'albero dei gruppi padri\r\n */\r\n private parentTreeStatus(grp: any): 'none' | 'excluded' | 'included' {\r\n if (!grp)\r\n return 'none';\r\n\r\n let parentGroup: any = this.rgHandler.rgGroupCache.get(grp._parent);\r\n\r\n if (!parentGroup)\r\n return 'none';\r\n\r\n if (this.group_exclusionsCache.has(parentGroup._hash))\r\n return 'excluded';\r\n\r\n if (this.groupsCache.has(parentGroup._hash))\r\n return 'included';\r\n\r\n return this.parentTreeStatus(parentGroup);\r\n }\r\n\r\n\r\n /**\r\n * Helper per gestire la selezione di N elementi utilizzando la Cache di selezione ed eventualmente aggiornando il concetto di \"all selection\"\r\n *\r\n * Vunziona sia in modalità Array che in modalità View Semplice o View Avanzata (con le Custom Cells)\r\n *\r\n * @param {any[]} items Oggetti da selezionare o deselezionare\r\n * @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti\r\n * @param {boolean} globalCheck Valore del check globale\r\n *\r\n * @returns {ItemsSelection<any>} Oggetto di selezione aggiornato con le informazioni sull'ultima operazione effettuata\r\n */\r\n public handleItemsSelection(items: any[], forcedVal: boolean | null = null, globalCheck: boolean | null = null): ItemsSelection<any> {\r\n let si = (this.est.View as AppSearch<any>)?.selection || this.est.arraymodeSelection;\r\n\r\n // Se sono in modalità di selezione singola e devo selezionare un'oggetto, per prima cosa devo deselezionare tutti gli altri\r\n if (this.est.SingleSelection() && items[0]?._selected && !items[0]?._group) {\r\n if (items.length > 1 && forcedVal == null)\r\n throw \"Tentativo di selezionare o deselezionare più di un elemento con SingleSelection attivo\";\r\n\r\n if (items.length == 1 && forcedVal == null) {\r\n si = this.handleItemsSelection(this.est.boundSource().filter(t => !t._group), false, null);\r\n items[0]._selected = true;\r\n }\r\n }\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n let item = items[i];\r\n let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck() : false;\r\n\r\n // Se dev'essere overridato il valore di check effettuo l'override o col valore forzato o col valore globale\r\n if (toChange && !item.locked)\r\n item._selected = forcedVal != null ? forcedVal : this.est.globalCheck();\r\n\r\n // Se il valore non dev'essere variato e vengo da una selezione globale semplicemente evito di effettuare operaizoni inutili. L'item/gruppo è già nello stato giusto\r\n if (!toChange && globalCheck != null)\r\n continue;\r\n\r\n let allSelection = si.all;\r\n let isGroup = item._group;\r\n let isSelection = item._selected;\r\n let itemGroup = null, allItems = null, selectedItems = null, unselectedItems = null, allGroups = null, selectedGroups = null, unselectedGroups = null, parentGroupSelected = null, parentGroupUnselected = null;\r\n\r\n if (isGroup) {\r\n let pts = this.parentTreeStatus(item);\r\n parentGroupSelected = pts == 'included';\r\n parentGroupUnselected = pts == 'excluded';\r\n allItems = this.getGroupItems(si, item, undefined, true);\r\n selectedItems = this.getGroupItems(si, item, 'selected', true, allItems);\r\n unselectedItems = this.getGroupItems(si, item, 'unselected', true, allItems);\r\n allGroups = this.getGroupChildGroups(si, item, undefined, true);\r\n selectedGroups = this.getGroupChildGroups(si, item, 'selected', true, allGroups);\r\n unselectedGroups = this.getGroupChildGroups(si, item, 'unselected', true, allGroups);\r\n }\r\n else {\r\n itemGroup = this.getItemGroup(item);\r\n parentGroupSelected = itemGroup == null ? null : itemGroup._selected;\r\n parentGroupUnselected = itemGroup == null ? null : !itemGroup._selected;\r\n }\r\n\r\n if (!this.est.ArrayGrouping())\r\n this.performSelectionOperations(si, item, allSelection, isGroup, isSelection, selectedItems, selectedGroups, unselectedItems, unselectedGroups, allItems, allGroups, parentGroupSelected, parentGroupUnselected);\r\n else\r\n this.performSimpleSelectionOperations(si, item, isGroup, isSelection, itemGroup, selectedItems, unselectedItems, allItems, allGroups);\r\n }\r\n\r\n // Imposto il check globale in base a se tutti gli elementi sono selezionati o meno.\r\n // Evito di fare queste operazioni se la selezione deriva proprio dal global Check\r\n if (globalCheck == null)\r\n this.est.globalCheck.set(!this.est.boundSource().some(t => !t._selected && !t._sep));\r\n\r\n this.finalizeSelectionInformations(si);\r\n\r\n return si;\r\n }\r\n\r\n /**\r\n * Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.\r\n * \r\n * Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping()** = true)\r\n */\r\n private performSimpleSelectionOperations(base: ItemsSelection<any>, item: any, group: boolean, sel: boolean, itm_group: any, sel_itm: any[] | null, desel_itm: any[] | null, all_itms: any[] | null, all_grps: any[] | null) {\r\n let tripticItem = this.getTriptic('item', base);\r\n\r\n if (group && all_grps) {\r\n if (sel) {\r\n all_grps.forEach(gr => { gr._selected = true; });\r\n if (desel_itm)\r\n desel_itm.forEach(el => { el._selected = true; this.addItem(el, tripticItem) });\r\n }\r\n else {\r\n all_grps.forEach(gr => { gr._selected = false; });\r\n if (sel_itm)\r\n sel_itm.forEach(el => { el._selected = false; this.removeItem(el, tripticItem) });\r\n }\r\n }\r\n else {\r\n if (sel) {\r\n this.addItem(item, tripticItem);\r\n if (itm_group && all_itms && all_itms.every(t => t._selected))\r\n this.selectGroup(itm_group);\r\n }\r\n else {\r\n this.removeItem(item, tripticItem);\r\n if (itm_group)\r\n itm_group._selected = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper per selezionare un gruppo e, ricorsivamente, se tutti i gruppi sottostanti al parent sono selezionati, selezionare i gruppi padri\r\n * \r\n * @param {any} group Gruppo da selezionare\r\n */\r\n private selectGroup(group: any) {\r\n group._selected = true;\r\n let parent = this.getGroupParent(group);\r\n if (parent && this.getGroupChildGroups(null, parent, undefined, true).every(t => t._selected))\r\n this.selectGroup(parent);\r\n }\r\n\r\n /**\r\n * Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.\r\n * \r\n * La logica di questa funzione è nata essenzialmente da spam di trial & error ed è stata testata solo fino a due livelli di raggruppamento,\r\n * qualsiasi cosa vada oltre non è 100% detto che funzioni...\r\n */\r\n private performSelectionOperations(base: ItemsSelection<any>, item: any, all: boolean, group: boolean, sel: boolean, sel_itm: any[] | null, sel_grp: any[] | null, desel_itm: any[] | null, desel_grp: any[] | null, all_itms: any[] | null, all_grps: any[] | null, parent_incl: boolean | null, parent_excl: boolean | null) {\r\n let tripticGroup = this.getTriptic('group', base);\r\n let tripticItem = this.getTriptic('item', base);\r\n let tripticExcl = this.getTriptic('exclusion', base);\r\n let tripticgrpExcl = this.getTriptic('group_exclusion', base);\r\n\r\n if (group) {\r\n if (sel) {\r\n if (all || parent_incl)\r\n this.removeItem(item, tripticgrpExcl);\r\n else\r\n this.addItem(item, tripticGroup);\r\n\r\n if (sel_itm) sel_itm.forEach(el => this.removeItem(el, tripticItem));\r\n if (sel_grp) sel_grp.forEach(gr => this.removeItem(gr, tripticGroup));\r\n if (all_itms) all_itms.forEach(el => { el._selected = true; this.removeItem(el, tripticExcl); });\r\n if (all_grps) all_grps.forEach(gr => { gr._selected = true; this.removeItem(gr, tripticgrpExcl); });\r\n }\r\n else {\r\n if (all || parent_incl)\r\n this.addItem(item, tripticgrpExcl);\r\n else\r\n this.removeItem(item, tripticGroup);\r\n\r\n if (desel_itm) desel_itm.forEach(el => this.removeItem(el, tripticExcl));\r\n if (desel_grp) desel_grp.forEach(gr => this.removeItem(gr, tripticExcl));\r\n if (all_itms) all_itms.forEach(el => { el._selected = false; this.removeItem(el, tripticItem); });\r\n if (all_grps) all_grps.forEach(gr => { gr._selected = false; this.removeItem(gr, tripticGroup); });\r\n }\r\n }\r\n else {\r\n if (sel) {\r\n if ((parent_excl == null && all) || parent_incl)\r\n this.removeItem(item, tripticExcl);\r\n else\r\n this.addItem(item, tripticItem);\r\n }\r\n else {\r\n if (parent_excl || (!all && parent_excl == null))\r\n this.removeItem(item, tripticItem);\r\n else\r\n this.addItem(item, tripticExcl);\r\n }\r\n }\r\n }\r\n\r\n /** Helper per evitare di riscrivere ogni santa volta array.splice(array.indexof(item), 1); */\r\n private removeItem(item: any, triptic?: CacheTriptic) {\r\n if(!triptic)\r\n return false;\r\n\r\n let index = triptic.index_cache.get(item._hash);\r\n if (index != null) {\r\n triptic.cache.delete(item._hash);\r\n triptic.index_cache.delete(item._hash);\r\n triptic.array[index] = null;\r\n }\r\n\r\n return !!index;\r\n }\r\n\r\n /** Helper per evitare di riscrivere ogni santa volta array.push(item); e la gestione della */\r\n private addItem(item: any, triptic?: CacheTriptic): boolean {\r\n if(!triptic)\r\n return false;\r\n\r\n if (triptic.index_cache.get(item._hash) == null) {\r\n let i = triptic.array.push(item) - 1;\r\n triptic.cache.set(item._hash, item);\r\n triptic.index_cache.set(item._hash, i);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Ottiene il trittico di selezione, cioè l'array degli oggetti che si vuole manipolare e le due cache collegate ad esso\r\n * \r\n * @param {'group' | 'item' | 'group_exclusion' | 'exclusion'} subject Oggetto logico desiderato su cui effettuare le operazioni successive\r\n * @param {ItemsSelection<any>} base Selettore di base\r\n * \r\n * @returns {CacheTriptic} Trittico di selezione\r\n */\r\n private getTriptic(subject: 'group' | 'item' | 'group_exclusion' | 'exclusion', base: ItemsSelection<any>): CacheTriptic {\r\n switch (subject) {\r\n case 'group':\r\n return new CacheTriptic(this.groupsCache, this.i_groupsCache, base.groups);\r\n case 'item':\r\n return new CacheTriptic(this.itemsCache, this.i_itemsCache, base.items);\r\n case 'group_exclusion':\r\n return new CacheTriptic(this.group_exclusionsCache, this.i_group_exclusionsCache, base.group_exclusions);\r\n case 'exclusion':\r\n return new CacheTriptic(this.exclusionsCache, this.i_exclusionsCache, base.exclusions);\r\n }\r\n }\r\n\r\n /**\r\n * Dato un oggetto restituisce il gruppo di cui fa parte, se esiste\r\n * \r\n * @param {any} item Oggetto di cui trovare il gruppo\r\n */\r\n private getItemGroup(item: any): any {\r\n let parent = this.rgHandler.rgGroupCache.get(item._thisKey)\r\n if (parent)\r\n return parent;\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti gli oggetti con quella chiave\r\n * \r\n * @param {any} group Chiave da cercare\r\n * @param {'selected' | 'unselected'} status Stato degli elementi, selezionati o no\r\n * @param {boolean} recursive Indica se cercare solo gli elementi direttamente collegati o se prendere anche quelli dei gruppi figli\r\n * \r\n * @returns {any[]} Oggetti di tipo **_item** facenti capo alla chiave **groupKey**\r\n */\r\n private getGroupItems(sel: ItemsSelection<any>, group: any, status?: 'selected' | 'unselected', recursive: boolean = false, allbase: any[] | null = null): any[] {\r\n let items = [];\r\n\r\n if (allbase)\r\n items = allbase;\r\n else {\r\n if (recursive) {\r\n // In modalità ricorsiva prendo gli oggetti di tutte le chiavi simili che trovo\r\n for (let key of this.rgHandler.rgItemCache.keys())\r\n if (key.startsWith(group._thisKey))\r\n items.push(...this.rgHandler.rgItemCache.get(key)!);\r\n }\r\n else\r\n items = this.rgHandler.rgItemCache.get(group._thisKey)!;\r\n }\r\n\r\n items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));\r\n\r\n // Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione. \r\n // Questo può essere vero solo se NON sono in modalità array, in caso contrario gli oggetti li devo per forza avere tutti\r\n if (items.length != 0 || !sel || this.est.arrayMode())\r\n return items;\r\n\r\n if (status == 'unselected')\r\n items = sel.exclusions.filter(t => t != null &&\r\n (!recursive && t._thisKey == group._thisKey) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey)));\r\n else if (status == 'selected')\r\n items = sel.items.filter(t => t != null &&\r\n (!recursive && t._thisKey == group._thisKey) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey)));\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti gli oggetti con quella chiave\r\n * \r\n * @param {any} group Gruppo di cui cercare il parent\r\n * \r\n * @returns {any} Oggetto di tipo **_group** rappresentante il parent del **group** attuale\r\n */\r\n private getGroupParent(group: any): any {\r\n let parent = this.rgHandler.rgGroupCache.get(group._parent)\r\n if (parent)\r\n return parent;\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti i gruppi figli\r\n * \r\n * @param {string} group Gruppo che rappresenta il padre di cui cercare i figli\r\n * @param {'selected' | 'unselected'} status Stato dei gruppi, selezionati o no\r\n * @param {boolean} recursive Indica se cercare solo i gruppi direttamente collegati o se prendere anche quelli dei gruppi figli\r\n * \r\n * @returns {any[]} Oggetti di tipo **_group** facenti capo alla chiave **groupKey**\r\n */\r\n private getGroupChildGroups(sel: ItemsSelection<any> | null, group: any, status?: 'selected' | 'unselected', recursive: boolean = false, allbase: any[] | null = null) {\r\n let thisGroup: any = this.rgHandler.rgGroupCache.get(group._thisKey);\r\n let items = [];\r\n\r\n if (allbase)\r\n items = allbase;\r\n else {\r\n if (recursive) {\r\n // In modalità ricorsiva prendo gli oggetti di tutte le chiavi simili che trovo\r\n for (let key of this.rgHandler.rgChildGroupsCache.keys())\r\n if (key.startsWith(group._thisKey))\r\n items.push(...this.rgHandler.rgChildGroupsCache.get(key)!);\r\n }\r\n else\r\n items = this.rgHandler.rgChildGroupsCache.get(group._thisKey)!;\r\n }\r\n\r\n items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));\r\n\r\n // Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione\r\n if (items.length != 0 || !sel)\r\n return items;\r\n\r\n if (status == 'unselected')\r\n items = sel.group_exclusions.filter((t: any) => t != null && (\r\n (!recursive && t._thisRoute.length == thisGroup._thisRoute.length + 1 && t._thisRoute.startsWith(group._thisKey)) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey))));\r\n else\r\n items = sel.groups.filter((t: any) => t != null && (\r\n (!recursive && t._thisRoute.length == thisGroup._thisRoute.length + 1 && t._thisRoute.startsWith(group._thisKey)) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey))));\r\n\r\n return items;\r\n }\r\n\r\n /** Finalizza le informazioni di selezione del **ItemsSelection** corrente */\r\n private finalizeSelectionInformations(selectionItem: ItemsSelection<any>) {\r\n // Dato che le delete sono logiche dato che tengo la cache degli indici devo renderle fisiche\r\n let tmpGrp = [], tmpItems = [], tmpExcl = [], tmpGrpExcl = [];\r\n let grpRemoved = false, itemsRemoved = false, exclRemoved = false, grpExclRemoved = false;\r\n\r\n for (let i = 0; i < selectionItem.items.length; i++)\r\n if (selectionItem.items[i] != null) tmpItems.push(selectionItem.items[i]);\r\n else itemsRemoved = true;\r\n\r\n for (let i = 0; i < selectionItem.exclusions.length; i++)\r\n if (selectionItem.exclusions[i] != null) tmpExcl.push(selectionItem.exclusions[i]);\r\n else exclRemoved = true;\r\n\r\n // In vecchie versioni dell'AppSearch per cui non vengono deserializzate queste informaizoni potrebbero esserci casini\r\n if (selectionItem.groups) {\r\n for (let i = 0; i < selectionItem.groups.length; i++)\r\n if (selectionItem.groups[i] != null) tmpGrp.push(selectionItem.groups[i]);\r\n else grpRemoved = true;\r\n }\r\n\r\n if (selectionItem.group_exclusions) {\r\n for (let i = 0; i < selectionItem.group_exclusions.length; i++)\r\n if (selectionItem.group_exclusions[i] != null) tmpGrpExcl.push(selectionItem.group_exclusions[i]);\r\n else grpExclRemoved = true;\r\n }\r\n\r\n selectionItem.items = tmpItems;\r\n selectionItem.group_exclusions = tmpGrpExcl;\r\n selectionItem.exclusions = tmpExcl;\r\n selectionItem.groups = tmpGrp;\r\n\r\n // Le cache degli indici potrebbero avere buchi, risolvo\r\n if (grpRemoved)\r\n this.i_groupsCache = this.compactIndexMap(this.i_groupsCache);\r\n if (itemsRemoved)\r\n this.i_itemsCache = this.compactIndexMap(this.i_itemsCache);\r\n if (exclRemoved)\r\n this.i_exclusionsCache = this.compactIndexMap(this.i_exclusionsCache);\r\n if (grpExclRemoved)\r\n this.i_group_exclusionsCache = this.compactIndexMap(this.i_group_exclusionsCache);\r\n\r\n // Poi riprendo a fare tutto in normalità\r\n selectionItem.count = this.evaluateSelected();\r\n\r\n // Se ho fatto selezione \"all\" ma poi mi sono messo a togliere tutti gli elementi fino a rimanerne 0 resetto l'oggetto di selezione\r\n if (selectionItem.count == 0) {\r\n this.est.boundSource().forEach(t => t._selected = false);\r\n selectionItem.all = false;\r\n selectionItem.exclusions = [];\r\n selectionItem.items = [];\r\n selectionItem.groups = [];\r\n selectionItem.group_exclusions = [];\r\n\r\n // Ripulisco la cache altrimenti mi rimane piena di tutte le esclusioni\r\n this.clearSelectionCaches();\r\n }\r\n\r\n // Se la possibilità di fare \"Seleziona tutto\" è abilitata allora la considero appena mi viene selezionato qualcosa\r\n this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());\r\n }\r\n\r\n /** Compatta una cache di indici */\r\n private compactIndexMap(map: Map<string, number>): Map<string, number> {\r\n let index = 0;\r\n let ret = new Map();\r\n for (let key of map.keys())\r\n ret.set(key, index++);\r\n\r\n return ret;\r\n }\r\n\r\n\r\n /**\r\n * Valuta la quantità di oggetti che sono stati selezionati al termine di un evento di selezione\r\n *\r\n * @returns {number} Numero di oggetti selezionati\r\n */\r\n private evaluateSelected(): number {\r\n let si = (this.est.View as AppSearch<any>)?.selection || this.est.arraymodeSelection;\r\n\r\n let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);\r\n let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);\r\n let count = (si.all ? (this.est.BaseItemsCount || 0) : incByGroup) - excByGroup + si.items.length - si.exclusions.length;\r\n\r\n this.est.selectedObjects.set(count);\r\n return count;\r\n }\r\n\r\n /** Gestisce il comando di \"Seleziona tutto in tutte le pagine\" o il suo contrario, cioè \"Reimposta selezione\" */\r\n public selectAllOrResetSelection() {\r\n let selectionItem = this.est.View.selection || this.est.arraymodeSelection;\r\n this.clearSelectionCaches();\r\n selectionItem.all = !selectionItem.all;\r\n selectionItem.exclusions = [];\r\n selectionItem.groups = [];\r\n selectionItem.group_exclusions = [];\r\n selectionItem.items = [];\r\n\r\n // Ripulisco gli stati UI di selezione globale se l'ho disattivata\r\n if (!selectionItem.all) {\r\n this.est.canSelectAll.set(false);\r\n this.est.globalCheck.set(false);\r\n }\r\n\r\n this.finalizeSelectionInformations(selectionItem);\r\n\r\n this.est.onSelectionChanged.emit(selectionItem);\r\n\r\n // Dopo aver resettato direttamente il solo oggetto this.View.selection devo anche riallineare a tutti gli oggetti bindati\r\n this.evaluateSelection(this.est.boundSource(), selectionItem);\r\n }\r\n\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Registra la selezione singola su una cella sulla combo di comandi \"CTRL + Click\".\r\n * Se viene premuto anche il tasto Shift viene creato un range di selezione il cui status di \"selezionato\" viene salvato nella\r\n * matrice virtuale **selectionStatus**\r\n * \r\n * @param {any} event Evento Javascript di Click\r\n * @param {number} row Indice della riga. Non è l'indice vero e proprio ma è l'ordinale (.ordinal) dell'oggetto bindato su quella riga\r\n * @param {number} column Indice della colonna preso banalmente dall'ngIf sui thElement\r\n * @param {{ row: number, column: number }} firstSelectionOverride Permette di overridare il primo elemento selezionato\r\n */\r\n public singleCellSelection(event: {view: any, range: boolean}, row: number, column: number, firstSelectionOverride?: { row: number, column: number }) {\r\n\r\n // Recupero la selezione precedente se presente come punto di partenza\r\n var first = firstSelectionOverride || this.lastSingleSelection;\r\n\r\n //Il punto di arrivo, che diventerà il prossimo punto di partenza, è la selezione corrente\r\n this.lastSingleSelection = { row, column };\r\n \r\n if(event.range)\r\n this.est.utiExts.clearTextSelection();\r\n \r\n this.clearSelectionStatusExcluding(this.lastSingleSelection);\r\n this.setSelectionStatusBorders(event.range && first ? first : this.lastSingleSelection, this.lastSingleSelection);\r\n\r\n // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping\r\n this.est.cdr.markForCheck();\r\n }\r\n\r\n setSelectionStatusBorders(from: {row: number, column: number}, to: {row: number, column: number}){\r\n let rowAddition = to.row < from.row ? -1 : +1;\r\n let columnAddition = to.column < from.column ? -1 : +1;\r\n let singleItem = from == to;\r\n\r\n for (let ir = from.row; ir != to.row + rowAddition; ir += rowAddition)\r\n {\r\n let firstRow = ir == from.row;\r\n let lastRow = ir == to.row;\r\n for (let ic = from.column; ic != to.column + columnAddition; ic += columnAddition) {\r\n let firstCol = ic == from.column;\r\n let lastCol = ic == to.column;\r\n\r\n let current = this.est.selectionStatus[ir][ic];\r\n let prevColumn = ic > 0 ? this.est.selectionStatus[ir][ic - 1] : null;\r\n let nextcolumn = this.est.selectionStatus[ir][ic + 1];\r\n let prevRow = ir > 0 ? this.est.selectionStatus[ir - 1][ic] : null;\r\n let nextRow = this.est.selectionStatus[ir + 1] ? this.est.selectionStatus[ir + 1][ic] : null;\r\n\r\n current.selected = singleItem ? !current.selected : true;\r\n current.lborder = !current.selected ? false : columnAddition > 0 ? firstCol : lastCol;\r\n current.tborder = !current.selected ? false : rowAddition > 0 ? firstRow : lastRow;\r\n current.rborder = !current.selected ? false : columnAddition > 0 ? lastCol : firstCol;\r\n current.bborder = !current.selected ? false : rowAddition > 0 ? lastRow : firstRow;\r\n\r\n if (prevRow)\r\n prevRow.boverlaps = current.tborder;\r\n if (nextRow)\r\n nextRow.toverlaps = current.bborder;\r\n\r\n if (prevColumn)\r\n prevColumn.roverlaps = current.lborder;\r\n if (nextcolumn)\r\n nextcolumn.loverlaps = current.rborder;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper per ripulire lo stato di selezione delle singole celle della tabella, ad esclusione di una singola coordinata\r\n * \r\n * @param {{row: number, column: number}} exclusion Coordinata da escludere nella pulizia\r\n */\r\n public clearSelectionStatusExcluding(exclusion?: { row: number, column: number }) {\r\n for (let row in this.est.selectionStatus) {\r\n for (let column in this.est.selectionStatus[row]) {\r\n\r\n // Se è l'elemento che ho escluso dal cleanup, skippo\r\n if (exclusion && row == exclusion.row.toString() && column == exclusion.column.toString())\r\n continue;\r\n\r\n // Altrimenti pulisco\r\n let curr = this.est.selectionStatus[row][column];\r\n curr.selected = curr.lborder = curr.rborder = curr.tborder = curr.bborder = curr.loverlaps = curr.roverlaps = curr.toverlaps = curr.boverlaps = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper che esamina la matrice **selectionStatus** e ne estrappola gli elementi selezionati in una comoda matrice\r\n * \r\n * @returns {{ value: string, type: InputType, val_setter: Function }[][]} Matrice di elementi selezionati con la loro informazione sul tipo\r\n */\r\n public getSelectionStatusSelection(): ItemPropEditableReference[][] {\r\n let selection: ItemPropEditableReference[][] = []\r\n for (let row in this.est.selectionStatus) {\r\n let rowValues: ItemPropEditableReference[] = [];\r\n for (let column in this.est.selectionStatus[row]) {\r\n let ssItem = this.est.selectionStatus[row][column];\r\n if (ssItem.selected)\r\n rowValues.push(ssItem);\r\n }\r\n if (rowValues.length > 0)\r\n selection.push(rowValues);\r\n }\r\n return selection;\r\n }\r\n\r\n /**\r\n * Data la matrice di selezione generata dal metodo **getSelectionStatusSelection** genera la strigna vera e propria da copiare nella Clipboard\r\n * \r\n * @param {{ value: string, type: InputType }[][]} sel Matrice di selezione con valori e tipi dei dati selezionati\r\n * \r\n * @returns {string} Stringa da copiare nella clipboard, le stringhe vengono wrappate fra doppi apici e fra un valore e l'altro viene messo un tab\r\n * in modo che siano compatibili anche con la copia su Excel\r\n */\r\n getClipbardTextFromSelection(sel: ItemPropEditableReference[][]): string {\r\n var ret = \"\";\r\n for (let r = 0; r < sel.length; r++) {\r\n let row = sel[r];\r\n if (r > 0) ret += \"\\n\";\r\n for (let c = 0; c < row.length; c++) {\r\n let col = row[c];\r\n ret += this.getValueByType(col) + (c < row.length - 1 ? \"\\t\" : \"\");\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Ottiene la rappresentazione stringa di un valore dato un tipo\r\n * \r\n * @param {ItemPropEditableReference} valType Oggetto Valore - Tipo da cui estrapolare la rappresentazione del dato in stringa\r\n * \r\n * @returns {string} Valore convertito in stringa in base al tipo\r\n */\r\n getValueByType(valType: ItemPropEditableReference): string {\r\n switch (valType.type) {\r\n case 'string':\r\n return '\"' + valType.value + '\"';\r\n case 'number':\r\n case 'int':\r\n case 'boolean':\r\n case 'enum':\r\n case 'autocomplete':\r\n return valType.value || \"\";\r\n case 'float':\r\n case 'currency':\r\n return parseFloat(valType.value || \"\").toLocaleString(this.est.lc.Locale);\r\n case 'date':\r\n return dayjs(valType.value).format(this.est.lc.token(\"getSmallDateDisplayFormat\"));\r\n case 'datetime':\r\n return dayjs(valType.value).format(this.est.lc.token(\"getFullDateDisplayFormat\"));\r\n case 'time':\r\n return dayjs(valType.value).format(\"HH:mm:ss\");\r\n default:\r\n return valType.value || \"\"\r\n }\r\n }\r\n}","// Angular\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n// Librerie\r\nimport { HashingService } from \"@esfaenza/extensions\";\r\n\r\n/** Classe di utilità per le cose comuni */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UtilitiesHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private hashExts: HashingService) { }\r\n\r\n /**\r\n * Data una lista di oggetti effettua dei raggruppamenti in base alla proprietà **field**, \r\n * restituendo un oggetto del tipo { Gruppo1: oggetti[], Gruppo2: oggetti[], ecc... }\r\n *\r\n * @param {any[]} array Lista degli oggetti da raggruppare\r\n * @param {string} field Campo su cui effettuare i raggruppamenti\r\n *\r\n * @returns {{ [id: string]: any[] }} Dizionario dei gruppi\r\n */\r\n public groupBy(array: any[], field: string): { [id: string]: any[]; } {\r\n let ret = {};\r\n for (let i = 0; i < array.length; i++) {\r\n let x = array[i];\r\n (ret[x[field]] = ret[x[field]] || []).push(x);\r\n }\r\n return ret;\r\n };\r\n\r\n /**\r\n * Helper per effettuare il caching delle aggregazioni. Le sposta da una lista di **GroupAggregation** a una **<Map<string, Map<string, string>>**\r\n *\r\n * @param {any} group Gruppo di cui cachare le aggregazioni\r\n */\r\n public cacheAggregations(group: any) {\r\n (<any>group)._aggregationsCache = new Map();\r\n let castedAgCache = (<Map<string, Map<string, string>>>(<any>group)._aggregationsCache);\r\n for (let i = 0; i < group.aggregations.length; i++) {\r\n let agg = group.aggregations[i];\r\n if (castedAgCache.has(agg.column))\r\n castedAgCache.get(agg.column).set(agg.aggregation, agg.value);\r\n else {\r\n let tmp: Map<string, string> = new Map();\r\n tmp.set(agg.aggregation, agg.value);\r\n castedAgCache.set(agg.column, tmp);\r\n }\r\n }\r\n }\r\n\r\n /** Helper per spostare un oggetto di un array da un indice all'altro, in place */\r\n public arrayMove(array: any[], oldI: number, newI: number) {\r\n if (newI > array.length - 1 || oldI > array.length - 1 || newI < 0 || oldI < 0)\r\n throw \"Gli indici passati non fanno riferimento a una posizione dell'array. Length: \" + array.length + \" Old:\" + oldI + \" New: \" + newI;\r\n\r\n array.splice(newI, 0, array.splice(oldI, 1)[0]);\r\n }\r\n\r\n /**\r\n * Date le informazioni di paginazione ottiene l'array dei pulsanti\r\n *\r\n * @param {number} maxBtns Numero massimo di pulsanti da visualizzare\r\n * @param {number} page Pagina corrente\r\n * @param {number} lastPage Ultima pagina disponibile\r\n *\r\n * @returns {any[]} Pseudo-array di pulsanti a cui ci si può bindare lato HTML\r\n */\r\n public getPagesArray(maxBtns: number, page: number, lastPage: number, actualCount: number = null, ipp: number = null): { val: number, cssClass: string }[] {\r\n let result: { val: number, cssClass: string }[] = [];\r\n\r\n // Se sono in modalità \"Numero di pagine ed oggetti sconosciuti\" faccio in modo di mostrare la pagina successiva solo se gli items effettivamente pervenuti\r\n // sono uguali alla paginazione attuale (cioè questa pagina è di sicuro riempita completamente)\r\n if (lastPage == -1 && ((actualCount == null && ipp == null) || (actualCount == ipp)))\r\n lastPage = page + 1;\r\n\r\n // Se sono in modalità \"Numero di pagine ed oggetti sconosciuti\" e mi arrivano 0 oggetti significa che l'ultima pagina è la precedente e non mostro pagine oltre\r\n if (lastPage == -1 && actualCount == 0)\r\n lastPage = page;\r\n\r\n let min: number, max: number;\r\n if (lastPage <= maxBtns) {\r\n min = 1;\r\n max = lastPage - 1;\r\n } else {\r\n // tolgo la pagina selected è l'ultima pagina che è quella delle pagine totali\r\n let rangeOutside = (maxBtns - 2) / 2;\r\n\r\n min = page - rangeOutside;\r\n max = page + rangeOutside;\r\n\r\n if (min < 1) {\r\n min = 1;\r\n max = maxBtns - 1;\r\n } else if (max >= lastPage) {\r\n min = lastPage - maxBtns + 1;\r\n max = lastPage - 1;\r\n }\r\n }\r\n\r\n result.push({ val: 1, cssClass: (1 === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n\r\n if (max >= min) {\r\n for (let i = min; i <= max; i++)\r\n if (i !== 1)\r\n result.push({ val: i, cssClass: (i === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n\r\n result.push({ val: lastPage, cssClass: (lastPage === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Calcola l'hash di un oggetto qualsiasi\r\n *\r\n * @param {any[]} items Oggetti per cui calcolare l'hash\r\n */\r\n public calculateHash(items: any[]) {\r\n if (!items)\r\n return;\r\n\r\n // Supporto a hash duplicati di oggetti uguali\r\n let usedHashesCache: { [index: string]: number; } = {};\r\n for (let i = 0; i < items.length; i++) {\r\n let item = items[i];\r\n\r\n // Prima di calcolare l'hash rimuovo le proprietà interne per evitare che mi scompensino i calcoli successivi\r\n let tmp = Object.assign({}, items[i]);\r\n delete tmp._selected;\r\n delete tmp._visible;\r\n delete tmp._hash;\r\n delete tmp._ordinal;\r\n let hash = this.hashExts.hashObject(tmp);\r\n\r\n usedHashesCache[hash] = usedHashesCache[hash] ? usedHashesCache[hash] + 1 : 1;\r\n item._hash = hash + (usedHashesCache[hash] > 1 ? \"_\" + usedHashesCache[hash] : \"\");\r\n item._ordinal = i;\r\n }\r\n }\r\n\r\n /**\r\n * Se l'Input è null (valore non settato) vede se c'è un default con cui valorizzarlo. Se non c'è utilizza il valore di fallback (qualora fornito)\r\n * \r\n * @param {T} inputValue Valore dell'Input\r\n * @param {T} defaultValue Valore di default impostato da configurazione\r\n * @param {T} fallbackValue Valore dell'Input per quando non è stato assegnato dal programmatore e non ha un default\r\n */\r\n public InputOrDefault<T>(inputValue: T, defaultValue: T, fallbackValue?: T) {\r\n\r\n // Input valorizzato dal programmatore\r\n if (inputValue != null && inputValue != undefined)\r\n return inputValue;\r\n\r\n // Input valorizzato da configurazione globale\r\n if (defaultValue != null && defaultValue != undefined)\r\n return defaultValue;\r\n\r\n //Input non valorizzato da niente e da nessuno\r\n if (fallbackValue != null && fallbackValue != undefined)\r\n return fallbackValue;\r\n\r\n // I casi in cui si arriva qui sono i casi di Input che di default va bene che siano nulli e che nessuno si caga\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n/** Classe che fornisce dei metodi di estensione in grado di riconoscere e dispatchare l'evento copia e incolla lanciato su una pagina web */\r\n@Injectable({providedIn: \"root\"})\r\nexport class CopyPasteDetector {\r\n\r\n /** Dispatcher del Copia */\r\n public OnCopy: Subject<void> = new Subject<void>();\r\n /** Dispatcher dell' Incolla */\r\n public OnPaste: Subject<void> = new Subject<void>();\r\n /** Riferimento all'estable attiva per evitare di spammare copia incolla dove non servono */\r\n public ActiveEstReference: any = null;\r\n\r\n /** @ignore */\r\n constructor() {\r\n document.addEventListener(\"keydown\", (event: KeyboardEvent) => {\r\n if (event.key === \"c\" && event.ctrlKey)\r\n this.OnCopy.next();\r\n\r\n if (event.key === \"v\" && event.ctrlKey)\r\n this.OnPaste.next();\r\n });\r\n }\r\n}","import { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { EST_DEBUG } from \"../tokens\";\r\n\r\n/** Classe che fornisce dei metodi di estensione in grado di riconoscere e dispatchare l'evento copia e incolla lanciato su una pagina web */\r\n@Injectable({providedIn: \"root\"})\r\nexport class Logger {\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(EST_DEBUG) public debugMode: boolean) { }\r\n\r\n /**\r\n * Emette un log a console solo se la modalità debug è attiva.\r\n *\r\n * Il testo può essere passato come funzione (**lazy**): in tal caso viene valutato solo quando il debug è attivo,\r\n * evitando di costruire stringhe costose (es. interpolazioni per-cella) quando i log sono disabilitati.\r\n */\r\n public log(text: string | (() => string)) {\r\n if (this.debugMode)\r\n console.log(\"[@esfaenza/es-table @ \" + (new Date()).toISOString() + \"] \" + (typeof text === 'function' ? text() : text));\r\n }\r\n}","//Angular\r\nimport { Component, Input, Output, EventEmitter, ElementRef, ViewChild, Renderer2, HostListener, ChangeDetectionStrategy, input, signal, computed, WritableSignal } from \"@angular/core\";\r\n\r\n/** Componente rappresentante una Colonna della tabella */\r\n@Component({\r\n selector: \"[es-th]\",\r\n templateUrl: \"./es_th.component.html\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EsTh {\r\n\r\n /** Dizionario di mappatura con ordinamento attuale e ordinamento successivo per gestire i passaggi di stato */\r\n private orderNext: { [index: string]: 'DESC' | 'ASC' | null } = { \"NONE\": \"DESC\", \"DESC\": \"ASC\", \"ASC\": null };\r\n\r\n /** Indicazione sulla visibilità della colonna */\r\n private _Visible?: boolean;\r\n\r\n /** Indica se si sta effettuando un'operazione di resize su questa colonna */\r\n private resizingThis: boolean = false;\r\n\r\n /**\r\n * Storicizza l'offset di partenza del resize dell'elemento HTML per poter calcolare la nuova dimensione richiesta durente il resize \r\n * \r\n * nuova width = startOffset + posizione X del mouse\r\n */\r\n private startOffset: number = 0;\r\n\r\n /** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */\r\n ID = input<string>(\"\", { alias: \"es-th\" });\r\n\r\n /** Ordinamento attuale della colonna */\r\n _Order = input<'DESC' | 'ASC' | null, 'DESC' | 'ASC' | null>(null, { alias: 'Order', transform: (value: 'DESC' | 'ASC' | null) => this.setUnderlyingSignal(\"Order\", value) });\r\n Order = signal<'DESC' | 'ASC' | null>(null);\r\n\r\n /** Indica se questa colonna è ordinabile o meno */\r\n Orderable = input<boolean>(true);\r\n\r\n /** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */\r\n Display = input<string>(\"\");\r\n\r\n /** Indica se le dimnsioni di questa colonna sono modificabili o meno */\r\n Resizable = input<boolean | null>(false);\r\n\r\n /** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */\r\n Pinned = input<boolean>(false);\r\n\r\n /**\r\n * Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio \r\n * come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi\r\n */\r\n SearchInProgress = input<boolean>(false);\r\n\r\n /** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */\r\n OrderBy = input<boolean | null>(null);\r\n\r\n /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */\r\n Wrap = input<boolean>(false);\r\n\r\n /** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */\r\n Fixed = input<boolean>(false);\r\n\r\n /** Evento emesso al cambio di ordinamento effettuato su questa colonna */\r\n @Output() public onOrderChange: EventEmitter<'DESC' | 'ASC' | null> = new EventEmitter<'DESC' | 'ASC' | null>();\r\n\r\n /** Evento emesso all'unpinning della colonna */\r\n @Output() public onUnpinning: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n /** Classi da applicare alla colonna */\r\n public Class = signal<string>(\"\");\r\n\r\n /** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */\r\n public _referenced = signal(false);\r\n\r\n private setUnderlyingSignal<T>(signalName: string, value: T) {\r\n ((this as any)[signalName] as WritableSignal<T>).set(value);\r\n return value;\r\n }\r\n\r\n /** @ignore */\r\n constructor(private myself: ElementRef, private renderer: Renderer2) { }\r\n\r\n /**\r\n * Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**\r\n * \r\n * @param {boolean} expression Indicazione della visibilità\r\n */\r\n @Input() set Visible(expression: boolean) {\r\n this._Visible = expression;\r\n\r\n if (expression)\r\n this.renderer.removeClass(this.myself.nativeElement, \"app-display-none\");\r\n else\r\n this.renderer.addClass(this.myself.nativeElement, \"app-display-none\");\r\n }\r\n\r\n /**\r\n * Restituisce lo stato di Visibilità della colonna in oggetto\r\n * \r\n * @returns {boolean} **true** se visibile, **false** altrimenti\r\n */\r\n get Visible(): boolean {\r\n if (this._Visible == undefined)\r\n this._Visible = true;\r\n\r\n return this._Visible;\r\n }\r\n\r\n /** @ignore */\r\n ngAfterViewInit() {\r\n this.Class.set(this.myself.nativeElement.className.replace(\"app-display-none\", \"\"));\r\n\r\n //Resize\r\n if (this.Resizable())\r\n this.renderer.addClass(this.myself.nativeElement, \"app-relative\");\r\n }\r\n\r\n /** Emette l'evento di unpinning */\r\n unpin() {\r\n this.onUnpinning.emit(this.ID());\r\n }\r\n\r\n /** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */\r\n setupNextOrderAndNotify() {\r\n if (!this.ID()) {\r\n console.log(\"Attempt to order a column without ID. Operation ignored\");\r\n return;\r\n }\r\n\r\n if (this.SearchInProgress()) {\r\n console.log(\"Attempt to order a column during a search. Operation ignored\");\r\n return;\r\n }\r\n\r\n if (!this.OrderBy() || !this.Orderable())\r\n return;\r\n\r\n var nextOrder = this.orderNext[this.Order() || \"NONE\"];\r\n this.Order.set(nextOrder);\r\n this.onOrderChange.emit(nextOrder);\r\n }\r\n\r\n /**\r\n * Evento di inizio resize della colonna\r\n * \r\n * @param {any} ev Evento MouseDown\r\n */\r\n onResizeStart(ev: Event) {\r\n if (!this.Resizable())\r\n return;\r\n\r\n this.resizingThis = true;\r\n this.startOffset = this.myself.nativeElement.offsetWidth - (ev as MouseEvent).pageX;\r\n }\r\n\r\n /** Listener per la fine dell'operazione di resize */\r\n @HostListener('window:mouseup.out-zone')\r\n public onMouseUp(): void {\r\n if (!this.Resizable())\r\n return;\r\n\r\n this.resizingThis = false;\r\n }\r\n\r\n /**\r\n * Listener per gestire il movimento del mouse qualora un'operazione di resize fosse in esecuzione\r\n * \r\n * @param {$event} ev Evento MouseMove\r\n */\r\n @HostListener('window:mousemove.out-zone', ['$event'])\r\n public onMouseMove($event: Event): void {\r\n if (!this.Resizable() || !this.resizingThis)\r\n return;\r\n\r\n //Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo\r\n //(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)\r\n this.myself.nativeElement.style.width = (this.startOffset + ($event as MouseEvent).pageX) + \"px\";\r\n\r\n //Fermo il bubbling per non fare cose strane\r\n $event.preventDefault();\r\n }\r\n}","<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\n <ng-content></ng-content>&nbsp;\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\n</span>\n@if (Pinned() && !Fixed()) {\n<span class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\n}\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\n <div class=\"est-head-resizer-internal\"></div>\n</div>","// Angular\r\nimport { Component, ChangeDetectionStrategy, EventEmitter, Output, ElementRef, signal, input } from \"@angular/core\";\r\n\r\n/** Componente rappresentante una singola cella del body della tabella */\r\n@Component({\r\n selector: \"[es-td]\",\r\n templateUrl: \"./es_td.component.html\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: [\"es_td.component.scss\"],\r\n standalone: false\r\n})\r\nexport class EsTd {\r\n\r\n /** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */\r\n ID = input<string>(\"\", { alias: \"es-td\" });\r\n /** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */\r\n Context = input<string>();\r\n\r\n /** Quando questa cella viene generata questo evento permette di dire \"ehi, sono nato!\" */\r\n @Output() onCellGeneration: EventEmitter<{ id: string, hash: string, self: EsTd }> = new EventEmitter<{ id: string, hash: string, self: EsTd }>();\r\n\r\n /** Errore attualmente presente sulla cella */\r\n public ValidationError = signal<string>(\"\");\r\n\r\n /** @ignore */\r\n constructor(public el: ElementRef) { }\r\n\r\n /** @ignore */\r\n ngAfterViewInit() {\r\n this.onCellGeneration.emit({ id: this.ID(), hash: this.Context(), self: this });\r\n }\r\n\r\n /** Api per impostare un \"errore\" su questa cella in maniera programmatica */\r\n public validationError(error?: string) {\r\n this.ValidationError.set(error);\r\n }\r\n}","<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService } from \"@esfaenza/extensions\";\r\n\r\n@Pipe({\r\n name: 'est_format',\r\n standalone: false\r\n})\r\nexport class EstFormatPipe implements PipeTransform {\r\n\r\n constructor(private dates: DateService) { }\r\n\r\n transform(value: string, format: string) {\r\n if (!format) {\r\n // Se è un formato data mi assicuro di non stampare mai una data 00:00:00 altrimenti in esportazione viene uno schifo\r\n return value ? this.dates.trimSeconds(value.toString()) : \"\";\r\n } else {\r\n // Caso formato numerico\r\n if (format.startsWith(\"F\")) {\r\n if (!value)\r\n return \"\";\r\n\r\n if (format.length != 2)\r\n return value.toString().replace(/,/, \"\").replace(\".\", \",\");\r\n\r\n else {\r\n let tmp = parseFloat(value);\r\n let cifre = parseInt(format[1]);\r\n if (isNaN(tmp) || isNaN(cifre)) return \"\";\r\n\r\n return (Math.trunc(tmp * Math.pow(10, cifre)) / Math.pow(10, cifre)).toString();\r\n }\r\n } else {\r\n // Se ho un formato data trasformo in dayjs, formatto ed esporto\r\n // Per la trasformazione in dayjs provo prima a passargli la stringa di netto, sperando la riconosca\r\n // Se non funziona provo a definirgli la formattazione standard del metering per quel linguaggio\r\n return this.dates.getFormatted(value, format.length <= 10, format.length > 16);\r\n }\r\n }\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_lookup',\r\n standalone: false\r\n})\r\nexport class EstLookupPipe implements PipeTransform {\r\n\r\n transform(value: string, source: { id: string, description: string }[]) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (source[i].id == value)\r\n return source[i];\r\n }\r\n return { id: \"\", description: \"\" };\r\n }\r\n}","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_routerlink',\r\n standalone: false\r\n})\r\nexport class EstRouterLinkPipe implements PipeTransform {\r\n\r\n /** Cache per i routerLink generati nelle tabelle dinamiche */\r\n public routerLinksCache: {} = {};\r\n\r\n transform(item: any, path: string, parameters: string[]) {\r\n if (this.routerLinksCache[item._hash + path]) {\r\n return this.routerLinksCache[item._hash + path];\r\n } else {\r\n let link = this.getRouterLink(path, parameters, item);\r\n this.routerLinksCache[item._hash + path] = link;\r\n return link;\r\n }\r\n }\r\n\r\n /**\r\n * Crea un router link\r\n *\r\n * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...\r\n * @param {string[]} pars Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**\r\n * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**\r\n * @param {any} item Oggetto collegato a questo contesto. Può essere un oggetto generico (con \"properties\") o un oggetto ben definito\r\n *\r\n * @returns {any} Router link generato in base al parametri\r\n */\r\n private getRouterLink(path: string, pars: string[], item: any): any {\r\n\r\n for (let i = 0; i < pars.length; i++)\r\n path = path.replace('{' + i + '}', item.properties ? item.properties[pars[i]] : item[pars[i]]);\r\n\r\n path = path.replace(/'/g, '\"').replace(/ /g, '');\r\n return JSON.parse(path);\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform, QueryList } from \"@angular/core\";\r\n\r\n// Services\r\nimport { Logger } from \"../../core/Logger\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\n\r\n@Pipe({\r\n name: 'est_renderer',\r\n standalone: false\r\n})\r\nexport class EstRendererPipe implements PipeTransform {\r\n\r\n constructor(private logger: Logger) { }\r\n\r\n transform(propName: string, params: { name: string, src: QueryList<EsTdDirective> | undefined, fallback: any }) {\r\n\r\n if(!params.src)\r\n return params.fallback;\r\n\r\n var EsTd = null;\r\n // Perf. Version di `params.src.find((item) => params.name ? item.td === params.name : item.tdForProperty === propName);`\r\n for (let i = 0; i < params.src.length; i++) {\r\n let item = params.src.get(i)!;\r\n if (params.name && item.td === params.name || !params.name && item.tdForProperty === propName) {\r\n EsTd = item;\r\n break;\r\n }\r\n }\r\n\r\n // Name non trovato, fallback al nome della colonna\r\n if (propName && params.name && !EsTd) {\r\n this.logger.log(`Renderer retrieved in a non performant way`);\r\n EsTd = params.src.find((item) => item.tdForProperty === propName);\r\n }\r\n\r\n this.logger.log(() => `Renderer ${EsTd ? 'found' : 'NOT found'} for '${propName}${params.name ? '/' + params.name : ''}'${!EsTd ? '. Using fallback renderer' : ''}`);\r\n var ret = EsTd ? EsTd.Template : params.fallback;\r\n\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform, QueryList } from \"@angular/core\";\r\n\r\n// Services\r\nimport { Logger } from \"../../core/Logger\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTdEditorDirective } from \"../../directives/es_td_editor.directive\";\r\n\r\n@Pipe({\r\n name: 'est_editor',\r\n standalone: false\r\n})\r\nexport class EstEditorPipe implements PipeTransform {\r\n\r\n constructor(private logger: Logger) { }\r\n\r\n transform(propName: string, params: { name: string, src: QueryList<EsTdEditorDirective> | undefined, fallback: any }) {\r\n\r\n if (!params.src)\r\n return params.fallback;\r\n\r\n \r\n var Editor = null;\r\n\r\n // Perf. Version di `params.src.find((item) => params.name ? item.editor === params.name : item.editorForProperty === propName);`\r\n for (let i = 0; i < params.src.length; i++) {\r\n let item = params.src.get(i)!;\r\n if (params.name && item.editor === params.name || !params.name && item.editorForProperty === propName) {\r\n Editor = item;\r\n break;\r\n }\r\n }\r\n\r\n // Name non trovato, fallback al nome della colonna\r\n if (propName && params.name && !Editor) {\r\n this.logger.log(`Editor retrieved in a non performant way`);\r\n Editor = params.src.find((item) => item.editorForProperty === propName);\r\n }\r\n\r\n this.logger.log(() => `Editor ${Editor ? 'found' : 'NOT found'} for '${propName}${params.name ? '/' + params.name : ''}'${!Editor ? '. Using fallback editor' : ''}`);\r\n var ret = Editor ? Editor.Template : params.fallback;\r\n\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_propinsensitive',\r\n standalone: false\r\n})\r\nexport class EstPropInsensitivePipe implements PipeTransform {\r\n\r\n transform(item: any, property: string) {\r\n for (let prop in item) {\r\n if (prop.toLowerCase() == property.toLowerCase())\r\n return item[prop];\r\n }\r\n return \"\";\r\n }\r\n}\r\n","/** Raccolta di tutti gli Input dell'EsTable a cui può essere logicamente sensato assegnare default per progetto */\r\nexport class EsTableDefaultable {\r\n /** @ignore Vedi **EsTableComponent** */ ColumnsResizable?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ AutoUpdate?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ AllSearch?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ Export?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePaging?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePagingCount?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePagingButtons?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ContainerClass?: string;\r\n /** @ignore Vedi **EsTableComponent** */ TableClass?: string;\r\n /** @ignore Vedi **EsTableComponent** */ Selection?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ SavePreferences?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ PagingStyle?: 'both' | 'top' | 'bottom';\r\n /** @ignore Vedi **EsTableComponent** */ RowGroupingPagingStyle?: 'left' | 'right';\r\n /** @ignore Vedi **EsTableComponent** */ UseSelectionCache?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ShowItemGroupsColumns?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ArraymodeItemsPerPage?: number;\r\n /** @ignore Vedi **EsTableComponent** */ ColumnsPinnable?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ DefaultAlignment?: 'Left' | 'Center' | 'Right';\r\n}\r\n","// Angular\r\nimport {\r\n Component, ContentChildren, QueryList, ChangeDetectorRef, ChangeDetectionStrategy, Input,\r\n EventEmitter, Output, ContentChild, ViewChild, ElementRef, ViewEncapsulation, Optional, Self, TemplateRef, Inject, Type,\r\n Renderer2, WritableSignal, signal, input, effect,\r\n NgZone, model\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\n\r\n// Configurazioni\r\nimport { UtilityService, ExportService, MessageService, DateService, ClipboardService, AppEmbeddingExtensions } from '@esfaenza/extensions';\r\nimport { LocalizationService } from '@esfaenza/localizations';\r\nimport { PreferencesService } from '@esfaenza/preferences';\r\n\r\n// Plugins\r\nimport { ContextMenuComponent } from '@esfaenza/ngx-contextmenu';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\r\n\r\n// Modelli / Tipi\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { CornerMenuOption } from \"../../domain/externals/CornerMenuOption\";\r\nimport { EsTableOperationDefinition } from \"../../domain/externals/EsTableOperationDefinition\";\r\nimport { EsTableColumn } from \"../../domain/internals/EsTableColumn\";\r\nimport { GroupPager } from \"../../domain/internals/GroupPager\";\r\nimport { GroupRouteFragment } from \"../../domain/internals/GroupRouteFragment\";\r\nimport { ThElement } from \"../../domain/internals/ThElement\";\r\nimport { PagerInfos } from \"../../domain/internals/PagerInfos\";\r\nimport { ThGroup } from \"../../domain/internals/ThGroup\";\r\nimport { TdElement } from \"../../domain/internals/TdElement\";\r\nimport { ItemsSelection } from '../../domain/externals/appsearch/ItemsSelection';\r\nimport { GroupOrAggregation } from \"../../domain/externals/appsearch/GroupOrAggregation\";\r\nimport { GroupFilter } from \"../../domain/externals/appsearch/GroupFilter\";\r\nimport { Group } from \"../../domain/externals/appsearch/Group\";\r\nimport { EsTableModelChange } from '../../domain/externals/EsTableModelChange';\r\nimport { ItemPropEditableReference } from '../../domain/externals/ItemPropEditableReference';\r\nimport { EsTableDefaultable } from '../../domain/configuration/EsTableDefaultable';\r\nimport { EsTdReference } from './../../domain/internals/EsTdReference';\r\n\r\n// Componenti e Localizzazione\r\nimport { EsTd } from '../es-td/es_td.component';\r\nimport { EsTdDirective } from '../../directives/es_td.directive';\r\nimport { EsThDirective } from '../../directives/es_th.directive';\r\nimport { EsTdEditorDirective } from '../../directives/es_td_editor.directive';\r\nimport { ThTdProvider } from '../../directives/es_th_td_provider.directive';\r\nimport { EsTableLoc } from './es_table.component.loc';\r\n\r\n// Tokens\r\nimport { EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL } from '../../tokens';\r\n\r\n// Handlers\r\nimport { ExportHandler } from \"../../core/handlers/ExportHandler\";\r\nimport { ColumnMetadataHandler } from \"../../core/handlers/ColumnMetadataHandler\";\r\nimport { DynamicModeHandler } from \"../../core/handlers/DynamicModeHandler\";\r\nimport { HierarchyModeHandler } from \"../../core/handlers/HierarchyModeHandler\";\r\nimport { ItemsHandler } from \"../../core/handlers/ItemsHandler\";\r\nimport { ReportModeHandler } from \"../../core/handlers/ReportModeHandler\";\r\nimport { RowGroupingHandler } from \"../../core/handlers/RowGroupingHandler\";\r\nimport { SelectionHandler } from \"../../core/handlers/SelectionHandler\";\r\nimport { UtilitiesHandler } from \"../../core/handlers/UtilitiesHandler\";\r\n\r\n// Service\r\nimport { CopyPasteDetector } from '../../core/CopyPasteDetector';\r\nimport { Logger } from '../../core/Logger';\r\n\r\n// Rxjs\r\nimport { Subject, Subscription, forkJoin, fromEvent, takeUntil } from 'rxjs';\r\n\r\n/** Componente che permette di rappresentare una griglia di valori */\r\n@Component({\r\n selector: 'es-table',\r\n viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n styleUrls: ['./es_table.component.scss'],\r\n templateUrl: './es_table.component.html',\r\n standalone: false\r\n})\r\nexport class EsTableComponent implements ControlValueAccessor {\r\n\r\n private _destroyed$: Subject<void> = new Subject();\r\n\r\n // Componenti per la gestione delle varie funzionalità dell'es-table\r\n /** @ignore */ public export_H: ExportHandler;\r\n /** @ignore */ public columnMetadata_H: ColumnMetadataHandler;\r\n /** @ignore */ public dynamicMode_H: DynamicModeHandler;\r\n /** @ignore */ public hierarchyMode_H: HierarchyModeHandler;\r\n /** @ignore */ public items_H: ItemsHandler;\r\n /** @ignore */ public reportMode_H: ReportModeHandler;\r\n /** @ignore */ public rowGrouping_H: RowGroupingHandler\r\n /** @ignore */ public selection_H: SelectionHandler;\r\n\r\n // Subscribers per gli eventi di copia e incolla\r\n /** @ignore */ private copySubscription: Subscription;\r\n /** @ignore */ private pasteSubscription: Subscription;\r\n\r\n /** @ignore */\r\n constructor(\r\n private _zone: NgZone,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Optional() private prefService: PreferencesService,\r\n @Optional() @Inject(EST_DEFAULTS) private deafults: EsTableDefaultable,\r\n @Optional() @Inject(EST_DEBUG) private debugMode: boolean,\r\n @Optional() @Inject(EST_EXPORT_GLOBAL_ACL) public exportGlobalAcl: string,\r\n public lc: LocalizationService,\r\n public cdr: ChangeDetectorRef,\r\n private utilities_H: UtilitiesHandler,\r\n public utiExts: UtilityService,\r\n private expExts: ExportService,\r\n public dateExts: DateService,\r\n private msgExts: MessageService,\r\n private copyPasteDetector: CopyPasteDetector,\r\n private clipboardService: ClipboardService,\r\n private logger: Logger,\r\n private emb: AppEmbeddingExtensions,\r\n private rendererRef: Renderer2\r\n ) {\r\n\r\n effect(() => {\r\n let sv = this.SearchView();\r\n if (sv) this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, sv.page, sv.pages || 1, sv.objectcount || sv.items.length, sv.itemsperpageoverride));\r\n });\r\n\r\n // Sarebbe bello... per quando View diventa signal\r\n /*effect(() => {\r\n \r\n if (this.View) {\r\n let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;\r\n if (firstItemGroupOrNoGrouping)\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));\r\n }\r\n })*/\r\n\r\n // Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata\r\n this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this) this.handleCopy(); });\r\n this.pasteSubscription = this.copyPasteDetector.OnPaste.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this) this.handlePaste(); });\r\n\r\n this.export_H = new ExportHandler(this, this.expExts, this.msgExts, this.utiExts, this.dateExts);\r\n this.rowGrouping_H = new RowGroupingHandler(this, this.utilities_H, this.dateExts);\r\n this.columnMetadata_H = new ColumnMetadataHandler(this, this.utilities_H, this.utiExts, this.prefService, this.rowGrouping_H);\r\n this.dynamicMode_H = new DynamicModeHandler(this);\r\n this.hierarchyMode_H = new HierarchyModeHandler(this);\r\n this.items_H = new ItemsHandler(this, this.utilities_H);\r\n this.reportMode_H = new ReportModeHandler(this, this.utilities_H);\r\n this.selection_H = new SelectionHandler(this, this.rowGrouping_H);\r\n\r\n if (ngControl)\r\n ngControl.valueAccessor = this;\r\n }\r\n\r\n /** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */\r\n public FocusSubject: Subject<void> = new Subject<void>()\r\n /** Timer che verrà impostato a **doubleClickBufferMs** per capire se è stato effettuato un click singolo o un doubleclick */\r\n private cellDbClickTimer: any;\r\n /** Se vengono effettuati 2 click a distanza inferiore a questi Millisecondi viene considerato un doppio click */\r\n private doubleClickBufferMs: number = 200;\r\n /** Tiene da conto l'ultimo elemento selezionato in modo da poter effettuare il SHIFT+CLICK */\r\n private lastSelected: any = null;\r\n\r\n /** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */\r\n public View: any = null; // TODO: signal\r\n /** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */\r\n public arrayPulsanti = signal<{ val: number, cssClass: string }[]>([]);\r\n /** Indica se l'es-table deve mostrare il check globale nell'header per fare il \"seleziona tutto\" */\r\n public globalCheck = model(false);\r\n /** Conteggio interno per il numero di elementi selezionati */\r\n public selectedObjects = signal(0);\r\n /** Indica se è possibile effettuare una selezione massiva */\r\n public canSelectAll = signal<boolean>(false);\r\n /** Indica se il componente sta gestendo un IAppSearch<any> */\r\n public viewMode = signal(false);\r\n /** Indica se il componente sta gestendo un any[] */\r\n public arrayMode = signal(false);\r\n\r\n /**\r\n * Contenitore degli elementi da listare lato interfaccia dopo tutte le elaborazioni del caso,\r\n * generalmente non sono altro che tutti gli oggetti da presentare con in più l'hash calcolato per identificare 1 oggetto con la propria riga\r\n */\r\n public boundSource= signal<any[]>([]);\r\n /** Stessa cosa della **boundSource**, utilizzata come appoggio temporaneo interno */\r\n public TMPBoundSource: any[] = [];\r\n /** @deprecated \"Fetta\" di oggetti utilizzata nell'endless scroll, ogni elemento di questo array è un blocchetto di 100 elementi */\r\n public boundSubSources: any[] = [];\r\n /** @deprecated Questa funge da indicatore per gli slice inseriti, la lunghezza dovrebbe essere corrispondente a **boundSubSources** */\r\n public addedSlices: number[] = [];\r\n /** Variabile che identifica il valore del \"seleziona Tutto\" nella paginazione */\r\n public defaultAllPageOverride = 999999;\r\n /** Serve per tenere in memoria il conteggio precedente e recuperarlo in caso diventi -2 (verificare con Ale perché la logica del -2) */\r\n public previousCount?: number;\r\n /** Indica se utilizzare il sistema di autoupdate, cioè un trigger time-izzato in alto a destra della tabella che ripete le ricerche ogni X **seconds** */\r\n public autoUpdate = model(false);\r\n /** Numero di secondi da fare trascorrere fra una ricerca e l'altra */\r\n public seconds = model(\"10\");\r\n /** Riferimento all'Interval che viene generato se **autoUpdate** è impostata a true in modo da poterlo ripulire */\r\n public updateTimer: any;\r\n /** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */\r\n public researchInProgress = model(false);\r\n /** Modello di appoggio temporaneo per i **RowTDs** */\r\n public TMPRowTDs: { [context: string]: WritableSignal<TdElement>[] } = {};\r\n /** Modello rappresentante un dizionario di righe della tabella, con chiave l'hash e valore la lista di celle */\r\n public RowTDs: { [context: string]: WritableSignal<TdElement>[] } = {};\r\n /** Indica se **RowTDs** è un oggetto vuoto o meno */\r\n public EmptyRowTds = signal(true);\r\n /** Modello di appoggio temporaneo per i **RowTHs** */\r\n public TMPRowTHs: ThElement[] = [];\r\n /** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */\r\n public RowTHs: ThElement[] = [];\r\n /** Modello di appoggio temporaneo per i **RowThGroups** */\r\n public TMPRowThGroups: ThGroup[][] = [];\r\n /** Modello rappresentante un singolo header group della tabella. Questa lista è già ordinata e pronta per essere utilizzata in ngFor */\r\n public RowThGroups: ThGroup[][] | null = [];\r\n\r\n /**\r\n * Lista dei contesti. Un contesto non è altro che un hash particolare calcolato su un oggetto che identifica univocamente tale oggetto.\r\n *\r\n * Ognuno di questi contesti rappresenterà a sua volta, univocamente, una riga all'interno della tabella\r\n */\r\n public RowContexts: any[] = [];\r\n /** Direttive di ordinamento delle colonne (non ordinamento dei dati ma delle colonne in se) */\r\n public OrderDirectives: string[] = [];\r\n /** Codice dell'ultimo oggetto solezionato */\r\n public lastSelectedItemID: string | null = null;\r\n\r\n /**\r\n * Decide se utilizzare o meno le CustomCells. Impostandolo a **true** l'es-table diventa in grado di gestire nativamente:\r\n *\r\n * 1) Ordinamento e visibilità delle colonne\r\n *\r\n * 2) Ordinamento dei dati\r\n *\r\n * 3) Modalità Gerarchica\r\n *\r\n * ecc...\r\n * viene dedotto dal sistema in automatico\r\n */\r\n public UseCustomCells = signal<boolean | null>(null);\r\n\r\n /**\r\n * Indica se oltre alle colonne dinamiche specifiche di un tipo di oggetto ci sono anche colonne dinamiche aggiunte dall'utente\r\n *\r\n * Es. una colonna in cui mostrare sempre un iconcina\r\n */\r\n public UserDefinedDynamicCols = signal<boolean>(false);\r\n /** Indica che questo è il primo Bind della tabella, viene settato a false non appena il primo bind viene terminato con successo */\r\n public FirstBind = signal<boolean>(true);\r\n /** Lista di colonne che si possono visualizzare/ordinare fra di loro */\r\n public ColumnsList: EsTableColumn[] = [];\r\n /** Variabile d'appoggio usata dalla dialog di selezione/nascondimento, per evitare di danneggiare **ColumnsList** in caso di modifiche poi annullate */\r\n public TMPColumnsList: EsTableColumn[] = [];\r\n /** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */\r\n public globalColVisCheck = model(false);\r\n\r\n private setUnderlyingSignal<T>(signalName: string, value: T){\r\n ((this as any)[signalName] as WritableSignal<T>).set(value);\r\n return value;\r\n }\r\n\r\n /** Query per recuperare tutte le direttive per gli editor custom delle celle */\r\n @ContentChildren(EsTdEditorDirective) EsTdEditorDirectives?: QueryList<EsTdEditorDirective>;\r\n /** Query per recuperare tutte le nuove direttive assegnati a direttiva (Per la modalità dinamica dell'es-table) */\r\n @ContentChildren(EsTdDirective) EsTdsDirective?: QueryList<EsTdDirective>;\r\n /** Query per recuperare tutti gli es-td assegnati a direttiva (Per la modalità dinamica dell'es-table) */\r\n @ContentChildren(EsThDirective) EsThsDirective?: QueryList<EsThDirective>;\r\n /** Query per recuperare tutti gli es-td e gli es-th assegnati da parte di un provider (per integrare in maniera dinamica i th e td esistenti) */\r\n @ContentChildren(ThTdProvider) ThTdProvider?: QueryList<ThTdProvider>;\r\n /** Permette di collegare un provider senza passare dalla proiezione */\r\n @Input() EsThTdProvider?: ThTdProvider;\r\n /** Query per recuperare le informazioni del body (punto della tabella dove vengono mostrate le righe) */\r\n @ContentChild('body', { static: false }) public bodyRef: any;\r\n /** Query per recuperare le informazioni dell'header (punto della tabella dove vengono mostrate le intestazioni delle righe) */\r\n @ContentChild('header', { static: false }) public headerRef: any;\r\n /** @deprecated Query per recuperare le informazioni sul raggruppamento degli header */\r\n @ContentChild('headerGroup', { static: false }) public headerGroupRef: any;\r\n /** @deprecated Query per recuperare le informazioni sul raggruppamento di secondo livello degli header */\r\n @ContentChild('secondaryHeaderGroup', { static: false }) public secondaryHeaderGroupRef: any;\r\n /** Query per recuperare il campo di Input attuale. Dopo un doppio click lo becco e lo focusso appena termina la change detection */\r\n @ViewChild('input', { static: false }) public inputField?: ElementRef;\r\n /** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */\r\n CornerMenuOptions = input<CornerMenuOption[]>([]);\r\n /** Indica se dev'essere possibile effettuare il resize delle colonne */\r\n _ColumnsResizable = input<boolean|null>(null, { alias: \"ColumnsResizable\" });\r\n ColumnsResizable = signal<boolean|null>(null);\r\n /** Indica se dev'essere possibile effettuare il pinning delle colonne */\r\n _ColumnsPinnable = input<boolean|null>(null, { alias: \"ColumnsPinnable\" });\r\n ColumnsPinnable = signal<boolean|null>(null);\r\n /** Indica se dev'essere disponibile il sistema di aggiornamento automatico */\r\n _AutoUpdate = input<boolean|null>(null, { alias: \"AutoUpdate\" });\r\n AutoUpdate = signal<boolean|null>(null);\r\n /** Indica l'altezza cablata che deve assumere la tabella. Es: \"100px\" | \"100%\" ... */\r\n Height = input<string|undefined>(undefined);\r\n /** Indica il colore di sfondo dello spazio vuoto (non ricoperto da dati). Particolarmente utile da impostare in caso di **Height** diverso da null */\r\n EmptySpaceBackgroundColor = input<string>(\"\");\r\n /** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/\r\n EsTableHandledSearch = input<boolean>(false);\r\n\r\n /** Permette di impostare l'altezza massima della tabella. Se null la dimensione si adatta al numero di elementi attualmente in visualizzazione */\r\n MaxHeight = input<number|undefined>(undefined);\r\n /** Classi da applicare al contenitore della tabella */\r\n _ContainerClass = input<string|null>(null, { alias: \"ContainerClass\" });\r\n ContainerClass = signal<string|null>(null);\r\n /** Permette o meno l'export in formato XLSX */\r\n XLSXExport = input<boolean>(false);\r\n /** Permette o meno l'export in formato CSV */\r\n CSVExport = input<boolean>(true);\r\n /** Permette di visualizzare o meno l'opzione di paginazione \"Tutti\" */\r\n _AllSearch = input<boolean|null>(null, { alias: \"AllSearch\" });\r\n AllSearch = signal<boolean|null>(null);\r\n /** Diminuisce gli spazi fra una cella e l'altra, e internamente il padding del font in modo da presentare molti più dati in un'unica pagina */\r\n HighCellDensity = input<boolean>(false);\r\n /** Abilita o meno la possibilità di selezionare oggetti */\r\n _Selection = input<boolean|null, boolean|null>(null, { alias: \"Selection\", transform: (value: boolean | null) => this.setUnderlyingSignal(\"Selection\", value) });\r\n Selection = signal<boolean|null>(null);\r\n /** Mostra o meno un messaggio di Loading al primo caricamento della tabella */\r\n ShowLoadingOnBootstrap = input<boolean>(false);\r\n /** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */\r\n Removal = input<boolean>(false);\r\n\r\n /**\r\n * Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata\r\n *\r\n * Come condizione si considera un semplice campo su cui effettuare un controllo booleano, come ad esempio \"canremove\"\r\n */\r\n RemovalCondition = input<string>('');\r\n /** Indica se abilitare la possibilità di esportare la vista dati attuale */\r\n _Export = input<boolean|null>(null, { alias: \"Export\" });\r\n Export = signal<boolean|null>(null);\r\n /** Indica se permettere la selezione multipla Windows-like cliccando un oggetto e facendo poi Shift + click su un oggetto successivo */\r\n _ShiftClick = input<boolean|null>(null, { alias: \"ShiftClick\" });\r\n ShiftClick = signal<boolean|null>(null);\r\n /** Indica il testo che va a sostituire \"Oggetti Visualizzati\" in caso si stia facendo qualcosa di custom */\r\n CountLabel = input<string>(\"\");\r\n /** Indica se nascondere o mostrare il componente di paginazione */\r\n _HidePaging = input<boolean|null>(null, { alias: \"HidePaging\" });\r\n HidePaging = signal<boolean|null>(null);\r\n /** Indica se nascondere o mostrare il conteggio degli elementi trovati */\r\n _HidePagingCount = input<boolean|null>(null, { alias: \"HidePagingCount\" });\r\n HidePagingCount = signal<boolean|null>(null);\r\n /** Indica se nascondere o mostrare i pulsanti di paginazione */\r\n _HidePagingButtons = input<boolean|null>(null, { alias: \"HidePagingButtons\" });\r\n HidePagingButtons = signal<boolean|null>(null);\r\n /** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */\r\n @Input() ContextMenu?: ContextMenuComponent;\r\n /** Nome dell'esportazione generata da questa tabella */\r\n ExportFileName = input<string>(\"Export.csv\");\r\n /** Classe (HTML) di default della tabella */\r\n _TableClass = input<string|null>(null, { alias: \"TableClass\" });\r\n TableClass = signal<string|null>(null);\r\n /** Funzione da utilizzare in esportazione. Ha come parametro una callback con i dati completi da esportare (dato che di default la ricerca è paginata) */\r\n @Input() ExportFunction?: (callback: (data: any[], type: Type<any>) => void, format: \"CSV\" | \"XLSX\") => void;\r\n /** Indica di esportare solo le colonne attualmente visibili della view */\r\n ExportOnlyVisibleColumns = input<boolean>(false);\r\n\r\n /** @deprecated Indica la presenza di raggruppamenti a livello di header */\r\n HasHeaderGroup = input<boolean>(false);\r\n /** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */\r\n HasSecondaryHeaderGroup = input<boolean>(false);\r\n\r\n /** Indica se nascondere gli Header della tabella */\r\n HeaderHidden = input<boolean>(false);\r\n /** Indica se nascondere il Body della tabella */\r\n BodyHidden = input<boolean>(false);\r\n\r\n /**\r\n * Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,\r\n * questo Input gestisce se questi input sono abilitati o meno\r\n */\r\n SelectionDisabled = input<boolean>(false);\r\n\r\n /**\r\n * Indica se forzare il sistema di selezione a gestire un elemento per volta.\r\n * Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale\r\n */\r\n SingleSelection = input<boolean>(false);\r\n /** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */\r\n @Input() RowClassAssigner?: (item: any) => string;\r\n /** Permette di ordinare i dati in maniera discendente o ascendente */\r\n _OrderByColumn = input<boolean|null>(null, { alias: \"OrderByColumn\" });\r\n OrderByColumn = signal<boolean|null>(null);\r\n /** Permette di avere più direttive di ordinamento dei dati */\r\n MultipleOrderingDirectives = input<boolean>(true);\r\n /** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */\r\n _HiddenColumns = input<boolean|null>(null, { alias: \"HiddenColumns\" });\r\n HiddenColumns = signal<boolean|null>(null);\r\n /** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */\r\n _ColumnsOrdering = input<boolean|null>(null, { alias: \"ColumnsOrdering\" });\r\n ColumnsOrdering = signal<boolean|null>(null);\r\n /** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */\r\n SearchView = input<AppSearch<any>|null>(null);\r\n /** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */\r\n _SelectAll = input<boolean|null>(null, { alias: \"SelectAll\" });\r\n SelectAll = signal<boolean|null>(null);\r\n /** Simula la paginazione anche per le tabelle che funzionano in modalità Array */\r\n _UseArrayModePaging = input<boolean|null>(true, { alias: \"UseArrayModePaging\" });\r\n UseArrayModePaging = signal<boolean|null>(true);\r\n /** Definizione di colonne dinamche per la modalità, appunto, dinamica */\r\n _DynamicRowColumnsDefinition = input<EsTableColumnsDefinition[]|null>(null, { alias: 'DynamicRowColumnsDefinition' });\r\n DynamicRowColumnsDefinition = signal<EsTableColumnsDefinition[]|null>(null);\r\n /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */\r\n DynamicOperations = input<EsTableOperationDefinition[]>([]);\r\n /** Indica se visualizzare i dati in maniera gerarchica */\r\n Hierarchy = input<boolean>(false);\r\n /** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */\r\n _ParentKey = input<string|null>('', { alias: \"ParentKey\" });\r\n ParentKey = signal<string|null>('');\r\n /** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */\r\n _OwnKey = input<string|null>('', { alias: \"OwnKey\" });\r\n OwnKey = signal<string|null>('');\r\n /** Indica se lasciare alla tabella l'onere di ordinare gli oggetto che arrivano in base a gerarchia / id */\r\n _AutoSortHierarchy = input<boolean|null>(null, { alias: \"AutoSortHierarchy\" });\r\n AutoSortHierarchy = signal<boolean|null>(null);\r\n /** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */\r\n StartsExpanded = input<boolean>(true);\r\n /** Indica se effettuare il salvataggio delle preferenze di ricerca */\r\n _SavePreferences = input<boolean|null>(null, { alias: \"SavePreferences\" });\r\n SavePreferences = signal<boolean|null>(null);\r\n /** Allineamento di default per celle e headers */\r\n _DefaultAlignment = input<'Left' | 'Right' | 'Center'|null>(null, { alias: \"DefaultAlignment\" });\r\n DefaultAlignment = signal<'Left' | 'Right' | 'Center'|null>(null);\r\n /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n _PagingStyle = input<'both' | 'top' | 'bottom'|null>(null, { alias: \"PagingStyle\" });\r\n PagingStyle = signal<'both' | 'top' | 'bottom'|null>(null);\r\n /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n _RowGroupingPagingStyle = input<'left' | 'right'|null>(null, { alias: \"RowGroupingPagingStyle\" });\r\n RowGroupingPagingStyle = signal<'left' | 'right'|null>(null);\r\n /** Qualora per qualsiasi motivo non venisse usato **items** dell'AppSearch questo Input indica qual è il nome della proprietà da utilizzare */\r\n ItemSourceProperty = input<string>('');\r\n /** Indica se utilizzare la cache di selezione che permette di mantenere gli stati di selezione dei vari oggetti navigando da una pagina all'altra */\r\n _UseSelectionCache = input<boolean|null>(null, { alias: \"UseSelectionCache\" });\r\n UseSelectionCache = signal<boolean|null>(null);\r\n /** Permette di decidere se, in modalità raggruppamento, mostrare o meno il valore delle colonne di gruppo negli oggetti finali. Di default sono nascosti */\r\n _ShowItemGroupsColumns = input<boolean|null>(null, { alias: \"ShowItemGroupsColumns\" });\r\n ShowItemGroupsColumns = signal<boolean|null>(null);\r\n /** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */\r\n Editable = input<boolean>(false);\r\n /** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */\r\n RangeSelection = input<boolean>(false);\r\n /** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */\r\n SearchThrottle = input<number>(50);\r\n /** Evento che viene richiamato al cambio di oridnamento di una colonna */\r\n @Output() onOrderChanged: EventEmitter<AppOrdering> = new EventEmitter<AppOrdering>();\r\n\r\n /**\r\n * Evento che viene richiamato quando l'es-table ritiene sia necessario ri-effettuare la ricerca.\r\n * Il booleano dell'evento indica se viene suggerito di resettare la pagina o meno.\r\n * \r\n * Solo in caso venga utilizzata la modalità a raggruppamenti di righe può succedere che l'es-table passi un intero AppSearch come parametro di ricerca,\r\n * in quel caso l'applicazione ricevente dovrà onorare la richiesta spedendo al backand l'oggetto di ricerca AS-IS\r\n * \r\n * il tipo dell'Emitter invece di essere [boolean | AppSearch<any>] è stato impostato a \"any\" per evitare problemi di retrocompatibilità\r\n */\r\n @Output() onSearchRequest: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento che parte ad ogni modifica di \"checkaggio\" in forma di comodo array. Espone l'oggetto con lo stato di check attuale */\r\n @Output() onSelectionChanged: EventEmitter<ItemsSelection<any>> = new EventEmitter<ItemsSelection<any>>();\r\n /** Evento richiamato all'eliminazione di un oggetto */\r\n @Output() onRemoval: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento richiamato all'annullamento di un'eliminazione */\r\n @Output() onAbortRemoval: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento richiamato alla modifica dei modelli bindati */\r\n @Output() onModelChange: EventEmitter<EsTableModelChange[]> = new EventEmitter<EsTableModelChange[]>();\r\n /** Evento richiamato all'apertura del menù contestuale */\r\n @Output() onOpenContextMenu: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /** Evento richiamato quando si clicca su un opzione definita nelle **CornerMenuOptions** */\r\n @Output() onCornerAction: EventEmitter<{ id: string, estable: any }> = new EventEmitter<{ id: string, estable: any }>();\r\n /** Evento richiamato quando si clicca su un opzione definita nelle **DynamicOperations** */\r\n @Output() onDynamicOperation: EventEmitter<{ id: string, item: any }> = new EventEmitter<{ id: string, item: any }>();\r\n\r\n /** Elemento HTML da cliccare per l'esportazione */\r\n @ViewChild('exportDownloader', { static: false }) public exportDownloader?: ElementRef;\r\n /** Placeholder di menù contestuale per quando non ci sono opzioni nel placeholder \"Vero\" */\r\n @ViewChild('emptyMenu', { static: true }) public tableEmptyMenu?: ContextMenuComponent;\r\n\r\n /** Subscription sull'apertura del context menu da ripulire al destroy della classe */\r\n private ctxMenuSubscription: any;\r\n\r\n /** Pagina in visualizzazione (durante la paginazione in modalità Array) */\r\n public arraymodePage = 1;\r\n /** Numero di pagine (durante la paginazione in modalità Array) */\r\n public arraymodePages = 1;\r\n /** Oggetti per ogni pagina (durante la paginazione in modalità Array) */\r\n _ArraymodeItemsPerPage = input<number|null>(null, { alias: \"ArraymodeItemsPerPage\" });\r\n ArraymodeItemsPerPage = signal<number|null>(null);\r\n /** Oggetto di selezione per la modalità Array, che deve comportarsi come la controparte in modalità View */\r\n public arraymodeSelection?: ItemsSelection<any>;\r\n /** Colonne da visualizzare in modalità array */\r\n public arrayColumns: string[] = [];\r\n /** Ordine delle colonne da visualizzare in modalità array */\r\n public arrayColumnOrdering: string[] = [];\r\n /** Ordinamenti ASC-DESC sulle colonne in modalità array */\r\n public arrayOrders: AppOrdering[] = [];\r\n\r\n /**\r\n * Variabile che serve a gestire il momento in cui l'es-table aggiorna la paginazione (pulsanti ecc).\r\n * Essendo operazioni comunque costose le effettuo solo su binding esterni, non su rewrite generati internamente\r\n */\r\n private internalWriteCall = false;\r\n\r\n /**\r\n * Cache che conterrà tutte le ricerche effettuate su gruppi diversi dal primo e su elementi contenuti nei gruppi.\r\n * In caso di cambi di ordinamento delle colonne diverse dalla prima tutte le chiamate fatte dal secondo livello in poi devono essere rieseguite secondo la seguente logica:\r\n * \r\n * \r\n * **Cambio ordinamento sul primo gruppo**: reload completo, non mi occupo di ripulire gli elementi bindati in alcun modo\r\n * \r\n * **Cambio ordinamento sulla colonna relativa all'N-esimo gruppo**: reload completo del contenuto dei gruppi precedenti, ripulendo precedentemente \r\n * tutti gli elementi con **_grouplevel** = N\r\n * \r\n * **Cambio ordinamento su una colonna non raggruppata**: reload completo per tutti i gruppi finali aperti, devo precedentemente ripulire tutti gli elementi con **_item** = true\r\n * \r\n * Altri eventi non dovrebbero rappresentare problemi:\r\n * - Selezione: non cambia nulla\r\n * - Paginazione: cambia a livello root quindi viene ricaricato tutto comunque, stesso vale per le paginazioni interne\r\n */\r\n public groupSearchRequestsCache: { path: string, route: GroupRouteFragment[], view: AppSearch<any>, group_column: string }[] = [];\r\n\r\n /** Variabile d'appoggio per capire se c'è bisogno di ri-effettuare una ricerca o meno */\r\n private ResearchNeeded: boolean = false;\r\n /** Colonne visibili della vista attuale. Valorizzato di default al numero massimo di colonne supportate dalla tabella per le casistiche in assenza di custom cells */\r\n public Columns = signal<{ Visibile: number, VisibleUnpinned: number, Global: number }>({ Visibile: 100, VisibleUnpinned: 100, Global: 100 });\r\n /** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */\r\n public MainGroupView?: AppSearch<any>;\r\n /** Conteggio base degli oggetti. In modalità normale viene resettato ad ogni nuova View inserita, in modalità RowGrouping viene resettato solo ad una nuova View di livello \"0\" */\r\n public BaseItemsCount: number | null = null;\r\n /** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/\r\n public HasPinnedColumns = signal<boolean>(false)\r\n /** Larghezza calcolata del container delle colonne pinnate */\r\n public PinnedContainerWidth = signal<number|null>(null);\r\n /** Indica se nonostante siamo in modalità array sono stati individuati dei gruppi. In tal caso es-table si comporta da pseudo backend ed effettua le aggregazioni e raggruppamenti completamente lato client */\r\n public ArrayGrouping = signal(false);\r\n /** Indica che l'es-table è basata sulle direttive (nuova modalità) */\r\n public DirectivesBased = signal<boolean>(false);\r\n /** Indica lo stato di selezione per singola cella */\r\n public selectionStatus: { [index: number]: { [index: number]: ItemPropEditableReference } } = {};\r\n /** Chiamata reale al writeValue dopo il passaggio di **SearchThrottle** millisecondi. Solo modalità EsTableHandledSearch */\r\n private callTimeout: any = null;\r\n /** Cache dei th piuttosto che ricalcolarseli di continuo */\r\n private thsCache: { [index: string]: EsThDirective } = {};\r\n /** Indica quando la cache dei th è stata fillata almeno la prima volta */\r\n private thsCacheSet: boolean = false;\r\n\r\n /** Variabili da fillare nell'After Content Init poi da riutilizzare nell'internal post bound source */\r\n private EsTds?: EsTdDirective[];\r\n private EsThs?: EsThDirective[];\r\n /** \r\n * Flag che, se **true**, per un giro di binding mantiene la visibilità impostata localmente, piuttosto che allineare alla View bindata. \r\n * Usata per modificare in maniera programmatica la visibilità delle colonne dal metodo **setHeaderVisibility**, \r\n * \r\n * Disclaimer: **NON MODIFICARE**\r\n **/\r\n public useLocalVisibility: boolean = false;\r\n /** Opzioni di paginazione */\r\n public PagerOptions: PagerInfos = new PagerInfos()\r\n\r\n /** @ignore */\r\n public ngOnInit() {\r\n // click destro su una riga con selezione attiva: Tiro fuori il context menu e selezione l'elemento corrente\r\n let menu = (this.ContextMenu || this.tableEmptyMenu);\r\n if (menu)\r\n this.ctxMenuSubscription = menu.open.subscribe(t => {\r\n // Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...\r\n if (t.item._sep) return;\r\n\r\n let shouldEmit = !t.item._selected;\r\n\r\n t.item._selected = true;\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n var itemSelection = this.selection_H.handleItemsSelection([t.item]);\r\n this.changed();\r\n\r\n if (shouldEmit)\r\n this.onSelectionChanged.emit(itemSelection);\r\n });\r\n\r\n // Assegnazione per tutti gli Input di default\r\n this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));\r\n this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));\r\n this.AllSearch.set(this.utilities_H.InputOrDefault(this._AllSearch(), this.deafults?.AllSearch, true));\r\n this.Export.set(this.utilities_H.InputOrDefault(this._Export(), this.deafults?.Export));\r\n this.HidePaging.set(this.utilities_H.InputOrDefault(this._HidePaging(), this.deafults?.HidePaging, false));\r\n this.HidePagingCount.set(this.utilities_H.InputOrDefault(this._HidePagingCount(), this.deafults?.HidePagingCount));\r\n this.HidePagingButtons.set(this.utilities_H.InputOrDefault(this._HidePagingButtons(), this.deafults?.HidePagingButtons));\r\n this.ContainerClass.set(this.utilities_H.InputOrDefault(this._ContainerClass(), this.deafults?.ContainerClass, ''));\r\n this.TableClass.set(this.utilities_H.InputOrDefault(this._TableClass(), this.deafults?.TableClass, 'table table-striped table-hover table-sm'));\r\n // Ocio al trasnform\r\n this.Selection.set(this.utilities_H.InputOrDefault(this.Selection(), this.deafults?.Selection));\r\n this.SavePreferences.set(this.utilities_H.InputOrDefault(this._SavePreferences(), this.deafults?.SavePreferences));\r\n this.PagingStyle.set(this.utilities_H.InputOrDefault(this._PagingStyle(), this.deafults?.PagingStyle, 'bottom'));\r\n this.RowGroupingPagingStyle.set(this.utilities_H.InputOrDefault(this._RowGroupingPagingStyle(), this.deafults?.RowGroupingPagingStyle, 'left'));\r\n this.UseSelectionCache.set(this.utilities_H.InputOrDefault(this._UseSelectionCache(), this.deafults?.UseSelectionCache, true));\r\n this.ShowItemGroupsColumns.set(this.utilities_H.InputOrDefault(this._ShowItemGroupsColumns(), this.deafults?.ShowItemGroupsColumns, false));\r\n this.ArraymodeItemsPerPage.set(this.utilities_H.InputOrDefault(this._ArraymodeItemsPerPage(), this.deafults?.ArraymodeItemsPerPage, 15));\r\n this.ColumnsPinnable.set(this.utilities_H.InputOrDefault(this._ColumnsPinnable(), this.deafults?.ColumnsPinnable, true));\r\n this.DefaultAlignment.set(this.utilities_H.InputOrDefault(this._DefaultAlignment(), this.deafults?.DefaultAlignment, 'Left'));\r\n this.HiddenColumns.set(this.utilities_H.InputOrDefault(this._HiddenColumns(), null));\r\n this.ColumnsOrdering.set(this.utilities_H.InputOrDefault(this._ColumnsOrdering(), null));\r\n this.OrderByColumn.set(this.utilities_H.InputOrDefault(this._OrderByColumn(), null));\r\n this.SelectAll.set(this.utilities_H.InputOrDefault(this._SelectAll(), null));\r\n this.ShiftClick.set(this.utilities_H.InputOrDefault(this._ShiftClick(), null));\r\n this.UseArrayModePaging.set(this.utilities_H.InputOrDefault(this._UseArrayModePaging(), true));\r\n this.OwnKey.set(this.utilities_H.InputOrDefault(this._OwnKey(), ''));\r\n this.AutoSortHierarchy.set(this.utilities_H.InputOrDefault(this._AutoSortHierarchy(), false));\r\n this.ParentKey.set(this.utilities_H.InputOrDefault(this._ParentKey(), ''));\r\n this.DynamicRowColumnsDefinition.set(this.utilities_H.InputOrDefault(this._DynamicRowColumnsDefinition(), null));\r\n }\r\n\r\n /** @ignore */\r\n async ngAfterViewInit() {\r\n // Se utilizzo la new spicy mode deduco tutti i parametri di lavoro possibili al caricamento della tabella\r\n // Vengono sovrascritte solo le proprietà non impostate dall'utente\r\n this.EsTds = (this.EsTdsDirective?.toArray() || []);\r\n this.EsThs = (this.EsThsDirective?.toArray() || []);\r\n\r\n let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];\r\n if (thsTdsProviders?.length > 0) {\r\n await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();\r\n this.EsTds = [...this.EsTds, ...thsTdsProviders.map(t => t.EsTdsDirective.toArray()).flat()];\r\n this.EsThs = [...this.EsThs, ...thsTdsProviders.map(t => t.EsThsDirective.toArray()).flat()];\r\n }\r\n let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;\r\n let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;\r\n\r\n if (usesThsAndTdsDirectives || hasNoContentProjection) {\r\n if (this.UseCustomCells() == null) this.UseCustomCells.set(true);\r\n if (this.HiddenColumns() == null && this.UseCustomCells()) this.HiddenColumns.set(true);\r\n if (this.ColumnsOrdering() == null && this.UseCustomCells()) this.ColumnsOrdering.set(true);\r\n if (this.OrderByColumn() == null && this.UseCustomCells()) this.OrderByColumn.set(true);\r\n if (this.SelectAll() == null && this.Selection()) this.SelectAll.set(true);\r\n if (this.ShiftClick() == null && this.Selection()) this.ShiftClick.set(true);\r\n this.DirectivesBased.set(true);\r\n }\r\n\r\n //Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,\r\n //che con solo la proiezione (senza celle cusotm) non è disponibile\r\n if (this.Hierarchy() && !this.UseCustomCells())\r\n throw \"Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\\\"true\\\" è richiesto anche [UseCustomCells]=\\\"true\\\"\";\r\n }\r\n\r\n /** @ignore */\r\n public ngOnDestroy() {\r\n if (this.copySubscription)\r\n this.copySubscription.unsubscribe();\r\n\r\n if (this.pasteSubscription)\r\n this.pasteSubscription.unsubscribe();\r\n\r\n if (this.ctxMenuSubscription)\r\n this.ctxMenuSubscription.unsubscribe();\r\n\r\n if (this.copyPasteDetector.ActiveEstReference == this)\r\n this.copyPasteDetector.ActiveEstReference = null;\r\n\r\n this._destroyed$.next();\r\n this._destroyed$.complete();\r\n }\r\n\r\n /** @ignore */\r\n public registerOnChange(fn: any): void { this.propagateChange = fn; }\r\n /** @ignore */\r\n public registerOnTouched(_: any): void { }\r\n /** @ignore */\r\n propagateChange = (_: any) => { };\r\n /** @ignore */\r\n changed(clearItems: boolean = false) {\r\n if (clearItems && this.viewMode()) {\r\n let isprops = this.ItemSourceProperty();\r\n if (!isprops)\r\n (<AppSearch<any>>this.View).items = [];\r\n else\r\n ((<AppSearch<any>>this.View) as any)[isprops] = [];\r\n }\r\n\r\n this.propagateChange(this.View);\r\n }\r\n\r\n /** @ignore */\r\n public async writeValue(obj: any, throttle: boolean = true) {\r\n this.View = obj ? obj : null;\r\n\r\n let sv = this.SearchView();\r\n\r\n // Qui il concetto è \"devo aspettare che l'afterViewInit venga eseguito prima di eseguire questo\"\r\n // E dato che entrambi aspettano sui provider li faccio così\r\n let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];\r\n if (thsTdsProviders?.length > 0)\r\n await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();\r\n\r\n if (this.EsTableHandledSearch() && throttle) {\r\n if (this.callTimeout)\r\n clearTimeout(this.callTimeout);\r\n\r\n this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle());\r\n return;\r\n }\r\n\r\n // Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress\r\n this.researchInProgress.set(false);\r\n\r\n if (!this.View && !sv) {\r\n // Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla\r\n this.boundSource.set(this.TMPBoundSource || []);\r\n\r\n // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n // Se per sbaglio l'oggetto che mi arriva non è tipizzato (instanceof AppSearch restituisce false anche se è del tipo giusto)\r\n // lo correggo--------------------------------------------------------------------------------------------------------------\r\n if (this.View && typeof (this.View as any).itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))\r\n (this.View as any).__proto__ = new AppSearch();\r\n else if (sv && typeof (sv as any).itemsperpageoverride != 'undefined' && !(sv instanceof AppSearch))\r\n (sv as any).__proto__ = new AppSearch();\r\n // -------------------------------------------------------------------------------------------------------------------------\r\n\r\n let isp =this.ItemSourceProperty();\r\n if (this.View && this.View instanceof AppSearch) {\r\n // Se cambia l'oggetto intero significa che ho rimandato la ricerca\r\n this.setMode('view');\r\n\r\n let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;\r\n\r\n // Queste sono item source custom. Le valorizzo al default se non esistono\r\n if (isp && !(this.View as any)[isp])\r\n (this.View as any)[isp] = [];\r\n\r\n // Se vengo da una ricerca interna mantengo lo stato di selezione precedente (quindi su cambio pagina, cambio ipp, ecc...)\r\n // se invece l'utente ha fatto una ricerca lui (quindi cambiando filtri), secco le info di selezione\r\n if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache())\r\n this.resetSelection(true);\r\n\r\n this.View.internalsearchrequest = false;\r\n\r\n // Recupero Preference\r\n if (this.SavePreferences()) {\r\n if (!this.ngControl.name)\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per questa tabella\");\r\n else if (!this.prefService)\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n else {\r\n var prefs = await this.prefService.getItem<{ columns: string[], column_ordering: string[], orders: AppOrdering[] }>(<string>this.ngControl.name).toPromise();\r\n // In casi la gente si metta a spammare refresh con ngif strani sull'estable creandola e distruggendola N volte al secondo nel tempo che ci mette\r\n // a tirare su le preference da qui sopra la View potrebbe essere cambiata\r\n if (this.View) {\r\n let cols = prefs?.columns || [];\r\n let updatedPrefs = true;\r\n let repository: string[];\r\n let source: string[];\r\n\r\n if (this.View.report_columns) {\r\n repository = this.View.report_columns.map(t => t.id);\r\n source = cols;\r\n }\r\n else {\r\n repository = cols;\r\n source = this.View.columns;\r\n }\r\n\r\n // In modalità report devo controllare che tutte le colonne salvate facciano parte della vista\r\n // In modalità normale invece se le preferenze fanno riferimento a delle colonne che io non ho nella View attuale significa che\r\n // sto facendo riferimento a una versione vecchia dell'es-table, quindi non faccio operazioni\r\n for (let i = 0; i < source.length; i++) {\r\n if (repository.indexOf(source[i]) == -1) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n\r\n // Se mi baso su direttive ma nelle preference è presente anche solo una colonna non presente nelle direttive \r\n // vuol dire che l'es-table è cambiata quindi non imposto preference\r\n if ((this.EsThsDirective?.length || 0) > 0) {\r\n for (let i = 0; i < repository.length; i++) {\r\n if (this.thsCacheSet && !this.thsCache[repository[i]]) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (updatedPrefs) {\r\n this.View.columns = prefs?.columns || [];\r\n this.View.column_ordering = prefs?.column_ordering || [];\r\n // Se le pref sono nulle non sovrascrivo gli ordini dato che potrebbe servire mettere degli ordinamenti di default lato ts\r\n if (prefs)\r\n this.View.orders = prefs?.orders || [];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (firstItemGroupOrNoGrouping)\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (isp ? (this.View as any)[isp] : this.View.items).length, this.View.itemsperpageoverride));\r\n }\r\n else if (this.View && (this.View.length != null && this.View.length != undefined)) {\r\n this.setMode('array');\r\n\r\n if (!this.UseSelectionCache() || !this.arraymodeSelection)\r\n this.resetSelection(true);\r\n\r\n // Recupero Preference\r\n if (this.SavePreferences()) {\r\n if (!this.ngControl.name)\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per questa tabella\");\r\n else if (!this.prefService)\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n else {\r\n var prefs = await this.prefService.getItem<{ columns: string[], column_ordering: string[], orders: AppOrdering[] }>(<string>this.ngControl.name).toPromise();\r\n let cols = prefs?.columns || [];\r\n let updatedPrefs = true;\r\n let repository: string[];\r\n let source: string[];\r\n\r\n if (this.View.report_columns) {\r\n repository = this.View.report_columns.map((t: any) => t.id);\r\n source = cols;\r\n }\r\n else {\r\n repository = cols;\r\n source = this.View.columns;\r\n }\r\n\r\n // In modalità report aggiorno le preferenze solo se c'è almeno una colonna, altrimenti vuol dire che si parte da vuoti\r\n // con tutte le colonne disponibili\r\n if (this.View.report_columns && (source?.length || 0) == 0)\r\n updatedPrefs = false;\r\n\r\n // In modalità normale invece se le preferenze fanno riferimento a delle colonne che io non ho nella View attuale significa che\r\n // sto facendo riferimento a una versione vecchia dell'es-table, quindi non foccio operazioni\r\n for (let i = 0; i < source.length; i++) {\r\n if (repository.indexOf(source[i]) == -1) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n\r\n if (updatedPrefs) {\r\n this.View.columns = prefs?.columns || [];\r\n this.View.column_ordering = prefs?.column_ordering || [];\r\n // Se le pref sono nulle non sovrascrivo gli ordini dato che potrebbe servire mettere degli ordinamenti di default lato ts\r\n if (prefs)\r\n this.View.orders = prefs?.orders || [];\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.finalizeContext();\r\n\r\n this.postBoundSourceCalculation();\r\n\r\n if(!this.EsTableHandledSearch() || !this.View)\r\n return;\r\n\r\n if (!this.View.selfsearch && !this.View.firstsearch) {\r\n this.View.selfsearch = true;\r\n this.changed(true);\r\n this.onSearchRequest.emit(false)\r\n }\r\n else if (this.View.selfsearch) {\r\n this.View.selfsearch = false;\r\n this.changed();\r\n }\r\n }\r\n\r\n /** Funzione di trackby per il body che dovrebbe evitare il 90% delle change detection */\r\n public bodyTrackBy = (_: number, item: any) => item._hash;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo id */\r\n public idTrackBy = (_: number, item: any) => item.id;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo PropertyName */\r\n public PropertyNameTrackBy = (_: number, item: any) => item.PropertyName;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */\r\n public IDTrackBy = (_: number, item: any) => item.ID;\r\n public IDTrackByOfSignal = (_: number, item: WritableSignal<any>) => item().ID;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID e Order significativi */\r\n public IDAndOrderTrackBy = (_: number, item: any) => `${item.ID}|${item.Order}`;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */\r\n public valTrackBy = (_: number, item: any) => item.val;\r\n\r\n /**\r\n * Successivamente al bind del nuovo input questa funzione si occupa di finalizzare tutti i parametri di funzionamento dell'es-table \r\n * in base a Input - Modello, e qualsiasi altra cosa possa servire\r\n */\r\n private finalizeContext() {\r\n let viewCasted = this.View as AppSearch<any>;\r\n\r\n let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective?.some(t => t.thGroup));\r\n\r\n // Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate\r\n if (this.arrayMode() && hasRowGroups)\r\n this.UseArrayModePaging.set(false);\r\n\r\n // Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia\r\n this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);\r\n\r\n // Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource\r\n if (this.Hierarchy() && !hasRowGroups)\r\n this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);\r\n\r\n // L'hashing degli oggetti lo faccio a prescindere\r\n this.utilities_H.calculateHash(this.TMPBoundSource);\r\n\r\n // Assegno a una variabile mia l'eventuale override per la classe della riga\r\n // Se poi sono in modalità gerarchica inietto anche la classe per la configurazione del livello della riga\r\n if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy()) {\r\n for (let i = 0; i < this.TMPBoundSource.length; i++) {\r\n let item = this.TMPBoundSource[i];\r\n item._rowClass = this.RowClassAssigner?.(item) || \"\";\r\n item._rowClass += this.Hierarchy() ? \" est-row-lvl-\" + item._level : \"\";\r\n }\r\n }\r\n }\r\n\r\n /** Genera le informzioni di paginazione per la vista globale dell'es-table */\r\n private setupPagingInformations() {\r\n\r\n // Default che valgono di base, poi eventualmente moddati dalle funzioni sotto\r\n this.PagerOptions.ShowCount = !this.HidePagingCount();\r\n this.PagerOptions.ShowButtons = !this.HidePagingButtons();\r\n this.PagerOptions.ShowPaging = !this.HidePaging()\r\n this.PagerOptions.UsesView = true;\r\n\r\n let sv = this.SearchView();\r\n\r\n if (this.arrayMode() && this.UseArrayModePaging() && !sv) {\r\n this.PagerOptions.PagerCount = (<any[]>this.View).length || 0;\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && this.View.length > 10;\r\n this.PagerOptions.View = this.View;\r\n this.PagerOptions.UsesView = false;\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n else if (this.arrayMode() && (!this.UseArrayModePaging() || sv)) {\r\n if (sv) {\r\n this.PagerOptions.View = sv;\r\n this.PagerOptions.PagerCount = sv.objectcount || 0;\r\n }\r\n else\r\n this.PagerOptions.PagerCount = (<any[]>this.View).length || 0\r\n\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (sv?.objectcount || 0) > 10);\r\n this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (sv && sv.objectcount && sv.objectcount != -1);\r\n this.PagerOptions.ShowPaging = this.PagerOptions.ShowPaging && (this.PagerOptions.ShowButtons || this.PagerOptions.ShowCount);\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n else if (this.viewMode()) {\r\n let tmpView = this.MainGroupView || this.View;\r\n let count = tmpView?.groupcount || tmpView?.objectcount;\r\n this.PagerOptions.Searches = tmpView?.groupcount != null && tmpView?.groupcount != undefined ? 'groups' : 'items';\r\n this.PagerOptions.PagerCount = count || 0;\r\n this.PagerOptions.View = tmpView;\r\n this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (tmpView && count && count != -1);\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (tmpView.pagingavailable || this.PagerOptions.ShowCount);\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo lanciato dopo che la sorgente dati è stata correttamente bindata, si occupa di ricalcolare tutto ciò che serve\r\n * all'es-table per renderizzare i valori da mostrare\r\n */\r\n private postBoundSourceCalculation() {\r\n // Resetto tutto tranne RowTDs e RowTHs per evitare flickering. RowTDs e RowTHs saranno modificate all'interno del prossimo ciclo di CD\r\n this.RowContexts = [];\r\n this.OrderDirectives = [];\r\n this.lastSelectedItemID = null;\r\n\r\n this.internalPostBoundSource();\r\n }\r\n\r\n /** Per poter distinguere le chiamate a questo metodo: Dopo il setTimeout se uso gli EsTd/EsTh vecchi, senza il setTimeout se uso le nuove direttive */\r\n private async internalPostBoundSource() {\r\n let View = this.View;\r\n\r\n let viewMode = this.viewMode();\r\n let arrayMode = this.arrayMode();\r\n let isp = this.ItemSourceProperty();\r\n let customCells = this.UseCustomCells();\r\n\r\n // Se non ho colonne dinamiche ma sono in modalità dinamica (lo capisco perché c'è una view piena di genericitem) metto il default delle colonne\r\n this.dynamicMode_H.eventuallyReviewDynamicColumns();\r\n\r\n // Assolutamente da fare dopo il eventuallyReviewDynamicColumns()\r\n let dynColDefs = this.DynamicRowColumnsDefinition();\r\n\r\n\r\n // Gestisce la richiesta per gruppi o per singoli oggetti\r\n this.bindDisplayToLoadedItemsOrGroups(View);\r\n\r\n // Questo dev'essere per forza lanciato dopo **bindDisplayToLoadedItemsOrGroups** dato che è lì che alcune cose vengono valorizzate\r\n this.setupPagingInformations();\r\n\r\n // Molte cose sono ovviamente disponibili solo in modalità View\r\n if ((viewMode || arrayMode) && customCells) {\r\n let view = viewMode ? View as AppSearch<any> : null;\r\n let itemsAndGroups = viewMode ? [...((isp ? (view as any)[isp] : view?.items) || []), ...(view?.groups || [])] : View as any[];\r\n let si = viewMode ? view?.selection : this.arraymodeSelection;\r\n\r\n // N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE\r\n // ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************\r\n\r\n // Se ho definizioni dinamiche, prima di qualsiasi altra cosa devo trasformarle in th/td in modo che poi il codice qui sotto faccia le sue magie\r\n if ((dynColDefs?.length || 0) > 0) {\r\n this.logger.log(\"Generating ths and tds from Dynamic definition\");\r\n let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();\r\n this.EsThs = ret.ths;\r\n this.EsTds = ret.tds;\r\n }\r\n\r\n // Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view\r\n if (!this.arrayMode() && view?.report_columns) {\r\n this.logger.log(\"Generating ths and tds from report results\");\r\n let ret = this.reportMode_H.generateThsAndTdsFromView(view);\r\n this.EsThs = ret.ths;\r\n this.EsTds = ret.tds;\r\n }\r\n\r\n // Espando i th e i td multipli duplicandoli\r\n let ret = this.columnMetadata_H.expandMultiThsAndTds(this.EsThs || [], this.EsTds || [], itemsAndGroups);\r\n this.EsThs = ret.expThs;\r\n this.EsTds = ret.expTds;\r\n\r\n // Genero la cache dei th da usare da qui in poi, dopo avergli lasciato fare le sue cose in caso ci siano dei multi o dei report\r\n for (let i = 0; i < this.EsThs.length; i++) {\r\n let th = this.EsThs[i];\r\n this.thsCache[th.th] = th;\r\n }\r\n this.thsCacheSet = true;\r\n\r\n // Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo\r\n let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);\r\n\r\n // Valuta lo stato iniziale di selezione a range\r\n this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, dynColDefs || []);\r\n\r\n if (this.arrayMode()) // In modalità array non ho un backend...\r\n this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client\r\n\r\n this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc\r\n this.columnMetadata_H.alignColumnsIfLoadedView(view!); // Se sto caricando una View da hotpotato (quindi con savedstate = true) riallineo la visibilità delle colonne e il loro ordine.\r\n this.columnMetadata_H.moveFixedColumnsAtTheBeginning(hI.leafs, this.EsTds); // Sposto tutte le cose fixed all'inizio in modo che la creazione di th e td sia più snella (Utilizza le ColumnsList, quindi dev'essere richiamata PIRMA di reviewColumnsList)\r\n this.columnMetadata_H.alignHeadersOrdering(hI.leafs, view!); // Allineo gli ordinamenti agli header\r\n this.columnMetadata_H.refreshColumnsVisibility(hI.leafs, this.EsTds, view!); // Lavoro sui TH ed eventualmente modifico la visibilità anche dei TD.\r\n this.columnMetadata_H.evaluatePinnedColumnsWidth(); // Se sono presenti colonne pinnate valuta la dimensione del contenitore\r\n this.columnMetadata_H.generateDefaultOrder(hI.leafs, view!); // Genero le direttive di ordinamento, che siano default o derivanti dalla AppSearch\r\n this.columnMetadata_H.evaluateHeaderGroups(hI); // Valuto i raggruppamenti degli header se presenti\r\n\r\n // ************************************* Generazione binding per righe e colonne *************************************\r\n\r\n this.evaluateRowThs(hI.leafs); // Raccolgo i TH\r\n this.evaluateRowTds(hI.leafs, this.EsTds); // Raccolgo i TD in contesti separati, un contesto per ogni item o gruppo\r\n\r\n // ************************************* Ultimi aggiustmaenti dei binding *************************************\r\n\r\n this.columnMetadata_H.applyOrdering(view!, true); // Applico l'ordinamento sulle colonne (non ASC DESC, ma \"prima questa o quella colonna\")\r\n this.MoveTemporaryVariablesToRealOnes(); // Collego TH e TD aggiustati fino ad ora alle variabili di Binding HTML\r\n this.selection_H.evaluateSelection(itemsAndGroups, si); // Riallineo le info di selezione degli elementi della View\r\n\r\n if (this.ResearchNeeded) {\r\n this.changed();\r\n this.emitSearchRequest(false);\r\n this.ResearchNeeded = false;\r\n }\r\n }\r\n else if ((viewMode || arrayMode) && !customCells) {\r\n // Riallineo le info di selezione degli elementi della View\r\n let items = viewMode ? (isp ? (View as any)[isp] : (View as AppSearch<any>).items) : View as any[];\r\n let si = viewMode ? (View as AppSearch<any>).selection : this.arraymodeSelection;\r\n this.selection_H.evaluateSelection(items, si);\r\n }\r\n\r\n // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica\r\n this.cdr.markForCheck();\r\n this.FirstBind.set(false);\r\n }\r\n\r\n /**\r\n * Effettua il binding degli oggetti pervenuti da questa chiamata con gli oggetti effettivamente da graficare\r\n * \r\n * @param {any} view View da cui sono arrivati gli oggetti. Può essere o un array se sono in **arrayMode** o una AppSearch<T> se sono in **viewMode**\r\n */\r\n private bindDisplayToLoadedItemsOrGroups(view: any) {\r\n if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {\r\n this.BaseItemsCount = 0;\r\n this.boundSource.set([]);\r\n return;\r\n }\r\n\r\n if (this.arrayMode() || !this.UseCustomCells()) {\r\n this.boundSource.set(this.TMPBoundSource);\r\n this.BaseItemsCount = view?.objectcount || view?.length || 0;\r\n return;\r\n }\r\n\r\n let groupingKeys = view?.groupings?.filter((t: any) => !t.aggregation)?.length || 0;\r\n if (groupingKeys == 0) {\r\n this.boundSource.set(this.TMPBoundSource);\r\n this.BaseItemsCount = view?.objectcount || 0;\r\n return;\r\n }\r\n\r\n this.rowGrouping_H.handleNewDataOnRowGrouping(view, groupingKeys);\r\n }\r\n\r\n /** Metodo richiamato solo quando **TMPRowTDs** e **TMPRowTHs** sono completamente generati ed aggiustati. Serve per collegarli alle variabili usate lato binding HTML */\r\n private MoveTemporaryVariablesToRealOnes() {\r\n\r\n this.RowTDs = this.TMPRowTDs;\r\n this.RowTHs = this.TMPRowTHs;\r\n this.RowThGroups = this.TMPRowThGroups ? this.TMPRowThGroups.reverse() : null;\r\n this.EmptyRowTds.set(this.isEmpty(this.RowTDs));\r\n\r\n let vis = this.RowTHs.filter(t => t.Visible).length;\r\n let visUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;\r\n let global = visUnpinned + (this.HasPinnedColumns() ? 1 : 0) + (this.Selection() ? 1 : 0) + (this.Removal() ? 1 : 0) + (this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions() ? 1 : 0)\r\n\r\n let newValue = {Visibile : vis, VisibleUnpinned: visUnpinned, Global: global};\r\n this.Columns.set(newValue);\r\n }\r\n\r\n /** \r\n * Metodo per capire se un oggetto è completamente vuoto \r\n * \r\n * @param {any} obj Oggetto da controllare\r\n * \r\n * @returns {boolean} **true** se l'oggetto è vuoto, **false** altrimenti\r\n */\r\n isEmpty(obj: any): boolean {\r\n for (var _ in obj) { return false; }\r\n return true;\r\n }\r\n\r\n /**\r\n * Permette di selezionare o deselezionare in maniera arbitraria degli oggetti\r\n * \r\n * @param {any[]} items Oggetti da selezionare o deselezionare\r\n * @param {boolean} select **true** per selezionarli, **false** per non toccarli\r\n */\r\n public setSelectionStatus(items: any[], all: boolean, select: boolean, emit: boolean = false) {\r\n if (all) {\r\n if (!this.SelectAll()) {\r\n console.error(\"Impossibile impostare la selezione con l'all selection quando l'Input SelectAll è false\");\r\n return;\r\n }\r\n\r\n let si = (this.View as AppSearch<any>)?.selection || this.arraymodeSelection;\r\n //se deseleziono con attuale selezione ad all o se seleziono con attuale selezione manuale devo richiamare la **selectAllOrResetSelection**\r\n if ((si.all && !select) || (!si.all && select))\r\n this.selection_H.selectAllOrResetSelection();\r\n }\r\n else\r\n this.selection_H.handleItemsSelection(items, select);\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (emit)\r\n this.onSelectionChanged.emit(this.arraymodeSelection);\r\n }\r\n\r\n /**\r\n * Effettua un hard reset della selezione\r\n */\r\n public resetSelection(emit: boolean = false) {\r\n this.selection_H.clearSelectionCaches();\r\n\r\n if (this.viewMode() && this.View) {\r\n this.View.selection = new ItemsSelection([]);\r\n if (emit)\r\n this.onSelectionChanged.emit(this.View.selection);\r\n }\r\n else if (this.arrayMode()) {\r\n this.arraymodeSelection = new ItemsSelection([]);\r\n if (emit)\r\n this.onSelectionChanged.emit(this.arraymodeSelection);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che gestisce il cambio di Ordinamento di una colonna\r\n *\r\n * @param {string} id ID della colonna il cui oridnamento è cambiato\r\n * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna\r\n */\r\n public thOrderChanged(id: string, order: 'DESC' | 'ASC' | null) {\r\n if (!this.viewMode() && !this.arrayMode()) {\r\n console.warn('Order changed on a table not in viewMode or Array mode. Operation not supported');\r\n return;\r\n }\r\n\r\n if (!this.OrderByColumn())\r\n return;\r\n\r\n this.columnMetadata_H.handleTHOrderChange(id, order ? order: undefined);\r\n }\r\n\r\n /**\r\n * Metodo da chiamare ogni volta che si vuole dare evidenza all'esterno del bisogno di rieffettuare la ricerca\r\n * \r\n * @param {boolean} resetsPage Indica al listener che deve resettare il numero di pagina\r\n * @param {AppSearch<any>} viewOverride Override della view da emettere per questa ricerca\r\n */\r\n public emitSearchRequest(resetsPage: boolean, viewOverride?: AppSearch<any>) {\r\n if (this.viewMode() && !viewOverride) {\r\n (this.View as AppSearch<any>).internalsearchrequest = true;\r\n this.changed();\r\n }\r\n\r\n if (viewOverride) {\r\n if (resetsPage)\r\n viewOverride.page = 1;\r\n viewOverride.internalsearchrequest = true\r\n }\r\n\r\n this.researchInProgress.set(true);\r\n\r\n if (this.View && !this.View.selfsearch && this.EsTableHandledSearch()) {\r\n this.View.selfsearch = true;\r\n this.changed(true);\r\n this.onSearchRequest.emit(false)\r\n }\r\n else\r\n this.onSearchRequest.emit(viewOverride ? viewOverride : resetsPage);\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsTds** bindati genera, all'interno del dizionario **TMPRowTDs** tutti i contesti dei vari oggetti.\r\n *\r\n * Vengono esclusi i TD \"Interni\" in quanto vengono generati dagli originali quindi includerli vorrebbe dire rieffettuare le operazioni due volte\r\n *\r\n * Costo: 2 scan EsThs, 1 scan EsTds\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n * @param {EsTdDirective[]} tds Celle della tabella\r\n */\r\n private evaluateRowTds(ths: EsThDirective[], tds: EsTdDirective[]) {\r\n if (tds.length == 0)\r\n return;\r\n\r\n let columnsCache: { [index: string]: EsTableColumn } = {};\r\n\r\n for (let coli = 0; coli < this.ColumnsList.length; coli++) {\r\n let col = this.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n }\r\n\r\n this.TMPRowTDs = {};\r\n let bs = this.boundSource();\r\n let defaultAlignment = this.DefaultAlignment();\r\n\r\n // Variabile d'appoggio per permettermi di inserire tutte le colonne \"Fixed\" davanti\r\n let contextFixeds: { [context: string]: number } = {};\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n\r\n // Valori costanti per colonna: calcolati una sola volta invece che per ogni riga\r\n let key = td.td;\r\n let th = this.thsCache[td.td];\r\n\r\n if (!!th)\r\n th._referenced = true;\r\n\r\n // Skippare senza th (casistica tabella dinamica)\r\n if (!(th && th.thIf && (td.tdIf || th.thGroup)))\r\n continue;\r\n\r\n let thCasted = <EsThDirective>th;\r\n let colDef = columnsCache[td.td];\r\n let isFixed = th.thFixed || th.thGroup || th.thPinned;\r\n let multiProp = td._multi ? td.td.split('_')[0] : null;\r\n let multiIndex = td._multi ? td.td.split('_')[1] : null;\r\n let alignment = (td.tdAlignment || th.thAlignment || defaultAlignment).toLowerCase();\r\n let format = td.tdFormat || th.thFormat;\r\n let template = thCasted.thGroup && !this.ShowItemGroupsColumns ? null : td.Template;\r\n let groupClass = thCasted.thGroupClass || '';\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let item = bs[i];\r\n let ctx = item._hash;\r\n\r\n let itemToAdd = item._item ?\r\n <TdElement>{\r\n LeftBorder: (<any>thCasted)._lbord,\r\n RightBorder: (<any>thCasted)._rbord,\r\n ID: key,\r\n Pinned: colDef.pinned,\r\n PinnedWidth: thCasted.thPinnedWidth,\r\n GroupHeader: false,\r\n GroupAggregation: false,\r\n Visible: colDef.visible,\r\n Wraps: false,\r\n Class: td.tdClass,\r\n IconClass: td.tdIconClass,\r\n ConditionField: td.tdConditionField,\r\n ConditionValue: td.tdConditionValue,\r\n Title: td.tdTitle,\r\n Content: td.tdContent,\r\n Template: template,\r\n Multi: td._multi,\r\n MultiProp: multiProp,\r\n MultiIndex: multiIndex,\r\n Alignment: alignment,\r\n Format: format,\r\n PropertyName: th.thProperty,\r\n PropertyType: th.thType,\r\n PropertySource: th.thSource,\r\n EditorOptions: th.thEditorOptions,\r\n PropAccessor: td.tdPropertyAccessor,\r\n RoutePath: (<any>thCasted).thRoutePath,\r\n RouteParameterProperties: (<any>thCasted).thRouteParameterProperties\r\n } :\r\n <TdElement>{\r\n LeftBorder: (<any>thCasted)._lbord,\r\n RightBorder: (<any>thCasted)._rbord,\r\n ID: key,\r\n Pinned: colDef.pinned,\r\n PinnedWidth: thCasted.thPinnedWidth,\r\n GroupHeader: thCasted.thGroup,\r\n GroupAggregation: !!thCasted.thAggregation,\r\n Visible: colDef.visible,\r\n Wraps: false,\r\n Class: groupClass,\r\n Content: this.rowGrouping_H.getGroupCellDisplay(<Group>item, key, <EsThDirective>th)\r\n };\r\n\r\n if (this.TMPRowTDs[ctx]) {\r\n this.TMPRowTDs[ctx].push(signal(itemToAdd));\r\n }\r\n else {\r\n this.RowContexts.push(ctx);\r\n this.TMPRowTDs[ctx] = [signal(itemToAdd)];\r\n contextFixeds[ctx] = isFixed ? 1 : 0;\r\n }\r\n }\r\n }\r\n\r\n // Se non ho oggetti è inutile che controllo gli errori, dato che gli es-td non esisteranno di certo e di conseguenza gli es-th non saranno referenziati\r\n if (this.TMPBoundSource.length == 0)\r\n return;\r\n\r\n var errs: string[] = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n if (!th._referenced)\r\n errs.push(th.th);\r\n }\r\n\r\n if (errs.length > 0) {\r\n var errIds = errs.join(', ');\r\n throw \"L'ID di uno o più EsTh non hanno alcun EsTd associato: \" + errIds;\r\n }\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsThs** bindati genera, all'interno del dizionario **TMPRowTHs** tutti i contesti dei vari oggetti.\r\n *\r\n * Vengono esclusi i TH \"Interni\" in quanto vengono generati dagli originali quindi includerli vorrebbe dire rieffettuare le operazioni due volte\r\n *\r\n * Costo: 1 scan EsThs + 1 scan ColumnsList\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n private evaluateRowThs(ths: EsThDirective[]) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n let columnsListCache: { [index: string]: EsTableColumn } = {};\r\n let castedView = <AppSearch<any>>this.View;\r\n let groupingsUndefined = this.viewMode() && (castedView && !castedView.groupings || castedView.groupings.length == 0);\r\n\r\n for (let i = 0; i < this.ColumnsList.length; i++) {\r\n let itm = this.ColumnsList[i];\r\n columnsListCache[itm.id] = itm\r\n }\r\n\r\n this.TMPRowTHs = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let toAdd: ThElement;\r\n\r\n if (th.thIf || th.thGroup) {\r\n\r\n let thClass = (th.thClass || \"\") + (th.thShrink ? \" app-col-min\" : \"\") + (th.thGroup ? \" est-col-min\" : \"\");\r\n toAdd = {\r\n Pinned: !!columnsListCache[th.th].pinned,\r\n Fixed: th.thFixed,\r\n PinnedWidth: th.thPinnedWidth,\r\n ID: th.th,\r\n Visible: th.thVisible,\r\n Class: thClass,\r\n Order: th.thOrder || null,\r\n Orderable: th.thOrderable,\r\n Template: th.Template,\r\n Alignment: (th.thAlignment || this.DefaultAlignment() || \"Left\").toLowerCase(),\r\n // Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header\r\n Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,\r\n Wrap: th.thWrap,\r\n LeftBorder: (<any>th)._lbord,\r\n RightBorder: (<any>th)._rbord,\r\n Multi: th._multi,\r\n MultiContent: th._multi_content\r\n };\r\n this.TMPRowTHs.push(toAdd);\r\n\r\n // Se ho un modello che deve funzionare a rowgrouping ma non è ancora stata effettuata nessuna ricerca sui gruppi principali (groupingsUndefined)\r\n // li genero e mando la prima ricerca che dev'essere spedita al backend per il primo caricamento dei gruppi\r\n if (groupingsUndefined && (th.thAggregation || th.thGroup)) {\r\n let groupAggregations: GroupOrAggregation[] = this.rowGrouping_H.getGroupAggregations(th);\r\n if (!castedView.groupings)\r\n castedView.groupings = groupAggregations;\r\n else\r\n castedView.groupings.push(...groupAggregations);\r\n\r\n this.ResearchNeeded = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sposta la ricerca di una pagina in avanti (o indietro)\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n * @param {any} pager Elemento di separazione su cui è effettuata la ricerca\r\n */\r\n public addToPageGroup(page: number, pager: GroupPager) {\r\n this.goToPageGroup(pager.view.page + page, pager);\r\n }\r\n\r\n /**\r\n * Sposta la ricerca alla pagina specificata\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n * @param {any} pager Elemento di separazione su cui è effettuata la ricerca\r\n */\r\n public goToPageGroup(page: number, pager: GroupPager) {\r\n\r\n let appSearchElement = pager.view;\r\n if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))\r\n return;\r\n\r\n appSearchElement.page = page;\r\n pager.buttons = this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages);\r\n\r\n this.emitSearchRequest(false, appSearchElement);\r\n }\r\n\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Gestisce i click sulla tabella solo per le righe a gruppo. \r\n * O rimuove gli elementi attualmente presenti o carica il contenuto del gruppo\r\n *\r\n * @param {any} group Gruppo bindato su cui si è effettuato il click\r\n *\r\n * @returns {boolean} **true** se l'operaizone è andata a buon fine, **false** altrimenti\r\n */\r\n public handleGroupClick(group: Group): boolean {\r\n let casted = this.View as AppSearch<any>;\r\n let anyG = (<any>group);\r\n anyG._expanded = !anyG._expanded;\r\n\r\n // Sono in modalità raggruppamento virtuale da array: Espandere significa rendere visibili tutti gli oggetti relativi a questo gruppo, viceversa il contrarre\r\n if (this.ArrayGrouping()) {\r\n let allRelatives = this.boundSource().filter(t =>\r\n (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||\r\n (t._item && ((anyG._expanded && t._thisKey == anyG._thisKey) || (!anyG._expanded && t._thisKey.startsWith(anyG._thisKey)))))\r\n allRelatives.forEach(t => { t._visible = anyG._expanded; if (t._group) t._expanded = false });\r\n return true;\r\n }\r\n\r\n if (anyG._expanded) {\r\n // Resetto ipp\r\n casted.itemsperpageoverride = 15;\r\n if (!casted.requestedgroups)\r\n casted.requestedgroups = [new GroupFilter(group.column, group.value)];\r\n else {\r\n let level = anyG._grouplevel;\r\n // se il gruppo cliccato non ha un livello è il primo gruppo, quindi ordinamento unico\r\n // altrimenti devo rimuovere tutti i filtri su livelli superiori al level cliccato e aggiungere il level cliccato\r\n if (!level)\r\n casted.requestedgroups = [new GroupFilter(group.column, group.value)];\r\n else {\r\n casted.requestedgroups = [];\r\n anyG._parentRoute.forEach((step: GroupRouteFragment) => {\r\n casted.requestedgroups.push(new GroupFilter(step.column, step.value));\r\n });\r\n casted.requestedgroups.push(new GroupFilter(group.column, group.value));\r\n }\r\n }\r\n\r\n this.changed();\r\n this.emitSearchRequest(true);\r\n }\r\n else {\r\n let path = (anyG._parent || '') + group.value;\r\n\r\n // Se ho chiuso un gruppo non mi serve rieffettuare ricerce, mi basta eliminare dagli oggetti bindati tutti gli elementi sottostanti a quel gruppo\r\n this.boundSource.set(this.boundSource().filter(t => !t._parent || !t._parent.startsWith(path)));\r\n\r\n // devo però anche rimuovere eventuali cache relative\r\n this.groupSearchRequestsCache = this.groupSearchRequestsCache.filter(t => t.path != path);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Gestisce la selezione globale degli oggetti, sia per pagina che a livello di **SelectAll**\r\n *\r\n * @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti\r\n */\r\n public globalCheckChanged(forcedVal: boolean | null = null) {\r\n\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n\r\n let bs = this.boundSource();\r\n // Prendo tutti gli elementi presenti in questa vista. Se ho gruppi prendo solo i gruppi a livello 0, altrimenti prendo tutti gli oggetti per selezionarli\r\n let items = bs.find(t => t._group) ? bs.filter(t => t._group && !t._parent) : bs;\r\n var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck());\r\n this.changed();\r\n\r\n this.onSelectionChanged.emit(itemSelection);\r\n }\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Gestisce i click sulla tabella, gestendo eventualmente anche gli Shift + Click per selezionare un range di oggetti\r\n *\r\n * @param {any} event Evento nativo HTML del click\r\n * @param {any} item Oggetto bindato su cui si è effettuato il click\r\n *\r\n * @returns {boolean} **true** se l'operaizone è andata a buon fine, **false** altrimenti\r\n */\r\n public handleClick(event: any, item: any): boolean {\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n\r\n let selecteditems: any[] = [];\r\n if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {\r\n this.utiExts.clearTextSelection();\r\n let startSelecting = false;\r\n\r\n let items = this.boundSource().filter(t => !t._group && !t._sep);\r\n for (let i = 0; i < items.length; i++) {\r\n let t = items[i];\r\n if (startSelecting) {\r\n t._selected = true;\r\n selecteditems.push(t);\r\n }\r\n if ((t == item || t == this.lastSelected) && !startSelecting) {\r\n startSelecting = true;\r\n t._selected = true;\r\n selecteditems.push(t);\r\n } else if ((t == item || t == this.lastSelected) && startSelecting)\r\n startSelecting = false;\r\n }\r\n } else {\r\n item._selected = !item._selected;\r\n this.lastSelected = item;\r\n selecteditems.push(item);\r\n }\r\n\r\n var itemSelection = this.selection_H.handleItemsSelection(selecteditems);\r\n this.changed();\r\n\r\n this.onSelectionChanged.emit(itemSelection);\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Sposta la ricerca di una pagina in avanti (o indeitro)\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n */\r\n public addToPage(page: number) {\r\n let view = this.MainGroupView ? this.MainGroupView : this.View;\r\n\r\n this.goToPage(((this.SearchView() || view)?.page || 0) + page);\r\n }\r\n\r\n /**\r\n * Sposta la ricerca alla pagina specificata\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n */\r\n public goToPage(page: number) {\r\n let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode() ? this.SearchView() : this.View);\r\n if (!view.page || !view.pages)\r\n return;\r\n\r\n let appSearchElement = this.SearchView() || view;\r\n if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))\r\n return;\r\n\r\n appSearchElement.page = page;\r\n let count = (view.items.length || view.groups?.length || 0);\r\n let ipp = view.itemsperpageoverride || 15;\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp));\r\n\r\n let hasGroupings = !!this.MainGroupView;\r\n this.emitSearchRequest(false, hasGroupings ? view : (this.SearchView() || null));\r\n }\r\n\r\n /**\r\n * Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest**\r\n * per comunicare al componente che utilizza questa tabella che i dati sono da aggiornare\r\n */\r\n public onItemsPerPageChanged(newIpp: number | null) {\r\n this.PagerOptions.View.itemsperpageoverride = newIpp;\r\n this.changed();\r\n if (this.MainGroupView)\r\n this.emitSearchRequest(true, this.MainGroupView);\r\n else if (this.SearchView()) {\r\n // Questo secondo me si può portare a livello un po' più alto\r\n this.SearchView()!.page = 1;\r\n this.emitSearchRequest(true, this.SearchView()!);\r\n }\r\n else\r\n this.emitSearchRequest(true);\r\n }\r\n\r\n /** Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest** con la vista del separatore */\r\n public onGroupItemsPerPageChanged(pager: GroupPager, newIpp: number) {\r\n pager.view.itemsperpageoverride = newIpp;\r\n this.emitSearchRequest(true, pager.view);\r\n }\r\n\r\n\r\n /** Metodo che gestisce la modifica del tempo specificato per l'aggiornamento automatico */\r\n public autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds()))\r\n this.seconds.set('10');\r\n\r\n let secondsInMs = parseInt(this.seconds()) * 1000;\r\n\r\n if (this.autoUpdate())\r\n this.updateTimer = setInterval(() => { this.emitSearchRequest(false); }, secondsInMs);\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n\r\n /**\r\n * Metodo chiamato dal click su una delle colonne generate dall'Input **DynamicOperations**\r\n *\r\n * @param {any} item L'oggetto su cui va effettuata l'operazione\r\n * @param {string} opid Codice identificativo dell'operazione da effettuarsi\r\n */\r\n public dynamicOperation(item: any, opid: string) {\r\n this.onDynamicOperation.emit({ id: opid, item: item });\r\n }\r\n\r\n /**\r\n * Equivalente del metodo **addToPage** riadattato per la modalità array\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n */\r\n public arrayAddToPage(page: number) {\r\n this.arrayGoToPage(this.arraymodePage + page)\r\n }\r\n\r\n /**\r\n * Equivalente del metodo **goToPage** riadattato per la modalità array\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n */\r\n public arrayGoToPage(page: number) {\r\n if (page === 0 || page > this.arraymodePages)\r\n return;\r\n this.arraymodePage = page;\r\n\r\n // Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca\r\n this.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Gestione dei click sulle opzioni del menù contestuale in alto a destra generato dall'Input **CornerMenuOptions**\r\n *\r\n * @param {string} cornerid Codice dell'operazione selezionata\r\n */\r\n public cornerActionClicked(cornerid: string) {\r\n this.onCornerAction.emit({ id: cornerid, estable: this });\r\n }\r\n\r\n /** \r\n * Impostazione modalità dell'EsTable \r\n * \r\n * @param {'array' | 'view' | 'report'} mode Modalità da impostare\r\n **/\r\n private setMode(mode: 'array' | 'view') {\r\n this.viewMode.set(mode == 'view');\r\n this.arrayMode.set(mode == 'array');\r\n }\r\n\r\n /**\r\n * Helper per effettuare chiamate interne di allineamento alla funzione **writeValue**, \r\n * impostando prima **internalWriteCall** in modo da non effettuare operazioni inutili\r\n */\r\n public async internalWriteValue() {\r\n this.internalWriteCall = true;\r\n await this.writeValue(this.View);\r\n this.internalWriteCall = false;\r\n }\r\n\r\n /** Metodo eventualmente richiamabile anche dal componente esterno che permette di forzare un refresh della tabella */\r\n public forceRefresh(relaunchSearch: boolean = true) {\r\n\r\n // Se sono in modalità View viene mantenuto in automatico il numero di pagina, ma per la modalità array devo prendere le info di paginazione prima e riapplicarle dopo\r\n let arrayPage: number|null = null;\r\n let arrayIpp: number| null = null;\r\n if (this.arrayMode()) {\r\n arrayPage = this.arraymodePage;\r\n arrayIpp = this.ArraymodeItemsPerPage();\r\n }\r\n\r\n if (!relaunchSearch && this.viewMode())\r\n this.View.selfsearch = true;\r\n\r\n this.writeValue(this.View);\r\n this.cdr.detectChanges();\r\n\r\n if (this.arrayMode()) {\r\n this.ArraymodeItemsPerPage.set(arrayIpp || 15);\r\n this.arrayGoToPage(arrayPage || 1);\r\n }\r\n }\r\n\r\n /** \r\n * Imposta la visibilità di un header e di eventuali header collegati se questo header è un gruppo, dopodiché aggiorna l'es-table \r\n * \r\n * @param {string} groupOrHeader Header di cui settare la visibilità\r\n * @param {boolean} visibility Visibilità da impostare\r\n **/\r\n public setHeaderVisibility(groupOrHeader: string, visibility: boolean, refresh: boolean = true, relaunchSearch: boolean = true) {\r\n let groupOrHead = this.thsCache[groupOrHeader];\r\n if (!groupOrHead)\r\n return;\r\n\r\n groupOrHead.thVisible = visibility;\r\n\r\n let thsArr = this.EsThsDirective?.toArray() || [];\r\n for (let i = 0; i < thsArr.length; i++) {\r\n let th = thsArr[i];\r\n\r\n if (th.thParent == groupOrHeader)\r\n this.setHeaderVisibility(th.th, visibility, false);\r\n }\r\n\r\n if (refresh) {\r\n this.useLocalVisibility = true;\r\n this.forceRefresh(relaunchSearch);\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che in base ai click su una cella capisce se sto effettuando un'operazione di selezione o se sto entrando nell'edit di una cella con un doppio click\r\n * \r\n * @param {any} $event Evento nativo javascript\r\n * @param {TdElement} rowItem Riferimento a binder della riga\r\n * @param {any} item Item che rappresenta il contesto su cui è stato effettuato un click\r\n */\r\n public dbClickEditOrSingleClickRowSelection($event: MouseEvent, rowItem: WritableSignal<TdElement>, item: any) {\r\n\r\n let rowItm = rowItem();\r\n let selection = this.Selection() || false;\r\n\r\n // Prima cosa da fare è controllare se ci sono dei range lasciati da operazioni precedenti (se applicabile) e ripulirli\r\n if (this.rangeSelected && !$event.ctrlKey && selection) {\r\n this.logger.log(\"clearing previously selected range\");\r\n this.selection_H.clearSelectionStatusExcluding();\r\n this.rangeSelected = false;\r\n return;\r\n }\r\n \r\n\r\n // Modalità Editable, gestisco i doppi click senza però rallentare la modalità di selezione a range\r\n if (this.Editable()) {\r\n \r\n // Secondo click: se il timer non è scaduto è un doppio click ed eseguo il resto\r\n if (this.cellDbClickTimer) {\r\n this.logger.log(\"handling doubleclick on editable cell: \" + (rowItm.PropertyName ? 'edit mode for property ' + rowItm.PropertyName : 'no property set, fallback to simple click'));\r\n if (rowItm.PropertyName)\r\n this.setupUserEdit(rowItem, item);\r\n else\r\n this.handleRowClick($event, item, selection, true);\r\n this.clearCellClickTimer();\r\n return;\r\n }\r\n\r\n\r\n // Primo click: non fa niente e se il tempo per il secondo click scade resetta tutto\r\n this.cellDbClickTimer = setTimeout(() => {\r\n this.clearCellClickTimer();\r\n if (!this.RangeSelection() || !this.mouseIsDown) {\r\n this.logger.log(\"time's up for second click, handling single click\");\r\n this.handleRowClick($event, item, selection, true);\r\n }\r\n }, this.doubleClickBufferMs);\r\n }\r\n\r\n // In modalità a range la creazione del range è gestita dai mousedown, move ed up...\r\n // La selezione delle righe invece è gestita dalle caselline a sinistra\r\n if (this.RangeSelection())\r\n return;\r\n\r\n // Se ho fatto click col control attaccato esco subito dato che deve solo permettere la navigazione dei link\r\n if ($event.ctrlKey)\r\n return;\r\n\r\n // Tutti i click su una cella già in edit non devono effettuare la selezione della riga\r\n if (rowItm._editing)\r\n return;\r\n\r\n // Per evitare di rallentare a prescindere\r\n if (!this.Editable()) {\r\n this.handleRowClick($event, item, selection, true);\r\n return;\r\n }\r\n }\r\n\r\n /** Evento che gestisce il comando \"Copia\" buttando i valori selezionati nella clipboard in base al loro tipo */\r\n private handleCopy() {\r\n if (!this.RangeSelection())\r\n return;\r\n let sel = this.selection_H.getSelectionStatusSelection();\r\n if (sel.length > 0 && sel[0].length > 0) {\r\n var selectionText = this.selection_H.getClipbardTextFromSelection(sel);\r\n this.clipboardService.copyTextToClipboard(selectionText);\r\n this.msgExts.simpleInfo(this.lc.loc(\"Values copied in the clipboard\"), \"toastr\", 1000);\r\n }\r\n }\r\n\r\n /** Evento che gestisce il comando \"Incolla\" prendendo i dati della clipboard e applicandoli al range di selezione attuale in base al tipo delle celle sotto */\r\n handlePaste() {\r\n if (!this.RangeSelection())\r\n return;\r\n let sel = this.selection_H.getSelectionStatusSelection();\r\n if (sel.length > 0 && sel[0].length > 0) {\r\n this.clipboardService.getClipboard(\"matrix\", (values: string[] | string[][]) => {\r\n // Fix clipboard service che pare un po' stronza, rimuovo l'ultimo array se mi accorgo che è un singolo array con un solo elemento vuoto\r\n if (values.length > 0 && values[values.length - 1].length == 1 && values[values.length - 1][0] == '')\r\n values.splice(values.length - 1, 1);\r\n\r\n if (values.length > 0 && values[0].length > 0) {\r\n\r\n // Check se la modifica è abilitata\r\n if (!this.Editable()) {\r\n this.msgExts.simpleWarning(this.lc.loc(\"Data for this table cannot be edited\"));\r\n return;\r\n }\r\n\r\n // Controllo che quello che sto copiando sia della stessa dimensione della selezione sull'es-table, tranne nel caso ho un singolo valore da copiare\r\n if ((sel.length != values.length || sel[0].length != values[0].length) && (values.length != 1 || values[0].length != 1)) {\r\n this.msgExts.simpleWarning(this.lc.loc(\"Size of copied data is different from the size of the selection\"));\r\n return;\r\n }\r\n\r\n // Se le dimensioni coincidono copio da una parte all'altra\r\n let changes: EsTableModelChange[] = [];\r\n for (let r = 0; r < sel.length; r++) {\r\n var row = sel[r];\r\n for (let c = 0; c < row.length; c++) {\r\n let cell = row[c];\r\n // Se ho un singolo valore lo applico a tutta la selezione\r\n let value = values.length == 1 && values[0].length == 1 ? values[0][0] : values[r][c]\r\n let old = cell.value;\r\n let niu = cell.val_setter?.(value);\r\n\r\n let olddate = this.dateExts.getDateConvertion(old);\r\n let niudate = this.dateExts.getDateConvertion(niu);\r\n if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)\r\n continue;\r\n\r\n changes.push(new EsTableModelChange(cell.item, cell.header!, cell.property!, old!, niu!));\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n\r\n if (changes.length > 0)\r\n this.onModelChange.emit(changes);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Ripulisce il timer utilizzato per capire se è stato effettuato un doppio click o meno */\r\n private clearCellClickTimer() {\r\n clearTimeout(this.cellDbClickTimer)\r\n this.cellDbClickTimer = null;\r\n }\r\n\r\n /**\r\n * Handler click singolo su una riga\r\n * \r\n * @param {any} $event Evento nativo javascript\r\n * @param {any} item Item che rappresenta il contesto su cui è stato effettuato un click\r\n * @param {boolean} selection Indica se la selezione è attiva\r\n * @param {boolean} internalCall Indica se la chiamata a questa funzione è interna: permette di skippare i check sulle CustomCells\r\n */\r\n public handleRowClick($event: any, item: any, selection: boolean, internalCall: boolean = false) {\r\n // Se ho un ctrl premuto esco con true in modo da fare bubbling dell'evento e lasciarlo gestire al browser (link ecc...)\r\n // Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD\r\n if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))\r\n return true;\r\n\r\n let mfc = false;\r\n if (selection) {\r\n mfc = true;\r\n this.selection_H.clearSelectionStatusExcluding();\r\n }\r\n\r\n if (selection && !item.locked && !item._sep && !item._group) {\r\n mfc = true;\r\n this.handleClick($event, item);\r\n }\r\n else if (item._group) {\r\n mfc = true;\r\n this.handleGroupClick(item);\r\n }\r\n\r\n // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping\r\n if(mfc)\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Gestione del click destro sull'es-table\r\n */\r\n public onRightClick() {\r\n if (this.Selection())\r\n this.onOpenContextMenu.emit();\r\n }\r\n\r\n /**\r\n * La modifica dell'utente è iniziata. Si imposta la variabile relativa a \"true\" in modo da mostrare l'input di testo\r\n * \r\n * Dopo che l'input è apparso, dopo un ciclo di Change Detection viene attivato il Subject collegato all'input che servirà a effettuare il focus\r\n * \r\n * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica\r\n * @param {any} item Oggetto sopra il quale è stata attivata la modifica\r\n */\r\n public setupUserEdit(rowItem: WritableSignal<TdElement>, item: any) {\r\n this.selection_H.clearSelectionStatusExcluding();\r\n let rowItm = rowItem();\r\n if (this.Editable() && rowItm.PropertyName) {\r\n let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;\r\n let newValues = { _editing: true, old_value: dynMode ? item.properties[rowItm.PropertyName] : item[rowItm.PropertyName] }\r\n rowItem.set(Object.assign(rowItm, newValues));\r\n }\r\n\r\n this.cdr.detectChanges();\r\n requestAnimationFrame(() => { this.FocusSubject.next(); });\r\n }\r\n\r\n /**\r\n * La modifica dell'utente è terminata. Si reimposta la variabile relativa a \"false\" in modo da nascondere l'input di testo e si emette la modifica del valore\r\n * \r\n * Dichiarata così per evitare spam di .bind\r\n * \r\n * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica\r\n * @param {any} item Oggetto sopra il quale è stata attivata la modifica\r\n * @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica\r\n */\r\n public finalizeUserEdit = (rowItem: WritableSignal<TdElement>, item: any, columnIndex: number) => {\r\n this.logger.log(\"Function called 'finalizeUserEdit'\");\r\n\r\n // Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo\r\n requestAnimationFrame(() => {\r\n let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;\r\n\r\n let newValues = { _editing: false }\r\n let newRowItem = Object.assign(rowItem(), newValues);\r\n rowItem.set(newRowItem);\r\n\r\n let old = newRowItem.old_value;\r\n let niu = dynMode ? item.properties[newRowItem.PropertyName!] : item[newRowItem.PropertyName!];\r\n\r\n let olddate = this.dateExts.getDateConvertion(old);\r\n let niudate = this.dateExts.getDateConvertion(niu);\r\n if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)\r\n return;\r\n\r\n this.onModelChange.emit([new EsTableModelChange(item, newRowItem.ID, newRowItem.PropertyName!, old, niu)]);\r\n this.selectionStatus[item._ordinal]?.[columnIndex]?.val_setter?.(niu);\r\n });\r\n };\r\n\r\n // Range selection Experimentals\r\n private mouseIsDown: boolean = false;\r\n private rangeSelected: boolean = false;\r\n private rangeStartWasIgnored: boolean = false;\r\n private firstCoordinates: { row: number, column: number } | null = null;\r\n\r\n mousedown(event: MouseEvent, rowItem: any, _: any) {\r\n\r\n // Tasto diverso dal click sinistro -> ciao è stato bello e intenso\r\n if (event.buttons != 1 || !this.RangeSelection())\r\n return;\r\n\r\n // Sto lavorando su QUESTA es-table\r\n this.copyPasteDetector.ActiveEstReference = this;\r\n\r\n // Tutti i click su una cella già in edit non devono effettuare la selezione della riga\r\n if ((<any>rowItem)._editing)\r\n return;\r\n\r\n this.mouseIsDown = true;\r\n\r\n let coords = (<HTMLElement>event.currentTarget).id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n this.firstCoordinates = { row, column };\r\n // Se ho già un range di selezione ignoro temporanemaente questa selezione in modo da capire bene cosa devo fare dopo (click sulla riga / altra selezione)\r\n // e gestire la grafica in maniera un po' più precisa\r\n if (!this.rangeSelected || (event.ctrlKey || !this.Selection())) {\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);\r\n this.cdr.markForCheck();\r\n }\r\n else\r\n this.rangeStartWasIgnored = true;\r\n this.logger.log(`mouse down on ${row}:${column}`);\r\n }\r\n\r\n mouseenter(event: MouseEvent) {\r\n if (!this.RangeSelection())\r\n return;\r\n\r\n if (event.buttons == 0)\r\n this.mouseIsDown = false;\r\n\r\n if (this.mouseIsDown && this.firstCoordinates) {\r\n let id = (<HTMLElement>event.currentTarget).id;\r\n let coords = id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n // Se ho ignorato l'inizio della selezione nel mousedown lo recupero qui\r\n if (this.rangeStartWasIgnored) {\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, this.firstCoordinates.row, this.firstCoordinates.column);\r\n this.rangeStartWasIgnored = false;\r\n }\r\n this.selection_H.singleCellSelection({ view: event.view, range: true }, row, column, this.firstCoordinates);\r\n this.logger.log(`mouse move over ${row}:${column}`);\r\n this.rangeSelected = true;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n mouseup(event: MouseEvent) {\r\n if (!this.RangeSelection())\r\n return;\r\n\r\n let id = (<HTMLElement>event.currentTarget).id;\r\n let coords = id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n\r\n // Se il mouseup viene effettuato sulla stessa cella del primo mousedown e siamo in modalità di selezione deseleziono la cella perché è un semplice click\r\n if (this.mouseIsDown && this.firstCoordinates) {\r\n if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection())\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);\r\n else if (event.ctrlKey || !this.Selection())\r\n this.rangeSelected = true;\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n this.mouseIsDown = false;\r\n this.logger.log(`mouse lifted up`);\r\n }\r\n\r\n //* Piango\r\n private EsTdsCache: { [id: string]: EsTd } = {};\r\n\r\n public getCellReference(object: any, column: string): EsTd {\r\n let fkThisShitImOut = this.utiExts.deepClone(object);\r\n this.utilities_H.calculateHash([fkThisShitImOut]);\r\n let prop = column;\r\n let hash = fkThisShitImOut._hash;\r\n\r\n let toRet = this.EsTdsCache[`${prop}_${hash}`];\r\n return toRet;\r\n }\r\n\r\n public registerCell(event: EsTdReference, rowItem: any, _: any, cellRef: ElementRef<HTMLTableCellElement>) {\r\n this.EsTdsCache[`${event.id}_${event.hash}`] = event.self;\r\n\r\n this._zone.runOutsideAngular(() => {\r\n fromEvent(cellRef.nativeElement, 'mousedown').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mousedown(e as MouseEvent, rowItem, _)});\r\n fromEvent(cellRef.nativeElement, 'mouseenter').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mouseenter(e as MouseEvent)});\r\n fromEvent(cellRef.nativeElement, 'mouseup').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mouseup(e as MouseEvent)});\r\n });\r\n\r\n }\r\n //* Piango ancora\r\n\r\n // Gestione Embedding\r\n showDialog(dlg: ModalDirective, elementRef: HTMLDivElement) {\r\n dlg.show();\r\n this.retries = 0;\r\n if (this.emb.Embedded)\r\n this.doFixDialog(dlg, elementRef);\r\n }\r\n\r\n private retries = 0;\r\n\r\n doFixDialog(dlg: ModalDirective, elementRef: HTMLDivElement) {\r\n this.retries++;\r\n let element = elementRef;\r\n if (!element) {\r\n if (this.retries > 10)\r\n return;\r\n setTimeout(() => this.doFixDialog(dlg, elementRef), 25);\r\n return;\r\n }\r\n this.rendererRef.setStyle(element, \"padding-top\", \"5%\");\r\n this.rendererRef.setStyle(element, \"margin-left\", \"-110px\");\r\n this.rendererRef.setStyle(element, \"width\", \"calc(100% + 110px)\");\r\n this.rendererRef.setStyle(element, \"overflow\", \"hidden\");\r\n\r\n\r\n this.doFixBody(elementRef);\r\n\r\n let backdropHeight = (<any>dlg).backdrop.instance.element.nativeElement.clientHeight;\r\n this.emb.MainWindow.postMessage({ type: \"modal-open\", backdropHeight: backdropHeight }, \"*\");\r\n }\r\n\r\n doFixBody(elementRef: HTMLDivElement) {\r\n let body = (<HTMLElement>elementRef).getElementsByClassName(\"modal-body\")[0] as HTMLElement;\r\n // Ci prova finch� non trova il body dato che potrebbe essere creato in qualsiasi momento\r\n if (!body) {\r\n setTimeout(() => this.doFixBody(elementRef), 250);\r\n return;\r\n }\r\n body.style.setProperty(\"max-height\", \"600px\", \"important\");\r\n body.style.setProperty(\"overflow-x\", \"hidden\");\r\n body.style.setProperty(\"overflow-y\", \"auto\");\r\n }\r\n\r\n hideDialog(dlg: ModalDirective) {\r\n dlg.hide();\r\n\r\n if (!this.emb.Embedded)\r\n return;\r\n\r\n this.emb.MainWindow.postMessage({ type: \"modal-close\" }, \"*\");\r\n }\r\n //* Gestione Embedding \r\n}\r\n\r\n","<!-- Patacchino di autoaggiornamento -->\n@if (AutoUpdate()) {\n <div class=\"w-100\">\n <div class=\"pull-right\">\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\n </div>\n <div class=\"pull-right m-t-2\">\n <label class=\"est-switch\">\n <input type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"est-slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n}\n\n@if (View) {\n <div class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\n @if (FirstBind() && ShowLoadingOnBootstrap()) {\n <div class=\"est-loading-box\">\n <div class=\"est-loading-content\">\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\n </div>\n </div>\n }\n @if (PagingStyle() == 'both' || PagingStyle() == 'top') {\n <div class=\"est-top-pager\">\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n @if (canSelectAll() || (View?.selection || arraymodeSelection)?.all) {\n <div class=\"est-top-allselect\">\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\n </div>\n }\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\n @if ((SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom') {\n <tr>\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\n <p class=\"est-hidden-view app-margin-bottom-0\">§</p>\n </th>\n </tr>\n }\n <!-- Blocco header group -->\n @if (RowThGroups) {\n\n @for (level of RowThGroups; track $index) {\n <tr>\n @for (cell of level; track IDTrackBy($index, cell)) {\n <th [attr.colspan]=\"cell.Span\"\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\n class=\"est-text-center\">\n @if (cell.Pinned) {\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\">\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n </div>\n }\n @else {\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n }\n </th>\n }\n </tr>\n }\n }\n @if (!RowThGroups) {\n @if (HasHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n <!-- Blocco header group secondario -->\n @if (HasSecondaryHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n }\n <!-- Blocco effettivo degli header -->\n <tr>\n <!-- <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n Selection: {{Selection()}}\n HasPinnedColumns: {{HasPinnedColumns()}}\n arrayMode: {{arrayMode()}}\n viewMode: {{viewMode()}}\n UseCustomCells: {{UseCustomCells()}}\n RowTHs: {{!!RowTHs}}\n RowTHs.length: {{RowTHs?.length}}\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\n </div> -->\n <!-- Aggiungo una checkbox se la selezione è attiva -->\n @if (Selection() && !HasPinnedColumns()) {\n <th class=\"est-col-min\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n <!-- Header che valgono per view mode e array mode -->\n @if (arrayMode() || viewMode()) {\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle proprietà -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()) {\n @for (operation of DynamicOperations(); track idTrackBy($index, operation)) {\n <th class=\"est-col-min est-no-side-padding\"></th>\n }\n @for (rowHeader of DynamicRowColumnsDefinition(); track PropertyNameTrackBy($index, rowHeader)) {\n @if (rowHeader.Visible) {\n @if (OrderByColumn()) {\n <th id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\" [SearchInProgress]=\"researchInProgress()\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\n }\n @else {\n <th id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\">{{rowHeader.Description}}</th>\n }\n }\n }\n }\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\n @if (UseCustomCells() && RowTHs?.length > 0) {\n @if (HasPinnedColumns()) {\n <th class=\"est-pinned-header est-col-min\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\n @if (Selection()) {\n <th class=\"est-col-min est-no-border\" [style.width.px]=\"20\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n @if (rowHeader && rowHeader.Visible && rowHeader.Pinned) {\n <th\n [style.width.px]=\"rowHeader.PinnedWidth\"\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [class.est-pinned-internal-header]=\"true\"\n [class.est-no-border]=\"true\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Pinned]=\"true\"\n [Fixed]=\"rowHeader.Fixed\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}|{{rowHeader.Order}}</span>\n }\n </th>\n }\n }\n </div>\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n <!-- <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n rowHeader: {{!!rowHeader}}\n rowHeader.Visible: {{rowHeader?.Visible}}\n rowHeader.Pinned: {{rowHeader?.Pinned}}\n rowHeader.Template: {{!!rowHeader.Template}}\n rowHeader.Order: {{rowHeader.Order}}\n </div> -->\n @if (rowHeader && rowHeader.Visible && !rowHeader.Pinned) {\n <th\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [style.text-align]=\" rowHeader.Alignment || null\"\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}</span>\n }\n </th>\n }\n }\n }\n }\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\n @if (Removal()) {\n <th [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\n }\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\n @if (Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()) {\n <th class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\n <div class=\"est-pointer\">\n @if (HiddenColumns() || ColumnsOrdering()) {\n <a class=\"dropdown-item\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\n @if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n @else {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n </a>\n }\n <ng-container *ac=\"exportGlobalAcl\">\n @if (Export() && CSVExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\n }\n @if (Export() && XLSXExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\n }\n </ng-container>\n @for (option of CornerMenuOptions(); track idTrackBy($index, option)) {\n <a class=\"dropdown-item\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\n }\n </div>\n </div>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\n @if (Selection()) {\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\n }\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\n @else {\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\n }\n </tbody>\n </table>\n </div>\n @if (PagingStyle() == 'both' || PagingStyle() == 'bottom') {\n <div>\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n </div>\n}\n\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\n<ng-template #pagingElement>\n @if (!FirstBind()) {\n <!-- Pulsanti avanti-indietro di paginazione -->\n @if (PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)) {\n <div class=\"pull-right btn-toolbar\">\n @if (PagerOptions.View?.pagingavailable || viewMode()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n @if (arrayMode() && UseArrayModePaging() && !SearchView()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n </div>\n }\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\n @if (PagerOptions.ShowCount || PagerOptions.ShowPagingOptions) {\n <div class=\"pull-right\">\n @if (PagerOptions.ShowPaging) {\n <div class=\"est-mt-min-5\">\n @if (!PagerOptions.UsesView) {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\n }\n @else {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch()\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></es-paging>\n }\n </div>\n }\n </div>\n }\n <div class=\"clearfix\"></div>\n }\n</ng-template>\n\n<!-- Template che contiene i pulsanti per cambiare pagina -->\n<ng-template #pagingButtons let-options>\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\n @if (options.Array) {\n <div class=\"est-inline\">@for (p of options.Array; track valTrackBy($index, p)) {\n <a class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a>\n }</div>\n }\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\n </div>\n</ng-template>\n\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto è templatizzato -->\n<ng-template #TBodySelection let-templateOptions>\n @for (item of boundSource(); track bodyTrackBy(i, item); let even = $even; let i = $index) {\n @if (item._visible || (!Hierarchy() && !ArrayGrouping())) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-pointer]=\"!item.locked\"\n [class.est-white-selected]=\"item._selected && !item.locked\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\n (click)=\"!RangeSelection() && handleRowClick($event, item, true)\"\n (contextmenu)=\"onRightClick();\">\n @if (!item.locked && !item._sep && !HasPinnedColumns()) {\n <td>\n <input type=\"checkbox\"\n style=\"width: 15px\"\n [disabled]=\"templateOptions.selDisabled\"\n [class.est-pointer]=\"!item.locked\"\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && !HasPinnedColumns()) {\n <td></td>\n }\n\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #TBody>\n @for (item of boundSource(); track bodyTrackBy(i, item); let i = $index; let even = $even) {\n @if (item._visible || !Hierarchy()) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n (click)=\"handleRowClick($event, item, false)\">\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #groupPager let-item>\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body \">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\n </td>\n }\n @if (item._grouplevel > 1) {\n <td [attr.colspan]=\"item._grouplevel-1\"></td>\n }\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\n @if (RowGroupingPagingStyle() == 'right') {\n <div class=\"est-rg-sep-flex-right\">\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-ipp\"><es-paging [CountLabel]=\"CountLabel()\" [AllSearch]=\"AllSearch()\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></es-paging></div>\n }\n </div>\n }\n\n @if (RowGroupingPagingStyle() == 'left') {\n <div class=\"est-rg-sep-flex-left\">\n <div class=\"est-rg-ipp\"><es-paging [AllSearch]=\"AllSearch()\" [CountLabel]=\"CountLabel()\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></es-paging></div>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\n }\n </div>\n }\n </td>\n </ng-template>\n\n <!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\n <ng-template #basicColumns let-item let-index=\"index\">\n @if ((!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\n }\n </ng-template>\n\n <ng-template #defaultEditor let-ctx>\n <!-- Un po' triste ma questo è il metodo più semplice per gestire il cambio di modello -->\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\n @if (ctx.item.properties) {\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n @else {\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n </ng-template>\n\n <ng-template #defaultEsTd let-ctx>\n <!-- TODO: Formattare il valore in base a valType.type -->\n @if (ctx.type == 'enum') {\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\n }\n @else {\n @switch(ctx.type){\n @case(\"date\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\n }\n @case(\"datetime\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\n }\n @default {\n {{ctx.value}}\n }\n }\n }\n </ng-template>\n\n <ng-template #customCells let-item let-opt=\"templateOptions\">\n @if (UseCustomCells() && !EmptyRowTds()) {\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\n @if (!item.locked && !item._sep && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\n <input type=\"checkbox\" style=\"width: 15px\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\"></td>\n }\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (cell().Pinned) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: true, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n </div>\n </td>\n }\n <!-- Body effettivo della riga -->\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (!cell().Pinned;) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: false, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n }\n </ng-template>\n\n <!-- Cella customizzata, elemento grafico base per la tabella -->\n <ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\n\n @let c = cell();\n\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\n @if (c.IconClass && c.Visible) {\n @if (!c.ConditionField || (((item.properties || item) | est_propinsensitive : c.ConditionField) == c.ConditionValue)) {\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{c.Title}}\" class=\"{{c.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, c.ID)\">{{c.Content}}</span></td>\n }\n @else {\n <td class=\"est-col-min est-no-side-padding\"></td>\n }\n }\n\n <!-----------------------------------------------------------------------------------------------------------------------\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\n - . Generiche -\n - . Gestione allineamento e colori per la modalità report -\n - . Gestioni grafiche particolari per il Pinned -\n - . Gestione della selezione a singola cella in assenza di pinned -\n - . Gestione click classico e selezione multicella -\n ------------------------------------------------------------------------------------------------------------------------->\n\n @if (!c.IconClass && c.Visible) {\n <td\n es-td=\"{{c.Property || c.ID}}\"\n id=\"estd_{{c.Property || c.ID}}_{{item._ordinal}}_{{index}}\"\n class=\"{{ c.Class }}\"\n [Context]=\"item._hash\"\n [class.est-default-row-height]=\"!HighCellDensity()\"\n [class.est-white-selected]=\"item._selected\"\n [class.est-no-selection]=\"Editable() && c.PropertyName\"\n [class.est-rg-hdr]=\"c.GroupHeader\"\n [class.est-rg-agg]=\"c.GroupAggregation\"\n [class.est-nowrap]=\"Hierarchy() || !c.Wraps\"\n [style.text-align]=\"(!pinned && c.Alignment) ? c.Alignment : null\"\n [style.color]=\"(!pinned && item.forecolors && c.PropAccessor) ? item.forecolors[c.PropAccessor] : null\"\n [style.background-color]=\"(!pinned && item.backcolors && c.PropAccessor) ? item.backcolors[c.PropAccessor] : null\"\n [style.width.px]=\"pinned ? c.PinnedWidth : null\"\n [class.est-no-border]=\"pinned\"\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\n [class.est-ltab-border]=\"c.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\n [class.est-rtab-border]=\"c.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\n [class.est-selected-cell]=\"selStatus?.selected\"\n [class.est-cell-lborder]=\" selStatus?.lborder\"\n [class.est-cell-rborder]=\" selStatus?.rborder\"\n [class.est-cell-tborder]=\" selStatus?.tborder\"\n [class.est-cell-bborder]=\" selStatus?.bborder\"\n [class.est-cell-lborder-tmp]=\"!c.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\n [class.est-cell-rborder-tmp]=\"!c.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\n #cellRef\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\n <!--\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\n (mousedown)=\"mousedown($event, cell, item)\"\n (mouseenter)=\"mouseenter($event)\"\n (mouseup)=\"mouseup($event)\"\n -->\n <div [class.est-edit-hidden]=\"c._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\n <ng-container #DEBUG>\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\n </ng-container>\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\n @if (c.Template) {\n @if (!c.Multi) {\n <ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <span><ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: (item[c.MultiProp] ? item[c.MultiProp][c.MultiIndex] : {}) }\"></ng-container></span>\n }\n }\n <!-- 8%\n Template non disponibile, può venire da\n RoutePath in caso sia un link di una tabella dinamica\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\n o Renderer se modalità dinamica/standard (in qual caso il renderer è il default)\n -->\n @if (!c.Template && !c.Multi && !c.Content) {\n @if (c.RoutePath) {\n <a [routerLink]=\"item | est_routerlink : c.RoutePath : c.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[c.PropertyName] : item[c.PropertyName]\"></a>\n }\n @else if (c.PropAccessor) {\n <span>\n {{(item.values? item.values[c.PropAccessor] : item[c.PropAccessor]) | est_format: c.Format }}\n </span>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_renderer: { name: c.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: c, value: item.properties ? item.properties[c.PropertyName] : item[c.PropertyName], type: c.PropertyType} }\"></ng-container>\n }\n }\n <!-- 1% Se in modalità gerarchica metto il td per navigare la gerarchia -->\n @if (Hierarchy() && index == 0) {\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\n }\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\n @if (c.Content) {\n {{c.Content}}\n }\n </div>\n @if (c._editing) {\n <div class=\"est-mt-min-5\">\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_editor: { name: c.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: c, signal: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit } }\"></ng-container>\n </div>\n }\n </td>\n }\n </ng-template>\n\n <!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\n <ng-template #HierarchyNavigator let-item>\n @if (!item.parent) {\n <span class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\n }\n @else if (item.parent && item._expanded) {\n <span class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()!])\"></span>\n }\n @else {\n <span class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()!])\"></span>\n }\n &nbsp;\n </ng-template>\n\n <!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\n <ng-template #bodyDeleteAndExport let-options>\n @if (Removal() && !RemovalCondition()) {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @if (Removal() && RemovalCondition()) {\n\n @if(options.item[RemovalCondition()])\n {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\n }\n }\n @if (Export() || HiddenColumns() || CornerMenuOptions()) {\n <td class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\n }\n </ng-template>\n\n <!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\n <context-menu #emptyMenu>\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\n </context-menu>\n\n <!-- Modal per cambiare posizione e visibilità delle colonne dell'es-table -->\n <div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" cdkDrag>\n <div class=\"modal-content\">\n <div class=\"modal-header est-pointer\" cdkDragHandle>\n <h5 class=\"modal-title pull-left\">\n @if (HiddenColumns() && ColumnsOrdering()) {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n @else if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n @if (!TMPColumnsList || TMPColumnsList.length == 0) {\n <div class=\"card card-info est-padding-10 est-margin-bottom-0\">\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\n </div>\n }\n @if (TMPColumnsList && TMPColumnsList.length > 0) {\n <div style=\"max-height:500px; overflow-y:auto\">\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\n <thead>\n <tr>\n @if (HiddenColumns()) {\n <th class=\"est-col-min\">\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\n </th>\n }\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\n <!--Filler-->\n <th></th>\n <!-- Pinner -->\n @if (DirectivesBased()) {\n <th class=\"est-col-min\"></th>\n }\n </tr>\n </thead>\n <tbody\n cdkDropList\n [cdkDropListData]=\"TMPColumnsList\"\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\n class=\"est-dropbox\">\n @for (item of TMPColumnsList; track idTrackBy(i, item); let i = $index; let last = $last) {\n <tr\n class=\"est-pointer est-droplist\"\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\n [class.est-no-selection]=\"!item.visible\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\n @if (HiddenColumns()) {\n <td>\n <input type=\"checkbox\" style=\"width: 15px\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\n </td>\n }\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\n @if (item.template) {\n <!-- Padri -->\n @if (item.parentTemplates && item.parentTemplates.length > 0) {\n <span class=\"est-fw-bold est-fs-13\">\n (&nbsp;\n @for (parent of item.parentTemplates; track idTrackBy($index, parent); let last = $last) {\n @if (parent.tmpl) {\n <ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container>\n }\n @if (parent.content) {\n {{parent.content}}\n }\n @if (!last) {\n <span>&nbsp;-&nbsp;</span>\n }\n }\n &nbsp;)\n </span>\n }\n <!-- Template header originale -->\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\n }\n @if (!item.template) {\n {{item.description}}\n }\n </td>\n <!--Filler-->\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\n <!-- Pinner -->\n @if (DirectivesBased() && ColumnsPinnable()) {\n <td>\n @if (!item.fixed && item.pinnable) {\n <span class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\n </div>\n </div>\n </div>\n </div>","import { EsTableDefaultable } from \"./EsTableDefaultable\";\r\n\r\n/** Modello di configurazione per L'EsTable */\r\nexport class EsTableModuleConfig {\r\n\r\n /** Indica se scrivere messaggi di log a console */\r\n public debugMode?: boolean;\r\n /** Eventuali proprietà di default per l'EsTable */\r\n public defaults?: EsTableDefaultable;\r\n /** Espressione ACL globale per definire se i tasti di download sono abilitati o no. Override a livello massimo */\r\n public globalExportAclExpression? : string;\r\n}","import { Pipe, PipeTransform } from '@angular/core';\nimport { InputType } from '../../domain/types';\n\n/**\n * Formattazione di presentazione per il renderer di default (celle senza template).\n * Self-contained (Intl / Date nativi) per non trascinare dipendenze esterne.\n *\n * `format` opzionale sovrascrive il default per tipo:\n * - numerici → \"F2\" = 2 decimali fissi\n * - date → pattern accettato da Intl (fallback a locale corto)\n */\n@Pipe({ name: 'est2_format', standalone: false })\nexport class Est2FormatPipe implements PipeTransform {\n transform(value: any, type?: InputType | string | null, format?: string | null, locale?: string): string {\n if (value == null || value === '') return '';\n\n switch (type) {\n case 'int':\n case 'number':\n return this.num(value, format, locale, 0);\n case 'float':\n return this.num(value, format, locale, undefined);\n case 'currency':\n return this.num(value, format, locale, 2);\n case 'date':\n return this.date(value, locale, false);\n case 'datetime':\n return this.date(value, locale, true);\n case 'boolean':\n return value === true || value === 'true' ? '✓' : value === false || value === 'false' ? '—' : String(value);\n default:\n return String(value);\n }\n }\n\n private num(value: any, format: string | null | undefined, locale: string | undefined, defDigits: number | undefined): string {\n const n = typeof value === 'number' ? value : parseFloat(String(value).replace(',', '.'));\n if (isNaN(n)) return String(value);\n let digits = defDigits;\n if (format && /^F\\d+$/.test(format)) digits = parseInt(format.slice(1), 10);\n return n.toLocaleString(locale || undefined, digits != null ? { minimumFractionDigits: digits, maximumFractionDigits: digits } : undefined);\n }\n\n private date(value: any, locale: string | undefined, withTime: boolean): string {\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return String(value);\n return d.toLocaleString(locale || undefined, withTime\n ? { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }\n : { year: 'numeric', month: '2-digit', day: '2-digit' });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Risolve un valore verso il suo `{ id, description }` in una sorgente enum.\n * Pura: ricalcola solo quando cambiano `value` o `source`.\n */\n@Pipe({ name: 'est2_lookup', standalone: false })\nexport class Est2LookupPipe implements PipeTransform {\n transform(value: unknown, source?: { id: any; description: string }[] | null): { id: any; description: string } {\n if (source)\n for (const entry of source)\n if (entry.id == value) return entry;\n return { id: '', description: value == null ? '' : String(value) };\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { EsTableDefaultable } from '../domain/configuration/EsTableDefaultable';\n\n/** Abilita il logging a console */\nexport const EST2_DEBUG = new InjectionToken<boolean>('EST2_DEBUG');\n\n/** Espressione ACL globale che abilita/disabilita l'export */\nexport const EST2_EXPORT_GLOBAL_ACL = new InjectionToken<string>('EST2_EXPORT_GLOBAL_ACL');\n\n/** Valori di default per-progetto degli Input */\nexport const EST2_DEFAULTS = new InjectionToken<EsTableDefaultable>('EST2_DEFAULTS');\n","// =============================================================================\n// es-table2 — motore di raggruppamento/aggregazione lato client (array mode)\n// -----------------------------------------------------------------------------\n// Funzioni pure: dato un array piatto, le colonne di raggruppamento (in ordine)\n// e le specifiche di aggregazione, produce una lista piatta di righe-gruppo e\n// righe-oggetto già ordinate per la visualizzazione ad albero.\n// =============================================================================\n\n/** Specifica di una singola aggregazione estratta da un template `{func:format}` */\nexport interface Est2AggSpec {\n /** Colonna su cui calcolare l'aggregazione */\n column: string;\n /** Funzione di aggregazione */\n func: 'min' | 'max' | 'sum';\n /** Formato di visualizzazione (F0-F9 per numeri, small/long/verylong per date) */\n format: string;\n /** Testo esatto del token da rimpiazzare nel template (es. `{sum:F2}`) */\n match: string;\n /** Tipo di dato dedotto dal formato */\n datatype: 'string' | 'date' | 'number';\n}\n\n/**\n * Estrae le specifiche di aggregazione da un template come `'{min:long} - {max:long}'`.\n * Token senza `:` vengono trattati come formato assente (datatype string).\n */\nexport function parseAggregationSpecs(column: string, template: string | null | undefined): Est2AggSpec[] {\n if (!template) return [];\n const tokens = template.match(/\\{[a-zA-Z0-9/:]*\\}/g);\n if (!tokens) return [];\n const specs: Est2AggSpec[] = [];\n for (const token of tokens) {\n const inner = token.substring(1, token.length - 1);\n const [func, format = ''] = inner.split(':');\n if (func !== 'min' && func !== 'max' && func !== 'sum') continue;\n let datatype: Est2AggSpec['datatype'] = 'string';\n if (format === 'small' || format === 'long' || format === 'verylong') datatype = 'date';\n else if (/^F\\d$/.test(format)) datatype = 'number';\n specs.push({ column, func, format, match: token, datatype });\n }\n return specs;\n}\n\n/** Calcola il valore grezzo (stringa) di una aggregazione sugli item di un gruppo */\nexport function computeAggValue(items: any[], spec: Est2AggSpec): string {\n const raw = items.map(i => i?.[spec.column]);\n\n if (spec.datatype === 'number') {\n const nums = raw.map(v => parseFloat(v)).filter(n => !isNaN(n));\n if (nums.length === 0) return '';\n if (spec.func === 'sum') return nums.reduce((a, b) => a + b, 0).toString();\n return (spec.func === 'max' ? Math.max(...nums) : Math.min(...nums)).toString();\n }\n\n if (spec.datatype === 'date') {\n if (spec.func === 'sum') return '';\n const times = raw.map(v => new Date(v).getTime()).filter(t => !isNaN(t));\n if (times.length === 0) return '';\n return new Date(spec.func === 'max' ? Math.max(...times) : Math.min(...times)).toISOString();\n }\n\n const strs = raw.map(v => (v == null ? '' : String(v)));\n if (spec.func === 'sum') return strs.join(', ');\n const sorted = [...strs].sort();\n return spec.func === 'max' ? sorted[sorted.length - 1] : sorted[0];\n}\n\n/** Formatta il valore grezzo di un'aggregazione secondo il formato richiesto */\nexport function formatAggValue(value: string | undefined, format: string, locale?: string): string {\n if (value == null || value === '' || !format) return value ?? '';\n\n if (/^F\\d$/.test(format)) {\n const n = parseFloat(value);\n return isNaN(n) ? value : n.toFixed(parseInt(format[1], 10));\n }\n\n if (format === 'small' || format === 'long' || format === 'verylong') {\n const d = new Date(value);\n if (isNaN(d.getTime())) return value;\n const opts: Intl.DateTimeFormatOptions =\n format === 'small'\n ? { year: 'numeric', month: '2-digit', day: '2-digit' }\n : format === 'long'\n ? { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }\n : { weekday: 'short', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' };\n return d.toLocaleString(locale || undefined, opts);\n }\n\n return value;\n}\n\n/** Raggruppa un array per il valore di una proprietà, preservando l'ordine di prima apparizione */\nfunction groupBy(items: any[], key: string): Map<string, any[]> {\n const out = new Map<string, any[]>();\n for (const it of items) {\n const k = String(it?.[key] ?? '');\n const bucket = out.get(k);\n if (bucket) bucket.push(it);\n else out.set(k, [it]);\n }\n return out;\n}\n\nfunction computeAggMap(items: any[], specs: Est2AggSpec[]): Map<string, Map<string, string>> {\n const byCol = new Map<string, Map<string, string>>();\n for (const s of specs) {\n let m = byCol.get(s.column);\n if (!m) { m = new Map(); byCol.set(s.column, m); }\n if (!m.has(s.func)) m.set(s.func, computeAggValue(items, s));\n }\n return byCol;\n}\n\nfunction buildLevel(items: any[], groupCols: string[], specs: Est2AggSpec[], level: number, parent: any | null): any[] {\n const col = groupCols[level];\n const last = level + 1 === groupCols.length;\n const buckets = groupBy(items, col);\n const ret: any[] = [];\n\n for (const [value, groupItems] of buckets) {\n const key = (parent ? parent._thisKey : '') + '¦' + col + '=' + value;\n const g: any = {\n _group: true,\n _expanded: false,\n column: col,\n value,\n count: groupItems.length,\n _grouplevel: parent ? parent._grouplevel + 1 : 0,\n _thisKey: key,\n _parent: parent ? parent._thisKey : null,\n _visible: level === 0,\n _agg: computeAggMap(groupItems, specs)\n };\n ret.push(g);\n\n if (!last) {\n const sub = buildLevel(groupItems, groupCols, specs, level + 1, g);\n g._groupscount = sub.filter(r => r._group && r._parent === key).length;\n ret.push(...sub);\n } else {\n for (const it of groupItems) { it._thisKey = key; it._visible = false; }\n ret.push(...groupItems);\n }\n }\n return ret;\n}\n\n/**\n * Costruisce la lista piatta di righe (gruppi + oggetti) per la visualizzazione.\n * Gli oggetti vengono marcati `_item`, i gruppi `_group`; solo i gruppi di primo\n * livello partono `_visible`.\n */\nexport function buildGroupedRows(items: any[], groupCols: string[], specs: Est2AggSpec[]): any[] {\n for (const i of items) { i._item = true; i._visible = false; }\n return buildLevel(items, groupCols, specs, 0, null);\n}\n","// =============================================================================\n// es-table2 — modalità gerarchica (albero padre/figlio)\n// -----------------------------------------------------------------------------\n// Dato un array piatto in cui ogni oggetto conosce la propria chiave (ownKey) e\n// quella del padre (parentKey), assegna livello/visibilità/espansione e riordina\n// gli elementi in ordine depth-first (padre seguito dal proprio sottoalbero).\n//\n// Algoritmo O(n) basato su mappe (l'originale era O(n²)). Gli orfani (padre non\n// presente nel set) sono trattati come radici, così nessuna riga sparisce.\n// =============================================================================\n\n/** Confronto per l'ordinamento dei fratelli: numerico se possibile, altrimenti stringa */\nfunction compareKeys(a: any, b: any): number {\n const na = parseFloat(a), nb = parseFloat(b);\n if (!isNaN(na) && !isNaN(nb) && String(na) === String(a) && String(nb) === String(b)) return na - nb;\n return String(a ?? '').localeCompare(String(b ?? ''));\n}\n\n/**\n * Assegna i metadati gerarchici (`_level`, `_visible`, `_expanded`, `parent`) e\n * restituisce gli elementi in ordine depth-first pronti per la visualizzazione.\n *\n * @param items array piatto di oggetti\n * @param ownKey proprietà con l'id dell'oggetto\n * @param parentKey proprietà con l'id del padre\n * @param startsExpanded se true l'albero parte tutto espanso\n * @param autoSort se true ordina i fratelli per `ownKey`\n */\nexport function assignHierarchyLevels(\n items: any[],\n ownKey: string,\n parentKey: string,\n startsExpanded: boolean,\n autoSort: boolean\n): any[] {\n if (!items || items.length === 0) return [];\n\n const byOwn = new Map<string, any>();\n for (const it of items) byOwn.set(String(it[ownKey]), it);\n\n const childrenOf = new Map<string, any[]>();\n const roots: any[] = [];\n\n for (const it of items) {\n it.parent = false; // reset flag \"ha figli\"\n const pv = it[parentKey];\n const pKey = (pv === null || pv === undefined || pv === '') ? null : String(pv);\n const hasParent = pKey !== null && byOwn.has(pKey) && byOwn.get(pKey) !== it;\n if (hasParent) {\n let arr = childrenOf.get(pKey!);\n if (!arr) { arr = []; childrenOf.set(pKey!, arr); }\n arr.push(it);\n } else {\n roots.push(it);\n }\n }\n\n if (autoSort) {\n roots.sort((a, b) => compareKeys(a[ownKey], b[ownKey]));\n for (const arr of childrenOf.values()) arr.sort((a, b) => compareKeys(a[ownKey], b[ownKey]));\n }\n\n const ordered: any[] = [];\n const visit = (node: any, level: number, ancestorsOpen: boolean) => {\n const kids = childrenOf.get(String(node[ownKey]));\n node._level = level;\n node._visible = level === 1 ? true : ancestorsOpen;\n node.parent = !!(kids && kids.length);\n node._expanded = node.parent ? startsExpanded : false;\n ordered.push(node);\n if (kids) for (const k of kids) visit(k, level + 1, node._visible && node._expanded);\n };\n for (const r of roots) visit(r, 1, true);\n\n return ordered;\n}\n\n/** Espande un nodo: rende visibili i suoi figli diretti (i nipoti restano nascosti) */\nexport function expandNode(rows: any[], ownKey: string, parentKey: string, key: any): void {\n const k = String(key);\n for (const r of rows) if (String(r[ownKey]) === k) { r._expanded = true; break; }\n for (const r of rows) if (String(r[parentKey]) === k) r._visible = true;\n}\n\n/** Collassa un nodo: nasconde ricorsivamente tutto il sottoalbero */\nexport function collapseNode(rows: any[], ownKey: string, parentKey: string, key: any): void {\n const k = String(key);\n for (const r of rows) if (String(r[ownKey]) === k) { r._expanded = false; break; }\n collapseChildren(rows, ownKey, parentKey, k);\n}\n\nfunction collapseChildren(rows: any[], ownKey: string, parentKey: string, parentK: string): void {\n for (const child of rows) {\n if (String(child[parentKey]) !== parentK) continue;\n child._visible = false;\n if (child.parent) {\n child._expanded = false;\n collapseChildren(rows, ownKey, parentKey, String(child[ownKey]));\n }\n }\n}\n","// Motore di coercizione valori — puro e stateless (come row-grouping.ts / hierarchy.ts).\n// Converte una stringa (digitata o incollata) nel tipo della colonna, segnalando la\n// compatibilità. Estratto da EsTable2Component per essere testabile in isolamento.\n\nimport { InputType } from '../../domain/types';\n\n/** Forma minima di colonna richiesta dalla coercizione (soddisfatta da `Est2Column`). */\nexport interface CoerceColumn {\n type: InputType | null;\n source: { id: any; description: string }[] | null;\n}\n\n/** Risultato di una coercizione: `ok:false` = valore incompatibile col tipo. */\nexport interface CoerceResult { ok: boolean; value: any; }\n\n/**\n * Converte `raw` nel tipo di `col`. `ok:false` = incompatibile (es. testo in una\n * colonna numerica) → il chiamante avvisa e non scrive. Una stringa vuota è sempre\n * valida e azzera il valore (`null`).\n */\nexport function coerceValue(raw: string, col: CoerceColumn): CoerceResult {\n const type = col.type;\n const v = raw == null ? '' : String(raw).trim();\n\n switch (type) {\n case 'int':\n case 'number':\n case 'float':\n case 'currency': {\n if (v === '') return { ok: true, value: null };\n const n = toNumber(v);\n if (n == null || isNaN(n)) return { ok: false, value: null };\n return { ok: true, value: (type === 'int' || type === 'number') ? Math.round(n) : n };\n }\n case 'boolean': {\n if (v === '') return { ok: true, value: null };\n if (/^(true|1|✓|s[iì]|si|yes|y)$/i.test(v)) return { ok: true, value: true };\n if (/^(false|0|—|no|n)$/i.test(v)) return { ok: true, value: false };\n return { ok: false, value: null };\n }\n case 'enum':\n case 'autocomplete': {\n if (!col.source || col.source.length === 0) return { ok: true, value: v };\n const byId = col.source.find(o => String(o.id) === v);\n if (byId) return { ok: true, value: byId.id };\n const byDesc = col.source.find(o => o.description === v);\n if (byDesc) return { ok: true, value: byDesc.id };\n return { ok: false, value: null };\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (v === '') return { ok: true, value: null };\n const d = parseDateLoose(v);\n return d ? { ok: true, value: d } : { ok: false, value: null };\n }\n default:\n return { ok: true, value: raw };\n }\n}\n\n/** Parsing numerico tollerante (separatori di migliaia + virgola/punto decimale). `NaN` = non numerico */\nexport function toNumber(v: string): number {\n let s = v.replace(/\\s/g, '').replace(/[€$%]/g, '');\n if (s === '') return NaN;\n const hasComma = s.includes(','), hasDot = s.includes('.');\n if (hasComma && hasDot) {\n // l'ultimo separatore è quello decimale\n if (s.lastIndexOf(',') > s.lastIndexOf('.')) s = s.replace(/\\./g, '').replace(',', '.');\n else s = s.replace(/,/g, '');\n } else if (hasComma) {\n s = s.replace(',', '.');\n }\n return /^-?\\d*\\.?\\d+$/.test(s) ? parseFloat(s) : NaN;\n}\n\n/** Parsing date tollerante: `dd/MM/yyyy [HH:mm[:ss]]` o formati nativi. `null` = non valida */\nexport function parseDateLoose(v: string): Date | null {\n const m = v.match(/^(\\d{1,2})[\\/\\-.](\\d{1,2})[\\/\\-.](\\d{2,4})(?:[ T](\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/);\n if (m) {\n const y = m[3].length === 2 ? 2000 + +m[3] : +m[3];\n const d = new Date(y, +m[2] - 1, +m[1], +(m[4] || 0), +(m[5] || 0), +(m[6] || 0));\n return isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n}\n","// Geometria degli header-group multi-livello — pura e stateless.\n// Deriva le righe di intestazione-gruppo, i confini dei gruppi-colonna e la\n// contiguità dall'insieme (colonne visibili, mappa th, id-gruppo). Estratta da\n// EsTable2Component per poterla testare in isolamento (bottom-alignment, spacer,\n// contiguità sono geometria sottile che merita specifiche dedicate).\n\nimport { TemplateRef } from '@angular/core';\n\n/** Forma minima di `*th` richiesta dalla geometria (soddisfatta da `EsThDirective`). */\nexport interface HgThLike {\n thParent: string | null;\n thStaticContent?: string | null;\n Template?: TemplateRef<any> | null;\n}\n\n/** Forma minima di colonna richiesta (soddisfatta da `Est2Column`). */\nexport interface HgColLike { id: string; }\n\n/** Cella di una riga di header-group multi-livello (span su N colonne-dato). */\nexport interface Est2HeaderGroupCell {\n id: string;\n span: number;\n isGroup: boolean;\n label: string;\n template: TemplateRef<any> | null;\n}\n\n/**\n * Catena di antenati di una colonna via `thParent`. Default: padre-immediato → root.\n * `rootFirst=true` la restituisce root → padre-immediato. Guardia a 32 contro cicli.\n */\nexport function ancestorChain(id: string, thById: Map<string, HgThLike>, rootFirst = false): string[] {\n const chain: string[] = [];\n let p = thById.get(id)?.thParent ?? null;\n let guard = 0;\n while (p && guard++ < 32) { chain.push(p); p = thById.get(p)?.thParent ?? null; }\n return rootFirst ? chain.reverse() : chain;\n}\n\n/**\n * Righe di header-group multi-livello, dall'alto (root) verso il basso (padre\n * immediato). Ogni gruppo si allinea in BASSO: il padre immediato di una colonna\n * sta sempre nella riga direttamente sopra la colonna; gli antenati più alti\n * salgono. Le colonne senza gruppo (o con catena più corta) hanno celle-spacer\n * vuote in alto.\n */\nexport function computeHeaderGroupRows(\n leaves: HgColLike[], thById: Map<string, HgThLike>, parentIds: Set<string>\n): Est2HeaderGroupCell[][] {\n if (parentIds.size === 0 || leaves.length === 0) return [];\n\n const chains = leaves.map(c => ancestorChain(c.id, thById));\n const maxDepth = chains.reduce((m, ch) => Math.max(m, ch.length), 0);\n if (maxDepth === 0) return [];\n\n const rows: Est2HeaderGroupCell[][] = [];\n for (let r = 0; r < maxDepth; r++) {\n const row: Est2HeaderGroupCell[] = [];\n let i = 0;\n while (i < leaves.length) {\n // allineamento in basso: alla riga r (0=alto) corrisponde l'antenato a\n // distanza (maxDepth-1-r) dalla colonna (0 = padre immediato)\n const anc = chains[i][maxDepth - 1 - r];\n if (anc == null) {\n row.push({ id: `_hg_spacer_${r}_${i}`, span: 1, isGroup: false, label: '', template: null });\n i++;\n } else {\n let span = 0;\n while (i < leaves.length && chains[i][maxDepth - 1 - r] === anc) { span++; i++; }\n const gth = thById.get(anc);\n row.push({ id: anc, span, isGroup: true, label: gth?.thStaticContent ?? anc, template: gth?.Template ?? null });\n }\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Indici (in `cols`) delle colonne che aprono un nuovo gruppo-colonna, cioè dove\n * il gruppo padre immediato cambia rispetto alla colonna precedente. Serve a\n * disegnare i confini dei gruppi anche nel corpo della tabella.\n */\nexport function computeColumnGroupBoundaries(\n cols: HgColLike[], thById: Map<string, HgThLike>, hasParents: boolean\n): Set<number> {\n const set = new Set<number>();\n if (!hasParents) return set;\n let prev: string | null | undefined = undefined;\n for (let i = 0; i < cols.length; i++) {\n const parent = thById.get(cols[i].id)?.thParent ?? null;\n if (i > 0 && parent !== prev) set.add(i);\n prev = parent;\n }\n return set;\n}\n\n/**\n * Riordina `orderIds` così che i membri di uno stesso gruppo restino contigui.\n * Chiave di ordinamento = [prima-apparizione di ogni antenato (root→foglia), poi\n * indice proprio]. Due colonne dello stesso gruppo non possono più essere\n * interlacciate con colonne esterne.\n */\nexport function enforceGroupContiguity(\n orderIds: string[], thById: Map<string, HgThLike>, hasParents: boolean\n): string[] {\n if (!hasParents) return orderIds;\n const chainOf = (id: string) => ancestorChain(id, thById, true);\n const firstIdx = new Map<string, number>();\n orderIds.forEach((id, i) => {\n for (const g of chainOf(id)) if (!firstIdx.has(g)) firstIdx.set(g, i);\n });\n const keyOf = (id: string, i: number): number[] =>\n [...chainOf(id).map(g => firstIdx.get(g)!), i];\n return orderIds\n .map((id, i) => ({ id, key: keyOf(id, i), i }))\n .sort((a, b) => {\n const n = Math.max(a.key.length, b.key.length);\n for (let k = 0; k < n; k++) {\n const av = a.key[k] ?? -1, bv = b.key[k] ?? -1;\n if (av !== bv) return av - bv;\n }\n return a.i - b.i;\n })\n .map(x => x.id);\n}\n","// Modello di colonna dell'es-table2 — tipo puro, condiviso da componente e motori.\n// Estratto qui per rompere la dipendenza circolare col motore `core/columns.ts`.\n\nimport { EsThDirective } from '../../directives/es_th.directive';\nimport { EsTdDirective } from '../../directives/es_td.directive';\nimport { InputType } from '../../domain/types';\nimport { Est2AggSpec } from './row-grouping';\n\n/** Modello interno di colonna. Può derivare da direttive `*th`/`*td`, da una\n * `EsTableColumnsDefinition` (modalità dinamica) o da una `ReportColumn` (report). */\nexport interface Est2Column {\n id: string;\n /** direttiva header, se la colonna deriva da `*th` */\n header?: EsThDirective;\n /** direttiva cella, se la colonna deriva da `*td` */\n cell?: EsTdDirective;\n visible: boolean;\n orderable: boolean;\n alignment: 'left' | 'right' | 'center';\n property: string | null;\n type: InputType | null;\n source: { id: any; description: string }[] | null;\n format: string | null;\n /** classe CSS della CELLA (`*td Class`) — applicata solo ai `<td>` */\n cssClass: string;\n /** classe CSS dell'HEADER (`*th Class`) — applicata solo ai `<th>` */\n headerClass: string;\n wrap: boolean;\n /** true se questa colonna è una chiave di raggruppamento (`thGroup`) */\n isGroup: boolean;\n /** specifiche di aggregazione parseate dal template `thAggregation` */\n aggSpecs: Est2AggSpec[];\n /** testo statico dell'header (modalità dinamica/report; direttive senza template) */\n headerText?: string | null;\n /** colore di sfondo dell'header (report) */\n headerBg?: string | null;\n /** accesso al valore per indice: report → indice colonna in `values[]` */\n propAccessor?: string | null;\n /** indice per il lookup dei colori per-cella (`forecolors[i]`/`backcolors[i]`) in report e dinamica */\n colorIndex?: number | null;\n /** route di navigazione per la cella (dinamica) */\n routePath?: string | null;\n routeParams?: string[] | null;\n /** nome del renderer custom da risolvere tra i `*td` (dinamica) */\n rendererName?: string | null;\n /** true se la colonna è \"pinnata\" (sticky a sinistra durante lo scroll orizzontale) */\n pinned?: boolean;\n /** larghezza in px della colonna pinnata (usata per calcolare gli offset sticky) */\n pinnedWidth?: number | null;\n /** colonna Multi: nome della proprietà-array sull'item (es. `touvalues`) */\n multiProp?: string | null;\n /** colonna Multi: indice dell'entry dentro l'array della proprietà */\n multiIndex?: number | null;\n}\n\n/**\n * Factory di `Est2Column`: applica i default costanti (visible/orderable/alignment/…)\n * e sovrascrive col `partial`. I costruttori di colonne (direttive, multi, dinamica,\n * report) passano solo i campi che differiscono, evitando derive di campo. I default\n * `false`/`null` sono equivalenti in comportamento agli `undefined` che i literal\n * omettevano (`pinned` falsy, `pinnedWidth || 120`, `headerBg` falsy).\n */\nexport function makeColumn(partial: Partial<Est2Column> & { id: string }): Est2Column {\n return {\n visible: true, orderable: false, alignment: 'left',\n property: null, type: null, source: null, format: null,\n cssClass: '', headerClass: '', wrap: false, isGroup: false, aggSpecs: [],\n headerText: null, headerBg: null, pinned: false, pinnedWidth: null,\n ...partial\n };\n}\n","// Costruttori di colonne (direttive / multi / dinamica / report) — puri e stateless.\n// Producono solo dati (`Est2Column[]` e, per Multi, le mappe header-group aggiornate);\n// il componente resta responsabile di applicarli allo stato a signal. Estratti da\n// EsTable2Component per isolare ~230 righe della logica più densa e branch-heavy.\n\nimport { EsThDirective } from '../../directives/es_th.directive';\nimport { EsTdDirective } from '../../directives/es_td.directive';\nimport { EsTableColumnsDefinition } from '../../domain/externals/EsTableColumnsDefinition';\nimport { InputType } from '../../domain/types';\nimport { Est2Column, makeColumn } from './column-model';\nimport { parseAggregationSpecs } from './row-grouping';\n\n/** Definizione di una colonna Multi da srotolare (proprietà-array + direttive) */\nexport interface MultiDef { prop: string; th: EsThDirective; td?: EsTdDirective; }\n\n/** Colonne da direttive `*th`/`*td` dirette (esclude gruppi e Multi). */\nexport function mapDirectiveColumns(\n ths: EsThDirective[], tdByCol: Map<string, EsTdDirective>,\n parentIds: Set<string>, defAlignment: 'left' | 'right' | 'center'\n): Est2Column[] {\n const cols: Est2Column[] = [];\n for (const th of ths) {\n if (!th.thIf) continue;\n if (th.thMulti) continue; // srotolata separatamente\n if (parentIds.has(th.th)) continue; // è un header di gruppo, non una colonna-dato\n const td = tdByCol.get(th.th);\n cols.push(makeColumn({\n id: th.th,\n header: th,\n cell: td,\n visible: th.thVisible,\n orderable: th.thOrderable,\n alignment: ((td?.tdAlignment || th.thAlignment)?.toLowerCase() as any) || defAlignment,\n property: th.thProperty,\n type: (th.thType as InputType) ?? null,\n source: th.thSource,\n format: td?.tdFormat || th.thFormat || null,\n cssClass: td?.tdClass || '', // `*td Class` → solo `<td>`\n headerClass: th.thClass || '', // `*th Class` → solo `<th>`\n wrap: th.thWrap,\n isGroup: th.thGroup,\n aggSpecs: parseAggregationSpecs(th.th, th.thAggregation),\n headerText: th.thStaticContent,\n headerBg: th.thBackgroundColor,\n routePath: th.thRoutePath,\n routeParams: th.thRouteParameterProperties,\n rendererName: th.thRendererName,\n pinned: !!th.thPinned,\n pinnedWidth: th.thPinnedWidth ?? null\n }));\n }\n return cols;\n}\n\n/** Colonne da una `EsTableColumnsDefinition[]` (modalità dinamica). */\nexport function mapDynamicColumns(defs: EsTableColumnsDefinition[], tds: EsTdDirective[]): Est2Column[] {\n const cols: Est2Column[] = [];\n for (let i = 0; i < defs.length; i++) {\n const d = defs[i];\n if (!d.Visible) continue;\n const renderer = tds.find(t => (d.RendererName && t.td === d.RendererName) || t.tdForProperty === d.PropertyName);\n cols.push(makeColumn({\n id: d.PropertyName,\n cell: renderer,\n orderable: d.Orderable !== false,\n property: d.PropertyName,\n type: (d.PropertyType as InputType) ?? null,\n source: d.PropertySource ?? null,\n format: d.Format ?? null,\n cssClass: d.Clss || '', headerClass: d.Clss || '', // dinamica: un'unica classe colonna (no *th/*td separati)\n wrap: !!d.HeaderWraps,\n headerText: d.Description,\n routePath: d.RoutePath,\n routeParams: d.RouteParameterProperties,\n rendererName: d.RendererName,\n colorIndex: i // forecolors/backcolors allineati all'ordine delle colonne\n }));\n }\n return cols;\n}\n\n/** Colonne da `report_columns` (modalità report): il valore è preso per indice. */\nexport function mapReportColumns(reportColumns: any[]): Est2Column[] {\n const cols: Est2Column[] = [];\n for (let i = 0; i < reportColumns.length; i++) {\n const c = reportColumns[i];\n cols.push(makeColumn({\n id: c.id,\n alignment: (c.alignment?.toLowerCase() as any) || 'left',\n format: c.format ?? null,\n headerText: c.description,\n headerBg: c.color || null,\n propAccessor: String(i),\n colorIndex: i\n }));\n }\n return cols;\n}\n\n/**\n * Srotola le colonne `*th Multi:true` sui dati: ogni entry unica `(header_group,\n * header)` della proprietà-array diventa una colonna sintetica, e i livelli di\n * `header_group` (separati da \">\") alimentano gli header-group. Puro: restituisce\n * le colonne e le mappe th/parent aggiornate (il componente le applica allo stato).\n */\nexport function buildMultiColumns(\n multiDefs: MultiDef[], baseThById: Map<string, EsThDirective>, baseParentIds: Set<string>, items: any[]\n): { columns: Est2Column[]; thById: Map<string, EsThDirective>; parentIds: Set<string> } {\n const cols: Est2Column[] = [];\n const thById = new Map(baseThById);\n const parentIds = new Set(baseParentIds);\n const seen = new Set<string>();\n\n for (const def of multiDefs) {\n const prop = def.prop;\n for (const item of (items || [])) {\n const arr = item?.[prop];\n if (!Array.isArray(arr)) continue;\n for (let ii = 0; ii < arr.length; ii++) {\n const mv = arr[ii] || {};\n const header = mv.header ?? '';\n const group = mv.header_group ?? null;\n const key = `${group}__${header}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const hier = group ? String(group).split('>').map((s: string) => s.trim()).filter(Boolean) : [];\n const immediateParent = hier.length ? hier[hier.length - 1] : null;\n const colId = `${prop}_${ii}`;\n\n // th sintetico foglia: fornisce la catena thParent + il template header\n const leafTh = new EsThDirective(def.th.Template);\n leafTh.th = colId;\n leafTh.thStaticContent = header;\n leafTh.thParent = immediateParent;\n leafTh.thOrderable = false;\n thById.set(colId, leafTh);\n\n // th sintetici dei gruppi padre (una volta ciascuno)\n for (let h = 0; h < hier.length; h++) {\n const pid = hier[h];\n parentIds.add(pid);\n if (!thById.has(pid)) {\n const pth = new EsThDirective(null as any);\n pth.th = pid;\n pth.thStaticContent = pid;\n pth.thParent = h > 0 ? hier[h - 1] : null;\n thById.set(pid, pth);\n }\n }\n\n cols.push(makeColumn({\n id: colId,\n header: leafTh,\n cell: def.td,\n alignment: 'right',\n cssClass: def.td?.tdClass || '', // `*td Class` → solo `<td>`\n headerClass: def.th.thClass || '', // `*th Class` → solo `<th>`\n headerText: header,\n multiProp: prop, multiIndex: ii\n }));\n }\n }\n }\n return { columns: cols, thById, parentIds };\n}\n","// Controller di esportazione (E4) — signal-native ma costruito con una interfaccia\n// host STRETTA (una manciata di accessor/callback), non con il back-ref `this.est`\n// dell'es-table1. Possiede solo `inProgress` + il lazy `ExportService`. La logica è\n// identica a prima (byte-compatibile con `ExportHandler.tryExport`): estratta dal\n// componente per isolare l'export come feature a sé, con la superficie di scrittura\n// più piccola (legge soltanto).\n\nimport { Injector, Type } from '@angular/core';\nimport { ExportService, CsvHeaders } from '@esfaenza/extensions';\nimport { EsTableColumnsDefinition } from '../../domain/externals/EsTableColumnsDefinition';\nimport { Est2Column } from '../core/column-model';\n\n/** Firma della `ExportFunction` del consumer (identica a es-table1). */\nexport type ExportFn = (\n callback: (data: any[], type: Type<any>, cancel?: boolean) => void,\n format: 'CSV' | 'XLSX'\n) => void;\n\n/** Superficie minima che il componente espone al controller di export. */\nexport interface ExportHost {\n injector: Injector;\n visibleColumns(): Est2Column[];\n columns(): Est2Column[];\n boundSource(): any[];\n exportOnlyVisible(): boolean;\n exportBaseName(): string;\n dynamicDefs(): EsTableColumnsDefinition[] | null;\n exportFunction(): ExportFn | undefined;\n cellDisplayText(item: any, col: Est2Column): string;\n columnLabel(col: Est2Column): string;\n renderedHeaderTexts(): Map<string, string>;\n flashNotice(msg: string): void;\n}\n\nexport class ExportController {\n /** Evita esportazioni concorrenti (parità con l'`ExportHandler` originale) */\n private inProgress = false;\n /** `ExportService` risolto pigramente e in modo difensivo (vedi `resolveService`) */\n private svc: ExportService | null | undefined = undefined;\n\n constructor(private host: ExportHost) {}\n\n /**\n * È `providedIn:'root'` ma la sua costruzione dipende da\n * `LocalizationService`/`DateService`/`UtilityService`; se quella catena non è\n * presente (test isolati, o consumer che non importa `@esfaenza/extensions`),\n * `injector.get` lancia → catturo e faccio fallback al percorso self-contained.\n */\n private resolveService(): ExportService | null {\n if (this.svc === undefined) {\n try { this.svc = this.host.injector.get(ExportService, null); }\n catch { this.svc = null; }\n }\n return this.svc;\n }\n\n run(format: 'CSV' | 'XLSX' = 'CSV') {\n const fn = this.host.exportFunction();\n // Parità con l'originale (`ExportHandler.tryExport`): se il consumer fornisce\n // una ExportFunction gliela lascio gestire. La callback ha la STESSA firma\n // dell'es-table1 — `(data, type, cancel?)` — così le funzioni di export dei\n // componenti legacy funzionano invariate: `cancel === true` annulla l'export\n // senza scaricare nulla. È l'`ExportService` che, ricreando ogni riga come\n // `new Type()`, legge i decoratori `@Export` — NON le colonne `*th`.\n if (fn) {\n if (this.inProgress) { this.host.flashNotice(\"Un'esportazione è già in corso, attendere.\"); return; }\n this.inProgress = true;\n try {\n fn((data: any[], type: Type<any>, cancel: boolean = false) => {\n this.inProgress = false;\n if (cancel) return;\n this.viaService(data, type, format);\n }, format);\n } catch (e) {\n this.inProgress = false; // ExportFunction lanciata in modo sincrono: non blocco il guard\n throw e;\n }\n return;\n }\n // Nessuna ExportFunction: percorso self-contained sulle colonne `*th` correnti.\n const matrix = this.buildMatrix();\n if (matrix.length <= 1) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n if (format === 'XLSX') this.xlsx(matrix);\n else this.csv(matrix);\n }\n\n /** Delego all'`ExportService` originale (decorator-driven, byte-compatibile con es-table1). */\n private viaService(data: any[], type: Type<any>, format: 'CSV' | 'XLSX') {\n if (!data?.length) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n const svc = this.resolveService();\n if (!svc) { this.selfContained(data, format); return; } // niente servizio → fallback `*th`\n const columnsFilter = this.host.exportOnlyVisible() ? this.exportColumns().map(c => c.id) : undefined;\n const drcd = this.host.dynamicDefs();\n const genericHeaders: CsvHeaders[] | undefined = drcd && drcd.length > 0\n ? drcd.map(t => ({ label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' })) as any\n : undefined;\n svc.export(data, format, this.host.exportBaseName(), type, columnsFilter, genericHeaders);\n }\n\n /** Percorso di fallback self-contained (dati forniti dalla callback, senza ExportService). */\n private selfContained(data: any[], format: 'CSV' | 'XLSX') {\n if (!data?.length) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n const matrix = this.matrixFrom(data.filter(r => !r._group));\n if (format === 'XLSX') this.xlsx(matrix);\n else this.csv(matrix);\n }\n\n /** Colonne da esportare (tutte o solo visibili) e con dato testuale */\n private exportColumns(): Est2Column[] {\n const cols = this.host.exportOnlyVisible() ? this.host.visibleColumns() : this.host.columns();\n return cols.filter(c => !c.isGroup);\n }\n\n private buildMatrix(): string[][] {\n return this.matrixFrom(this.host.boundSource().filter(r => !r._group));\n }\n\n /** Matrice [header, ...righe] con i valori visualizzati */\n private matrixFrom(rows: any[]): string[][] {\n const cols = this.exportColumns();\n const texts = this.host.renderedHeaderTexts();\n const header = cols.map(c => texts.get(c.id) || this.host.columnLabel(c));\n const body = rows.map(item => cols.map(c => this.host.cellDisplayText(item, c)));\n return [header, ...body];\n }\n\n private csv(matrix: string[][]) {\n const esc = (v: string) => {\n const s = v == null ? '' : String(v);\n return /[\",\\n;]/.test(s) ? '\"' + s.replace(/\"/g, '\"\"') + '\"' : s;\n };\n const csv = matrix.map(row => row.map(esc).join(';')).join('\\r\\n');\n // BOM per la corretta apertura in Excel con caratteri accentati\n this.downloadBlob('' + csv, this.fileName('csv'), 'text/csv;charset=utf-8;');\n }\n\n private async xlsx(matrix: string[][]) {\n try {\n const XLSX: any = await import('xlsx');\n const ws = XLSX.utils.aoa_to_sheet(matrix);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, 'Export');\n XLSX.writeFile(wb, this.fileName('xlsx'));\n } catch {\n this.host.flashNotice('Export XLSX non disponibile (SheetJS assente): esporto in CSV.');\n this.csv(matrix);\n }\n }\n\n private fileName(ext: 'csv' | 'xlsx'): string {\n const name = this.host.exportBaseName() || 'Export';\n return /\\.(csv|xlsx)$/i.test(name) ? name.replace(/\\.(csv|xlsx)$/i, '.' + ext) : `${name}.${ext}`;\n }\n\n private downloadBlob(content: string, filename: string, mime: string) {\n if (typeof document === 'undefined') return;\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a); a.click(); document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output, ViewEncapsulation } from '@angular/core';\n\n/**\n * Paginatore dell'es-table2.\n *\n * Componente di sola presentazione: riceve lo stato di paginazione via input e\n * notifica le intenzioni dell'utente via output. Non conosce il concetto di\n * viewMode/arrayMode — la logica di applicazione vive nel componente padre.\n */\n@Component({\n selector: 'es-table2-pager',\n standalone: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./es-table2-pager.component.scss'],\n template: `\n <div class=\"est2-pager\" *ngIf=\"page() != null\">\n <div class=\"est2-pager__count\" *ngIf=\"showCount()\">\n {{ countLabel() || 'Elementi' }}: <strong>{{ total() }}</strong>\n </div>\n\n <div class=\"est2-pager__spacer\"></div>\n\n <label class=\"est2-pager__ipp\" *ngIf=\"showPagingOptions()\">\n <span>Per pagina</span>\n <select class=\"est2-pager__select\"\n [value]=\"itemsPerPage()\"\n (change)=\"onIppChange($event)\">\n @for (opt of ippOptions(); track opt) {\n <option [value]=\"opt\">{{ opt === allValue ? 'Tutti' : opt }}</option>\n }\n </select>\n </label>\n\n <div class=\"est2-pager__nav\" *ngIf=\"showButtons() && pages() > 1\">\n <button type=\"button\" class=\"est2-pager__btn est2-pager__btn--nav\"\n [disabled]=\"page()! <= 1\"\n (click)=\"goto(page()! - 1)\"\n aria-label=\"Pagina precedente\">\n <svg class=\"est2-pager__chev\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M15 5l-7 7 7 7\" />\n </svg>\n </button>\n\n @for (p of visiblePages(); track p.key) {\n @if (p.page === -1) {\n <span class=\"est2-pager__ellipsis\">…</span>\n } @else {\n <button type=\"button\"\n class=\"est2-pager__btn\"\n [class.est2-pager__btn--active]=\"p.page === page()\"\n (click)=\"goto(p.page)\">{{ p.page }}</button>\n }\n }\n\n <button type=\"button\" class=\"est2-pager__btn est2-pager__btn--nav\"\n [disabled]=\"page()! >= pages()\"\n (click)=\"goto(page()! + 1)\"\n aria-label=\"Pagina successiva\">\n <svg class=\"est2-pager__chev\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n `\n})\nexport class EsTable2PagerComponent {\n /** Valore convenzionale di items-per-page che rappresenta \"Tutti\" */\n public readonly allValue = 999999;\n\n page = input<number | null>(1);\n pages = input<number>(1);\n total = input<number>(0);\n itemsPerPage = input<number>(15);\n countLabel = input<string>('');\n\n showCount = input<boolean>(true);\n showButtons = input<boolean>(true);\n showPagingOptions = input<boolean>(true);\n allowAll = input<boolean>(true);\n\n pageChange = output<number>();\n itemsPerPageChange = output<number>();\n\n /** Opzioni della select di items-per-page (con eventuale \"Tutti\") */\n ippOptions = computed(() => {\n const base = [15, 25, 50, 100];\n if (!base.includes(this.itemsPerPage()) && this.itemsPerPage() !== this.allValue)\n base.push(this.itemsPerPage());\n base.sort((a, b) => a - b);\n return this.allowAll() ? [...base, this.allValue] : base;\n });\n\n /** Finestra di pagine visibili con ellissi (1 … n-1 n n+1 … tot) */\n visiblePages = computed(() => {\n const current = this.page() ?? 1;\n const total = this.pages();\n const out: { key: string; page: number }[] = [];\n const add = (p: number) => out.push({ key: 'p' + p, page: p });\n const gap = (id: string) => out.push({ key: id, page: -1 });\n\n const window = new Set<number>([1, total, current - 1, current, current + 1]);\n let last = 0;\n for (let p = 1; p <= total; p++) {\n if (!window.has(p)) continue;\n if (p - last > 1) gap('g' + p);\n add(p);\n last = p;\n }\n return out;\n });\n\n goto(p: number) {\n if (p < 1 || p > this.pages() || p === this.page()) return;\n this.pageChange.emit(p);\n }\n\n onIppChange(ev: Event) {\n this.itemsPerPageChange.emit(+(ev.target as HTMLSelectElement).value);\n }\n}\n","// Angular\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef,\n EventEmitter, HostBinding, HostListener, Inject, Injector, Input, Optional, Output, QueryList, Self, signal, computed,\n linkedSignal, TemplateRef, Type, ViewEncapsulation, model, input, AfterContentInit, ViewChild, OnDestroy\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\n\n// Context menu (stessa integrazione dell'es-table originale)\nimport { ContextMenuComponent } from '@esfaenza/ngx-contextmenu';\n// Preferenze utente (persistenza server-side, stesso servizio/formato dell'es-table originale)\nimport { PreferencesService } from '@esfaenza/preferences';\n\n// Wire contracts — condivisi con l'es-table originale (stesso package/modulo)\nimport { AppSearch } from '../domain/externals/appsearch/AppSearch';\nimport { AppOrdering } from '../domain/externals/appsearch/AppOrdering';\nimport { ItemsSelection } from '../domain/externals/appsearch/ItemsSelection';\nimport { EsTableColumnsDefinition } from '../domain/externals/EsTableColumnsDefinition';\nimport { EsTableOperationDefinition } from '../domain/externals/EsTableOperationDefinition';\nimport { CornerMenuOption } from '../domain/externals/CornerMenuOption';\nimport { EsTableModelChange } from '../domain/externals/EsTableModelChange';\nimport { EsTableDefaultable } from '../domain/configuration/EsTableDefaultable';\n\n// Direttive di cella — RIUSATE dall'es-table originale (stessi selettori `*th`/`*td`/`*editor`)\nimport { EsThDirective } from '../directives/es_th.directive';\nimport { EsTdDirective } from '../directives/es_td.directive';\nimport { EsTdEditorDirective } from '../directives/es_td_editor.directive';\n// Provider esterno di celle (`td_th_provider`) — riusato dall'es-table originale\nimport { ThTdProvider } from '../directives/es_th_td_provider.directive';\n\n// Pipe (riusate per il testo di copia, dependency-free)\nimport { Est2FormatPipe } from './pipes/format.pipe';\nimport { Est2LookupPipe } from './pipes/lookup.pipe';\n\n// DI\nimport { EST2_DEBUG, EST2_DEFAULTS, EST2_EXPORT_GLOBAL_ACL } from './tokens2';\n\n// Raggruppamento client-side\nimport { Est2AggSpec, buildGroupedRows, formatAggValue } from './core/row-grouping';\n// Modalità gerarchica\nimport { assignHierarchyLevels, expandNode, collapseNode } from './core/hierarchy';\n// Coercizione valori (editing/paste) — motore puro\nimport { coerceValue as coerceValueFn } from './core/coercion';\n// Geometria header-group multi-livello — motore puro\nimport {\n Est2HeaderGroupCell, ancestorChain as ancestorChainFn, computeHeaderGroupRows,\n computeColumnGroupBoundaries, enforceGroupContiguity as enforceGroupContiguityFn\n} from './core/header-groups';\nexport { Est2HeaderGroupCell } from './core/header-groups';\n// Modello di colonna + factory — tipo puro (rompe la dipendenza circolare col motore colonne)\nimport { Est2Column } from './core/column-model';\nexport { Est2Column } from './core/column-model';\n// Costruttori di colonne — motore puro\nimport {\n MultiDef, mapDirectiveColumns, mapDynamicColumns, mapReportColumns,\n buildMultiColumns as buildMultiColumnsFn\n} from './core/columns';\n// Controller di esportazione (E4)\nimport { ExportController } from './controllers/export.controller';\n\n/**\n * Riga della tabella. Oltre ai dati aperti del consumer (index signature) porta\n * un insieme FISSO di flag interni iniettati da grouping/hierarchy/selezione. Tiparli\n * qui documenta il contratto in un unico posto e riduce la superficie di refuso.\n */\nexport interface Est2Row {\n [k: string]: any;\n /** selezione di riga */\n _selected?: boolean;\n /** riga-gruppo (intestazione di un raggruppamento) */\n _group?: boolean;\n /** riga-dato (foglia) */\n _item?: boolean;\n /** visibile (collasso gruppo / gerarchia) */\n _visible?: boolean;\n /** gruppo/nodo espanso */\n _expanded?: boolean;\n /** livello gerarchico (1-based) */\n _level?: number;\n /** profondità di annidamento gruppo (0-based) */\n _grouplevel?: number;\n /** aggregazioni per colonna → funzione → valore formattato */\n _agg?: Map<string, Map<string, string>>;\n /** chiave path del gruppo/item */\n _thisKey?: string;\n /** chiave del gruppo padre */\n _parent?: string | null;\n /** numero di sotto-gruppi */\n _groupscount?: number;\n /** riga separatore (consumer) */\n _sep?: boolean;\n /** gerarchia: il nodo ha figli */\n parent?: boolean;\n /** id per trackBy (consumer) */\n _hash?: any;\n /** oggetti \"generic\": bag delle proprietà */\n properties?: Record<string, any>;\n}\n\n// `Est2HeaderGroupCell` è definita nel motore puro `core/header-groups.ts` e\n// re-esportata sopra (retro-compatibile per chi la importa da questo modulo).\n\n/**\n * es-table2 — riscrittura 2026 dell'es-table.\n *\n * Mantiene la superficie pubblica (Input/Output/direttive `*th`/`*td`) dell'es-table\n * originale ma con implementazione basata su signal, control-flow moderno e un design\n * system a token (tema chiaro/scuro).\n *\n * FASE 1: modalità view/array, celle template + direttive, ordinamento, paginazione,\n * selezione singola/multipla. Le modalità avanzate (grouping, hierarchy, dynamic,\n * report, range-paste, export) sono dichiarate nella superficie ma verranno collegate\n * nelle fasi successive.\n */\n@Component({\n selector: 'es-table2',\n standalone: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./es-table2.component.scss'],\n templateUrl: './es-table2.component.html'\n})\nexport class EsTable2Component implements ControlValueAccessor, AfterContentInit, OnDestroy {\n\n // ===========================================================================\n // Contenuto proiettato\n // ===========================================================================\n /** Modalità \"template semplice\": riga di `<th>` */\n @ContentChild('header', { static: false }) headerRef?: TemplateRef<any>;\n /** Modalità \"template semplice\": riga di `<td>` con `let-item` */\n @ContentChild('body', { static: false }) bodyRef?: TemplateRef<any>;\n\n @ContentChildren(EsThDirective) thDirectives?: QueryList<EsThDirective>;\n @ContentChildren(EsTdDirective) tdDirectives?: QueryList<EsTdDirective>;\n @ContentChildren(EsTdEditorDirective) editorDirectives?: QueryList<EsTdEditorDirective>;\n /** Provider `td_th_provider` annidati dentro `<es-table2>` */\n @ContentChildren(ThTdProvider) thTdProviders?: QueryList<ThTdProvider>;\n\n /** Context menu (ngx-contextmenu) collegato al click destro sulle righe */\n @Input() ContextMenu?: ContextMenuComponent;\n /** Menu vuoto di default, usato quando il consumer non fornisce un **ContextMenu** */\n @ViewChild('emptyMenu', { static: true }) tableEmptyMenu?: ContextMenuComponent;\n private ctxMenuSub?: Subscription;\n\n /** Altezza dell'header (misurata): la barra di selezione la usa per coprirlo esattamente */\n selbarHeight = signal(0);\n private headerEl?: HTMLElement;\n private headerRO?: ResizeObserver;\n /** ViewChild-setter: (ri)osserva l'header appena compare/cambia, mantenendo `selbarHeight` allineata */\n @ViewChild('theadRef') set theadRef(ref: ElementRef<HTMLElement> | undefined) {\n const el = ref?.nativeElement;\n if (el === this.headerEl) return;\n this.headerEl = el;\n this.headerRO?.disconnect();\n if (el && typeof ResizeObserver !== 'undefined') {\n this.headerRO = new ResizeObserver(() => {\n const h = el.offsetHeight;\n if (h && h !== this.selbarHeight()) { this.selbarHeight.set(h); this.cdr.markForCheck(); }\n });\n this.headerRO.observe(el);\n this.selbarHeight.set(el.offsetHeight);\n }\n }\n\n // ===========================================================================\n // Superficie pubblica — Input risolti (pattern _alias -> signal risolto)\n // ===========================================================================\n readonly _Selection = input<boolean | null>(null, { alias: 'Selection' });\n Selection = linkedSignal(() => this.io(this._Selection(), this.defaults?.Selection, false));\n SingleSelection = input<boolean>(false);\n SelectionDisabled = input<boolean>(false);\n readonly _SelectAll = input<boolean | null>(null, { alias: 'SelectAll' });\n SelectAll = linkedSignal(() => this.io(this._SelectAll(), null, false));\n /** @deprecated NO-OP di parità v1 (cache selezione cross-pagina): dichiarato per il drop-in, non usato */\n readonly _UseSelectionCache = input<boolean | null>(null, { alias: 'UseSelectionCache' });\n UseSelectionCache = linkedSignal(() => this.io(this._UseSelectionCache(), this.defaults?.UseSelectionCache, true));\n readonly _ShiftClick = input<boolean | null>(null, { alias: 'ShiftClick' });\n ShiftClick = linkedSignal(() => this.io(this._ShiftClick(), null, false));\n\n readonly _OrderByColumn = input<boolean | null>(null, { alias: 'OrderByColumn' });\n OrderByColumn = linkedSignal(() => this.io(this._OrderByColumn(), null, true));\n MultipleOrderingDirectives = input<boolean>(true);\n\n Removal = input<boolean>(false);\n RemovalCondition = input<string>('');\n @Input() RowClassAssigner?: (item: any) => string;\n\n readonly _HidePaging = input<boolean | null>(null, { alias: 'HidePaging' });\n HidePaging = linkedSignal(() => this.io(this._HidePaging(), this.defaults?.HidePaging, false));\n readonly _HidePagingCount = input<boolean | null>(null, { alias: 'HidePagingCount' });\n HidePagingCount = linkedSignal(() => this.io(this._HidePagingCount(), this.defaults?.HidePagingCount, false));\n readonly _HidePagingButtons = input<boolean | null>(null, { alias: 'HidePagingButtons' });\n HidePagingButtons = linkedSignal(() => this.io(this._HidePagingButtons(), this.defaults?.HidePagingButtons, false));\n readonly _AllSearch = input<boolean | null>(null, { alias: 'AllSearch' });\n AllSearch = linkedSignal(() => this.io(this._AllSearch(), this.defaults?.AllSearch, true));\n readonly _PagingStyle = input<'both' | 'top' | 'bottom' | null>(null, { alias: 'PagingStyle' });\n PagingStyle = linkedSignal(() => this.io(this._PagingStyle(), this.defaults?.PagingStyle, 'bottom'));\n // Read-write: `linkedSignal` risolve dall'input (reattivo) MA resta scrivibile\n // dal pager. L'override interno sopravvive finché l'input non cambia davvero.\n readonly _ArraymodeItemsPerPage = input<number | null>(null, { alias: 'ArraymodeItemsPerPage' });\n ArraymodeItemsPerPage = linkedSignal(() => this.io(this._ArraymodeItemsPerPage(), this.defaults?.ArraymodeItemsPerPage, 15));\n readonly _UseArrayModePaging = input<boolean | null>(true, { alias: 'UseArrayModePaging' });\n UseArrayModePaging = linkedSignal(() => this.io(this._UseArrayModePaging(), null, true));\n CountLabel = input<string>('');\n\n Height = input<string | undefined>(undefined);\n MaxHeight = input<number | undefined>(undefined);\n EmptySpaceBackgroundColor = input<string>('');\n HighCellDensity = input<boolean>(false);\n HeaderHidden = input<boolean>(false);\n BodyHidden = input<boolean>(false);\n ShowLoadingOnBootstrap = input<boolean>(false);\n readonly _DefaultAlignment = input<'Left' | 'Right' | 'Center' | null>(null, { alias: 'DefaultAlignment' });\n DefaultAlignment = linkedSignal(() => this.io(this._DefaultAlignment(), this.defaults?.DefaultAlignment, 'Left'));\n readonly _TableClass = input<string | null>(null, { alias: 'TableClass' });\n TableClass = linkedSignal(() => this.io(this._TableClass(), this.defaults?.TableClass, ''));\n readonly _ContainerClass = input<string | null>(null, { alias: 'ContainerClass' });\n ContainerClass = linkedSignal(() => this.io(this._ContainerClass(), this.defaults?.ContainerClass, ''));\n\n EsTableHandledSearch = input<boolean>(false);\n SearchThrottle = input<number>(50);\n\n /** @deprecated NO-OP di parità v1 (ridimensionamento colonne): dichiarato per il drop-in, non implementato */\n readonly _ColumnsResizable = input<boolean | null>(null, { alias: 'ColumnsResizable' });\n ColumnsResizable = linkedSignal(() => this.io(this._ColumnsResizable(), this.defaults?.ColumnsResizable, false));\n readonly _ColumnsPinnable = input<boolean | null>(null, { alias: 'ColumnsPinnable' });\n ColumnsPinnable = linkedSignal(() => this.io(this._ColumnsPinnable(), this.defaults?.ColumnsPinnable, true));\n // Parità v1: se non valorizzati esplicitamente, `HiddenColumns`/`ColumnsOrdering`\n // (e la relativa voce di menu per gestire le colonne) sono ATTIVI di default sulle\n // tabelle a celle custom (direttive `*th`/`*td`). Un valore esplicito (anche `false`)\n // vince sempre. Vedi `es_table.component.ts` righe 625-626.\n readonly _HiddenColumns = input<boolean | null>(null, { alias: 'HiddenColumns' });\n HiddenColumns = linkedSignal(() => this.io(this._HiddenColumns(), null, this.directivesBased()));\n readonly _ColumnsOrdering = input<boolean | null>(null, { alias: 'ColumnsOrdering' });\n ColumnsOrdering = linkedSignal(() => this.io(this._ColumnsOrdering(), null, this.directivesBased()));\n readonly _Export = input<boolean | null>(null, { alias: 'Export' });\n Export = linkedSignal(() => this.io(this._Export(), this.defaults?.Export, false));\n XLSXExport = input<boolean>(true);\n CSVExport = input<boolean>(true);\n ExportFileName = input<string>('Export.csv');\n ExportOnlyVisibleColumns = input<boolean>(false);\n // Firma identica all'es-table1 (il terzo parametro `cancel` è opzionale e permette\n // al consumer di annullare l'export dopo un recupero dati fallito/abortito).\n @Input() ExportFunction?: (callback: (data: any[], type: Type<any>, cancel?: boolean) => void, format: 'CSV' | 'XLSX') => void;\n CornerMenuOptions = input<CornerMenuOption[]>([]);\n DynamicOperations = input<EsTableOperationDefinition[]>([]);\n readonly _DynamicRowColumnsDefinition = input<EsTableColumnsDefinition[] | null>(null, { alias: 'DynamicRowColumnsDefinition' });\n Hierarchy = input<boolean>(false);\n // Read-write: risolti dall'input ma scrivibili dall'auto-detect gerarchia\n readonly _ParentKey = input<string | null>('', { alias: 'ParentKey' });\n ParentKey = linkedSignal(() => this.io(this._ParentKey(), null, '') || '');\n readonly _OwnKey = input<string | null>('', { alias: 'OwnKey' });\n OwnKey = linkedSignal(() => this.io(this._OwnKey(), null, '') || '');\n readonly _AutoSortHierarchy = input<boolean | null>(null, { alias: 'AutoSortHierarchy' });\n AutoSortHierarchy = linkedSignal(() => this.io(this._AutoSortHierarchy(), null, false));\n StartsExpanded = input<boolean>(true);\n /** In modalità gerarchica: selezionando un nodo si selezionano tutti i discendenti, e un padre\n * risulta selezionato quando tutti i figli lo sono (indeterminato se solo alcuni). */\n CascadeSelection = input<boolean>(false);\n readonly _SavePreferences = input<boolean | null>(null, { alias: 'SavePreferences' });\n SavePreferences = linkedSignal(() => this.io(this._SavePreferences(), this.defaults?.SavePreferences, false));\n /** Nome della tabella: chiave per la persistenza delle preferenze colonne (localStorage) */\n Name = input<string>('');\n /** @deprecated NO-OP di parità v1 (stile paginazione gruppi): dichiarato per il drop-in, non risolto/usato */\n readonly _RowGroupingPagingStyle = input<'left' | 'right' | null>(null, { alias: 'RowGroupingPagingStyle' });\n readonly _ShowItemGroupsColumns = input<boolean | null>(null, { alias: 'ShowItemGroupsColumns' });\n Editable = input<boolean>(false);\n RangeSelection = input<boolean>(false);\n ItemSourceProperty = input<string>('');\n // --- Input di sola PARITÀ v1 (dichiarati per il drop-in, NON implementati) ----\n // Esistono solo perché un template consumer che li bind (`[HasHeaderGroup]`, …)\n // compili invariato passando da <es-table> a <es-table2>. Sono NO-OP volutamente:\n // · HasHeaderGroup/HasSecondaryHeaderGroup — header-group manuali via `#headerGroup`\n // (superati dall'approccio automatico `Parent:`/`Multi`).\n // · SearchView — drill-down gruppi server-side (intenzionalmente non portato).\n // · UseSelectionCache (175), ColumnsResizable (224), RowGroupingPagingStyle (260)\n // — vedi le rispettive dichiarazioni. Rimuoverli romperebbe il drop-in.\n /** @deprecated NO-OP di parità v1 (header-group manuali, superati da `Parent:`/`Multi`) */\n HasHeaderGroup = input<boolean>(false);\n /** @deprecated NO-OP di parità v1 (seconda riga header-group manuale) */\n HasSecondaryHeaderGroup = input<boolean>(false);\n /** @deprecated NO-OP di parità v1 (drill-down gruppi server-side, non portato) */\n SearchView = input<AppSearch<any> | null>(null);\n /** Abilita il \"patacchino\" di auto-aggiornamento (toggle + intervallo) in alto a destra */\n readonly _AutoUpdate = input<boolean | null>(null, { alias: 'AutoUpdate' });\n AutoUpdate = linkedSignal(() => this.io(this._AutoUpdate(), this.defaults?.AutoUpdate, false));\n /** Provider esterno di `*th`/`*td` (pattern `td_th_provider`), passato per riferimento */\n @Input() EsThTdProvider?: ThTdProvider;\n\n // ===========================================================================\n // Superficie pubblica — Output\n // ===========================================================================\n @Output() onOrderChanged = new EventEmitter<AppOrdering>();\n @Output() onSearchRequest = new EventEmitter<boolean>();\n @Output() onSelectionChanged = new EventEmitter<ItemsSelection<any>>();\n @Output() onRemoval = new EventEmitter<any>();\n @Output() onAbortRemoval = new EventEmitter<any>();\n @Output() onModelChange = new EventEmitter<EsTableModelChange[]>();\n @Output() onOpenContextMenu = new EventEmitter<void>();\n @Output() onCornerAction = new EventEmitter<{ id: string; estable: any }>();\n @Output() onDynamicOperation = new EventEmitter<{ id: string; item: any }>();\n\n // --- Models (superficie parità) --------------------------------------------\n globalCheck = model(false);\n autoUpdate = model(false);\n seconds = model('10');\n researchInProgress = model(false);\n\n // ===========================================================================\n // Stato interno\n // ===========================================================================\n /** Locale usato dal renderer di default (undefined = locale del browser) */\n @Input() locale?: string;\n\n /** Modello bindato: AppSearch (viewMode) oppure any[] (arrayMode) */\n view = signal<any>(null);\n viewMode = signal(false);\n arrayMode = signal(false);\n firstBind = signal(true);\n\n /** Righe attualmente visualizzate (già paginate/ordinate) */\n boundSource = signal<Est2Row[]>([]);\n /** Colonne derivate dalle direttive `*th`/`*td` */\n columns = signal<Est2Column[]>([]);\n /** true se la tabella è pilotata dalle direttive (`*th`), false se template semplice */\n directivesBased = signal(false);\n /** true se è attivo il raggruppamento client-side (array mode con colonne `thGroup`) */\n grouped = signal(false);\n /** true se le colonne provengono da `DynamicRowColumnsDefinition` */\n dynamicMode = signal(false);\n /** true se il modello è una view report (`report_columns`) */\n reportMode = signal(false);\n /** Definizione colonne dinamica: risolta dall'input, ma scrivibile (auto-derivata dagli item generici) */\n DynamicRowColumnsDefinition = linkedSignal(() => this._DynamicRowColumnsDefinition());\n /** Se true mostra i valori delle colonne di gruppo anche nelle righe-oggetto */\n ShowItemGroupsColumns = linkedSignal(() => this.io(this._ShowItemGroupsColumns(), this.defaults?.ShowItemGroupsColumns, false));\n /** Mappa ownKey(string) -> figli diretti, per la modalità gerarchica */\n private hierChildren = new Map<string, any[]>();\n\n /** Paginazione arrayMode */\n private arrayPage = signal(1);\n\n /** Ordinamenti attivi (id -> 'ASC'|'DESC') */\n private orders = signal<AppOrdering[]>([]);\n\n /** Header-group: mappa id→direttiva th (inclusi i gruppi) e insieme degli id-gruppo */\n private hgThById = signal<Map<string, EsThDirective>>(new Map());\n private hgParentIds = signal<Set<string>>(new Set());\n /** Base (solo direttive) di hgThById/hgParentIds, per ri-espandere i Multi a ogni refresh */\n private baseThById = new Map<string, EsThDirective>();\n private baseParentIds = new Set<string>();\n\n /** Colonne derivate dalle direttive (senza le Multi, che dipendono dai dati) */\n private directiveColumns: Est2Column[] = [];\n /** Definizioni Multi da srotolare sui dati (`*th Multi:true`) */\n private multiDefs: MultiDef[] = [];\n /** true quando le colonne Multi sono state generate almeno una volta (per il gating delle prefs) */\n private multiColumnsBuilt = false;\n\n // ===========================================================================\n // Theme host bindings\n // ===========================================================================\n @HostBinding('class.est2') hostClass = true;\n @HostBinding('class.est2--dense') get denseClass() { return this.HighCellDensity(); }\n\n // ===========================================================================\n // Derived\n // ===========================================================================\n /** Colonne visibili, con le colonne pinnate spostate in testa (stabile) */\n visibleColumns = computed(() => {\n const vis = this.columns().filter(c => c.visible);\n if (!vis.some(c => c.pinned)) return vis;\n return [...vis.filter(c => c.pinned), ...vis.filter(c => !c.pinned)];\n });\n\n /** Numero di colonne pinnate visibili */\n pinnedCount = computed(() => this.visibleColumns().filter(c => c.pinned).length);\n /** true se c'è almeno una colonna pinnata */\n hasPinned = computed(() => this.pinnedCount() > 0);\n\n /** Larghezza (px) della colonna di selezione quando sticky */\n private readonly SEL_STICKY_W = 44;\n\n /**\n * Offset `left` (px) cumulativi delle colonne sticky, memoizzati: ricalcolati solo\n * quando cambiano `visibleColumns`/`Selection`. Prima `pinnedLeftPx` era O(n) per\n * chiamata e veniva invocato per OGNI cella pinnata del corpo → O(P²·R) per CD.\n */\n pinnedOffsets = computed<number[]>(() => {\n const cols = this.visibleColumns();\n let left = this.Selection() ? this.SEL_STICKY_W : 0;\n return cols.map(c => { const at = left; if (c.pinned) left += (c.pinnedWidth || 120); return at; });\n });\n\n /** Offset `left` (px) di una colonna sticky all'indice `ci` in visibleColumns */\n pinnedLeftPx(ci: number): number { return this.pinnedOffsets()[ci] ?? 0; }\n\n /** true se la tabella renderizza colonne strutturate (direttive/dinamica/report), non template semplici */\n usesColumns = computed(() => this.columns().length > 0);\n\n /**\n * Righe di header-group multi-livello (bottom-aligned). Delega al motore puro\n * `core/header-groups.ts`; ricalcolate automaticamente su riordino/visibilità.\n */\n headerGroupRows = computed<Est2HeaderGroupCell[][]>(() =>\n computeHeaderGroupRows(this.visibleColumns(), this.hgThById(), this.hgParentIds()));\n\n /** true se ci sono header-group da renderizzare */\n hasHeaderGroups = computed(() => this.headerGroupRows().length > 0);\n\n /**\n * Indici (in visibleColumns) delle colonne che aprono un nuovo gruppo-colonna.\n * Delega al motore puro; disegna i confini dei gruppi anche nel corpo tabella.\n */\n columnGroupBoundaries = computed<Set<number>>(() =>\n computeColumnGroupBoundaries(this.visibleColumns(), this.hgThById(), this.hgParentIds().size > 0));\n\n /** Numero di elementi totali (per il pager) */\n totalCount = computed(() => {\n const v = this.view();\n if (this.viewMode() && v) return v.objectcount ?? v.items?.length ?? 0;\n if (this.arrayMode() && Array.isArray(v)) return v.length;\n return 0;\n });\n\n /** Pagina corrente per il pager */\n currentPage = computed(() => this.viewMode() ? (this.view()?.page ?? 1) : this.arrayPage());\n\n /** Numero totale di pagine per il pager */\n totalPages = computed(() => {\n if (this.viewMode()) return this.view()?.pages ?? 1;\n const ipp = this.ArraymodeItemsPerPage();\n if (!ipp || ipp >= this.effectiveAllValue) return 1;\n return Math.max(1, Math.ceil(this.totalCount() / ipp));\n });\n\n private readonly effectiveAllValue = 999999;\n\n // ===========================================================================\n // CVA plumbing\n // ===========================================================================\n private onChange: (v: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(\n @Self() @Optional() public ngControl: NgControl,\n public cdr: ChangeDetectorRef,\n private hostEl: ElementRef<HTMLElement>,\n @Optional() private prefService: PreferencesService,\n private injector: Injector,\n @Optional() @Inject(EST2_DEFAULTS) private defaults: EsTableDefaultable,\n @Optional() @Inject(EST2_DEBUG) public debugMode: boolean,\n @Optional() @Inject(EST2_EXPORT_GLOBAL_ACL) public exportGlobalAcl: string\n ) {\n if (ngControl) ngControl.valueAccessor = this;\n // Controller di export (E4): costruito con una interfaccia host STRETTA (accessor\n // lazy), non col back-ref completo. `injector` è già assegnato (parameter property).\n this.exportCtrl = new ExportController({\n injector: this.injector,\n visibleColumns: () => this.visibleColumns(),\n columns: () => this.columns(),\n boundSource: () => this.boundSource(),\n exportOnlyVisible: () => this.ExportOnlyVisibleColumns(),\n exportBaseName: () => this.ExportFileName(),\n dynamicDefs: () => this.DynamicRowColumnsDefinition(),\n exportFunction: () => this.ExportFunction,\n cellDisplayText: (item, col) => this.cellDisplayText(item, col),\n columnLabel: (col) => this.columnLabel(col),\n renderedHeaderTexts: () => this.renderedHeaderTexts(),\n flashNotice: (msg) => this.flashNotice(msg)\n });\n }\n\n /** Controller di esportazione (E4) — logica in `controllers/export.controller.ts` */\n private exportCtrl: ExportController;\n\n ngOnInit() {\n // Tutti gli input risolti sono ora `computed()`/`linkedSignal()` reattivi\n // (vedi dichiarazioni): niente più risoluzione one-shot qui.\n\n // Click destro: alla apertura del menu seleziono l'elemento (se non già selezionato)\n const menu = this.ContextMenu || this.tableEmptyMenu;\n if (menu)\n this.ctxMenuSub = menu.open.subscribe((e: any) => this.onContextMenuOpen(e?.item));\n }\n\n ngOnDestroy() {\n this.ctxMenuSub?.unsubscribe();\n this.headerRO?.disconnect();\n if (this.noticeTimer) clearTimeout(this.noticeTimer);\n if (this.searchCallTimeout) clearTimeout(this.searchCallTimeout);\n if (this.updateTimer) clearInterval(this.updateTimer);\n this.providerSubs.forEach(s => s.unsubscribe());\n }\n\n /** Risoluzione input: valore esplicito || default di progetto || hard default */\n private io<T>(v: T | null | undefined, d: T | null | undefined, hard: T): T {\n return (v !== null && v !== undefined) ? v : (d !== null && d !== undefined) ? d : hard;\n }\n\n ngAfterContentInit() {\n this.buildColumns();\n this.thDirectives?.changes.subscribe(() => { this.buildColumns(); this.refresh(); });\n this.tdDirectives?.changes.subscribe(() => { this.buildColumns(); this.refresh(); });\n this.wireProviders();\n this.thTdProviders?.changes.subscribe(() => this.wireProviders());\n }\n\n /** Provider `td_th_provider` attivi: quello passato via `[EsThTdProvider]` + quelli annidati */\n private collectProviders(): ThTdProvider[] {\n return [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.thTdProviders?.toArray() ?? [])];\n }\n\n private providerSubs: Subscription[] = [];\n /** (Ri)aggancia i provider: ricostruisce colonne quando caricano o cambiano i loro `*th`/`*td` */\n private wireProviders() {\n this.providerSubs.forEach(s => s.unsubscribe());\n this.providerSubs = [];\n for (const p of this.collectProviders()) {\n const rebuild = () => { this.buildColumns(); this.refresh(); };\n if (p.LoadedSignal) this.providerSubs.push(p.LoadedSignal.subscribe(rebuild));\n if (p.EsThsDirective) this.providerSubs.push(p.EsThsDirective.changes.subscribe(rebuild));\n if (p.EsTdsDirective) this.providerSubs.push(p.EsTdsDirective.changes.subscribe(rebuild));\n }\n this.buildColumns();\n this.refresh();\n }\n\n // ===========================================================================\n // ControlValueAccessor\n // ===========================================================================\n /** Timeout di debounce del writeValue in modalità EsTableHandledSearch */\n private searchCallTimeout: any = null;\n\n writeValue(obj: any, throttle: boolean = true): void {\n // Modalità EsTableHandledSearch: il writeValue viene debouncato (come l'originale),\n // così binding ravvicinati non generano ricerche a raffica.\n if (this.EsTableHandledSearch() && throttle) {\n if (this.searchCallTimeout) clearTimeout(this.searchCallTimeout);\n this.searchCallTimeout = setTimeout(() => this.writeValue(obj, false), this.SearchThrottle());\n return;\n }\n\n // È arrivato un nuovo modello → nessuna ricerca \"in progress\"\n this.researchInProgress.set(false);\n this.view.set(obj ?? null);\n this.detectMode(obj);\n this.syncOrdersFromView();\n this.refresh();\n if (obj) this.firstBind.set(false);\n this.cdr.markForCheck();\n\n // Auto-ricerca: la valorizzazione dell'ngModel chiede al consumer di cercare\n // (storicamente serviva ad applicare le preferenze colonne senza che il modello\n // in arrivo le sovrascrivesse). Il flag `selfsearch` evita loop; `firstsearch`\n // (true su `new AppSearch()`) salta l'auto-ricerca al primo bind.\n this.handleWriteValueAutoSearch();\n }\n registerOnChange(fn: (v: any) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState?(): void { /* la tabella non ha uno stato disabled globale */ }\n\n /** Blocco auto-ricerca a fine writeValue (modalità EsTableHandledSearch) */\n private handleWriteValueAutoSearch() {\n if (!this.EsTableHandledSearch() || !this.view()) return;\n const v = this.view();\n if (!v.selfsearch && !v.firstsearch) {\n v.selfsearch = true;\n this.changed(true); // svuota gli items + propaga (mostra \"vuoto\" mentre cerca)\n this.onSearchRequest.emit(false);\n } else if (v.selfsearch) {\n v.selfsearch = false; // ricerca rientrata: azzero il guard\n this.changed();\n }\n }\n\n /**\n * Richiesta di ricerca (paging/ordinamento). In modalità EsTableHandledSearch\n * imposta il guard `selfsearch` così il writeValue di rientro non ri-cerca.\n */\n private emitSearchRequest(arg: boolean) {\n this.researchInProgress.set(true);\n const v = this.view();\n if (v && !v.selfsearch && this.EsTableHandledSearch()) {\n v.selfsearch = true;\n this.changed(true);\n this.onSearchRequest.emit(false);\n } else {\n this.onSearchRequest.emit(arg);\n }\n }\n\n // --- Auto-aggiornamento (polling) ------------------------------------------\n /** Interval attivo quando `autoUpdate` è on (in modalità `[AutoUpdate]`) */\n private updateTimer: any = null;\n /** (Ri)avvia/ferma il polling in base al toggle `autoUpdate` e a `seconds` */\n autoUpdateChanged() {\n if (this.updateTimer) { clearInterval(this.updateTimer); this.updateTimer = null; }\n if (!/^[1-9]\\d*$/.test(this.seconds())) this.seconds.set('10');\n if (this.autoUpdate())\n this.updateTimer = setInterval(() => this.emitSearchRequest(false), parseInt(this.seconds(), 10) * 1000);\n }\n\n private changed(clearItems: boolean = false) {\n if (clearItems && this.viewMode()) {\n const isp = this.ItemSourceProperty();\n const v = this.view();\n if (v) { if (!isp) (v as any).items = []; else (v as any)[isp] = []; }\n }\n this.onChange(this.view());\n }\n\n // ===========================================================================\n // Mode & column model\n // ===========================================================================\n private detectMode(obj: any) {\n const isSearch = obj instanceof AppSearch ||\n (obj && typeof obj === 'object' && typeof obj.itemsperpageoverride !== 'undefined' && !Array.isArray(obj));\n this.viewMode.set(!!isSearch);\n this.arrayMode.set(!isSearch && Array.isArray(obj));\n }\n\n private buildColumns() {\n // th/td diretti (proiettati) + quelli forniti dai provider `td_th_provider`\n const provs = this.collectProviders();\n const ths = [\n ...(this.thDirectives?.toArray() ?? []),\n ...provs.flatMap(p => p.EsThsDirective?.toArray() ?? [])\n ];\n const tds = [\n ...(this.tdDirectives?.toArray() ?? []),\n ...provs.flatMap(p => p.EsTdsDirective?.toArray() ?? [])\n ];\n this.directivesBased.set(ths.length > 0);\n if (ths.length === 0) {\n this.columns.set([]); this.directiveColumns = []; this.multiDefs = [];\n this.hgThById.set(new Map()); this.hgParentIds.set(new Set());\n this.baseThById = new Map(); this.baseParentIds = new Set();\n return;\n }\n\n const tdByCol = new Map<string, EsTdDirective>();\n for (const td of tds)\n if (!tdByCol.has(td.td)) tdByCol.set(td.td, td);\n\n // Colonne Multi (`*th Multi:true`): srotolate sui dati in resolveColumns()\n this.multiDefs = ths.filter(t => t.thMulti && t.thIf).map(t => ({ prop: t.th, th: t, td: tdByCol.get(t.th) }));\n this.multiColumnsBuilt = false;\n\n // Header groups multi-livello: un `*th` è un GRUPPO (non una colonna-dato) se\n // il suo id è referenziato da un altro `*th` come `Parent` (`thParent`).\n const parentIds = new Set<string>();\n for (const th of ths) if (th.thParent) parentIds.add(th.thParent);\n const thById = new Map<string, EsThDirective>();\n for (const th of ths) thById.set(th.th, th);\n this.baseThById = thById;\n this.baseParentIds = parentIds;\n this.hgThById.set(new Map(thById));\n this.hgParentIds.set(new Set(parentIds));\n\n const def = this.DefaultAlignment().toLowerCase() as 'left' | 'right' | 'center';\n // Mapping direttive → colonne delegato al motore puro `core/columns.ts`\n const cols = mapDirectiveColumns(ths, tdByCol, parentIds, def);\n this.directiveColumns = cols;\n this.setColumns(cols);\n }\n\n /**\n * Srotola le colonne `*th Multi:true` sui dati. Delega al motore puro\n * `core/columns.ts`; qui applico allo stato le mappe th/parent aggiornate.\n */\n private buildMultiColumns(items: any[]): Est2Column[] {\n const { columns, thById, parentIds } =\n buildMultiColumnsFn(this.multiDefs, this.baseThById, this.baseParentIds, items);\n this.hgThById.set(thById);\n this.hgParentIds.set(parentIds);\n this.multiColumnsBuilt = true;\n return columns;\n }\n\n /** Colonne dinamiche — delega al motore puro `core/columns.ts` */\n private buildDynamicColumns(defs: EsTableColumnsDefinition[]) {\n this.setColumns(mapDynamicColumns(defs, this.tdDirectives?.toArray() ?? []));\n }\n\n /** Colonne report — delega al motore puro `core/columns.ts` */\n private buildReportColumns(reportColumns: any[]) {\n this.setColumns(mapReportColumns(reportColumns));\n }\n\n /** Sceglie la sorgente delle colonne in base al modello: report → dinamica → direttive */\n private resolveColumns(items: any[]) {\n const v = this.view();\n if (this.viewMode() && v?.report_columns?.length) {\n this.reportMode.set(true);\n this.dynamicMode.set(false);\n this.buildReportColumns(v.report_columns);\n return;\n }\n this.reportMode.set(false);\n\n let defs = this.DynamicRowColumnsDefinition();\n const hasTh = (this.thDirectives?.length || 0) > 0;\n // Auto-derivazione da \"generic items\" (oggetti con bag `.properties`) se non ci sono direttive né definizioni\n if ((!defs || defs.length === 0) && !hasTh && items.length && items[0]?.properties) {\n defs = Object.keys(items[0].properties).map(k => new EsTableColumnsDefinition(k, k));\n this.DynamicRowColumnsDefinition.set(defs);\n }\n if (defs && defs.length > 0) {\n this.dynamicMode.set(true);\n this.buildDynamicColumns(defs);\n return;\n }\n this.dynamicMode.set(false);\n // Colonne da direttive (costruite in ngAfterContentInit). Se ci sono `*th Multi`\n // le srotolo sui dati correnti e le accodo alle colonne-direttiva.\n if (this.multiDefs.length && this.directiveColumns.length) {\n const multiCols = this.buildMultiColumns(items);\n this.setColumns([...this.directiveColumns, ...multiCols]);\n }\n }\n\n // ===========================================================================\n // Operazioni dinamiche (colonne-icona a sinistra)\n // ===========================================================================\n /** Visibilità di un'operazione su una riga (gate conditionField/conditionValue, case-insensitive) */\n operationVisible(op: EsTableOperationDefinition, item: any): boolean {\n if (!op.conditionField) return true;\n const src = item?.properties ?? item;\n const key = Object.keys(src ?? {}).find(k => k.toLowerCase() === op.conditionField!.toLowerCase());\n return key != null && String(src[key]) === String(op.conditionValue);\n }\n\n dynamicOperation(item: any, id: string) {\n this.onDynamicOperation.emit({ id, item });\n }\n\n // ===========================================================================\n // Valore/renderer di cella per modalità dinamica/report\n // ===========================================================================\n /** Valore di una cella report: `values[indice]` (fallback su accesso diretto) */\n reportCellValue(item: any, col: Est2Column): any {\n const idx = col.propAccessor as any;\n return item?.values ? item.values[idx] : item?.[idx];\n }\n\n /** Colore per-cella (fore/back) da `forecolors[i]`/`backcolors[i]`; vale sia report che dinamica */\n cellColor(item: any, col: Est2Column, kind: 'fore' | 'back'): string | null {\n if (col.colorIndex == null) return null;\n const arr = kind === 'fore' ? item?.forecolors : item?.backcolors;\n return arr ? (arr[col.colorIndex] || null) : null;\n }\n\n /** Valore report formattato (usa il formatter delle aggregazioni: F0-9 / small-long-verylong) */\n reportCellDisplay(item: any, col: Est2Column): string {\n const raw = this.reportCellValue(item, col);\n return formatAggValue(raw == null ? '' : String(raw), col.format || '', this.locale);\n }\n\n /** Costruisce il routerLink di una cella dinamica da `RoutePath` + `RouteParameterProperties` */\n routerLinkFor(item: any, col: Est2Column): any {\n let path = col.routePath || '';\n const pars = col.routeParams || [];\n const src = item?.properties ?? item;\n for (let i = 0; i < pars.length; i++) path = path.replace('{' + i + '}', src?.[pars[i]]);\n path = path.replace(/'/g, '\"').replace(/ /g, '');\n try { return JSON.parse(path); } catch { return path; }\n }\n\n // ===========================================================================\n // Refresh: ricostruisce boundSource in base a modalità/ordinamento/paginazione\n // ===========================================================================\n private refresh() {\n const v = this.view();\n if (!v) { this.boundSource.set([]); return; }\n\n // Determina la sorgente delle colonne (report / dinamica / direttive)\n const rawItems = this.viewMode()\n ? ((this.ItemSourceProperty() ? v[this.ItemSourceProperty()] : v.items) ?? [])\n : (Array.isArray(v) ? v : []);\n this.resolveColumns(rawItems);\n\n if (this.viewMode()) {\n // Il backend (consumer) fornisce già la pagina ordinata in v.items\n const items = rawItems;\n if (this.Hierarchy()) { this.grouped.set(false); this.boundSource.set(this.applyHierarchy(items, v.selection)); return; }\n this.applySelectionFlags(items, v.selection);\n this.boundSource.set(items);\n return;\n }\n\n if (this.arrayMode()) {\n let items = [...(this.view() as any[])];\n\n // Modalità gerarchica: albero padre/figlio (ignora paginazione)\n if (this.Hierarchy()) {\n this.grouped.set(false);\n this.boundSource.set(this.applyHierarchy(items, this.arraySelection));\n return;\n }\n\n // Raggruppamento client-side: se ci sono colonne `thGroup`, ignora la paginazione\n const groupCols = this.groupColumns();\n if (groupCols.length > 0) {\n this.grouped.set(true);\n const rows = buildGroupedRows(this.clientSort(items), groupCols, this.aggregationSpecs());\n this.applySelectionFlags(rows.filter(r => r._item), this.arraySelection);\n this.boundSource.set(rows);\n return;\n }\n this.grouped.set(false);\n\n items = this.clientSort(items);\n const ipp = this.ArraymodeItemsPerPage();\n if (this.UseArrayModePaging() && ipp && ipp < this.effectiveAllValue) {\n const page = Math.min(this.arrayPage(), Math.max(1, Math.ceil(items.length / ipp)));\n this.arrayPage.set(page);\n items = items.slice((page - 1) * ipp, page * ipp);\n }\n this.applySelectionFlags(items, this.arraySelection);\n this.boundSource.set(items);\n return;\n }\n\n this.boundSource.set([]);\n }\n\n /** Colonne chiave di raggruppamento, nell'ordine di dichiarazione */\n private groupColumns(): string[] {\n return this.columns().filter(c => c.isGroup).map(c => c.id);\n }\n\n /** Tutte le specifiche di aggregazione, appiattite su tutte le colonne */\n private aggregationSpecs(): Est2AggSpec[] {\n const specs: Est2AggSpec[] = [];\n for (const c of this.columns()) specs.push(...c.aggSpecs);\n return specs;\n }\n\n private clientSort(items: any[]): any[] {\n const ord = this.orders();\n if (ord.length === 0) return items;\n return items.sort((a, b) => {\n for (const o of ord) {\n const dir = o.order === 'DESC' ? -1 : 1;\n const av = a?.[o.id], bv = b?.[o.id];\n if (av == null && bv == null) continue;\n if (av == null) return -dir;\n if (bv == null) return dir;\n if (av < bv) return -dir;\n if (av > bv) return dir;\n }\n return 0;\n });\n }\n\n // ===========================================================================\n // Ordinamento\n // ===========================================================================\n orderOf(id: string): 'ASC' | 'DESC' | null {\n return this.orders().find(o => o.id === id)?.order ?? null;\n }\n orderIndex(id: string): number {\n const idx = this.orders().findIndex(o => o.id === id);\n return idx < 0 ? -1 : idx + 1;\n }\n\n toggleSort(col: Est2Column) {\n if (!this.OrderByColumn() || !col.orderable) return;\n\n const current = this.orderOf(col.id);\n const next: 'ASC' | 'DESC' | null = current === 'ASC' ? 'DESC' : current === 'DESC' ? null : 'ASC';\n\n let list = this.MultipleOrderingDirectives()\n ? this.orders().filter(o => o.id !== col.id)\n : [];\n if (next) list = [...list, new AppOrdering(col.id, next)];\n this.orders.set(list);\n\n if (this.viewMode()) {\n const v = this.view();\n v.orders = list;\n v.internalsearchrequest = true;\n this.onOrderChanged.emit(new AppOrdering(col.id, next ?? undefined));\n this.emitSearchRequest(false);\n } else {\n this.refresh();\n }\n if (this.SavePreferences()) this.saveColumnPrefs();\n this.cdr.markForCheck();\n }\n\n private syncOrdersFromView() {\n if (this.viewMode() && this.view()?.orders) this.orders.set([...this.view().orders]);\n }\n\n // ===========================================================================\n // Paginazione\n // ===========================================================================\n goToPage(p: number) {\n if (this.viewMode()) {\n const v = this.view();\n v.page = p;\n v.internalsearchrequest = true;\n this.emitSearchRequest(false);\n } else {\n this.arrayPage.set(p);\n this.refresh();\n }\n this.cdr.markForCheck();\n }\n\n changeItemsPerPage(n: number) {\n if (this.viewMode()) {\n const v = this.view();\n v.itemsperpageoverride = n;\n v.page = 1;\n v.internalsearchrequest = true;\n this.emitSearchRequest(false);\n } else {\n this.ArraymodeItemsPerPage.set(n);\n this.arrayPage.set(1);\n this.refresh();\n }\n this.cdr.markForCheck();\n }\n\n // ===========================================================================\n // Selezione (fase 1: pagina corrente; la cache cross-pagina arriva in fase 6)\n // ===========================================================================\n private arraySelection?: ItemsSelection<any>;\n /** Ancora per la selezione a range stile Windows (Shift+click) */\n private selectionAnchor: any = null;\n\n private currentSelection(): ItemsSelection<any> {\n if (this.viewMode()) {\n const v = this.view();\n if (!v.selection) v.selection = new ItemsSelection<any>([]);\n return v.selection;\n }\n if (!this.arraySelection) this.arraySelection = new ItemsSelection<any>([]);\n return this.arraySelection;\n }\n\n /** Righe realmente selezionabili: esclude le righe-gruppo quando il raggruppamento è attivo */\n private selectableRows(): any[] {\n const rows = this.boundSource();\n return this.grouped() ? rows.filter(r => r._item) : rows;\n }\n\n /**\n * Applica il flag _selected alle righe correnti in base allo stato di selezione.\n * In modalità **all** una riga è selezionata se NON è tra le esclusioni (vale anche\n * per le pagine non ancora visitate, dove tutte le righe risultano selezionate).\n */\n private applySelectionFlags(items: any[], sel?: ItemsSelection<any>) {\n if (!sel) { for (const it of items) it._selected = false; return; }\n for (const it of items)\n it._selected = sel.all ? !sel.exclusions.includes(it) : sel.items.includes(it);\n }\n\n /** Ricalcola il conteggio: in modalità **all** è (totale - esclusioni) */\n private refreshSelectionCount(sel: ItemsSelection<any>) {\n sel.count = sel.all ? Math.max(0, this.totalCount() - sel.exclusions.length) : sel.items.length;\n }\n\n /** Toggle della selezione di una singola riga (checkbox, click su riga o click destro) */\n toggleRow(item: any) {\n if (this.SelectionDisabled() || item?._sep) return;\n const sel = this.currentSelection();\n\n // Selezione in cascata (albero): propaga a discendenti e antenati\n if (this.Hierarchy() && this.CascadeSelection() && !this.SingleSelection()) {\n this.cascadeSelection(item, !item._selected);\n this.rebuildSelectionFromFlags(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n return;\n }\n\n if (this.SingleSelection()) {\n const wasSelected = item._selected;\n for (const it of this.selectableRows()) it._selected = false;\n sel.all = false; sel.exclusions = [];\n sel.items = wasSelected ? [] : [item];\n item._selected = !wasSelected;\n } else if (sel.all) {\n // \"Tutto selezionato\": deselezionare = aggiungere alle esclusioni\n item._selected = !item._selected;\n if (item._selected) sel.exclusions = sel.exclusions.filter(i => i !== item);\n else if (!sel.exclusions.includes(item)) sel.exclusions.push(item);\n } else {\n item._selected = !item._selected;\n if (item._selected) { if (!sel.items.includes(item)) sel.items.push(item); }\n else sel.items = sel.items.filter(i => i !== item);\n this.selectionAnchor = item;\n }\n\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /**\n * Checkbox globale in testata: seleziona/azzera la **pagina corrente**.\n * Per estendere la selezione a tutte le pagine si usa `selectEverything()`\n * (link mostrato nella barra di selezione).\n */\n toggleAll() {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n const pageFully = !sel.all && rows.length > 0 && rows.every(r => r._selected);\n\n if (sel.all || pageFully) {\n this.clearSelectionState(sel);\n } else {\n sel.all = false; sel.exclusions = [];\n sel.items = [...rows];\n for (const r of rows) r._selected = true;\n }\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /** Estende la selezione a TUTTI gli elementi, anche quelli delle altre pagine (`selection.all`) */\n selectEverything() {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const sel = this.currentSelection();\n sel.all = true; sel.items = []; sel.exclusions = [];\n for (const r of this.selectableRows()) r._selected = true;\n this.refreshSelectionCount(sel);\n this.globalCheck.set(true);\n this.emitSelection(sel);\n }\n\n /** Azzera completamente la selezione */\n clearSelection() {\n const sel = this.currentSelection();\n this.clearSelectionState(sel);\n this.refreshSelectionCount(sel);\n this.globalCheck.set(false);\n this.emitSelection(sel);\n }\n\n private clearSelectionState(sel: ItemsSelection<any>) {\n sel.all = false; sel.items = []; sel.exclusions = [];\n for (const r of this.selectableRows()) r._selected = false;\n }\n\n private syncGlobalCheck() {\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n this.globalCheck.set(sel.all ? sel.exclusions.length === 0 : (rows.length > 0 && rows.every(r => r._selected)));\n }\n\n private emitSelection(sel: ItemsSelection<any>) {\n // Una sola selezione alla volta: qualunque selezione di riga azzera il range di celle\n if (this.rangeSel()) this.rangeSel.set(null);\n this.onSelectionChanged.emit(sel);\n this.changed();\n this.cdr.markForCheck();\n }\n\n /** Click su una riga: espande/collassa un gruppo, oppure gestisce la selezione. */\n handleRowClick(item: any, event?: MouseEvent) {\n if (item?._group) { this.toggleGroup(item); return; }\n // In modalità range la selezione di riga avviene solo tramite le checkbox\n // (il click sulla cella pilota il range), così i due meccanismi non collidono.\n if (this.rangeActive()) return;\n if (!this.Selection()) return;\n if (this.SingleSelection()) { this.toggleRow(item); return; }\n\n // Selezione stile Windows (plain / Ctrl / Shift) quando ShiftClick è attivo\n if (this.ShiftClick() && !this.Hierarchy()) { this.windowsSelect(item, event); return; }\n\n // Comportamento classico: Ctrl+click lascia il default del browser (link, ecc.)\n if (event?.ctrlKey || event?.metaKey) return;\n this.toggleRow(item);\n }\n\n /** Selezione a click stile Esplora risorse: plain=solo questo, Ctrl=toggle, Shift=range dall'ancora */\n private windowsSelect(item: any, event?: MouseEvent) {\n if (this.SelectionDisabled() || item?._sep) return;\n const rows = this.selectableRows();\n const sel = this.currentSelection();\n const shift = !!event?.shiftKey;\n const ctrl = !!(event?.ctrlKey || event?.metaKey);\n\n // In modalità \"tutto selezionato\" (selectEverything → sel.all), un Ctrl+click\n // NON deve azzerare la selezione: deve solo togliere/rimettere la singola riga\n // dalle esclusioni, mantenendo sel.all. `toggleRow` gestisce già esattamente\n // questo caso (come fa la checkbox). Senza questo ramo, il reset di sel.all/\n // exclusions in coda a questa funzione collasserebbe la selezione a 0.\n if (sel.all && ctrl && !shift) { this.toggleRow(item); return; }\n\n if (shift && this.selectionAnchor != null && rows.indexOf(this.selectionAnchor) >= 0) {\n const a = rows.indexOf(this.selectionAnchor);\n const b = rows.indexOf(item);\n if (b >= 0) {\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n if (!ctrl) { for (const r of rows) r._selected = false; sel.items = []; }\n for (let i = lo; i <= hi; i++) {\n rows[i]._selected = true;\n if (!sel.items.includes(rows[i])) sel.items.push(rows[i]);\n }\n // l'ancora resta invariata per estensioni successive\n }\n } else if (ctrl) {\n item._selected = !item._selected;\n if (item._selected) { if (!sel.items.includes(item)) sel.items.push(item); }\n else sel.items = sel.items.filter(i => i !== item);\n this.selectionAnchor = item;\n } else {\n // Re-click sull'unica riga selezionata => deseleziona; altrimenti seleziona solo questa\n const onlyThisSelected = item._selected && !sel.all && sel.items.length === 1 && sel.items[0] === item;\n for (const r of rows) r._selected = false;\n if (onlyThisSelected) {\n sel.items = [];\n this.selectionAnchor = null;\n } else {\n sel.items = [item];\n item._selected = true;\n this.selectionAnchor = item;\n }\n }\n\n sel.all = false;\n sel.exclusions = [];\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n // ===========================================================================\n // Fase 5 — Selezione a range (drag cella-per-cella), copia/incolla, editing\n //\n // Rispetto all'es-table originale (matrice `selectionStatus` con 8 flag di\n // bordo per cella, ricalcolata a ogni mousemove + subscription per-cella e\n // debounce anti-doppio-evento) qui il range è descritto da DUE sole\n // coordinate (ancora + fuoco); \"selezionata\"/bordi sono DERIVATI dal\n // rettangolo normalizzato. Gli eventi sono in delega sulla `<table>`\n // (un solo mousedown/mouseover/mouseup) e leggono `data-r`/`data-c` dal\n // `<td>`. Il \"debounce\" sparisce: `mouseover` aggiorna il fuoco solo se la\n // cella cambia davvero, quindi non ci sono doppie operazioni da smorzare.\n // ===========================================================================\n /** Pipe riusate per il testo di copia (dependency-free) */\n private fmt = new Est2FormatPipe();\n private lk = new Est2LookupPipe();\n\n /** Owner globale del range attivo: solo la tabella \"attiva\" reagisce a Ctrl+C/V */\n private static activeRangeOwner: EsTable2Component | null = null;\n\n /** Range di celle: ancora (a) + fuoco (f), indici in boundSource() / visibleColumns() */\n rangeSel = signal<{ a: { r: number; c: number }; f: { r: number; c: number } } | null>(null);\n /** true durante il trascinamento (per disabilitare la selezione testo via CSS) */\n rangeDragging = signal(false);\n\n /** Cella attualmente in editing (indici r/c) */\n editing = signal<{ r: number; c: number } | null>(null);\n /** Bozza del valore in editing */\n editDraft: any = '';\n\n /** true se la modalità range è realmente utilizzabile (colonne strutturate, no gruppi/gerarchia) */\n rangeActive = computed(() =>\n this.RangeSelection() && this.usesColumns() && !this.grouped() && !this.Hierarchy());\n\n /** Rettangolo normalizzato del range corrente (o null) */\n rangeRect = computed(() => {\n const s = this.rangeSel();\n if (!s) return null;\n return {\n top: Math.min(s.a.r, s.f.r), bottom: Math.max(s.a.r, s.f.r),\n left: Math.min(s.a.c, s.f.c), right: Math.max(s.a.c, s.f.c)\n };\n });\n\n /** true se la cella (r,c) è dentro il range */\n inRange(r: number, c: number): boolean {\n const rr = this.rangeRect();\n return !!rr && r >= rr.top && r <= rr.bottom && c >= rr.left && c <= rr.right;\n }\n\n /** Estrae gli indici r/c dal `<td data-r data-c>` più vicino al target */\n private cellCoords(target: EventTarget | null): { r: number; c: number } | null {\n const td = (target as HTMLElement | null)?.closest?.('td[data-r]') as HTMLElement | null;\n if (!td) return null;\n const r = parseInt(td.getAttribute('data-r') ?? '', 10);\n const c = parseInt(td.getAttribute('data-c') ?? '', 10);\n return isNaN(r) || isNaN(c) ? null : { r, c };\n }\n\n /** true se il mousedown corrente è un click sulla singola cella già selezionata\n * (→ un click senza trascinamento la deseleziona) */\n private rangeClickToggle = false;\n\n /** mousedown sulla griglia: apre un nuovo range sulla cella-ancora */\n onGridMouseDown(event: MouseEvent) {\n if (!this.rangeActive() || event.button !== 0 || this.editing()) return;\n const co = this.cellCoords(event.target);\n if (!co) return;\n EsTable2Component.activeRangeOwner = this;\n // Una sola selezione alla volta: avviare un range azzera l'eventuale selezione di riga\n if (this.hasSelection) this.clearSelection();\n // Se ri-clicco l'unica cella già selezionata (range 1×1 su questa cella), un\n // click senza drag la deseleziona (gestito nel mouseup).\n const prev = this.rangeSel();\n this.rangeClickToggle = !!prev &&\n prev.a.r === co.r && prev.a.c === co.c && prev.f.r === co.r && prev.f.c === co.c;\n this.rangeDragging.set(true);\n this.rangeSel.set({ a: co, f: co });\n this.clearTextSelection();\n this.cdr.markForCheck();\n }\n\n /** mouseover durante il drag: estende il range (solo se la cella cambia davvero) */\n onGridMouseOver(event: MouseEvent) {\n if (!this.rangeDragging() || !this.rangeActive()) return;\n if ((event.buttons & 1) === 0) { this.rangeDragging.set(false); return; } // tasto già rilasciato\n const s = this.rangeSel();\n const co = this.cellCoords(event.target);\n if (!s || !co) return;\n if (s.f.r === co.r && s.f.c === co.c) return; // nessun cambiamento → niente ricalcolo (no debounce necessario)\n this.rangeClickToggle = false; // è un drag, non un click di toggle\n this.rangeSel.set({ a: s.a, f: co });\n this.clearTextSelection();\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onDocMouseUp() {\n if (!this.rangeDragging()) return;\n this.rangeDragging.set(false);\n // click (nessun drag) sull'unica cella già selezionata → deseleziona\n if (this.rangeClickToggle) {\n this.rangeClickToggle = false;\n this.rangeSel.set(null);\n this.cdr.markForCheck();\n }\n }\n\n /** Avviso transitorio mostrato in un piccolo toast (es. incolla incompatibile) */\n notice = signal<string | null>(null);\n private noticeTimer: any = null;\n private flashNotice(msg: string) {\n this.notice.set(msg);\n this.cdr.markForCheck();\n if (this.noticeTimer) clearTimeout(this.noticeTimer);\n this.noticeTimer = setTimeout(() => { this.notice.set(null); this.cdr.markForCheck(); }, 4500);\n }\n\n private clearTextSelection() {\n const sel = typeof window !== 'undefined' ? window.getSelection?.() : null;\n if (sel && !sel.isCollapsed) sel.removeAllRanges();\n }\n\n // --- Copia / Incolla -------------------------------------------------------\n // Uso gli eventi nativi `copy`/`paste` (sincroni, dentro il gesto utente):\n // niente prompt di permessi né rifiuti silenziosi come con\n // navigator.clipboard.readText(), che in molti browser è bloccata.\n @HostListener('document:copy', ['$event'])\n onDocCopy(event: ClipboardEvent) {\n if (EsTable2Component.activeRangeOwner !== this || this.editing()) return;\n if (this.isFieldTarget(event.target)) return; // lascio la copia nativa nei campi\n const cells = this.rangeCells();\n if (!cells.length) return;\n const tsv = cells.map(row => row.map(({ item, col }) => this.cellDisplayText(item, col)).join('\\t')).join('\\n');\n event.clipboardData?.setData('text/plain', tsv);\n event.preventDefault();\n }\n\n @HostListener('document:paste', ['$event'])\n onDocPaste(event: ClipboardEvent) {\n if (EsTable2Component.activeRangeOwner !== this || this.editing() || !this.Editable()) return;\n if (this.isFieldTarget(event.target)) return; // lascio l'incolla nativo nei campi\n if (!this.rangeRect()) return;\n const text = event.clipboardData?.getData('text/plain') ?? '';\n event.preventDefault();\n this.applyPaste(text);\n }\n\n /** true se il target dell'evento è un campo di input (copia/incolla nativi) */\n private isFieldTarget(t: EventTarget | null): boolean {\n const tag = (t as HTMLElement | null)?.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n }\n\n /** Celle (item+colonna) comprese nel rettangolo di selezione */\n private rangeCells(): { item: any; col: Est2Column }[][] {\n const rr = this.rangeRect();\n if (!rr) return [];\n const rows = this.boundSource();\n const cols = this.visibleColumns();\n const out: { item: any; col: Est2Column }[][] = [];\n for (let r = rr.top; r <= rr.bottom; r++) {\n const item = rows[r];\n if (!item) continue;\n const line: { item: any; col: Est2Column }[] = [];\n for (let c = rr.left; c <= rr.right; c++)\n if (cols[c]) line.push({ item, col: cols[c] });\n if (line.length) out.push(line);\n }\n return out;\n }\n\n private applyPaste(text: string) {\n if (text == null) return;\n const matrix = text.replace(/\\r/g, '').replace(/\\n$/, '').split('\\n').map(l => l.split('\\t'));\n const cells = this.rangeCells();\n if (!cells.length || !matrix.length) return;\n\n // Un singolo valore si applica all'intera selezione; altrimenti le dimensioni devono coincidere\n const single = matrix.length === 1 && matrix[0].length === 1;\n if (!single && (matrix.length !== cells.length || matrix[0].length !== cells[0].length)) {\n this.flashNotice(`Impossibile incollare: i dati (${matrix.length}×${matrix[0].length}) non corrispondono alla selezione (${cells.length}×${cells[0].length}).`);\n return;\n }\n\n // Pass 1 — convalido TUTTE le celle per tipo di colonna. Se anche una sola\n // è incompatibile, avviso e non applico NULLA (operazione atomica): meglio\n // un avviso chiaro che svuotare silenziosamente le celle.\n const coerced: any[][] = [];\n for (let r = 0; r < cells.length; r++) {\n coerced[r] = [];\n for (let c = 0; c < cells[r].length; c++) {\n const { col } = cells[r][c];\n const raw = single ? matrix[0][0] : matrix[r][c];\n const res = this.coerceValue(raw, col);\n if (!res.ok) {\n this.flashNotice(`Impossibile incollare: «${raw}» non è compatibile con la colonna «${col.headerText ?? col.id}» (tipo ${col.type ?? 'testo'}).`);\n return;\n }\n coerced[r][c] = res.value;\n }\n }\n\n // Pass 2 — applico i valori già convertiti\n const changes: EsTableModelChange[] = [];\n for (let r = 0; r < cells.length; r++)\n for (let c = 0; c < cells[r].length; c++) {\n const { item, col } = cells[r][c];\n const change = this.applyCoerced(item, col, coerced[r][c]);\n if (change) changes.push(change);\n }\n\n if (changes.length) { this.onModelChange.emit(changes); this.changed(); }\n this.cdr.markForCheck();\n }\n\n // --- Editing in cella ------------------------------------------------------\n /** Template di editor custom (`*editor`) per una colonna, se fornito dal consumer */\n editorFor(col: Est2Column): TemplateRef<any> | null {\n const eds = this.editorDirectives?.toArray() ?? [];\n const e = eds.find(x => (x.editor && x.editor === col.id) || (!!col.property && x.editorForProperty === col.property));\n return e?.Template ?? null;\n }\n\n /** Contesto passato ai template `*editor` custom */\n editorContext(item: any, col: Est2Column): any {\n return {\n $implicit: item,\n item, column: col,\n value: this.editDraft,\n setValue: (v: any) => { this.editDraft = v; },\n commit: () => this.commitEdit(item, col),\n cancel: () => this.cancelEdit()\n };\n }\n\n isEditing(r: number, c: number): boolean {\n const e = this.editing();\n return !!e && e.r === r && e.c === c;\n }\n\n /** Tipo dell'`<input>` di default in base al tipo di colonna */\n editorInputType(type: string | null): string {\n switch (type) {\n case 'number': case 'int': case 'float': case 'currency': return 'number';\n default: return 'text';\n }\n }\n\n onCellDblClick(item: any, col: Est2Column, r: number, c: number) {\n if (!this.Editable() || !col.property || item?._group) return;\n this.rangeSel.set(null);\n this.editDraft = this.rawCellValue(item, col) ?? '';\n this.editing.set({ r, c });\n this.cdr.markForCheck();\n requestAnimationFrame(() => {\n const el = this.hostEl?.nativeElement?.querySelector('.est2-editor-input') as HTMLElement | null;\n el?.focus();\n (el as HTMLInputElement)?.select?.();\n });\n }\n\n commitEdit(item: any, col: Est2Column) {\n if (!this.editing()) return; // già chiusa (es. blur dopo Enter/Escape)\n const res = this.coerceValue(this.editDraft, col);\n this.editing.set(null);\n if (!res.ok) {\n // valore incompatibile col tipo: avviso e NON modifico (nessun svuotamento)\n this.flashNotice(`Valore «${this.editDraft}» non valido per «${col.headerText ?? col.id}» (tipo ${col.type ?? 'testo'}).`);\n this.cdr.markForCheck();\n return;\n }\n const change = this.applyCoerced(item, col, res.value);\n if (change) { this.onModelChange.emit([change]); this.changed(); }\n this.cdr.markForCheck();\n }\n\n cancelEdit() {\n if (!this.editing()) return;\n this.editing.set(null);\n this.cdr.markForCheck();\n }\n\n // --- Valori: lettura/scrittura tipizzata + testo di copia ------------------\n /** Lettura bag-aware di una proprietà (gestisce gli oggetti \"generic\" con `properties`) */\n private readProp(item: any, key: string): any {\n return item?.properties ? item.properties[key] : item?.[key];\n }\n /** Scrittura bag-aware di una proprietà */\n private writeProp(item: any, key: string, v: any): void {\n if (item?.properties) item.properties[key] = v; else item[key] = v;\n }\n\n /** Valore grezzo su cui operano editing/paste (gestisce gli oggetti `properties`) */\n private rawCellValue(item: any, col: Est2Column): any {\n return col.property ? this.readProp(item, col.property) : null;\n }\n\n /** Scrive un valore GIÀ convertito e restituisce l'eventuale EsTableModelChange */\n private applyCoerced(item: any, col: Est2Column, niu: any): EsTableModelChange | null {\n if (!col.property) return null;\n const old = this.rawCellValue(item, col);\n if (old === niu) return null;\n this.writeProp(item, col.property, niu);\n return new EsTableModelChange(item, String(col.headerText ?? col.id), col.property, old as any, niu as any);\n }\n\n /** Coercizione valore → delega al motore puro `core/coercion.ts` */\n private coerceValue(raw: string, col: Est2Column): { ok: boolean; value: any } {\n return coerceValueFn(raw, col);\n }\n\n /** Testo visualizzato di una cella (usato dalla copia) */\n cellDisplayText(item: any, col: Est2Column): string {\n if (col.propAccessor != null) return this.reportCellDisplay(item, col);\n const val = this.cellValue(item, col);\n if (col.type === 'enum') return this.lk.transform(val, col.source).description;\n return this.fmt.transform(val, col.type, col.format, this.locale);\n }\n\n // ===========================================================================\n // Raggruppamento (array mode) — espansione/collasso e resa delle celle\n // ===========================================================================\n /** true se `childKey` è `ancestorKey` stesso o un suo discendente (senza collisioni di prefisso) */\n private isDescendantKey(childKey: string | null | undefined, ancestorKey: string): boolean {\n return !!childKey && (childKey === ancestorKey || childKey.startsWith(ancestorKey + '¦'));\n }\n\n /** Espande/collassa un gruppo agendo solo sui flag `_visible` (nessuna ricostruzione) */\n toggleGroup(group: any) {\n group._expanded = !group._expanded;\n const open = group._expanded;\n const key = group._thisKey;\n for (const r of this.boundSource()) {\n if (r === group) continue;\n // espandi: solo i figli immediati; collassa: l'intero sottoalbero\n const childGroup = r._group && (open ? r._parent === key : this.isDescendantKey(r._parent, key));\n const childItem = r._item && (open ? r._thisKey === key : this.isDescendantKey(r._thisKey, key));\n if (childGroup || childItem) {\n r._visible = open;\n if (r._group && !open) r._expanded = false; // ri-collassa i discendenti\n }\n }\n this.cdr.markForCheck();\n }\n\n /** Item (foglia) appartenenti a un gruppo, a qualsiasi profondità */\n private groupItems(group: any): any[] {\n return this.boundSource().filter(r => r._item && this.isDescendantKey(r._thisKey, group._thisKey));\n }\n\n /** Stato di selezione aggregato di un gruppo, per la sua checkbox */\n groupSelectionState(group: any): 'all' | 'some' | 'none' {\n const items = this.groupItems(group);\n if (items.length === 0) return 'none';\n const n = items.filter(it => it._selected).length;\n return n === 0 ? 'none' : n === items.length ? 'all' : 'some';\n }\n\n /** Seleziona/deseleziona tutti gli item di un gruppo */\n toggleGroupSelection(group: any) {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const items = this.groupItems(group);\n const select = this.groupSelectionState(group) !== 'all';\n const sel = this.currentSelection();\n for (const it of items) {\n it._selected = select;\n if (sel.all) {\n if (select) sel.exclusions = sel.exclusions.filter(i => i !== it);\n else if (!sel.exclusions.includes(it)) sel.exclusions.push(it);\n } else {\n if (select) { if (!sel.items.includes(it)) sel.items.push(it); }\n else sel.items = sel.items.filter(i => i !== it);\n }\n }\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /** Testo da mostrare nella cella `col` per una riga-gruppo */\n groupCellDisplay(group: any, col: Est2Column): string {\n if (group.column === col.id) {\n const gp = group._groupscount\n ? ` - ${group._groupscount} ${group._groupscount === 1 ? 'gruppo' : 'gruppi'}`\n : '';\n return `${group.value} (${group.count}${gp})`;\n }\n const colMap: Map<string, string> | undefined = group._agg?.get(col.id);\n if (!colMap || !col.header?.thAggregation) return '';\n let display = col.header.thAggregation;\n for (const spec of col.aggSpecs)\n display = display.replace(spec.match, formatAggValue(colMap.get(spec.func), spec.format, this.locale));\n return display;\n }\n\n /** true se la cella di una riga-oggetto va lasciata vuota (colonna di gruppo nascosta) */\n itemCellHidden(col: Est2Column): boolean {\n return this.grouped() && col.isGroup && !this.ShowItemGroupsColumns();\n }\n\n /** Indentazione (px) della cella-chiave in base al livello di gruppo */\n groupIndent(group: any): number {\n return (group?._grouplevel || 0) * 18;\n }\n\n // ===========================================================================\n // Modalità gerarchica (albero padre/figlio)\n // ===========================================================================\n /** Auto-rileva ownKey/parentKey ('id'/'parentid') se non specificati */\n private autoDetectHierarchyKeys(items: any[]) {\n if (!this.ParentKey() && !this.OwnKey() && items.length > 0) {\n if (items[0]['parentid'] !== undefined) this.ParentKey.set('parentid');\n if (items[0]['id'] !== undefined) this.OwnKey.set('id');\n }\n if (!this.OwnKey() || !this.ParentKey())\n console.error(\"[es-table2] La modalità gerarchica richiede sia OwnKey che ParentKey. Fallback a lista piatta.\");\n }\n\n /** Costruisce l'albero e applica la selezione; se mancano le chiavi torna la lista invariata */\n private applyHierarchy(items: any[], sel?: ItemsSelection<any>): any[] {\n this.autoDetectHierarchyKeys(items);\n if (!this.OwnKey() || !this.ParentKey()) { this.applySelectionFlags(items, sel); return items; }\n const ordered = assignHierarchyLevels(items, this.OwnKey(), this.ParentKey(), this.StartsExpanded(), this.AutoSortHierarchy());\n // mappa padre -> figli per lookup O(1) (cascade selection, indeterminate)\n this.hierChildren.clear();\n const pk = this.ParentKey();\n for (const r of ordered) {\n const pv = r[pk];\n if (pv === null || pv === undefined || pv === '') continue;\n const k = String(pv);\n const arr = this.hierChildren.get(k);\n if (arr) arr.push(r); else this.hierChildren.set(k, [r]);\n }\n this.applySelectionFlags(ordered, sel);\n return ordered;\n }\n\n private directChildren(item: any): any[] {\n return this.hierChildren.get(String(item[this.OwnKey()])) ?? [];\n }\n\n private hierDescendants(item: any): any[] {\n const out: any[] = [];\n const stack = [...this.directChildren(item)];\n while (stack.length) {\n const n = stack.pop();\n out.push(n);\n const kids = this.directChildren(n);\n if (kids.length) stack.push(...kids);\n }\n return out;\n }\n\n /** Selezione in cascata: propaga lo stato al sottoalbero e ricalcola gli antenati */\n private cascadeSelection(item: any, selected: boolean) {\n item._selected = selected;\n for (const d of this.hierDescendants(item)) d._selected = selected;\n // risali: un padre è selezionato sse tutti i figli lo sono\n const pk = this.ParentKey();\n let current = item;\n while (true) {\n const pv = current[pk];\n if (pv === null || pv === undefined || pv === '') break;\n const parent = this.boundSource().find(r => String(r[this.OwnKey()]) === String(pv));\n if (!parent) break;\n const kids = this.directChildren(parent);\n parent._selected = kids.length > 0 && kids.every(k => k._selected);\n current = parent;\n }\n }\n\n /** Ricostruisce ItemsSelection dai flag `_selected` correnti (usato dalla cascade) */\n private rebuildSelectionFromFlags(sel: ItemsSelection<any>) {\n sel.all = false;\n sel.exclusions = [];\n sel.items = this.boundSource().filter(r => r._selected);\n sel.count = sel.items.length;\n }\n\n /** Stato indeterminato di una riga-padre in cascade (alcuni discendenti selezionati) */\n hierarchyIndeterminate(item: any): boolean {\n if (!this.CascadeSelection() || !item?.parent || item._selected) return false;\n return this.hierDescendants(item).some(d => d._selected);\n }\n\n /** Espande/collassa un nodo dell'albero */\n toggleHierarchyNode(item: any) {\n if (!item?.parent) return;\n const rows = this.boundSource();\n if (item._expanded) collapseNode(rows, this.OwnKey(), this.ParentKey(), item[this.OwnKey()]);\n else expandNode(rows, this.OwnKey(), this.ParentKey(), item[this.OwnKey()]);\n this.cdr.markForCheck();\n }\n\n /** Indentazione (px) di una riga dell'albero in base al livello */\n hierarchyIndent(item: any): number {\n return ((item?._level || 1) - 1) * 20;\n }\n\n /** Apertura context menu: se la riga non è selezionata la seleziona (solo lei), poi notifica */\n private onContextMenuOpen(item: any) {\n // Il click destro apre il menu sulla riga: azzero l'eventuale range di celle\n // (la selezione a range e quella di riga sono meccanismi distinti)\n if (this.rangeSel()) { this.rangeSel.set(null); this.cdr.markForCheck(); }\n if (item && !item._sep && !item._group && !item._selected) {\n const sel = this.currentSelection();\n for (const r of this.selectableRows()) r._selected = false;\n sel.all = false; sel.exclusions = []; sel.items = [item];\n item._selected = true;\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n this.onOpenContextMenu.emit();\n }\n\n /** Indeterminato: alcune ma non tutte le righe selezionate (per la checkbox globale) */\n get selectionIndeterminate(): boolean {\n const sel = this.currentSelection();\n if (sel.all) return sel.exclusions.length > 0;\n const rows = this.selectableRows();\n const n = rows.filter(r => r._selected).length;\n return n > 0 && n < rows.length;\n }\n\n /** Numero di elementi selezionati (per la barra) */\n get selectedCount(): number { return this.currentSelection().count || 0; }\n\n /** true se c'è almeno un elemento selezionato (mostra la barra) */\n get hasSelection(): boolean {\n const sel = this.currentSelection();\n return sel.all || sel.items.length > 0;\n }\n\n /** true se sono selezionati TUTTI gli elementi (all senza esclusioni) */\n get allSelected(): boolean {\n const sel = this.currentSelection();\n return sel.all && sel.exclusions.length === 0;\n }\n\n /** true se ha senso proporre \"seleziona tutti\": pagina piena, non in all, e ci sono altre pagine */\n get canSelectEverything(): boolean {\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n return !sel.all && rows.length > 0 && rows.every(r => r._selected) && this.totalCount() > rows.length;\n }\n\n // ===========================================================================\n // Rimozione\n // ===========================================================================\n canRemove(item: any): boolean {\n const cond = this.RemovalCondition();\n return cond ? !!item[cond] : true;\n }\n removeItem(item: any) { this.onRemoval.emit(item); }\n abortRemoval(item: any) { this.onAbortRemoval.emit(item); }\n\n // ===========================================================================\n // Fase 6 — Colonne (visibilità/ordine), preferenze, export\n // ===========================================================================\n /** Preferenze colonne in memoria (ordine + nascoste). Persistite se `SavePreferences`. */\n private columnPrefs: { order: string[]; hidden: string[]; pinned?: string[] } | null = null;\n\n /** Applica ordine + visibilità + pin delle preferenze a una lista di colonne appena costruita */\n private setColumns(cols: Est2Column[]) {\n const p = this.columnPrefs;\n if (!p) { this.columns.set(cols); this.ensurePrefsLoaded(); return; }\n const byId = new Map(cols.map(c => [c.id, c] as const));\n const ordered: Est2Column[] = [];\n for (const id of p.order) { const c = byId.get(id); if (c) { ordered.push(c); byId.delete(id); } }\n for (const c of cols) if (byId.has(c.id)) ordered.push(c); // colonne nuove (non in prefs) in coda\n for (const c of ordered) {\n c.visible = !p.hidden.includes(c.id);\n // il pin salvato sovrascrive il default della direttiva (solo se presente nelle prefs)\n if (p.pinned) c.pinned = p.pinned.includes(c.id);\n }\n this.columns.set(ordered);\n this.ensurePrefsLoaded();\n }\n\n /** true una volta caricate le preferenze dal server (evita retrieve multipli) */\n private prefsLoaded = false;\n\n /**\n * Chiave di persistenza delle preferenze. Identica all'originale: il `name`\n * del controllo (ngModel/formControlName). In fallback usa `[Name]`.\n */\n private prefsKey(): string | null {\n const key = String(this.ngControl?.name ?? '') || this.Name() || null;\n if (!key && this.SavePreferences())\n console.error(\"[es-table2] Non posso usare le preferenze senza un 'name' (ngModel) o un [Name] per la tabella\");\n return key;\n }\n\n /**\n * Carica le preferenze dal `PreferencesService` (stesso formato dell'es-table\n * originale: `{ columns, column_ordering, orders }`). Chiamata una volta sola,\n * quando esistono già le colonne correnti per poter validare la coerenza.\n */\n private ensurePrefsLoaded() {\n if (this.prefsLoaded || !this.SavePreferences()) return;\n if (this.columns().length === 0) return; // attendo che le colonne esistano\n // Se ci sono colonne Multi (data-dependent), attendo che siano state generate:\n // altrimenti il guard di coerenza rifiuterebbe le prefs che le citano.\n if (this.multiDefs.length > 0 && !this.multiColumnsBuilt) return;\n const key = this.prefsKey();\n if (!key) { this.prefsLoaded = true; return; }\n if (!this.prefService) {\n console.error('[es-table2] SavePreferences attivo ma @esfaenza/preferences non è disponibile');\n this.prefsLoaded = true;\n return;\n }\n this.prefsLoaded = true;\n this.prefService.getItem<{ columns: string[]; column_ordering: string[]; orders: AppOrdering[]; pinned?: string[] }>(key, true)\n .subscribe(prefs => this.applyLoadedPrefs(prefs));\n }\n\n private applyLoadedPrefs(prefs: { columns: string[]; column_ordering: string[]; orders: AppOrdering[]; pinned?: string[] } | null | undefined) {\n if (!prefs) return;\n const currentIds = new Set(this.columns().map(c => c.id));\n const order = (prefs.column_ordering?.length ? prefs.column_ordering : prefs.columns) || [];\n const visible = prefs.columns || [];\n\n // Coerenza: se le preferenze citano colonne non più presenti, l'es-table è\n // cambiata → ignoro (come l'originale) per non nascondere/riordinare a vuoto.\n for (const id of order) if (id && !currentIds.has(id)) return;\n for (const id of visible) if (id && !currentIds.has(id)) return;\n if (order.length === 0 && visible.length === 0) return;\n\n // `pinned` è un'estensione retro-compatibile: se assente (prefs vecchie/originali)\n // resta il pin di default delle direttive.\n const pinned = Array.isArray(prefs.pinned) ? prefs.pinned.filter(id => currentIds.has(id)) : undefined;\n\n // Nascondo SOLO le colonne che le preferenze conoscevano davvero (presenti\n // nell'ordinamento o nell'elenco visibili) ma non marcate come visibili.\n // Una colonna del tutto assente dalle prefs è NUOVA (aggiunta dopo il\n // salvataggio): resta visibile — `setColumns` la accoda in fondo. Diversamente\n // dall'originale (che nascondeva ogni colonna non salvata), così gli utenti non\n // \"perdono\" le colonne aggiunte a una tabella con preferenze già memorizzate.\n const knownToPrefs = new Set([...order, ...visible]);\n const hidden = [...currentIds].filter(id => knownToPrefs.has(id) && !visible.includes(id));\n this.columnPrefs = { order, hidden, pinned };\n this.setColumns(this.columns());\n\n if (prefs.orders?.length) {\n this.orders.set([...prefs.orders]);\n if (this.viewMode() && this.view()) this.view().orders = [...prefs.orders];\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Persiste le preferenze correnti nel formato originale\n * `{ columns (visibili), column_ordering (ordine), orders (ordinamenti) }`.\n */\n private saveColumnPrefs() {\n if (!this.SavePreferences() || !this.prefService) return;\n const key = this.prefsKey();\n if (!key) return;\n // Includo anche le sotto-colonne Multi (id stabili `prop_index`): il\n // caricamento è gated finché non esistono, quindi il guard non le rifiuta.\n const cols = this.columns();\n const payload = {\n columns: cols.filter(c => c.visible).map(c => c.id),\n column_ordering: cols.map(c => c.id),\n orders: this.orders(),\n // estensione es-table2 (retro-compatibile: l'originale ignora i campi extra)\n pinned: cols.filter(c => c.pinned).map(c => c.id)\n };\n // allineo anche i campi wire dell'AppSearch (parità col server-side)\n if (this.viewMode() && this.view()) {\n this.view().columns = payload.columns;\n this.view().column_ordering = payload.column_ordering;\n }\n this.prefService.setItem(key, payload).subscribe();\n }\n\n // --- Pin/unpin dall'header --------------------------------------------------\n /** Attiva/disattiva il pin di una colonna e persiste (dall'indicatore in testata) */\n togglePin(col: Est2Column, ev?: Event) {\n ev?.stopPropagation();\n col.pinned = !col.pinned;\n // aggiorno le prefs correnti (ordine/visibilità invariati)\n const cols = this.columns();\n this.columnPrefs = {\n order: cols.map(c => c.id),\n hidden: cols.filter(c => !c.visible).map(c => c.id),\n pinned: cols.filter(c => c.pinned).map(c => c.id)\n };\n this.columns.set([...this.columns()]); // forza il ricalcolo di visibleColumns/headerGroupRows\n this.saveColumnPrefs();\n this.cdr.markForCheck();\n }\n\n // --- Dialog visibilità/ordine/pin colonne ----------------------------------\n columnsDialogOpen = signal(false);\n /** Lista di lavoro della dialog (copia, per poter annullare) */\n dialogCols = signal<{ id: string; label: string; visible: boolean; pinned: boolean; grouped: boolean }[]>([]);\n\n /** Etichetta leggibile di una colonna (header statico o id) */\n columnLabel(col: Est2Column): string {\n return (col.headerText && String(col.headerText).trim()) || col.id;\n }\n\n /** true se la colonna appartiene a un gruppo (multi o `Parent`): non è pinnabile */\n isGrouped(col: Est2Column): boolean {\n return !!this.hgThById().get(col.id)?.thParent;\n }\n\n /**\n * Etichetta della dialog: testo header renderizzato (letto dal DOM, così\n * rispetta casing/contenuto) preceduto dal percorso dei gruppi, es.\n * `( Energia - Attiva ) Fascia F1`.\n */\n private dialogLabelFor(col: Est2Column, headerTexts: Map<string, string>, groupLabels: Map<string, string>): string {\n const leaf = headerTexts.get(col.id) || this.columnLabel(col);\n const thById = this.hgThById();\n const path: string[] = [];\n let p = thById.get(col.id)?.thParent ?? null;\n let guard = 0;\n while (p && guard++ < 32) {\n path.push(groupLabels.get(p) || (thById.get(p)?.thStaticContent?.trim()) || p);\n p = thById.get(p)?.thParent ?? null;\n }\n path.reverse(); // root-first\n return path.length ? `( ${path.join(' - ')} ) ${leaf}` : leaf;\n }\n\n openColumnsDialog() {\n // Leggo dal DOM i testi header renderizzati (leaf + gruppi) per etichette esatte.\n const headerTexts = this.renderedHeaderTexts();\n const groupLabels = new Map<string, string>();\n const host = this.hostEl?.nativeElement;\n if (host)\n host.querySelectorAll('thead th[data-groupid]').forEach((el: Element) =>\n groupLabels.set(el.getAttribute('data-groupid') ?? '', (el.textContent || '').trim()));\n // TUTTE le colonne (comprese le Multi), con etichetta gruppo-consapevole.\n this.dialogCols.set(this.columns().map(c => ({\n id: c.id,\n label: this.dialogLabelFor(c, headerTexts, groupLabels),\n visible: c.visible,\n pinned: !!c.pinned,\n grouped: this.isGrouped(c)\n })));\n this.columnsDialogOpen.set(true);\n this.cdr.markForCheck();\n }\n closeColumnsDialog() { this.columnsDialogOpen.set(false); this.cdr.markForCheck(); }\n\n dialogToggle(i: number) {\n const list = [...this.dialogCols()];\n list[i] = { ...list[i], visible: !list[i].visible };\n this.dialogCols.set(list);\n }\n dialogTogglePin(i: number) {\n const list = [...this.dialogCols()];\n if (list[i].grouped) return; // le colonne raggruppate non sono pinnabili\n list[i] = { ...list[i], pinned: !list[i].pinned };\n this.dialogCols.set(list);\n }\n dialogSetAll(visible: boolean) {\n this.dialogCols.set(this.dialogCols().map(c => ({ ...c, visible })));\n }\n /**\n * Spostamento gruppo-consapevole nella dialog: i gruppi restano SEMPRE contigui\n * anche durante l'editing (non solo all'Applica). Se la colonna adiacente è nello\n * stesso gruppo → swap semplice (riordino interno); se è oltre il confine del\n * gruppo → si sposta l'INTERO blocco del gruppo (al livello di divergenza).\n */\n dialogMove(i: number, dir: -1 | 1) {\n const list = [...this.dialogCols()];\n const j = i + dir;\n if (j < 0 || j >= list.length) return;\n\n // Nessun gruppo: swap semplice\n if (this.hgParentIds().size === 0) {\n [list[i], list[j]] = [list[j], list[i]];\n this.dialogCols.set(list);\n return;\n }\n\n const chainA = this.columnChain(list[i].id);\n const chainB = this.columnChain(list[j].id);\n // livello dove le due catene divergono\n let d = 0;\n while (chainA[d] !== undefined && chainB[d] !== undefined && chainA[d] === chainB[d]) d++;\n\n const ancAt = (id: string, lvl: number): string | undefined => this.columnChain(id)[lvl];\n const blockAround = (idx: number): [number, number] => {\n const anc = ancAt(list[idx].id, d);\n if (anc === undefined) return [idx, idx]; // nessun gruppo a questo livello → singola colonna\n let s = idx, e = idx;\n while (s - 1 >= 0 && ancAt(list[s - 1].id, d) === anc) s--;\n while (e + 1 < list.length && ancAt(list[e + 1].id, d) === anc) e++;\n return [s, e];\n };\n\n const [aStart, aEnd] = blockAround(i);\n const [bStart, bEnd] = blockAround(j);\n // i due blocchi sono adiacenti: li scambio conservando tutto il resto\n const newList = dir === 1\n ? [...list.slice(0, aStart), ...list.slice(bStart, bEnd + 1), ...list.slice(aStart, aEnd + 1), ...list.slice(bEnd + 1)]\n : [...list.slice(0, bStart), ...list.slice(aStart, aEnd + 1), ...list.slice(bStart, bEnd + 1), ...list.slice(aEnd + 1)];\n this.dialogCols.set(newList);\n }\n\n applyColumnsDialog() {\n // Riparo l'ordine mantenendo CONTIGUI i membri di ogni gruppo: spostare una\n // colonna fuori dal suo gruppo non deve produrre header-group spezzati.\n const orderIds = this.enforceGroupContiguity(this.dialogCols().map(c => c.id));\n const hiddenSet = new Set(this.dialogCols().filter(c => !c.visible).map(c => c.id));\n const pinnedSet = new Set(this.dialogCols().filter(c => c.pinned).map(c => c.id));\n this.columnPrefs = {\n order: orderIds,\n hidden: [...hiddenSet],\n pinned: [...pinnedSet]\n };\n // riapplico alla lista corrente conservando gli oggetti-colonna...\n this.setColumns(this.columns());\n // ...e SOLO DOPO persisto (saveColumnPrefs deriva il payload da columns())\n this.saveColumnPrefs();\n this.columnsDialogOpen.set(false);\n this.cdr.markForCheck();\n }\n\n /**\n * Riordina gli id in modo che i membri di ogni gruppo-colonna restino contigui,\n * rispettando il più possibile l'ordine scelto dall'utente: ordina per chiave\n * = [prima-apparizione di ogni antenato (root→foglia), poi indice proprio].\n * Così due colonne dello stesso gruppo non possono essere interlacciate con\n * colonne esterne.\n */\n /** Catena degli antenati-gruppo (root→padre immediato) di una colonna; `[]` se non raggruppata */\n /** Catena antenati di una colonna — delega al motore `core/header-groups.ts` */\n private ancestorChain(id: string, rootFirst = false): string[] {\n return ancestorChainFn(id, this.hgThById(), rootFirst);\n }\n\n private columnChain(id: string): string[] { return this.ancestorChain(id, true); }\n\n /** Riordino group-contiguo — delega al motore `core/header-groups.ts` */\n private enforceGroupContiguity(orderIds: string[]): string[] {\n return enforceGroupContiguityFn(orderIds, this.hgThById(), this.hgParentIds().size > 0);\n }\n\n resetColumnsDialog() {\n this.columnPrefs = null;\n this.buildColumns(); // ricostruisce dalle direttive nell'ordine originale\n if (this.viewMode() || this.arrayMode()) this.refresh();\n this.saveColumnPrefs(); // persisto lo stato di default (dopo la ricostruzione)\n this.columnsDialogOpen.set(false);\n this.cdr.markForCheck();\n }\n\n // --- Export (CSV self-contained / XLSX via SheetJS opzionale) --------------\n exportMenuOpen = signal(false);\n cornerMenuOpen = signal(false);\n toggleExportMenu() { this.cornerMenuOpen.set(false); this.exportMenuOpen.set(!this.exportMenuOpen()); this.cdr.markForCheck(); }\n toggleCornerMenu() { this.exportMenuOpen.set(false); this.cornerMenuOpen.set(!this.cornerMenuOpen()); this.cdr.markForCheck(); }\n\n /** Chiude i menu a tendina del chrome quando si clicca fuori */\n @HostListener('document:click')\n onDocClick() {\n if (this.exportMenuOpen() || this.cornerMenuOpen()) {\n this.exportMenuOpen.set(false);\n this.cornerMenuOpen.set(false);\n this.cdr.markForCheck();\n }\n }\n\n /** Export delegato al controller `ExportController` (E4); chiude prima il menu chrome. */\n export(format: 'CSV' | 'XLSX' = 'CSV') {\n this.exportMenuOpen.set(false);\n this.exportCtrl.run(format);\n }\n\n /**\n * Mappa id-colonna → testo header RENDERIZZATO letto dal DOM (rispetta il casing\n * del template `*th`, es. \"ID\"). Costruita in un'unica passata; usata dall'export\n * self-contained e dalla dialog colonne (prima due letture DOM separate).\n */\n private renderedHeaderTexts(): Map<string, string> {\n const m = new Map<string, string>();\n const host = this.hostEl?.nativeElement;\n if (host) host.querySelectorAll('thead th[data-colid]').forEach((el: Element) =>\n m.set(el.getAttribute('data-colid') ?? '', (el.textContent || '').trim()));\n return m;\n }\n\n // ===========================================================================\n // Corner menu / helpers template\n // ===========================================================================\n cornerAction(id: string) { this.onCornerAction.emit({ id, estable: this }); }\n\n rowClass(item: any): string {\n return this.RowClassAssigner ? (this.RowClassAssigner(item) || '') : '';\n }\n\n hasChrome(): boolean {\n return this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions().length > 0;\n }\n\n /** Colspan totale per righe a piena larghezza (stato vuoto) */\n totalColspan(): number {\n let n = this.usesColumns() ? this.visibleColumns().length : 1;\n n += this.DynamicOperations().length;\n if (this.Selection()) n++;\n if (this.Removal()) n++;\n if (this.hasChrome()) n++;\n return Math.max(1, n);\n }\n\n /**\n * Valore grezzo di una proprietà, gestendo gli oggetti \"generic\" con `properties`.\n * Se la colonna non dichiara una `Property` esplicita si usa l'`id` del `*th` come\n * chiave (convenzione: l'id della colonna è il nome della proprietà) — così le\n * colonne rese solo via template `*td` (es. `*th='id'` senza `Property`) hanno\n * comunque un valore per export/copia. È un percorso di SOLA LETTURA: l'editing/\n * paste continua a richiedere una `Property` esplicita (vedi `rawCellValue`).\n */\n cellValue(item: any, col: Est2Column): any {\n const key = col.property || col.id;\n return key ? this.readProp(item, key) : null;\n }\n\n /** Entry Multi corrispondente a una cella (`item[multiProp][multiIndex]`) */\n multiCell(item: any, col: Est2Column): any {\n if (col.multiProp == null || col.multiIndex == null) return {};\n const arr = item?.[col.multiProp];\n return (Array.isArray(arr) ? arr[col.multiIndex] : null) ?? {};\n }\n\n trackRow = (i: number, item: any) => item?._hash ?? item?.id ?? item;\n trackCol = (_: number, col: Est2Column) => col.id;\n}\n","@if (view()) {\n <div class=\"est2-wrap {{ ContainerClass() }}\"\n [style.height]=\"Height()\"\n [style.background-color]=\"EmptySpaceBackgroundColor() || null\">\n\n <!-- Auto-aggiornamento: toggle + intervallo (in alto a destra) -->\n @if (AutoUpdate()) {\n <div class=\"est2-autoupdate\">\n <label class=\"est2-autoupdate__label\">\n Aggiorna ogni\n <input type=\"text\" maxlength=\"3\" class=\"est2-autoupdate__secs\"\n [ngModel]=\"seconds()\" (ngModelChange)=\"seconds.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"autoUpdateChanged()\" />\n secondi\n </label>\n <label class=\"est2-switch\" title=\"Attiva/disattiva auto-aggiornamento\">\n <input type=\"checkbox\" [ngModel]=\"autoUpdate()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"autoUpdate.set($event); autoUpdateChanged()\" />\n <span class=\"est2-switch__slider\"></span>\n </label>\n </div>\n }\n\n <!-- Pager superiore -->\n @if (PagingStyle() === 'both' || PagingStyle() === 'top') {\n <ng-container *ngTemplateOutlet=\"pager\"></ng-container>\n }\n\n <!-- Barra \"seleziona tutto\" (visibile solo con selezione multipla attiva e righe presenti) -->\n @if (Selection() && !SingleSelection() && hasSelection) {\n <div class=\"est2-selectbar\" [style.height.px]=\"selbarHeight() ? selbarHeight() + 1 : null\">\n @if (allSelected) {\n <span>Tutti i <strong>{{ selectedCount }}</strong> elementi sono selezionati</span>\n } @else {\n <span><strong>{{ selectedCount }}</strong> {{ selectedCount === 1 ? 'elemento selezionato' : 'elementi selezionati' }}</span>\n @if (canSelectEverything) {\n <span class=\"est2-link\" (click)=\"selectEverything()\">Seleziona tutti i {{ totalCount() }} elementi</span>\n }\n }\n <span class=\"est2-selectbar__spacer\"></span>\n <span class=\"est2-link\" (click)=\"clearSelection()\">Azzera selezione</span>\n </div>\n }\n\n <div class=\"est2-scroll\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"est2-table {{ TableClass() }}\"\n [class.est2-table--range]=\"rangeActive()\"\n [class.est2-table--dragging]=\"rangeDragging()\"\n (mousedown)=\"onGridMouseDown($event)\"\n (mouseover)=\"onGridMouseOver($event)\">\n\n <!-- ================= HEADER ================= -->\n @if (!HeaderHidden()) {\n <thead #theadRef>\n <!-- Righe di header-group multi-livello (dall'alto verso il basso) -->\n @if (hasHeaderGroups()) {\n @for (grow of headerGroupRows(); track $index) {\n <tr class=\"est2-hgroup-row\">\n @if (Selection()) { <th class=\"est2-col-min est2-selcol\" [class.est2-pinned]=\"hasPinned()\" [style.left.px]=\"hasPinned() ? 0 : null\"></th> }\n @for (op of DynamicOperations(); track op.id) { <th class=\"est2-col-min\"></th> }\n @for (cell of grow; track cell.id; let gi = $index) {\n <th [attr.colspan]=\"cell.span\"\n [attr.data-groupid]=\"cell.isGroup ? cell.id : null\"\n [class.est2-hgroup]=\"cell.isGroup\"\n [class.est2-pinned]=\"gi < pinnedCount()\"\n [style.left.px]=\"gi < pinnedCount() ? pinnedLeftPx(gi) : null\"\n class=\"est2-hgroup-cell\">\n @if (cell.isGroup) {\n @if (cell.template) {\n <ng-container *ngTemplateOutlet=\"cell.template\"></ng-container>\n } @else {\n {{ cell.label }}\n }\n }\n </th>\n }\n @if (Removal()) { <th class=\"est2-col-min\"></th> }\n @if (hasChrome()) { <th class=\"est2-col-min\"></th> }\n </tr>\n }\n }\n <tr>\n <!-- Colonna di selezione -->\n @if (Selection()) {\n <th class=\"est2-col-min est2-selcol\"\n [class.est2-pinned]=\"hasPinned()\"\n [style.left.px]=\"hasPinned() ? 0 : null\">\n @if (!SingleSelection()) {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"globalCheck()\"\n [indeterminate]=\"selectionIndeterminate\"\n [disabled]=\"SelectionDisabled()\"\n (change)=\"toggleAll()\"\n aria-label=\"Seleziona tutto\" />\n }\n </th>\n }\n\n <!-- Header da colonne (direttive / dinamica / report) -->\n @if (usesColumns()) {\n <!-- intestazioni vuote per le operazioni dinamiche -->\n @for (op of DynamicOperations(); track op.id) {\n <th class=\"est2-col-min\"></th>\n }\n @for (col of visibleColumns(); track trackCol($index, col); let ci = $index) {\n <th [attr.data-colid]=\"col.id\"\n [class]=\"col.headerClass\"\n [class.est2-th--orderable]=\"OrderByColumn() && col.orderable\"\n [class.est2-col-min]=\"col.header?.thShrink\"\n [class.est2-col-groupstart]=\"columnGroupBoundaries().has(ci)\"\n [class.est2-pinned]=\"col.pinned\"\n [style.left.px]=\"col.pinned ? pinnedLeftPx(ci) : null\"\n [style.min-width.px]=\"col.pinned && col.pinnedWidth ? col.pinnedWidth : null\"\n [style.max-width.px]=\"col.pinned && col.pinnedWidth ? col.pinnedWidth : null\"\n [style.text-align]=\"col.alignment\"\n [style.background-color]=\"col.headerBg || null\"\n (click)=\"toggleSort(col)\">\n <span class=\"est2-th__inner\">\n @if (col.header?.Template) {\n <ng-container *ngTemplateOutlet=\"col.header!.Template!; context: col.multiProp != null ? { $implicit: col.headerText } : null\"></ng-container>\n } @else {\n {{ col.headerText }}\n }\n @if (OrderByColumn() && col.orderable && orderOf(col.id)) {\n <span class=\"est2-sort est2-sort--active\"\n [class.est2-sort--desc]=\"orderOf(col.id) === 'DESC'\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 15l6-6 6 6\"/></svg>\n </span>\n @if (orderIndex(col.id) > 0 && MultipleOrderingDirectives()) {\n <span class=\"est2-sort__badge\">{{ orderIndex(col.id) }}</span>\n }\n }\n <!-- Indicatore/toggle di pin (visibile se pinnata o all'hover) -->\n @if (ColumnsPinnable() && col.multiProp == null) {\n <button type=\"button\" class=\"est2-pinbtn\"\n [class.est2-pinbtn--on]=\"col.pinned\"\n [title]=\"col.pinned ? 'Sblocca colonna' : 'Blocca colonna a sinistra'\"\n (click)=\"togglePin(col, $event)\">\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>\n </button>\n }\n </span>\n </th>\n }\n }\n <!-- Header da template semplice -->\n @else if (headerRef) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n\n <!-- Colonna rimozione -->\n @if (Removal()) { <th class=\"est2-col-min\"></th> }\n <!-- Colonna chrome (export / gestione colonne / menu) -->\n @if (hasChrome()) {\n <th class=\"est2-col-min est2-chrome-th\">\n <div class=\"est2-chrome\">\n @if (Export()) {\n <div class=\"est2-chrome-wrap\">\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Esporta\" (click)=\"$event.stopPropagation(); toggleExportMenu()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"M7 10l5 5 5-5\"/><path d=\"M12 15V3\"/></svg>\n </button>\n @if (exportMenuOpen()) {\n <div class=\"est2-menu\" (click)=\"$event.stopPropagation()\">\n @if (CSVExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('CSV')\">Esporta CSV</button> }\n @if (XLSXExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('XLSX')\">Esporta Excel (XLSX)</button> }\n @if (!CSVExport() && !XLSXExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('CSV')\">Esporta CSV</button> }\n </div>\n }\n </div>\n }\n @if (HiddenColumns() || ColumnsOrdering()) {\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Colonne\" (click)=\"$event.stopPropagation(); openColumnsDialog()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\"/><path d=\"M9 3v18\"/><path d=\"M15 3v18\"/></svg>\n </button>\n }\n @if (CornerMenuOptions().length > 0) {\n <div class=\"est2-chrome-wrap\">\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Opzioni\" (click)=\"$event.stopPropagation(); toggleCornerMenu()\">⋮</button>\n @if (cornerMenuOpen()) {\n <div class=\"est2-menu\" (click)=\"$event.stopPropagation()\">\n @for (opt of CornerMenuOptions(); track opt.id) {\n <button type=\"button\" class=\"est2-menu-item\" (click)=\"cornerAction(opt.id); cornerMenuOpen.set(false)\">{{ opt.description }}</button>\n }\n </div>\n }\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n\n <!-- ================= BODY ================= -->\n @if (!BodyHidden()) {\n <tbody>\n @for (item of boundSource(); track trackRow($index, item); let ri = $index) {\n @if ((!grouped() && !Hierarchy()) || item._visible) {\n <tr [class]=\"rowClass(item)\"\n [class.est2-row--selected]=\"item._selected\"\n [class.est2-row--removed]=\"item.removed || item.deleted\"\n [class.est2-row--group]=\"item._group\"\n [class.est2-row--clickable]=\"Selection() || item._group\"\n [contextMenu]=\"ContextMenu || emptyMenu\"\n [contextMenuSubject]=\"item\"\n (click)=\"handleRowClick(item, $event)\">\n\n <!-- Cella di selezione -->\n @if (Selection()) {\n <td class=\"est2-col-min est2-selcol\"\n [class.est2-pinned]=\"hasPinned()\"\n [style.left.px]=\"hasPinned() ? 0 : null\">\n @if (item._group) {\n @if (!SingleSelection()) {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"groupSelectionState(item) === 'all'\"\n [indeterminate]=\"groupSelectionState(item) === 'some'\"\n [disabled]=\"SelectionDisabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection(item)\"\n aria-label=\"Seleziona gruppo\" />\n }\n } @else {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"item._selected\"\n [indeterminate]=\"hierarchyIndeterminate(item)\"\n [disabled]=\"SelectionDisabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(item)\"\n aria-label=\"Seleziona riga\" />\n }\n </td>\n }\n\n <!-- Celle da colonne (direttive / dinamica / report) -->\n @if (usesColumns()) {\n <!-- Operazioni dinamiche (icone a sinistra) -->\n @for (op of DynamicOperations(); track op.id) {\n <td class=\"est2-col-min est2-op-cell\">\n @if (!item._group && operationVisible(op, item)) {\n <span class=\"est2-op\" [class]=\"op.iconClass || ''\" [title]=\"op.title\"\n (click)=\"$event.stopPropagation(); dynamicOperation(item, op.id)\">{{ op.text }}</span>\n }\n </td>\n }\n @for (col of visibleColumns(); track trackCol($index, col); let first = $first, ci = $index) {\n <td [class]=\"col.cssClass\"\n [style.text-align]=\"col.alignment\"\n [style.color]=\"cellColor(item, col, 'fore')\"\n [style.background-color]=\"cellColor(item, col, 'back')\"\n [class.est2-nowrap]=\"!col.wrap\"\n [class.est2-col-groupstart]=\"columnGroupBoundaries().has(ci)\"\n [class.est2-pinned]=\"col.pinned\"\n [style.left.px]=\"col.pinned ? pinnedLeftPx(ci) : null\"\n [style.min-width.px]=\"col.pinned && col.pinnedWidth ? col.pinnedWidth : null\"\n [style.max-width.px]=\"col.pinned && col.pinnedWidth ? col.pinnedWidth : null\"\n [class.est2-td--group-key]=\"item._group && item.column === col.id\"\n [attr.data-r]=\"rangeActive() && !item._group ? ri : null\"\n [attr.data-c]=\"rangeActive() && !item._group ? ci : null\"\n [class.est2-cell-sel]=\"rangeActive() && inRange(ri, ci)\"\n [class.est2-cell-sel-t]=\"rangeActive() && inRange(ri, ci) && ri === rangeRect()!.top\"\n [class.est2-cell-sel-b]=\"rangeActive() && inRange(ri, ci) && ri === rangeRect()!.bottom\"\n [class.est2-cell-sel-l]=\"rangeActive() && inRange(ri, ci) && ci === rangeRect()!.left\"\n [class.est2-cell-sel-r]=\"rangeActive() && inRange(ri, ci) && ci === rangeRect()!.right\"\n [class.est2-cell-editing]=\"isEditing(ri, ci)\"\n (dblclick)=\"onCellDblClick(item, col, ri, ci)\">\n @if (isEditing(ri, ci)) {\n @if (editorFor(col); as edTpl) {\n <ng-container *ngTemplateOutlet=\"edTpl; context: editorContext(item, col)\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultEditor; context: { $implicit: item, col: col }\"></ng-container>\n }\n } @else if (item._group) {\n @if (item.column === col.id) {\n <span class=\"est2-group-key\" [style.padding-left.px]=\"groupIndent(item)\">\n <span class=\"est2-group-chevron\" [class.est2-group-chevron--open]=\"item._expanded\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>\n </span>\n {{ groupCellDisplay(item, col) }}\n </span>\n } @else {\n {{ groupCellDisplay(item, col) }}\n }\n } @else {\n <!-- Navigatore albero nella prima colonna -->\n @if (Hierarchy() && first) {\n <span class=\"est2-hier-lead\" [style.padding-left.px]=\"hierarchyIndent(item)\">\n @if (item.parent) {\n <span class=\"est2-group-chevron est2-hier-toggle\" [class.est2-group-chevron--open]=\"item._expanded\"\n (click)=\"$event.stopPropagation(); toggleHierarchyNode(item)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>\n </span>\n } @else {\n <span class=\"est2-hier-toggle\"></span>\n }\n </span>\n }\n @if (itemCellHidden(col)) {\n <!-- colonna di gruppo nascosta sulla riga-oggetto -->\n } @else if (col.multiProp != null) {\n @if (col.cell?.Template) {\n <ng-container *ngTemplateOutlet=\"col.cell!.Template; context: { $implicit: multiCell(item, col) }\"></ng-container>\n } @else {\n {{ multiCell(item, col)?.value }}\n }\n } @else if (col.cell?.Template) {\n <ng-container *ngTemplateOutlet=\"col.cell!.Template; context: { $implicit: item }\"></ng-container>\n } @else if (col.routePath) {\n <a class=\"est2-link\" [routerLink]=\"routerLinkFor(item, col)\">{{ cellValue(item, col) }}</a>\n } @else if (col.propAccessor != null) {\n {{ reportCellDisplay(item, col) }}\n } @else if (col.type === 'enum') {\n {{ (cellValue(item, col) | est2_lookup : col.source).description }}\n } @else {\n {{ cellValue(item, col) | est2_format : col.type : col.format : locale }}\n }\n }\n </td>\n }\n }\n <!-- Celle da template semplice -->\n @else if (bodyRef) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context: { $implicit: item }\"></ng-container>\n }\n\n <!-- Rimozione (non sulle righe-gruppo) -->\n @if (Removal()) {\n <td class=\"est2-col-min\">\n @if (!item._group && canRemove(item)) {\n @if (item.removed || item.deleted) {\n <button type=\"button\" class=\"est2-rowaction\" title=\"Ripristina\" (click)=\"abortRemoval(item)\">↺</button>\n } @else {\n <button type=\"button\" class=\"est2-rowaction est2-rowaction--danger\" title=\"Rimuovi\" (click)=\"removeItem(item)\">✕</button>\n }\n }\n </td>\n }\n <!-- Chrome -->\n @if (hasChrome()) { <td class=\"est2-col-min\"></td> }\n </tr>\n }\n } @empty {\n <tr>\n <td class=\"est2-empty\" [attr.colspan]=\"totalColspan()\">Nessun elemento da visualizzare</td>\n </tr>\n }\n </tbody>\n }\n </table>\n\n <!-- Overlay di caricamento -->\n @if (researchInProgress() || (firstBind() && ShowLoadingOnBootstrap())) {\n <div class=\"est2-loading\">\n <span class=\"est2-spinner\"></span>\n <span>Caricamento…</span>\n </div>\n }\n </div>\n\n <!-- Pager inferiore -->\n @if (PagingStyle() === 'both' || PagingStyle() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"pager\"></ng-container>\n }\n\n <!-- Avviso transitorio (es. incolla con dimensioni incompatibili) -->\n @if (notice()) {\n <div class=\"est2-toast\" role=\"alert\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/></svg>\n <span>{{ notice() }}</span>\n </div>\n }\n\n <!-- Dialog visibilità / ordine colonne -->\n @if (columnsDialogOpen()) {\n <div class=\"est2-dialog-backdrop\" (click)=\"closeColumnsDialog()\">\n <div class=\"est2-dialog\" (click)=\"$event.stopPropagation()\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"est2-dialog__head\">\n <span>\n @if (HiddenColumns() && ColumnsOrdering()) { Visibilità e ordine colonne }\n @else if (HiddenColumns()) { Visibilità colonne }\n @else { Ordine colonne }\n </span>\n <button type=\"button\" class=\"est2-dialog__close\" (click)=\"closeColumnsDialog()\" aria-label=\"Chiudi\">✕</button>\n </div>\n\n @if (HiddenColumns()) {\n <div class=\"est2-dialog__tools\">\n <button type=\"button\" class=\"est2-link\" (click)=\"dialogSetAll(true)\">Mostra tutte</button>\n <span class=\"est2-dialog__sep\">·</span>\n <button type=\"button\" class=\"est2-link\" (click)=\"dialogSetAll(false)\">Nascondi tutte</button>\n </div>\n }\n\n <ul class=\"est2-collist\">\n @for (c of dialogCols(); track c.id; let i = $index) {\n <li class=\"est2-collist__row\">\n @if (HiddenColumns()) {\n <label class=\"est2-collist__vis\">\n <input type=\"checkbox\" class=\"est2-check\" [checked]=\"c.visible\" (change)=\"dialogToggle(i)\" />\n </label>\n }\n <span class=\"est2-collist__label\">{{ c.label }}</span>\n @if (ColumnsPinnable()) {\n <button type=\"button\" class=\"est2-iconbtn est2-collist__pin\" [class.est2-collist__pin--on]=\"c.pinned\"\n [disabled]=\"c.grouped\"\n [title]=\"c.grouped ? 'Le colonne di un gruppo non sono bloccabili' : (c.pinned ? 'Sblocca' : 'Blocca a sinistra')\"\n (click)=\"dialogTogglePin(i)\">\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>\n </button>\n }\n @if (ColumnsOrdering()) {\n <span class=\"est2-collist__ord\">\n <button type=\"button\" class=\"est2-iconbtn\" [disabled]=\"i === 0\" title=\"Su\" (click)=\"dialogMove(i, -1)\">↑</button>\n <button type=\"button\" class=\"est2-iconbtn\" [disabled]=\"i === dialogCols().length - 1\" title=\"Giù\" (click)=\"dialogMove(i, 1)\">↓</button>\n </span>\n }\n </li>\n }\n </ul>\n\n <div class=\"est2-dialog__foot\">\n <button type=\"button\" class=\"est2-btn est2-btn--ghost\" (click)=\"resetColumnsDialog()\">Ripristina</button>\n <span class=\"est2-dialog__spacer\"></span>\n <button type=\"button\" class=\"est2-btn est2-btn--ghost\" (click)=\"closeColumnsDialog()\">Annulla</button>\n <button type=\"button\" class=\"est2-btn est2-btn--primary\" (click)=\"applyColumnsDialog()\">Applica</button>\n </div>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Template pager riutilizzabile sopra/sotto -->\n<ng-template #pager>\n @if (!HidePaging() && !grouped()) {\n <es-table2-pager\n [page]=\"currentPage()\"\n [pages]=\"totalPages()\"\n [total]=\"totalCount()\"\n [itemsPerPage]=\"viewMode() ? (view()?.itemsperpageoverride ?? 15) : ArraymodeItemsPerPage()\"\n [countLabel]=\"CountLabel()\"\n [showCount]=\"!HidePagingCount()\"\n [showButtons]=\"!HidePagingButtons()\"\n [showPagingOptions]=\"!HidePagingButtons()\"\n [allowAll]=\"AllSearch()\"\n (pageChange)=\"goToPage($event)\"\n (itemsPerPageChange)=\"changeItemsPerPage($event)\">\n </es-table2-pager>\n }\n</ng-template>\n\n<!-- Editor di cella di default (usato quando il consumer non fornisce un `*editor`) -->\n<ng-template #defaultEditor let-item let-col=\"col\">\n @switch (col.type) {\n @case ('enum') {\n <select class=\"est2-editor-input\"\n [value]=\"editDraft\"\n (change)=\"editDraft = $any($event.target).value\"\n (keydown.enter)=\"commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\"\n (blur)=\"commitEdit(item, col)\">\n @for (o of col.source || []; track o.id) {\n <option [value]=\"o.id\" [selected]=\"o.id == editDraft\">{{ o.description }}</option>\n }\n </select>\n }\n @case ('boolean') {\n <input type=\"checkbox\" class=\"est2-editor-input est2-check\"\n [checked]=\"editDraft === true || editDraft === 'true'\"\n (change)=\"editDraft = $any($event.target).checked; commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\" />\n }\n @default {\n <input class=\"est2-editor-input\"\n [type]=\"editorInputType(col.type)\"\n [value]=\"editDraft\"\n (input)=\"editDraft = $any($event.target).value\"\n (keydown.enter)=\"commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\"\n (blur)=\"commitEdit(item, col)\" />\n }\n }\n</ng-template>\n\n<!-- Menu di default (nessuna operazione) usato quando il consumer non passa [ContextMenu] -->\n<context-menu #emptyMenu>\n <ng-template contextMenuItem [passive]=\"true\"><em>Nessuna operazione disponibile…</em></ng-template>\n</context-menu>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { FormsAndValidationsModule } from '@esfaenza/forms-and-validations';\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\n\r\nimport { EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL } from './tokens';\r\nimport { EsTableModuleConfig } from './domain/configuration/EsTableModuleConfig';\r\n\r\nimport { EsTablePagerComponent } from './components/pager/table_pager.component';\r\nimport { EsTableComponent } from './components/es-table/es_table.component';\r\nimport { EsTh } from './components/es-th/es_th.component';\r\nimport { EsTd } from './components/es-td/es_td.component';\r\nimport { EsTdDirective } from './directives/es_td.directive';\r\nimport { EsThDirective } from './directives/es_th.directive';\r\nimport { EsTdEditorDirective } from './directives/es_td_editor.directive';\r\nimport { ThTdProvider } from './directives/es_th_td_provider.directive';\r\n\r\nimport { EstFormatPipe } from './components/pipes/est-format.pipe';\r\nimport { EstLookupPipe } from './components/pipes/est-lookup.pipe';\r\nimport { EstRouterLinkPipe } from './components/pipes/est-routerlink.pipe';\r\nimport { EstPropInsensitivePipe } from './components/pipes/est-propinsensitive.pipe';\r\nimport { EstRendererPipe } from './components/pipes/est-renderer.pipe';\r\nimport { EstEditorPipe } from './components/pipes/est_editor.pipe';\r\n\r\n// --- es-table2 (riscrittura 2026, stesso modulo/package) ---------------------\r\nimport { EsTable2Component } from './v2/es-table2.component';\r\nimport { EsTable2PagerComponent } from './v2/es-table2-pager.component';\r\nimport { Est2FormatPipe } from './v2/pipes/format.pipe';\r\nimport { Est2LookupPipe } from './v2/pipes/lookup.pipe';\r\nimport { EST2_DEBUG, EST2_DEFAULTS, EST2_EXPORT_GLOBAL_ACL } from './v2/tokens2';\r\n\r\nimport { ModalModule } from \"ngx-bootstrap/modal\";\r\nimport { BsDropdownModule } from \"ngx-bootstrap/dropdown\";\r\nimport { ContextMenuModule } from \"@esfaenza/ngx-contextmenu\";\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { AccessControlModule } from '@esfaenza/access-control';\r\nimport { ExtensionsModule } from '@esfaenza/extensions';\r\n\r\nconst MODULES = [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n LocalizationModule,\r\n ExtensionsModule,\r\n ModalModule,\r\n BsDropdownModule,\r\n ContextMenuModule,\r\n DragDropModule,\r\n FormsAndValidationsModule,\r\n TooltipModule,\r\n AccessControlModule\r\n]\r\n\r\nconst PUBLIC_ELEMENTS = [\r\n // Direttive (condivise da <es-table> e <es-table2>)\r\n EsTdDirective,\r\n EsThDirective,\r\n EsTdEditorDirective,\r\n\r\n // Componenti\r\n EsTableComponent,\r\n EsTablePagerComponent,\r\n ThTdProvider,\r\n\r\n // es-table2\r\n EsTable2Component\r\n]\r\n\r\nconst PRIVATE_ELEMENTS = [\r\n // Componenti\r\n EsTh,\r\n EsTd,\r\n\r\n // Pipes\r\n EstFormatPipe,\r\n EstLookupPipe,\r\n EstRouterLinkPipe,\r\n EstRendererPipe,\r\n EstEditorPipe,\r\n EstPropInsensitivePipe,\r\n\r\n // es-table2\r\n EsTable2PagerComponent,\r\n Est2FormatPipe,\r\n Est2LookupPipe\r\n]\r\n\r\n@NgModule({\r\n imports: [MODULES, SelectModule],\r\n declarations: [...PUBLIC_ELEMENTS, ...PRIVATE_ELEMENTS],\r\n exports: [...PUBLIC_ELEMENTS]\r\n})\r\nexport class EsTableModule {\r\n static forRoot(config?: EsTableModuleConfig): ModuleWithProviders<EsTableModule> {\r\n return {\r\n ngModule: EsTableModule,\r\n providers: [\r\n { provide: EST_DEBUG, useValue: config?.debugMode || false },\r\n { provide: EST_DEFAULTS, useValue: config?.defaults || null },\r\n { provide: EST_EXPORT_GLOBAL_ACL, useValue: config?.globalExportAclExpression || 'true' },\r\n // es-table2 condivide la stessa configurazione\r\n { provide: EST2_DEBUG, useValue: config?.debugMode || false },\r\n { provide: EST2_DEFAULTS, useValue: config?.defaults || null },\r\n { provide: EST2_EXPORT_GLOBAL_ACL, useValue: config?.globalExportAclExpression || 'true' },\r\n ]\r\n };\r\n }\r\n}","\r\n/** Indica un'opzione cliccabile nel Corner Menù della tabella (il menù richiamabile dai 3 pallini verticli in alto a destra) */\r\nexport class CornerMenuOption {\r\n\r\n /** Id dell'operazione. I callback relativi verranno effettuati con questo */\r\n public id: string;\r\n /** Descrizione dell'operazione da presentare all'utente */\r\n public description: string;\r\n}","\r\n/** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */\r\nexport class EsTableOperationDefinition {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice dell'operazione\r\n * @param {string} title Titolo dell'operazione, da presentare all'utente su hover della cella\r\n * @param {string} iconClass Classe che fornisca un iconcina Es. \"fa fa-remove\"\r\n * @param {string} text Eventuale testo presentato nella cella, genericamente va in alternativa a **iconClass**\r\n * @param {string} conditionField Indica il campo dell'oggetto sottostante su cui verificare la visibilità o meno di questa icona\r\n * @param {string} conditionValue Indica il valore che la proprietà **conditionField** dell'oggetto sottostante deve assumere affinché questa opzione si veda\r\n */\r\n constructor(\r\n public id: string, \r\n public title: string, \r\n public iconClass?: string, \r\n public text?: string, \r\n public conditionField?: string, \r\n public conditionValue?: string) {\r\n }\r\n}","/** Classe che definisce un oggetto generico come lista di proprietà-valore */\r\nexport class GenericItem {\r\n\r\n /** @ignore */\r\n constructor() {\r\n this._selected = false;\r\n this._rowClass = null;\r\n this._hash = null;\r\n this.properties = {};\r\n }\r\n\r\n /** Dizionario delle proprietà dell'oggeto con il loro valore */\r\n public properties: Record<string, string>;\r\n /** Indica se l'oggetto in questione è selezionato o meno */\r\n public _selected: boolean;\r\n /** Viene valorizzato da un eventuale **RowClassAssigner** (o automaticamente se in modalità gerarchica) e serve applicare stili particolari alla intera riga */\r\n public _rowClass: string;\r\n /** Hash dell'oggetto per generare i contesti di bind all'interno dell'es-table (vedere eventualmente l'implementazione specifica) */\r\n public _hash: string;\r\n}","/** Classe che definisce un multi-elemento, cioè una proprietà particolare di un oggetto da visualizzare in es-table che genera dinamicamente gruppi di Header e valori sottostanti */\r\n\r\nexport class EsTableMultiValue {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} value Valore di questo elemento\r\n * @param {string} header Nome di questo header\r\n * @param {string} header_group Gruppo dell'header, in caso di multipli gruppi innestati usare la sintassi \"G1 > G2 > G3\" ecc...\r\n * @param {boolean} exports Indica se questo header con questo valore dev'essere esportato\r\n * @param {string} export_format Qualora **export** fosse **true** indica il formato per l'esportazione\r\n */\r\n constructor(public value: any, public header: string, public header_group: string, exports: boolean = false, export_format: string = \"\") {\r\n this.exports = exports;\r\n this.export_format = export_format;\r\n this._headersHierarchy = header_group ? header_group.split(\">\").map(t => t.trim()) : [];\r\n }\r\n\r\n /** Indica se questo header con questo valore dev'essere esportato */\r\n public exports?: boolean = false;\r\n\r\n /** Qualora **export** fosse **true** indica il formato per l'esportazione */\r\n public export_format?: string = \"\"\r\n\r\n /** Generato automaticamente da **header_group** se passato da costruttore, altrimenti generato da es-table. Contiene la lista di gerarchie degli header groups (cioè **header_group** splittato su \">\" e trimmato) */\r\n public _headersHierarchy?: string[];\r\n}\r\n","/** Classe che rappresenta una colonna di un report */\r\nexport class ReportColumn {\r\n\r\n /** Id della colonna */\r\n public id: string;\r\n /** Descrizione della colonna (Header) */\r\n public description: string;\r\n /** Colore in notazione HTML */\r\n public color: string;\r\n /** Tipo di campo contenuto in questa colonna */\r\n public type: number;\r\n /** Sequenza per eventuali ordinamenti */\r\n public seq: number;\r\n /** Ordinamento dei dati presentati */\r\n public order?: string;\r\n /** Allineamento da tenere per questa colonna: **Center**, **Left** o **Right** */\r\n public alignment?: string;\r\n /** Formato dei dati da presentare in questa colonna */\r\n public format?: string;\r\n}","\r\n/** Classe che identifica un parametro generico per un report */\r\nexport class ReportParam {\r\n\r\n /** Codice del parametro */\r\n public id: string;\r\n /** Descrizione del parametro */\r\n public description: string;\r\n /** Sequenza del parametro per ordinarlo logicamente rispetto agli altri */\r\n public seq: number;\r\n /** Typecode C# della tipologia di parametro */\r\n public typecode: number;\r\n /** Indica se i parametro è richiesto o meno */\r\n public required: boolean;\r\n /** Valore del parametro, offerto sia come valore di default o in alternativa riempito lato UI */\r\n public value?: any;\r\n /** Indica se questo parametro si basa su un enum. Se questa proprietà è true mi aspetto che almeno **enumtype** sia valorizzato */\r\n public isenum: boolean;\r\n /** Indica se questo parametro si basa su un dizionario. Se questa proprietà è true mi aspetto che almeno **dictype** sia valorizzato */\r\n public isdictionary: boolean;\r\n /** Indica se il parametro è di tipo data */\r\n public isdate: boolean;\r\n /** Indica se il parametro è di tipo boolean */\r\n public isboolean: boolean;\r\n /** Valori disponibili per questo parametro, da valorizzare in caso **enumtype** o **dictype** fossero valorizzati */\r\n public availablevalues?: { id: string; description: string; }[];\r\n /** Tipo enumerabile del parametro (qualora fosse un dizionario di valori) */\r\n public enumtype?: string;\r\n /** Colonna relativa e questo parametro */\r\n public column?: string;\r\n /** Tipo del dizionario */\r\n public dictype?: string;\r\n /** Indica un filtro da applicare nei confronti del Backend qualora si vogliano caricare solo le possibilità logicamente accettabili per questo parametro */\r\n public dictionaryfilter?: string;\r\n /** Tipologia lato \"typescript\" di questo parametro, dev'essere sempre logicamente congruente al **typecode** */\r\n public type?: \"string\" | \"number\" | \"date\" | \"boolean\";\r\n /** Eventuale pattern di validazione per questo parametro */\r\n public pattern?: string;\r\n}","/** Classe che rappresenta i valori delle proprietà di un oggetto Report */\r\nexport class ReportRow {\r\n \r\n /** Valori dell'oggetto in ordine sequenziale */\r\n public values: string[];\r\n /** Colore di foreground per ogni cella */\r\n public forecolors?: string[];\r\n /** Colore di background per ogni cella */\r\n public backcolors?: string[];\r\n}","import { InputType } from \"../types\";\r\n\r\n/** Classe che rappresenta il riferimento ad una proprietà di un oggetto bindato sulla tabella */\r\nexport class ItemPropEditableReference {\r\n /** Stato di selezione della cella relativa */\r\n selected?: boolean;\r\n /** Oggetto relativo su cui si modificano le proprietà */\r\n item: any;\r\n /** ID dell'header in modifica (riferimento al TH relativo) */\r\n header?: string;\r\n /** Proprietà Javascript effettivamente in modifica */\r\n property?: string | null;\r\n /** Tipo dell'input */\r\n type?: InputType | string | null;\r\n /** Valore attuale della proprietà **property** dell'oggetto **item** */\r\n value?: string;\r\n /** Indica se la cella deve avere il bordino a sinistra */\r\n lborder?: boolean;\r\n /** Indica se la cella deve avere il bordino in alto */\r\n tborder?: boolean;\r\n /** Indica se la cella deve avere il bordino a destra */\r\n rborder?: boolean;\r\n /** Indica se la cella deve avere il bordino in basso */\r\n bborder?: boolean;\r\n /** Indica se il bordo a sinistra overlappa su un bordo di selezione destro della cella precedente */\r\n loverlaps? : boolean;\r\n /** Indica se il bordo a destra overlappa su un bordo di selezione sinistro della cella successiva */\r\n roverlaps?: boolean;\r\n /** Indica se il bordo in alto overlappa su un bordo di selezione basso della cella precedente */\r\n toverlaps?: boolean;\r\n /** Indica se il bordo in basso overlappa su un bordo di selezione in alto della cella successiva */\r\n boverlaps?: boolean;\r\n /** Funzione che imposta il nuovo valore della proprietà **property** dell'oggetto **item** ed aggiorna il **value** di questo oggetto */\r\n val_setter?: (value: string) => any;\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i5","i1.Logger","i2","i4.UtilitiesHandler","i6.CopyPasteDetector","i7.Logger","buildMultiColumnsFn","coerceValueFn","ancestorChainFn","enforceGroupContiguityFn","i4","i6.EsTable2PagerComponent","i7.Est2FormatPipe","i8.Est2LookupPipe"],"mappings":"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"}
1
+ {"version":3,"file":"esfaenza-es-table.mjs","sources":["../../../projects/es-table/src/lib/components/pager/table_pager.component.loc.ts","../../../projects/es-table/src/lib/components/pager/table_pager.component.ts","../../../projects/es-table/src/lib/components/pager/table_pager.component.html","../../../projects/es-table/src/lib/domain/externals/appsearch/AppSearch.ts","../../../projects/es-table/src/lib/domain/internals/PagerInfos.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/ItemsSelection.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupFilter.ts","../../../projects/es-table/src/lib/domain/externals/EsTableModelChange.ts","../../../projects/es-table/src/lib/directives/es_td.directive.ts","../../../projects/es-table/src/lib/directives/es_th.directive.ts","../../../projects/es-table/src/lib/directives/es_td_editor.directive.ts","../../../projects/es-table/src/lib/directives/es_th_td_provider.directive.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.loc.ts","../../../projects/es-table/src/lib/tokens.ts","../../../projects/es-table/src/lib/core/handlers/ExportHandler.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/AppOrdering.ts","../../../projects/es-table/src/lib/domain/internals/EsTableColumn.ts","../../../projects/es-table/src/lib/core/handlers/ColumnMetadataHandler.ts","../../../projects/es-table/src/lib/domain/externals/EsTableColumnsDefinition.ts","../../../projects/es-table/src/lib/core/handlers/DynamicModeHandler.ts","../../../projects/es-table/src/lib/core/handlers/HierarchyModeHandler.ts","../../../projects/es-table/src/lib/core/handlers/ItemsHandler.ts","../../../projects/es-table/src/lib/core/handlers/ReportModeHandler.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/Group.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupAggregation.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GroupOrAggregation.ts","../../../projects/es-table/src/lib/domain/internals/GroupPager.ts","../../../projects/es-table/src/lib/domain/internals/GroupRouteFragment.ts","../../../projects/es-table/src/lib/core/handlers/RowGroupingHandler.ts","../../../projects/es-table/src/lib/domain/internals/CacheTriptic.ts","../../../projects/es-table/src/lib/core/handlers/SelectionHandler.ts","../../../projects/es-table/src/lib/core/handlers/UtilitiesHandler.ts","../../../projects/es-table/src/lib/core/CopyPasteDetector.ts","../../../projects/es-table/src/lib/core/Logger.ts","../../../projects/es-table/src/lib/components/es-th/es_th.component.ts","../../../projects/es-table/src/lib/components/es-th/es_th.component.html","../../../projects/es-table/src/lib/components/es-td/es_td.component.ts","../../../projects/es-table/src/lib/components/es-td/es_td.component.html","../../../projects/es-table/src/lib/components/pipes/est-format.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-lookup.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-routerlink.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-renderer.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est_editor.pipe.ts","../../../projects/es-table/src/lib/components/pipes/est-propinsensitive.pipe.ts","../../../projects/es-table/src/lib/domain/configuration/EsTableDefaultable.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.ts","../../../projects/es-table/src/lib/components/es-table/es_table.component.html","../../../projects/es-table/src/lib/domain/configuration/EsTableModuleConfig.ts","../../../projects/es-table/src/lib/v2/pipes/format.pipe.ts","../../../projects/es-table/src/lib/v2/pipes/lookup.pipe.ts","../../../projects/es-table/src/lib/v2/tokens2.ts","../../../projects/es-table/src/lib/v2/core/row-grouping.ts","../../../projects/es-table/src/lib/v2/core/hierarchy.ts","../../../projects/es-table/src/lib/v2/core/coercion.ts","../../../projects/es-table/src/lib/v2/core/header-groups.ts","../../../projects/es-table/src/lib/v2/core/column-model.ts","../../../projects/es-table/src/lib/v2/core/columns.ts","../../../projects/es-table/src/lib/v2/controllers/export.controller.ts","../../../projects/es-table/src/lib/v2/es-table2-pager.component.ts","../../../projects/es-table/src/lib/v2/es-table2.component.ts","../../../projects/es-table/src/lib/v2/es-table2.component.html","../../../projects/es-table/src/lib/es-table.module.ts","../../../projects/es-table/src/lib/domain/externals/CornerMenuOption.ts","../../../projects/es-table/src/lib/domain/externals/EsTableOperationDefinition.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/GenericItem.ts","../../../projects/es-table/src/lib/domain/externals/appsearch/EsTableMultiValue.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportColumn.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportParam.ts","../../../projects/es-table/src/lib/domain/externals/report/ReportRow.ts","../../../projects/es-table/src/lib/domain/externals/ItemPropEditableReference.ts","../../../projects/es-table/src/esfaenza-es-table.ts"],"sourcesContent":["import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/** Classe di localizzazione per il componente **EsTablePagerComponent** */\r\n@Injectable()\r\nexport class TablePagerLoc extends LocalizationService {\r\n\r\n /** @ignore */\r\n constructor(injector: Injector) {\r\n super(injector);\r\n super.set(\"en->it\", \"All\", [\"Tutto\"]);\r\n super.set(\"en->it\", \"Shown Elements\", [\"Elementi visualizzati\"]);\r\n super.set(\"en->it\", \"Shown Groups\", [\"Gruppi visualizzati\"]);\r\n super.set(\"en->it\", \"Are you sure you want to retrieve all results?\", [\"Si è sicuri di voler caricare tutti i risultati?\"]);\r\n super.set(\"en->it\", \"This might slow down the page and possibly crash the entire application\", [\"L'operazione potrebbe rallentare la pagina fino al crash dell'applicazione\"]);\r\n }\r\n}","// Angular\r\nimport { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, input, Output, ViewEncapsulation } from \"@angular/core\";\r\nimport { signal, computed, Signal, effect, WritableSignal } from \"@angular/core\";\r\n\r\n// Configurazioni\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\nimport { MessageService } from \"@esfaenza/extensions\";\r\n\r\n// Applicazione\r\nimport { TablePagerLoc } from \"./table_pager.component.loc\";\r\n\r\n/** Componente che si occupa della paginazione di una tabella */\r\n@Component({\r\n selector: \"es-paging\",\r\n viewProviders: [{ provide: LocalizationService, useClass: TablePagerLoc }],\r\n styleUrls: ['./table_pager.component.scss'],\r\n templateUrl: \"./table_pager.component.html\",\r\n encapsulation: ViewEncapsulation.None,\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EsTablePagerComponent {\r\n\r\n /** Dimensione di pagina attuale */\r\n CurrentPageSize = input<number|null>(null);\r\n /** View gestita, che può essere un IAppSearch o una ReportView */\r\n View = input<any>();\r\n /** Indica se deve mostrare un warning quando si cercano di solezionare come elementi da visualizzare \"Tutti\" */\r\n WarnOnAll = input<boolean>(true);\r\n /** Indica se dare la possibilità o meno di selezionare \"Tutti\" nelle opzioni di paginazione */\r\n AllSearch = input<boolean | null>(true);\r\n /** Placeholder che identifica il \"Tutti\" */\r\n DefaultAll = input<number>(999999);\r\n /** Indica se attivare la modalità gruppo con stili più snelli per apparire sotto ai raggruppamenti */\r\n GroupMode = input<boolean>(false);\r\n /** Indica se utilizzare il conteggio dei gruppi o degli oggetti */\r\n GroupCount = input<boolean>(false);\r\n /** Indica il testo che va a sostituire \"Oggetti Visualizzati\" in caso si stia facendo qualcosa di custom, Ignorato in caso di gruppi */\r\n CountLabel = input<string | null>(null);\r\n /** Indica se visualizzare il numero totale di oggeti presenti */\r\n ShowCount = input<boolean>(true);\r\n /** Indica se visualizzare il numero totale di oggeti presenti */\r\n ShowPaging = input<boolean>(true);\r\n /** Indica il numero totale di oggeti presenti */\r\n PagerCount = input<number|undefined>(undefined);\r\n /** Indica se mostrare o meno il contenuto @deprecated usata solo da MatrixValuesComponent nella lib relativa */\r\n Hidden = input<boolean>(false);\r\n\r\n /** Output invocato quando il numero di elementi per pagina viene modificato da un click utente */\r\n @Output() pagingSelected = new EventEmitter<number>();\r\n\r\n /** @ignore */\r\n constructor(private msgExts: MessageService, public lc: LocalizationService, public cdr: ChangeDetectorRef) {\r\n effect(() => {\r\n let vv = this.View();\r\n let newModel = vv ? (vv.itemsperpageoverride || 15) : this.CurrentPageSize();\r\n this.Model.set(newModel);\r\n });\r\n }\r\n\r\n /** Modello su cui la select effettua operazioni di selezione */\r\n public Model: WritableSignal<number|null> = signal(null);\r\n\r\n /** Opzioni di paginazione */\r\n private _pagingOptions: number[] = [10, 15, 30, 45, 100];\r\n\r\n public PagingOptionsForSelect: Signal<{ id: number, description: string }[]> = computed(() => {\r\n let defAllValue = this.DefaultAll();\r\n let availableOptions = this._pagingOptions.filter(pOpt => pOpt == defAllValue || (this.PagerCount() || 0) >= pOpt || this.PagerCount() == -1);\r\n if (this.AllSearch())\r\n availableOptions.push(defAllValue);\r\n\r\n return availableOptions.map(p => { return { description: p == defAllValue ? this.lc.loc(\"All\") : p.toString(), id: p } });\r\n });\r\n\r\n /**\r\n * Funzione richiamata dal template quando un utente clicca su un numero di paginazione.\r\n * \r\n * Cliccare 2 volte sullo stesso numero causa comunque un refresh dei dati\r\n * \r\n * @param {number} pageSize Dimensione selezionata lato UI\r\n */\r\n public choice(pageSize: number) {\r\n let prevModel = this.Model();\r\n if (pageSize == this.DefaultAll() && this.WarnOnAll()) {\r\n this.msgExts.simpleWarningWithChoice(\r\n this.lc.loc(\"Are you sure you want to retrieve all results?\"),\r\n this.lc.loc(\"This might slow down the page and possibly crash the entire application\"),\r\n () => {\r\n this.pagingSelected.emit(pageSize);\r\n this.Model.set(pageSize);\r\n }, () => {\r\n // NG19, serve un extra refresh\r\n this.Model.set(pageSize);\r\n requestAnimationFrame(() => {\r\n this.Model.set(prevModel);\r\n });\r\n });\r\n }\r\n else {\r\n this.pagingSelected.emit(pageSize);\r\n this.Model.set(pageSize);\r\n }\r\n }\r\n}","@if (!Hidden()) {\n <div [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}:&nbsp;</span>\n @if (ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)) {\n <p-select\n style=\"width: 95px\"\n size=\"small\"\n name=\"input\"\n appendTo=\"body\"\n [options]=\"PagingOptionsForSelect()\"\n optionLabel=\"description\"\n optionValue=\"id\"\n [ngModel]=\"Model()\"\n (ngModelChange)=\"choice($event)\"\n />\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">&nbsp;/&nbsp;</span>\n }\n }\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\n }\n </div>\n }","import { AppOrdering } from './AppOrdering';\r\nimport { ItemsSelection } from './ItemsSelection';\r\nimport { Group } from './Group';\r\nimport { GroupFilter } from './GroupFilter';\r\nimport { GroupOrAggregation } from './GroupOrAggregation';\r\nimport { ReportParam } from '../report/ReportParam';\r\nimport { ReportColumn } from '../report/ReportColumn';\r\n\r\n/**\r\n * Classe che identifica una ricerca paginata in tutte le sue sfumature (di grigio)\r\n */\r\nexport class AppSearch<T> {\r\n\r\n /**\r\n * Costruttore che genera un'istanza coi valori di default e impostando **firstsearch** a **true**\r\n */\r\n constructor() {\r\n this.itemsperpageoverride = 15;\r\n this.items = [];\r\n this.orders = [];\r\n this.columns = [];\r\n this.column_ordering = [];\r\n this.savedstate = false;\r\n this.searchinprogress = false;\r\n this.firstsearch = true;\r\n }\r\n\r\n /** ID della ricerca, sempre inutile a meno che non sia la ricerca dei risultati di un report */\r\n public searchid: string;\r\n /** Descrizione della ricerca, sempre inutile a meno che non sia la ricerca dei risultati di un report */\r\n public searchdescription: string;\r\n /** Indica se la paginazione per questa ricerca è disponibile */\r\n public pagingavailable: boolean;\r\n /** Indica il formato di export disponibile per questa ricerca. Utilizzato solo per la ricerca dei risultati di un report */\r\n public expformat: boolean;\r\n /** Parametri di ricerca per i risultati in modalità report */\r\n public pars: ReportParam[];\r\n /** Indicazione delle colonne presenti nel report */\r\n public report_columns: ReportColumn[];\r\n /** Indica se c'è una ricerca in corso */\r\n public searchinprogress: boolean;\r\n /** Indica il numero totale di pagine trovate dalla ricerca. Ogni pagina è una lista di **itemsperpageoverride** oggetti */\r\n public pages: number;\r\n /** Conteggio totale degli oggetti trovati (inclusi quelli in pagine non attualmente selezionate) */\r\n public objectcount: number;\r\n /** Conteggio totale dei gruppi trovati (inclusi quelli in pagine non attualmente selezionate) */\r\n public groupcount: number;\r\n /** Pagina attualmente in visualizzazione */\r\n public page: number;\r\n /** Numero di oggetti da persentare in ogni pagina. Per convenzione si considera valorizzato a 15 se non fornito */\r\n public itemsperpageoverride: number;\r\n /** Lista degli oggetti nella pagina attualmente in visualizzazione */\r\n public items: T[];\r\n /** Dizionario contenente tutti i gruppi paginati */\r\n public groups: Group[];\r\n /** Lista di colonne per cui ordinare */\r\n public orders: AppOrdering[];\r\n /** Lista di colonne da visualizzare */\r\n public columns: string[];\r\n /** Lista di colonne nell'ordine corretto */\r\n public column_ordering: string[];\r\n /** Indica se la ricerca era salvata. Qualora fosse questo il caso, al caricamento l'es-table si occuperà di ri-effettuare la ricerca ed aggiornare il modello */\r\n public savedstate: boolean;\r\n /** Indica se bisogna ancora effettuare la prima ricerca */\r\n public firstsearch: boolean;\r\n /** Indica se sto effettuando la ricerca post bind */\r\n public selfsearch: boolean;\r\n\r\n /**\r\n * Oggetto che indica la selezione corrente. \r\n * \r\n * Se **all** è **true** vuole dire che è tutto selezionato ed eventualmente ci sono delle esclusioni (**exclusions**)\r\n * Se **all** è **false** vuol dire che sono selezionati **item** specifici\r\n * \r\n * In base all'Input **UseSelectionCache** le proprietà **exclusions** e **items** fanno riferimento o alla pagina corrente (se **false**) \r\n * o all'intera ricerca (se **true**)\r\n */\r\n public selection: ItemsSelection<T>;\r\n\r\n /**\r\n * Indica che la ricerca è stata richiesta dall'estable. Questa variabile NON deve essere toccata. È gestita al 100% dall'es-table. \r\n * \r\n * L'unica cosa che serve è che nel modello lato C# sia presente in modo da non perderla durante la serializzazione\r\n */\r\n public internalsearchrequest: boolean;\r\n\r\n /** Raggruppamenti da fare per questa query. Se impostato e non ci sono **filtergroup** mi aspetto di ricevere oggetti nel campo **groups** */\r\n public groupings: GroupOrAggregation[];\r\n\r\n /**\r\n * Filtro da applicare ai gruppi. Qualora il numero di filtri qui fosse uguale al numero di raggruppamenti mi inizio ad apettare di ricevere oggetti\r\n * sul campo **items**, in caso contrario mi aspetto di ricevere o i gruppi nel campo **groups** o l'N-esimo livello dei gruppi\r\n */\r\n public requestedgroups: GroupFilter[];\r\n\r\n /** \r\n * Permette di resettare un AppSearch ai valori di default. \r\n * Reso statico perché fra una deserializzazione e l'altra si potrebbe perdere il prototype del costruttore \r\n * \r\n * @param {AppSearch<T>} aps AppSearch da resettare\r\n */\r\n public static reset<T extends AppSearch<any>>(aps: T) {\r\n aps.pages = 1;\r\n aps.objectcount = 0;\r\n aps.searchinprogress = false;\r\n aps.firstsearch = false;\r\n aps.page = 1;\r\n aps.itemsperpageoverride = 15;\r\n aps.items = [];\r\n aps.orders = [];\r\n aps.columns = [];\r\n aps.column_ordering = [];\r\n aps.savedstate = false;\r\n aps.selfsearch = false;\r\n }\r\n\r\n /** \r\n * Partendo da un appsearch con filtri impostati permette di crearne la stessa versione solo con la ricerca impostata a \"tutto\"\r\n * \r\n * @param {AppSearch<T>} aps AppSearch da cui partire\r\n */\r\n public static toSelectAll<T extends AppSearch<any>>(aps: T): T {\r\n let niu = this.newref(aps, false);\r\n niu.pages = 1;\r\n niu.itemsperpageoverride = 9999999;\r\n return niu;\r\n }\r\n\r\n /** \r\n * Permette di ottenere un nuovo riferimento all'AppSearch passata come parametro.\r\n * Internamente utilizza il JSON.parse(JSON.stringify(X)) con la differenza che prima stacca il riferimento agli items per evitare di \r\n * reserializzare potenzialmente centinaia di elementi. Il riferimento viene poi ricollegato alla nuova appsearch generata\r\n * \r\n * @param {AppSearch<T>} aps AppSearch di cui estrarre un nuovo riferimento equivalente\r\n */\r\n public static newref<T extends AppSearch<any>>(aps: T, retainItems: boolean = true): T {\r\n var items = aps.items;\r\n aps.items = [];\r\n var newref = JSON.parse(JSON.stringify(aps));\r\n if (retainItems)\r\n newref.items = items;\r\n newref.page = 1;\r\n return newref;\r\n }\r\n}","/** Classe che rappresenta le informazioni di paginazione della tabella attuale */\r\n\r\nexport class PagerInfos {\r\n constructor() {\r\n this.PagerCount = null;\r\n this.ShowCount = true;\r\n this.ShowPaging = true;\r\n this.ShowButtons = true;\r\n this.ShowPagingOptions = true;\r\n this.UsesView = true;\r\n this.View = null;\r\n this.Ready = false;\r\n this.Searches = 'items';\r\n }\r\n PagerCount: number;\r\n ShowCount: boolean;\r\n ShowPaging: boolean;\r\n UsesView: boolean;\r\n ShowButtons: boolean;\r\n ShowPagingOptions: boolean;\r\n View: any;\r\n Ready: boolean;\r\n Searches: 'items' | 'groups';\r\n}\r\n","import { Group } from \"./Group\";\r\n\r\n/** Identifica una selezione applicabile agli oggetti presentati in una tabella */\r\nexport class ItemsSelection<T> {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {T[]} selected Oggetti da considerare selezionati\r\n */\r\n constructor(selected: T[]) {\r\n this.count = selected.length;\r\n this.items = selected;\r\n this.all = false;\r\n this.exclusions = [];\r\n this.groups = [];\r\n this.group_exclusions = [];\r\n }\r\n\r\n /** Conteggio degli oggetti selezionati */\r\n public count: number;\r\n /** Se **all** è **false** indica gli elementi da includere, altrimenti è insensato */\r\n public items: T[]\r\n /** Se **all** è **false** indica i gruppi, altrimenti è insensato */\r\n public groups: Group[];\r\n /** Indica se tutti gli elementi sono da considerarsi selezionati (anche quelli di altre pagine) */\r\n public all: boolean = false;\r\n /** Se **all** è **true**, indica gli elementi da escludere, altrimenti è insensato */\r\n public exclusions: T[] = [];\r\n /** Se **all** è **true**, indica i gruppi da escludere, altrimenti è insensato */\r\n public group_exclusions: Group[] = [];\r\n}","/** Classe che rappresenta un filtro su un gruppo */\r\nexport class GroupFilter {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column ID della colonna gruppata per cui si richiede di filtrare\r\n * @param {string} value Valore del gruppo su questa **column** per cui si richiede di filtrare\r\n */\r\n constructor(\r\n public column: string,\r\n public value: string) { }\r\n}\r\n","/** Classe che rappresenta la modifica ad un singolo oggetto in una singola proprietà */\r\n\r\nexport class EsTableModelChange {\r\n /**\r\n * Costruttore\r\n * @param {any} item Oggetto modificato\r\n * @param {string} header Nome dell'Header che è stato modificato\r\n * @param {string} property Nome della proprietà modificata\r\n * @param {string} old_value Vecchio valore della proprietà **property** dell'oggetto **item**\r\n * @param {string} new_value Nuovo valore della proprietà **property** dell'oggetto **item**\r\n */\r\n constructor(\r\n public item: any,\r\n public header: string,\r\n public property: string,\r\n public old_value: string,\r\n public new_value: string) { }\r\n}","import { Directive, Input, Self, TemplateRef } from '@angular/core';\r\n\r\n/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */\r\n@Directive({\r\n selector: '[td]',\r\n standalone: false\r\n})\r\nexport class EsTdDirective {\r\n\r\n /** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsTdComponent */\r\n public _directive = true;\r\n\r\n /** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */\r\n public _multi = false;\r\n\r\n /** Indica se la cella è visibile o meno di default */\r\n @Input() tdVisible = true;\r\n /** Id della colonna, fa riferimento al **th** padre */\r\n @Input() td: string;\r\n\r\n /** Se questo td viene usato come renderer in questa proprietà è scritto il nome della proprietà dell'oggetto bindato per cui fare apparire il **Template** */\r\n @Input() tdForProperty: string;\r\n\r\n /** Equivalente dell'NgIf sul td */\r\n @Input() tdIf: boolean = true;\r\n /** Eventuali classi da applicare al **td** generato */\r\n @Input() tdClass: string;\r\n\r\n /** In mancanza di **Template** indica qual è la proprietà dell'oggetto contenente le informazioni da mostrare */\r\n @Input() tdPropertyAccessor: string\r\n\r\n /** Allineamento dei valori della tabella */\r\n @Input() tdAlignment: \"Center\" | \"Left\" | \"Right\";\r\n\r\n /** Formato da applicare al valore se applicabile, utilizzabile solo se **tdPropertyAccessor** è valorizzato */\r\n @Input() tdFormat: string;\r\n\r\n /** Se il contenuto di questo td dev'essere un'immagine cliccabile, questa è la classe che la identifica */\r\n @Input() tdIconClass: string;\r\n\r\n /** Campo da controllare per fare apparire/sparire il contenuto di questa cella qualora fosse diverso da **tdConditionValue** */\r\n @Input() tdConditionField: string;\r\n\r\n /** Valore che deve assumere **tdConditionField** per mostrare il contenuto di questa cella */\r\n @Input() tdConditionValue: string;\r\n\r\n /** Titolo HTML di questa cella */\r\n @Input() tdTitle: string;\r\n\r\n /** Contenuto statico di questa cella */\r\n @Input() tdContent: string;\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(@Self() public Template: TemplateRef<any>) { }\r\n}\r\n\r\n","import { Directive, Input, Self, TemplateRef } from \"@angular/core\";\r\n\r\nimport { ThAggregation } from \"../domain/internals/ThAggregation\";\r\n\r\nimport { InputType } from \"../domain/types\";\r\n\r\n/** Direttiva per la dichiarazione snella di un EsTh da emettere come header */\r\n@Directive({\r\n selector: '[th]',\r\n standalone: false\r\n})\r\nexport class EsThDirective {\r\n\r\n /** Variabile interna all'interno della quale viene raccolta la cache delle aggregazioni specificate in thAggregation */\r\n public _thAggregations?: ThAggregation[];\r\n\r\n /** Variabile interna contenente in maniera ordinata i template dei padri */\r\n public _thParents?: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[];\r\n\r\n /** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsThComponent */\r\n public _directive = true;\r\n\r\n /** Variabile interna impostata dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */\r\n public _referenced: boolean = false;\r\n\r\n /** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */\r\n public _multi = false;\r\n\r\n /** Variabile interna che indica il contenuto dell'header in caso di multi */\r\n public _multi_content = \"\";\r\n\r\n /** Id della colonna, dev'essere lo stesso per tutti i **td** relativi */\r\n @Input() th: string = \"\";\r\n /** Indica se la colonna è pinnata o no */\r\n @Input() thPinned: boolean = false;\r\n /** Indica se la colonna è pinnabile o no */\r\n @Input() thPinnable: boolean = true;\r\n /** Indica le dimensioni che deve avere questa colonna quando viene pinnata, senza questo tutte le colonne mi collasserebbero l'una sull'altra */\r\n @Input() thPinnedWidth: number = 150;\r\n /** Indicazione sulla visibilità della colonna */\r\n @Input() thVisible: boolean = true;\r\n /** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */\r\n @Input() thFixed: boolean = false;\r\n /** Indica che la colonna è sotto ad un raggruppamento padre, con questo nome nel **th** */\r\n @Input() thParent: string | null = null;\r\n /** Ordinamento attuale della colonna */\r\n @Input() thOrder?: 'DESC' | 'ASC';\r\n /** Indica se questa colonna è ordinabile o meno */\r\n @Input() thOrderable: boolean = true;\r\n /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */\r\n @Input() thWrap: boolean = false;\r\n /** Indica se le dimnsioni di questa colonna sono modificabili o meno */\r\n @Input() thResizable: boolean = false;\r\n /** Classi da applicare all'Header della colonna */\r\n @Input() thClass?: string;\r\n\r\n /** Classi da applicare all'Header della colonna */\r\n @Input() thShrink?: boolean;\r\n\r\n /** Classi da applicare alle righe quando rappresentano un Gruppo */\r\n @Input() thGroupClass?: string;\r\n /** Equivalente dell'NgIf sul th */\r\n @Input() thIf: boolean = true;\r\n /** Campo particolare che indica che questo header è vuoto. Viene utilizzato solo a livello grafico per ignorare o meno l'emit del template */\r\n @Input() thEmpty: boolean = false;\r\n /** Indica che bisogna fare un raggruppamento su questa colonna */\r\n @Input() thGroup: boolean = false;\r\n /** Indica che bisogna fare una aggregazione su questa colonna, a fronte di almeno un altra con un raggruppamento */\r\n @Input() thAggregation: string | null = null;\r\n\r\n /** Proprietà JS a cui si riferisce questa cella */\r\n @Input() thProperty: string| null = null;\r\n\r\n /** Tipo della proprietà JS a cui si riferisce questa cella. Se valorizzato l'utente la potrà modificare facendo doppio click */\r\n @Input() thType: InputType | string| null = null;\r\n\r\n /** Sorgente dei valori disponibili per questa cella se il **Type** è di tipo 'enum' */\r\n @Input() thSource: { id: string, description: string }[]| null = null;\r\n\r\n /** Indica che questo header deve essere emesso una volta per ogni valore presente nella lista di **EsTableMultiValue** alla proprietà **th** dell'oggetto corrente */\r\n @Input() thMulti?: boolean;\r\n\r\n /** Indica un contenuto statico da mostrare piuttosto che utilizzare il **Template**. Serve in caso questo oggetto venga generato programmaticamente */\r\n @Input() thStaticContent: string| null = null;\r\n\r\n /** Colore del background della cella */\r\n @Input() thBackgroundColor?: string;\r\n\r\n /** Allineamento dei valori della tabella */\r\n @Input() thAlignment?: \"Center\" | \"Left\" | \"Right\";\r\n\r\n /** Formato da applicare al valore se applicabile */\r\n @Input() thFormat?: string;\r\n\r\n /** Nome dell'editor da utilizzare per la modifica di questo campo, ordine di priorità:\r\n * \r\n * 1. Editor con nome **thEditorName**\r\n * \r\n * 2. Editor riferito alla proprietà **thProperty**\r\n * \r\n * 3. Editor di default per **thType**\r\n */\r\n @Input() thEditorName?: string;\r\n\r\n /** Opzioni da applicare all'editor di questa colonna */\r\n @Input() thEditorOptions: { [id : string]: any } = {}\r\n\r\n /** Nome del renderer da utilizzare per visualizzare questo campo. Utilizzato solo per le tabelle dinamiche */\r\n @Input() thRendererName?: string;\r\n\r\n /** Route di navigazione. Es. \"['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]\" */\r\n @Input() thRoutePath?: string;\r\n\r\n /**\r\n * Proprietà da bindare a **routePath** per generare la route completa. \r\n * \r\n * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. [\"idItem\", \"idItem2\"]\r\n */\r\n @Input() thRouteParameterProperties?: string[];\r\n\r\n /** @ignore */\r\n constructor(@Self() public Template: TemplateRef<any> | null) { }\r\n}","import { Directive, Input, Optional, Self, TemplateRef } from '@angular/core';\r\n\r\n/** Direttiva che rappresenta il template dell'editor di una cella all'interno della tabella */\r\n@Directive({\r\n selector: '[editor]',\r\n standalone: false\r\n})\r\nexport class EsTdEditorDirective {\r\n\r\n /** Id dell'Editor */\r\n @Input() editor?: string;\r\n \r\n /** In questa proprietà è scritto il nome della proprietà dell'oggetto bindato per cui fare apparire il **Template** */\r\n @Input() editorForProperty?: string;\r\n\r\n /** @ignore */\r\n constructor(@Self() @Optional() public Template: TemplateRef<any>) { }\r\n}\r\n","import { ContentChildren, Directive, QueryList } from '@angular/core';\r\nimport { EsTdDirective } from './es_td.directive';\r\nimport { EsThDirective } from './es_th.directive';\r\nimport { ReplaySubject } from 'rxjs';\r\n\r\n@Directive({\r\n selector: '[td_th_provider]', exportAs: \"tdThProvider\",\r\n standalone: false\r\n})\r\nexport class ThTdProvider {\r\n @ContentChildren(EsTdDirective) EsTdsDirective: QueryList<EsTdDirective>;\r\n @ContentChildren(EsThDirective) EsThsDirective: QueryList<EsThDirective>;\r\n\r\n public LoadedSignal: ReplaySubject<void> = new ReplaySubject<void>();\r\n\r\n public setLoaded() {\r\n requestAnimationFrame(() => {\r\n this.LoadedSignal.next();\r\n this.LoadedSignal.complete();\r\n })\r\n }\r\n\r\n async asyncLoad(){\r\n\r\n }\r\n\r\n async ngOnInit(){\r\n await this.asyncLoad();\r\n this.setLoaded();\r\n }\r\n}","import { Injectable, Injector } from \"@angular/core\";\r\nimport { LocalizationService } from \"@esfaenza/localizations\";\r\n\r\n/** Classe di localizzazione per il componente **EsTableComponent** */\r\n@Injectable()\r\nexport class EsTableLoc extends LocalizationService {\r\n\r\n /** @ignore */\r\n constructor(injector: Injector) { \r\n super(injector);\r\n \r\n super.set(\"en->it\", \"All the\", [\"Tutti gli\"]);\r\n super.set(\"en->it\", \"All\", [\"Tutto\"]);\r\n super.set(\"en->it\", \"Groups\", [\"Gruppi\"]);\r\n super.set(\"en->it\", \"Cannot export an empty dataset\", [\"Impossibile esportare un dataset vuoto\"]);\r\n super.set(\"en->it\", \"Performing Table bootstrap\", [\"Sto caricando la Tabella\"]);\r\n super.set(\"en->it\", \"Update every\", [\"Aggiorna ogni\"]);\r\n super.set(\"en->it\", \"second/s\", [\"secondo/i\"]);\r\n super.set(\"en->it\", \"Export View\", [\"Esporta Vista\"]);\r\n super.set(\"en->it\", \"Column Name\", [\"Nome Colonna\"]);\r\n super.set(\"en->it\", \"Columns Order\", [\"Ordine Colonne\"]);\r\n super.set(\"en->it\", \"Columns Visibility\", [\"Visibilità Colonne\"]);\r\n super.set(\"en->it\", \"There are no columns configured to be hidden/shown in this view\", [\"Non ci sono colonne configurate per essere visualizzate/nascoste in questa vista dati\"]);\r\n super.set(\"en->it\", \"Columns Visibility and Order\", [\"Visibilità e Ordine Colonne\"]);\r\n super.set(\"en->it\", \"Objects Selected\", [\"Oggetti Selezionati\"]);\r\n super.set(\"en->it\", \"Object Selected\", [\"Oggetto Selezionato\"]);\r\n super.set(\"en->it\", \"Select Everything\", [\"Seleziona Tutto\"]);\r\n super.set(\"en->it\", \"Reset Selection\", [\"Resetta Selezione\"]);\r\n super.set(\"en->it\", \"No operations available\", [\"Nessuna operazione disponibile\"]);\r\n super.set(\"en->it\", \"Close\", [\"Chiudi\"]);\r\n super.set(\"en->it\", \"Confirm\", [\"Conferma\"]);\r\n super.set(\"en->it\", \"Values copied in the clipboard\", [\"Valori copiati nella clipboard\"]);\r\n super.set(\"en->it\", \"Size of copied data is different from the size of the selection\", [\"La dimensione dei dati copiati differisce dalla dimensione della selezione\"]);\r\n super.set(\"en->it\", \"Data for this table cannot be edited\", [\"I dati di questa tabella non possono essere modificati\"]);\r\n }\r\n}","import { InjectionToken } from '@angular/core';\r\nimport { EsTableDefaultable } from './domain/configuration/EsTableDefaultable';\r\n\r\n/** Token che indica se emettere log a console o meno */\r\nexport const EST_DEBUG: InjectionToken<string> = new InjectionToken<string>('EST_DEBUG');\r\n\r\n/** Token che indica l'espressione ACL da utilizzare (if any) per consentire le operazioni di esportazione */\r\nexport const EST_EXPORT_GLOBAL_ACL: InjectionToken<string> = new InjectionToken<string>('EST_EXPORT_GLOBAL_ACL');\r\n\r\n/** Token che indica i default da assegnare agli Input */\r\nexport const EST_DEFAULTS: InjectionToken<EsTableDefaultable> = new InjectionToken<EsTableDefaultable>('EST_DEFAULTS');","// Angular\r\nimport { Type } from \"@angular/core\";\r\n\r\n// Librerie\r\nimport { CsvHeaders, DateService, ExportService, MessageService, UtilityService } from \"@esfaenza/extensions\";\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n\r\n/** Classe contenente la gestione delle importazioni */\r\nexport class ExportHandler {\r\n\r\n private exportInProgress: boolean = false;\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent, private expExts: ExportService, private msgExts: MessageService, private utiExts: UtilityService, private dateExts: DateService) { }\r\n\r\n /**\r\n * Effettua l'esportazione dei dati\r\n *\r\n * @param {string} format Formato di esportazione. Letto solo in modalità Report della tabella\r\n */\r\n public tryExport(format?: 'CSV' | 'XLSX') {\r\n if (!this.est.ExportFunction)\r\n return;\r\n\r\n if (this.exportInProgress) {\r\n this.msgExts.simpleError(\"Un'esportazione è già in corso, si prega di attendere\");\r\n return;\r\n }\r\n\r\n this.exportInProgress = true;\r\n this.est.ExportFunction(async (data: any[], type: Type<any>, cancel: boolean = false) => {\r\n\r\n this.exportInProgress = false;\r\n if (cancel)\r\n return;\r\n \r\n if (data.length == 0) {\r\n this.msgExts.simpleWarning(this.est.lc.loc(\"Cannot export an empty dataset\"));\r\n return;\r\n }\r\n\r\n let drcd = this.est.DynamicRowColumnsDefinition();\r\n let columnsFilter = this.est.ExportOnlyVisibleColumns() ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;\r\n let csvHeadersOverride = drcd && drcd.length > 0 ? drcd.map(t => { return <CsvHeaders>{ label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' }; }) : null;\r\n\r\n this.expExts.export(data, format, this.est.ExportFileName(), type, columnsFilter, csvHeadersOverride);\r\n }, format);\r\n }\r\n}","/**\r\n * Classe che identifica un ordinamento di una colonna\r\n */\r\nexport class AppOrdering {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id ID della colonna a cui si vogliono applicare ordinamenti, deve combaciare all'id messo nella dichiarazione dell'ES-TD/TH\r\n * @param {'DESC' | 'ASC' } order Ordinamento da applicare alla colonna, Discendente/Ascendente, default 'null' per indicare assenza di ordine\r\n */\r\n constructor(public id: string, public order?: 'DESC' | 'ASC') { }\r\n}","import { TemplateRef } from \"@angular/core\";\r\n\r\n/** Definizione di una colonna, utilizzato nella dialog che permette di modificare le posizioni e le visibilità */\r\nexport class EsTableColumn {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Id colonna\r\n * @param {string} description Descrizione (Header)\r\n * @param {boolean} visible Indica se di default mostrarla o meno\r\n * @param {boolean} fixed Indica se è una colonna fixed\r\n * @param {boolean} pinnable Indica se una colonna può essere pinnata\r\n * @param {boolean} pinned Indica se è una colonna pinnata\r\n * @param {number} pinnedWidth Indica la dimensione da assegnare a questa colonna quando è pinnata\r\n * @param {TemplateRef<any>} template Indica il template da usare per mostrare il testo dell'Header\r\n * @param {{ id: string, tmpl: TemplateRef<any>, content: string }[]} parentTemplates Indica la lista di template padri collegata a questo header, rappresentati come Template o come stringa qualora fosse generato automaticamente (caso **Multi**)\r\n * @param {boolean} multi Indica che la colonna deriva da una direttiva **Multi**\r\n * @param {string} multiContent Indica il contenuto della direttiva **Multi** per questa colonna\r\n */\r\n constructor(\r\n public id: string,\r\n public description: string | null,\r\n public visible?: boolean,\r\n public fixed?: boolean,\r\n public pinned?: boolean,\r\n public pinnable?: boolean,\r\n public pinnedWidth?: number,\r\n public template?: TemplateRef<any> | null, \r\n public parentTemplates?: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[],\r\n public multi?: boolean,\r\n public multiContent?: string) { }\r\n\r\n /** Indice precedente in cui si trovava questa colonna in modo da poterla spinnare in maniera super sexy */\r\n public prev_index?: number;\r\n}\r\n","// Angular\r\nimport { CdkDrag, CdkDragDrop, moveItemInArray } from \"@angular/cdk/drag-drop\";\r\nimport { TemplateRef, WritableSignal } from \"@angular/core\";\r\n\r\n// Libs\r\nimport { UtilityService } from \"@esfaenza/extensions\";\r\nimport { PreferencesService } from \"@esfaenza/preferences\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Handlers\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\nimport { RowGroupingHandler } from \"./RowGroupingHandler\";\r\n\r\n// Modelli\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { EsTableColumn } from \"../../domain/internals/EsTableColumn\";\r\nimport { EsTableMultiValue } from \"../../domain/externals/appsearch/EsTableMultiValue\";\r\nimport { ThGroup } from \"../../domain/internals/ThGroup\";\r\nimport { ThElement } from \"../../domain/internals/ThElement\";\r\nimport { TdElement } from \"../../domain/internals/TdElement\";\r\n\r\n/** Classe che gestisce tutte le informaizoni relative alle colonne: visibilità, posizione, stato di pin/unpin, ecc ecc... */\r\nexport class ColumnMetadataHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler, private utiExts: UtilityService, private prefService: PreferencesService, private rgH: RowGroupingHandler) { }\r\n\r\n /**\r\n * Metodo che gestisce il cambio di Ordinamento di una colonna\r\n *\r\n * @param {string} id ID della colonna il cui oridnamento è cambiato\r\n * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna\r\n */\r\n public handleTHOrderChange(id: string, order: 'DESC' | 'ASC' | undefined) {\r\n let orders = this.est.viewMode() ? (this.est.View as AppSearch<any>).orders : this.est.arrayOrders;\r\n let orderToAdd = true;\r\n let orderToRemove: number | null = null;\r\n\r\n // Se per qualche motivo il costruttore non è passato (cache tarpate o simila) fixo\r\n if (!orders && this.est.viewMode())\r\n (this.est.View as AppSearch<any>).orders = [];\r\n else if (!orders && this.est.arrayMode())\r\n this.est.arrayOrders = [];\r\n\r\n for (let i = 0; i < orders.length; i++) {\r\n let t = orders[i];\r\n if (t.id == id) {\r\n if (order) {\r\n t.order = order;\r\n orderToAdd = false;\r\n }\r\n else\r\n orderToRemove = i;\r\n }\r\n }\r\n\r\n if (orderToRemove != null) {\r\n orders.splice(orderToRemove, 1);\r\n }\r\n else if (orderToAdd) {\r\n if (this.est.MultipleOrderingDirectives())\r\n orders.push(new AppOrdering(id, order));\r\n else {\r\n if (this.est.viewMode())\r\n (this.est.View as AppSearch<any>).orders = [new AppOrdering(id, order)];\r\n else if (this.est.arrayMode())\r\n this.est.arrayOrders = [new AppOrdering(id, order)];\r\n }\r\n }\r\n\r\n //Salvo le preferences di questa view\r\n //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI\r\n if (this.est.SavePreferences()) {\r\n let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View as AppSearch<any>) : null;\r\n this.registerViewPreferences(castedView);\r\n }\r\n\r\n this.est.onOrderChanged.emit({ id, order });\r\n\r\n if (this.est.viewMode()) {\r\n if (this.est.groupSearchRequestsCache.length > 0)\r\n this.rgH.emitRowGroupingSearches(id, orders);\r\n else\r\n this.est.emitSearchRequest(false);\r\n }\r\n else if (this.est.arrayMode())\r\n this.est.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Registra le preference relative alla view passata come parametro\r\n * \r\n * @param {any} castedView View di cui salvare colonne e ordinamento colonne\r\n */\r\n public registerViewPreferences(castedView: AppSearch<any> | null) {\r\n if (!this.est.ngControl.name) {\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per la tabella\");\r\n return false;\r\n }\r\n\r\n if (!this.prefService) {\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n return false;\r\n }\r\n\r\n let arrMode = this.est.arrayMode();\r\n let columns = arrMode ? this.est.arrayColumns : (castedView?.columns || []);\r\n let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : (castedView?.column_ordering || []);\r\n let columnOrders = arrMode ? [] : (castedView?.orders || []);\r\n var toStore = {\r\n columns: this.utiExts.deepClone(columns) as string[],\r\n column_ordering: this.utiExts.deepClone(columnsOrderings) as string[],\r\n orders: this.utiExts.deepClone(columnOrders) as string[]\r\n };\r\n this.prefService.setItem(<string>this.est.ngControl.name, toStore).subscribe();\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsThs** estrappolo la lista di **EsTableColumn** che questa tabella dovrà eventualmente gestire per Visibilità e Ordine\r\n *\r\n * Costo: 1 scan EsThs\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n public reviewColumnsList(ths: EsThDirective[]) {\r\n this.est.TMPColumnsList = [];\r\n if (ths.length == 0)\r\n return;\r\n\r\n // Appena il contentChildren è valorizzato scorro tutti gli header\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n let column = th.th;\r\n // Se non ho un id il th è considerato inerte\r\n if (!column)\r\n continue;\r\n\r\n // Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere\r\n // Di default la visibilità è quella impostata nel componente\r\n if ((this.est.HiddenColumns() || th.thVisible) && th.thIf) {\r\n let previouslyPinned = !this.est.ColumnsList || this.est.ColumnsList.length == 0 ? null : this.est.ColumnsList.find(t => t.id == column) || null;\r\n let toAdd = new EsTableColumn(column, th.thStaticContent, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnable, th.thPinnedWidth, th.Template, th._thParents, th._multi, th._multi_content);\r\n if (previouslyPinned)\r\n toAdd.prev_index = previouslyPinned.prev_index;\r\n this.est.TMPColumnsList.push(toAdd);\r\n }\r\n }\r\n this.est.ColumnsList = [];\r\n this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });\r\n }\r\n\r\n /** In caso siano configurati dei th \"Multi\" (vedere la descrizione del campo **thMulti** di **EsThDirective**) questo metodo li \"srotola\" in tutti i th/td che devono effettivamente diventare */\r\n public expandMultiThsAndTds(ths: EsThDirective[], tds: EsTdDirective[], items: any[]): {expThs: EsThDirective[], expTds: EsTdDirective[]} {\r\n\r\n // Registro le info sui multiprovider\r\n let multiDefs: { [id: string]: { On?: string, thref: EsThDirective, tdref: EsTdDirective | null, thgen: { [id: string]: EsThDirective }, tdgen: { [id: string]: EsTdDirective } } } = { };\r\n \r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n if (!th.thMulti)\r\n continue;\r\n\r\n multiDefs[th.th] = { On: th.th, tdref: null, thref: th, thgen: {}, tdgen: {} };\r\n }\r\n\r\n // Assegno le info anche ai td\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n td._multi = !!multiDefs[td.td];\r\n if(td._multi)\r\n multiDefs[td.td].tdref = td;\r\n }\r\n\r\n // Rimuovo i multitemplate dalle balle\r\n // N.B: Dato che la prima operazione su th e td è questa il riferimento originale viene sovrascritto, questo significa che devo ri-emettere i due nuovi array\r\n ths = ths.filter(t => !t.thMulti);\r\n tds = tds.filter(t => !t._multi);\r\n\r\n let parentThs: { [id: string]: boolean; } = { };\r\n let addedHeaders: { [id: string]: boolean; } = { };\r\n let tdsToAdd: { [id: string] : EsTdDirective} = { };\r\n let thsToAdd: EsThDirective[] = [];\r\n\r\n // Per ogni item vedo se ci sono dei multi per le proprietà che li definiscono\r\n for(let i = 0; i < items.length; i++){\r\n let itm = items[i];\r\n \r\n for (let prop in multiDefs) {\r\n // Se la proprietà del multi esiste nell'oggetto ed ha una lunghezza\r\n if (itm[prop] && itm[prop].length) {\r\n let multiRef = multiDefs[prop];\r\n let reftd = multiRef.tdref!;\r\n let refth = multiRef.thref;\r\n\r\n for (let ii = 0; ii < itm[prop].length; ii++) {\r\n\r\n // Header già aggiunto, non devo inserire altri template di header/colonna\r\n let estmv = <EsTableMultiValue>itm[prop][ii];\r\n if (!estmv._headersHierarchy)\r\n estmv._headersHierarchy = estmv.header_group ? estmv.header_group.split(\">\").map(t => t.trim()) : [];\r\n\r\n let headerValue = estmv.header;\r\n let parent = estmv.header_group || null;\r\n let parentsHier = estmv._headersHierarchy;\r\n\r\n if (addedHeaders[`${parent}_${headerValue}`])\r\n continue;\r\n else\r\n addedHeaders[`${parent}_${headerValue}`] = true;\r\n\r\n // Per ogni valore diverso delle proprietà devo aggiungere un td e un th, quest'ultimo dev'essere eventualmente collegato ad un header\r\n let newtH = new EsThDirective(refth.Template);\r\n newtH._multi = true;\r\n newtH._multi_content = headerValue;\r\n newtH.th = `${prop}_${ii}`;\r\n newtH.thClass = refth.thClass;\r\n newtH.thShrink = refth.thShrink;\r\n newtH.thIf = refth.thIf;\r\n newtH.thVisible = refth.thVisible;\r\n newtH.thWrap = refth.thWrap;\r\n // Il parent è sempre l'ultimo nella gerarchia di padri\r\n newtH.thParent = parentsHier[parentsHier.length - 1];\r\n newtH.thOrderable = false;\r\n\r\n for (let i = 0; i < parentsHier.length; i++) {\r\n let par = parentsHier[i];\r\n if (!parentThs[par])\r\n parentThs[par] = true;\r\n else\r\n continue;\r\n\r\n let thParent = new EsThDirective(null);\r\n thParent.th = par;\r\n thParent._multi_content = par;\r\n thParent.thParent = i > 0 ? parentsHier[i - 1] : null;\r\n thsToAdd.push(thParent);\r\n }\r\n\r\n thsToAdd.push(newtH);\r\n\r\n let newTd = new EsTdDirective(reftd.Template);\r\n newTd._multi = true;\r\n newTd.td = `${prop}_${ii}`;\r\n newTd.tdClass = reftd.tdClass;\r\n newTd.tdIf = reftd.tdIf;\r\n newTd.tdVisible = reftd.tdVisible;\r\n tdsToAdd[newTd.td] = newTd;\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Ordino gli header aggiunti in base al Parent, se presente, e li aggiungo alla lista dei th, dopodiché in base allo stesso ordinamento aggiungo i relativi td\r\n let orderedThs = [];\r\n\r\n // Prima metto tutti i th senza parent, poi per ogni parent prendo i th ordinati come li trovo nella lista\r\n for(let i = 0; i < thsToAdd.length; i++){\r\n if(!thsToAdd[i].thParent)\r\n orderedThs.push(thsToAdd[i]);\r\n }\r\n for(let prop in parentThs){\r\n for(let i = 0; i < thsToAdd.length; i++){\r\n let th = thsToAdd[i];\r\n if(th.thParent && th.thParent == prop)\r\n orderedThs.push(th);\r\n }\r\n }\r\n\r\n ths = [...ths, ...thsToAdd];\r\n for (let i = 0; i < thsToAdd.length; i++) {\r\n // Se il th è un header td verrebbe undefined. Lo aggiungo solo se è effettivamente presente\r\n let td = tdsToAdd[thsToAdd[i].th];\r\n if (td)\r\n tds.push(td);\r\n }\r\n\r\n return { expTds: tds, expThs: ths };\r\n }\r\n\r\n /**\r\n * Prende i th e i td in modalità diretive e li ordina in base a se ci sono colonne fixed o meno\r\n */\r\n public moveFixedColumnsAtTheBeginning(ths: EsThDirective[], tds: EsTdDirective[]) {\r\n\r\n let fixeds = 0, pinneds = 0;\r\n let columnsCache: { [index: string]: EsTableColumn; } = {};\r\n let columnsIndexCache: { [index: string]: number; } = {};\r\n\r\n // Creo la cache delle colonne\r\n for (let coli = 0; coli < this.est.ColumnsList.length; coli++) {\r\n let col = this.est.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n\r\n // Anche per le columnslist sposto le pinnate o le fixed all'inizio\r\n if (col.pinned) {\r\n if (coli != pinneds)\r\n this.utilities.arrayMove(this.est.ColumnsList, coli, pinneds);\r\n pinneds++;\r\n }\r\n\r\n // Se una colonna è sia pinnata che fixata la considero unicamente pinnata\r\n if (col.fixed && !col.pinned) {\r\n if (coli != pinneds + fixeds)\r\n this.utilities.arrayMove(ths, coli, pinneds + fixeds);\r\n fixeds++;\r\n }\r\n }\r\n\r\n pinneds = fixeds = 0;\r\n\r\n // Sposto tutti gli header fixed o pinned all'inizio\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n // Riassegno sempre per ripulire valori di partenza o per aggiornarli in caso di modifiche utente\r\n th.thPinned = !!((!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned));\r\n if (th.thPinned) {\r\n if (i != pinneds)\r\n this.utilities.arrayMove(ths, i, pinneds);\r\n pinneds++;\r\n }\r\n\r\n //In questo caso sono informazioni statiche invece, non modificabili dall'utente, quindi non mi dò preoccupazioni\r\n if ((th.thFixed || th.thGroup) && !th.thPinned) {\r\n if (i != pinneds + fixeds)\r\n this.utilities.arrayMove(ths, i, pinneds + fixeds);\r\n fixeds++;\r\n }\r\n }\r\n\r\n // Cache degli indici per riposizionare i td come i th\r\n for (let i = 0; i < ths.length; i++)\r\n columnsIndexCache[(<EsThDirective>ths[i]).th] = i;\r\n\r\n // Riordino le celle per fargli mantenere la stessa struttura dei th\r\n let newTds = new Array(ths.length);\r\n\r\n for (let i = 0; i < tds.length; i++) {\r\n let item = tds[i] as EsTdDirective;\r\n newTds[columnsIndexCache[item.td]] = item;\r\n }\r\n\r\n this.est.HasPinnedColumns.set(pinneds > 0);\r\n }\r\n\r\n /** In base alla configurazione delle colonne calcola le dimenioni delle colonne pinnate */\r\n public evaluatePinnedColumnsWidth() {\r\n if (!this.est.HasPinnedColumns())\r\n return;\r\n\r\n let pcw = 0;\r\n for (let i = 0; i < this.est.ColumnsList.length; i++) {\r\n let col = this.est.ColumnsList[i];\r\n if (col.pinned && col.visible)\r\n pcw += col.pinnedWidth || 0;\r\n }\r\n pcw += this.est.Selection() ? 25 : 0;\r\n\r\n this.est.PinnedContainerWidth.set(pcw);\r\n }\r\n\r\n /**\r\n * Terminato il binding delle colonne da **reviewColumnsList** e della **View** dal **writeValue** questo metodo si occupa\r\n * dell'allineamento delle informazioni fra le colonne calcolate internamente e le informazioni sulle colonne che arrivano dall'AppSearch\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public alignColumnsIfLoadedView(view: AppSearch<any>) {\r\n let emitChanged = this.est.viewMode() && view.savedstate;\r\n let newColset: string[] = [];\r\n\r\n if (!this.est.ColumnsList || this.est.ColumnsList.length == 0)\r\n return;\r\n\r\n let columns = [];\r\n\r\n // Modlaità view ->\r\n if (this.est.viewMode()) {\r\n // colonne dinamiche -> prendo l'insieme delle colonne e operazioni dinamiche definite\r\n // standard -> prendo le colonne della view\r\n if (this.est.DynamicRowColumnsDefinition())\r\n columns = [...(this.est.DynamicRowColumnsDefinition()?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations()?.map(t => t.id) || [])];\r\n else\r\n columns = view.columns;\r\n }\r\n // Modalità array -> prendo le colonne array\r\n else\r\n columns = this.est.arrayColumns\r\n\r\n this.est.ColumnsList.forEach(c => {\r\n // Se la colonna è pinnata mi arriva col simoleon, ma anche se è una composizione di più colonne\r\n let exCl = columns.filter(cc => (cc.startsWith('§') ? cc.substring(1) : cc) == c.id);\r\n\r\n // Se la colonna è pinnata aggiorno l'informazione nella view\r\n if (exCl.length == 1)\r\n c.pinned = exCl[0].startsWith('§');\r\n\r\n // Se l'appsearch viene da uno stato precedente, uso le informazioni sulle colonne che ha dentro, altrimenti sovrascrivo tutto **\r\n if (c.visible && columns.length == 0)\r\n newColset.push(c.id);\r\n\r\n // Se ho una colonna lato AppSearch e nella ColumnList non è visibile, allineo all'AppSearch\r\n else if (exCl.length == 1 && !c.visible && !this.est.useLocalVisibility)\r\n c.visible = true;\r\n\r\n // Allineamento sull'AppSearch per casistiche inverse al di sopra\r\n else if (exCl.length == 0 && c.visible && !this.est.useLocalVisibility)\r\n c.visible = false;\r\n });\r\n\r\n // Non ho colonne nella appsearch, vuol dire che sono al primo binding\r\n if (columns.length == 0) {\r\n if (this.est.viewMode())\r\n view.columns = newColset;\r\n else\r\n this.est.arrayColumns = newColset;\r\n }\r\n\r\n if ((this.est.viewMode() && view.savedstate) && this.est.ColumnsOrdering() && view.column_ordering.length > 0) {\r\n // Scorro gli ordinamenti che avevo salvato e ricreo la ColumnsList in base a loro\r\n let newColList: EsTableColumn[] = [];\r\n view.column_ordering.forEach(co => {\r\n this.est.ColumnsList.forEach(c => {\r\n if (c.id == co)\r\n newColList.push(c);\r\n });\r\n });\r\n\r\n // Recupero anche campi nuovi che nell'iterazione vecchia non c'erano (serve durante lo sviluppo in modo da non perdersi fra un EDIT + F5 e l'altro)\r\n this.est.ColumnsList.forEach(c => {\r\n if (!newColList.find(t => t.id == c.id))\r\n newColList.push(c);\r\n });\r\n\r\n this.est.ColumnsList = newColList;\r\n }\r\n\r\n // In ogni caso questo non mi serve più, lo resetto **\r\n if (this.est.viewMode())\r\n view.savedstate = false;\r\n\r\n // Reset di questa variabile usata one-bind\r\n if (this.est.useLocalVisibility)\r\n this.est.useLocalVisibility = false;\r\n\r\n if (emitChanged)\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * In base alla visibilità registrata nelle **ColumnsList** questo metodo si occupa di prendere tutti i **EsThDirective** ed **EsTdDirective** relativi e nasonderli/mostrarli\r\n *\r\n * Costo: 1 scan ColumnsList, 1 scan EsThDirectives, 1 scan EsTdDirectives\r\n *\r\n * @param {EsThDirective[]} ths Header della tabella\r\n * @param {EsTdDirective[]} tds Celle della tabella\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public refreshColumnsVisibility(ths: EsThDirective[] | null, tds: EsTdDirective[] | null, view: AppSearch<any> | null) {\r\n let newColset = [];\r\n let fixedThs: { [id: string]: boolean; } = {};\r\n let columnsCache: { [index: string]: EsTableColumn; } = {};\r\n for (let coli = 0; coli < this.est.ColumnsList.length; coli++) {\r\n let col = this.est.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n if (col.visible)\r\n newColset.push((col.pinned ? \"§\" : \"\") + col.id);\r\n }\r\n if (view)\r\n view.columns = newColset;\r\n\r\n else\r\n this.est.arrayColumns = newColset;\r\n\r\n // Da qui in poi devono essere eseguiti SOLO in fase di writeValue quindi devo assicurarmi di passarli null in tutti i passaggi diversi da quello\r\n if (ths) {\r\n // Definisco se la colonna è visibile in base alla sua rappresentazione locale in ColumnsList\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n th.thVisible = !!(th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible));\r\n if (th.thFixed || th.thGroup)\r\n fixedThs[th.th] = true;\r\n }\r\n }\r\n\r\n if (tds) {\r\n // Definisco se la cella è visibile in base alla sua rappresentazione locale in ColumnsList\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n td.tdVisible = !!(fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible));\r\n }\r\n }\r\n\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * Allinea gli ordinamenti dati fra le **EsThs** e le informazioni all'interno della View bindata\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n public alignHeadersOrdering(ths: EsThDirective[], view: AppSearch<any>) {\r\n let orders = view ? view.orders : this.est.arrayOrders;\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n th.thOrder = undefined;\r\n for (let i = 0; i < orders.length; i++) {\r\n let or = orders[i];\r\n if (or.id == th.th)\r\n th.thOrder = or.order;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Genera tutte le informazioni che servono per gestire il raggruppamento degli header\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n *\r\n * @returns {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} Oggetto contenente la lista delle foglie (header base), il livello\r\n * massimo di raggruppamento raggiunto, una cache in cui vengono indicati tutti i gruppi che sono \"parent\" (quindi che raggruppano almeno 1 header) e la cache degli header\r\n */\r\n public evaluateHeadersGroupingInfos(ths: EsThDirective[]): { leafs: EsThDirective[]; groupingLevel: number; parentsCache: any; thsCache: any; } {\r\n // Pregiro per trovare i parent\r\n let parentsCache: { [index: string]: boolean; } = {};\r\n let thsCache: { [index: string]: EsThDirective; } = {};\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n thsCache[th.th] = th;\r\n if (th.thParent && !parentsCache[th.thParent])\r\n parentsCache[th.thParent] = true;\r\n }\r\n\r\n // Secondo giro per beccare il livello massimo e la lista di foglie (th senza parent)\r\n let hMaxLevel = 0;\r\n let leafs: any[] = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n\r\n // Se sono una foglia vedo quanti livelli ci sono sopra\r\n if (!parentsCache[th.th]) {\r\n leafs.push(th);\r\n let tmp = this.jumpsToFinalParent(th, thsCache);\r\n hMaxLevel = tmp > hMaxLevel ? tmp : hMaxLevel;\r\n }\r\n }\r\n\r\n return { leafs: leafs, groupingLevel: hMaxLevel, parentsCache: parentsCache, thsCache: thsCache };\r\n }\r\n\r\n /**\r\n * Genera gli header groups da una lista di info sui th all'interno della variabile **TMPRowThGroups**\r\n *\r\n * @param {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} infos Informazioni di raggruppamento valutate precedentemente\r\n */\r\n public evaluateHeaderGroups(infos: { leafs: EsThDirective[]; groupingLevel: number; parentsCache: any; thsCache: { [index:string]: EsThDirective}; }) {\r\n if (infos.groupingLevel == 0)\r\n return;\r\n\r\n /****** STEP 1: Creo l'output dei raggruppamenti per header in modo da non dovermi preoccupare di celle non inizializzate ******/\r\n\r\n let expandedGroups: string[][] = [];\r\n let visibleUnpinnedLeafs: EsThDirective[] = (<any[]>infos.leafs).filter((t: EsThDirective) => t.thVisible && t.thIf && !t.thPinned);\r\n for (let l = 0; l < infos.groupingLevel; l++) {\r\n expandedGroups.push([]);\r\n for (let i = 0; i < visibleUnpinnedLeafs.length; i++)\r\n expandedGroups[l].push(\"\");\r\n }\r\n\r\n /****** STEP 2: Ordino le foglie in base agli ordinamenti delle colonne ******/\r\n let orderedLeafs = [];\r\n for (let i = 0; i < this.est.OrderDirectives.length; i++) {\r\n let leaf: EsThDirective = infos.thsCache[this.est.OrderDirectives[i]];\r\n\r\n // Solo se la leaf è presente. Potrebbero esserci ordinamenti su colonne sparite\r\n if (leaf && leaf.thVisible && leaf.thIf && !leaf.thPinned)\r\n orderedLeafs.push(leaf);\r\n }\r\n\r\n /****** STEP 3: Creo l'array group con tutti i riferimenti del caso ******/\r\n let currentParent: string | null = \"\";\r\n for (let i = 0; i < orderedLeafs.length; i++) {\r\n let refTh: EsThDirective = orderedLeafs[i];\r\n let prevTh: EsThDirective | null = i - 1 >= 0 ? orderedLeafs[i - 1] : null;\r\n\r\n // Parent diverso da prima, metto il bordo a sinistra e a destra della cella precedente (se c'è)\r\n // All'ultimo giro metto il bordo a destra. Tutto questo lo rieseguo per ogni cella in modo da ripulire eventuali a cui avevo assegnato tag precedentemente\r\n (<any>refTh)._lbord = refTh.thParent != currentParent;\r\n (<any>refTh)._rbord = visibleUnpinnedLeafs.length == i + 1;\r\n if (prevTh)\r\n (<any>prevTh)._rbord = refTh.thParent != currentParent;\r\n\r\n currentParent = refTh.thParent;\r\n\r\n // Per ogni gruppo srotolo il parent nella matrice dei raggruppamenti\r\n for (let l = 0; l < infos.groupingLevel; l++) {\r\n let parent = refTh.thParent;\r\n if (parent && !refTh.thPinned) {\r\n expandedGroups[l][i] = parent;\r\n refTh = infos.thsCache[parent];\r\n }\r\n }\r\n }\r\n\r\n /****** STEP 4: Compatto nell'elemento finale su cui bindarmi. L'ID assegnato è SOLO per ottimizzare gli ngFor ******/\r\n\r\n currentParent = \"\";\r\n let currentSpan = 0;\r\n let finalHeaders: ThGroup[][] = [];\r\n for (let l = 0; l < expandedGroups.length; l++) {\r\n let levelArray: ThGroup[] = [];\r\n finalHeaders.push(levelArray);\r\n\r\n if (this.est.Selection() || this.est.HasPinnedColumns())\r\n levelArray.push({ ID: \"_base_sel_pinned\", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns() });\r\n\r\n for (let h = 0; h < expandedGroups[l].length; h++) {\r\n let item = expandedGroups[l][h];\r\n if (item == currentParent)\r\n currentSpan++;\r\n else {\r\n if (currentSpan > 0)\r\n levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : undefined, Borders: !!currentParent });\r\n currentSpan = 1;\r\n currentParent = item;\r\n }\r\n }\r\n\r\n // Ultima aggiunta che altrimenti mi rimarrebbe in cache\r\n levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : undefined , Borders: !!currentParent });\r\n\r\n // Aggiungo i pezzettini per la rimozione e gli export, se presenti\r\n if (this.est.Removal())\r\n levelArray.push({ ID: \"_base_removal\", Span: 1, Template: null });\r\n\r\n if (this.est.Export() || this.est.HiddenColumns() || this.est.ColumnsOrdering() || this.est.CornerMenuOptions())\r\n levelArray.push({ ID: \"_base_extra_opts\", Span: 1, Template: null });\r\n\r\n currentSpan = 0;\r\n currentParent = \"\";\r\n }\r\n\r\n /****** STEP 5: Secco le righe in cui non c'è nulla ******/\r\n\r\n this.est.TMPRowThGroups = [];\r\n\r\n for (let i = 0; i < finalHeaders.length; i++) {\r\n let level = finalHeaders[i];\r\n let empty = true;\r\n for (let j = 0; j < level.length; j++) {\r\n let item = level[j];\r\n if (item.Template || item.Content) {\r\n empty = false;\r\n break;\r\n }\r\n }\r\n\r\n if (!empty)\r\n this.est.TMPRowThGroups.push(level);\r\n }\r\n }\r\n\r\n /**\r\n * Calcola il numero di salti da un header foglia all'ultimo parent della catena\r\n *\r\n * @param {EsThDirective} th Header da cui scorrere i padri per capire quanti livelli ci sono sopra\r\n * @param {{ [index: string]: EsThDirective }} thsCache Cache degli header\r\n */\r\n private jumpsToFinalParent(th: EsThDirective, thsCache: { [index: string]: EsThDirective; }) {\r\n let jumps = 0; let parent = null; let parentsPrepend: { id: string, tmpl?: TemplateRef<any> | null, content?: string }[] = [];\r\n let baseThRef = th;\r\n do {\r\n parent = th.thParent;\r\n if (parent) {\r\n th = thsCache[parent];\r\n if (!th.thEmpty && !th._multi_content)\r\n parentsPrepend.unshift({ id: th.th, tmpl: th.Template });\r\n else if (!th.thEmpty && th._multi_content)\r\n parentsPrepend.unshift({ id: th.th, content: th._multi_content });\r\n jumps++;\r\n }\r\n } while (parent);\r\n baseThRef._thParents = parentsPrepend;\r\n return jumps;\r\n }\r\n\r\n /**\r\n * Metodo che genera l'ordine di default delle colonne\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n */\r\n public generateDefaultOrder(ths: EsThDirective[], view: AppSearch<any>) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n //*********************************************** Fix ordinamenti per colonne sparite ****************************** */\r\n // Considero solo gli ordinamenti per colonne effettivamente presenti all'interno della tabella\r\n if (this.est.viewMode())\r\n view.column_ordering = view.column_ordering.filter(ord => ths.find(t => t.th == ord));\r\n //*********************************************** Fix ordinamenti per colonne sparite ****************************** */\r\n\r\n let orderings = this.est.viewMode() ? view.column_ordering : this.est.arrayColumnOrdering;\r\n\r\n // Genero ordinamento di default da 0 fino a dove deve arrivare. Situazione attuale senza hotpotato\r\n if (!orderings || orderings.length == 0) {\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let order = th.th;\r\n this.est.OrderDirectives.push(order);\r\n }\r\n }\r\n else {\r\n this.est.OrderDirectives = orderings;\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let thId = th.th;\r\n if (!this.est.OrderDirectives.find(o => o == thId))\r\n this.est.OrderDirectives.push(thId);\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Applica l'ordine specificato alle varie colonne\r\n *\r\n * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione\r\n * @param {boolean} finalize Se **true** significa che non mi aspetto di dover effettuare altre operazioni e posso renderizzare la situazione in base ai RowContext\r\n * Senza finalize significa che mi aspetto altre operazioni che prima o poi richiameranno questa funzione col finalize.\r\n *\r\n * Ad esempio, una volta selezionato ordinamento fisico/logico delle colonne so che parte un altra ricerca che mi rivalorizzerà da \"writeValue\", che già chiama questa funzione.\r\n * Mettendo solo la chiamata da \"writeValue\" come \"finalizzante\" mi assicuro che smanattamenti a frontend non causino flickering fino a quando non servono\r\n */\r\n public applyOrdering(view: AppSearch<any> | null, finalize: boolean) {\r\n // Genero ordinamento per gli header\r\n let newHeaders: ThElement[] = [];\r\n\r\n // Se devo finalizzare aggancio tutte le variabili di bind\r\n if (finalize) {\r\n // Mappa ID -> header costruita una sola volta (evita il .filter() lineare per ogni OrderDirective)\r\n let headersById = new Map<any, ThElement>();\r\n for (let h = 0; h < this.est.TMPRowTHs.length; h++) {\r\n let header = this.est.TMPRowTHs[h];\r\n if (!headersById.has(header.ID))\r\n headersById.set(header.ID, header);\r\n }\r\n this.est.OrderDirectives.forEach(o => {\r\n let heaedrItem = headersById.get(o);\r\n if (heaedrItem)\r\n newHeaders.push(heaedrItem);\r\n });\r\n this.est.TMPRowTHs = newHeaders;\r\n\r\n // Genero ordinamento per le celle\r\n for (let i = 0; i < this.est.RowContexts.length; i++) {\r\n let context = this.est.TMPRowTDs[this.est.RowContexts[i]];\r\n let newContext: WritableSignal<TdElement>[] = [];\r\n\r\n // Mappa ID -> signal costruita una sola volta per riga: il getter del signal viene invocato\r\n // una volta per cella invece di una volta per ogni (colonna × OrderDirective)\r\n let contextById = new Map<any, WritableSignal<TdElement>>();\r\n for (let c = 0; c < context.length; c++) {\r\n let id = context[c]().ID;\r\n if (!contextById.has(id))\r\n contextById.set(id, context[c]);\r\n }\r\n\r\n this.est.OrderDirectives.forEach(o => {\r\n let contextItem = contextById.get(o);\r\n // potrebbe esser undefined nel caso ci fossero colonne sotto thIf\r\n if(contextItem)\r\n newContext.push(contextItem);\r\n });\r\n\r\n this.est.TMPRowTDs[this.est.RowContexts[i]] = newContext;\r\n }\r\n }\r\n\r\n if (this.est.viewMode() && view)\r\n view.column_ordering = this.est.OrderDirectives;\r\n else\r\n this.est.arrayColumnOrdering = this.est.OrderDirectives;\r\n\r\n this.est.changed();\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" mette la colonna specificata prima della colonna precedente\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public sendUp(columnItem: EsTableColumn) {\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n if (this.est.TMPColumnsList[itemIndex - 1].fixed || this.est.TMPColumnsList[itemIndex - 1].pinned)\r\n return;\r\n this.utiExts.swap(this.est.TMPColumnsList, itemIndex, itemIndex - 1);\r\n\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n let tmp: EsTableColumn[] = [];\r\n this.est.TMPColumnsList.forEach(c => { tmp.push(Object.assign({}, c)); });\r\n this.est.TMPColumnsList = tmp;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" mette la colonna specificata dopo la colonna successiva\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public sendDown(columnItem: EsTableColumn) {\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n this.utiExts.swap(this.est.TMPColumnsList, itemIndex, itemIndex + 1);\r\n\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n let tmp: EsTableColumn[] = [];\r\n this.est.TMPColumnsList.forEach(c => { tmp.push(Object.assign({}, c)); });\r\n this.est.TMPColumnsList = tmp;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" pinna la colonna specificata\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public pinOrUnpinColumn(columnItem?: EsTableColumn) {\r\n if(!columnItem)\r\n return;\r\n\r\n let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);\r\n if (!columnItem.pinned) {\r\n columnItem.prev_index = itemIndex;\r\n\r\n //Quando pinno devo spostare l'elemento come ultima colonna pinnata o come prima colonna se non ce ne sono di pinnate\r\n for (let i = 0; i < this.est.TMPColumnsList.length; i++) {\r\n if (!this.est.TMPColumnsList[i].pinned) {\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, i);\r\n break;\r\n }\r\n }\r\n }\r\n else {\r\n //Quando spinno riporto l'elemento allo stesso indice in cui era prima (se sono stati fatti spostamenti nel mezzo cazzi dell'utente)\r\n if (columnItem.prev_index != null && columnItem.prev_index != undefined)\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, columnItem.prev_index);\r\n else {\r\n // Se spinno senza un prev_index vuol dire che la colonna era pinnata da configurazione. La sposto nel primo punto disponibile\r\n for (let i = 0; i < this.est.TMPColumnsList.length; i++) {\r\n if (!this.est.TMPColumnsList[i].pinned && !this.est.TMPColumnsList[i].fixed) {\r\n this.utilities.arrayMove(this.est.TMPColumnsList, itemIndex, i - 1);\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n\r\n columnItem.pinned = !columnItem.pinned;\r\n }\r\n\r\n /**\r\n * All'interno della dialog \"Ordinamento e Visibilità Colonne\" inverte le impostazioni di visibilità della colonna\r\n *\r\n * @param {EsTableColumn} columnItem Colonna da spostare\r\n */\r\n public columnClicked(item: EsTableColumn) {\r\n this.est.lastSelectedItemID = item.id;\r\n if (!this.est.HiddenColumns || item.fixed)\r\n return;\r\n\r\n item.visible = !item.visible;\r\n this.updateGlobalColVisCheck();\r\n }\r\n\r\n /** All'apertura della dialog \"Ordinamento e Visibilità Colonne\" ricarica le informazioni attuali per permettere la modifica */\r\n public resetColumnVisSelection() {\r\n this.est.TMPColumnsList = [];\r\n // Non posso fare JSON.parse(JSON.stringify(this.ColumnsList)) perché contiene riferimenti a TemplateRef\r\n this.est.TMPColumnsList = [];\r\n this.est.ColumnsList.forEach(c => { this.est.TMPColumnsList.push(Object.assign({}, c)); });\r\n\r\n let reorderedColList: EsTableColumn[] = [];\r\n\r\n if (this.est.ColumnsOrdering()) {\r\n this.est.OrderDirectives.forEach(o => {\r\n let column = this.est.TMPColumnsList.filter(t => t.id == o)[0];\r\n // Potrei non averne nel caso ci sia il flag HiddenColumns a false, evito di inserire degli undefined\r\n if (column)\r\n reorderedColList.push(column);\r\n });\r\n\r\n this.est.TMPColumnsList = reorderedColList;\r\n }\r\n\r\n this.updateGlobalColVisCheck();\r\n }\r\n\r\n /** Riaggiorna le **OrderDirectives** con le informazioni in **ColumnsList** */\r\n private refreshColumnOrdering() {\r\n this.est.OrderDirectives = [];\r\n\r\n for (let c = 0; c < this.est.ColumnsList.length; c++)\r\n this.est.OrderDirectives.push(this.est.ColumnsList[c].id);\r\n }\r\n\r\n /** Effettua la selezione o meno del check globale (**globalColVisCheck**) di visibilità in base a se tutte le **TMPColumnsList** sono visibili o no */\r\n public updateGlobalColVisCheck() {\r\n // TMPColList viene riempita di undefined nel caso in cui sia disattivata la selezione delle colonne nascoste\r\n this.est.globalColVisCheck.set(this.est.TMPColumnsList.every(t => t.visible));\r\n }\r\n\r\n /**\r\n * Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne\r\n * \r\n * @param {CdkDragDrop<EsTableColumn[]>} event Evento di drop della lista\r\n */\r\n public columnReordered(event: CdkDragDrop<EsTableColumn[]>) {\r\n moveItemInArray(event.container.data, event.previousIndex, event.currentIndex);\r\n }\r\n\r\n /**\r\n * Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne\r\n * \r\n * @param {number} index Indice in cui voglio droppare l'elemento draggato\r\n * @param {CdkDrag<EsTableColumn>} item Oggetto che sto draggando\r\n * \r\n * @returns {boolean} **true** se la colonna può essere spostata sull'indice **index**, **false** altrimenti\r\n */\r\n public sortPredicate(index: number, item: CdkDrag<EsTableColumn>): boolean {\r\n let itemAtIndex = this.est.ColumnsList[index];\r\n return !itemAtIndex.fixed && !itemAtIndex.pinned && !item.data.pinned && !item.data.pinned;\r\n }\r\n\r\n /**\r\n * Funzione che effettua la conferma della visibilità e dell'ordine delle colonne.\r\n *\r\n * Questa selezione viene inoltre salvata nelle preferenze (**@esfaenza/preferences**), qualora l'Input **SavePreferences** fosse valorizzato\r\n *\r\n * @returns {boolean} **true** se non ci sono problemi, **false** altrimenti\r\n */\r\n public confirmColumnVisibilitySelection(): boolean {\r\n // Non permetto di non selezionare nulla\r\n if (this.est.TMPColumnsList.every(t => !t.visible))\r\n return false;\r\n\r\n let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View as AppSearch<any>) : null;\r\n this.est.ColumnsList = [];\r\n this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });\r\n\r\n this.refreshColumnOrdering();\r\n this.applyOrdering(castedView, false);\r\n\r\n this.refreshColumnsVisibility(null, null, castedView);\r\n\r\n //Salvo le preferences di questa view\r\n //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI\r\n if (this.est.SavePreferences()) \r\n this.registerViewPreferences(castedView);\r\n\r\n // Rieseguo l'ultima ricerca bindata alla tabella\r\n // Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono\r\n if (this.est.viewMode())\r\n setTimeout(() => {\r\n if (this.est.MainGroupView) {\r\n for (let i = 0; i < this.est.groupSearchRequestsCache.length; i++) {\r\n let view = this.est.groupSearchRequestsCache[i].view;\r\n view.columns = this.est.MainGroupView.columns;\r\n view.column_ordering = this.est.MainGroupView.column_ordering;\r\n this.est.emitSearchRequest(true, this.est.groupSearchRequestsCache[i].view);\r\n }\r\n }\r\n\r\n else\r\n this.est.emitSearchRequest(true);\r\n });\r\n else if (this.est.arrayMode())\r\n setTimeout(() => { this.est.internalWriteValue(); });\r\n\r\n // Lo vorrei mettere lato template ma no\r\n this.est.lastSelectedItemID = null;\r\n return true;\r\n }\r\n\r\n /**\r\n * Effettuo l'unpinning di una colonna in maniera programmatica semplicemente eseguendo una per una le operazioni che verrebbero eseguite altrimenti\r\n *\r\n * @param {string} id Codice della colonna da spinnare\r\n */\r\n public unpinColumn(id: string) {\r\n this.resetColumnVisSelection();\r\n this.pinOrUnpinColumn(this.est.TMPColumnsList.find(t => t.id == id));\r\n this.confirmColumnVisibilitySelection();\r\n }\r\n\r\n /** Sul click nella checkbox di selezione globale si scorrono tutte le colonne e si impostano al valore della check globale */\r\n public globalColVisCheckChanged() {\r\n this.est.TMPColumnsList.forEach(t => {\r\n if (!t.fixed)\r\n t.visible = this.est.globalColVisCheck();\r\n });\r\n }\r\n}\r\n","import { InputType } from \"../types\";\r\n\r\n/** Classe che identifica una colonna. Utilizzata in modalità \"Colonne dinamiche\" */\r\nexport class EsTableColumnsDefinition {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} Description Descrizione della colonna\r\n * @param {string} PropertyName Nome della proprietà del modello in cui sono contenuti i dati da visualizzare per questa colonna\r\n * @param {string} RoutePath Route di navigazione. Es. \"['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]\"\r\n * @param {string[]} RouteParameterProperties Proprietà da bindare a **routePath** per generare la route completa. \r\n * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. [\"iditem\", \"iditem2\"]\r\n * @param {'ASC' | 'DESC' } DataOrder Ordinamento dei dati presentati in questa colonna\r\n * @param {number} ColumnOrder Ordinamento di questa colonna\r\n * @param {boolean} Visible Visibilità o meno della colonna\r\n * @param {string} Clss Classe da applicare sia ai TD che ai TH relativi a questa colonna\r\n * @param {boolean} Orderable Indica se la colonna è ordinabile o no (nel senso ASC / DESC / NONE)\r\n * @param {boolean} HeaderWraps Indica se il testo dell'header dev'essere wrappato all'interno del th. Di default no.\r\n * @param {InputType | string} PropertyType Indica il tipo della proprietà identificata da **propertyName**.\r\n * @param {{id: string, description: string}[]} PropertySource Sorgente dati su cui autocompletare/scegliere il valore per la proprietà **propertyName**, ha senso solo per **propType** enum o autocomplete.\r\n * @param {string} EditorName Nome dell'editor da utilizzare per la modifica di questo campo\r\n * @param {string} RendererName Nome del renderer da utilizzare per visualizzare questo campo\r\n * @param {string} Format Nome del renderer da utilizzare per visualizzare questo campo\r\n */\r\n constructor(\r\n public Description: string,\r\n public PropertyName: string,\r\n public RoutePath: string = null,\r\n public RouteParameterProperties: string[] = null,\r\n public DataOrder: 'ASC' | 'DESC' = null,\r\n public ColumnOrder: number = null,\r\n public Visible: boolean = true,\r\n public Clss: string = null,\r\n public Orderable: boolean = true,\r\n public HeaderWraps: boolean = false,\r\n public PropertyType: InputType | string = null,\r\n public PropertySource: { id: string, description: string }[] = [],\r\n public EditorName: string = \"\",\r\n public RendererName: string = \"\",\r\n public EditorOptions: { [id: string]: any } = {},\r\n public Pinned : boolean = false,\r\n public PinnedWidth : number = 150,\r\n public Pinnable : boolean = true,\r\n public Grouping: string = \"\",\r\n public Shrink: boolean = false,\r\n public Format?: string) {\r\n }\r\n\r\n static build(parsObj: any): EsTableColumnsDefinition {\r\n\r\n return new EsTableColumnsDefinition(\r\n parsObj.Description,\r\n parsObj.PropertyName,\r\n parsObj.RoutePath,\r\n parsObj.RouteParameterProperties,\r\n parsObj.DataOrder,\r\n parsObj.ColumnOrder,\r\n parsObj.Visible || true,\r\n parsObj.Clss,\r\n parsObj.Orderable || true,\r\n parsObj.HeaderWraps,\r\n parsObj.PropertyType,\r\n parsObj.PropertySource,\r\n parsObj.EditorName,\r\n parsObj.RendererName,\r\n parsObj.Pinned,\r\n parsObj.Grouping,\r\n parsObj.Shrink,\r\n parsObj.Format\r\n );\r\n }\r\n\r\n}","// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Dominio\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { EsTableOperationDefinition } from \"../../domain/externals/EsTableOperationDefinition\";\r\n\r\n/** Classe contenente le gestioni particolari della modalità dinamica dell'es-table */\r\nexport class DynamicModeHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent) { }\r\n\r\n /** Se non ho l'Input **DynamicRowColumnsDefinition** in modalità dinamica lo riempio con il default nome della colonna = testo della colonna */\r\n public eventuallyReviewDynamicColumns() {\r\n // Senza oggetti esco\r\n if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)\r\n return;\r\n\r\n var useGenericItems = !!this.est.TMPBoundSource[0][\"properties\"];\r\n if (!useGenericItems || (!this.est.FirstBind() && this.est.DynamicRowColumnsDefinition()?.length > 0))\r\n return;\r\n\r\n if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0) {\r\n var props = <Record<string, string>>this.est.TMPBoundSource[0][\"properties\"];\r\n\r\n let drcd = [];\r\n for (let key in props)\r\n drcd.push(new EsTableColumnsDefinition(key, key));\r\n\r\n this.est.DynamicRowColumnsDefinition.set(drcd);\r\n this.est.UserDefinedDynamicCols.set(false);\r\n }\r\n else\r\n this.est.UserDefinedDynamicCols.set(true);\r\n }\r\n\r\n /** Genera partendo dalle **DynamicRowColumnsDefinition** la lista di **EsThDirective** e **EsTdDirective** che servono per la tabella */\r\n public emitThsAndTdsBasedOnDynamicDefinition(): { ths: EsThDirective[], tds: EsTdDirective[] } {\r\n // Senza dynamic columns esco\r\n if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0)\r\n return null;\r\n\r\n let ths = [];\r\n let tds = [];\r\n\r\n for (let i = 0; i < this.est.DynamicOperations().length; i++) {\r\n let op = this.est.DynamicOperations()[i];\r\n \r\n ths.push(this.getThFromOperation(op));\r\n tds.push(this.getTdFromOperation(op));\r\n }\r\n\r\n for (let i = 0; i < this.est.DynamicRowColumnsDefinition().length; i++) {\r\n let col = this.est.DynamicRowColumnsDefinition()[i];\r\n\r\n ths.push(this.getThFromColumnDef(col));\r\n tds.push(this.getTdFromColumnDef(col));\r\n }\r\n return { ths, tds };\r\n }\r\n\r\n /** @ignore Helper */\r\n private getThFromOperation(op: EsTableOperationDefinition): EsThDirective {\r\n let th = new EsThDirective(null);\r\n th.th = op.id;\r\n th.thFixed = true;\r\n th.thVisible = true;\r\n th.thStaticContent = \"\";\r\n return th;\r\n }\r\n\r\n private getTdFromOperation(op: EsTableOperationDefinition): EsTdDirective {\r\n let td = new EsTdDirective(null);\r\n td.td = op.id;\r\n td.tdVisible = true;\r\n td.tdIconClass = op.iconClass;\r\n td.tdConditionField = op.conditionField;\r\n td.tdConditionValue = op.conditionValue;\r\n td.tdTitle = op.title;\r\n td.tdContent = op.text;\r\n return td;\r\n }\r\n\r\n private getThFromColumnDef(col: EsTableColumnsDefinition): EsThDirective {\r\n var ret = new EsThDirective(null);\r\n ret.th = col.PropertyName;\r\n ret.thPinned = col.Pinned;\r\n ret.thPinnable = col.Pinnable;\r\n ret.thPinnedWidth = col.PinnedWidth;\r\n ret.thVisible = col.Visible;\r\n ret.thOrder = col.DataOrder;\r\n ret.thOrderable = col.Orderable;\r\n ret.thWrap = col.HeaderWraps;\r\n ret.thClass = col.Clss;\r\n ret.thProperty = col.PropertyName;\r\n ret.thType = col.PropertyType;\r\n ret.thSource = col.PropertySource;\r\n ret.thEditorName = col.EditorName;\r\n ret.thEditorOptions = col.EditorOptions\r\n ret.thRendererName = col.RendererName;\r\n ret.thRoutePath = col.RoutePath;\r\n ret.thRouteParameterProperties = col.RouteParameterProperties;\r\n ret.thStaticContent = col.Description;\r\n ret.thFormat = col.Format ?? \"\";\r\n\r\n //ret.thFixed = col.Fixed;\r\n //ret.thResizable = col.Resizable;\r\n //ret.thGroupClass = col.GroupClass;\r\n //ret.thGroup = col.Group;\r\n //ret.thAggregation = col.Aggregation;\r\n //ret.thMulti = col.Multi;\r\n //ret.thBackgroundColor = col.BackgroundColor;\r\n //ret.thAlignment = col.Alignment;\r\n //ret.thFormat = col.Format;\r\n return ret;\r\n }\r\n\r\n /** @ignore Helper */\r\n private getTdFromColumnDef(col: EsTableColumnsDefinition): EsTdDirective {\r\n var ret = new EsTdDirective(null);\r\n ret.td = col.PropertyName;\r\n ret.tdClass = col.Clss;\r\n //ret.tdAlignment = col.Alignment;\r\n //ret.tdFormat = col.Format;\r\n return ret;\r\n }\r\n}\r\n","import { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n/** Classe contenente la gestione della modalità gerarchica */\r\nexport class HierarchyModeHandler {\r\n\r\n /** @ignore Costruttore*/\r\n constructor(private est: EsTableComponent) { }\r\n\r\n /**\r\n * Data una lista di oggetti assegno il livello gerarchico rispetto alla lista di oggetti passata\r\n *\r\n * @param {any[]} objs Lista di oggetti a cui aggiungere l'informazione del livello gerarchico\r\n */\r\n public assignHierarchyLevels(objs: any[]) {\r\n // Casistica input nullo\r\n if (!objs || !objs.length)\r\n return;\r\n\r\n //Se mancano entrambe le info le cerco di valorizzare in automatico coi default \"parentid\" e \"id\" (posto che le props esistano nell'oggetto)\r\n if (!this.est.ParentKey() && !this.est.OwnKey()) {\r\n if (objs[0]['parentid'] !== undefined)\r\n this.est.ParentKey.set('parentid');\r\n if (objs[0]['id'] !== undefined)\r\n this.est.OwnKey.set('id');\r\n }\r\n\r\n //Check finale per assicurarmi che le props ci siano\r\n if (!this.est.ParentKey() || !this.est.OwnKey()) {\r\n console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');\r\n return;\r\n }\r\n\r\n // Valorizzazione campi level, expanded, e visible per ogni item\r\n let currentLevel = 1;\r\n let assigned = 0;\r\n do {\r\n assigned = this.assignLevel(objs, currentLevel);\r\n currentLevel++;\r\n } while (assigned > 0);\r\n // butto su lato html e poi me la gioco là con padding = 20 * (level - 1) per far capire il diverso livello\r\n\r\n if(this.est.AutoSortHierarchy)\r\n this.orderItemsInPlace(objs);\r\n }\r\n\r\n private orderItemsInPlace(items: any[]) {\r\n let ownKey = this.est.OwnKey();\r\n let parentKey = this.est.ParentKey();\r\n\r\n const childrenMap = new Map();\r\n\r\n // Build parent -> children map\r\n for (const item of items) {\r\n const parent = item[parentKey] || null;\r\n\r\n if (!childrenMap.has(parent))\r\n childrenMap.set(parent, []);\r\n\r\n childrenMap.get(parent).push(item);\r\n }\r\n\r\n // Sort siblings by id\r\n for (const group of childrenMap.values()) {\r\n group.sort((a, b) => a[ownKey] - b[ownKey]);\r\n }\r\n\r\n // Rewrite original array in hierarchical order\r\n let write = 0;\r\n\r\n function visit(parentKey = null) {\r\n const children = childrenMap.get(parentKey);\r\n if (!children) return;\r\n\r\n for (const item of children) {\r\n items[write++] = item;\r\n visit(item[ownKey]);\r\n }\r\n }\r\n\r\n visit(null);\r\n }\r\n\r\n /**\r\n * Per ognuno degli oggetti passati gli assegna un livello di gerarchia in base a **ParentKey** e **OwnKey**\r\n *\r\n * @param {any[]} objs Oggetti a cui assegnare il livello di gerarchia\r\n * @param {number} levelToAssign Livello che sta assegnando attualmente questa iterazione (dato che è ricorsiva)\r\n *\r\n * @returns {number} Numero di oggetti a cui è stato assegnato un livello gerarchico\r\n */\r\n private assignLevel(objs: any[], levelToAssign: number): number {\r\n let assigned = 0;\r\n let own = this.est.OwnKey();\r\n let parent = this.est.ParentKey();\r\n let expanded = this.est.StartsExpanded();\r\n for (let i = 0; i < objs.length; i++) {\r\n let obj = objs[i];\r\n\r\n // Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)\r\n if (!obj[parent] && levelToAssign == 1) {\r\n obj._level = 1;\r\n obj._visible = true;\r\n obj._expanded = expanded;\r\n assigned++;\r\n continue;\r\n }\r\n\r\n // Per i livelli superiore al primo\r\n if (obj[parent] && levelToAssign > 1) {\r\n // trovo il parent\r\n for (let p = 0; p < objs.length; p++) {\r\n let possibleParent = objs[p];\r\n\r\n // Trovato il parent dell'item, assegno all'item il livello giusto\r\n if (possibleParent[own] == obj[parent] && possibleParent._level == levelToAssign - 1) {\r\n obj._level = levelToAssign;\r\n\r\n // So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica\r\n // per la visibilità del figlio\r\n possibleParent._expanded = expanded;\r\n possibleParent.parent = true;\r\n obj._visible = expanded;\r\n assigned++;\r\n break;\r\n }\r\n }\r\n }\r\n }\r\n return assigned;\r\n }\r\n\r\n /**\r\n * Funzione che permette di effettuare l'espansione di un parent quando la tabella funziona in modalità gerarchica\r\n *\r\n * @param {string} key Chiave del parent da espandere\r\n */\r\n public expandParent(key: string) {\r\n let bs = this.est.boundSource();\r\n let own = this.est.OwnKey();\r\n let parent = this.est.ParentKey();\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let obj = bs[i];\r\n\r\n // Trovo il parent con quell'id e lo espando\r\n if (obj[own] == key) {\r\n obj._expanded = true;\r\n\r\n for (let ic = 0; ic < bs.length; ic++) {\r\n let child = bs[ic];\r\n\r\n // Trovo tutti i child di quel parent e li rendo visibili\r\n if (child[parent] == key)\r\n child._visible = true;\r\n }\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che permette di effettuare il collapse di un parent quando la tabella funziona in modalità gerarchica\r\n *\r\n * @param {string} key Chiave del parent da collassare\r\n */\r\n public collapseParent(key: string) {\r\n let bs = this.est.boundSource();\r\n let own = this.est.OwnKey();\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let obj = bs[i];\r\n\r\n // Trovo il parent con quell'id e lo collasso\r\n if (obj[own] == key) {\r\n obj._expanded = false;\r\n\r\n // Collasso/nascondo tutti i child del parent\r\n this.collapseChildOfParent(key);\r\n return;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Collassa ricorsivamente tutti i figli di un parent identificato dalla **parentKey**\r\n *\r\n * @param {string} parentKey Chiave del parent di cui collassare i figli\r\n */\r\n private collapseChildOfParent(parentKey: string) {\r\n let bs = this.est.boundSource();\r\n let parent = this.est.ParentKey();\r\n let own = this.est.OwnKey();\r\n\r\n for (let ic = 0; ic < bs.length; ic++) {\r\n let child = bs[ic];\r\n\r\n // Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,\r\n // lo collasso e vado in ricorsione sui figli\r\n if (child[parent] == parentKey && !child.parent)\r\n child._visible = false;\r\n else if (child[parent] == parentKey && child.parent) {\r\n child._expanded = false;\r\n child._visible = false;\r\n this.collapseChildOfParent(child[own]);\r\n }\r\n }\r\n }\r\n}\r\n","// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\n\r\n// Utilities\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n/** Classe che si occupa della gestione del recupero degli oggetti, paginazione e tutto ciò in cui gli elementi caricati vengono manipolati direttamente */\r\nexport class ItemsHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler) { }\r\n\r\n /**\r\n * In base alla modalità specificata (ArrayMode, ViewMode, ecc...) questo metodo recupera l'array di oggetti da bindare ad interfaccia\r\n *\r\n * @param {boolean} onlyselected [false] Indica di prendere solo gli oggetti selezionati\r\n * @param {boolean} refreshPaging [false] Indica se aggiornare le informazioni di paginazione o meno\r\n * @param {boolean} allIfPossible [false] Indica se prendere tutti gli oggetti quaora possibile, usato solo in ArrayMode\r\n *\r\n * @returns {any[]} Lista degli oggetti su cui effettuare il bind lato interfaccia\r\n */\r\n public getItemsByMode(onlyselected: boolean = false, refreshPaging: boolean = false, allIfPossible: boolean = false): any[] {\r\n let items: any[] = [];\r\n\r\n if ((this.est.viewMode() && this.est.View instanceof AppSearch)) {\r\n items = this.getViewItemsBySource();\r\n }\r\n else if (this.est.arrayMode()) {\r\n this.est.View.forEach(itm => { itm._item = true; });\r\n\r\n // Se faccio dei raggruppamenti ignoro la paginazione\r\n if (this.est.UseArrayModePaging() && !allIfPossible) {\r\n\r\n // Se sono in modalità array ma la ricerca dipende da una view devo riallineare gli itemperpage\r\n let fakeView = this.est.SearchView();\r\n if (fakeView) {\r\n this.est.ArraymodeItemsPerPage.set(fakeView.itemsperpageoverride);\r\n this.est.arraymodePage = fakeView.page;\r\n this.est.arraymodePages = fakeView.pages;\r\n }\r\n // Devo chiamare il refresh page solo se vengo richiamato da un binding esterno\r\n else if (refreshPaging)\r\n this.refreshPaging(this.est.ArraymodeItemsPerPage());\r\n\r\n items = this.adaptViewToPaging();\r\n } else {\r\n items = this.est.View as any[];\r\n }\r\n }\r\n\r\n // Se voglio solo i selezionati filtro\r\n if (onlyselected)\r\n return items.filter(t => t._selected);\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Metodo per effettuare il refresh della paginazione sul cambiamento degli oggetti da visualizzare in una singola pagina.\r\n *\r\n * Vale solo per la modalità Array\r\n *\r\n * @param {number} pageSize Dimensione della pagina\r\n */\r\n public refreshPaging(pageSize: number) {\r\n this.est.ArraymodeItemsPerPage.set(pageSize);\r\n this.est.arraymodePages = Math.ceil((this.est.View as any[]).length / pageSize);\r\n this.est.arraymodePage = 1;\r\n\r\n // Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca\r\n this.est.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Ottiene gli oggetti in base alla sorgente\r\n */\r\n private getViewItemsBySource(): any[] {\r\n let castedView = this.est.View as AppSearch<any>;\r\n let groupKeys = castedView.groupings ? castedView.groupings.filter(t => !t.aggregation).length : 0;\r\n\r\n //Gruppi intermedi\r\n if ((castedView.requestedgroups?.length != groupKeys || castedView.requestedgroups?.length == 0) && groupKeys > 0) {\r\n let ret = castedView.groups;\r\n ret.forEach(itm => {\r\n\r\n // Setto variabile interna per capire che questo è in realtà un gruppo\r\n (<any>itm)._group = true;\r\n\r\n // Le informazioni passate come lista le metto dentro a una cache per velocizzarne l'accesso quando devo tirare fuori il display della proprietà\r\n this.utilities.cacheAggregations(itm);\r\n });\r\n return ret;\r\n }\r\n else {\r\n let ret = this.est.ItemSourceProperty() ? (this.est.View as any)[this.est.ItemSourceProperty()] : (this.est.View as any).items;\r\n if (!ret) ret = [];\r\n // Setto variabile interna per specificare che questo è un elemento normale, non un gruppo o altro\r\n ret.forEach(itm => { (<any>itm)._item = true; });\r\n return ret;\r\n }\r\n }\r\n\r\n /** Genera le informazioni di paginazione e taglia la View in modalità array per mostrare solo gli oggetti della pagina specificata */\r\n private adaptViewToPaging() {\r\n let tmpItems: any[] = [];\r\n\r\n // Se ho una search view l'array pulsanti viene calcolato da lei, non devo prendere quello della modalità array,\r\n // inoltre non ho bisogno di fare ragionamenti su quanti elementi ci sono e sulla pagina, dato che viene tutto gestito esternamente, \r\n // unendo al risultato della view tutti gli oggetti addizionali\r\n if (!this.est.SearchView())\r\n this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.arraymodePage, this.est.arraymodePages));\r\n else\r\n return this.est.View as any[];\r\n\r\n // Applico eventuali oridnamenti lato Array prima di tirare fuori la pagina selezionata\r\n let items = (this.est.View as any[]);\r\n if (this.est)\r\n items = this.arrayModeReviewOrderings(items);\r\n\r\n // Poi per tutti i valori dopo compresi fra la pagina - 1 e la pagina\r\n for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage()); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage(); i++) {\r\n if (i <= items.length - 1)\r\n tmpItems.push(items[i]);\r\n }\r\n\r\n return tmpItems;\r\n }\r\n\r\n /** Se in modalità array applica gli ordinamenti ASC-DESC delle colonne */\r\n public arrayModeReviewOrderings(items: any[]): any[] {\r\n let tmp = items;\r\n if (this.est.arrayOrders.length > 0)\r\n this.est.arrayOrders.forEach(t => {\r\n tmp = tmp.sort((a, b) => (a[t.id] > b[t.id] ? 1 : -1) * (t.order == 'DESC' ? -1 : 1));\r\n });\r\n return tmp;\r\n }\r\n}\r\n","// Handlers\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\n\r\n// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\n\r\n/** Classe che gestisce la modalità Report dell'es-table utilizzata nel Metering */\r\nexport class ReportModeHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler) { }\r\n\r\n /** Metodo che si occupa di gestire la grafica della tabella in base alle informazioni di ordinamento colonne e paginazione contenuti nel modello */\r\n public reviewReportBindings() {\r\n\r\n // Allineo le informazioni su eventuali ordinamenti fatti precedentemente\r\n if (this.est.View.orders && this.est.View.orders.length > 0) {\r\n this.est.View.orders.forEach(t => {\r\n this.est.View.report_columns.filter(c => c.id == t.column)[0].order = t.order;\r\n });\r\n }\r\n\r\n // Recupero il count precedente se serve\r\n let count = this.est.View.objectcount;\r\n if (count != -2)\r\n this.est.previousCount = count;\r\n else if (count == -2)\r\n count = this.est.previousCount;\r\n\r\n let ipp = (this.est.View.itemsperpageoverride || 15);\r\n this.est.View.pages = Math.ceil(count / ipp);\r\n this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.View.page, this.est.View.pages));\r\n }\r\n\r\n /**\r\n * Data una AppSearch questo metodo genera la lista di th e td che si possono collegare al giro standard.\r\n * Se non ci fosse questo passaggio intermedio la gestione della modalità report sarebbe 100% custom, \r\n * come poi lo era prima che la facessi passare dal giro che fanno tutte le altre modalità\r\n * \r\n * @param {AppSearch<any>} view View in modalità report contenente le informazioni sulle colonne\r\n * \r\n * @returns {{ ths: EsThDirective[], tds: EsTdDirective[] }} Lista di direttive per gli header e per il body\r\n */\r\n public generateThsAndTdsFromView(view: AppSearch<any>): { ths: EsThDirective[], tds: EsTdDirective[] } {\r\n var ret = { ths: [], tds: [] };\r\n\r\n // Ordinamento per ora commentato... non vorrebbe mi fuckappasse tutto\r\n //view.report_columns.sort((c1, c2) => c1.seq || 0 - c2.seq || 0);\r\n \r\n for (let i = 0; i < view.report_columns.length; i++) {\r\n let clm = view.report_columns[i];\r\n\r\n var th = new EsThDirective(null);\r\n th.th = clm.id;\r\n th.thStaticContent = clm.description || null;\r\n th.thBackgroundColor = clm.color;\r\n th.thAlignment = <\"Center\" | \"Left\" | \"Right\">clm.alignment;\r\n th.thFormat = clm.format;\r\n\r\n var td = new EsTdDirective(null);\r\n td.td = clm.id;\r\n td.tdPropertyAccessor = i.toString();\r\n td.tdAlignment = <\"Center\" | \"Left\" | \"Right\">clm.alignment;\r\n td.tdFormat = clm.format;\r\n\r\n ret.ths.push(th);\r\n ret.tds.push(td);\r\n }\r\n\r\n return ret;\r\n }\r\n}\r\n","import { GroupAggregation } from \"./GroupAggregation\";\r\n\r\n/** Classe che rappresenta un Gruppo con le proprie aggregazioni */\r\nexport class Group {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column ID della colonna raggruppata\r\n * @param {number} count Numero di elementi raggruppati sotto questa colonna\r\n * @param {string} value Valore del Gruppo\r\n */\r\n constructor(\r\n public column: string,\r\n public count: number,\r\n public value: string) {\r\n\r\n this.aggregations = [];\r\n }\r\n\r\n /** Aggregazioni presenti su questo gruppo, valide per tutte le altre colonne (non a loro volta gruppate) */\r\n public aggregations: GroupAggregation[];\r\n}","/** Classe che rappresenta un'aggregazione */\r\nexport class GroupAggregation {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} column ID della colonna aggregata\r\n * @param {'min' | 'max' | 'sum' } aggregation Aggregazione da effettuare su questa colonna\r\n * @param {string} value Valore dell'aggregazione\r\n */\r\n constructor(\r\n public column: string,\r\n public aggregation: 'min' | 'max' | 'sum',\r\n public value: string) { }\r\n}\r\n","/** Classe che rappresenta o un gruppo o una aggregazione su una colonna. Usata solo internamente */\r\nexport class GroupOrAggregation {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column Colonna su cui è presente o un gruppo o un'aggregazione\r\n * @param {'min' | 'max' | 'sum' } aggregation Aggregazione presente sulla **column**. Se questo campo è nullo significa che è un gruppo.\r\n * @param {'string' | 'date' | 'number'} datatype Tipo di dati contenuto nella colonna **column** se non c'è alcuna aggregazione è inutile, pertanto non sarà valorizzato\r\n */\r\n constructor(\r\n public column: string,\r\n public aggregation?: 'min' | 'max' | 'sum',\r\n public datatype?: 'string' | 'date' | 'number') { }\r\n}\r\n","import { AppSearch } from \"../externals/appsearch/AppSearch\";\r\nimport { GroupRouteFragment } from \"./GroupRouteFragment\";\r\n\r\n/** Classe che rappresenta un separatore da inserire fra gli oggetti dell'es-table per le operazioni di paginazione dei raggruppamenti per riga */\r\nexport class GroupPager {\r\n \r\n /**\r\n * Costruttore\r\n * \r\n * @param {number} _grouplevel Livello del gruppo a cui questo separatore fa riferimento\r\n * @param {string} _thisRoute Route che identifica la gerarchia del gruppo e chi sono i parent\r\n * @param {string} _parent Chiave del gruppo parent se esiste\r\n * @param {AppSearch<any>} view Vista di ricerca collegata a questo elemento\r\n * @param {'groups' | 'items'} searches Indica che cosa cerca questo separatore, se sottogruppi o oggetti\r\n */\r\n constructor(\r\n public _grouplevel: number,\r\n public _thisRoute: GroupRouteFragment[],\r\n public _parent: string,\r\n public view: AppSearch<any>,\r\n public searches: 'groups' | 'items') {\r\n\r\n this._sep = true;\r\n this.buttons = [];\r\n this._thisKey = _parent + \"_sep\";\r\n }\r\n\r\n /** Indica che è un separatore, sempre impostato a **true** */\r\n public _sep: boolean;\r\n /** Array dei pulsanti da collegare lato interfaccia per le paginazione */\r\n public buttons: any[];\r\n /** Chiave del separatore, è sempre **parent** + \"_sep\" */\r\n public _thisKey: string;\r\n}","/**\r\n * Classe che rappresenta un singolo frammento di route di un elemento gruppo o non. Un array di questi indica tutte le colonne di gruppo con i loro valori\r\n * per arrivare ad una ricerca su sottogruppi o elementi relativi\r\n */\r\nexport class GroupRouteFragment {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} column Colonna di raggruppamento\r\n * @param {string} value Valore della colonna di raggruppamento\r\n */\r\n constructor(\r\n public column: string,\r\n public value: string) { }\r\n}","// Librerie\r\nimport { DateService } from \"@esfaenza/extensions\";\r\n\r\n// Direttive / Componenti\r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Modelli\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { Group } from \"../../domain/externals/appsearch/Group\";\r\nimport { GroupAggregation } from \"../../domain/externals/appsearch/GroupAggregation\";\r\nimport { GroupOrAggregation } from \"../../domain/externals/appsearch/GroupOrAggregation\";\r\nimport { GroupPager } from \"../../domain/internals/GroupPager\";\r\nimport { GroupRouteFragment } from \"../../domain/internals/GroupRouteFragment\";\r\nimport { ThAggregation } from \"../../domain/internals/ThAggregation\";\r\n\r\n// Utilities\r\nimport { UtilitiesHandler } from \"./UtilitiesHandler\";\r\n\r\n/** Classe che gestisce la modalità Row Grouping dell'es-table */\r\nexport class RowGroupingHandler {\r\n\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi è il gruppo rappresentato */\r\n public rgGroupCache: Map<string, Group> = new Map<string, Group>();\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi sono gli oggetti sottostanti, non dei sottogruppi */\r\n public rgItemCache: Map<string, any[]> = new Map<string, any[]>();\r\n /** Cache per salvare per ogni chiave di ogni gruppo chi sono gli oggetti sottostanti, non dei sottogruppi */\r\n public rgChildGroupsCache: Map<string, Group[]> = new Map<string, Group[]>();\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private utilities: UtilitiesHandler, private dateExts: DateService) { }\r\n\r\n /**\r\n * In modalità rowgrouping quando mi arriva un nuovo blocco di oggetti devo aggiungerlo alla vista attuale:\r\n *\r\n * 1) Se non viene richiesto il dettaglio di alcun gruppo significa che devo considerare mi siano arrivati tutti i gruppi principali\r\n * 2) Se viene richiesto il dettaglio di un gruppo diverso dall'ultimo devo aggiungere dopo al gruppo cliccato la lista dei sottogruppi\r\n * 2) Se viene richiesto il dettaglio dell'ultimo gruppo devo aggiungere dopo al gruppo cliccato la lista degli oggetti\r\n *\r\n * @param {any} view AppSearch<T> da cui sono arrivati gli oggetti\r\n * @param {number} groupingKeys Livelli di raggruppamento da aspettarsi sui dati\r\n */\r\n public handleNewDataOnRowGrouping(view: AppSearch<any>, groupingKeys: number) {\r\n // 1) Se non viene richiesto il dettaglio di alcun gruppo significa che la chiamata restituisce la lista paginata dei gruppi principali.\r\n // Li tratto come se fosse una qualsiasi altra query paginata su N elementi\r\n if ((view.requestedgroups?.length || 0) == 0) {\r\n this.est.boundSource.set(this.est.TMPBoundSource);\r\n this.rgGroupCache = new Map<string, Group>();\r\n this.rgItemCache = new Map<string, any[]>();\r\n this.rgChildGroupsCache = new Map<string, Group[]>();\r\n\r\n this.est.TMPBoundSource.forEach(itm => {\r\n itm._thisRoute = itm._group ? [{ column: (<Group>itm).column, value: (<Group>itm).value }] : [];\r\n itm._thisKey = itm._group ? (<Group>itm).value : null;\r\n itm._grouplevel = 0;\r\n\r\n this.rgGroupCache.set(itm._thisKey, itm);\r\n });\r\n\r\n // Resetto la ricerca alla cache di questa \"sessione\"\r\n let firstItem = this.est.TMPBoundSource[0];\r\n this.est.MainGroupView = Object.assign({}, view);\r\n this.est.groupSearchRequestsCache = [{ path: '', route: [{ column: (<Group>firstItem).column, value: (<Group>firstItem).value }], view: this.est.MainGroupView, group_column: (<Group>this.est.TMPBoundSource[0]).column }];\r\n this.est.BaseItemsCount = view.objectcount;\r\n }\r\n else {\r\n // 2) Se viene richiesto il dettaglio di un qualsiasi gruppo diverso dall'ultimo vuol dire che devo aggiungere\r\n // dopo al gruppo che ho cliccato la lista dei gruppi tirata fuori questa volta (intermediateGroup = true)\r\n /*\r\n * GruppoA GruppoA\r\n * GruppoB GruppoB\r\n * GruppoC <- Clicco qui GruppoC\r\n * GruppoD GruppoC1\r\n * GruppoE GruppoC2\r\n * GruppoD\r\n * GruppoE\r\n */\r\n // 3) se i gruppi richiesti dalla view sono uguali ai gruppi presenti vuol dire che sto prendendo gli oggetti veri e propri, sono in\r\n // view.items e quindi in TMPBoundSource, ho inoltre le informazioni di paginazione **per il singolo sottogruppo** (intermediateGroup = false)\r\n /*\r\n * GruppoA GruppoA\r\n * GruppoC1 GruppoC1\r\n * GruppoB GruppoB\r\n * GruppoC GruppoC\r\n * GruppoC1 <-- Clicco qui GruppoC1\r\n * Oggetto1\r\n * Oggetto2\r\n * Oggetto3\r\n * GruppoC2 GruppoC2\r\n * GruppoD GruppoD\r\n * GruppoE GruppoE\r\n */\r\n let intermediateGroup = view.requestedgroups.length != groupingKeys;\r\n\r\n let items = this.est.boundSource();\r\n let insertIndex = 0;\r\n let insertGroup = null;\r\n let groupKey: string = \"\";\r\n let groupRoute: GroupRouteFragment[] = [];\r\n\r\n // Navigo la stuttura dei gruppi ignorando ricorsivamente tutti gli indici fino ai gruppi che mi interessano in modo da non beccare il primo \"GruppoC1\" del caso sopra\r\n for (let i = 0; i < view.requestedgroups.length; i++) {\r\n let rg = view.requestedgroups[i];\r\n groupKey += rg.value;\r\n groupRoute.push({ column: rg.column, value: rg.value });\r\n for (let i = insertIndex; i < items.length; i++) {\r\n let t = items[i];\r\n if (i >= insertIndex && t._group && t.column == rg.column && t.value == rg.value) {\r\n insertIndex = i; insertGroup = t;\r\n // Lo marco expanded dato che questo click sul gruppo potrebbe non essere stato fatto\r\n insertGroup._expanded = true;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n let itemsCacheReference;\r\n let childGroupsCacheReference;\r\n\r\n // Se non è un gruppo intermedio devo ripulire la cache del gruppo su cui ho attualmente cliccato. Gli oggetti saranno riaggiunti dopo\r\n if (!intermediateGroup) {\r\n this.rgItemCache.set(groupKey, []);\r\n itemsCacheReference = this.rgItemCache.get(groupKey);\r\n }\r\n else {\r\n // Se invece è un gruppo intermedio devo ripulire sia tutti i child group ricorsivamente, sia tutti gli item\r\n for (let key of this.rgChildGroupsCache.keys())\r\n if (key.startsWith(groupKey))\r\n this.rgChildGroupsCache.delete(key);\r\n\r\n for (let key of this.rgItemCache.keys())\r\n if (key.startsWith(groupKey))\r\n this.rgItemCache.delete(key);\r\n\r\n this.rgChildGroupsCache.set(groupKey, []);\r\n childGroupsCacheReference = this.rgChildGroupsCache.get(groupKey);\r\n }\r\n\r\n // Assegno un livello ai valori che arrivano da usare per formattare la parte grafica. Il primo gruppo cliccato sarà a livello 1,\r\n // il secondo sarà a livello 2 e così via...\r\n // Li marco inoltre con il parent in modo da poter eliminare i vecchi qualora servisse\r\n this.est.TMPBoundSource.forEach(itm => {\r\n itm._parent = groupKey;\r\n itm._parentRoute = groupRoute;\r\n itm._thisRoute = itm._group ? [...groupRoute, new GroupRouteFragment((<Group>itm).column, (<Group>itm).value)] : [];\r\n itm._thisKey = itm._group ? groupKey + (<Group>itm).value : groupKey;\r\n\r\n // Per le ricerca intermedie metto i gruppi nella cache dei gruppi\r\n if (intermediateGroup) {\r\n itm._grouplevel = view.requestedgroups.length;\r\n this.rgGroupCache.set(itm._thisKey, itm);\r\n childGroupsCacheReference.push(itm);\r\n }\r\n else {\r\n // Metto anche gli oggetti nella cache non ricorsiva\r\n itemsCacheReference.push(itm);\r\n }\r\n });\r\n\r\n let bs = this.est.boundSource();\r\n // Elimino gli oggetti vecchi\r\n // 1) Ricerca intermedia, stato salvato - Elimino tutti gli item e tutti i gruppi la cui route è più lunga della corrente, tutti gli item relativi alla path corrente, e tutte\r\n // le cache di ricerca effettuate su una path più profonda dell'attuale\r\n // 2) Ricerca finale o ricerca intermedia senza stato salvato - Elimino tutti gli item relativi alla path corrente\r\n // Per \"stato salvato\" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse\r\n if (intermediateGroup && view.savedstate) {\r\n bs = bs.filter(t => !(t._item || t._thisRoute.length > groupRoute.length));\r\n this.est.groupSearchRequestsCache = this.est.groupSearchRequestsCache.filter(t => !(t.route.length > groupRoute.length));\r\n }\r\n else if (intermediateGroup)\r\n {\r\n // Se invece lo stato non è salvato vuol dire che c'è stato un cambio di pagina interno ad un gruppo già aperto:\r\n // - Elimino tutti gli elementi riconducibili a questo gruppo che erano già presenti\r\n bs = bs.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));\r\n }\r\n\r\n bs = bs.filter(t => !(t._parent == groupKey));\r\n\r\n let thisGroup = bs[insertIndex];\r\n if (intermediateGroup)\r\n thisGroup._groupscount = (<AppSearch<any>>this.est.View)?.groupcount;\r\n\r\n // Li sostituisco coi nuovi di questa ricerca\r\n bs.splice(insertIndex + 1, 0, ...this.est.TMPBoundSource);\r\n\r\n // Aggiungo un separatore alla fine o all'inizio di questi gruppi che dovrà occuparsi di caricare ALTRI gruppi o oggetti (se sono all'ultimo gruppo)\r\n let addLast = false;\r\n bs.splice(insertIndex + 1 + (addLast ? this.est.TMPBoundSource.length : 0), 0, this.getGroupSeparator(view, groupKey, groupRoute, view.requestedgroups.length, intermediateGroup ? 'groups' : 'items'));\r\n\r\n this.est.boundSource.set(bs);\r\n\r\n // Aggiungo la ricerca alla cache di questa \"sessione\"\r\n let toAdd = { path: groupKey, route: groupRoute, view: Object.assign({}, view), group_column: intermediateGroup ? (<Group>this.est.TMPBoundSource[0]).column : '' };\r\n let prev = this.est.groupSearchRequestsCache.findIndex(t => t.path == toAdd.path && t.group_column == toAdd.group_column);\r\n if (prev == -1)\r\n this.est.groupSearchRequestsCache.push(toAdd);\r\n\r\n else\r\n this.est.groupSearchRequestsCache.splice(prev, 1, toAdd);\r\n }\r\n }\r\n\r\n /**\r\n * Se in modalità array applica i raggruppamenti definiti lato row-grouping\r\n *\r\n * @param {ths: EsThDirective[]} ths Header\r\n */\r\n public arrayModeReviewGroupings(ths: EsThDirective[]) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n let headerGroups: Group[] = [];\r\n let headerAggregations: GroupOrAggregation[] = [];\r\n\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i] as EsThDirective;\r\n\r\n if (th.thGroup)\r\n headerGroups.push(new Group(th.th, 0, \"\"));\r\n else if (th.thAggregation)\r\n headerAggregations = [...headerAggregations, ...this.getGroupAggregations(th)];\r\n }\r\n\r\n if (headerGroups.length > 0) {\r\n // Pulizia delle cache\r\n this.rgGroupCache.clear();\r\n this.rgItemCache.clear();\r\n this.rgChildGroupsCache.clear();\r\n\r\n this.est.ArrayGrouping.set(true);\r\n this.est.boundSource.set(this.getGroupsRecursive(headerGroups, 0, this.est.boundSource(), headerAggregations, null));\r\n }\r\n }\r\n\r\n /**\r\n * Data una direttiva EsTh restituisce la lista delle aggregazioni richiesta per questa colonna o il gruppo che rappresenta\r\n *\r\n * @param {EsThDirective} th Direttiva\r\n *\r\n * @returns {GroupOrAggregation[]} Lista dei gruppi o aggregazioni relativi alla Direttiva passata\r\n */\r\n public getGroupAggregations(th: EsThDirective): GroupOrAggregation[] {\r\n let ret = [];\r\n // Es: '{min:dd/MM/yyyy} - {max:dd/MM/yyyy}'\r\n if (th.thAggregation) {\r\n this.getEsThDirectiveListOfAggregations(th).forEach((agg: ThAggregation) => {\r\n let isdate = agg.format && ['small', 'long', 'verylong'].includes(agg.format);\r\n let isnumber = agg.format && agg.format.startsWith(\"F\") && !Number.isNaN(agg.format.charAt(1)) && agg.format.length == 2;\r\n\r\n if (!isdate && !isnumber && agg.format)\r\n throw \"Le aggergazioni supportate dall'es-table sono solo 'small', 'long', 'verylong' per le date e 'F0-9' per i numeri\";\r\n\r\n ret.push(new GroupOrAggregation(th.th, agg.func, isdate ? 'date' : isnumber ? 'number' : 'string'));\r\n });\r\n }\r\n else if (th.thGroup)\r\n ret.push(new GroupOrAggregation(th.th, null));\r\n\r\n return ret;\r\n }\r\n\r\n\r\n /**\r\n * Data una direttiva con un formato restituisce tutte le coppie Funzione di Aggregazione - Formato\r\n *\r\n * @param {EsThDirective} th Direttiva EsTh di cui calcolare le funzioni di aggregazione usate\r\n *\r\n * @returns {{ func: string, format: string }[]} Lista delle funzioni di aggregazione rilevate\r\n */\r\n private getEsThDirectiveListOfAggregations(th: EsThDirective): ThAggregation[] {\r\n if (!th.thAggregation)\r\n return [];\r\n\r\n // Se ho già effettuato questo calcolo per questo th restituisco la versione in cache\r\n if (th._thAggregations)\r\n return th._thAggregations;\r\n\r\n let ret = [];\r\n let display = th.thAggregation;\r\n var matches = display.match(/{[a-zA-Z0-9\\/:]*}/gi);\r\n if (!matches)\r\n return [];\r\n matches.forEach(m => {\r\n let split = m.split(\":\");\r\n let func = m, format = \"\";\r\n if (split.length > 0) {\r\n // Escludo primo e ultimo carattere (le graffe)\r\n func = split[0].substr(1);\r\n format = split[1].substr(0, split[1].length - 1);\r\n }\r\n\r\n ret.push({ func: <'min' | 'max' | 'sum'>func, format: format, match: m });\r\n });\r\n\r\n th._thAggregations = ret;\r\n return ret;\r\n }\r\n\r\n /**\r\n * Data la definizione dei gruppi da generare da una lista di oggetti, suddivide gli oggetti passati in gruppi e sottogruppi\r\n *\r\n * @param {Group[]} grps Definizione dei gruppi\r\n * @param {number} currentIndex Indice di elaborazione. Al livello 0 ho tutti gli oggetti e devo generare i primi gruppi, a livello 1 ho tutti i gruppi principali e devo\r\n * elaborare i sottogruppi, e così via ricorsivamente...\r\n * @param {any[]} items Oggetti da raggruppare\r\n * @param {GroupOrAggregation[]} aggregations Info di aggregazione\r\n * @param {any} parent Riferimento al gruppo padre\r\n */\r\n private getGroupsRecursive(grps: Group[], currentIndex: number, items: any[], aggregations: GroupOrAggregation[], parent?: any): any[] {\r\n // Se l'indice è 0 devo sicuramente nascondere tutti gli oggetti. Solo i gruppi saranno visualizzati\r\n if (currentIndex == 0)\r\n items.forEach(i => i._visible = false);\r\n\r\n let grp = grps[currentIndex];\r\n let ret: any[] = [];\r\n let last = grps.length == currentIndex + 1;\r\n let groups = this.utilities.groupBy(items, grp.column);\r\n for (let prop in groups) {\r\n let itms = groups[prop];\r\n let gp = new Group(grp.column, itms.length, prop);\r\n gp.aggregations = this.generateAggregations(itms, aggregations);\r\n\r\n let anygp = (<any>gp);\r\n anygp._group = true;\r\n anygp._expanded = false;\r\n if (!parent) {\r\n anygp._thisRoute = [{ column: gp.column, value: gp.value }];\r\n anygp._thisKey = gp.value;\r\n anygp._grouplevel = 0;\r\n }\r\n else {\r\n anygp._parent = parent._thisKey;\r\n anygp._parentRoute = parent._thisRoute;\r\n anygp._thisRoute = [...parent._thisRoute, { column: gp.column, value: gp.value }];\r\n anygp._thisKey = parent._thisKey + gp.value;\r\n anygp._grouplevel = parent._grouplevel + 1;\r\n }\r\n\r\n // Pusho il gruppo, tutti i gruppi del livello sotto, o gli item se io sono l'ultimo gruppo.\r\n // La visibilità è solo per il gruppo a livello 0, tutti gli altri gruppi saranno mostrati o nascosti di conseguenza\r\n if (currentIndex == 0)\r\n anygp._visible = true;\r\n\r\n this.utilities.calculateHash([anygp]);\r\n this.utilities.cacheAggregations(anygp);\r\n\r\n // Aggiungo il gruppo padre\r\n ret.push(anygp);\r\n this.rgGroupCache.set(anygp._thisKey, anygp);\r\n if (!last) {\r\n\r\n //Dal gruppo padre, se non è l'ultimo gruppo della catena, calcolo ricorsivamente tutta la catena sotto\r\n let subGroupsAndItems = this.getGroupsRecursive(grps, currentIndex + 1, itms, aggregations, anygp);\r\n let childgroups = subGroupsAndItems.filter(t => t._group && t._parent == anygp._thisKey);\r\n anygp._groupscount = childgroups.length;\r\n\r\n // Aggiungo la catena del gruppo sotto, aggiungendo alla cache solo i gruppi padre\r\n ret.push(...subGroupsAndItems);\r\n this.rgChildGroupsCache.set(anygp._thisKey, childgroups);\r\n }\r\n else {\r\n // Al gruppo padre, se è l'ultimo assegno tutte le foglie assegnandogli anche la chiave del gruppo\r\n itms.forEach(i => i._thisKey = anygp._thisKey);\r\n\r\n ret.push(...itms);\r\n this.rgItemCache.set(anygp._thisKey, itms);\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Data una lista di oggetti genera le aggregazioni specificate. Si considera di avere tutti gli oggetti\r\n *\r\n * @param {any[]} items Oggetti di cui calcolare le aggregazione\r\n * @param {GroupOrAggregation[]} aggregations Aggergazioni da generare\r\n */\r\n private generateAggregations(items: any[], aggregations: GroupOrAggregation[]): GroupAggregation[] {\r\n let rets: GroupAggregation[] = [];\r\n let aggregationValue = \"\", feField = null, stringAgg = null, dateAgg = null, numberAgg = null;\r\n\r\n for (let i = 0; i < aggregations.length; i++) {\r\n let agg = aggregations[i];\r\n feField = agg.column;\r\n if (!feField)\r\n continue;\r\n\r\n switch (agg.datatype) {\r\n case 'string': stringAgg = items.map(i => i[feField].toString()); break;\r\n case 'date': dateAgg = items.map(i => new Date(i[feField]).getTime()); break;\r\n case 'number': numberAgg = items.map(i => parseFloat(i[feField])); break;\r\n }\r\n\r\n switch (agg.aggregation) {\r\n case 'max':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.sort().reverse()[0]; break;\r\n case 'date': aggregationValue = new Date(Math.max(...dateAgg)).toString(); break;\r\n case 'number': aggregationValue = Math.max(...numberAgg).toString(); break;\r\n }\r\n break;\r\n case 'min':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.sort()[0]; break;\r\n case 'date': aggregationValue = new Date(Math.min(...dateAgg)).toString(); break;\r\n case 'number': aggregationValue = Math.min(...numberAgg).toString(); break;\r\n }\r\n break;\r\n case 'sum':\r\n switch (agg.datatype) {\r\n case 'string': aggregationValue = stringAgg.join(\", \"); break;\r\n case 'date': aggregationValue = \"\"; break;\r\n case 'number': aggregationValue = numberAgg.reduce((pre, curr) => pre + curr, 0).toString(); break;\r\n }\r\n break;\r\n }\r\n rets.push(new GroupAggregation(agg.column, agg.aggregation, aggregationValue));\r\n }\r\n\r\n return rets;\r\n }\r\n\r\n /**\r\n * Ottiene un elemento di separazione fra Gruppi che serve per paginare le ricerche all'interno di ogni singolo gruppo\r\n *\r\n * @param {AppSearch<any>} view View utilizzata per la ricerca. Me ne salvo i parametri nel separatore attuale dato che ne ho bisogno per caricare altri elementi\r\n * facenti riferimento allo stesso contesto\r\n * @param {string} parent Parent path che rappresenta a quale gruppo è affibbiato questo separatore\r\n * @param {GroupRouteFragment[]} route Route path che rappresenta a quale gruppo è affibbiato questo separatore\r\n * @param {number} level Livello del gruppo di cui questo elemento è separatore, viene usato per applicare la classe \"est-lvl-{{level}}\"\r\n *\r\n * @returns {any} Elemento di separazione contenente tutti i bind per presentare una paginazione sotto questo gruppo lato interfaccia\r\n */\r\n public getGroupSeparator(view: AppSearch<any>, parent: string, route: GroupRouteFragment[], level: number, searches: 'groups' | 'items'): GroupPager {\r\n let item = new GroupPager(level, route, parent, Object.assign({}, view), searches);\r\n item.buttons = this.utilities.getPagesArray(6, view.page, view.pages);\r\n this.utilities.calculateHash([item]);\r\n return item;\r\n }\r\n\r\n\r\n /**\r\n * Data una colonna effettua la riemissione di tutte le ricerche relative.\r\n *\r\n * Es. Ho 2 campi di gruppo e ho espanso fino a vedere i valori fino ad un livello qualsiasi.\r\n * Clicco l'ordinamento sul secondo gruppo.\r\n * Tutte le ricerche relative ai primi gruppi devono essere rieseguite. Quando i risultati arriveranno ci penserà il metodo **bindDisplayToLoadedItemsOrGroups**\r\n * a tagliare via gli oggetti non più visualizzati\r\n *\r\n * @param {string} column Colonna su cui si è effettuata un'operazione di ordinamento\r\n * @param {AppOrdering[]} orderings Direttive di ordinamento da applicare alle varie sottoricerche\r\n */\r\n public emitRowGroupingSearches(column: string, orderings: AppOrdering[]) {\r\n // Per tutte le ricerche intermedie che devo rivalutare le re-emitto in modo da aggiornargli i dati\r\n var meaningfulAppSearches = this.est.groupSearchRequestsCache.filter(t => t.group_column == column).map(t => t.view);\r\n\r\n // Se non ne trovo significa che ho fatto l'ordinamento o sugli item, o su colonne relative a un sottogruppo non caricato\r\n if (!meaningfulAppSearches || meaningfulAppSearches.length == 0)\r\n meaningfulAppSearches = this.est.groupSearchRequestsCache.filter(t => !t.group_column).map(t => t.view);\r\n\r\n // Se non ne trovo qui significa che sto ordinando su colonne relative a un sottogruppo non caricato\r\n if (!meaningfulAppSearches || meaningfulAppSearches.length == 0)\r\n return;\r\n\r\n meaningfulAppSearches.forEach(as => {\r\n // Ovviamente gli oridnamenti devono essere quelli appena generati\r\n as.orders = orderings;\r\n as.savedstate = true;\r\n this.est.emitSearchRequest(false, as);\r\n });\r\n }\r\n\r\n /**\r\n * Helper che calcola il contenuto di una cella relativa a un gruppo riga, tenendo conto del formato delle eventuali aggregazioni\r\n *\r\n * @param {Group} grp Gruppo di cui mostrare le celle\r\n * @param {string} cell Cella attuale di cui calcolare il testo\r\n * @param {EsThDirective} header Header relativo alla cella attuale, utilizzata per identificare le informazioni di aggregazione\r\n *\r\n * @returns {string} Testo finale calcolato per la **cell** corrente, in base alle aggregazioni di **header**\r\n */\r\n public getGroupCellDisplay(grp: Group, cell: string, header: EsThDirective): string {\r\n if ((<any>grp)._sep)\r\n return \"\";\r\n let display = header.thAggregation;\r\n if (grp.column == cell) {\r\n let groupsPart = (<any>grp)._groupscount ? \" - \" + (<any>grp)._groupscount + \" \" + this.est.lc.loc(\"Groups\") : \"\";\r\n return grp.value + \" (\" + grp.count + groupsPart + \")\";\r\n }\r\n else {\r\n\r\n let agg = (<Map<string, Map<string, string>>>(<any>grp)._aggregationsCache).get(cell);\r\n if (!agg)\r\n return \"\";\r\n\r\n this.getEsThDirectiveListOfAggregations(header).forEach((itm: ThAggregation) => {\r\n display = display.replace(itm.match, this.formatAggregationValue(agg.get(itm.func), itm.format));\r\n });\r\n\r\n return display;\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che dato un valore lo formatta in base al tipo\r\n *\r\n * @param {string} value Valore che generalemnte può essere una data o un numero\r\n * @param {string} fromat Formato su cui formattare il valore. Può essere ad esempio \"small\", \"long\" \"verylong\" per le date o F{0-9} per i numeri decimali\r\n *\r\n * @returns {string} Valore dell'aggregazione formattato come si deve\r\n */\r\n private formatAggregationValue(value: string, format?: string): string {\r\n if (!format)\r\n return value;\r\n\r\n let isNumber = !Number.isNaN(value) && (!format || format.startsWith(\"F\"));\r\n\r\n if (isNumber && format.startsWith(\"F\") && !Number.isNaN(format.substr(1)))\r\n return parseFloat(value).toFixed(parseInt(format.substr(1)));\r\n\r\n let date = null;\r\n // Alcune versione di extensions rischiano di crashare con cose non date... è stato risolto dopo quindi questo try - catch in realtà\r\n // torna utile solo con versioni vecchie/deprecate della libreria @esfaenza/extensions\r\n try { date = this.dateExts.getDateConvertion(value); } catch { }\r\n\r\n if (date)\r\n return this.dateExts.getFormatted(date, format == 'small', format == 'verylong');\r\n\r\n // Qui ci finisco sia per input che non sono né date né numeri, sia per formati non riconosciuti\r\n return value;\r\n }\r\n}","/** Rappresenta un trittico formato da un array e due cache relative a tale array per un accesso estremamente veloce per tutte le operazioni del caso */\r\nexport class CacheTriptic {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {Map<string, any>} cache Cache Chiave-Oggetto\r\n * @param {Map<string, number>} index_cache Cache Indice-Oggetto\r\n * @param {any[]} array Array contenente gli oggetti\r\n */\r\n constructor(\r\n public cache: Map<string, any>,\r\n public index_cache: Map<string, number>,\r\n public array: any[]) { }\r\n}","// Modelli\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { ItemsSelection } from \"../../domain/externals/appsearch/ItemsSelection\";\r\nimport { CacheTriptic } from \"../../domain/internals/CacheTriptic\";\r\nimport { ItemPropEditableReference } from \"../../domain/externals/ItemPropEditableReference\";\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { InputType } from '../../domain/types';\r\n\r\n// Componenti\r\nimport { EsTableComponent } from \"../../components/es-table/es_table.component\"\r\n\r\n// Direttive \r\nimport { EsThDirective } from \"../../directives/es_th.directive\";\r\n\r\n// Handlers\r\nimport { RowGroupingHandler } from \"./RowGroupingHandler\";\r\n\r\n/**\r\n * Dichiarazione della variabile globale dayjs. L'onere di \"crearla\" è affidato all'applicazione che utilizza questa libreria, \r\n * che dovrà importare lo script globale di dayjs nella CLI\r\n */\r\n declare var dayjs: any;\r\n\r\n/** Classe che gestisce le selezioni degli oggetti */\r\nexport class SelectionHandler {\r\n\r\n /** Cache di selezione Hash - Oggetto per la variabile **items** dell'itemSelector. Facilita le operazioni di lookup via hash*/\r\n private itemsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **groups** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private groupsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **exclusions** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private exclusionsCache: Map<string, any> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **group_exclusions** dell'itemSelector. Facilita le operazioni di lookup via hash */\r\n private group_exclusionsCache: Map<string, any> = new Map();\r\n\r\n /** Cache di selezione Hash - Oggetto per la variabile **items** dell'itemSelector. Facilita le operazioni di lookup via indice*/\r\n private i_itemsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **groups** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_groupsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **exclusions** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_exclusionsCache: Map<string, number> = new Map();\r\n /** Cache di selezione Hash - Oggetto per la variabile **group_exclusions** dell'itemSelector. Facilita le operazioni di lookup via indice */\r\n private i_group_exclusionsCache: Map<string, number> = new Map();\r\n\r\n /** Ultima cella selezionata singolarmente */\r\n private lastSingleSelection?: { row: number, column: number };\r\n\r\n /** @ignore Costruttore */\r\n constructor(private est: EsTableComponent, private rgHandler: RowGroupingHandler) { }\r\n\r\n /** Ripulisce le cache di selezione */\r\n public clearSelectionCaches() {\r\n this.itemsCache.clear();\r\n this.groupsCache.clear();\r\n this.exclusionsCache.clear();\r\n this.group_exclusionsCache.clear();\r\n\r\n this.i_itemsCache.clear();\r\n this.i_groupsCache.clear();\r\n this.i_exclusionsCache.clear();\r\n this.i_group_exclusionsCache.clear();\r\n }\r\n\r\n /**\r\n * Valuta quali elementi devono essere marcati come selezionati nella vista attuale. Si basa sull'oggetto **selection** interno all'AppSearch\r\n *\r\n * @param {any[]} items Oggetti di cui valutare la selezione\r\n * @param {ItemsSelection<any>} selectionItem Oggetti di selezione derivante dalla view o dall'oggetto per Array\r\n */\r\n public evaluateSelection(items: any[], selectionItem: ItemsSelection<any> | null | undefined) {\r\n if (!selectionItem)\r\n return;\r\n\r\n this.handleSelectionEvaluation(items, selectionItem);\r\n }\r\n\r\n /**\r\n * Precompila le informazioni sullo stato di selezione tutto a false per le celle della tabella\r\n * \r\n * @param {any[]} items Oggetti attualmente bindati sulla tabella\r\n * @param {EsThDirective[]} ths Colonne su cui gli oggetti sono bindati\r\n */\r\n public evaluateSingleCellSelection(items: any[], ths: EsThDirective[], dyn: EsTableColumnsDefinition[]) {\r\n for (let i = 0; i < items.length; i++) {\r\n // items[i]._ordinal dovrebbe essere uguale a \"i\" ma dato che lato HTML il ciclo è esterno e non ho l'indice per convenzione mi baso sull'_ordinal\r\n this.est.selectionStatus[items[i]._ordinal] = {};\r\n if (dyn && dyn.length > 0)\r\n this.fillSelectionStatusByDynamicColumns(items[i], dyn);\r\n else\r\n this.fillSelectionStatusByEsThs(items[i], ths);\r\n \r\n }\r\n }\r\n \r\n /** @ignore */\r\n private fillSelectionStatusByDynamicColumns(item: any, dyn: EsTableColumnsDefinition[]){\r\n for (let k = 0; k < dyn.length; k++) {\r\n let th = dyn[k];\r\n let iper: ItemPropEditableReference = { selected: false, value: th.PropertyName ? item.properties[th.PropertyName] : \"Undefined Property\", type: th.PropertyType, property: th.PropertyName, header: th.PropertyName, item: item };\r\n this.est.selectionStatus[item._ordinal][k] = iper;\r\n\r\n // Funzione assegnata dopo in modo da poterle fare anche aggiornare il valore del riferimento all'oggetto di selezione\r\n iper.val_setter = (value: string): any => {\r\n if (!th.PropertyName) {\r\n item[th.PropertyName] = value;\r\n iper.value = value;\r\n return value;\r\n }\r\n\r\n let valToApply = \"\";\r\n switch (th.PropertyType) {\r\n case \"string\":\r\n if (value.startsWith && value.startsWith('\"') && value.endsWith && value.endsWith('\"'))\r\n valToApply = value.substring(1, value.length - 1);\r\n else\r\n valToApply = value;\r\n break;\r\n\r\n case \"number\":\r\n case \"int\":\r\n case \"boolean\":\r\n case \"enum\":\r\n case \"autocomplete\":\r\n case \"float\":\r\n case \"currency\":\r\n valToApply = value;\r\n break;\r\n\r\n case \"date\":\r\n case \"datetime\":\r\n valToApply = this.est.dateExts.getDateConvertion(value);\r\n break;\r\n case \"time\":\r\n let mydate = this.est.dateExts.getDateConvertion(value);\r\n valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`\r\n break;\r\n // Per evitare di sbiancare senza senso\r\n default:\r\n valToApply = value;\r\n break;\r\n }\r\n item.properties[th.PropertyName] = valToApply;\r\n iper.value = valToApply;\r\n return valToApply;\r\n }\r\n }\r\n }\r\n\r\n /** @ignore */\r\n private fillSelectionStatusByEsThs(item: any, ths: EsThDirective[]) {\r\n for (let k = 0; k < ths.length; k++) {\r\n let th = ths[k];\r\n let iper: ItemPropEditableReference = { selected: false, value: th.thProperty ? item[th.thProperty] : \"Undefined Property\", type: th.thType, property: th.thProperty, header: th.th, item: item };\r\n this.est.selectionStatus[item._ordinal][k] = iper;\r\n\r\n // Funzione assegnata dopo in modo da poterle fare anche aggiornare il valore del riferimento all'oggetto di selezione\r\n iper.val_setter = (value: string): any => {\r\n if (!th.thProperty) {\r\n iper.value = value;\r\n return value;\r\n }\r\n\r\n let valToApply = \"\";\r\n switch (th.thType) {\r\n case \"string\":\r\n if (value.startsWith('\"') && value.endsWith('\"'))\r\n valToApply = value.substring(1, value.length - 1);\r\n else\r\n valToApply = value;\r\n break;\r\n\r\n case \"number\":\r\n case \"int\":\r\n case \"boolean\":\r\n case \"enum\":\r\n case \"autocomplete\":\r\n case \"float\":\r\n case \"currency\":\r\n valToApply = value;\r\n break;\r\n\r\n case \"date\":\r\n case \"datetime\":\r\n valToApply = this.est.dateExts.getDateConvertion(value);\r\n break;\r\n case \"time\":\r\n let mydate = this.est.dateExts.getDateConvertion(value);\r\n valToApply = `${mydate.hour()}:${mydate.minute()}:${mydate.second()}`\r\n break;\r\n \r\n // Per evitare di sbiancare senza senso\r\n default:\r\n valToApply = value;\r\n break;\r\n }\r\n item[th.thProperty] = valToApply;\r\n iper.value = valToApply;\r\n return valToApply;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Implementazione agnostica della valutazione delle selezioni degli oggetti. Richiede gli oggetti della vista attuale e l'itemSelector\r\n *\r\n * @param {any[]} items Oggetti di cui aggiornare lo stato di selezione\r\n * @param {ItemsSelection<any>} selectionItem Oggetto contenente lo stato attuale di selezione\r\n */\r\n private handleSelectionEvaluation(items: any[], selectionItem: ItemsSelection<any>) {\r\n for (let i = 0; i < items.length; i++) {\r\n let itm = items[i];\r\n let hash = itm._hash;\r\n let itemGroup = itm._group ? null : this.getItemGroup(itm);\r\n // Reidrato la cache di selezione coi nuovi oggetti altrimenti non riuscirei a beccare gli indici giusti\r\n // Dopodiché la uso per calcolare istantaneamente se gli oggetti sono selezionati o no\r\n this.rehidrateCache(itm);\r\n\r\n if (itm._item) {\r\n if (selectionItem.all)\r\n itm._selected = !this.exclusionsCache.has(hash) && ((!this.groupsCache.has(itemGroup?._hash) && this.itemsCache.has(hash)) || !this.group_exclusionsCache.has(itemGroup?._hash));\r\n else\r\n itm._selected = !this.exclusionsCache.has(hash) && (this.groupsCache.has(itemGroup?._hash) || this.itemsCache.has(hash) || (this.parentTreeStatus(itemGroup) == 'included' && !this.group_exclusionsCache.has(itemGroup?._hash)));\r\n }\r\n else if (itm._group) {\r\n if (selectionItem.all)\r\n itm._selected = !this.group_exclusionsCache.has(hash) && this.parentTreeStatus(itm) != 'excluded';\r\n else\r\n itm._selected = this.groupsCache.has(hash) || (this.parentTreeStatus(itm) == 'included' && !this.group_exclusionsCache.has(hash));\r\n }\r\n }\r\n\r\n // Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true\r\n // Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni\r\n this.est.globalCheck.set(this.est.boundSource().length > 0 && this.est.boundSource().filter(t => t._group || t._item).every(t => t._selected));\r\n this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());\r\n\r\n // Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella\r\n // Comunque costa 0 quindi mi permetto di refreshare\r\n if (this.est.arrayMode()) {\r\n let prevSelected = this.est.selectedObjects();\r\n this.finalizeSelectionInformations(selectionItem);\r\n if (this.est.selectedObjects() != prevSelected)\r\n this.est.onSelectionChanged.emit(selectionItem);\r\n }\r\n }\r\n\r\n /**\r\n * Dato un oggetto trova la cella di cache in cui è registrato e aggiorna il contenuto\r\n * \r\n * @param {any} item Oggetto da aggiornare\r\n */\r\n private rehidrateCache(item: any) {\r\n let ctx = item._hash;\r\n if (this.itemsCache.has(ctx))\r\n this.itemsCache.set(ctx, item);\r\n\r\n if (this.group_exclusionsCache.has(ctx))\r\n this.group_exclusionsCache.set(ctx, item);\r\n\r\n if (this.groupsCache.has(ctx))\r\n this.groupsCache.set(ctx, item);\r\n\r\n if (this.exclusionsCache.has(ctx))\r\n this.exclusionsCache.set(ctx, item);\r\n }\r\n\r\n /**\r\n * Dato un gruppo controlla ricorsivamente l'albero di cui fa parte se c'è stata una inclusione o esclusione diretta\r\n * \r\n * @param {any} grp Gruppo da controllare\r\n * \r\n * @returns {'none' | 'excluded' | 'included'} \r\n * 'none' se non ci sono informazioni su inclusioni o esclusioni \r\n * 'included' se il gruppo controllato è stato incluso in maniera esplicita dall'albero dei gruppi padri\r\n * 'excluded' se il gruppo controllato è stato escluso in maniera esplicita dall'albero dei gruppi padri\r\n */\r\n private parentTreeStatus(grp: any): 'none' | 'excluded' | 'included' {\r\n if (!grp)\r\n return 'none';\r\n\r\n let parentGroup: any = this.rgHandler.rgGroupCache.get(grp._parent);\r\n\r\n if (!parentGroup)\r\n return 'none';\r\n\r\n if (this.group_exclusionsCache.has(parentGroup._hash))\r\n return 'excluded';\r\n\r\n if (this.groupsCache.has(parentGroup._hash))\r\n return 'included';\r\n\r\n return this.parentTreeStatus(parentGroup);\r\n }\r\n\r\n\r\n /**\r\n * Helper per gestire la selezione di N elementi utilizzando la Cache di selezione ed eventualmente aggiornando il concetto di \"all selection\"\r\n *\r\n * Vunziona sia in modalità Array che in modalità View Semplice o View Avanzata (con le Custom Cells)\r\n *\r\n * @param {any[]} items Oggetti da selezionare o deselezionare\r\n * @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti\r\n * @param {boolean} globalCheck Valore del check globale\r\n *\r\n * @returns {ItemsSelection<any>} Oggetto di selezione aggiornato con le informazioni sull'ultima operazione effettuata\r\n */\r\n public handleItemsSelection(items: any[], forcedVal: boolean | null = null, globalCheck: boolean | null = null): ItemsSelection<any> {\r\n let si = (this.est.View as AppSearch<any>)?.selection || this.est.arraymodeSelection;\r\n\r\n // Se sono in modalità di selezione singola e devo selezionare un'oggetto, per prima cosa devo deselezionare tutti gli altri\r\n if (this.est.SingleSelection() && items[0]?._selected && !items[0]?._group) {\r\n if (items.length > 1 && forcedVal == null)\r\n throw \"Tentativo di selezionare o deselezionare più di un elemento con SingleSelection attivo\";\r\n\r\n if (items.length == 1 && forcedVal == null) {\r\n si = this.handleItemsSelection(this.est.boundSource().filter(t => !t._group), false, null);\r\n items[0]._selected = true;\r\n }\r\n }\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n let item = items[i];\r\n let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck() : false;\r\n\r\n // Se dev'essere overridato il valore di check effettuo l'override o col valore forzato o col valore globale\r\n if (toChange && !item.locked)\r\n item._selected = forcedVal != null ? forcedVal : this.est.globalCheck();\r\n\r\n // Se il valore non dev'essere variato e vengo da una selezione globale semplicemente evito di effettuare operaizoni inutili. L'item/gruppo è già nello stato giusto\r\n if (!toChange && globalCheck != null)\r\n continue;\r\n\r\n let allSelection = si.all;\r\n let isGroup = item._group;\r\n let isSelection = item._selected;\r\n let itemGroup = null, allItems = null, selectedItems = null, unselectedItems = null, allGroups = null, selectedGroups = null, unselectedGroups = null, parentGroupSelected = null, parentGroupUnselected = null;\r\n\r\n if (isGroup) {\r\n let pts = this.parentTreeStatus(item);\r\n parentGroupSelected = pts == 'included';\r\n parentGroupUnselected = pts == 'excluded';\r\n allItems = this.getGroupItems(si, item, undefined, true);\r\n selectedItems = this.getGroupItems(si, item, 'selected', true, allItems);\r\n unselectedItems = this.getGroupItems(si, item, 'unselected', true, allItems);\r\n allGroups = this.getGroupChildGroups(si, item, undefined, true);\r\n selectedGroups = this.getGroupChildGroups(si, item, 'selected', true, allGroups);\r\n unselectedGroups = this.getGroupChildGroups(si, item, 'unselected', true, allGroups);\r\n }\r\n else {\r\n itemGroup = this.getItemGroup(item);\r\n parentGroupSelected = itemGroup == null ? null : itemGroup._selected;\r\n parentGroupUnselected = itemGroup == null ? null : !itemGroup._selected;\r\n }\r\n\r\n if (!this.est.ArrayGrouping())\r\n this.performSelectionOperations(si, item, allSelection, isGroup, isSelection, selectedItems, selectedGroups, unselectedItems, unselectedGroups, allItems, allGroups, parentGroupSelected, parentGroupUnselected);\r\n else\r\n this.performSimpleSelectionOperations(si, item, isGroup, isSelection, itemGroup, selectedItems, unselectedItems, allItems, allGroups);\r\n }\r\n\r\n // Imposto il check globale in base a se tutti gli elementi sono selezionati o meno.\r\n // Evito di fare queste operazioni se la selezione deriva proprio dal global Check\r\n if (globalCheck == null)\r\n this.est.globalCheck.set(!this.est.boundSource().some(t => !t._selected && !t._sep));\r\n\r\n this.finalizeSelectionInformations(si);\r\n\r\n return si;\r\n }\r\n\r\n /**\r\n * Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.\r\n * \r\n * Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping()** = true)\r\n */\r\n private performSimpleSelectionOperations(base: ItemsSelection<any>, item: any, group: boolean, sel: boolean, itm_group: any, sel_itm: any[] | null, desel_itm: any[] | null, all_itms: any[] | null, all_grps: any[] | null) {\r\n let tripticItem = this.getTriptic('item', base);\r\n\r\n if (group && all_grps) {\r\n if (sel) {\r\n all_grps.forEach(gr => { gr._selected = true; });\r\n if (desel_itm)\r\n desel_itm.forEach(el => { el._selected = true; this.addItem(el, tripticItem) });\r\n }\r\n else {\r\n all_grps.forEach(gr => { gr._selected = false; });\r\n if (sel_itm)\r\n sel_itm.forEach(el => { el._selected = false; this.removeItem(el, tripticItem) });\r\n }\r\n }\r\n else {\r\n if (sel) {\r\n this.addItem(item, tripticItem);\r\n if (itm_group && all_itms && all_itms.every(t => t._selected))\r\n this.selectGroup(itm_group);\r\n }\r\n else {\r\n this.removeItem(item, tripticItem);\r\n if (itm_group)\r\n itm_group._selected = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper per selezionare un gruppo e, ricorsivamente, se tutti i gruppi sottostanti al parent sono selezionati, selezionare i gruppi padri\r\n * \r\n * @param {any} group Gruppo da selezionare\r\n */\r\n private selectGroup(group: any) {\r\n group._selected = true;\r\n let parent = this.getGroupParent(group);\r\n if (parent && this.getGroupChildGroups(null, parent, undefined, true).every(t => t._selected))\r\n this.selectGroup(parent);\r\n }\r\n\r\n /**\r\n * Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.\r\n * \r\n * La logica di questa funzione è nata essenzialmente da spam di trial & error ed è stata testata solo fino a due livelli di raggruppamento,\r\n * qualsiasi cosa vada oltre non è 100% detto che funzioni...\r\n */\r\n private performSelectionOperations(base: ItemsSelection<any>, item: any, all: boolean, group: boolean, sel: boolean, sel_itm: any[] | null, sel_grp: any[] | null, desel_itm: any[] | null, desel_grp: any[] | null, all_itms: any[] | null, all_grps: any[] | null, parent_incl: boolean | null, parent_excl: boolean | null) {\r\n let tripticGroup = this.getTriptic('group', base);\r\n let tripticItem = this.getTriptic('item', base);\r\n let tripticExcl = this.getTriptic('exclusion', base);\r\n let tripticgrpExcl = this.getTriptic('group_exclusion', base);\r\n\r\n if (group) {\r\n if (sel) {\r\n if (all || parent_incl)\r\n this.removeItem(item, tripticgrpExcl);\r\n else\r\n this.addItem(item, tripticGroup);\r\n\r\n if (sel_itm) sel_itm.forEach(el => this.removeItem(el, tripticItem));\r\n if (sel_grp) sel_grp.forEach(gr => this.removeItem(gr, tripticGroup));\r\n if (all_itms) all_itms.forEach(el => { el._selected = true; this.removeItem(el, tripticExcl); });\r\n if (all_grps) all_grps.forEach(gr => { gr._selected = true; this.removeItem(gr, tripticgrpExcl); });\r\n }\r\n else {\r\n if (all || parent_incl)\r\n this.addItem(item, tripticgrpExcl);\r\n else\r\n this.removeItem(item, tripticGroup);\r\n\r\n if (desel_itm) desel_itm.forEach(el => this.removeItem(el, tripticExcl));\r\n if (desel_grp) desel_grp.forEach(gr => this.removeItem(gr, tripticExcl));\r\n if (all_itms) all_itms.forEach(el => { el._selected = false; this.removeItem(el, tripticItem); });\r\n if (all_grps) all_grps.forEach(gr => { gr._selected = false; this.removeItem(gr, tripticGroup); });\r\n }\r\n }\r\n else {\r\n if (sel) {\r\n if ((parent_excl == null && all) || parent_incl)\r\n this.removeItem(item, tripticExcl);\r\n else\r\n this.addItem(item, tripticItem);\r\n }\r\n else {\r\n if (parent_excl || (!all && parent_excl == null))\r\n this.removeItem(item, tripticItem);\r\n else\r\n this.addItem(item, tripticExcl);\r\n }\r\n }\r\n }\r\n\r\n /** Helper per evitare di riscrivere ogni santa volta array.splice(array.indexof(item), 1); */\r\n private removeItem(item: any, triptic?: CacheTriptic) {\r\n if(!triptic)\r\n return false;\r\n\r\n let index = triptic.index_cache.get(item._hash);\r\n if (index != null) {\r\n triptic.cache.delete(item._hash);\r\n triptic.index_cache.delete(item._hash);\r\n triptic.array[index] = null;\r\n }\r\n\r\n return !!index;\r\n }\r\n\r\n /** Helper per evitare di riscrivere ogni santa volta array.push(item); e la gestione della */\r\n private addItem(item: any, triptic?: CacheTriptic): boolean {\r\n if(!triptic)\r\n return false;\r\n\r\n if (triptic.index_cache.get(item._hash) == null) {\r\n let i = triptic.array.push(item) - 1;\r\n triptic.cache.set(item._hash, item);\r\n triptic.index_cache.set(item._hash, i);\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Ottiene il trittico di selezione, cioè l'array degli oggetti che si vuole manipolare e le due cache collegate ad esso\r\n * \r\n * @param {'group' | 'item' | 'group_exclusion' | 'exclusion'} subject Oggetto logico desiderato su cui effettuare le operazioni successive\r\n * @param {ItemsSelection<any>} base Selettore di base\r\n * \r\n * @returns {CacheTriptic} Trittico di selezione\r\n */\r\n private getTriptic(subject: 'group' | 'item' | 'group_exclusion' | 'exclusion', base: ItemsSelection<any>): CacheTriptic {\r\n switch (subject) {\r\n case 'group':\r\n return new CacheTriptic(this.groupsCache, this.i_groupsCache, base.groups);\r\n case 'item':\r\n return new CacheTriptic(this.itemsCache, this.i_itemsCache, base.items);\r\n case 'group_exclusion':\r\n return new CacheTriptic(this.group_exclusionsCache, this.i_group_exclusionsCache, base.group_exclusions);\r\n case 'exclusion':\r\n return new CacheTriptic(this.exclusionsCache, this.i_exclusionsCache, base.exclusions);\r\n }\r\n }\r\n\r\n /**\r\n * Dato un oggetto restituisce il gruppo di cui fa parte, se esiste\r\n * \r\n * @param {any} item Oggetto di cui trovare il gruppo\r\n */\r\n private getItemGroup(item: any): any {\r\n let parent = this.rgHandler.rgGroupCache.get(item._thisKey)\r\n if (parent)\r\n return parent;\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti gli oggetti con quella chiave\r\n * \r\n * @param {any} group Chiave da cercare\r\n * @param {'selected' | 'unselected'} status Stato degli elementi, selezionati o no\r\n * @param {boolean} recursive Indica se cercare solo gli elementi direttamente collegati o se prendere anche quelli dei gruppi figli\r\n * \r\n * @returns {any[]} Oggetti di tipo **_item** facenti capo alla chiave **groupKey**\r\n */\r\n private getGroupItems(sel: ItemsSelection<any>, group: any, status?: 'selected' | 'unselected', recursive: boolean = false, allbase: any[] | null = null): any[] {\r\n let items = [];\r\n\r\n if (allbase)\r\n items = allbase;\r\n else {\r\n if (recursive) {\r\n // In modalità ricorsiva prendo gli oggetti di tutte le chiavi simili che trovo\r\n for (let key of this.rgHandler.rgItemCache.keys())\r\n if (key.startsWith(group._thisKey))\r\n items.push(...this.rgHandler.rgItemCache.get(key)!);\r\n }\r\n else\r\n items = this.rgHandler.rgItemCache.get(group._thisKey)!;\r\n }\r\n\r\n items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));\r\n\r\n // Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione. \r\n // Questo può essere vero solo se NON sono in modalità array, in caso contrario gli oggetti li devo per forza avere tutti\r\n if (items.length != 0 || !sel || this.est.arrayMode())\r\n return items;\r\n\r\n if (status == 'unselected')\r\n items = sel.exclusions.filter(t => t != null &&\r\n (!recursive && t._thisKey == group._thisKey) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey)));\r\n else if (status == 'selected')\r\n items = sel.items.filter(t => t != null &&\r\n (!recursive && t._thisKey == group._thisKey) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey)));\r\n\r\n return items;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti gli oggetti con quella chiave\r\n * \r\n * @param {any} group Gruppo di cui cercare il parent\r\n * \r\n * @returns {any} Oggetto di tipo **_group** rappresentante il parent del **group** attuale\r\n */\r\n private getGroupParent(group: any): any {\r\n let parent = this.rgHandler.rgGroupCache.get(group._parent)\r\n if (parent)\r\n return parent;\r\n\r\n return null;\r\n }\r\n\r\n /**\r\n * Data la chiave di un gruppo restituisce tutti i gruppi figli\r\n * \r\n * @param {string} group Gruppo che rappresenta il padre di cui cercare i figli\r\n * @param {'selected' | 'unselected'} status Stato dei gruppi, selezionati o no\r\n * @param {boolean} recursive Indica se cercare solo i gruppi direttamente collegati o se prendere anche quelli dei gruppi figli\r\n * \r\n * @returns {any[]} Oggetti di tipo **_group** facenti capo alla chiave **groupKey**\r\n */\r\n private getGroupChildGroups(sel: ItemsSelection<any> | null, group: any, status?: 'selected' | 'unselected', recursive: boolean = false, allbase: any[] | null = null) {\r\n let thisGroup: any = this.rgHandler.rgGroupCache.get(group._thisKey);\r\n let items = [];\r\n\r\n if (allbase)\r\n items = allbase;\r\n else {\r\n if (recursive) {\r\n // In modalità ricorsiva prendo gli oggetti di tutte le chiavi simili che trovo\r\n for (let key of this.rgHandler.rgChildGroupsCache.keys())\r\n if (key.startsWith(group._thisKey))\r\n items.push(...this.rgHandler.rgChildGroupsCache.get(key)!);\r\n }\r\n else\r\n items = this.rgHandler.rgChildGroupsCache.get(group._thisKey)!;\r\n }\r\n\r\n items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));\r\n\r\n // Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione\r\n if (items.length != 0 || !sel)\r\n return items;\r\n\r\n if (status == 'unselected')\r\n items = sel.group_exclusions.filter((t: any) => t != null && (\r\n (!recursive && t._thisRoute.length == thisGroup._thisRoute.length + 1 && t._thisRoute.startsWith(group._thisKey)) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey))));\r\n else\r\n items = sel.groups.filter((t: any) => t != null && (\r\n (!recursive && t._thisRoute.length == thisGroup._thisRoute.length + 1 && t._thisRoute.startsWith(group._thisKey)) ||\r\n (recursive && t._thisKey.startsWith(group._thisKey))));\r\n\r\n return items;\r\n }\r\n\r\n /** Finalizza le informazioni di selezione del **ItemsSelection** corrente */\r\n private finalizeSelectionInformations(selectionItem: ItemsSelection<any>) {\r\n // Dato che le delete sono logiche dato che tengo la cache degli indici devo renderle fisiche\r\n let tmpGrp = [], tmpItems = [], tmpExcl = [], tmpGrpExcl = [];\r\n let grpRemoved = false, itemsRemoved = false, exclRemoved = false, grpExclRemoved = false;\r\n\r\n for (let i = 0; i < selectionItem.items.length; i++)\r\n if (selectionItem.items[i] != null) tmpItems.push(selectionItem.items[i]);\r\n else itemsRemoved = true;\r\n\r\n for (let i = 0; i < selectionItem.exclusions.length; i++)\r\n if (selectionItem.exclusions[i] != null) tmpExcl.push(selectionItem.exclusions[i]);\r\n else exclRemoved = true;\r\n\r\n // In vecchie versioni dell'AppSearch per cui non vengono deserializzate queste informaizoni potrebbero esserci casini\r\n if (selectionItem.groups) {\r\n for (let i = 0; i < selectionItem.groups.length; i++)\r\n if (selectionItem.groups[i] != null) tmpGrp.push(selectionItem.groups[i]);\r\n else grpRemoved = true;\r\n }\r\n\r\n if (selectionItem.group_exclusions) {\r\n for (let i = 0; i < selectionItem.group_exclusions.length; i++)\r\n if (selectionItem.group_exclusions[i] != null) tmpGrpExcl.push(selectionItem.group_exclusions[i]);\r\n else grpExclRemoved = true;\r\n }\r\n\r\n selectionItem.items = tmpItems;\r\n selectionItem.group_exclusions = tmpGrpExcl;\r\n selectionItem.exclusions = tmpExcl;\r\n selectionItem.groups = tmpGrp;\r\n\r\n // Le cache degli indici potrebbero avere buchi, risolvo\r\n if (grpRemoved)\r\n this.i_groupsCache = this.compactIndexMap(this.i_groupsCache);\r\n if (itemsRemoved)\r\n this.i_itemsCache = this.compactIndexMap(this.i_itemsCache);\r\n if (exclRemoved)\r\n this.i_exclusionsCache = this.compactIndexMap(this.i_exclusionsCache);\r\n if (grpExclRemoved)\r\n this.i_group_exclusionsCache = this.compactIndexMap(this.i_group_exclusionsCache);\r\n\r\n // Poi riprendo a fare tutto in normalità\r\n selectionItem.count = this.evaluateSelected();\r\n\r\n // Se ho fatto selezione \"all\" ma poi mi sono messo a togliere tutti gli elementi fino a rimanerne 0 resetto l'oggetto di selezione\r\n if (selectionItem.count == 0) {\r\n this.est.boundSource().forEach(t => t._selected = false);\r\n selectionItem.all = false;\r\n selectionItem.exclusions = [];\r\n selectionItem.items = [];\r\n selectionItem.groups = [];\r\n selectionItem.group_exclusions = [];\r\n\r\n // Ripulisco la cache altrimenti mi rimane piena di tutte le esclusioni\r\n this.clearSelectionCaches();\r\n }\r\n\r\n // Se la possibilità di fare \"Seleziona tutto\" è abilitata allora la considero appena mi viene selezionato qualcosa\r\n this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());\r\n }\r\n\r\n /** Compatta una cache di indici */\r\n private compactIndexMap(map: Map<string, number>): Map<string, number> {\r\n let index = 0;\r\n let ret = new Map();\r\n for (let key of map.keys())\r\n ret.set(key, index++);\r\n\r\n return ret;\r\n }\r\n\r\n\r\n /**\r\n * Valuta la quantità di oggetti che sono stati selezionati al termine di un evento di selezione\r\n *\r\n * @returns {number} Numero di oggetti selezionati\r\n */\r\n private evaluateSelected(): number {\r\n let si = (this.est.View as AppSearch<any>)?.selection || this.est.arraymodeSelection;\r\n\r\n let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);\r\n let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);\r\n let count = (si.all ? (this.est.BaseItemsCount || 0) : incByGroup) - excByGroup + si.items.length - si.exclusions.length;\r\n\r\n this.est.selectedObjects.set(count);\r\n return count;\r\n }\r\n\r\n /** Gestisce il comando di \"Seleziona tutto in tutte le pagine\" o il suo contrario, cioè \"Reimposta selezione\" */\r\n public selectAllOrResetSelection() {\r\n let selectionItem = this.est.View.selection || this.est.arraymodeSelection;\r\n this.clearSelectionCaches();\r\n selectionItem.all = !selectionItem.all;\r\n selectionItem.exclusions = [];\r\n selectionItem.groups = [];\r\n selectionItem.group_exclusions = [];\r\n selectionItem.items = [];\r\n\r\n // Ripulisco gli stati UI di selezione globale se l'ho disattivata\r\n if (!selectionItem.all) {\r\n this.est.canSelectAll.set(false);\r\n this.est.globalCheck.set(false);\r\n }\r\n\r\n this.finalizeSelectionInformations(selectionItem);\r\n\r\n this.est.onSelectionChanged.emit(selectionItem);\r\n\r\n // Dopo aver resettato direttamente il solo oggetto this.View.selection devo anche riallineare a tutti gli oggetti bindati\r\n this.evaluateSelection(this.est.boundSource(), selectionItem);\r\n }\r\n\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Registra la selezione singola su una cella sulla combo di comandi \"CTRL + Click\".\r\n * Se viene premuto anche il tasto Shift viene creato un range di selezione il cui status di \"selezionato\" viene salvato nella\r\n * matrice virtuale **selectionStatus**\r\n * \r\n * @param {any} event Evento Javascript di Click\r\n * @param {number} row Indice della riga. Non è l'indice vero e proprio ma è l'ordinale (.ordinal) dell'oggetto bindato su quella riga\r\n * @param {number} column Indice della colonna preso banalmente dall'ngIf sui thElement\r\n * @param {{ row: number, column: number }} firstSelectionOverride Permette di overridare il primo elemento selezionato\r\n */\r\n public singleCellSelection(event: {view: any, range: boolean}, row: number, column: number, firstSelectionOverride?: { row: number, column: number }) {\r\n\r\n // Recupero la selezione precedente se presente come punto di partenza\r\n var first = firstSelectionOverride || this.lastSingleSelection;\r\n\r\n //Il punto di arrivo, che diventerà il prossimo punto di partenza, è la selezione corrente\r\n this.lastSingleSelection = { row, column };\r\n \r\n if(event.range)\r\n this.est.utiExts.clearTextSelection();\r\n \r\n this.clearSelectionStatusExcluding(this.lastSingleSelection);\r\n this.setSelectionStatusBorders(event.range && first ? first : this.lastSingleSelection, this.lastSingleSelection);\r\n\r\n // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping\r\n this.est.cdr.markForCheck();\r\n }\r\n\r\n setSelectionStatusBorders(from: {row: number, column: number}, to: {row: number, column: number}){\r\n let rowAddition = to.row < from.row ? -1 : +1;\r\n let columnAddition = to.column < from.column ? -1 : +1;\r\n let singleItem = from == to;\r\n\r\n for (let ir = from.row; ir != to.row + rowAddition; ir += rowAddition)\r\n {\r\n let firstRow = ir == from.row;\r\n let lastRow = ir == to.row;\r\n for (let ic = from.column; ic != to.column + columnAddition; ic += columnAddition) {\r\n let firstCol = ic == from.column;\r\n let lastCol = ic == to.column;\r\n\r\n let current = this.est.selectionStatus[ir][ic];\r\n let prevColumn = ic > 0 ? this.est.selectionStatus[ir][ic - 1] : null;\r\n let nextcolumn = this.est.selectionStatus[ir][ic + 1];\r\n let prevRow = ir > 0 ? this.est.selectionStatus[ir - 1][ic] : null;\r\n let nextRow = this.est.selectionStatus[ir + 1] ? this.est.selectionStatus[ir + 1][ic] : null;\r\n\r\n current.selected = singleItem ? !current.selected : true;\r\n current.lborder = !current.selected ? false : columnAddition > 0 ? firstCol : lastCol;\r\n current.tborder = !current.selected ? false : rowAddition > 0 ? firstRow : lastRow;\r\n current.rborder = !current.selected ? false : columnAddition > 0 ? lastCol : firstCol;\r\n current.bborder = !current.selected ? false : rowAddition > 0 ? lastRow : firstRow;\r\n\r\n if (prevRow)\r\n prevRow.boverlaps = current.tborder;\r\n if (nextRow)\r\n nextRow.toverlaps = current.bborder;\r\n\r\n if (prevColumn)\r\n prevColumn.roverlaps = current.lborder;\r\n if (nextcolumn)\r\n nextcolumn.loverlaps = current.rborder;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper per ripulire lo stato di selezione delle singole celle della tabella, ad esclusione di una singola coordinata\r\n * \r\n * @param {{row: number, column: number}} exclusion Coordinata da escludere nella pulizia\r\n */\r\n public clearSelectionStatusExcluding(exclusion?: { row: number, column: number }) {\r\n for (let row in this.est.selectionStatus) {\r\n for (let column in this.est.selectionStatus[row]) {\r\n\r\n // Se è l'elemento che ho escluso dal cleanup, skippo\r\n if (exclusion && row == exclusion.row.toString() && column == exclusion.column.toString())\r\n continue;\r\n\r\n // Altrimenti pulisco\r\n let curr = this.est.selectionStatus[row][column];\r\n curr.selected = curr.lborder = curr.rborder = curr.tborder = curr.bborder = curr.loverlaps = curr.roverlaps = curr.toverlaps = curr.boverlaps = false;\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Helper che esamina la matrice **selectionStatus** e ne estrappola gli elementi selezionati in una comoda matrice\r\n * \r\n * @returns {{ value: string, type: InputType, val_setter: Function }[][]} Matrice di elementi selezionati con la loro informazione sul tipo\r\n */\r\n public getSelectionStatusSelection(): ItemPropEditableReference[][] {\r\n let selection: ItemPropEditableReference[][] = []\r\n for (let row in this.est.selectionStatus) {\r\n let rowValues: ItemPropEditableReference[] = [];\r\n for (let column in this.est.selectionStatus[row]) {\r\n let ssItem = this.est.selectionStatus[row][column];\r\n if (ssItem.selected)\r\n rowValues.push(ssItem);\r\n }\r\n if (rowValues.length > 0)\r\n selection.push(rowValues);\r\n }\r\n return selection;\r\n }\r\n\r\n /**\r\n * Data la matrice di selezione generata dal metodo **getSelectionStatusSelection** genera la strigna vera e propria da copiare nella Clipboard\r\n * \r\n * @param {{ value: string, type: InputType }[][]} sel Matrice di selezione con valori e tipi dei dati selezionati\r\n * \r\n * @returns {string} Stringa da copiare nella clipboard, le stringhe vengono wrappate fra doppi apici e fra un valore e l'altro viene messo un tab\r\n * in modo che siano compatibili anche con la copia su Excel\r\n */\r\n getClipbardTextFromSelection(sel: ItemPropEditableReference[][]): string {\r\n var ret = \"\";\r\n for (let r = 0; r < sel.length; r++) {\r\n let row = sel[r];\r\n if (r > 0) ret += \"\\n\";\r\n for (let c = 0; c < row.length; c++) {\r\n let col = row[c];\r\n ret += this.getValueByType(col) + (c < row.length - 1 ? \"\\t\" : \"\");\r\n }\r\n }\r\n return ret;\r\n }\r\n\r\n /**\r\n * Ottiene la rappresentazione stringa di un valore dato un tipo\r\n * \r\n * @param {ItemPropEditableReference} valType Oggetto Valore - Tipo da cui estrapolare la rappresentazione del dato in stringa\r\n * \r\n * @returns {string} Valore convertito in stringa in base al tipo\r\n */\r\n getValueByType(valType: ItemPropEditableReference): string {\r\n switch (valType.type) {\r\n case 'string':\r\n return '\"' + valType.value + '\"';\r\n case 'number':\r\n case 'int':\r\n case 'boolean':\r\n case 'enum':\r\n case 'autocomplete':\r\n return valType.value || \"\";\r\n case 'float':\r\n case 'currency':\r\n return parseFloat(valType.value || \"\").toLocaleString(this.est.lc.Locale);\r\n case 'date':\r\n return dayjs(valType.value).format(this.est.lc.token(\"getSmallDateDisplayFormat\"));\r\n case 'datetime':\r\n return dayjs(valType.value).format(this.est.lc.token(\"getFullDateDisplayFormat\"));\r\n case 'time':\r\n return dayjs(valType.value).format(\"HH:mm:ss\");\r\n default:\r\n return valType.value || \"\"\r\n }\r\n }\r\n}","// Angular\r\nimport { Injectable } from \"@angular/core\";\r\n\r\n// Librerie\r\nimport { HashingService } from \"@esfaenza/extensions\";\r\n\r\n/** Classe di utilità per le cose comuni */\r\n@Injectable({ providedIn: 'root' })\r\nexport class UtilitiesHandler {\r\n\r\n /** @ignore Costruttore */\r\n constructor(private hashExts: HashingService) { }\r\n\r\n /**\r\n * Data una lista di oggetti effettua dei raggruppamenti in base alla proprietà **field**, \r\n * restituendo un oggetto del tipo { Gruppo1: oggetti[], Gruppo2: oggetti[], ecc... }\r\n *\r\n * @param {any[]} array Lista degli oggetti da raggruppare\r\n * @param {string} field Campo su cui effettuare i raggruppamenti\r\n *\r\n * @returns {{ [id: string]: any[] }} Dizionario dei gruppi\r\n */\r\n public groupBy(array: any[], field: string): { [id: string]: any[]; } {\r\n let ret = {};\r\n for (let i = 0; i < array.length; i++) {\r\n let x = array[i];\r\n (ret[x[field]] = ret[x[field]] || []).push(x);\r\n }\r\n return ret;\r\n };\r\n\r\n /**\r\n * Helper per effettuare il caching delle aggregazioni. Le sposta da una lista di **GroupAggregation** a una **<Map<string, Map<string, string>>**\r\n *\r\n * @param {any} group Gruppo di cui cachare le aggregazioni\r\n */\r\n public cacheAggregations(group: any) {\r\n (<any>group)._aggregationsCache = new Map();\r\n let castedAgCache = (<Map<string, Map<string, string>>>(<any>group)._aggregationsCache);\r\n for (let i = 0; i < group.aggregations.length; i++) {\r\n let agg = group.aggregations[i];\r\n if (castedAgCache.has(agg.column))\r\n castedAgCache.get(agg.column).set(agg.aggregation, agg.value);\r\n else {\r\n let tmp: Map<string, string> = new Map();\r\n tmp.set(agg.aggregation, agg.value);\r\n castedAgCache.set(agg.column, tmp);\r\n }\r\n }\r\n }\r\n\r\n /** Helper per spostare un oggetto di un array da un indice all'altro, in place */\r\n public arrayMove(array: any[], oldI: number, newI: number) {\r\n if (newI > array.length - 1 || oldI > array.length - 1 || newI < 0 || oldI < 0)\r\n throw \"Gli indici passati non fanno riferimento a una posizione dell'array. Length: \" + array.length + \" Old:\" + oldI + \" New: \" + newI;\r\n\r\n array.splice(newI, 0, array.splice(oldI, 1)[0]);\r\n }\r\n\r\n /**\r\n * Date le informazioni di paginazione ottiene l'array dei pulsanti\r\n *\r\n * @param {number} maxBtns Numero massimo di pulsanti da visualizzare\r\n * @param {number} page Pagina corrente\r\n * @param {number} lastPage Ultima pagina disponibile\r\n *\r\n * @returns {any[]} Pseudo-array di pulsanti a cui ci si può bindare lato HTML\r\n */\r\n public getPagesArray(maxBtns: number, page: number, lastPage: number, actualCount: number = null, ipp: number = null): { val: number, cssClass: string }[] {\r\n let result: { val: number, cssClass: string }[] = [];\r\n\r\n // Se sono in modalità \"Numero di pagine ed oggetti sconosciuti\" faccio in modo di mostrare la pagina successiva solo se gli items effettivamente pervenuti\r\n // sono uguali alla paginazione attuale (cioè questa pagina è di sicuro riempita completamente)\r\n if (lastPage == -1 && ((actualCount == null && ipp == null) || (actualCount == ipp)))\r\n lastPage = page + 1;\r\n\r\n // Se sono in modalità \"Numero di pagine ed oggetti sconosciuti\" e mi arrivano 0 oggetti significa che l'ultima pagina è la precedente e non mostro pagine oltre\r\n if (lastPage == -1 && actualCount == 0)\r\n lastPage = page;\r\n\r\n let min: number, max: number;\r\n if (lastPage <= maxBtns) {\r\n min = 1;\r\n max = lastPage - 1;\r\n } else {\r\n // tolgo la pagina selected è l'ultima pagina che è quella delle pagine totali\r\n let rangeOutside = (maxBtns - 2) / 2;\r\n\r\n min = page - rangeOutside;\r\n max = page + rangeOutside;\r\n\r\n if (min < 1) {\r\n min = 1;\r\n max = maxBtns - 1;\r\n } else if (max >= lastPage) {\r\n min = lastPage - maxBtns + 1;\r\n max = lastPage - 1;\r\n }\r\n }\r\n\r\n result.push({ val: 1, cssClass: (1 === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n\r\n if (max >= min) {\r\n for (let i = min; i <= max; i++)\r\n if (i !== 1)\r\n result.push({ val: i, cssClass: (i === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n\r\n result.push({ val: lastPage, cssClass: (lastPage === page ? 'btn-main app-white-text' : 'app-white-button') });\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Calcola l'hash di un oggetto qualsiasi\r\n *\r\n * @param {any[]} items Oggetti per cui calcolare l'hash\r\n */\r\n public calculateHash(items: any[]) {\r\n if (!items)\r\n return;\r\n\r\n // Supporto a hash duplicati di oggetti uguali\r\n let usedHashesCache: { [index: string]: number; } = {};\r\n for (let i = 0; i < items.length; i++) {\r\n let item = items[i];\r\n\r\n // Prima di calcolare l'hash rimuovo le proprietà interne per evitare che mi scompensino i calcoli successivi\r\n let tmp = Object.assign({}, items[i]);\r\n delete tmp._selected;\r\n delete tmp._visible;\r\n delete tmp._hash;\r\n delete tmp._ordinal;\r\n let hash = this.hashExts.hashObject(tmp);\r\n\r\n usedHashesCache[hash] = usedHashesCache[hash] ? usedHashesCache[hash] + 1 : 1;\r\n item._hash = hash + (usedHashesCache[hash] > 1 ? \"_\" + usedHashesCache[hash] : \"\");\r\n item._ordinal = i;\r\n }\r\n }\r\n\r\n /**\r\n * Se l'Input è null (valore non settato) vede se c'è un default con cui valorizzarlo. Se non c'è utilizza il valore di fallback (qualora fornito)\r\n * \r\n * @param {T} inputValue Valore dell'Input\r\n * @param {T} defaultValue Valore di default impostato da configurazione\r\n * @param {T} fallbackValue Valore dell'Input per quando non è stato assegnato dal programmatore e non ha un default\r\n */\r\n public InputOrDefault<T>(inputValue: T, defaultValue: T, fallbackValue?: T) {\r\n\r\n // Input valorizzato dal programmatore\r\n if (inputValue != null && inputValue != undefined)\r\n return inputValue;\r\n\r\n // Input valorizzato da configurazione globale\r\n if (defaultValue != null && defaultValue != undefined)\r\n return defaultValue;\r\n\r\n //Input non valorizzato da niente e da nessuno\r\n if (fallbackValue != null && fallbackValue != undefined)\r\n return fallbackValue;\r\n\r\n // I casi in cui si arriva qui sono i casi di Input che di default va bene che siano nulli e che nessuno si caga\r\n return null;\r\n }\r\n}\r\n","import { Injectable } from \"@angular/core\";\r\nimport { Subject } from \"rxjs\";\r\n\r\n/** Classe che fornisce dei metodi di estensione in grado di riconoscere e dispatchare l'evento copia e incolla lanciato su una pagina web */\r\n@Injectable({providedIn: \"root\"})\r\nexport class CopyPasteDetector {\r\n\r\n /** Dispatcher del Copia */\r\n public OnCopy: Subject<void> = new Subject<void>();\r\n /** Dispatcher dell' Incolla */\r\n public OnPaste: Subject<void> = new Subject<void>();\r\n /** Riferimento all'estable attiva per evitare di spammare copia incolla dove non servono */\r\n public ActiveEstReference: any = null;\r\n\r\n /** @ignore */\r\n constructor() {\r\n document.addEventListener(\"keydown\", (event: KeyboardEvent) => {\r\n if (event.key === \"c\" && event.ctrlKey)\r\n this.OnCopy.next();\r\n\r\n if (event.key === \"v\" && event.ctrlKey)\r\n this.OnPaste.next();\r\n });\r\n }\r\n}","import { Inject, Injectable, Optional } from \"@angular/core\";\r\nimport { EST_DEBUG } from \"../tokens\";\r\n\r\n/** Classe che fornisce dei metodi di estensione in grado di riconoscere e dispatchare l'evento copia e incolla lanciato su una pagina web */\r\n@Injectable({providedIn: \"root\"})\r\nexport class Logger {\r\n\r\n /** @ignore */\r\n constructor(@Optional() @Inject(EST_DEBUG) public debugMode: boolean) { }\r\n\r\n /**\r\n * Emette un log a console solo se la modalità debug è attiva.\r\n *\r\n * Il testo può essere passato come funzione (**lazy**): in tal caso viene valutato solo quando il debug è attivo,\r\n * evitando di costruire stringhe costose (es. interpolazioni per-cella) quando i log sono disabilitati.\r\n */\r\n public log(text: string | (() => string)) {\r\n if (this.debugMode)\r\n console.log(\"[@esfaenza/es-table @ \" + (new Date()).toISOString() + \"] \" + (typeof text === 'function' ? text() : text));\r\n }\r\n}","//Angular\r\nimport { Component, Input, Output, EventEmitter, ElementRef, ViewChild, Renderer2, HostListener, ChangeDetectionStrategy, input, signal, computed, WritableSignal } from \"@angular/core\";\r\n\r\n/** Componente rappresentante una Colonna della tabella */\r\n@Component({\r\n selector: \"[es-th]\",\r\n templateUrl: \"./es_th.component.html\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n standalone: false\r\n})\r\nexport class EsTh {\r\n\r\n /** Dizionario di mappatura con ordinamento attuale e ordinamento successivo per gestire i passaggi di stato */\r\n private orderNext: { [index: string]: 'DESC' | 'ASC' | null } = { \"NONE\": \"DESC\", \"DESC\": \"ASC\", \"ASC\": null };\r\n\r\n /** Indicazione sulla visibilità della colonna */\r\n private _Visible?: boolean;\r\n\r\n /** Indica se si sta effettuando un'operazione di resize su questa colonna */\r\n private resizingThis: boolean = false;\r\n\r\n /**\r\n * Storicizza l'offset di partenza del resize dell'elemento HTML per poter calcolare la nuova dimensione richiesta durente il resize \r\n * \r\n * nuova width = startOffset + posizione X del mouse\r\n */\r\n private startOffset: number = 0;\r\n\r\n /** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */\r\n ID = input<string>(\"\", { alias: \"es-th\" });\r\n\r\n /** Ordinamento attuale della colonna */\r\n _Order = input<'DESC' | 'ASC' | null, 'DESC' | 'ASC' | null>(null, { alias: 'Order', transform: (value: 'DESC' | 'ASC' | null) => this.setUnderlyingSignal(\"Order\", value) });\r\n Order = signal<'DESC' | 'ASC' | null>(null);\r\n\r\n /** Indica se questa colonna è ordinabile o meno */\r\n Orderable = input<boolean>(true);\r\n\r\n /** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */\r\n Display = input<string>(\"\");\r\n\r\n /** Indica se le dimnsioni di questa colonna sono modificabili o meno */\r\n Resizable = input<boolean | null>(false);\r\n\r\n /** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */\r\n Pinned = input<boolean>(false);\r\n\r\n /**\r\n * Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio \r\n * come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi\r\n */\r\n SearchInProgress = input<boolean>(false);\r\n\r\n /** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */\r\n OrderBy = input<boolean | null>(null);\r\n\r\n /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */\r\n Wrap = input<boolean>(false);\r\n\r\n /** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */\r\n Fixed = input<boolean>(false);\r\n\r\n /** Evento emesso al cambio di ordinamento effettuato su questa colonna */\r\n @Output() public onOrderChange: EventEmitter<'DESC' | 'ASC' | null> = new EventEmitter<'DESC' | 'ASC' | null>();\r\n\r\n /** Evento emesso all'unpinning della colonna */\r\n @Output() public onUnpinning: EventEmitter<string> = new EventEmitter<string>();\r\n\r\n /** Classi da applicare alla colonna */\r\n public Class = signal<string>(\"\");\r\n\r\n /** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */\r\n public _referenced = signal(false);\r\n\r\n private setUnderlyingSignal<T>(signalName: string, value: T) {\r\n ((this as any)[signalName] as WritableSignal<T>).set(value);\r\n return value;\r\n }\r\n\r\n /** @ignore */\r\n constructor(private myself: ElementRef, private renderer: Renderer2) { }\r\n\r\n /**\r\n * Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**\r\n * \r\n * @param {boolean} expression Indicazione della visibilità\r\n */\r\n @Input() set Visible(expression: boolean) {\r\n this._Visible = expression;\r\n\r\n if (expression)\r\n this.renderer.removeClass(this.myself.nativeElement, \"app-display-none\");\r\n else\r\n this.renderer.addClass(this.myself.nativeElement, \"app-display-none\");\r\n }\r\n\r\n /**\r\n * Restituisce lo stato di Visibilità della colonna in oggetto\r\n * \r\n * @returns {boolean} **true** se visibile, **false** altrimenti\r\n */\r\n get Visible(): boolean {\r\n if (this._Visible == undefined)\r\n this._Visible = true;\r\n\r\n return this._Visible;\r\n }\r\n\r\n /** @ignore */\r\n ngAfterViewInit() {\r\n this.Class.set(this.myself.nativeElement.className.replace(\"app-display-none\", \"\"));\r\n\r\n //Resize\r\n if (this.Resizable())\r\n this.renderer.addClass(this.myself.nativeElement, \"app-relative\");\r\n }\r\n\r\n /** Emette l'evento di unpinning */\r\n unpin() {\r\n this.onUnpinning.emit(this.ID());\r\n }\r\n\r\n /** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */\r\n setupNextOrderAndNotify() {\r\n if (!this.ID()) {\r\n console.log(\"Attempt to order a column without ID. Operation ignored\");\r\n return;\r\n }\r\n\r\n if (this.SearchInProgress()) {\r\n console.log(\"Attempt to order a column during a search. Operation ignored\");\r\n return;\r\n }\r\n\r\n if (!this.OrderBy() || !this.Orderable())\r\n return;\r\n\r\n var nextOrder = this.orderNext[this.Order() || \"NONE\"];\r\n this.Order.set(nextOrder);\r\n this.onOrderChange.emit(nextOrder);\r\n }\r\n\r\n /**\r\n * Evento di inizio resize della colonna\r\n * \r\n * @param {any} ev Evento MouseDown\r\n */\r\n onResizeStart(ev: Event) {\r\n if (!this.Resizable())\r\n return;\r\n\r\n this.resizingThis = true;\r\n this.startOffset = this.myself.nativeElement.offsetWidth - (ev as MouseEvent).pageX;\r\n }\r\n\r\n /** Listener per la fine dell'operazione di resize */\r\n @HostListener('window:mouseup.out-zone')\r\n public onMouseUp(): void {\r\n if (!this.Resizable())\r\n return;\r\n\r\n this.resizingThis = false;\r\n }\r\n\r\n /**\r\n * Listener per gestire il movimento del mouse qualora un'operazione di resize fosse in esecuzione\r\n * \r\n * @param {$event} ev Evento MouseMove\r\n */\r\n @HostListener('window:mousemove.out-zone', ['$event'])\r\n public onMouseMove($event: Event): void {\r\n if (!this.Resizable() || !this.resizingThis)\r\n return;\r\n\r\n //Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo\r\n //(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)\r\n this.myself.nativeElement.style.width = (this.startOffset + ($event as MouseEvent).pageX) + \"px\";\r\n\r\n //Fermo il bubbling per non fare cose strane\r\n $event.preventDefault();\r\n }\r\n}","<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\n <ng-content></ng-content>&nbsp;\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\n</span>\n@if (Pinned() && !Fixed()) {\n<span class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\n}\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\n <div class=\"est-head-resizer-internal\"></div>\n</div>","// Angular\r\nimport { Component, ChangeDetectionStrategy, EventEmitter, Output, ElementRef, signal, input } from \"@angular/core\";\r\n\r\n/** Componente rappresentante una singola cella del body della tabella */\r\n@Component({\r\n selector: \"[es-td]\",\r\n templateUrl: \"./es_td.component.html\",\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n styleUrls: [\"es_td.component.scss\"],\r\n standalone: false\r\n})\r\nexport class EsTd {\r\n\r\n /** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */\r\n ID = input<string>(\"\", { alias: \"es-td\" });\r\n /** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */\r\n Context = input<string>();\r\n\r\n /** Quando questa cella viene generata questo evento permette di dire \"ehi, sono nato!\" */\r\n @Output() onCellGeneration: EventEmitter<{ id: string, hash: string, self: EsTd }> = new EventEmitter<{ id: string, hash: string, self: EsTd }>();\r\n\r\n /** Errore attualmente presente sulla cella */\r\n public ValidationError = signal<string>(\"\");\r\n\r\n /** @ignore */\r\n constructor(public el: ElementRef) { }\r\n\r\n /** @ignore */\r\n ngAfterViewInit() {\r\n this.onCellGeneration.emit({ id: this.ID(), hash: this.Context(), self: this });\r\n }\r\n\r\n /** Api per impostare un \"errore\" su questa cella in maniera programmatica */\r\n public validationError(error?: string) {\r\n this.ValidationError.set(error);\r\n }\r\n}","<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\nimport { DateService } from \"@esfaenza/extensions\";\r\n\r\n@Pipe({\r\n name: 'est_format',\r\n standalone: false\r\n})\r\nexport class EstFormatPipe implements PipeTransform {\r\n\r\n constructor(private dates: DateService) { }\r\n\r\n transform(value: string, format: string) {\r\n if (!format) {\r\n // Se è un formato data mi assicuro di non stampare mai una data 00:00:00 altrimenti in esportazione viene uno schifo\r\n return value ? this.dates.trimSeconds(value.toString()) : \"\";\r\n } else {\r\n // Caso formato numerico\r\n if (format.startsWith(\"F\")) {\r\n if (!value)\r\n return \"\";\r\n\r\n if (format.length != 2)\r\n return value.toString().replace(/,/, \"\").replace(\".\", \",\");\r\n\r\n else {\r\n let tmp = parseFloat(value);\r\n let cifre = parseInt(format[1]);\r\n if (isNaN(tmp) || isNaN(cifre)) return \"\";\r\n\r\n return (Math.trunc(tmp * Math.pow(10, cifre)) / Math.pow(10, cifre)).toString();\r\n }\r\n } else {\r\n // Se ho un formato data trasformo in dayjs, formatto ed esporto\r\n // Per la trasformazione in dayjs provo prima a passargli la stringa di netto, sperando la riconosca\r\n // Se non funziona provo a definirgli la formattazione standard del metering per quel linguaggio\r\n return this.dates.getFormatted(value, format.length <= 10, format.length > 16);\r\n }\r\n }\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_lookup',\r\n standalone: false\r\n})\r\nexport class EstLookupPipe implements PipeTransform {\r\n\r\n transform(value: string, source: { id: string, description: string }[]) {\r\n for (let i = 0; i < source.length; i++) {\r\n if (source[i].id == value)\r\n return source[i];\r\n }\r\n return { id: \"\", description: \"\" };\r\n }\r\n}","import { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_routerlink',\r\n standalone: false\r\n})\r\nexport class EstRouterLinkPipe implements PipeTransform {\r\n\r\n /** Cache per i routerLink generati nelle tabelle dinamiche */\r\n public routerLinksCache: {} = {};\r\n\r\n transform(item: any, path: string, parameters: string[]) {\r\n if (this.routerLinksCache[item._hash + path]) {\r\n return this.routerLinksCache[item._hash + path];\r\n } else {\r\n let link = this.getRouterLink(path, parameters, item);\r\n this.routerLinksCache[item._hash + path] = link;\r\n return link;\r\n }\r\n }\r\n\r\n /**\r\n * Crea un router link\r\n *\r\n * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...\r\n * @param {string[]} pars Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**\r\n * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**\r\n * @param {any} item Oggetto collegato a questo contesto. Può essere un oggetto generico (con \"properties\") o un oggetto ben definito\r\n *\r\n * @returns {any} Router link generato in base al parametri\r\n */\r\n private getRouterLink(path: string, pars: string[], item: any): any {\r\n\r\n for (let i = 0; i < pars.length; i++)\r\n path = path.replace('{' + i + '}', item.properties ? item.properties[pars[i]] : item[pars[i]]);\r\n\r\n path = path.replace(/'/g, '\"').replace(/ /g, '');\r\n return JSON.parse(path);\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform, QueryList } from \"@angular/core\";\r\n\r\n// Services\r\nimport { Logger } from \"../../core/Logger\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTdDirective } from \"../../directives/es_td.directive\";\r\n\r\n@Pipe({\r\n name: 'est_renderer',\r\n standalone: false\r\n})\r\nexport class EstRendererPipe implements PipeTransform {\r\n\r\n constructor(private logger: Logger) { }\r\n\r\n transform(propName: string, params: { name: string, src: QueryList<EsTdDirective> | undefined, fallback: any }) {\r\n\r\n if(!params.src)\r\n return params.fallback;\r\n\r\n var EsTd = null;\r\n // Perf. Version di `params.src.find((item) => params.name ? item.td === params.name : item.tdForProperty === propName);`\r\n for (let i = 0; i < params.src.length; i++) {\r\n let item = params.src.get(i)!;\r\n if (params.name && item.td === params.name || !params.name && item.tdForProperty === propName) {\r\n EsTd = item;\r\n break;\r\n }\r\n }\r\n\r\n // Name non trovato, fallback al nome della colonna\r\n if (propName && params.name && !EsTd) {\r\n this.logger.log(`Renderer retrieved in a non performant way`);\r\n EsTd = params.src.find((item) => item.tdForProperty === propName);\r\n }\r\n\r\n this.logger.log(() => `Renderer ${EsTd ? 'found' : 'NOT found'} for '${propName}${params.name ? '/' + params.name : ''}'${!EsTd ? '. Using fallback renderer' : ''}`);\r\n var ret = EsTd ? EsTd.Template : params.fallback;\r\n\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform, QueryList } from \"@angular/core\";\r\n\r\n// Services\r\nimport { Logger } from \"../../core/Logger\";\r\n\r\n// Componenti / Direttive\r\nimport { EsTdEditorDirective } from \"../../directives/es_td_editor.directive\";\r\n\r\n@Pipe({\r\n name: 'est_editor',\r\n standalone: false\r\n})\r\nexport class EstEditorPipe implements PipeTransform {\r\n\r\n constructor(private logger: Logger) { }\r\n\r\n transform(propName: string, params: { name: string, src: QueryList<EsTdEditorDirective> | undefined, fallback: any }) {\r\n\r\n if (!params.src)\r\n return params.fallback;\r\n\r\n \r\n var Editor = null;\r\n\r\n // Perf. Version di `params.src.find((item) => params.name ? item.editor === params.name : item.editorForProperty === propName);`\r\n for (let i = 0; i < params.src.length; i++) {\r\n let item = params.src.get(i)!;\r\n if (params.name && item.editor === params.name || !params.name && item.editorForProperty === propName) {\r\n Editor = item;\r\n break;\r\n }\r\n }\r\n\r\n // Name non trovato, fallback al nome della colonna\r\n if (propName && params.name && !Editor) {\r\n this.logger.log(`Editor retrieved in a non performant way`);\r\n Editor = params.src.find((item) => item.editorForProperty === propName);\r\n }\r\n\r\n this.logger.log(() => `Editor ${Editor ? 'found' : 'NOT found'} for '${propName}${params.name ? '/' + params.name : ''}'${!Editor ? '. Using fallback editor' : ''}`);\r\n var ret = Editor ? Editor.Template : params.fallback;\r\n\r\n return ret;\r\n }\r\n}","// Angular\r\nimport { Pipe, PipeTransform } from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'est_propinsensitive',\r\n standalone: false\r\n})\r\nexport class EstPropInsensitivePipe implements PipeTransform {\r\n\r\n transform(item: any, property: string) {\r\n for (let prop in item) {\r\n if (prop.toLowerCase() == property.toLowerCase())\r\n return item[prop];\r\n }\r\n return \"\";\r\n }\r\n}\r\n","/** Raccolta di tutti gli Input dell'EsTable a cui può essere logicamente sensato assegnare default per progetto */\r\nexport class EsTableDefaultable {\r\n /** @ignore Vedi **EsTableComponent** */ ColumnsResizable?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ AutoUpdate?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ AllSearch?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ Export?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePaging?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePagingCount?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ HidePagingButtons?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ContainerClass?: string;\r\n /** @ignore Vedi **EsTableComponent** */ TableClass?: string;\r\n /** @ignore Vedi **EsTableComponent** */ Selection?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ SavePreferences?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ PagingStyle?: 'both' | 'top' | 'bottom';\r\n /** @ignore Vedi **EsTableComponent** */ RowGroupingPagingStyle?: 'left' | 'right';\r\n /** @ignore Vedi **EsTableComponent** */ UseSelectionCache?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ShowItemGroupsColumns?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ ArraymodeItemsPerPage?: number;\r\n /** @ignore Vedi **EsTableComponent** */ ColumnsPinnable?: boolean;\r\n /** @ignore Vedi **EsTableComponent** */ DefaultAlignment?: 'Left' | 'Center' | 'Right';\r\n}\r\n","// Angular\r\nimport {\r\n Component, ContentChildren, QueryList, ChangeDetectorRef, ChangeDetectionStrategy, Input,\r\n EventEmitter, Output, ContentChild, ViewChild, ElementRef, ViewEncapsulation, Optional, Self, TemplateRef, Inject, Type,\r\n Renderer2, WritableSignal, signal, input, effect,\r\n NgZone, model\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\r\n\r\n// Configurazioni\r\nimport { UtilityService, ExportService, MessageService, DateService, ClipboardService, AppEmbeddingExtensions } from '@esfaenza/extensions';\r\nimport { LocalizationService } from '@esfaenza/localizations';\r\nimport { PreferencesService } from '@esfaenza/preferences';\r\n\r\n// Plugins\r\nimport { ContextMenuComponent } from '@esfaenza/ngx-contextmenu';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\r\n\r\n// Modelli / Tipi\r\nimport { AppSearch } from \"../../domain/externals/appsearch/AppSearch\";\r\nimport { AppOrdering } from \"../../domain/externals/appsearch/AppOrdering\";\r\nimport { EsTableColumnsDefinition } from \"../../domain/externals/EsTableColumnsDefinition\";\r\nimport { CornerMenuOption } from \"../../domain/externals/CornerMenuOption\";\r\nimport { EsTableOperationDefinition } from \"../../domain/externals/EsTableOperationDefinition\";\r\nimport { EsTableColumn } from \"../../domain/internals/EsTableColumn\";\r\nimport { GroupPager } from \"../../domain/internals/GroupPager\";\r\nimport { GroupRouteFragment } from \"../../domain/internals/GroupRouteFragment\";\r\nimport { ThElement } from \"../../domain/internals/ThElement\";\r\nimport { PagerInfos } from \"../../domain/internals/PagerInfos\";\r\nimport { ThGroup } from \"../../domain/internals/ThGroup\";\r\nimport { TdElement } from \"../../domain/internals/TdElement\";\r\nimport { ItemsSelection } from '../../domain/externals/appsearch/ItemsSelection';\r\nimport { GroupOrAggregation } from \"../../domain/externals/appsearch/GroupOrAggregation\";\r\nimport { GroupFilter } from \"../../domain/externals/appsearch/GroupFilter\";\r\nimport { Group } from \"../../domain/externals/appsearch/Group\";\r\nimport { EsTableModelChange } from '../../domain/externals/EsTableModelChange';\r\nimport { ItemPropEditableReference } from '../../domain/externals/ItemPropEditableReference';\r\nimport { EsTableDefaultable } from '../../domain/configuration/EsTableDefaultable';\r\nimport { EsTdReference } from './../../domain/internals/EsTdReference';\r\n\r\n// Componenti e Localizzazione\r\nimport { EsTd } from '../es-td/es_td.component';\r\nimport { EsTdDirective } from '../../directives/es_td.directive';\r\nimport { EsThDirective } from '../../directives/es_th.directive';\r\nimport { EsTdEditorDirective } from '../../directives/es_td_editor.directive';\r\nimport { ThTdProvider } from '../../directives/es_th_td_provider.directive';\r\nimport { EsTableLoc } from './es_table.component.loc';\r\n\r\n// Tokens\r\nimport { EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL } from '../../tokens';\r\n\r\n// Handlers\r\nimport { ExportHandler } from \"../../core/handlers/ExportHandler\";\r\nimport { ColumnMetadataHandler } from \"../../core/handlers/ColumnMetadataHandler\";\r\nimport { DynamicModeHandler } from \"../../core/handlers/DynamicModeHandler\";\r\nimport { HierarchyModeHandler } from \"../../core/handlers/HierarchyModeHandler\";\r\nimport { ItemsHandler } from \"../../core/handlers/ItemsHandler\";\r\nimport { ReportModeHandler } from \"../../core/handlers/ReportModeHandler\";\r\nimport { RowGroupingHandler } from \"../../core/handlers/RowGroupingHandler\";\r\nimport { SelectionHandler } from \"../../core/handlers/SelectionHandler\";\r\nimport { UtilitiesHandler } from \"../../core/handlers/UtilitiesHandler\";\r\n\r\n// Service\r\nimport { CopyPasteDetector } from '../../core/CopyPasteDetector';\r\nimport { Logger } from '../../core/Logger';\r\n\r\n// Rxjs\r\nimport { Subject, Subscription, forkJoin, fromEvent, takeUntil } from 'rxjs';\r\n\r\n/** Componente che permette di rappresentare una griglia di valori */\r\n@Component({\r\n selector: 'es-table',\r\n viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n styleUrls: ['./es_table.component.scss'],\r\n templateUrl: './es_table.component.html',\r\n standalone: false\r\n})\r\nexport class EsTableComponent implements ControlValueAccessor {\r\n\r\n private _destroyed$: Subject<void> = new Subject();\r\n\r\n // Componenti per la gestione delle varie funzionalità dell'es-table\r\n /** @ignore */ public export_H: ExportHandler;\r\n /** @ignore */ public columnMetadata_H: ColumnMetadataHandler;\r\n /** @ignore */ public dynamicMode_H: DynamicModeHandler;\r\n /** @ignore */ public hierarchyMode_H: HierarchyModeHandler;\r\n /** @ignore */ public items_H: ItemsHandler;\r\n /** @ignore */ public reportMode_H: ReportModeHandler;\r\n /** @ignore */ public rowGrouping_H: RowGroupingHandler\r\n /** @ignore */ public selection_H: SelectionHandler;\r\n\r\n // Subscribers per gli eventi di copia e incolla\r\n /** @ignore */ private copySubscription: Subscription;\r\n /** @ignore */ private pasteSubscription: Subscription;\r\n\r\n /** @ignore */\r\n constructor(\r\n private _zone: NgZone,\r\n @Self() @Optional() public ngControl: NgControl,\r\n @Optional() private prefService: PreferencesService,\r\n @Optional() @Inject(EST_DEFAULTS) private deafults: EsTableDefaultable,\r\n @Optional() @Inject(EST_DEBUG) private debugMode: boolean,\r\n @Optional() @Inject(EST_EXPORT_GLOBAL_ACL) public exportGlobalAcl: string,\r\n public lc: LocalizationService,\r\n public cdr: ChangeDetectorRef,\r\n private utilities_H: UtilitiesHandler,\r\n public utiExts: UtilityService,\r\n private expExts: ExportService,\r\n public dateExts: DateService,\r\n private msgExts: MessageService,\r\n private copyPasteDetector: CopyPasteDetector,\r\n private clipboardService: ClipboardService,\r\n private logger: Logger,\r\n private emb: AppEmbeddingExtensions,\r\n private rendererRef: Renderer2\r\n ) {\r\n\r\n effect(() => {\r\n let sv = this.SearchView();\r\n if (sv) this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, sv.page, sv.pages || 1, sv.objectcount || sv.items.length, sv.itemsperpageoverride));\r\n });\r\n\r\n // Sarebbe bello... per quando View diventa signal\r\n /*effect(() => {\r\n \r\n if (this.View) {\r\n let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;\r\n if (firstItemGroupOrNoGrouping)\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));\r\n }\r\n })*/\r\n\r\n // Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata\r\n this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this) this.handleCopy(); });\r\n this.pasteSubscription = this.copyPasteDetector.OnPaste.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this) this.handlePaste(); });\r\n\r\n this.export_H = new ExportHandler(this, this.expExts, this.msgExts, this.utiExts, this.dateExts);\r\n this.rowGrouping_H = new RowGroupingHandler(this, this.utilities_H, this.dateExts);\r\n this.columnMetadata_H = new ColumnMetadataHandler(this, this.utilities_H, this.utiExts, this.prefService, this.rowGrouping_H);\r\n this.dynamicMode_H = new DynamicModeHandler(this);\r\n this.hierarchyMode_H = new HierarchyModeHandler(this);\r\n this.items_H = new ItemsHandler(this, this.utilities_H);\r\n this.reportMode_H = new ReportModeHandler(this, this.utilities_H);\r\n this.selection_H = new SelectionHandler(this, this.rowGrouping_H);\r\n\r\n if (ngControl)\r\n ngControl.valueAccessor = this;\r\n }\r\n\r\n /** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */\r\n public FocusSubject: Subject<void> = new Subject<void>()\r\n /** Timer che verrà impostato a **doubleClickBufferMs** per capire se è stato effettuato un click singolo o un doubleclick */\r\n private cellDbClickTimer: any;\r\n /** Se vengono effettuati 2 click a distanza inferiore a questi Millisecondi viene considerato un doppio click */\r\n private doubleClickBufferMs: number = 200;\r\n /** Tiene da conto l'ultimo elemento selezionato in modo da poter effettuare il SHIFT+CLICK */\r\n private lastSelected: any = null;\r\n\r\n /** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */\r\n public View: any = null; // TODO: signal\r\n /** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */\r\n public arrayPulsanti = signal<{ val: number, cssClass: string }[]>([]);\r\n /** Indica se l'es-table deve mostrare il check globale nell'header per fare il \"seleziona tutto\" */\r\n public globalCheck = model(false);\r\n /** Conteggio interno per il numero di elementi selezionati */\r\n public selectedObjects = signal(0);\r\n /** Indica se è possibile effettuare una selezione massiva */\r\n public canSelectAll = signal<boolean>(false);\r\n /** Indica se il componente sta gestendo un IAppSearch<any> */\r\n public viewMode = signal(false);\r\n /** Indica se il componente sta gestendo un any[] */\r\n public arrayMode = signal(false);\r\n\r\n /**\r\n * Contenitore degli elementi da listare lato interfaccia dopo tutte le elaborazioni del caso,\r\n * generalmente non sono altro che tutti gli oggetti da presentare con in più l'hash calcolato per identificare 1 oggetto con la propria riga\r\n */\r\n public boundSource= signal<any[]>([]);\r\n /** Stessa cosa della **boundSource**, utilizzata come appoggio temporaneo interno */\r\n public TMPBoundSource: any[] = [];\r\n /** @deprecated \"Fetta\" di oggetti utilizzata nell'endless scroll, ogni elemento di questo array è un blocchetto di 100 elementi */\r\n public boundSubSources: any[] = [];\r\n /** @deprecated Questa funge da indicatore per gli slice inseriti, la lunghezza dovrebbe essere corrispondente a **boundSubSources** */\r\n public addedSlices: number[] = [];\r\n /** Variabile che identifica il valore del \"seleziona Tutto\" nella paginazione */\r\n public defaultAllPageOverride = 999999;\r\n /** Serve per tenere in memoria il conteggio precedente e recuperarlo in caso diventi -2 (verificare con Ale perché la logica del -2) */\r\n public previousCount?: number;\r\n /** Indica se utilizzare il sistema di autoupdate, cioè un trigger time-izzato in alto a destra della tabella che ripete le ricerche ogni X **seconds** */\r\n public autoUpdate = model(false);\r\n /** Numero di secondi da fare trascorrere fra una ricerca e l'altra */\r\n public seconds = model(\"10\");\r\n /** Riferimento all'Interval che viene generato se **autoUpdate** è impostata a true in modo da poterlo ripulire */\r\n public updateTimer: any;\r\n /** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */\r\n public researchInProgress = model(false);\r\n /** Modello di appoggio temporaneo per i **RowTDs** */\r\n public TMPRowTDs: { [context: string]: WritableSignal<TdElement>[] } = {};\r\n /** Modello rappresentante un dizionario di righe della tabella, con chiave l'hash e valore la lista di celle */\r\n public RowTDs: { [context: string]: WritableSignal<TdElement>[] } = {};\r\n /** Indica se **RowTDs** è un oggetto vuoto o meno */\r\n public EmptyRowTds = signal(true);\r\n /** Modello di appoggio temporaneo per i **RowTHs** */\r\n public TMPRowTHs: ThElement[] = [];\r\n /** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */\r\n public RowTHs: ThElement[] = [];\r\n /** Modello di appoggio temporaneo per i **RowThGroups** */\r\n public TMPRowThGroups: ThGroup[][] = [];\r\n /** Modello rappresentante un singolo header group della tabella. Questa lista è già ordinata e pronta per essere utilizzata in ngFor */\r\n public RowThGroups: ThGroup[][] | null = [];\r\n\r\n /**\r\n * Lista dei contesti. Un contesto non è altro che un hash particolare calcolato su un oggetto che identifica univocamente tale oggetto.\r\n *\r\n * Ognuno di questi contesti rappresenterà a sua volta, univocamente, una riga all'interno della tabella\r\n */\r\n public RowContexts: any[] = [];\r\n /** Direttive di ordinamento delle colonne (non ordinamento dei dati ma delle colonne in se) */\r\n public OrderDirectives: string[] = [];\r\n /** Codice dell'ultimo oggetto solezionato */\r\n public lastSelectedItemID: string | null = null;\r\n\r\n /**\r\n * Decide se utilizzare o meno le CustomCells. Impostandolo a **true** l'es-table diventa in grado di gestire nativamente:\r\n *\r\n * 1) Ordinamento e visibilità delle colonne\r\n *\r\n * 2) Ordinamento dei dati\r\n *\r\n * 3) Modalità Gerarchica\r\n *\r\n * ecc...\r\n * viene dedotto dal sistema in automatico\r\n */\r\n public UseCustomCells = signal<boolean | null>(null);\r\n\r\n /**\r\n * Indica se oltre alle colonne dinamiche specifiche di un tipo di oggetto ci sono anche colonne dinamiche aggiunte dall'utente\r\n *\r\n * Es. una colonna in cui mostrare sempre un iconcina\r\n */\r\n public UserDefinedDynamicCols = signal<boolean>(false);\r\n /** Indica che questo è il primo Bind della tabella, viene settato a false non appena il primo bind viene terminato con successo */\r\n public FirstBind = signal<boolean>(true);\r\n /** Lista di colonne che si possono visualizzare/ordinare fra di loro */\r\n public ColumnsList: EsTableColumn[] = [];\r\n /** Variabile d'appoggio usata dalla dialog di selezione/nascondimento, per evitare di danneggiare **ColumnsList** in caso di modifiche poi annullate */\r\n public TMPColumnsList: EsTableColumn[] = [];\r\n /** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */\r\n public globalColVisCheck = model(false);\r\n\r\n private setUnderlyingSignal<T>(signalName: string, value: T){\r\n ((this as any)[signalName] as WritableSignal<T>).set(value);\r\n return value;\r\n }\r\n\r\n /** Query per recuperare tutte le direttive per gli editor custom delle celle */\r\n @ContentChildren(EsTdEditorDirective) EsTdEditorDirectives?: QueryList<EsTdEditorDirective>;\r\n /** Query per recuperare tutte le nuove direttive assegnati a direttiva (Per la modalità dinamica dell'es-table) */\r\n @ContentChildren(EsTdDirective) EsTdsDirective?: QueryList<EsTdDirective>;\r\n /** Query per recuperare tutti gli es-td assegnati a direttiva (Per la modalità dinamica dell'es-table) */\r\n @ContentChildren(EsThDirective) EsThsDirective?: QueryList<EsThDirective>;\r\n /** Query per recuperare tutti gli es-td e gli es-th assegnati da parte di un provider (per integrare in maniera dinamica i th e td esistenti) */\r\n @ContentChildren(ThTdProvider) ThTdProvider?: QueryList<ThTdProvider>;\r\n /** Permette di collegare un provider senza passare dalla proiezione */\r\n @Input() EsThTdProvider?: ThTdProvider;\r\n /** Query per recuperare le informazioni del body (punto della tabella dove vengono mostrate le righe) */\r\n @ContentChild('body', { static: false }) public bodyRef: any;\r\n /** Query per recuperare le informazioni dell'header (punto della tabella dove vengono mostrate le intestazioni delle righe) */\r\n @ContentChild('header', { static: false }) public headerRef: any;\r\n /** @deprecated Query per recuperare le informazioni sul raggruppamento degli header */\r\n @ContentChild('headerGroup', { static: false }) public headerGroupRef: any;\r\n /** @deprecated Query per recuperare le informazioni sul raggruppamento di secondo livello degli header */\r\n @ContentChild('secondaryHeaderGroup', { static: false }) public secondaryHeaderGroupRef: any;\r\n /** Query per recuperare il campo di Input attuale. Dopo un doppio click lo becco e lo focusso appena termina la change detection */\r\n @ViewChild('input', { static: false }) public inputField?: ElementRef;\r\n /** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */\r\n CornerMenuOptions = input<CornerMenuOption[]>([]);\r\n /** Indica se dev'essere possibile effettuare il resize delle colonne */\r\n _ColumnsResizable = input<boolean|null>(null, { alias: \"ColumnsResizable\" });\r\n ColumnsResizable = signal<boolean|null>(null);\r\n /** Indica se dev'essere possibile effettuare il pinning delle colonne */\r\n _ColumnsPinnable = input<boolean|null>(null, { alias: \"ColumnsPinnable\" });\r\n ColumnsPinnable = signal<boolean|null>(null);\r\n /** Indica se dev'essere disponibile il sistema di aggiornamento automatico */\r\n _AutoUpdate = input<boolean|null>(null, { alias: \"AutoUpdate\" });\r\n AutoUpdate = signal<boolean|null>(null);\r\n /** Indica l'altezza cablata che deve assumere la tabella. Es: \"100px\" | \"100%\" ... */\r\n Height = input<string|undefined>(undefined);\r\n /** Indica il colore di sfondo dello spazio vuoto (non ricoperto da dati). Particolarmente utile da impostare in caso di **Height** diverso da null */\r\n EmptySpaceBackgroundColor = input<string>(\"\");\r\n /** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/\r\n EsTableHandledSearch = input<boolean>(false);\r\n\r\n /** Permette di impostare l'altezza massima della tabella. Se null la dimensione si adatta al numero di elementi attualmente in visualizzazione */\r\n MaxHeight = input<number|undefined>(undefined);\r\n /** Classi da applicare al contenitore della tabella */\r\n _ContainerClass = input<string|null>(null, { alias: \"ContainerClass\" });\r\n ContainerClass = signal<string|null>(null);\r\n /** Permette o meno l'export in formato XLSX */\r\n XLSXExport = input<boolean>(false);\r\n /** Permette o meno l'export in formato CSV */\r\n CSVExport = input<boolean>(true);\r\n /** Permette di visualizzare o meno l'opzione di paginazione \"Tutti\" */\r\n _AllSearch = input<boolean|null>(null, { alias: \"AllSearch\" });\r\n AllSearch = signal<boolean|null>(null);\r\n /** Diminuisce gli spazi fra una cella e l'altra, e internamente il padding del font in modo da presentare molti più dati in un'unica pagina */\r\n HighCellDensity = input<boolean>(false);\r\n /** Abilita o meno la possibilità di selezionare oggetti */\r\n _Selection = input<boolean|null, boolean|null>(null, { alias: \"Selection\", transform: (value: boolean | null) => this.setUnderlyingSignal(\"Selection\", value) });\r\n Selection = signal<boolean|null>(null);\r\n /** Mostra o meno un messaggio di Loading al primo caricamento della tabella */\r\n ShowLoadingOnBootstrap = input<boolean>(false);\r\n /** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */\r\n Removal = input<boolean>(false);\r\n\r\n /**\r\n * Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata\r\n *\r\n * Come condizione si considera un semplice campo su cui effettuare un controllo booleano, come ad esempio \"canremove\"\r\n */\r\n RemovalCondition = input<string>('');\r\n /** Indica se abilitare la possibilità di esportare la vista dati attuale */\r\n _Export = input<boolean|null>(null, { alias: \"Export\" });\r\n Export = signal<boolean|null>(null);\r\n /** Indica se permettere la selezione multipla Windows-like cliccando un oggetto e facendo poi Shift + click su un oggetto successivo */\r\n _ShiftClick = input<boolean|null>(null, { alias: \"ShiftClick\" });\r\n ShiftClick = signal<boolean|null>(null);\r\n /** Indica il testo che va a sostituire \"Oggetti Visualizzati\" in caso si stia facendo qualcosa di custom */\r\n CountLabel = input<string>(\"\");\r\n /** Indica se nascondere o mostrare il componente di paginazione */\r\n _HidePaging = input<boolean|null>(null, { alias: \"HidePaging\" });\r\n HidePaging = signal<boolean|null>(null);\r\n /** Indica se nascondere o mostrare il conteggio degli elementi trovati */\r\n _HidePagingCount = input<boolean|null>(null, { alias: \"HidePagingCount\" });\r\n HidePagingCount = signal<boolean|null>(null);\r\n /** Indica se nascondere o mostrare i pulsanti di paginazione */\r\n _HidePagingButtons = input<boolean|null>(null, { alias: \"HidePagingButtons\" });\r\n HidePagingButtons = signal<boolean|null>(null);\r\n /** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */\r\n @Input() ContextMenu?: ContextMenuComponent;\r\n /** Nome dell'esportazione generata da questa tabella */\r\n ExportFileName = input<string>(\"Export.csv\");\r\n /** Classe (HTML) di default della tabella */\r\n _TableClass = input<string|null>(null, { alias: \"TableClass\" });\r\n TableClass = signal<string|null>(null);\r\n /** Funzione da utilizzare in esportazione. Ha come parametro una callback con i dati completi da esportare (dato che di default la ricerca è paginata) */\r\n @Input() ExportFunction?: (callback: (data: any[], type: Type<any>) => void, format: \"CSV\" | \"XLSX\") => void;\r\n /** Indica di esportare solo le colonne attualmente visibili della view */\r\n ExportOnlyVisibleColumns = input<boolean>(false);\r\n\r\n /** @deprecated Indica la presenza di raggruppamenti a livello di header */\r\n HasHeaderGroup = input<boolean>(false);\r\n /** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */\r\n HasSecondaryHeaderGroup = input<boolean>(false);\r\n\r\n /** Indica se nascondere gli Header della tabella */\r\n HeaderHidden = input<boolean>(false);\r\n /** Indica se nascondere il Body della tabella */\r\n BodyHidden = input<boolean>(false);\r\n\r\n /**\r\n * Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,\r\n * questo Input gestisce se questi input sono abilitati o meno\r\n */\r\n SelectionDisabled = input<boolean>(false);\r\n\r\n /**\r\n * Indica se forzare il sistema di selezione a gestire un elemento per volta.\r\n * Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale\r\n */\r\n SingleSelection = input<boolean>(false);\r\n /** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */\r\n @Input() RowClassAssigner?: (item: any) => string;\r\n /** Permette di ordinare i dati in maniera discendente o ascendente */\r\n _OrderByColumn = input<boolean|null>(null, { alias: \"OrderByColumn\" });\r\n OrderByColumn = signal<boolean|null>(null);\r\n /** Permette di avere più direttive di ordinamento dei dati */\r\n MultipleOrderingDirectives = input<boolean>(true);\r\n /** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */\r\n _HiddenColumns = input<boolean|null>(null, { alias: \"HiddenColumns\" });\r\n HiddenColumns = signal<boolean|null>(null);\r\n /** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */\r\n _ColumnsOrdering = input<boolean|null>(null, { alias: \"ColumnsOrdering\" });\r\n ColumnsOrdering = signal<boolean|null>(null);\r\n /** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */\r\n SearchView = input<AppSearch<any>|null>(null);\r\n /** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */\r\n _SelectAll = input<boolean|null>(null, { alias: \"SelectAll\" });\r\n SelectAll = signal<boolean|null>(null);\r\n /** Simula la paginazione anche per le tabelle che funzionano in modalità Array */\r\n _UseArrayModePaging = input<boolean|null>(true, { alias: \"UseArrayModePaging\" });\r\n UseArrayModePaging = signal<boolean|null>(true);\r\n /** Definizione di colonne dinamche per la modalità, appunto, dinamica */\r\n _DynamicRowColumnsDefinition = input<EsTableColumnsDefinition[]|null>(null, { alias: 'DynamicRowColumnsDefinition' });\r\n DynamicRowColumnsDefinition = signal<EsTableColumnsDefinition[]|null>(null);\r\n /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */\r\n DynamicOperations = input<EsTableOperationDefinition[]>([]);\r\n /** Indica se visualizzare i dati in maniera gerarchica */\r\n Hierarchy = input<boolean>(false);\r\n /** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */\r\n _ParentKey = input<string|null>('', { alias: \"ParentKey\" });\r\n ParentKey = signal<string|null>('');\r\n /** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */\r\n _OwnKey = input<string|null>('', { alias: \"OwnKey\" });\r\n OwnKey = signal<string|null>('');\r\n /** Indica se lasciare alla tabella l'onere di ordinare gli oggetto che arrivano in base a gerarchia / id */\r\n _AutoSortHierarchy = input<boolean|null>(null, { alias: \"AutoSortHierarchy\" });\r\n AutoSortHierarchy = signal<boolean|null>(null);\r\n /** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */\r\n StartsExpanded = input<boolean>(true);\r\n /** Indica se effettuare il salvataggio delle preferenze di ricerca */\r\n _SavePreferences = input<boolean|null>(null, { alias: \"SavePreferences\" });\r\n SavePreferences = signal<boolean|null>(null);\r\n /** Allineamento di default per celle e headers */\r\n _DefaultAlignment = input<'Left' | 'Right' | 'Center'|null>(null, { alias: \"DefaultAlignment\" });\r\n DefaultAlignment = signal<'Left' | 'Right' | 'Center'|null>(null);\r\n /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n _PagingStyle = input<'both' | 'top' | 'bottom'|null>(null, { alias: \"PagingStyle\" });\r\n PagingStyle = signal<'both' | 'top' | 'bottom'|null>(null);\r\n /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n _RowGroupingPagingStyle = input<'left' | 'right'|null>(null, { alias: \"RowGroupingPagingStyle\" });\r\n RowGroupingPagingStyle = signal<'left' | 'right'|null>(null);\r\n /** Qualora per qualsiasi motivo non venisse usato **items** dell'AppSearch questo Input indica qual è il nome della proprietà da utilizzare */\r\n ItemSourceProperty = input<string>('');\r\n /** Indica se utilizzare la cache di selezione che permette di mantenere gli stati di selezione dei vari oggetti navigando da una pagina all'altra */\r\n _UseSelectionCache = input<boolean|null>(null, { alias: \"UseSelectionCache\" });\r\n UseSelectionCache = signal<boolean|null>(null);\r\n /** Permette di decidere se, in modalità raggruppamento, mostrare o meno il valore delle colonne di gruppo negli oggetti finali. Di default sono nascosti */\r\n _ShowItemGroupsColumns = input<boolean|null>(null, { alias: \"ShowItemGroupsColumns\" });\r\n ShowItemGroupsColumns = signal<boolean|null>(null);\r\n /** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */\r\n Editable = input<boolean>(false);\r\n /** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */\r\n RangeSelection = input<boolean>(false);\r\n /** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */\r\n SearchThrottle = input<number>(50);\r\n /** Evento che viene richiamato al cambio di oridnamento di una colonna */\r\n @Output() onOrderChanged: EventEmitter<AppOrdering> = new EventEmitter<AppOrdering>();\r\n\r\n /**\r\n * Evento che viene richiamato quando l'es-table ritiene sia necessario ri-effettuare la ricerca.\r\n * Il booleano dell'evento indica se viene suggerito di resettare la pagina o meno.\r\n * \r\n * Solo in caso venga utilizzata la modalità a raggruppamenti di righe può succedere che l'es-table passi un intero AppSearch come parametro di ricerca,\r\n * in quel caso l'applicazione ricevente dovrà onorare la richiesta spedendo al backand l'oggetto di ricerca AS-IS\r\n * \r\n * il tipo dell'Emitter invece di essere [boolean | AppSearch<any>] è stato impostato a \"any\" per evitare problemi di retrocompatibilità\r\n */\r\n @Output() onSearchRequest: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento che parte ad ogni modifica di \"checkaggio\" in forma di comodo array. Espone l'oggetto con lo stato di check attuale */\r\n @Output() onSelectionChanged: EventEmitter<ItemsSelection<any>> = new EventEmitter<ItemsSelection<any>>();\r\n /** Evento richiamato all'eliminazione di un oggetto */\r\n @Output() onRemoval: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento richiamato all'annullamento di un'eliminazione */\r\n @Output() onAbortRemoval: EventEmitter<any> = new EventEmitter<any>();\r\n /** Evento richiamato alla modifica dei modelli bindati */\r\n @Output() onModelChange: EventEmitter<EsTableModelChange[]> = new EventEmitter<EsTableModelChange[]>();\r\n /** Evento richiamato all'apertura del menù contestuale */\r\n @Output() onOpenContextMenu: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /** Evento richiamato quando si clicca su un opzione definita nelle **CornerMenuOptions** */\r\n @Output() onCornerAction: EventEmitter<{ id: string, estable: any }> = new EventEmitter<{ id: string, estable: any }>();\r\n /** Evento richiamato quando si clicca su un opzione definita nelle **DynamicOperations** */\r\n @Output() onDynamicOperation: EventEmitter<{ id: string, item: any }> = new EventEmitter<{ id: string, item: any }>();\r\n\r\n /** Elemento HTML da cliccare per l'esportazione */\r\n @ViewChild('exportDownloader', { static: false }) public exportDownloader?: ElementRef;\r\n /** Placeholder di menù contestuale per quando non ci sono opzioni nel placeholder \"Vero\" */\r\n @ViewChild('emptyMenu', { static: true }) public tableEmptyMenu?: ContextMenuComponent;\r\n\r\n /** Subscription sull'apertura del context menu da ripulire al destroy della classe */\r\n private ctxMenuSubscription: any;\r\n\r\n /** Pagina in visualizzazione (durante la paginazione in modalità Array) */\r\n public arraymodePage = 1;\r\n /** Numero di pagine (durante la paginazione in modalità Array) */\r\n public arraymodePages = 1;\r\n /** Oggetti per ogni pagina (durante la paginazione in modalità Array) */\r\n _ArraymodeItemsPerPage = input<number|null>(null, { alias: \"ArraymodeItemsPerPage\" });\r\n ArraymodeItemsPerPage = signal<number|null>(null);\r\n /** Oggetto di selezione per la modalità Array, che deve comportarsi come la controparte in modalità View */\r\n public arraymodeSelection?: ItemsSelection<any>;\r\n /** Colonne da visualizzare in modalità array */\r\n public arrayColumns: string[] = [];\r\n /** Ordine delle colonne da visualizzare in modalità array */\r\n public arrayColumnOrdering: string[] = [];\r\n /** Ordinamenti ASC-DESC sulle colonne in modalità array */\r\n public arrayOrders: AppOrdering[] = [];\r\n\r\n /**\r\n * Variabile che serve a gestire il momento in cui l'es-table aggiorna la paginazione (pulsanti ecc).\r\n * Essendo operazioni comunque costose le effettuo solo su binding esterni, non su rewrite generati internamente\r\n */\r\n private internalWriteCall = false;\r\n\r\n /**\r\n * Cache che conterrà tutte le ricerche effettuate su gruppi diversi dal primo e su elementi contenuti nei gruppi.\r\n * In caso di cambi di ordinamento delle colonne diverse dalla prima tutte le chiamate fatte dal secondo livello in poi devono essere rieseguite secondo la seguente logica:\r\n * \r\n * \r\n * **Cambio ordinamento sul primo gruppo**: reload completo, non mi occupo di ripulire gli elementi bindati in alcun modo\r\n * \r\n * **Cambio ordinamento sulla colonna relativa all'N-esimo gruppo**: reload completo del contenuto dei gruppi precedenti, ripulendo precedentemente \r\n * tutti gli elementi con **_grouplevel** = N\r\n * \r\n * **Cambio ordinamento su una colonna non raggruppata**: reload completo per tutti i gruppi finali aperti, devo precedentemente ripulire tutti gli elementi con **_item** = true\r\n * \r\n * Altri eventi non dovrebbero rappresentare problemi:\r\n * - Selezione: non cambia nulla\r\n * - Paginazione: cambia a livello root quindi viene ricaricato tutto comunque, stesso vale per le paginazioni interne\r\n */\r\n public groupSearchRequestsCache: { path: string, route: GroupRouteFragment[], view: AppSearch<any>, group_column: string }[] = [];\r\n\r\n /** Variabile d'appoggio per capire se c'è bisogno di ri-effettuare una ricerca o meno */\r\n private ResearchNeeded: boolean = false;\r\n /** Colonne visibili della vista attuale. Valorizzato di default al numero massimo di colonne supportate dalla tabella per le casistiche in assenza di custom cells */\r\n public Columns = signal<{ Visibile: number, VisibleUnpinned: number, Global: number }>({ Visibile: 100, VisibleUnpinned: 100, Global: 100 });\r\n /** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */\r\n public MainGroupView?: AppSearch<any>;\r\n /** Conteggio base degli oggetti. In modalità normale viene resettato ad ogni nuova View inserita, in modalità RowGrouping viene resettato solo ad una nuova View di livello \"0\" */\r\n public BaseItemsCount: number | null = null;\r\n /** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/\r\n public HasPinnedColumns = signal<boolean>(false)\r\n /** Larghezza calcolata del container delle colonne pinnate */\r\n public PinnedContainerWidth = signal<number|null>(null);\r\n /** Indica se nonostante siamo in modalità array sono stati individuati dei gruppi. In tal caso es-table si comporta da pseudo backend ed effettua le aggregazioni e raggruppamenti completamente lato client */\r\n public ArrayGrouping = signal(false);\r\n /** Indica che l'es-table è basata sulle direttive (nuova modalità) */\r\n public DirectivesBased = signal<boolean>(false);\r\n /** Indica lo stato di selezione per singola cella */\r\n public selectionStatus: { [index: number]: { [index: number]: ItemPropEditableReference } } = {};\r\n /** Chiamata reale al writeValue dopo il passaggio di **SearchThrottle** millisecondi. Solo modalità EsTableHandledSearch */\r\n private callTimeout: any = null;\r\n /** Cache dei th piuttosto che ricalcolarseli di continuo */\r\n private thsCache: { [index: string]: EsThDirective } = {};\r\n /** Indica quando la cache dei th è stata fillata almeno la prima volta */\r\n private thsCacheSet: boolean = false;\r\n\r\n /** Variabili da fillare nell'After Content Init poi da riutilizzare nell'internal post bound source */\r\n private EsTds?: EsTdDirective[];\r\n private EsThs?: EsThDirective[];\r\n /** \r\n * Flag che, se **true**, per un giro di binding mantiene la visibilità impostata localmente, piuttosto che allineare alla View bindata. \r\n * Usata per modificare in maniera programmatica la visibilità delle colonne dal metodo **setHeaderVisibility**, \r\n * \r\n * Disclaimer: **NON MODIFICARE**\r\n **/\r\n public useLocalVisibility: boolean = false;\r\n /** Opzioni di paginazione */\r\n public PagerOptions: PagerInfos = new PagerInfos()\r\n\r\n /** @ignore */\r\n public ngOnInit() {\r\n // click destro su una riga con selezione attiva: Tiro fuori il context menu e selezione l'elemento corrente\r\n let menu = (this.ContextMenu || this.tableEmptyMenu);\r\n if (menu)\r\n this.ctxMenuSubscription = menu.open.subscribe(t => {\r\n // Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...\r\n if (t.item._sep) return;\r\n\r\n let shouldEmit = !t.item._selected;\r\n\r\n t.item._selected = true;\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n var itemSelection = this.selection_H.handleItemsSelection([t.item]);\r\n this.changed();\r\n\r\n if (shouldEmit)\r\n this.onSelectionChanged.emit(itemSelection);\r\n });\r\n\r\n // Assegnazione per tutti gli Input di default\r\n this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));\r\n this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));\r\n this.AllSearch.set(this.utilities_H.InputOrDefault(this._AllSearch(), this.deafults?.AllSearch, true));\r\n this.Export.set(this.utilities_H.InputOrDefault(this._Export(), this.deafults?.Export));\r\n this.HidePaging.set(this.utilities_H.InputOrDefault(this._HidePaging(), this.deafults?.HidePaging, false));\r\n this.HidePagingCount.set(this.utilities_H.InputOrDefault(this._HidePagingCount(), this.deafults?.HidePagingCount));\r\n this.HidePagingButtons.set(this.utilities_H.InputOrDefault(this._HidePagingButtons(), this.deafults?.HidePagingButtons));\r\n this.ContainerClass.set(this.utilities_H.InputOrDefault(this._ContainerClass(), this.deafults?.ContainerClass, ''));\r\n this.TableClass.set(this.utilities_H.InputOrDefault(this._TableClass(), this.deafults?.TableClass, 'table table-striped table-hover table-sm'));\r\n // Ocio al trasnform\r\n this.Selection.set(this.utilities_H.InputOrDefault(this.Selection(), this.deafults?.Selection));\r\n this.SavePreferences.set(this.utilities_H.InputOrDefault(this._SavePreferences(), this.deafults?.SavePreferences));\r\n this.PagingStyle.set(this.utilities_H.InputOrDefault(this._PagingStyle(), this.deafults?.PagingStyle, 'bottom'));\r\n this.RowGroupingPagingStyle.set(this.utilities_H.InputOrDefault(this._RowGroupingPagingStyle(), this.deafults?.RowGroupingPagingStyle, 'left'));\r\n this.UseSelectionCache.set(this.utilities_H.InputOrDefault(this._UseSelectionCache(), this.deafults?.UseSelectionCache, true));\r\n this.ShowItemGroupsColumns.set(this.utilities_H.InputOrDefault(this._ShowItemGroupsColumns(), this.deafults?.ShowItemGroupsColumns, false));\r\n this.ArraymodeItemsPerPage.set(this.utilities_H.InputOrDefault(this._ArraymodeItemsPerPage(), this.deafults?.ArraymodeItemsPerPage, 15));\r\n this.ColumnsPinnable.set(this.utilities_H.InputOrDefault(this._ColumnsPinnable(), this.deafults?.ColumnsPinnable, true));\r\n this.DefaultAlignment.set(this.utilities_H.InputOrDefault(this._DefaultAlignment(), this.deafults?.DefaultAlignment, 'Left'));\r\n this.HiddenColumns.set(this.utilities_H.InputOrDefault(this._HiddenColumns(), null));\r\n this.ColumnsOrdering.set(this.utilities_H.InputOrDefault(this._ColumnsOrdering(), null));\r\n this.OrderByColumn.set(this.utilities_H.InputOrDefault(this._OrderByColumn(), null));\r\n this.SelectAll.set(this.utilities_H.InputOrDefault(this._SelectAll(), null));\r\n this.ShiftClick.set(this.utilities_H.InputOrDefault(this._ShiftClick(), null));\r\n this.UseArrayModePaging.set(this.utilities_H.InputOrDefault(this._UseArrayModePaging(), true));\r\n this.OwnKey.set(this.utilities_H.InputOrDefault(this._OwnKey(), ''));\r\n this.AutoSortHierarchy.set(this.utilities_H.InputOrDefault(this._AutoSortHierarchy(), false));\r\n this.ParentKey.set(this.utilities_H.InputOrDefault(this._ParentKey(), ''));\r\n this.DynamicRowColumnsDefinition.set(this.utilities_H.InputOrDefault(this._DynamicRowColumnsDefinition(), null));\r\n }\r\n\r\n /** @ignore */\r\n async ngAfterViewInit() {\r\n // Se utilizzo la new spicy mode deduco tutti i parametri di lavoro possibili al caricamento della tabella\r\n // Vengono sovrascritte solo le proprietà non impostate dall'utente\r\n this.EsTds = (this.EsTdsDirective?.toArray() || []);\r\n this.EsThs = (this.EsThsDirective?.toArray() || []);\r\n\r\n let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];\r\n if (thsTdsProviders?.length > 0) {\r\n await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();\r\n this.EsTds = [...this.EsTds, ...thsTdsProviders.map(t => t.EsTdsDirective.toArray()).flat()];\r\n this.EsThs = [...this.EsThs, ...thsTdsProviders.map(t => t.EsThsDirective.toArray()).flat()];\r\n }\r\n let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;\r\n let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;\r\n\r\n if (usesThsAndTdsDirectives || hasNoContentProjection) {\r\n if (this.UseCustomCells() == null) this.UseCustomCells.set(true);\r\n if (this.HiddenColumns() == null && this.UseCustomCells()) this.HiddenColumns.set(true);\r\n if (this.ColumnsOrdering() == null && this.UseCustomCells()) this.ColumnsOrdering.set(true);\r\n if (this.OrderByColumn() == null && this.UseCustomCells()) this.OrderByColumn.set(true);\r\n if (this.SelectAll() == null && this.Selection()) this.SelectAll.set(true);\r\n if (this.ShiftClick() == null && this.Selection()) this.ShiftClick.set(true);\r\n this.DirectivesBased.set(true);\r\n }\r\n\r\n //Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,\r\n //che con solo la proiezione (senza celle cusotm) non è disponibile\r\n if (this.Hierarchy() && !this.UseCustomCells())\r\n throw \"Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\\\"true\\\" è richiesto anche [UseCustomCells]=\\\"true\\\"\";\r\n }\r\n\r\n /** @ignore */\r\n public ngOnDestroy() {\r\n if (this.copySubscription)\r\n this.copySubscription.unsubscribe();\r\n\r\n if (this.pasteSubscription)\r\n this.pasteSubscription.unsubscribe();\r\n\r\n if (this.ctxMenuSubscription)\r\n this.ctxMenuSubscription.unsubscribe();\r\n\r\n if (this.copyPasteDetector.ActiveEstReference == this)\r\n this.copyPasteDetector.ActiveEstReference = null;\r\n\r\n this._destroyed$.next();\r\n this._destroyed$.complete();\r\n }\r\n\r\n /** @ignore */\r\n public registerOnChange(fn: any): void { this.propagateChange = fn; }\r\n /** @ignore */\r\n public registerOnTouched(_: any): void { }\r\n /** @ignore */\r\n propagateChange = (_: any) => { };\r\n /** @ignore */\r\n changed(clearItems: boolean = false) {\r\n if (clearItems && this.viewMode()) {\r\n let isprops = this.ItemSourceProperty();\r\n if (!isprops)\r\n (<AppSearch<any>>this.View).items = [];\r\n else\r\n ((<AppSearch<any>>this.View) as any)[isprops] = [];\r\n }\r\n\r\n this.propagateChange(this.View);\r\n }\r\n\r\n /** @ignore */\r\n public async writeValue(obj: any, throttle: boolean = true) {\r\n this.View = obj ? obj : null;\r\n\r\n let sv = this.SearchView();\r\n\r\n // Qui il concetto è \"devo aspettare che l'afterViewInit venga eseguito prima di eseguire questo\"\r\n // E dato che entrambi aspettano sui provider li faccio così\r\n let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];\r\n if (thsTdsProviders?.length > 0)\r\n await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();\r\n\r\n if (this.EsTableHandledSearch() && throttle) {\r\n if (this.callTimeout)\r\n clearTimeout(this.callTimeout);\r\n\r\n this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle());\r\n return;\r\n }\r\n\r\n // Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress\r\n this.researchInProgress.set(false);\r\n\r\n if (!this.View && !sv) {\r\n // Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla\r\n this.boundSource.set(this.TMPBoundSource || []);\r\n\r\n // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica\r\n this.cdr.markForCheck();\r\n return;\r\n }\r\n\r\n // Se per sbaglio l'oggetto che mi arriva non è tipizzato (instanceof AppSearch restituisce false anche se è del tipo giusto)\r\n // lo correggo--------------------------------------------------------------------------------------------------------------\r\n if (this.View && typeof (this.View as any).itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))\r\n (this.View as any).__proto__ = new AppSearch();\r\n else if (sv && typeof (sv as any).itemsperpageoverride != 'undefined' && !(sv instanceof AppSearch))\r\n (sv as any).__proto__ = new AppSearch();\r\n // -------------------------------------------------------------------------------------------------------------------------\r\n\r\n let isp =this.ItemSourceProperty();\r\n if (this.View && this.View instanceof AppSearch) {\r\n // Se cambia l'oggetto intero significa che ho rimandato la ricerca\r\n this.setMode('view');\r\n\r\n let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;\r\n\r\n // Queste sono item source custom. Le valorizzo al default se non esistono\r\n if (isp && !(this.View as any)[isp])\r\n (this.View as any)[isp] = [];\r\n\r\n // Se vengo da una ricerca interna mantengo lo stato di selezione precedente (quindi su cambio pagina, cambio ipp, ecc...)\r\n // se invece l'utente ha fatto una ricerca lui (quindi cambiando filtri), secco le info di selezione\r\n if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache())\r\n this.resetSelection(true);\r\n\r\n this.View.internalsearchrequest = false;\r\n\r\n // Recupero Preference\r\n if (this.SavePreferences()) {\r\n if (!this.ngControl.name)\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per questa tabella\");\r\n else if (!this.prefService)\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n else {\r\n var prefs = await this.prefService.getItem<{ columns: string[], column_ordering: string[], orders: AppOrdering[] }>(<string>this.ngControl.name).toPromise();\r\n // In casi la gente si metta a spammare refresh con ngif strani sull'estable creandola e distruggendola N volte al secondo nel tempo che ci mette\r\n // a tirare su le preference da qui sopra la View potrebbe essere cambiata\r\n if (this.View) {\r\n let cols = prefs?.columns || [];\r\n let updatedPrefs = true;\r\n let repository: string[];\r\n let source: string[];\r\n\r\n if (this.View.report_columns) {\r\n repository = this.View.report_columns.map(t => t.id);\r\n source = cols;\r\n }\r\n else {\r\n repository = cols;\r\n source = this.View.columns;\r\n }\r\n\r\n // In modalità report devo controllare che tutte le colonne salvate facciano parte della vista\r\n // In modalità normale invece se le preferenze fanno riferimento a delle colonne che io non ho nella View attuale significa che\r\n // sto facendo riferimento a una versione vecchia dell'es-table, quindi non faccio operazioni\r\n for (let i = 0; i < source.length; i++) {\r\n if (repository.indexOf(source[i]) == -1) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n\r\n // Se mi baso su direttive ma nelle preference è presente anche solo una colonna non presente nelle direttive \r\n // vuol dire che l'es-table è cambiata quindi non imposto preference\r\n if ((this.EsThsDirective?.length || 0) > 0) {\r\n for (let i = 0; i < repository.length; i++) {\r\n if (this.thsCacheSet && !this.thsCache[repository[i]]) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n }\r\n\r\n if (updatedPrefs) {\r\n this.View.columns = prefs?.columns || [];\r\n this.View.column_ordering = prefs?.column_ordering || [];\r\n // Se le pref sono nulle non sovrascrivo gli ordini dato che potrebbe servire mettere degli ordinamenti di default lato ts\r\n if (prefs)\r\n this.View.orders = prefs?.orders || [];\r\n }\r\n }\r\n }\r\n }\r\n\r\n if (firstItemGroupOrNoGrouping)\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (isp ? (this.View as any)[isp] : this.View.items).length, this.View.itemsperpageoverride));\r\n }\r\n else if (this.View && (this.View.length != null && this.View.length != undefined)) {\r\n this.setMode('array');\r\n\r\n if (!this.UseSelectionCache() || !this.arraymodeSelection)\r\n this.resetSelection(true);\r\n\r\n // Recupero Preference\r\n if (this.SavePreferences()) {\r\n if (!this.ngControl.name)\r\n console.error(\"Non posso utilizzare le preference senza avere un 'name' per questa tabella\");\r\n else if (!this.prefService)\r\n console.error(\"Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato\");\r\n else {\r\n var prefs = await this.prefService.getItem<{ columns: string[], column_ordering: string[], orders: AppOrdering[] }>(<string>this.ngControl.name).toPromise();\r\n let cols = prefs?.columns || [];\r\n let updatedPrefs = true;\r\n let repository: string[];\r\n let source: string[];\r\n\r\n if (this.View.report_columns) {\r\n repository = this.View.report_columns.map((t: any) => t.id);\r\n source = cols;\r\n }\r\n else {\r\n repository = cols;\r\n source = this.View.columns;\r\n }\r\n\r\n // In modalità report aggiorno le preferenze solo se c'è almeno una colonna, altrimenti vuol dire che si parte da vuoti\r\n // con tutte le colonne disponibili\r\n if (this.View.report_columns && (source?.length || 0) == 0)\r\n updatedPrefs = false;\r\n\r\n // In modalità normale invece se le preferenze fanno riferimento a delle colonne che io non ho nella View attuale significa che\r\n // sto facendo riferimento a una versione vecchia dell'es-table, quindi non foccio operazioni\r\n for (let i = 0; i < source.length; i++) {\r\n if (repository.indexOf(source[i]) == -1) {\r\n updatedPrefs = false;\r\n break;\r\n }\r\n }\r\n\r\n if (updatedPrefs) {\r\n this.View.columns = prefs?.columns || [];\r\n this.View.column_ordering = prefs?.column_ordering || [];\r\n // Se le pref sono nulle non sovrascrivo gli ordini dato che potrebbe servire mettere degli ordinamenti di default lato ts\r\n if (prefs)\r\n this.View.orders = prefs?.orders || [];\r\n }\r\n }\r\n }\r\n }\r\n\r\n this.finalizeContext();\r\n\r\n this.postBoundSourceCalculation();\r\n\r\n if(!this.EsTableHandledSearch() || !this.View)\r\n return;\r\n\r\n if (!this.View.selfsearch && !this.View.firstsearch) {\r\n this.View.selfsearch = true;\r\n this.changed(true);\r\n this.onSearchRequest.emit(false)\r\n }\r\n else if (this.View.selfsearch) {\r\n this.View.selfsearch = false;\r\n this.changed();\r\n }\r\n }\r\n\r\n /** Funzione di trackby per il body che dovrebbe evitare il 90% delle change detection */\r\n public bodyTrackBy = (_: number, item: any) => item._hash;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo id */\r\n public idTrackBy = (_: number, item: any) => item.id;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo PropertyName */\r\n public PropertyNameTrackBy = (_: number, item: any) => item.PropertyName;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */\r\n public IDTrackBy = (_: number, item: any) => item.ID;\r\n public IDTrackByOfSignal = (_: number, item: WritableSignal<any>) => item().ID;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID e Order significativi */\r\n public IDAndOrderTrackBy = (_: number, item: any) => `${item.ID}|${item.Order}`;\r\n /** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */\r\n public valTrackBy = (_: number, item: any) => item.val;\r\n\r\n /**\r\n * Successivamente al bind del nuovo input questa funzione si occupa di finalizzare tutti i parametri di funzionamento dell'es-table \r\n * in base a Input - Modello, e qualsiasi altra cosa possa servire\r\n */\r\n private finalizeContext() {\r\n let viewCasted = this.View as AppSearch<any>;\r\n\r\n let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective?.some(t => t.thGroup));\r\n\r\n // Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate\r\n if (this.arrayMode() && hasRowGroups)\r\n this.UseArrayModePaging.set(false);\r\n\r\n // Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia\r\n this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);\r\n\r\n // Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource\r\n if (this.Hierarchy() && !hasRowGroups)\r\n this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);\r\n\r\n // L'hashing degli oggetti lo faccio a prescindere\r\n this.utilities_H.calculateHash(this.TMPBoundSource);\r\n\r\n // Assegno a una variabile mia l'eventuale override per la classe della riga\r\n // Se poi sono in modalità gerarchica inietto anche la classe per la configurazione del livello della riga\r\n if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy()) {\r\n for (let i = 0; i < this.TMPBoundSource.length; i++) {\r\n let item = this.TMPBoundSource[i];\r\n item._rowClass = this.RowClassAssigner?.(item) || \"\";\r\n item._rowClass += this.Hierarchy() ? \" est-row-lvl-\" + item._level : \"\";\r\n }\r\n }\r\n }\r\n\r\n /** Genera le informzioni di paginazione per la vista globale dell'es-table */\r\n private setupPagingInformations() {\r\n\r\n // Default che valgono di base, poi eventualmente moddati dalle funzioni sotto\r\n this.PagerOptions.ShowCount = !this.HidePagingCount();\r\n this.PagerOptions.ShowButtons = !this.HidePagingButtons();\r\n this.PagerOptions.ShowPaging = !this.HidePaging()\r\n this.PagerOptions.UsesView = true;\r\n\r\n let sv = this.SearchView();\r\n\r\n if (this.arrayMode() && this.UseArrayModePaging() && !sv) {\r\n this.PagerOptions.PagerCount = (<any[]>this.View).length || 0;\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && this.View.length > 10;\r\n this.PagerOptions.View = this.View;\r\n this.PagerOptions.UsesView = false;\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n else if (this.arrayMode() && (!this.UseArrayModePaging() || sv)) {\r\n if (sv) {\r\n this.PagerOptions.View = sv;\r\n this.PagerOptions.PagerCount = sv.objectcount || 0;\r\n }\r\n else\r\n this.PagerOptions.PagerCount = (<any[]>this.View).length || 0\r\n\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (sv?.objectcount || 0) > 10);\r\n this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (sv && sv.objectcount && sv.objectcount != -1);\r\n this.PagerOptions.ShowPaging = this.PagerOptions.ShowPaging && (this.PagerOptions.ShowButtons || this.PagerOptions.ShowCount);\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n else if (this.viewMode()) {\r\n let tmpView = this.MainGroupView || this.View;\r\n let count = tmpView?.groupcount || tmpView?.objectcount;\r\n this.PagerOptions.Searches = tmpView?.groupcount != null && tmpView?.groupcount != undefined ? 'groups' : 'items';\r\n this.PagerOptions.PagerCount = count || 0;\r\n this.PagerOptions.View = tmpView;\r\n this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (tmpView && count && count != -1);\r\n this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (tmpView.pagingavailable || this.PagerOptions.ShowCount);\r\n this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo lanciato dopo che la sorgente dati è stata correttamente bindata, si occupa di ricalcolare tutto ciò che serve\r\n * all'es-table per renderizzare i valori da mostrare\r\n */\r\n private postBoundSourceCalculation() {\r\n // Resetto tutto tranne RowTDs e RowTHs per evitare flickering. RowTDs e RowTHs saranno modificate all'interno del prossimo ciclo di CD\r\n this.RowContexts = [];\r\n this.OrderDirectives = [];\r\n this.lastSelectedItemID = null;\r\n\r\n this.internalPostBoundSource();\r\n }\r\n\r\n /** Per poter distinguere le chiamate a questo metodo: Dopo il setTimeout se uso gli EsTd/EsTh vecchi, senza il setTimeout se uso le nuove direttive */\r\n private async internalPostBoundSource() {\r\n let View = this.View;\r\n\r\n let viewMode = this.viewMode();\r\n let arrayMode = this.arrayMode();\r\n let isp = this.ItemSourceProperty();\r\n let customCells = this.UseCustomCells();\r\n\r\n // Se non ho colonne dinamiche ma sono in modalità dinamica (lo capisco perché c'è una view piena di genericitem) metto il default delle colonne\r\n this.dynamicMode_H.eventuallyReviewDynamicColumns();\r\n\r\n // Assolutamente da fare dopo il eventuallyReviewDynamicColumns()\r\n let dynColDefs = this.DynamicRowColumnsDefinition();\r\n\r\n\r\n // Gestisce la richiesta per gruppi o per singoli oggetti\r\n this.bindDisplayToLoadedItemsOrGroups(View);\r\n\r\n // Questo dev'essere per forza lanciato dopo **bindDisplayToLoadedItemsOrGroups** dato che è lì che alcune cose vengono valorizzate\r\n this.setupPagingInformations();\r\n\r\n // Molte cose sono ovviamente disponibili solo in modalità View\r\n if ((viewMode || arrayMode) && customCells) {\r\n let view = viewMode ? View as AppSearch<any> : null;\r\n let itemsAndGroups = viewMode ? [...((isp ? (view as any)[isp] : view?.items) || []), ...(view?.groups || [])] : View as any[];\r\n let si = viewMode ? view?.selection : this.arraymodeSelection;\r\n\r\n // N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE\r\n // ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************\r\n\r\n // Se ho definizioni dinamiche, prima di qualsiasi altra cosa devo trasformarle in th/td in modo che poi il codice qui sotto faccia le sue magie\r\n if ((dynColDefs?.length || 0) > 0) {\r\n this.logger.log(\"Generating ths and tds from Dynamic definition\");\r\n let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();\r\n this.EsThs = ret.ths;\r\n this.EsTds = ret.tds;\r\n }\r\n\r\n // Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view\r\n if (!this.arrayMode() && view?.report_columns) {\r\n this.logger.log(\"Generating ths and tds from report results\");\r\n let ret = this.reportMode_H.generateThsAndTdsFromView(view);\r\n this.EsThs = ret.ths;\r\n this.EsTds = ret.tds;\r\n }\r\n\r\n // Espando i th e i td multipli duplicandoli\r\n let ret = this.columnMetadata_H.expandMultiThsAndTds(this.EsThs || [], this.EsTds || [], itemsAndGroups);\r\n this.EsThs = ret.expThs;\r\n this.EsTds = ret.expTds;\r\n\r\n // Genero la cache dei th da usare da qui in poi, dopo avergli lasciato fare le sue cose in caso ci siano dei multi o dei report\r\n for (let i = 0; i < this.EsThs.length; i++) {\r\n let th = this.EsThs[i];\r\n this.thsCache[th.th] = th;\r\n }\r\n this.thsCacheSet = true;\r\n\r\n // Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo\r\n let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);\r\n\r\n // Valuta lo stato iniziale di selezione a range\r\n this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, dynColDefs || []);\r\n\r\n if (this.arrayMode()) // In modalità array non ho un backend...\r\n this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client\r\n\r\n this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc\r\n this.columnMetadata_H.alignColumnsIfLoadedView(view!); // Se sto caricando una View da hotpotato (quindi con savedstate = true) riallineo la visibilità delle colonne e il loro ordine.\r\n this.columnMetadata_H.moveFixedColumnsAtTheBeginning(hI.leafs, this.EsTds); // Sposto tutte le cose fixed all'inizio in modo che la creazione di th e td sia più snella (Utilizza le ColumnsList, quindi dev'essere richiamata PIRMA di reviewColumnsList)\r\n this.columnMetadata_H.alignHeadersOrdering(hI.leafs, view!); // Allineo gli ordinamenti agli header\r\n this.columnMetadata_H.refreshColumnsVisibility(hI.leafs, this.EsTds, view!); // Lavoro sui TH ed eventualmente modifico la visibilità anche dei TD.\r\n this.columnMetadata_H.evaluatePinnedColumnsWidth(); // Se sono presenti colonne pinnate valuta la dimensione del contenitore\r\n this.columnMetadata_H.generateDefaultOrder(hI.leafs, view!); // Genero le direttive di ordinamento, che siano default o derivanti dalla AppSearch\r\n this.columnMetadata_H.evaluateHeaderGroups(hI); // Valuto i raggruppamenti degli header se presenti\r\n\r\n // ************************************* Generazione binding per righe e colonne *************************************\r\n\r\n this.evaluateRowThs(hI.leafs); // Raccolgo i TH\r\n this.evaluateRowTds(hI.leafs, this.EsTds); // Raccolgo i TD in contesti separati, un contesto per ogni item o gruppo\r\n\r\n // ************************************* Ultimi aggiustmaenti dei binding *************************************\r\n\r\n this.columnMetadata_H.applyOrdering(view!, true); // Applico l'ordinamento sulle colonne (non ASC DESC, ma \"prima questa o quella colonna\")\r\n this.MoveTemporaryVariablesToRealOnes(); // Collego TH e TD aggiustati fino ad ora alle variabili di Binding HTML\r\n this.selection_H.evaluateSelection(itemsAndGroups, si); // Riallineo le info di selezione degli elementi della View\r\n\r\n if (this.ResearchNeeded) {\r\n this.changed();\r\n this.emitSearchRequest(false);\r\n this.ResearchNeeded = false;\r\n }\r\n }\r\n else if ((viewMode || arrayMode) && !customCells) {\r\n // Riallineo le info di selezione degli elementi della View\r\n let items = viewMode ? (isp ? (View as any)[isp] : (View as AppSearch<any>).items) : View as any[];\r\n let si = viewMode ? (View as AppSearch<any>).selection : this.arraymodeSelection;\r\n this.selection_H.evaluateSelection(items, si);\r\n }\r\n\r\n // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica\r\n this.cdr.markForCheck();\r\n this.FirstBind.set(false);\r\n }\r\n\r\n /**\r\n * Effettua il binding degli oggetti pervenuti da questa chiamata con gli oggetti effettivamente da graficare\r\n * \r\n * @param {any} view View da cui sono arrivati gli oggetti. Può essere o un array se sono in **arrayMode** o una AppSearch<T> se sono in **viewMode**\r\n */\r\n private bindDisplayToLoadedItemsOrGroups(view: any) {\r\n if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {\r\n this.BaseItemsCount = 0;\r\n this.boundSource.set([]);\r\n return;\r\n }\r\n\r\n if (this.arrayMode() || !this.UseCustomCells()) {\r\n this.boundSource.set(this.TMPBoundSource);\r\n this.BaseItemsCount = view?.objectcount || view?.length || 0;\r\n return;\r\n }\r\n\r\n let groupingKeys = view?.groupings?.filter((t: any) => !t.aggregation)?.length || 0;\r\n if (groupingKeys == 0) {\r\n this.boundSource.set(this.TMPBoundSource);\r\n this.BaseItemsCount = view?.objectcount || 0;\r\n return;\r\n }\r\n\r\n this.rowGrouping_H.handleNewDataOnRowGrouping(view, groupingKeys);\r\n }\r\n\r\n /** Metodo richiamato solo quando **TMPRowTDs** e **TMPRowTHs** sono completamente generati ed aggiustati. Serve per collegarli alle variabili usate lato binding HTML */\r\n private MoveTemporaryVariablesToRealOnes() {\r\n\r\n this.RowTDs = this.TMPRowTDs;\r\n this.RowTHs = this.TMPRowTHs;\r\n this.RowThGroups = this.TMPRowThGroups ? this.TMPRowThGroups.reverse() : null;\r\n this.EmptyRowTds.set(this.isEmpty(this.RowTDs));\r\n\r\n let vis = this.RowTHs.filter(t => t.Visible).length;\r\n let visUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;\r\n let global = visUnpinned + (this.HasPinnedColumns() ? 1 : 0) + (this.Selection() ? 1 : 0) + (this.Removal() ? 1 : 0) + (this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions() ? 1 : 0)\r\n\r\n let newValue = {Visibile : vis, VisibleUnpinned: visUnpinned, Global: global};\r\n this.Columns.set(newValue);\r\n }\r\n\r\n /** \r\n * Metodo per capire se un oggetto è completamente vuoto \r\n * \r\n * @param {any} obj Oggetto da controllare\r\n * \r\n * @returns {boolean} **true** se l'oggetto è vuoto, **false** altrimenti\r\n */\r\n isEmpty(obj: any): boolean {\r\n for (var _ in obj) { return false; }\r\n return true;\r\n }\r\n\r\n /**\r\n * Permette di selezionare o deselezionare in maniera arbitraria degli oggetti\r\n * \r\n * @param {any[]} items Oggetti da selezionare o deselezionare\r\n * @param {boolean} select **true** per selezionarli, **false** per non toccarli\r\n */\r\n public setSelectionStatus(items: any[], all: boolean, select: boolean, emit: boolean = false) {\r\n if (all) {\r\n if (!this.SelectAll()) {\r\n console.error(\"Impossibile impostare la selezione con l'all selection quando l'Input SelectAll è false\");\r\n return;\r\n }\r\n\r\n let si = (this.View as AppSearch<any>)?.selection || this.arraymodeSelection;\r\n //se deseleziono con attuale selezione ad all o se seleziono con attuale selezione manuale devo richiamare la **selectAllOrResetSelection**\r\n if ((si.all && !select) || (!si.all && select))\r\n this.selection_H.selectAllOrResetSelection();\r\n }\r\n else\r\n this.selection_H.handleItemsSelection(items, select);\r\n\r\n this.cdr.markForCheck();\r\n\r\n if (emit)\r\n this.onSelectionChanged.emit(this.arraymodeSelection);\r\n }\r\n\r\n /**\r\n * Effettua un hard reset della selezione\r\n */\r\n public resetSelection(emit: boolean = false) {\r\n this.selection_H.clearSelectionCaches();\r\n\r\n if (this.viewMode() && this.View) {\r\n this.View.selection = new ItemsSelection([]);\r\n if (emit)\r\n this.onSelectionChanged.emit(this.View.selection);\r\n }\r\n else if (this.arrayMode()) {\r\n this.arraymodeSelection = new ItemsSelection([]);\r\n if (emit)\r\n this.onSelectionChanged.emit(this.arraymodeSelection);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che gestisce il cambio di Ordinamento di una colonna\r\n *\r\n * @param {string} id ID della colonna il cui oridnamento è cambiato\r\n * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna\r\n */\r\n public thOrderChanged(id: string, order: 'DESC' | 'ASC' | null) {\r\n if (!this.viewMode() && !this.arrayMode()) {\r\n console.warn('Order changed on a table not in viewMode or Array mode. Operation not supported');\r\n return;\r\n }\r\n\r\n if (!this.OrderByColumn())\r\n return;\r\n\r\n this.columnMetadata_H.handleTHOrderChange(id, order ? order: undefined);\r\n }\r\n\r\n /**\r\n * Metodo da chiamare ogni volta che si vuole dare evidenza all'esterno del bisogno di rieffettuare la ricerca\r\n * \r\n * @param {boolean} resetsPage Indica al listener che deve resettare il numero di pagina\r\n * @param {AppSearch<any>} viewOverride Override della view da emettere per questa ricerca\r\n */\r\n public emitSearchRequest(resetsPage: boolean, viewOverride?: AppSearch<any>) {\r\n if (this.viewMode() && !viewOverride) {\r\n (this.View as AppSearch<any>).internalsearchrequest = true;\r\n this.changed();\r\n }\r\n\r\n if (viewOverride) {\r\n if (resetsPage)\r\n viewOverride.page = 1;\r\n viewOverride.internalsearchrequest = true\r\n }\r\n\r\n this.researchInProgress.set(true);\r\n\r\n if (this.View && !this.View.selfsearch && this.EsTableHandledSearch()) {\r\n this.View.selfsearch = true;\r\n this.changed(true);\r\n this.onSearchRequest.emit(false)\r\n }\r\n else\r\n this.onSearchRequest.emit(viewOverride ? viewOverride : resetsPage);\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsTds** bindati genera, all'interno del dizionario **TMPRowTDs** tutti i contesti dei vari oggetti.\r\n *\r\n * Vengono esclusi i TD \"Interni\" in quanto vengono generati dagli originali quindi includerli vorrebbe dire rieffettuare le operazioni due volte\r\n *\r\n * Costo: 2 scan EsThs, 1 scan EsTds\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n * @param {EsTdDirective[]} tds Celle della tabella\r\n */\r\n private evaluateRowTds(ths: EsThDirective[], tds: EsTdDirective[]) {\r\n if (tds.length == 0)\r\n return;\r\n\r\n let columnsCache: { [index: string]: EsTableColumn } = {};\r\n\r\n for (let coli = 0; coli < this.ColumnsList.length; coli++) {\r\n let col = this.ColumnsList[coli];\r\n columnsCache[col.id] = col;\r\n }\r\n\r\n this.TMPRowTDs = {};\r\n let bs = this.boundSource();\r\n let defaultAlignment = this.DefaultAlignment();\r\n\r\n // Variabile d'appoggio per permettermi di inserire tutte le colonne \"Fixed\" davanti\r\n let contextFixeds: { [context: string]: number } = {};\r\n for (let i = 0; i < tds.length; i++) {\r\n let td = tds[i];\r\n\r\n // Valori costanti per colonna: calcolati una sola volta invece che per ogni riga\r\n let key = td.td;\r\n let th = this.thsCache[td.td];\r\n\r\n if (!!th)\r\n th._referenced = true;\r\n\r\n // Skippare senza th (casistica tabella dinamica)\r\n if (!(th && th.thIf && (td.tdIf || th.thGroup)))\r\n continue;\r\n\r\n let thCasted = <EsThDirective>th;\r\n let colDef = columnsCache[td.td];\r\n let isFixed = th.thFixed || th.thGroup || th.thPinned;\r\n let multiProp = td._multi ? td.td.split('_')[0] : null;\r\n let multiIndex = td._multi ? td.td.split('_')[1] : null;\r\n let alignment = (td.tdAlignment || th.thAlignment || defaultAlignment).toLowerCase();\r\n let format = td.tdFormat || th.thFormat;\r\n let template = thCasted.thGroup && !this.ShowItemGroupsColumns ? null : td.Template;\r\n let groupClass = thCasted.thGroupClass || '';\r\n\r\n for (let i = 0; i < bs.length; i++) {\r\n let item = bs[i];\r\n let ctx = item._hash;\r\n\r\n let itemToAdd = item._item ?\r\n <TdElement>{\r\n LeftBorder: (<any>thCasted)._lbord,\r\n RightBorder: (<any>thCasted)._rbord,\r\n ID: key,\r\n Pinned: colDef.pinned,\r\n PinnedWidth: thCasted.thPinnedWidth,\r\n GroupHeader: false,\r\n GroupAggregation: false,\r\n Visible: colDef.visible,\r\n Wraps: false,\r\n Class: td.tdClass,\r\n IconClass: td.tdIconClass,\r\n ConditionField: td.tdConditionField,\r\n ConditionValue: td.tdConditionValue,\r\n Title: td.tdTitle,\r\n Content: td.tdContent,\r\n Template: template,\r\n Multi: td._multi,\r\n MultiProp: multiProp,\r\n MultiIndex: multiIndex,\r\n Alignment: alignment,\r\n Format: format,\r\n PropertyName: th.thProperty,\r\n PropertyType: th.thType,\r\n PropertySource: th.thSource,\r\n EditorOptions: th.thEditorOptions,\r\n PropAccessor: td.tdPropertyAccessor,\r\n RoutePath: (<any>thCasted).thRoutePath,\r\n RouteParameterProperties: (<any>thCasted).thRouteParameterProperties\r\n } :\r\n <TdElement>{\r\n LeftBorder: (<any>thCasted)._lbord,\r\n RightBorder: (<any>thCasted)._rbord,\r\n ID: key,\r\n Pinned: colDef.pinned,\r\n PinnedWidth: thCasted.thPinnedWidth,\r\n GroupHeader: thCasted.thGroup,\r\n GroupAggregation: !!thCasted.thAggregation,\r\n Visible: colDef.visible,\r\n Wraps: false,\r\n Class: groupClass,\r\n Content: this.rowGrouping_H.getGroupCellDisplay(<Group>item, key, <EsThDirective>th)\r\n };\r\n\r\n if (this.TMPRowTDs[ctx]) {\r\n this.TMPRowTDs[ctx].push(signal(itemToAdd));\r\n }\r\n else {\r\n this.RowContexts.push(ctx);\r\n this.TMPRowTDs[ctx] = [signal(itemToAdd)];\r\n contextFixeds[ctx] = isFixed ? 1 : 0;\r\n }\r\n }\r\n }\r\n\r\n // Se non ho oggetti è inutile che controllo gli errori, dato che gli es-td non esisteranno di certo e di conseguenza gli es-th non saranno referenziati\r\n if (this.TMPBoundSource.length == 0)\r\n return;\r\n\r\n var errs: string[] = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n if (!th._referenced)\r\n errs.push(th.th);\r\n }\r\n\r\n if (errs.length > 0) {\r\n var errIds = errs.join(', ');\r\n throw \"L'ID di uno o più EsTh non hanno alcun EsTd associato: \" + errIds;\r\n }\r\n }\r\n\r\n /**\r\n * Partendo dagli **EsThs** bindati genera, all'interno del dizionario **TMPRowTHs** tutti i contesti dei vari oggetti.\r\n *\r\n * Vengono esclusi i TH \"Interni\" in quanto vengono generati dagli originali quindi includerli vorrebbe dire rieffettuare le operazioni due volte\r\n *\r\n * Costo: 1 scan EsThs + 1 scan ColumnsList\r\n *\r\n * @param {EsThDirective[]} ths Colonne della tabella\r\n */\r\n private evaluateRowThs(ths: EsThDirective[]) {\r\n if (ths.length == 0)\r\n return;\r\n\r\n let columnsListCache: { [index: string]: EsTableColumn } = {};\r\n let castedView = <AppSearch<any>>this.View;\r\n let groupingsUndefined = this.viewMode() && (castedView && !castedView.groupings || castedView.groupings.length == 0);\r\n\r\n for (let i = 0; i < this.ColumnsList.length; i++) {\r\n let itm = this.ColumnsList[i];\r\n columnsListCache[itm.id] = itm\r\n }\r\n\r\n this.TMPRowTHs = [];\r\n for (let i = 0; i < ths.length; i++) {\r\n let th = ths[i];\r\n let toAdd: ThElement;\r\n\r\n if (th.thIf || th.thGroup) {\r\n\r\n let thClass = (th.thClass || \"\") + (th.thShrink ? \" app-col-min\" : \"\") + (th.thGroup ? \" est-col-min\" : \"\");\r\n toAdd = {\r\n Pinned: !!columnsListCache[th.th].pinned,\r\n Fixed: th.thFixed,\r\n PinnedWidth: th.thPinnedWidth,\r\n ID: th.th,\r\n Visible: th.thVisible,\r\n Class: thClass,\r\n Order: th.thOrder || null,\r\n Orderable: th.thOrderable,\r\n Template: th.Template,\r\n Alignment: (th.thAlignment || this.DefaultAlignment() || \"Left\").toLowerCase(),\r\n // Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header\r\n Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,\r\n Wrap: th.thWrap,\r\n LeftBorder: (<any>th)._lbord,\r\n RightBorder: (<any>th)._rbord,\r\n Multi: th._multi,\r\n MultiContent: th._multi_content\r\n };\r\n this.TMPRowTHs.push(toAdd);\r\n\r\n // Se ho un modello che deve funzionare a rowgrouping ma non è ancora stata effettuata nessuna ricerca sui gruppi principali (groupingsUndefined)\r\n // li genero e mando la prima ricerca che dev'essere spedita al backend per il primo caricamento dei gruppi\r\n if (groupingsUndefined && (th.thAggregation || th.thGroup)) {\r\n let groupAggregations: GroupOrAggregation[] = this.rowGrouping_H.getGroupAggregations(th);\r\n if (!castedView.groupings)\r\n castedView.groupings = groupAggregations;\r\n else\r\n castedView.groupings.push(...groupAggregations);\r\n\r\n this.ResearchNeeded = true;\r\n }\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Sposta la ricerca di una pagina in avanti (o indietro)\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n * @param {any} pager Elemento di separazione su cui è effettuata la ricerca\r\n */\r\n public addToPageGroup(page: number, pager: GroupPager) {\r\n this.goToPageGroup(pager.view.page + page, pager);\r\n }\r\n\r\n /**\r\n * Sposta la ricerca alla pagina specificata\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n * @param {any} pager Elemento di separazione su cui è effettuata la ricerca\r\n */\r\n public goToPageGroup(page: number, pager: GroupPager) {\r\n\r\n let appSearchElement = pager.view;\r\n if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))\r\n return;\r\n\r\n appSearchElement.page = page;\r\n pager.buttons = this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages);\r\n\r\n this.emitSearchRequest(false, appSearchElement);\r\n }\r\n\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Gestisce i click sulla tabella solo per le righe a gruppo. \r\n * O rimuove gli elementi attualmente presenti o carica il contenuto del gruppo\r\n *\r\n * @param {any} group Gruppo bindato su cui si è effettuato il click\r\n *\r\n * @returns {boolean} **true** se l'operaizone è andata a buon fine, **false** altrimenti\r\n */\r\n public handleGroupClick(group: Group): boolean {\r\n let casted = this.View as AppSearch<any>;\r\n let anyG = (<any>group);\r\n anyG._expanded = !anyG._expanded;\r\n\r\n // Sono in modalità raggruppamento virtuale da array: Espandere significa rendere visibili tutti gli oggetti relativi a questo gruppo, viceversa il contrarre\r\n if (this.ArrayGrouping()) {\r\n let allRelatives = this.boundSource().filter(t =>\r\n (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||\r\n (t._item && ((anyG._expanded && t._thisKey == anyG._thisKey) || (!anyG._expanded && t._thisKey.startsWith(anyG._thisKey)))))\r\n allRelatives.forEach(t => { t._visible = anyG._expanded; if (t._group) t._expanded = false });\r\n return true;\r\n }\r\n\r\n if (anyG._expanded) {\r\n // Resetto ipp\r\n casted.itemsperpageoverride = 15;\r\n if (!casted.requestedgroups)\r\n casted.requestedgroups = [new GroupFilter(group.column, group.value)];\r\n else {\r\n let level = anyG._grouplevel;\r\n // se il gruppo cliccato non ha un livello è il primo gruppo, quindi ordinamento unico\r\n // altrimenti devo rimuovere tutti i filtri su livelli superiori al level cliccato e aggiungere il level cliccato\r\n if (!level)\r\n casted.requestedgroups = [new GroupFilter(group.column, group.value)];\r\n else {\r\n casted.requestedgroups = [];\r\n anyG._parentRoute.forEach((step: GroupRouteFragment) => {\r\n casted.requestedgroups.push(new GroupFilter(step.column, step.value));\r\n });\r\n casted.requestedgroups.push(new GroupFilter(group.column, group.value));\r\n }\r\n }\r\n\r\n this.changed();\r\n this.emitSearchRequest(true);\r\n }\r\n else {\r\n let path = (anyG._parent || '') + group.value;\r\n\r\n // Se ho chiuso un gruppo non mi serve rieffettuare ricerce, mi basta eliminare dagli oggetti bindati tutti gli elementi sottostanti a quel gruppo\r\n this.boundSource.set(this.boundSource().filter(t => !t._parent || !t._parent.startsWith(path)));\r\n\r\n // devo però anche rimuovere eventuali cache relative\r\n this.groupSearchRequestsCache = this.groupSearchRequestsCache.filter(t => t.path != path);\r\n }\r\n\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Gestisce la selezione globale degli oggetti, sia per pagina che a livello di **SelectAll**\r\n *\r\n * @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti\r\n */\r\n public globalCheckChanged(forcedVal: boolean | null = null) {\r\n\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n\r\n let bs = this.boundSource();\r\n // Prendo tutti gli elementi presenti in questa vista. Se ho gruppi prendo solo i gruppi a livello 0, altrimenti prendo tutti gli oggetti per selezionarli\r\n let items = bs.find(t => t._group) ? bs.filter(t => t._group && !t._parent) : bs;\r\n var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck());\r\n this.changed();\r\n\r\n this.onSelectionChanged.emit(itemSelection);\r\n }\r\n\r\n /**\r\n * @TODO Spostare in SelectionHandler\r\n * \r\n * Gestisce i click sulla tabella, gestendo eventualmente anche gli Shift + Click per selezionare un range di oggetti\r\n *\r\n * @param {any} event Evento nativo HTML del click\r\n * @param {any} item Oggetto bindato su cui si è effettuato il click\r\n *\r\n * @returns {boolean} **true** se l'operaizone è andata a buon fine, **false** altrimenti\r\n */\r\n public handleClick(event: any, item: any): boolean {\r\n this.selection_H.clearSelectionStatusExcluding(undefined);\r\n\r\n let selecteditems: any[] = [];\r\n if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {\r\n this.utiExts.clearTextSelection();\r\n let startSelecting = false;\r\n\r\n let items = this.boundSource().filter(t => !t._group && !t._sep);\r\n for (let i = 0; i < items.length; i++) {\r\n let t = items[i];\r\n if (startSelecting) {\r\n t._selected = true;\r\n selecteditems.push(t);\r\n }\r\n if ((t == item || t == this.lastSelected) && !startSelecting) {\r\n startSelecting = true;\r\n t._selected = true;\r\n selecteditems.push(t);\r\n } else if ((t == item || t == this.lastSelected) && startSelecting)\r\n startSelecting = false;\r\n }\r\n } else {\r\n item._selected = !item._selected;\r\n this.lastSelected = item;\r\n selecteditems.push(item);\r\n }\r\n\r\n var itemSelection = this.selection_H.handleItemsSelection(selecteditems);\r\n this.changed();\r\n\r\n this.onSelectionChanged.emit(itemSelection);\r\n return true;\r\n }\r\n\r\n\r\n /**\r\n * Sposta la ricerca di una pagina in avanti (o indeitro)\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n */\r\n public addToPage(page: number) {\r\n let view = this.MainGroupView ? this.MainGroupView : this.View;\r\n\r\n this.goToPage(((this.SearchView() || view)?.page || 0) + page);\r\n }\r\n\r\n /**\r\n * Sposta la ricerca alla pagina specificata\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n */\r\n public goToPage(page: number) {\r\n let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode() ? this.SearchView() : this.View);\r\n if (!view.page || !view.pages)\r\n return;\r\n\r\n let appSearchElement = this.SearchView() || view;\r\n if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))\r\n return;\r\n\r\n appSearchElement.page = page;\r\n let count = (view.items.length || view.groups?.length || 0);\r\n let ipp = view.itemsperpageoverride || 15;\r\n this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp));\r\n\r\n let hasGroupings = !!this.MainGroupView;\r\n this.emitSearchRequest(false, hasGroupings ? view : (this.SearchView() || null));\r\n }\r\n\r\n /**\r\n * Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest**\r\n * per comunicare al componente che utilizza questa tabella che i dati sono da aggiornare\r\n */\r\n public onItemsPerPageChanged(newIpp: number | null) {\r\n this.PagerOptions.View.itemsperpageoverride = newIpp;\r\n this.changed();\r\n if (this.MainGroupView)\r\n this.emitSearchRequest(true, this.MainGroupView);\r\n else if (this.SearchView()) {\r\n // Questo secondo me si può portare a livello un po' più alto\r\n this.SearchView()!.page = 1;\r\n this.emitSearchRequest(true, this.SearchView()!);\r\n }\r\n else\r\n this.emitSearchRequest(true);\r\n }\r\n\r\n /** Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest** con la vista del separatore */\r\n public onGroupItemsPerPageChanged(pager: GroupPager, newIpp: number) {\r\n pager.view.itemsperpageoverride = newIpp;\r\n this.emitSearchRequest(true, pager.view);\r\n }\r\n\r\n\r\n /** Metodo che gestisce la modifica del tempo specificato per l'aggiornamento automatico */\r\n public autoUpdateChanged() {\r\n if (!/^[1-9]\\d*$/.test(this.seconds()))\r\n this.seconds.set('10');\r\n\r\n let secondsInMs = parseInt(this.seconds()) * 1000;\r\n\r\n if (this.autoUpdate())\r\n this.updateTimer = setInterval(() => { this.emitSearchRequest(false); }, secondsInMs);\r\n else\r\n clearInterval(this.updateTimer);\r\n }\r\n\r\n /**\r\n * Metodo chiamato dal click su una delle colonne generate dall'Input **DynamicOperations**\r\n *\r\n * @param {any} item L'oggetto su cui va effettuata l'operazione\r\n * @param {string} opid Codice identificativo dell'operazione da effettuarsi\r\n */\r\n public dynamicOperation(item: any, opid: string) {\r\n this.onDynamicOperation.emit({ id: opid, item: item });\r\n }\r\n\r\n /**\r\n * Equivalente del metodo **addToPage** riadattato per la modalità array\r\n *\r\n * @param {number} page Numero di pagine da aggiungere (o sottrarre, se negativo) alla pagina attuale\r\n */\r\n public arrayAddToPage(page: number) {\r\n this.arrayGoToPage(this.arraymodePage + page)\r\n }\r\n\r\n /**\r\n * Equivalente del metodo **goToPage** riadattato per la modalità array\r\n *\r\n * @param {number} page Pagina a cui navigare\r\n */\r\n public arrayGoToPage(page: number) {\r\n if (page === 0 || page > this.arraymodePages)\r\n return;\r\n this.arraymodePage = page;\r\n\r\n // Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca\r\n this.internalWriteValue();\r\n }\r\n\r\n /**\r\n * Gestione dei click sulle opzioni del menù contestuale in alto a destra generato dall'Input **CornerMenuOptions**\r\n *\r\n * @param {string} cornerid Codice dell'operazione selezionata\r\n */\r\n public cornerActionClicked(cornerid: string) {\r\n this.onCornerAction.emit({ id: cornerid, estable: this });\r\n }\r\n\r\n /** \r\n * Impostazione modalità dell'EsTable \r\n * \r\n * @param {'array' | 'view' | 'report'} mode Modalità da impostare\r\n **/\r\n private setMode(mode: 'array' | 'view') {\r\n this.viewMode.set(mode == 'view');\r\n this.arrayMode.set(mode == 'array');\r\n }\r\n\r\n /**\r\n * Helper per effettuare chiamate interne di allineamento alla funzione **writeValue**, \r\n * impostando prima **internalWriteCall** in modo da non effettuare operazioni inutili\r\n */\r\n public async internalWriteValue() {\r\n this.internalWriteCall = true;\r\n await this.writeValue(this.View);\r\n this.internalWriteCall = false;\r\n }\r\n\r\n /** Metodo eventualmente richiamabile anche dal componente esterno che permette di forzare un refresh della tabella */\r\n public forceRefresh(relaunchSearch: boolean = true) {\r\n\r\n // Se sono in modalità View viene mantenuto in automatico il numero di pagina, ma per la modalità array devo prendere le info di paginazione prima e riapplicarle dopo\r\n let arrayPage: number|null = null;\r\n let arrayIpp: number| null = null;\r\n if (this.arrayMode()) {\r\n arrayPage = this.arraymodePage;\r\n arrayIpp = this.ArraymodeItemsPerPage();\r\n }\r\n\r\n if (!relaunchSearch && this.viewMode())\r\n this.View.selfsearch = true;\r\n\r\n this.writeValue(this.View);\r\n this.cdr.detectChanges();\r\n\r\n if (this.arrayMode()) {\r\n this.ArraymodeItemsPerPage.set(arrayIpp || 15);\r\n this.arrayGoToPage(arrayPage || 1);\r\n }\r\n }\r\n\r\n /** \r\n * Imposta la visibilità di un header e di eventuali header collegati se questo header è un gruppo, dopodiché aggiorna l'es-table \r\n * \r\n * @param {string} groupOrHeader Header di cui settare la visibilità\r\n * @param {boolean} visibility Visibilità da impostare\r\n **/\r\n public setHeaderVisibility(groupOrHeader: string, visibility: boolean, refresh: boolean = true, relaunchSearch: boolean = true) {\r\n let groupOrHead = this.thsCache[groupOrHeader];\r\n if (!groupOrHead)\r\n return;\r\n\r\n groupOrHead.thVisible = visibility;\r\n\r\n let thsArr = this.EsThsDirective?.toArray() || [];\r\n for (let i = 0; i < thsArr.length; i++) {\r\n let th = thsArr[i];\r\n\r\n if (th.thParent == groupOrHeader)\r\n this.setHeaderVisibility(th.th, visibility, false);\r\n }\r\n\r\n if (refresh) {\r\n this.useLocalVisibility = true;\r\n this.forceRefresh(relaunchSearch);\r\n }\r\n }\r\n\r\n /**\r\n * Funzione che in base ai click su una cella capisce se sto effettuando un'operazione di selezione o se sto entrando nell'edit di una cella con un doppio click\r\n * \r\n * @param {any} $event Evento nativo javascript\r\n * @param {TdElement} rowItem Riferimento a binder della riga\r\n * @param {any} item Item che rappresenta il contesto su cui è stato effettuato un click\r\n */\r\n public dbClickEditOrSingleClickRowSelection($event: MouseEvent, rowItem: WritableSignal<TdElement>, item: any) {\r\n\r\n let rowItm = rowItem();\r\n let selection = this.Selection() || false;\r\n\r\n // Prima cosa da fare è controllare se ci sono dei range lasciati da operazioni precedenti (se applicabile) e ripulirli\r\n if (this.rangeSelected && !$event.ctrlKey && selection) {\r\n this.logger.log(\"clearing previously selected range\");\r\n this.selection_H.clearSelectionStatusExcluding();\r\n this.rangeSelected = false;\r\n return;\r\n }\r\n \r\n\r\n // Modalità Editable, gestisco i doppi click senza però rallentare la modalità di selezione a range\r\n if (this.Editable()) {\r\n \r\n // Secondo click: se il timer non è scaduto è un doppio click ed eseguo il resto\r\n if (this.cellDbClickTimer) {\r\n this.logger.log(\"handling doubleclick on editable cell: \" + (rowItm.PropertyName ? 'edit mode for property ' + rowItm.PropertyName : 'no property set, fallback to simple click'));\r\n if (rowItm.PropertyName)\r\n this.setupUserEdit(rowItem, item);\r\n else\r\n this.handleRowClick($event, item, selection, true);\r\n this.clearCellClickTimer();\r\n return;\r\n }\r\n\r\n\r\n // Primo click: non fa niente e se il tempo per il secondo click scade resetta tutto\r\n this.cellDbClickTimer = setTimeout(() => {\r\n this.clearCellClickTimer();\r\n if (!this.RangeSelection() || !this.mouseIsDown) {\r\n this.logger.log(\"time's up for second click, handling single click\");\r\n this.handleRowClick($event, item, selection, true);\r\n }\r\n }, this.doubleClickBufferMs);\r\n }\r\n\r\n // In modalità a range la creazione del range è gestita dai mousedown, move ed up...\r\n // La selezione delle righe invece è gestita dalle caselline a sinistra\r\n if (this.RangeSelection())\r\n return;\r\n\r\n // Se ho fatto click col control attaccato esco subito dato che deve solo permettere la navigazione dei link\r\n if ($event.ctrlKey)\r\n return;\r\n\r\n // Tutti i click su una cella già in edit non devono effettuare la selezione della riga\r\n if (rowItm._editing)\r\n return;\r\n\r\n // Per evitare di rallentare a prescindere\r\n if (!this.Editable()) {\r\n this.handleRowClick($event, item, selection, true);\r\n return;\r\n }\r\n }\r\n\r\n /** Evento che gestisce il comando \"Copia\" buttando i valori selezionati nella clipboard in base al loro tipo */\r\n private handleCopy() {\r\n if (!this.RangeSelection())\r\n return;\r\n let sel = this.selection_H.getSelectionStatusSelection();\r\n if (sel.length > 0 && sel[0].length > 0) {\r\n var selectionText = this.selection_H.getClipbardTextFromSelection(sel);\r\n this.clipboardService.copyTextToClipboard(selectionText);\r\n this.msgExts.simpleInfo(this.lc.loc(\"Values copied in the clipboard\"), \"toastr\", 1000);\r\n }\r\n }\r\n\r\n /** Evento che gestisce il comando \"Incolla\" prendendo i dati della clipboard e applicandoli al range di selezione attuale in base al tipo delle celle sotto */\r\n handlePaste() {\r\n if (!this.RangeSelection())\r\n return;\r\n let sel = this.selection_H.getSelectionStatusSelection();\r\n if (sel.length > 0 && sel[0].length > 0) {\r\n this.clipboardService.getClipboard(\"matrix\", (values: string[] | string[][]) => {\r\n // Fix clipboard service che pare un po' stronza, rimuovo l'ultimo array se mi accorgo che è un singolo array con un solo elemento vuoto\r\n if (values.length > 0 && values[values.length - 1].length == 1 && values[values.length - 1][0] == '')\r\n values.splice(values.length - 1, 1);\r\n\r\n if (values.length > 0 && values[0].length > 0) {\r\n\r\n // Check se la modifica è abilitata\r\n if (!this.Editable()) {\r\n this.msgExts.simpleWarning(this.lc.loc(\"Data for this table cannot be edited\"));\r\n return;\r\n }\r\n\r\n // Controllo che quello che sto copiando sia della stessa dimensione della selezione sull'es-table, tranne nel caso ho un singolo valore da copiare\r\n if ((sel.length != values.length || sel[0].length != values[0].length) && (values.length != 1 || values[0].length != 1)) {\r\n this.msgExts.simpleWarning(this.lc.loc(\"Size of copied data is different from the size of the selection\"));\r\n return;\r\n }\r\n\r\n // Se le dimensioni coincidono copio da una parte all'altra\r\n let changes: EsTableModelChange[] = [];\r\n for (let r = 0; r < sel.length; r++) {\r\n var row = sel[r];\r\n for (let c = 0; c < row.length; c++) {\r\n let cell = row[c];\r\n // Se ho un singolo valore lo applico a tutta la selezione\r\n let value = values.length == 1 && values[0].length == 1 ? values[0][0] : values[r][c]\r\n let old = cell.value;\r\n let niu = cell.val_setter?.(value);\r\n\r\n let olddate = this.dateExts.getDateConvertion(old);\r\n let niudate = this.dateExts.getDateConvertion(niu);\r\n if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)\r\n continue;\r\n\r\n changes.push(new EsTableModelChange(cell.item, cell.header!, cell.property!, old!, niu!));\r\n }\r\n }\r\n this.cdr.markForCheck();\r\n\r\n if (changes.length > 0)\r\n this.onModelChange.emit(changes);\r\n }\r\n });\r\n }\r\n }\r\n\r\n /** Ripulisce il timer utilizzato per capire se è stato effettuato un doppio click o meno */\r\n private clearCellClickTimer() {\r\n clearTimeout(this.cellDbClickTimer)\r\n this.cellDbClickTimer = null;\r\n }\r\n\r\n /**\r\n * Handler click singolo su una riga\r\n * \r\n * @param {any} $event Evento nativo javascript\r\n * @param {any} item Item che rappresenta il contesto su cui è stato effettuato un click\r\n * @param {boolean} selection Indica se la selezione è attiva\r\n * @param {boolean} internalCall Indica se la chiamata a questa funzione è interna: permette di skippare i check sulle CustomCells\r\n */\r\n public handleRowClick($event: any, item: any, selection: boolean, internalCall: boolean = false) {\r\n // Se ho un ctrl premuto esco con true in modo da fare bubbling dell'evento e lasciarlo gestire al browser (link ecc...)\r\n // Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD\r\n if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))\r\n return true;\r\n\r\n let mfc = false;\r\n if (selection) {\r\n mfc = true;\r\n this.selection_H.clearSelectionStatusExcluding();\r\n }\r\n\r\n if (selection && !item.locked && !item._sep && !item._group) {\r\n mfc = true;\r\n this.handleClick($event, item);\r\n }\r\n else if (item._group) {\r\n mfc = true;\r\n this.handleGroupClick(item);\r\n }\r\n\r\n // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping\r\n if(mfc)\r\n this.cdr.markForCheck();\r\n }\r\n\r\n /**\r\n * Gestione del click destro sull'es-table\r\n */\r\n public onRightClick() {\r\n if (this.Selection())\r\n this.onOpenContextMenu.emit();\r\n }\r\n\r\n /**\r\n * La modifica dell'utente è iniziata. Si imposta la variabile relativa a \"true\" in modo da mostrare l'input di testo\r\n * \r\n * Dopo che l'input è apparso, dopo un ciclo di Change Detection viene attivato il Subject collegato all'input che servirà a effettuare il focus\r\n * \r\n * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica\r\n * @param {any} item Oggetto sopra il quale è stata attivata la modifica\r\n */\r\n public setupUserEdit(rowItem: WritableSignal<TdElement>, item: any) {\r\n this.selection_H.clearSelectionStatusExcluding();\r\n let rowItm = rowItem();\r\n if (this.Editable() && rowItm.PropertyName) {\r\n let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;\r\n let newValues = { _editing: true, old_value: dynMode ? item.properties[rowItm.PropertyName] : item[rowItm.PropertyName] }\r\n rowItem.set(Object.assign(rowItm, newValues));\r\n }\r\n\r\n this.cdr.detectChanges();\r\n requestAnimationFrame(() => { this.FocusSubject.next(); });\r\n }\r\n\r\n /**\r\n * La modifica dell'utente è terminata. Si reimposta la variabile relativa a \"false\" in modo da nascondere l'input di testo e si emette la modifica del valore\r\n * \r\n * Dichiarata così per evitare spam di .bind\r\n * \r\n * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica\r\n * @param {any} item Oggetto sopra il quale è stata attivata la modifica\r\n * @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica\r\n */\r\n public finalizeUserEdit = (rowItem: WritableSignal<TdElement>, item: any, columnIndex: number) => {\r\n this.logger.log(\"Function called 'finalizeUserEdit'\");\r\n\r\n // Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo\r\n requestAnimationFrame(() => {\r\n let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;\r\n\r\n let newValues = { _editing: false }\r\n let newRowItem = Object.assign(rowItem(), newValues);\r\n rowItem.set(newRowItem);\r\n\r\n let old = newRowItem.old_value;\r\n let niu = dynMode ? item.properties[newRowItem.PropertyName!] : item[newRowItem.PropertyName!];\r\n\r\n let olddate = this.dateExts.getDateConvertion(old);\r\n let niudate = this.dateExts.getDateConvertion(niu);\r\n if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)\r\n return;\r\n\r\n this.onModelChange.emit([new EsTableModelChange(item, newRowItem.ID, newRowItem.PropertyName!, old, niu)]);\r\n this.selectionStatus[item._ordinal]?.[columnIndex]?.val_setter?.(niu);\r\n });\r\n };\r\n\r\n // Range selection Experimentals\r\n private mouseIsDown: boolean = false;\r\n private rangeSelected: boolean = false;\r\n private rangeStartWasIgnored: boolean = false;\r\n private firstCoordinates: { row: number, column: number } | null = null;\r\n\r\n mousedown(event: MouseEvent, rowItem: any, _: any) {\r\n\r\n // Tasto diverso dal click sinistro -> ciao è stato bello e intenso\r\n if (event.buttons != 1 || !this.RangeSelection())\r\n return;\r\n\r\n // Sto lavorando su QUESTA es-table\r\n this.copyPasteDetector.ActiveEstReference = this;\r\n\r\n // Tutti i click su una cella già in edit non devono effettuare la selezione della riga\r\n if ((<any>rowItem)._editing)\r\n return;\r\n\r\n this.mouseIsDown = true;\r\n\r\n let coords = (<HTMLElement>event.currentTarget).id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n this.firstCoordinates = { row, column };\r\n // Se ho già un range di selezione ignoro temporanemaente questa selezione in modo da capire bene cosa devo fare dopo (click sulla riga / altra selezione)\r\n // e gestire la grafica in maniera un po' più precisa\r\n if (!this.rangeSelected || (event.ctrlKey || !this.Selection())) {\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);\r\n this.cdr.markForCheck();\r\n }\r\n else\r\n this.rangeStartWasIgnored = true;\r\n this.logger.log(`mouse down on ${row}:${column}`);\r\n }\r\n\r\n mouseenter(event: MouseEvent) {\r\n if (!this.RangeSelection())\r\n return;\r\n\r\n if (event.buttons == 0)\r\n this.mouseIsDown = false;\r\n\r\n if (this.mouseIsDown && this.firstCoordinates) {\r\n let id = (<HTMLElement>event.currentTarget).id;\r\n let coords = id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n // Se ho ignorato l'inizio della selezione nel mousedown lo recupero qui\r\n if (this.rangeStartWasIgnored) {\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, this.firstCoordinates.row, this.firstCoordinates.column);\r\n this.rangeStartWasIgnored = false;\r\n }\r\n this.selection_H.singleCellSelection({ view: event.view, range: true }, row, column, this.firstCoordinates);\r\n this.logger.log(`mouse move over ${row}:${column}`);\r\n this.rangeSelected = true;\r\n this.cdr.markForCheck();\r\n }\r\n }\r\n\r\n mouseup(event: MouseEvent) {\r\n if (!this.RangeSelection())\r\n return;\r\n\r\n let id = (<HTMLElement>event.currentTarget).id;\r\n let coords = id.split('_');\r\n let row = parseInt(coords[coords.length - 2]);\r\n let column = parseInt(coords[coords.length - 1]);\r\n\r\n // Se il mouseup viene effettuato sulla stessa cella del primo mousedown e siamo in modalità di selezione deseleziono la cella perché è un semplice click\r\n if (this.mouseIsDown && this.firstCoordinates) {\r\n if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection())\r\n this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);\r\n else if (event.ctrlKey || !this.Selection())\r\n this.rangeSelected = true;\r\n\r\n this.cdr.markForCheck();\r\n }\r\n\r\n this.mouseIsDown = false;\r\n this.logger.log(`mouse lifted up`);\r\n }\r\n\r\n //* Piango\r\n private EsTdsCache: { [id: string]: EsTd } = {};\r\n\r\n public getCellReference(object: any, column: string): EsTd {\r\n let fkThisShitImOut = this.utiExts.deepClone(object);\r\n this.utilities_H.calculateHash([fkThisShitImOut]);\r\n let prop = column;\r\n let hash = fkThisShitImOut._hash;\r\n\r\n let toRet = this.EsTdsCache[`${prop}_${hash}`];\r\n return toRet;\r\n }\r\n\r\n public registerCell(event: EsTdReference, rowItem: any, _: any, cellRef: ElementRef<HTMLTableCellElement>) {\r\n this.EsTdsCache[`${event.id}_${event.hash}`] = event.self;\r\n\r\n this._zone.runOutsideAngular(() => {\r\n fromEvent(cellRef.nativeElement, 'mousedown').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mousedown(e as MouseEvent, rowItem, _)});\r\n fromEvent(cellRef.nativeElement, 'mouseenter').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mouseenter(e as MouseEvent)});\r\n fromEvent(cellRef.nativeElement, 'mouseup').pipe(takeUntil(this._destroyed$)).subscribe((e: Event) => { this.mouseup(e as MouseEvent)});\r\n });\r\n\r\n }\r\n //* Piango ancora\r\n\r\n // Gestione Embedding\r\n showDialog(dlg: ModalDirective, elementRef: HTMLDivElement) {\r\n dlg.show();\r\n this.retries = 0;\r\n if (this.emb.Embedded)\r\n this.doFixDialog(dlg, elementRef);\r\n }\r\n\r\n private retries = 0;\r\n\r\n doFixDialog(dlg: ModalDirective, elementRef: HTMLDivElement) {\r\n this.retries++;\r\n let element = elementRef;\r\n if (!element) {\r\n if (this.retries > 10)\r\n return;\r\n setTimeout(() => this.doFixDialog(dlg, elementRef), 25);\r\n return;\r\n }\r\n this.rendererRef.setStyle(element, \"padding-top\", \"5%\");\r\n this.rendererRef.setStyle(element, \"margin-left\", \"-110px\");\r\n this.rendererRef.setStyle(element, \"width\", \"calc(100% + 110px)\");\r\n this.rendererRef.setStyle(element, \"overflow\", \"hidden\");\r\n\r\n\r\n this.doFixBody(elementRef);\r\n\r\n let backdropHeight = (<any>dlg).backdrop.instance.element.nativeElement.clientHeight;\r\n this.emb.MainWindow.postMessage({ type: \"modal-open\", backdropHeight: backdropHeight }, \"*\");\r\n }\r\n\r\n doFixBody(elementRef: HTMLDivElement) {\r\n let body = (<HTMLElement>elementRef).getElementsByClassName(\"modal-body\")[0] as HTMLElement;\r\n // Ci prova finch� non trova il body dato che potrebbe essere creato in qualsiasi momento\r\n if (!body) {\r\n setTimeout(() => this.doFixBody(elementRef), 250);\r\n return;\r\n }\r\n body.style.setProperty(\"max-height\", \"600px\", \"important\");\r\n body.style.setProperty(\"overflow-x\", \"hidden\");\r\n body.style.setProperty(\"overflow-y\", \"auto\");\r\n }\r\n\r\n hideDialog(dlg: ModalDirective) {\r\n dlg.hide();\r\n\r\n if (!this.emb.Embedded)\r\n return;\r\n\r\n this.emb.MainWindow.postMessage({ type: \"modal-close\" }, \"*\");\r\n }\r\n //* Gestione Embedding \r\n}\r\n\r\n","<!-- Patacchino di autoaggiornamento -->\n@if (AutoUpdate()) {\n <div class=\"w-100\">\n <div class=\"pull-right\">\n {{'Update every' | localize : lc}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\n </div>\n <div class=\"pull-right m-t-2\">\n <label class=\"est-switch\">\n <input type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"est-slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n}\n\n@if (View) {\n <div class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\n @if (FirstBind() && ShowLoadingOnBootstrap()) {\n <div class=\"est-loading-box\">\n <div class=\"est-loading-content\">\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\n </div>\n </div>\n }\n @if (PagingStyle() == 'both' || PagingStyle() == 'top') {\n <div class=\"est-top-pager\">\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n @if (canSelectAll() || (View?.selection || arraymodeSelection)?.all) {\n <div class=\"est-top-allselect\">\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\n </div>\n }\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\n @if ((SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom') {\n <tr>\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\n <p class=\"est-hidden-view app-margin-bottom-0\">§</p>\n </th>\n </tr>\n }\n <!-- Blocco header group -->\n @if (RowThGroups) {\n\n @for (level of RowThGroups; track $index) {\n <tr>\n @for (cell of level; track IDTrackBy($index, cell)) {\n <th [attr.colspan]=\"cell.Span\"\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\n class=\"est-text-center\">\n @if (cell.Pinned) {\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\">\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n </div>\n }\n @else {\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n }\n </th>\n }\n </tr>\n }\n }\n @if (!RowThGroups) {\n @if (HasHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n <!-- Blocco header group secondario -->\n @if (HasSecondaryHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n }\n <!-- Blocco effettivo degli header -->\n <tr>\n <!-- <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n Selection: {{Selection()}}\n HasPinnedColumns: {{HasPinnedColumns()}}\n arrayMode: {{arrayMode()}}\n viewMode: {{viewMode()}}\n UseCustomCells: {{UseCustomCells()}}\n RowTHs: {{!!RowTHs}}\n RowTHs.length: {{RowTHs?.length}}\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\n </div> -->\n <!-- Aggiungo una checkbox se la selezione è attiva -->\n @if (Selection() && !HasPinnedColumns()) {\n <th class=\"est-col-min\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n <!-- Header che valgono per view mode e array mode -->\n @if (arrayMode() || viewMode()) {\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle proprietà -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()) {\n @for (operation of DynamicOperations(); track idTrackBy($index, operation)) {\n <th class=\"est-col-min est-no-side-padding\"></th>\n }\n @for (rowHeader of DynamicRowColumnsDefinition(); track PropertyNameTrackBy($index, rowHeader)) {\n @if (rowHeader.Visible) {\n @if (OrderByColumn()) {\n <th id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\" [SearchInProgress]=\"researchInProgress()\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\n }\n @else {\n <th id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\">{{rowHeader.Description}}</th>\n }\n }\n }\n }\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\n @if (UseCustomCells() && RowTHs?.length > 0) {\n @if (HasPinnedColumns()) {\n <th class=\"est-pinned-header est-col-min\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\n @if (Selection()) {\n <th class=\"est-col-min est-no-border\" [style.width.px]=\"20\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n @if (rowHeader && rowHeader.Visible && rowHeader.Pinned) {\n <th\n [style.width.px]=\"rowHeader.PinnedWidth\"\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [class.est-pinned-internal-header]=\"true\"\n [class.est-no-border]=\"true\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Pinned]=\"true\"\n [Fixed]=\"rowHeader.Fixed\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}|{{rowHeader.Order}}</span>\n }\n </th>\n }\n }\n </div>\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n <!-- <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n rowHeader: {{!!rowHeader}}\n rowHeader.Visible: {{rowHeader?.Visible}}\n rowHeader.Pinned: {{rowHeader?.Pinned}}\n rowHeader.Template: {{!!rowHeader.Template}}\n rowHeader.Order: {{rowHeader.Order}}\n </div> -->\n @if (rowHeader && rowHeader.Visible && !rowHeader.Pinned) {\n <th\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [style.text-align]=\" rowHeader.Alignment || null\"\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}</span>\n }\n </th>\n }\n }\n }\n }\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\n @if (Removal()) {\n <th [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\n }\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\n @if (Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()) {\n <th class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\n <div class=\"est-pointer\">\n @if (HiddenColumns() || ColumnsOrdering()) {\n <a class=\"dropdown-item\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\n @if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n @else {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n </a>\n }\n <ng-container *ac=\"exportGlobalAcl\">\n @if (Export() && CSVExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\n }\n @if (Export() && XLSXExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\n }\n </ng-container>\n @for (option of CornerMenuOptions(); track idTrackBy($index, option)) {\n <a class=\"dropdown-item\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\n }\n </div>\n </div>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\n @if (Selection()) {\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\n }\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\n @else {\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\n }\n </tbody>\n </table>\n </div>\n @if (PagingStyle() == 'both' || PagingStyle() == 'bottom') {\n <div>\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n </div>\n}\n\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\n<ng-template #pagingElement>\n @if (!FirstBind()) {\n <!-- Pulsanti avanti-indietro di paginazione -->\n @if (PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)) {\n <div class=\"pull-right btn-toolbar\">\n @if (PagerOptions.View?.pagingavailable || viewMode()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n @if (arrayMode() && UseArrayModePaging() && !SearchView()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n </div>\n }\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\n @if (PagerOptions.ShowCount || PagerOptions.ShowPagingOptions) {\n <div class=\"pull-right\">\n @if (PagerOptions.ShowPaging) {\n <div class=\"est-mt-min-5\">\n @if (!PagerOptions.UsesView) {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\n }\n @else {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch()\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></es-paging>\n }\n </div>\n }\n </div>\n }\n <div class=\"clearfix\"></div>\n }\n</ng-template>\n\n<!-- Template che contiene i pulsanti per cambiare pagina -->\n<ng-template #pagingButtons let-options>\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\n @if (options.Array) {\n <div class=\"est-inline\">@for (p of options.Array; track valTrackBy($index, p)) {\n <a class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a>\n }</div>\n }\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\n </div>\n</ng-template>\n\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto è templatizzato -->\n<ng-template #TBodySelection let-templateOptions>\n @for (item of boundSource(); track bodyTrackBy(i, item); let even = $even; let i = $index) {\n @if (item._visible || (!Hierarchy() && !ArrayGrouping())) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-pointer]=\"!item.locked\"\n [class.est-white-selected]=\"item._selected && !item.locked\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\n (click)=\"!RangeSelection() && handleRowClick($event, item, true)\"\n (contextmenu)=\"onRightClick();\">\n @if (!item.locked && !item._sep && !HasPinnedColumns()) {\n <td>\n <input type=\"checkbox\"\n style=\"width: 15px\"\n [disabled]=\"templateOptions.selDisabled\"\n [class.est-pointer]=\"!item.locked\"\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && !HasPinnedColumns()) {\n <td></td>\n }\n\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #TBody>\n @for (item of boundSource(); track bodyTrackBy(i, item); let i = $index; let even = $even) {\n @if (item._visible || !Hierarchy()) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n (click)=\"handleRowClick($event, item, false)\">\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #groupPager let-item>\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body \">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\n </td>\n }\n @if (item._grouplevel > 1) {\n <td [attr.colspan]=\"item._grouplevel-1\"></td>\n }\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\n @if (RowGroupingPagingStyle() == 'right') {\n <div class=\"est-rg-sep-flex-right\">\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-ipp\"><es-paging [CountLabel]=\"CountLabel()\" [AllSearch]=\"AllSearch()\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></es-paging></div>\n }\n </div>\n }\n\n @if (RowGroupingPagingStyle() == 'left') {\n <div class=\"est-rg-sep-flex-left\">\n <div class=\"est-rg-ipp\"><es-paging [AllSearch]=\"AllSearch()\" [CountLabel]=\"CountLabel()\" [GroupMode]=\"item.searches == 'groups'\" [PagerCount]=\"item.searches == 'groups' ? item.view.groupcount : item.view.objectcount\" [View]=\"item.view\" (pagingSelected)=\"onGroupItemsPerPageChanged(item, $event);\"></es-paging></div>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\n }\n </div>\n }\n </td>\n </ng-template>\n\n <!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\n <ng-template #basicColumns let-item let-index=\"index\">\n @if ((!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\n }\n </ng-template>\n\n <ng-template #defaultEditor let-ctx>\n <!-- Un po' triste ma questo è il metodo più semplice per gestire il cambio di modello -->\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\n @if (ctx.item.properties) {\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n @else {\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n </ng-template>\n\n <ng-template #defaultEsTd let-ctx>\n <!-- TODO: Formattare il valore in base a valType.type -->\n @if (ctx.type == 'enum') {\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\n }\n @else {\n @switch(ctx.type){\n @case(\"date\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\n }\n @case(\"datetime\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\n }\n @default {\n {{ctx.value}}\n }\n }\n }\n </ng-template>\n\n <ng-template #customCells let-item let-opt=\"templateOptions\">\n @if (UseCustomCells() && !EmptyRowTds()) {\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\n @if (!item.locked && !item._sep && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\n <input type=\"checkbox\" style=\"width: 15px\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\"></td>\n }\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (cell().Pinned) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: true, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n </div>\n </td>\n }\n <!-- Body effettivo della riga -->\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (!cell().Pinned;) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: false, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n }\n </ng-template>\n\n <!-- Cella customizzata, elemento grafico base per la tabella -->\n <ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\n\n @let c = cell();\n\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\n @if (c.IconClass && c.Visible) {\n @if (!c.ConditionField || (((item.properties || item) | est_propinsensitive : c.ConditionField) == c.ConditionValue)) {\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{c.Title}}\" class=\"{{c.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, c.ID)\">{{c.Content}}</span></td>\n }\n @else {\n <td class=\"est-col-min est-no-side-padding\"></td>\n }\n }\n\n <!-----------------------------------------------------------------------------------------------------------------------\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\n - . Generiche -\n - . Gestione allineamento e colori per la modalità report -\n - . Gestioni grafiche particolari per il Pinned -\n - . Gestione della selezione a singola cella in assenza di pinned -\n - . Gestione click classico e selezione multicella -\n ------------------------------------------------------------------------------------------------------------------------->\n\n @if (!c.IconClass && c.Visible) {\n <td\n es-td=\"{{c.Property || c.ID}}\"\n id=\"estd_{{c.Property || c.ID}}_{{item._ordinal}}_{{index}}\"\n class=\"{{ c.Class }}\"\n [Context]=\"item._hash\"\n [class.est-default-row-height]=\"!HighCellDensity()\"\n [class.est-white-selected]=\"item._selected\"\n [class.est-no-selection]=\"Editable() && c.PropertyName\"\n [class.est-rg-hdr]=\"c.GroupHeader\"\n [class.est-rg-agg]=\"c.GroupAggregation\"\n [class.est-nowrap]=\"Hierarchy() || !c.Wraps\"\n [style.text-align]=\"(!pinned && c.Alignment) ? c.Alignment : null\"\n [style.color]=\"(!pinned && item.forecolors && c.PropAccessor) ? item.forecolors[c.PropAccessor] : null\"\n [style.background-color]=\"(!pinned && item.backcolors && c.PropAccessor) ? item.backcolors[c.PropAccessor] : null\"\n [style.width.px]=\"pinned ? c.PinnedWidth : null\"\n [class.est-no-border]=\"pinned\"\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\n [class.est-ltab-border]=\"c.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\n [class.est-rtab-border]=\"c.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\n [class.est-selected-cell]=\"selStatus?.selected\"\n [class.est-cell-lborder]=\" selStatus?.lborder\"\n [class.est-cell-rborder]=\" selStatus?.rborder\"\n [class.est-cell-tborder]=\" selStatus?.tborder\"\n [class.est-cell-bborder]=\" selStatus?.bborder\"\n [class.est-cell-lborder-tmp]=\"!c.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\n [class.est-cell-rborder-tmp]=\"!c.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\n #cellRef\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\n <!--\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\n (mousedown)=\"mousedown($event, cell, item)\"\n (mouseenter)=\"mouseenter($event)\"\n (mouseup)=\"mouseup($event)\"\n -->\n <div [class.est-edit-hidden]=\"c._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\n <ng-container #DEBUG>\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\n </ng-container>\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\n @if (c.Template) {\n @if (!c.Multi) {\n <ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <span><ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: (item[c.MultiProp] ? item[c.MultiProp][c.MultiIndex] : {}) }\"></ng-container></span>\n }\n }\n <!-- 8%\n Template non disponibile, può venire da\n RoutePath in caso sia un link di una tabella dinamica\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\n o Renderer se modalità dinamica/standard (in qual caso il renderer è il default)\n -->\n @if (!c.Template && !c.Multi && !c.Content) {\n @if (c.RoutePath) {\n <a [routerLink]=\"item | est_routerlink : c.RoutePath : c.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[c.PropertyName] : item[c.PropertyName]\"></a>\n }\n @else if (c.PropAccessor) {\n <span>\n {{(item.values? item.values[c.PropAccessor] : item[c.PropAccessor]) | est_format: c.Format }}\n </span>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_renderer: { name: c.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: c, value: item.properties ? item.properties[c.PropertyName] : item[c.PropertyName], type: c.PropertyType} }\"></ng-container>\n }\n }\n <!-- 1% Se in modalità gerarchica metto il td per navigare la gerarchia -->\n @if (Hierarchy() && index == 0) {\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\n }\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\n @if (c.Content) {\n {{c.Content}}\n }\n </div>\n @if (c._editing) {\n <div class=\"est-mt-min-5\">\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_editor: { name: c.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: c, signal: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit } }\"></ng-container>\n </div>\n }\n </td>\n }\n </ng-template>\n\n <!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\n <ng-template #HierarchyNavigator let-item>\n @if (!item.parent) {\n <span class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\n }\n @else if (item.parent && item._expanded) {\n <span class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()!])\"></span>\n }\n @else {\n <span class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()!])\"></span>\n }\n &nbsp;\n </ng-template>\n\n <!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\n <ng-template #bodyDeleteAndExport let-options>\n @if (Removal() && !RemovalCondition()) {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @if (Removal() && RemovalCondition()) {\n\n @if(options.item[RemovalCondition()])\n {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\n }\n }\n @if (Export() || HiddenColumns() || CornerMenuOptions()) {\n <td class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\n }\n </ng-template>\n\n <!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\n <context-menu #emptyMenu>\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\n </context-menu>\n\n <!-- Modal per cambiare posizione e visibilità delle colonne dell'es-table -->\n <div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" cdkDrag>\n <div class=\"modal-content\">\n <div class=\"modal-header est-pointer\" cdkDragHandle>\n <h5 class=\"modal-title pull-left\">\n @if (HiddenColumns() && ColumnsOrdering()) {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n @else if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\n <span aria-hidden=\"true\">&times;</span>\n </button>\n </div>\n <div class=\"modal-body\">\n @if (!TMPColumnsList || TMPColumnsList.length == 0) {\n <div class=\"card card-info est-padding-10 est-margin-bottom-0\">\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\n </div>\n }\n @if (TMPColumnsList && TMPColumnsList.length > 0) {\n <div style=\"max-height:500px; overflow-y:auto\">\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\n <thead>\n <tr>\n @if (HiddenColumns()) {\n <th class=\"est-col-min\">\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\n </th>\n }\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\n <!--Filler-->\n <th></th>\n <!-- Pinner -->\n @if (DirectivesBased()) {\n <th class=\"est-col-min\"></th>\n }\n </tr>\n </thead>\n <tbody\n cdkDropList\n [cdkDropListData]=\"TMPColumnsList\"\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\n class=\"est-dropbox\">\n @for (item of TMPColumnsList; track idTrackBy(i, item); let i = $index; let last = $last) {\n <tr\n class=\"est-pointer est-droplist\"\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\n [class.est-no-selection]=\"!item.visible\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\n @if (HiddenColumns()) {\n <td>\n <input type=\"checkbox\" style=\"width: 15px\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\n </td>\n }\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\n @if (item.template) {\n <!-- Padri -->\n @if (item.parentTemplates && item.parentTemplates.length > 0) {\n <span class=\"est-fw-bold est-fs-13\">\n (&nbsp;\n @for (parent of item.parentTemplates; track idTrackBy($index, parent); let last = $last) {\n @if (parent.tmpl) {\n <ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container>\n }\n @if (parent.content) {\n {{parent.content}}\n }\n @if (!last) {\n <span>&nbsp;-&nbsp;</span>\n }\n }\n &nbsp;)\n </span>\n }\n <!-- Template header originale -->\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\n }\n @if (!item.template) {\n {{item.description}}\n }\n </td>\n <!--Filler-->\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\n <!-- Pinner -->\n @if (DirectivesBased() && ColumnsPinnable()) {\n <td>\n @if (!item.fixed && item.pinnable) {\n <span class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\n </div>\n </div>\n </div>\n </div>","import { EsTableDefaultable } from \"./EsTableDefaultable\";\r\n\r\n/** Modello di configurazione per L'EsTable */\r\nexport class EsTableModuleConfig {\r\n\r\n /** Indica se scrivere messaggi di log a console */\r\n public debugMode?: boolean;\r\n /** Eventuali proprietà di default per l'EsTable */\r\n public defaults?: EsTableDefaultable;\r\n /** Espressione ACL globale per definire se i tasti di download sono abilitati o no. Override a livello massimo */\r\n public globalExportAclExpression? : string;\r\n}","import { Pipe, PipeTransform } from '@angular/core';\nimport { InputType } from '../../domain/types';\n\n/**\n * Formattazione di presentazione per il renderer di default (celle senza template).\n * Self-contained (Intl / Date nativi) per non trascinare dipendenze esterne.\n *\n * `format` opzionale sovrascrive il default per tipo:\n * - numerici → \"F2\" = 2 decimali fissi\n * - date → pattern accettato da Intl (fallback a locale corto)\n */\n@Pipe({ name: 'est2_format', standalone: false })\nexport class Est2FormatPipe implements PipeTransform {\n transform(value: any, type?: InputType | string | null, format?: string | null, locale?: string): string {\n if (value == null || value === '') return '';\n\n switch (type) {\n case 'int':\n case 'number':\n return this.num(value, format, locale, 0);\n case 'float':\n return this.num(value, format, locale, undefined);\n case 'currency':\n return this.num(value, format, locale, 2);\n case 'date':\n return this.date(value, locale, false);\n case 'datetime':\n return this.date(value, locale, true);\n case 'boolean':\n return value === true || value === 'true' ? '✓' : value === false || value === 'false' ? '—' : String(value);\n default:\n return String(value);\n }\n }\n\n private num(value: any, format: string | null | undefined, locale: string | undefined, defDigits: number | undefined): string {\n const n = typeof value === 'number' ? value : parseFloat(String(value).replace(',', '.'));\n if (isNaN(n)) return String(value);\n let digits = defDigits;\n if (format && /^F\\d+$/.test(format)) digits = parseInt(format.slice(1), 10);\n return n.toLocaleString(locale || undefined, digits != null ? { minimumFractionDigits: digits, maximumFractionDigits: digits } : undefined);\n }\n\n private date(value: any, locale: string | undefined, withTime: boolean): string {\n const d = value instanceof Date ? value : new Date(value);\n if (isNaN(d.getTime())) return String(value);\n return d.toLocaleString(locale || undefined, withTime\n ? { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }\n : { year: 'numeric', month: '2-digit', day: '2-digit' });\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\n\n/**\n * Risolve un valore verso il suo `{ id, description }` in una sorgente enum.\n * Pura: ricalcola solo quando cambiano `value` o `source`.\n */\n@Pipe({ name: 'est2_lookup', standalone: false })\nexport class Est2LookupPipe implements PipeTransform {\n transform(value: unknown, source?: { id: any; description: string }[] | null): { id: any; description: string } {\n if (source)\n for (const entry of source)\n if (entry.id == value) return entry;\n return { id: '', description: value == null ? '' : String(value) };\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { EsTableDefaultable } from '../domain/configuration/EsTableDefaultable';\n\n/** Abilita il logging a console */\nexport const EST2_DEBUG = new InjectionToken<boolean>('EST2_DEBUG');\n\n/** Espressione ACL globale che abilita/disabilita l'export */\nexport const EST2_EXPORT_GLOBAL_ACL = new InjectionToken<string>('EST2_EXPORT_GLOBAL_ACL');\n\n/** Valori di default per-progetto degli Input */\nexport const EST2_DEFAULTS = new InjectionToken<EsTableDefaultable>('EST2_DEFAULTS');\n","// =============================================================================\n// es-table2 — motore di raggruppamento/aggregazione lato client (array mode)\n// -----------------------------------------------------------------------------\n// Funzioni pure: dato un array piatto, le colonne di raggruppamento (in ordine)\n// e le specifiche di aggregazione, produce una lista piatta di righe-gruppo e\n// righe-oggetto già ordinate per la visualizzazione ad albero.\n// =============================================================================\n\n/** Specifica di una singola aggregazione estratta da un template `{func:format}` */\nexport interface Est2AggSpec {\n /** Colonna su cui calcolare l'aggregazione */\n column: string;\n /** Funzione di aggregazione */\n func: 'min' | 'max' | 'sum';\n /** Formato di visualizzazione (F0-F9 per numeri, small/long/verylong per date) */\n format: string;\n /** Testo esatto del token da rimpiazzare nel template (es. `{sum:F2}`) */\n match: string;\n /** Tipo di dato dedotto dal formato */\n datatype: 'string' | 'date' | 'number';\n}\n\n/**\n * Estrae le specifiche di aggregazione da un template come `'{min:long} - {max:long}'`.\n * Token senza `:` vengono trattati come formato assente (datatype string).\n */\nexport function parseAggregationSpecs(column: string, template: string | null | undefined): Est2AggSpec[] {\n if (!template) return [];\n const tokens = template.match(/\\{[a-zA-Z0-9/:]*\\}/g);\n if (!tokens) return [];\n const specs: Est2AggSpec[] = [];\n for (const token of tokens) {\n const inner = token.substring(1, token.length - 1);\n const [func, format = ''] = inner.split(':');\n if (func !== 'min' && func !== 'max' && func !== 'sum') continue;\n let datatype: Est2AggSpec['datatype'] = 'string';\n if (format === 'small' || format === 'long' || format === 'verylong') datatype = 'date';\n else if (/^F\\d$/.test(format)) datatype = 'number';\n specs.push({ column, func, format, match: token, datatype });\n }\n return specs;\n}\n\n/** Calcola il valore grezzo (stringa) di una aggregazione sugli item di un gruppo */\nexport function computeAggValue(items: any[], spec: Est2AggSpec): string {\n const raw = items.map(i => i?.[spec.column]);\n\n if (spec.datatype === 'number') {\n const nums = raw.map(v => parseFloat(v)).filter(n => !isNaN(n));\n if (nums.length === 0) return '';\n if (spec.func === 'sum') return nums.reduce((a, b) => a + b, 0).toString();\n return (spec.func === 'max' ? Math.max(...nums) : Math.min(...nums)).toString();\n }\n\n if (spec.datatype === 'date') {\n if (spec.func === 'sum') return '';\n const times = raw.map(v => new Date(v).getTime()).filter(t => !isNaN(t));\n if (times.length === 0) return '';\n return new Date(spec.func === 'max' ? Math.max(...times) : Math.min(...times)).toISOString();\n }\n\n const strs = raw.map(v => (v == null ? '' : String(v)));\n if (spec.func === 'sum') return strs.join(', ');\n const sorted = [...strs].sort();\n return spec.func === 'max' ? sorted[sorted.length - 1] : sorted[0];\n}\n\n/** Formatta il valore grezzo di un'aggregazione secondo il formato richiesto */\nexport function formatAggValue(value: string | undefined, format: string, locale?: string): string {\n if (value == null || value === '' || !format) return value ?? '';\n\n if (/^F\\d$/.test(format)) {\n const n = parseFloat(value);\n return isNaN(n) ? value : n.toFixed(parseInt(format[1], 10));\n }\n\n if (format === 'small' || format === 'long' || format === 'verylong') {\n const d = new Date(value);\n if (isNaN(d.getTime())) return value;\n const opts: Intl.DateTimeFormatOptions =\n format === 'small'\n ? { year: 'numeric', month: '2-digit', day: '2-digit' }\n : format === 'long'\n ? { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit' }\n : { weekday: 'short', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit' };\n return d.toLocaleString(locale || undefined, opts);\n }\n\n return value;\n}\n\n/** Raggruppa un array per il valore di una proprietà, preservando l'ordine di prima apparizione */\nfunction groupBy(items: any[], key: string): Map<string, any[]> {\n const out = new Map<string, any[]>();\n for (const it of items) {\n const k = String(it?.[key] ?? '');\n const bucket = out.get(k);\n if (bucket) bucket.push(it);\n else out.set(k, [it]);\n }\n return out;\n}\n\nfunction computeAggMap(items: any[], specs: Est2AggSpec[]): Map<string, Map<string, string>> {\n const byCol = new Map<string, Map<string, string>>();\n for (const s of specs) {\n let m = byCol.get(s.column);\n if (!m) { m = new Map(); byCol.set(s.column, m); }\n if (!m.has(s.func)) m.set(s.func, computeAggValue(items, s));\n }\n return byCol;\n}\n\nfunction buildLevel(items: any[], groupCols: string[], specs: Est2AggSpec[], level: number, parent: any | null): any[] {\n const col = groupCols[level];\n const last = level + 1 === groupCols.length;\n const buckets = groupBy(items, col);\n const ret: any[] = [];\n\n for (const [value, groupItems] of buckets) {\n const key = (parent ? parent._thisKey : '') + '¦' + col + '=' + value;\n const g: any = {\n _group: true,\n _expanded: false,\n column: col,\n value,\n count: groupItems.length,\n _grouplevel: parent ? parent._grouplevel + 1 : 0,\n _thisKey: key,\n _parent: parent ? parent._thisKey : null,\n _visible: level === 0,\n _agg: computeAggMap(groupItems, specs)\n };\n ret.push(g);\n\n if (!last) {\n const sub = buildLevel(groupItems, groupCols, specs, level + 1, g);\n g._groupscount = sub.filter(r => r._group && r._parent === key).length;\n ret.push(...sub);\n } else {\n for (const it of groupItems) { it._thisKey = key; it._visible = false; }\n ret.push(...groupItems);\n }\n }\n return ret;\n}\n\n/**\n * Costruisce la lista piatta di righe (gruppi + oggetti) per la visualizzazione.\n * Gli oggetti vengono marcati `_item`, i gruppi `_group`; solo i gruppi di primo\n * livello partono `_visible`.\n */\nexport function buildGroupedRows(items: any[], groupCols: string[], specs: Est2AggSpec[]): any[] {\n for (const i of items) { i._item = true; i._visible = false; }\n return buildLevel(items, groupCols, specs, 0, null);\n}\n","// =============================================================================\n// es-table2 — modalità gerarchica (albero padre/figlio)\n// -----------------------------------------------------------------------------\n// Dato un array piatto in cui ogni oggetto conosce la propria chiave (ownKey) e\n// quella del padre (parentKey), assegna livello/visibilità/espansione e riordina\n// gli elementi in ordine depth-first (padre seguito dal proprio sottoalbero).\n//\n// Algoritmo O(n) basato su mappe (l'originale era O(n²)). Gli orfani (padre non\n// presente nel set) sono trattati come radici, così nessuna riga sparisce.\n// =============================================================================\n\n/** Confronto per l'ordinamento dei fratelli: numerico se possibile, altrimenti stringa */\nfunction compareKeys(a: any, b: any): number {\n const na = parseFloat(a), nb = parseFloat(b);\n if (!isNaN(na) && !isNaN(nb) && String(na) === String(a) && String(nb) === String(b)) return na - nb;\n return String(a ?? '').localeCompare(String(b ?? ''));\n}\n\n/**\n * Assegna i metadati gerarchici (`_level`, `_visible`, `_expanded`, `parent`) e\n * restituisce gli elementi in ordine depth-first pronti per la visualizzazione.\n *\n * @param items array piatto di oggetti\n * @param ownKey proprietà con l'id dell'oggetto\n * @param parentKey proprietà con l'id del padre\n * @param startsExpanded se true l'albero parte tutto espanso\n * @param autoSort se true ordina i fratelli per `ownKey`\n */\nexport function assignHierarchyLevels(\n items: any[],\n ownKey: string,\n parentKey: string,\n startsExpanded: boolean,\n autoSort: boolean\n): any[] {\n if (!items || items.length === 0) return [];\n\n const byOwn = new Map<string, any>();\n for (const it of items) byOwn.set(String(it[ownKey]), it);\n\n const childrenOf = new Map<string, any[]>();\n const roots: any[] = [];\n\n for (const it of items) {\n it.parent = false; // reset flag \"ha figli\"\n const pv = it[parentKey];\n const pKey = (pv === null || pv === undefined || pv === '') ? null : String(pv);\n const hasParent = pKey !== null && byOwn.has(pKey) && byOwn.get(pKey) !== it;\n if (hasParent) {\n let arr = childrenOf.get(pKey!);\n if (!arr) { arr = []; childrenOf.set(pKey!, arr); }\n arr.push(it);\n } else {\n roots.push(it);\n }\n }\n\n if (autoSort) {\n roots.sort((a, b) => compareKeys(a[ownKey], b[ownKey]));\n for (const arr of childrenOf.values()) arr.sort((a, b) => compareKeys(a[ownKey], b[ownKey]));\n }\n\n const ordered: any[] = [];\n const visit = (node: any, level: number, ancestorsOpen: boolean) => {\n const kids = childrenOf.get(String(node[ownKey]));\n node._level = level;\n node._visible = level === 1 ? true : ancestorsOpen;\n node.parent = !!(kids && kids.length);\n node._expanded = node.parent ? startsExpanded : false;\n ordered.push(node);\n if (kids) for (const k of kids) visit(k, level + 1, node._visible && node._expanded);\n };\n for (const r of roots) visit(r, 1, true);\n\n return ordered;\n}\n\n/** Espande un nodo: rende visibili i suoi figli diretti (i nipoti restano nascosti) */\nexport function expandNode(rows: any[], ownKey: string, parentKey: string, key: any): void {\n const k = String(key);\n for (const r of rows) if (String(r[ownKey]) === k) { r._expanded = true; break; }\n for (const r of rows) if (String(r[parentKey]) === k) r._visible = true;\n}\n\n/** Collassa un nodo: nasconde ricorsivamente tutto il sottoalbero */\nexport function collapseNode(rows: any[], ownKey: string, parentKey: string, key: any): void {\n const k = String(key);\n for (const r of rows) if (String(r[ownKey]) === k) { r._expanded = false; break; }\n collapseChildren(rows, ownKey, parentKey, k);\n}\n\nfunction collapseChildren(rows: any[], ownKey: string, parentKey: string, parentK: string): void {\n for (const child of rows) {\n if (String(child[parentKey]) !== parentK) continue;\n child._visible = false;\n if (child.parent) {\n child._expanded = false;\n collapseChildren(rows, ownKey, parentKey, String(child[ownKey]));\n }\n }\n}\n","// Motore di coercizione valori — puro e stateless (come row-grouping.ts / hierarchy.ts).\n// Converte una stringa (digitata o incollata) nel tipo della colonna, segnalando la\n// compatibilità. Estratto da EsTable2Component per essere testabile in isolamento.\n\nimport { InputType } from '../../domain/types';\n\n/** Forma minima di colonna richiesta dalla coercizione (soddisfatta da `Est2Column`). */\nexport interface CoerceColumn {\n type: InputType | null;\n source: { id: any; description: string }[] | null;\n}\n\n/** Risultato di una coercizione: `ok:false` = valore incompatibile col tipo. */\nexport interface CoerceResult { ok: boolean; value: any; }\n\n/**\n * Converte `raw` nel tipo di `col`. `ok:false` = incompatibile (es. testo in una\n * colonna numerica) → il chiamante avvisa e non scrive. Una stringa vuota è sempre\n * valida e azzera il valore (`null`).\n */\nexport function coerceValue(raw: string, col: CoerceColumn): CoerceResult {\n const type = col.type;\n const v = raw == null ? '' : String(raw).trim();\n\n switch (type) {\n case 'int':\n case 'number':\n case 'float':\n case 'currency': {\n if (v === '') return { ok: true, value: null };\n const n = toNumber(v);\n if (n == null || isNaN(n)) return { ok: false, value: null };\n return { ok: true, value: (type === 'int' || type === 'number') ? Math.round(n) : n };\n }\n case 'boolean': {\n if (v === '') return { ok: true, value: null };\n if (/^(true|1|✓|s[iì]|si|yes|y)$/i.test(v)) return { ok: true, value: true };\n if (/^(false|0|—|no|n)$/i.test(v)) return { ok: true, value: false };\n return { ok: false, value: null };\n }\n case 'enum':\n case 'autocomplete': {\n if (!col.source || col.source.length === 0) return { ok: true, value: v };\n const byId = col.source.find(o => String(o.id) === v);\n if (byId) return { ok: true, value: byId.id };\n const byDesc = col.source.find(o => o.description === v);\n if (byDesc) return { ok: true, value: byDesc.id };\n return { ok: false, value: null };\n }\n case 'date':\n case 'datetime':\n case 'time': {\n if (v === '') return { ok: true, value: null };\n const d = parseDateLoose(v);\n return d ? { ok: true, value: d } : { ok: false, value: null };\n }\n default:\n return { ok: true, value: raw };\n }\n}\n\n/** Parsing numerico tollerante (separatori di migliaia + virgola/punto decimale). `NaN` = non numerico */\nexport function toNumber(v: string): number {\n let s = v.replace(/\\s/g, '').replace(/[€$%]/g, '');\n if (s === '') return NaN;\n const hasComma = s.includes(','), hasDot = s.includes('.');\n if (hasComma && hasDot) {\n // l'ultimo separatore è quello decimale\n if (s.lastIndexOf(',') > s.lastIndexOf('.')) s = s.replace(/\\./g, '').replace(',', '.');\n else s = s.replace(/,/g, '');\n } else if (hasComma) {\n s = s.replace(',', '.');\n }\n return /^-?\\d*\\.?\\d+$/.test(s) ? parseFloat(s) : NaN;\n}\n\n/** Parsing date tollerante: `dd/MM/yyyy [HH:mm[:ss]]` o formati nativi. `null` = non valida */\nexport function parseDateLoose(v: string): Date | null {\n const m = v.match(/^(\\d{1,2})[\\/\\-.](\\d{1,2})[\\/\\-.](\\d{2,4})(?:[ T](\\d{1,2}):(\\d{2})(?::(\\d{2}))?)?$/);\n if (m) {\n const y = m[3].length === 2 ? 2000 + +m[3] : +m[3];\n const d = new Date(y, +m[2] - 1, +m[1], +(m[4] || 0), +(m[5] || 0), +(m[6] || 0));\n return isNaN(d.getTime()) ? null : d;\n }\n const d = new Date(v);\n return isNaN(d.getTime()) ? null : d;\n}\n","// Geometria degli header-group multi-livello — pura e stateless.\n// Deriva le righe di intestazione-gruppo, i confini dei gruppi-colonna e la\n// contiguità dall'insieme (colonne visibili, mappa th, id-gruppo). Estratta da\n// EsTable2Component per poterla testare in isolamento (bottom-alignment, spacer,\n// contiguità sono geometria sottile che merita specifiche dedicate).\n\nimport { TemplateRef } from '@angular/core';\n\n/** Forma minima di `*th` richiesta dalla geometria (soddisfatta da `EsThDirective`). */\nexport interface HgThLike {\n thParent: string | null;\n thStaticContent?: string | null;\n Template?: TemplateRef<any> | null;\n}\n\n/** Forma minima di colonna richiesta (soddisfatta da `Est2Column`). */\nexport interface HgColLike { id: string; }\n\n/** Cella di una riga di header-group multi-livello (span su N colonne-dato). */\nexport interface Est2HeaderGroupCell {\n id: string;\n span: number;\n isGroup: boolean;\n label: string;\n template: TemplateRef<any> | null;\n}\n\n/**\n * Catena di antenati di una colonna via `thParent`. Default: padre-immediato → root.\n * `rootFirst=true` la restituisce root → padre-immediato. Guardia a 32 contro cicli.\n */\nexport function ancestorChain(id: string, thById: Map<string, HgThLike>, rootFirst = false): string[] {\n const chain: string[] = [];\n let p = thById.get(id)?.thParent ?? null;\n let guard = 0;\n while (p && guard++ < 32) { chain.push(p); p = thById.get(p)?.thParent ?? null; }\n return rootFirst ? chain.reverse() : chain;\n}\n\n/**\n * Righe di header-group multi-livello, dall'alto (root) verso il basso (padre\n * immediato). Ogni gruppo si allinea in BASSO: il padre immediato di una colonna\n * sta sempre nella riga direttamente sopra la colonna; gli antenati più alti\n * salgono. Le colonne senza gruppo (o con catena più corta) hanno celle-spacer\n * vuote in alto.\n */\nexport function computeHeaderGroupRows(\n leaves: HgColLike[], thById: Map<string, HgThLike>, parentIds: Set<string>\n): Est2HeaderGroupCell[][] {\n if (parentIds.size === 0 || leaves.length === 0) return [];\n\n const chains = leaves.map(c => ancestorChain(c.id, thById));\n const maxDepth = chains.reduce((m, ch) => Math.max(m, ch.length), 0);\n if (maxDepth === 0) return [];\n\n const rows: Est2HeaderGroupCell[][] = [];\n for (let r = 0; r < maxDepth; r++) {\n const row: Est2HeaderGroupCell[] = [];\n let i = 0;\n while (i < leaves.length) {\n // allineamento in basso: alla riga r (0=alto) corrisponde l'antenato a\n // distanza (maxDepth-1-r) dalla colonna (0 = padre immediato)\n const anc = chains[i][maxDepth - 1 - r];\n if (anc == null) {\n row.push({ id: `_hg_spacer_${r}_${i}`, span: 1, isGroup: false, label: '', template: null });\n i++;\n } else {\n let span = 0;\n while (i < leaves.length && chains[i][maxDepth - 1 - r] === anc) { span++; i++; }\n const gth = thById.get(anc);\n row.push({ id: anc, span, isGroup: true, label: gth?.thStaticContent ?? anc, template: gth?.Template ?? null });\n }\n }\n rows.push(row);\n }\n return rows;\n}\n\n/**\n * Indici (in `cols`) delle colonne che aprono un nuovo gruppo-colonna, cioè dove\n * il gruppo padre immediato cambia rispetto alla colonna precedente. Serve a\n * disegnare i confini dei gruppi anche nel corpo della tabella.\n */\nexport function computeColumnGroupBoundaries(\n cols: HgColLike[], thById: Map<string, HgThLike>, hasParents: boolean\n): Set<number> {\n const set = new Set<number>();\n if (!hasParents) return set;\n let prev: string | null | undefined = undefined;\n for (let i = 0; i < cols.length; i++) {\n const parent = thById.get(cols[i].id)?.thParent ?? null;\n if (i > 0 && parent !== prev) set.add(i);\n prev = parent;\n }\n return set;\n}\n\n/**\n * Riordina `orderIds` così che i membri di uno stesso gruppo restino contigui.\n * Chiave di ordinamento = [prima-apparizione di ogni antenato (root→foglia), poi\n * indice proprio]. Due colonne dello stesso gruppo non possono più essere\n * interlacciate con colonne esterne.\n */\nexport function enforceGroupContiguity(\n orderIds: string[], thById: Map<string, HgThLike>, hasParents: boolean\n): string[] {\n if (!hasParents) return orderIds;\n const chainOf = (id: string) => ancestorChain(id, thById, true);\n const firstIdx = new Map<string, number>();\n orderIds.forEach((id, i) => {\n for (const g of chainOf(id)) if (!firstIdx.has(g)) firstIdx.set(g, i);\n });\n const keyOf = (id: string, i: number): number[] =>\n [...chainOf(id).map(g => firstIdx.get(g)!), i];\n return orderIds\n .map((id, i) => ({ id, key: keyOf(id, i), i }))\n .sort((a, b) => {\n const n = Math.max(a.key.length, b.key.length);\n for (let k = 0; k < n; k++) {\n const av = a.key[k] ?? -1, bv = b.key[k] ?? -1;\n if (av !== bv) return av - bv;\n }\n return a.i - b.i;\n })\n .map(x => x.id);\n}\n","// Modello di colonna dell'es-table2 — tipo puro, condiviso da componente e motori.\n// Estratto qui per rompere la dipendenza circolare col motore `core/columns.ts`.\n\nimport { EsThDirective } from '../../directives/es_th.directive';\nimport { EsTdDirective } from '../../directives/es_td.directive';\nimport { InputType } from '../../domain/types';\nimport { Est2AggSpec } from './row-grouping';\n\n/** Modello interno di colonna. Può derivare da direttive `*th`/`*td`, da una\n * `EsTableColumnsDefinition` (modalità dinamica) o da una `ReportColumn` (report). */\nexport interface Est2Column {\n id: string;\n /** direttiva header, se la colonna deriva da `*th` */\n header?: EsThDirective;\n /** direttiva cella, se la colonna deriva da `*td` */\n cell?: EsTdDirective;\n visible: boolean;\n orderable: boolean;\n alignment: 'left' | 'right' | 'center';\n property: string | null;\n type: InputType | null;\n source: { id: any; description: string }[] | null;\n format: string | null;\n /** classe CSS della CELLA (`*td Class`) — applicata solo ai `<td>` */\n cssClass: string;\n /** classe CSS dell'HEADER (`*th Class`) — applicata solo ai `<th>` */\n headerClass: string;\n wrap: boolean;\n /** true se questa colonna è una chiave di raggruppamento (`thGroup`) */\n isGroup: boolean;\n /** specifiche di aggregazione parseate dal template `thAggregation` */\n aggSpecs: Est2AggSpec[];\n /** testo statico dell'header (modalità dinamica/report; direttive senza template) */\n headerText?: string | null;\n /** colore di sfondo dell'header (report) */\n headerBg?: string | null;\n /** accesso al valore per indice: report → indice colonna in `values[]` */\n propAccessor?: string | null;\n /** indice per il lookup dei colori per-cella (`forecolors[i]`/`backcolors[i]`) in report e dinamica */\n colorIndex?: number | null;\n /** route di navigazione per la cella (dinamica) */\n routePath?: string | null;\n routeParams?: string[] | null;\n /** nome del renderer custom da risolvere tra i `*td` (dinamica) */\n rendererName?: string | null;\n /** true se la colonna è \"pinnata\" (sticky a sinistra durante lo scroll orizzontale) */\n pinned?: boolean;\n /** larghezza in px di DEFAULT della colonna pinnata (dal `PinnedWidth` della direttiva) */\n pinnedWidth?: number | null;\n /** larghezza in px IMPOSTATA dall'utente via resize (qualsiasi colonna); sovrascrive l'auto/pinnedWidth */\n width?: number | null;\n /** colonna Multi: nome della proprietà-array sull'item (es. `touvalues`) */\n multiProp?: string | null;\n /** colonna Multi: indice dell'entry dentro l'array della proprietà */\n multiIndex?: number | null;\n}\n\n/**\n * Factory di `Est2Column`: applica i default costanti (visible/orderable/alignment/…)\n * e sovrascrive col `partial`. I costruttori di colonne (direttive, multi, dinamica,\n * report) passano solo i campi che differiscono, evitando derive di campo. I default\n * `false`/`null` sono equivalenti in comportamento agli `undefined` che i literal\n * omettevano (`pinned` falsy, `pinnedWidth || 120`, `headerBg` falsy).\n */\nexport function makeColumn(partial: Partial<Est2Column> & { id: string }): Est2Column {\n return {\n visible: true, orderable: false, alignment: 'left',\n property: null, type: null, source: null, format: null,\n cssClass: '', headerClass: '', wrap: false, isGroup: false, aggSpecs: [],\n headerText: null, headerBg: null, pinned: false, pinnedWidth: null,\n ...partial\n };\n}\n","// Costruttori di colonne (direttive / multi / dinamica / report) — puri e stateless.\n// Producono solo dati (`Est2Column[]` e, per Multi, le mappe header-group aggiornate);\n// il componente resta responsabile di applicarli allo stato a signal. Estratti da\n// EsTable2Component per isolare ~230 righe della logica più densa e branch-heavy.\n\nimport { EsThDirective } from '../../directives/es_th.directive';\nimport { EsTdDirective } from '../../directives/es_td.directive';\nimport { EsTableColumnsDefinition } from '../../domain/externals/EsTableColumnsDefinition';\nimport { InputType } from '../../domain/types';\nimport { Est2Column, makeColumn } from './column-model';\nimport { parseAggregationSpecs } from './row-grouping';\n\n/** Definizione di una colonna Multi da srotolare (proprietà-array + direttive) */\nexport interface MultiDef { prop: string; th: EsThDirective; td?: EsTdDirective; }\n\n/** Colonne da direttive `*th`/`*td` dirette (esclude gruppi e Multi). */\nexport function mapDirectiveColumns(\n ths: EsThDirective[], tdByCol: Map<string, EsTdDirective>,\n parentIds: Set<string>, defAlignment: 'left' | 'right' | 'center'\n): Est2Column[] {\n const cols: Est2Column[] = [];\n for (const th of ths) {\n if (!th.thIf) continue;\n if (th.thMulti) continue; // srotolata separatamente\n if (parentIds.has(th.th)) continue; // è un header di gruppo, non una colonna-dato\n const td = tdByCol.get(th.th);\n cols.push(makeColumn({\n id: th.th,\n header: th,\n cell: td,\n visible: th.thVisible,\n orderable: th.thOrderable,\n alignment: ((td?.tdAlignment || th.thAlignment)?.toLowerCase() as any) || defAlignment,\n property: th.thProperty,\n type: (th.thType as InputType) ?? null,\n source: th.thSource,\n format: td?.tdFormat || th.thFormat || null,\n cssClass: td?.tdClass || '', // `*td Class` → solo `<td>`\n headerClass: th.thClass || '', // `*th Class` → solo `<th>`\n wrap: th.thWrap,\n isGroup: th.thGroup,\n aggSpecs: parseAggregationSpecs(th.th, th.thAggregation),\n headerText: th.thStaticContent,\n headerBg: th.thBackgroundColor,\n routePath: th.thRoutePath,\n routeParams: th.thRouteParameterProperties,\n rendererName: th.thRendererName,\n pinned: !!th.thPinned,\n pinnedWidth: th.thPinnedWidth ?? null\n }));\n }\n return cols;\n}\n\n/** Colonne da una `EsTableColumnsDefinition[]` (modalità dinamica). */\nexport function mapDynamicColumns(defs: EsTableColumnsDefinition[], tds: EsTdDirective[]): Est2Column[] {\n const cols: Est2Column[] = [];\n for (let i = 0; i < defs.length; i++) {\n const d = defs[i];\n if (!d.Visible) continue;\n const renderer = tds.find(t => (d.RendererName && t.td === d.RendererName) || t.tdForProperty === d.PropertyName);\n cols.push(makeColumn({\n id: d.PropertyName,\n cell: renderer,\n orderable: d.Orderable !== false,\n property: d.PropertyName,\n type: (d.PropertyType as InputType) ?? null,\n source: d.PropertySource ?? null,\n format: d.Format ?? null,\n cssClass: d.Clss || '', headerClass: d.Clss || '', // dinamica: un'unica classe colonna (no *th/*td separati)\n wrap: !!d.HeaderWraps,\n headerText: d.Description,\n routePath: d.RoutePath,\n routeParams: d.RouteParameterProperties,\n rendererName: d.RendererName,\n colorIndex: i // forecolors/backcolors allineati all'ordine delle colonne\n }));\n }\n return cols;\n}\n\n/** Colonne da `report_columns` (modalità report): il valore è preso per indice. */\nexport function mapReportColumns(reportColumns: any[]): Est2Column[] {\n const cols: Est2Column[] = [];\n for (let i = 0; i < reportColumns.length; i++) {\n const c = reportColumns[i];\n cols.push(makeColumn({\n id: c.id,\n alignment: (c.alignment?.toLowerCase() as any) || 'left',\n format: c.format ?? null,\n headerText: c.description,\n headerBg: c.color || null,\n propAccessor: String(i),\n colorIndex: i\n }));\n }\n return cols;\n}\n\n/**\n * Srotola le colonne `*th Multi:true` sui dati: ogni entry unica `(header_group,\n * header)` della proprietà-array diventa una colonna sintetica, e i livelli di\n * `header_group` (separati da \">\") alimentano gli header-group. Puro: restituisce\n * le colonne e le mappe th/parent aggiornate (il componente le applica allo stato).\n */\nexport function buildMultiColumns(\n multiDefs: MultiDef[], baseThById: Map<string, EsThDirective>, baseParentIds: Set<string>, items: any[]\n): { columns: Est2Column[]; thById: Map<string, EsThDirective>; parentIds: Set<string> } {\n const cols: Est2Column[] = [];\n const thById = new Map(baseThById);\n const parentIds = new Set(baseParentIds);\n const seen = new Set<string>();\n\n for (const def of multiDefs) {\n const prop = def.prop;\n for (const item of (items || [])) {\n const arr = item?.[prop];\n if (!Array.isArray(arr)) continue;\n for (let ii = 0; ii < arr.length; ii++) {\n const mv = arr[ii] || {};\n const header = mv.header ?? '';\n const group = mv.header_group ?? null;\n const key = `${group}__${header}`;\n if (seen.has(key)) continue;\n seen.add(key);\n\n const hier = group ? String(group).split('>').map((s: string) => s.trim()).filter(Boolean) : [];\n const immediateParent = hier.length ? hier[hier.length - 1] : null;\n const colId = `${prop}_${ii}`;\n\n // th sintetico foglia: fornisce la catena thParent + il template header\n const leafTh = new EsThDirective(def.th.Template);\n leafTh.th = colId;\n leafTh.thStaticContent = header;\n leafTh.thParent = immediateParent;\n leafTh.thOrderable = false;\n thById.set(colId, leafTh);\n\n // th sintetici dei gruppi padre (una volta ciascuno)\n for (let h = 0; h < hier.length; h++) {\n const pid = hier[h];\n parentIds.add(pid);\n if (!thById.has(pid)) {\n const pth = new EsThDirective(null as any);\n pth.th = pid;\n pth.thStaticContent = pid;\n pth.thParent = h > 0 ? hier[h - 1] : null;\n thById.set(pid, pth);\n }\n }\n\n cols.push(makeColumn({\n id: colId,\n header: leafTh,\n cell: def.td,\n alignment: 'right',\n cssClass: def.td?.tdClass || '', // `*td Class` → solo `<td>`\n headerClass: def.th.thClass || '', // `*th Class` → solo `<th>`\n headerText: header,\n multiProp: prop, multiIndex: ii\n }));\n }\n }\n }\n return { columns: cols, thById, parentIds };\n}\n","// Controller di esportazione (E4) — signal-native ma costruito con una interfaccia\n// host STRETTA (una manciata di accessor/callback), non con il back-ref `this.est`\n// dell'es-table1. Possiede solo `inProgress` + il lazy `ExportService`. La logica è\n// identica a prima (byte-compatibile con `ExportHandler.tryExport`): estratta dal\n// componente per isolare l'export come feature a sé, con la superficie di scrittura\n// più piccola (legge soltanto).\n\nimport { Injector, Type } from '@angular/core';\nimport { ExportService, CsvHeaders } from '@esfaenza/extensions';\nimport { EsTableColumnsDefinition } from '../../domain/externals/EsTableColumnsDefinition';\nimport { Est2Column } from '../core/column-model';\n\n/** Firma della `ExportFunction` del consumer (identica a es-table1). */\nexport type ExportFn = (\n callback: (data: any[], type: Type<any>, cancel?: boolean) => void,\n format: 'CSV' | 'XLSX'\n) => void;\n\n/** Superficie minima che il componente espone al controller di export. */\nexport interface ExportHost {\n injector: Injector;\n visibleColumns(): Est2Column[];\n columns(): Est2Column[];\n boundSource(): any[];\n exportOnlyVisible(): boolean;\n exportBaseName(): string;\n dynamicDefs(): EsTableColumnsDefinition[] | null;\n exportFunction(): ExportFn | undefined;\n cellDisplayText(item: any, col: Est2Column): string;\n columnLabel(col: Est2Column): string;\n renderedHeaderTexts(): Map<string, string>;\n flashNotice(msg: string): void;\n}\n\nexport class ExportController {\n /** Evita esportazioni concorrenti (parità con l'`ExportHandler` originale) */\n private inProgress = false;\n /** `ExportService` risolto pigramente e in modo difensivo (vedi `resolveService`) */\n private svc: ExportService | null | undefined = undefined;\n\n constructor(private host: ExportHost) {}\n\n /**\n * È `providedIn:'root'` ma la sua costruzione dipende da\n * `LocalizationService`/`DateService`/`UtilityService`; se quella catena non è\n * presente (test isolati, o consumer che non importa `@esfaenza/extensions`),\n * `injector.get` lancia → catturo e faccio fallback al percorso self-contained.\n */\n private resolveService(): ExportService | null {\n if (this.svc === undefined) {\n try { this.svc = this.host.injector.get(ExportService, null); }\n catch { this.svc = null; }\n }\n return this.svc;\n }\n\n run(format: 'CSV' | 'XLSX' = 'CSV') {\n const fn = this.host.exportFunction();\n // Parità con l'originale (`ExportHandler.tryExport`): se il consumer fornisce\n // una ExportFunction gliela lascio gestire. La callback ha la STESSA firma\n // dell'es-table1 — `(data, type, cancel?)` — così le funzioni di export dei\n // componenti legacy funzionano invariate: `cancel === true` annulla l'export\n // senza scaricare nulla. È l'`ExportService` che, ricreando ogni riga come\n // `new Type()`, legge i decoratori `@Export` — NON le colonne `*th`.\n if (fn) {\n if (this.inProgress) { this.host.flashNotice(\"Un'esportazione è già in corso, attendere.\"); return; }\n this.inProgress = true;\n try {\n fn((data: any[], type: Type<any>, cancel: boolean = false) => {\n this.inProgress = false;\n if (cancel) return;\n this.viaService(data, type, format);\n }, format);\n } catch (e) {\n this.inProgress = false; // ExportFunction lanciata in modo sincrono: non blocco il guard\n throw e;\n }\n return;\n }\n // Nessuna ExportFunction: percorso self-contained sulle colonne `*th` correnti.\n const matrix = this.buildMatrix();\n if (matrix.length <= 1) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n if (format === 'XLSX') this.xlsx(matrix);\n else this.csv(matrix);\n }\n\n /** Delego all'`ExportService` originale (decorator-driven, byte-compatibile con es-table1). */\n private viaService(data: any[], type: Type<any>, format: 'CSV' | 'XLSX') {\n if (!data?.length) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n const svc = this.resolveService();\n if (!svc) { this.selfContained(data, format); return; } // niente servizio → fallback `*th`\n const columnsFilter = this.host.exportOnlyVisible() ? this.exportColumns().map(c => c.id) : undefined;\n const drcd = this.host.dynamicDefs();\n const genericHeaders: CsvHeaders[] | undefined = drcd && drcd.length > 0\n ? drcd.map(t => ({ label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' })) as any\n : undefined;\n svc.export(data, format, this.host.exportBaseName(), type, columnsFilter, genericHeaders);\n }\n\n /** Percorso di fallback self-contained (dati forniti dalla callback, senza ExportService). */\n private selfContained(data: any[], format: 'CSV' | 'XLSX') {\n if (!data?.length) { this.host.flashNotice('Nessun dato da esportare.'); return; }\n const matrix = this.matrixFrom(data.filter(r => !r._group));\n if (format === 'XLSX') this.xlsx(matrix);\n else this.csv(matrix);\n }\n\n /** Colonne da esportare (tutte o solo visibili) e con dato testuale */\n private exportColumns(): Est2Column[] {\n const cols = this.host.exportOnlyVisible() ? this.host.visibleColumns() : this.host.columns();\n return cols.filter(c => !c.isGroup);\n }\n\n private buildMatrix(): string[][] {\n return this.matrixFrom(this.host.boundSource().filter(r => !r._group));\n }\n\n /** Matrice [header, ...righe] con i valori visualizzati */\n private matrixFrom(rows: any[]): string[][] {\n const cols = this.exportColumns();\n const texts = this.host.renderedHeaderTexts();\n const header = cols.map(c => texts.get(c.id) || this.host.columnLabel(c));\n const body = rows.map(item => cols.map(c => this.host.cellDisplayText(item, c)));\n return [header, ...body];\n }\n\n private csv(matrix: string[][]) {\n const esc = (v: string) => {\n const s = v == null ? '' : String(v);\n return /[\",\\n;]/.test(s) ? '\"' + s.replace(/\"/g, '\"\"') + '\"' : s;\n };\n const csv = matrix.map(row => row.map(esc).join(';')).join('\\r\\n');\n // BOM per la corretta apertura in Excel con caratteri accentati\n this.downloadBlob('' + csv, this.fileName('csv'), 'text/csv;charset=utf-8;');\n }\n\n private async xlsx(matrix: string[][]) {\n try {\n const XLSX: any = await import('xlsx');\n const ws = XLSX.utils.aoa_to_sheet(matrix);\n const wb = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(wb, ws, 'Export');\n XLSX.writeFile(wb, this.fileName('xlsx'));\n } catch {\n this.host.flashNotice('Export XLSX non disponibile (SheetJS assente): esporto in CSV.');\n this.csv(matrix);\n }\n }\n\n private fileName(ext: 'csv' | 'xlsx'): string {\n const name = this.host.exportBaseName() || 'Export';\n return /\\.(csv|xlsx)$/i.test(name) ? name.replace(/\\.(csv|xlsx)$/i, '.' + ext) : `${name}.${ext}`;\n }\n\n private downloadBlob(content: string, filename: string, mime: string) {\n if (typeof document === 'undefined') return;\n const blob = new Blob([content], { type: mime });\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url; a.download = filename;\n document.body.appendChild(a); a.click(); document.body.removeChild(a);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output, ViewEncapsulation } from '@angular/core';\n\n/**\n * Paginatore dell'es-table2.\n *\n * Componente di sola presentazione: riceve lo stato di paginazione via input e\n * notifica le intenzioni dell'utente via output. Non conosce il concetto di\n * viewMode/arrayMode — la logica di applicazione vive nel componente padre.\n */\n@Component({\n selector: 'es-table2-pager',\n standalone: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./es-table2-pager.component.scss'],\n template: `\n <div class=\"est2-pager\" *ngIf=\"page() != null\">\n <div class=\"est2-pager__count\" *ngIf=\"showCount()\">\n {{ countLabel() || 'Elementi' }}: <strong>{{ total() }}</strong>\n </div>\n\n <div class=\"est2-pager__spacer\"></div>\n\n <label class=\"est2-pager__ipp\" *ngIf=\"showPagingOptions()\">\n <span>Per pagina</span>\n <select class=\"est2-pager__select\"\n [value]=\"itemsPerPage()\"\n (change)=\"onIppChange($event)\">\n @for (opt of ippOptions(); track opt) {\n <option [value]=\"opt\">{{ opt === allValue ? 'Tutti' : opt }}</option>\n }\n </select>\n </label>\n\n <div class=\"est2-pager__nav\" *ngIf=\"showButtons() && pages() > 1\">\n <button type=\"button\" class=\"est2-pager__btn est2-pager__btn--nav\"\n [disabled]=\"page()! <= 1\"\n (click)=\"goto(page()! - 1)\"\n aria-label=\"Pagina precedente\">\n <svg class=\"est2-pager__chev\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M15 5l-7 7 7 7\" />\n </svg>\n </button>\n\n @for (p of visiblePages(); track p.key) {\n @if (p.page === -1) {\n <span class=\"est2-pager__ellipsis\">…</span>\n } @else {\n <button type=\"button\"\n class=\"est2-pager__btn\"\n [class.est2-pager__btn--active]=\"p.page === page()\"\n (click)=\"goto(p.page)\">{{ p.page }}</button>\n }\n }\n\n <button type=\"button\" class=\"est2-pager__btn est2-pager__btn--nav\"\n [disabled]=\"page()! >= pages()\"\n (click)=\"goto(page()! + 1)\"\n aria-label=\"Pagina successiva\">\n <svg class=\"est2-pager__chev\" viewBox=\"0 0 24 24\" aria-hidden=\"true\">\n <path d=\"M9 5l7 7-7 7\" />\n </svg>\n </button>\n </div>\n </div>\n `\n})\nexport class EsTable2PagerComponent {\n /** Valore convenzionale di items-per-page che rappresenta \"Tutti\" */\n public readonly allValue = 999999;\n\n page = input<number | null>(1);\n pages = input<number>(1);\n total = input<number>(0);\n itemsPerPage = input<number>(15);\n countLabel = input<string>('');\n\n showCount = input<boolean>(true);\n showButtons = input<boolean>(true);\n showPagingOptions = input<boolean>(true);\n allowAll = input<boolean>(true);\n\n pageChange = output<number>();\n itemsPerPageChange = output<number>();\n\n /** Opzioni della select di items-per-page (con eventuale \"Tutti\") */\n ippOptions = computed(() => {\n const base = [15, 25, 50, 100];\n if (!base.includes(this.itemsPerPage()) && this.itemsPerPage() !== this.allValue)\n base.push(this.itemsPerPage());\n base.sort((a, b) => a - b);\n return this.allowAll() ? [...base, this.allValue] : base;\n });\n\n /** Finestra di pagine visibili con ellissi (1 … n-1 n n+1 … tot) */\n visiblePages = computed(() => {\n const current = this.page() ?? 1;\n const total = this.pages();\n const out: { key: string; page: number }[] = [];\n const add = (p: number) => out.push({ key: 'p' + p, page: p });\n const gap = (id: string) => out.push({ key: id, page: -1 });\n\n const window = new Set<number>([1, total, current - 1, current, current + 1]);\n let last = 0;\n for (let p = 1; p <= total; p++) {\n if (!window.has(p)) continue;\n if (p - last > 1) gap('g' + p);\n add(p);\n last = p;\n }\n return out;\n });\n\n goto(p: number) {\n if (p < 1 || p > this.pages() || p === this.page()) return;\n this.pageChange.emit(p);\n }\n\n onIppChange(ev: Event) {\n this.itemsPerPageChange.emit(+(ev.target as HTMLSelectElement).value);\n }\n}\n","// Angular\nimport {\n ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ContentChildren, ElementRef,\n EventEmitter, HostBinding, HostListener, Inject, Injector, Input, Optional, Output, QueryList, Self, signal, computed,\n linkedSignal, TemplateRef, Type, ViewEncapsulation, model, input, AfterContentInit, ViewChild, OnDestroy\n} from '@angular/core';\nimport { ControlValueAccessor, NgControl } from '@angular/forms';\nimport { Subscription } from 'rxjs';\n\n// Context menu (stessa integrazione dell'es-table originale)\nimport { ContextMenuComponent } from '@esfaenza/ngx-contextmenu';\n// Preferenze utente (persistenza server-side, stesso servizio/formato dell'es-table originale)\nimport { PreferencesService } from '@esfaenza/preferences';\n\n// Wire contracts — condivisi con l'es-table originale (stesso package/modulo)\nimport { AppSearch } from '../domain/externals/appsearch/AppSearch';\nimport { AppOrdering } from '../domain/externals/appsearch/AppOrdering';\nimport { ItemsSelection } from '../domain/externals/appsearch/ItemsSelection';\nimport { EsTableColumnsDefinition } from '../domain/externals/EsTableColumnsDefinition';\nimport { EsTableOperationDefinition } from '../domain/externals/EsTableOperationDefinition';\nimport { CornerMenuOption } from '../domain/externals/CornerMenuOption';\nimport { EsTableModelChange } from '../domain/externals/EsTableModelChange';\nimport { EsTableDefaultable } from '../domain/configuration/EsTableDefaultable';\n\n// Direttive di cella — RIUSATE dall'es-table originale (stessi selettori `*th`/`*td`/`*editor`)\nimport { EsThDirective } from '../directives/es_th.directive';\nimport { EsTdDirective } from '../directives/es_td.directive';\nimport { EsTdEditorDirective } from '../directives/es_td_editor.directive';\n// Provider esterno di celle (`td_th_provider`) — riusato dall'es-table originale\nimport { ThTdProvider } from '../directives/es_th_td_provider.directive';\n\n// Pipe (riusate per il testo di copia, dependency-free)\nimport { Est2FormatPipe } from './pipes/format.pipe';\nimport { Est2LookupPipe } from './pipes/lookup.pipe';\n\n// DI\nimport { EST2_DEBUG, EST2_DEFAULTS, EST2_EXPORT_GLOBAL_ACL } from './tokens2';\n\n// Raggruppamento client-side\nimport { Est2AggSpec, buildGroupedRows, formatAggValue } from './core/row-grouping';\n// Modalità gerarchica\nimport { assignHierarchyLevels, expandNode, collapseNode } from './core/hierarchy';\n// Coercizione valori (editing/paste) — motore puro\nimport { coerceValue as coerceValueFn } from './core/coercion';\n// Geometria header-group multi-livello — motore puro\nimport {\n Est2HeaderGroupCell, ancestorChain as ancestorChainFn, computeHeaderGroupRows,\n computeColumnGroupBoundaries, enforceGroupContiguity as enforceGroupContiguityFn\n} from './core/header-groups';\nexport { Est2HeaderGroupCell } from './core/header-groups';\n// Modello di colonna + factory — tipo puro (rompe la dipendenza circolare col motore colonne)\nimport { Est2Column } from './core/column-model';\nexport { Est2Column } from './core/column-model';\n// Costruttori di colonne — motore puro\nimport {\n MultiDef, mapDirectiveColumns, mapDynamicColumns, mapReportColumns,\n buildMultiColumns as buildMultiColumnsFn\n} from './core/columns';\n// Controller di esportazione (E4)\nimport { ExportController } from './controllers/export.controller';\n\n/**\n * Riga della tabella. Oltre ai dati aperti del consumer (index signature) porta\n * un insieme FISSO di flag interni iniettati da grouping/hierarchy/selezione. Tiparli\n * qui documenta il contratto in un unico posto e riduce la superficie di refuso.\n */\nexport interface Est2Row {\n [k: string]: any;\n /** selezione di riga */\n _selected?: boolean;\n /** riga-gruppo (intestazione di un raggruppamento) */\n _group?: boolean;\n /** riga-dato (foglia) */\n _item?: boolean;\n /** visibile (collasso gruppo / gerarchia) */\n _visible?: boolean;\n /** gruppo/nodo espanso */\n _expanded?: boolean;\n /** livello gerarchico (1-based) */\n _level?: number;\n /** profondità di annidamento gruppo (0-based) */\n _grouplevel?: number;\n /** aggregazioni per colonna → funzione → valore formattato */\n _agg?: Map<string, Map<string, string>>;\n /** chiave path del gruppo/item */\n _thisKey?: string;\n /** chiave del gruppo padre */\n _parent?: string | null;\n /** numero di sotto-gruppi */\n _groupscount?: number;\n /** riga separatore (consumer) */\n _sep?: boolean;\n /** gerarchia: il nodo ha figli */\n parent?: boolean;\n /** id per trackBy (consumer) */\n _hash?: any;\n /** oggetti \"generic\": bag delle proprietà */\n properties?: Record<string, any>;\n}\n\n// `Est2HeaderGroupCell` è definita nel motore puro `core/header-groups.ts` e\n// re-esportata sopra (retro-compatibile per chi la importa da questo modulo).\n\n/**\n * es-table2 — riscrittura 2026 dell'es-table.\n *\n * Mantiene la superficie pubblica (Input/Output/direttive `*th`/`*td`) dell'es-table\n * originale ma con implementazione basata su signal, control-flow moderno e un design\n * system a token (tema chiaro/scuro).\n *\n * FASE 1: modalità view/array, celle template + direttive, ordinamento, paginazione,\n * selezione singola/multipla. Le modalità avanzate (grouping, hierarchy, dynamic,\n * report, range-paste, export) sono dichiarate nella superficie ma verranno collegate\n * nelle fasi successive.\n */\n@Component({\n selector: 'es-table2',\n standalone: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrls: ['./es-table2.component.scss'],\n templateUrl: './es-table2.component.html'\n})\nexport class EsTable2Component implements ControlValueAccessor, AfterContentInit, OnDestroy {\n\n // ===========================================================================\n // Contenuto proiettato\n // ===========================================================================\n /** Modalità \"template semplice\": riga di `<th>` */\n @ContentChild('header', { static: false }) headerRef?: TemplateRef<any>;\n /** Modalità \"template semplice\": riga di `<td>` con `let-item` */\n @ContentChild('body', { static: false }) bodyRef?: TemplateRef<any>;\n\n @ContentChildren(EsThDirective) thDirectives?: QueryList<EsThDirective>;\n @ContentChildren(EsTdDirective) tdDirectives?: QueryList<EsTdDirective>;\n @ContentChildren(EsTdEditorDirective) editorDirectives?: QueryList<EsTdEditorDirective>;\n /** Provider `td_th_provider` annidati dentro `<es-table2>` */\n @ContentChildren(ThTdProvider) thTdProviders?: QueryList<ThTdProvider>;\n\n /** Context menu (ngx-contextmenu) collegato al click destro sulle righe */\n @Input() ContextMenu?: ContextMenuComponent;\n /** Menu vuoto di default, usato quando il consumer non fornisce un **ContextMenu** */\n @ViewChild('emptyMenu', { static: true }) tableEmptyMenu?: ContextMenuComponent;\n private ctxMenuSub?: Subscription;\n\n /** Altezza dell'header (misurata): la barra di selezione la usa per coprirlo esattamente */\n selbarHeight = signal(0);\n private headerEl?: HTMLElement;\n private headerRO?: ResizeObserver;\n /** ViewChild-setter: (ri)osserva l'header appena compare/cambia, mantenendo `selbarHeight` allineata */\n @ViewChild('theadRef') set theadRef(ref: ElementRef<HTMLElement> | undefined) {\n const el = ref?.nativeElement;\n if (el === this.headerEl) return;\n this.headerEl = el;\n this.headerRO?.disconnect();\n if (el && typeof ResizeObserver !== 'undefined') {\n this.headerRO = new ResizeObserver(() => {\n const h = el.offsetHeight;\n if (h && h !== this.selbarHeight()) { this.selbarHeight.set(h); this.cdr.markForCheck(); }\n });\n this.headerRO.observe(el);\n this.selbarHeight.set(el.offsetHeight);\n }\n }\n\n // ===========================================================================\n // Superficie pubblica — Input risolti (pattern _alias -> signal risolto)\n // ===========================================================================\n readonly _Selection = input<boolean | null>(null, { alias: 'Selection' });\n Selection = linkedSignal(() => this.io(this._Selection(), this.defaults?.Selection, false));\n SingleSelection = input<boolean>(false);\n SelectionDisabled = input<boolean>(false);\n readonly _SelectAll = input<boolean | null>(null, { alias: 'SelectAll' });\n SelectAll = linkedSignal(() => this.io(this._SelectAll(), null, false));\n /** @deprecated NO-OP di parità v1 (cache selezione cross-pagina): dichiarato per il drop-in, non usato */\n readonly _UseSelectionCache = input<boolean | null>(null, { alias: 'UseSelectionCache' });\n UseSelectionCache = linkedSignal(() => this.io(this._UseSelectionCache(), this.defaults?.UseSelectionCache, true));\n readonly _ShiftClick = input<boolean | null>(null, { alias: 'ShiftClick' });\n ShiftClick = linkedSignal(() => this.io(this._ShiftClick(), null, false));\n\n readonly _OrderByColumn = input<boolean | null>(null, { alias: 'OrderByColumn' });\n OrderByColumn = linkedSignal(() => this.io(this._OrderByColumn(), null, true));\n MultipleOrderingDirectives = input<boolean>(true);\n\n Removal = input<boolean>(false);\n RemovalCondition = input<string>('');\n @Input() RowClassAssigner?: (item: any) => string;\n\n readonly _HidePaging = input<boolean | null>(null, { alias: 'HidePaging' });\n HidePaging = linkedSignal(() => this.io(this._HidePaging(), this.defaults?.HidePaging, false));\n readonly _HidePagingCount = input<boolean | null>(null, { alias: 'HidePagingCount' });\n HidePagingCount = linkedSignal(() => this.io(this._HidePagingCount(), this.defaults?.HidePagingCount, false));\n readonly _HidePagingButtons = input<boolean | null>(null, { alias: 'HidePagingButtons' });\n HidePagingButtons = linkedSignal(() => this.io(this._HidePagingButtons(), this.defaults?.HidePagingButtons, false));\n readonly _AllSearch = input<boolean | null>(null, { alias: 'AllSearch' });\n AllSearch = linkedSignal(() => this.io(this._AllSearch(), this.defaults?.AllSearch, true));\n readonly _PagingStyle = input<'both' | 'top' | 'bottom' | null>(null, { alias: 'PagingStyle' });\n PagingStyle = linkedSignal(() => this.io(this._PagingStyle(), this.defaults?.PagingStyle, 'bottom'));\n // Read-write: `linkedSignal` risolve dall'input (reattivo) MA resta scrivibile\n // dal pager. L'override interno sopravvive finché l'input non cambia davvero.\n readonly _ArraymodeItemsPerPage = input<number | null>(null, { alias: 'ArraymodeItemsPerPage' });\n ArraymodeItemsPerPage = linkedSignal(() => this.io(this._ArraymodeItemsPerPage(), this.defaults?.ArraymodeItemsPerPage, 15));\n readonly _UseArrayModePaging = input<boolean | null>(true, { alias: 'UseArrayModePaging' });\n UseArrayModePaging = linkedSignal(() => this.io(this._UseArrayModePaging(), null, true));\n CountLabel = input<string>('');\n\n Height = input<string | undefined>(undefined);\n MaxHeight = input<number | undefined>(undefined);\n EmptySpaceBackgroundColor = input<string>('');\n HighCellDensity = input<boolean>(false);\n HeaderHidden = input<boolean>(false);\n BodyHidden = input<boolean>(false);\n ShowLoadingOnBootstrap = input<boolean>(false);\n readonly _DefaultAlignment = input<'Left' | 'Right' | 'Center' | null>(null, { alias: 'DefaultAlignment' });\n DefaultAlignment = linkedSignal(() => this.io(this._DefaultAlignment(), this.defaults?.DefaultAlignment, 'Left'));\n readonly _TableClass = input<string | null>(null, { alias: 'TableClass' });\n TableClass = linkedSignal(() => this.io(this._TableClass(), this.defaults?.TableClass, ''));\n readonly _ContainerClass = input<string | null>(null, { alias: 'ContainerClass' });\n ContainerClass = linkedSignal(() => this.io(this._ContainerClass(), this.defaults?.ContainerClass, ''));\n\n EsTableHandledSearch = input<boolean>(false);\n SearchThrottle = input<number>(50);\n\n /** Abilita il ridimensionamento via handle sul bordo destro dell'header delle colonne PINNATE\n * (la nuova larghezza è persistita nelle preferenze). Il resize delle colonne non pinnate\n * non è ancora portato. */\n readonly _ColumnsResizable = input<boolean | null>(null, { alias: 'ColumnsResizable' });\n ColumnsResizable = linkedSignal(() => this.io(this._ColumnsResizable(), this.defaults?.ColumnsResizable, false));\n readonly _ColumnsPinnable = input<boolean | null>(null, { alias: 'ColumnsPinnable' });\n ColumnsPinnable = linkedSignal(() => this.io(this._ColumnsPinnable(), this.defaults?.ColumnsPinnable, true));\n // Parità v1: se non valorizzati esplicitamente, `HiddenColumns`/`ColumnsOrdering`\n // (e la relativa voce di menu per gestire le colonne) sono ATTIVI di default sulle\n // tabelle a celle custom (direttive `*th`/`*td`). Un valore esplicito (anche `false`)\n // vince sempre. Vedi `es_table.component.ts` righe 625-626.\n readonly _HiddenColumns = input<boolean | null>(null, { alias: 'HiddenColumns' });\n HiddenColumns = linkedSignal(() => this.io(this._HiddenColumns(), null, this.directivesBased()));\n readonly _ColumnsOrdering = input<boolean | null>(null, { alias: 'ColumnsOrdering' });\n ColumnsOrdering = linkedSignal(() => this.io(this._ColumnsOrdering(), null, this.directivesBased()));\n readonly _Export = input<boolean | null>(null, { alias: 'Export' });\n Export = linkedSignal(() => this.io(this._Export(), this.defaults?.Export, false));\n XLSXExport = input<boolean>(true);\n CSVExport = input<boolean>(true);\n ExportFileName = input<string>('Export.csv');\n ExportOnlyVisibleColumns = input<boolean>(false);\n // Firma identica all'es-table1 (il terzo parametro `cancel` è opzionale e permette\n // al consumer di annullare l'export dopo un recupero dati fallito/abortito).\n @Input() ExportFunction?: (callback: (data: any[], type: Type<any>, cancel?: boolean) => void, format: 'CSV' | 'XLSX') => void;\n CornerMenuOptions = input<CornerMenuOption[]>([]);\n DynamicOperations = input<EsTableOperationDefinition[]>([]);\n readonly _DynamicRowColumnsDefinition = input<EsTableColumnsDefinition[] | null>(null, { alias: 'DynamicRowColumnsDefinition' });\n Hierarchy = input<boolean>(false);\n // Read-write: risolti dall'input ma scrivibili dall'auto-detect gerarchia\n readonly _ParentKey = input<string | null>('', { alias: 'ParentKey' });\n ParentKey = linkedSignal(() => this.io(this._ParentKey(), null, '') || '');\n readonly _OwnKey = input<string | null>('', { alias: 'OwnKey' });\n OwnKey = linkedSignal(() => this.io(this._OwnKey(), null, '') || '');\n readonly _AutoSortHierarchy = input<boolean | null>(null, { alias: 'AutoSortHierarchy' });\n AutoSortHierarchy = linkedSignal(() => this.io(this._AutoSortHierarchy(), null, false));\n StartsExpanded = input<boolean>(true);\n /** In modalità gerarchica: selezionando un nodo si selezionano tutti i discendenti, e un padre\n * risulta selezionato quando tutti i figli lo sono (indeterminato se solo alcuni). */\n CascadeSelection = input<boolean>(false);\n readonly _SavePreferences = input<boolean | null>(null, { alias: 'SavePreferences' });\n SavePreferences = linkedSignal(() => this.io(this._SavePreferences(), this.defaults?.SavePreferences, false));\n /** Nome della tabella: chiave per la persistenza delle preferenze colonne (localStorage) */\n Name = input<string>('');\n /** @deprecated NO-OP di parità v1 (stile paginazione gruppi): dichiarato per il drop-in, non risolto/usato */\n readonly _RowGroupingPagingStyle = input<'left' | 'right' | null>(null, { alias: 'RowGroupingPagingStyle' });\n readonly _ShowItemGroupsColumns = input<boolean | null>(null, { alias: 'ShowItemGroupsColumns' });\n Editable = input<boolean>(false);\n RangeSelection = input<boolean>(false);\n ItemSourceProperty = input<string>('');\n // --- Input di sola PARITÀ v1 (dichiarati per il drop-in, NON implementati) ----\n // Esistono solo perché un template consumer che li bind (`[HasHeaderGroup]`, …)\n // compili invariato passando da <es-table> a <es-table2>. Sono NO-OP volutamente:\n // · HasHeaderGroup/HasSecondaryHeaderGroup — header-group manuali via `#headerGroup`\n // (superati dall'approccio automatico `Parent:`/`Multi`).\n // · SearchView — drill-down gruppi server-side (intenzionalmente non portato).\n // · UseSelectionCache (175), RowGroupingPagingStyle (260) — vedi le rispettive\n // dichiarazioni. Rimuoverli romperebbe il drop-in.\n // (ColumnsResizable (224) NON è più un no-op: ridimensiona le colonne pinnate.)\n /** @deprecated NO-OP di parità v1 (header-group manuali, superati da `Parent:`/`Multi`) */\n HasHeaderGroup = input<boolean>(false);\n /** @deprecated NO-OP di parità v1 (seconda riga header-group manuale) */\n HasSecondaryHeaderGroup = input<boolean>(false);\n /** @deprecated NO-OP di parità v1 (drill-down gruppi server-side, non portato) */\n SearchView = input<AppSearch<any> | null>(null);\n /** Abilita il \"patacchino\" di auto-aggiornamento (toggle + intervallo) in alto a destra */\n readonly _AutoUpdate = input<boolean | null>(null, { alias: 'AutoUpdate' });\n AutoUpdate = linkedSignal(() => this.io(this._AutoUpdate(), this.defaults?.AutoUpdate, false));\n /** Provider esterno di `*th`/`*td` (pattern `td_th_provider`), passato per riferimento */\n @Input() EsThTdProvider?: ThTdProvider;\n\n // ===========================================================================\n // Superficie pubblica — Output\n // ===========================================================================\n @Output() onOrderChanged = new EventEmitter<AppOrdering>();\n @Output() onSearchRequest = new EventEmitter<boolean>();\n @Output() onSelectionChanged = new EventEmitter<ItemsSelection<any>>();\n @Output() onRemoval = new EventEmitter<any>();\n @Output() onAbortRemoval = new EventEmitter<any>();\n @Output() onModelChange = new EventEmitter<EsTableModelChange[]>();\n @Output() onOpenContextMenu = new EventEmitter<void>();\n @Output() onCornerAction = new EventEmitter<{ id: string; estable: any }>();\n @Output() onDynamicOperation = new EventEmitter<{ id: string; item: any }>();\n\n // --- Models (superficie parità) --------------------------------------------\n globalCheck = model(false);\n autoUpdate = model(false);\n seconds = model('10');\n researchInProgress = model(false);\n\n // ===========================================================================\n // Stato interno\n // ===========================================================================\n /** Locale usato dal renderer di default (undefined = locale del browser) */\n @Input() locale?: string;\n\n /** Modello bindato: AppSearch (viewMode) oppure any[] (arrayMode) */\n view = signal<any>(null);\n viewMode = signal(false);\n arrayMode = signal(false);\n firstBind = signal(true);\n\n /** Righe attualmente visualizzate (già paginate/ordinate) */\n boundSource = signal<Est2Row[]>([]);\n /** Colonne derivate dalle direttive `*th`/`*td` */\n columns = signal<Est2Column[]>([]);\n /** true se la tabella è pilotata dalle direttive (`*th`), false se template semplice */\n directivesBased = signal(false);\n /** true se è attivo il raggruppamento client-side (array mode con colonne `thGroup`) */\n grouped = signal(false);\n /** true se le colonne provengono da `DynamicRowColumnsDefinition` */\n dynamicMode = signal(false);\n /** true se il modello è una view report (`report_columns`) */\n reportMode = signal(false);\n /** Definizione colonne dinamica: risolta dall'input, ma scrivibile (auto-derivata dagli item generici) */\n DynamicRowColumnsDefinition = linkedSignal(() => this._DynamicRowColumnsDefinition());\n /** Se true mostra i valori delle colonne di gruppo anche nelle righe-oggetto */\n ShowItemGroupsColumns = linkedSignal(() => this.io(this._ShowItemGroupsColumns(), this.defaults?.ShowItemGroupsColumns, false));\n /** Mappa ownKey(string) -> figli diretti, per la modalità gerarchica */\n private hierChildren = new Map<string, any[]>();\n\n /** Paginazione arrayMode */\n private arrayPage = signal(1);\n\n /** Ordinamenti attivi (id -> 'ASC'|'DESC') */\n private orders = signal<AppOrdering[]>([]);\n\n /** Header-group: mappa id→direttiva th (inclusi i gruppi) e insieme degli id-gruppo */\n private hgThById = signal<Map<string, EsThDirective>>(new Map());\n private hgParentIds = signal<Set<string>>(new Set());\n /** Base (solo direttive) di hgThById/hgParentIds, per ri-espandere i Multi a ogni refresh */\n private baseThById = new Map<string, EsThDirective>();\n private baseParentIds = new Set<string>();\n\n /** Colonne derivate dalle direttive (senza le Multi, che dipendono dai dati) */\n private directiveColumns: Est2Column[] = [];\n /** Definizioni Multi da srotolare sui dati (`*th Multi:true`) */\n private multiDefs: MultiDef[] = [];\n /** true quando le colonne Multi sono state generate almeno una volta (per il gating delle prefs) */\n private multiColumnsBuilt = false;\n\n // ===========================================================================\n // Theme host bindings\n // ===========================================================================\n @HostBinding('class.est2') hostClass = true;\n @HostBinding('class.est2--dense') get denseClass() { return this.HighCellDensity(); }\n\n // ===========================================================================\n // Derived\n // ===========================================================================\n /** Colonne visibili, con le colonne pinnate spostate in testa (stabile) */\n visibleColumns = computed(() => {\n const vis = this.columns().filter(c => c.visible);\n if (!vis.some(c => c.pinned)) return vis;\n return [...vis.filter(c => c.pinned), ...vis.filter(c => !c.pinned)];\n });\n\n /** Numero di colonne pinnate visibili */\n pinnedCount = computed(() => this.visibleColumns().filter(c => c.pinned).length);\n /** true se c'è almeno una colonna pinnata */\n hasPinned = computed(() => this.pinnedCount() > 0);\n\n /** Larghezza (px) della colonna di selezione quando sticky */\n private readonly SEL_STICKY_W = 44;\n /** Larghezza (px) di default di una colonna pinnata senza `PinnedWidth` esplicito */\n private readonly PINNED_DEFAULT_W = 120;\n\n /**\n * Larghezza FISSA (px) di una colonna PINNATA (default direttiva). Una colonna sticky\n * è per contratto a larghezza fissa. Default = `PINNED_DEFAULT_W`.\n */\n pinnedWidthPx(col: Est2Column): number { return col.pinnedWidth || this.PINNED_DEFAULT_W; }\n\n /**\n * Larghezza EFFETTIVA (px) di una colonna, o `null` = auto. Priorità: larghezza da\n * resize (`col.width`) → larghezza fissa se pinnata → auto. Applicata a `<th>`/`<td>`\n * (width/min/max) così una colonna ridimensionata (pinnata o no) non sborda.\n */\n colWidthPx(col: Est2Column): number | null {\n if (col.width != null) return col.width;\n return col.pinned ? this.pinnedWidthPx(col) : null;\n }\n\n /**\n * Offset `left` (px) cumulativi delle colonne sticky, memoizzati: ricalcolati solo\n * quando cambiano `visibleColumns`/`Selection`/larghezze. Prima `pinnedLeftPx` era\n * O(n) per chiamata e veniva invocato per OGNI cella pinnata del corpo → O(P²·R).\n */\n pinnedOffsets = computed<number[]>(() => {\n const cols = this.visibleColumns();\n let left = this.Selection() ? this.SEL_STICKY_W : 0;\n return cols.map(c => { const at = left; if (c.pinned) left += this.colWidthPx(c)!; return at; });\n });\n\n /** Offset `left` (px) di una colonna sticky all'indice `ci` in visibleColumns */\n pinnedLeftPx(ci: number): number { return this.pinnedOffsets()[ci] ?? 0; }\n\n /** true se la tabella renderizza colonne strutturate (direttive/dinamica/report), non template semplici */\n usesColumns = computed(() => this.columns().length > 0);\n\n /**\n * Righe di header-group multi-livello (bottom-aligned). Delega al motore puro\n * `core/header-groups.ts`; ricalcolate automaticamente su riordino/visibilità.\n */\n headerGroupRows = computed<Est2HeaderGroupCell[][]>(() =>\n computeHeaderGroupRows(this.visibleColumns(), this.hgThById(), this.hgParentIds()));\n\n /** true se ci sono header-group da renderizzare */\n hasHeaderGroups = computed(() => this.headerGroupRows().length > 0);\n\n /**\n * Indici (in visibleColumns) delle colonne che aprono un nuovo gruppo-colonna.\n * Delega al motore puro; disegna i confini dei gruppi anche nel corpo tabella.\n */\n columnGroupBoundaries = computed<Set<number>>(() =>\n computeColumnGroupBoundaries(this.visibleColumns(), this.hgThById(), this.hgParentIds().size > 0));\n\n /** Numero di elementi totali (per il pager) */\n totalCount = computed(() => {\n const v = this.view();\n if (this.viewMode() && v) return v.objectcount ?? v.items?.length ?? 0;\n if (this.arrayMode() && Array.isArray(v)) return v.length;\n return 0;\n });\n\n /** Pagina corrente per il pager */\n currentPage = computed(() => this.viewMode() ? (this.view()?.page ?? 1) : this.arrayPage());\n\n /** Numero totale di pagine per il pager */\n totalPages = computed(() => {\n if (this.viewMode()) return this.view()?.pages ?? 1;\n const ipp = this.ArraymodeItemsPerPage();\n if (!ipp || ipp >= this.effectiveAllValue) return 1;\n return Math.max(1, Math.ceil(this.totalCount() / ipp));\n });\n\n private readonly effectiveAllValue = 999999;\n\n // ===========================================================================\n // CVA plumbing\n // ===========================================================================\n private onChange: (v: any) => void = () => {};\n private onTouched: () => void = () => {};\n\n constructor(\n @Self() @Optional() public ngControl: NgControl,\n public cdr: ChangeDetectorRef,\n private hostEl: ElementRef<HTMLElement>,\n @Optional() private prefService: PreferencesService,\n private injector: Injector,\n @Optional() @Inject(EST2_DEFAULTS) private defaults: EsTableDefaultable,\n @Optional() @Inject(EST2_DEBUG) public debugMode: boolean,\n @Optional() @Inject(EST2_EXPORT_GLOBAL_ACL) public exportGlobalAcl: string\n ) {\n if (ngControl) ngControl.valueAccessor = this;\n // Controller di export (E4): costruito con una interfaccia host STRETTA (accessor\n // lazy), non col back-ref completo. `injector` è già assegnato (parameter property).\n this.exportCtrl = new ExportController({\n injector: this.injector,\n visibleColumns: () => this.visibleColumns(),\n columns: () => this.columns(),\n boundSource: () => this.boundSource(),\n exportOnlyVisible: () => this.ExportOnlyVisibleColumns(),\n exportBaseName: () => this.ExportFileName(),\n dynamicDefs: () => this.DynamicRowColumnsDefinition(),\n exportFunction: () => this.ExportFunction,\n cellDisplayText: (item, col) => this.cellDisplayText(item, col),\n columnLabel: (col) => this.columnLabel(col),\n renderedHeaderTexts: () => this.renderedHeaderTexts(),\n flashNotice: (msg) => this.flashNotice(msg)\n });\n }\n\n /** Controller di esportazione (E4) — logica in `controllers/export.controller.ts` */\n private exportCtrl: ExportController;\n\n ngOnInit() {\n // Tutti gli input risolti sono ora `computed()`/`linkedSignal()` reattivi\n // (vedi dichiarazioni): niente più risoluzione one-shot qui.\n\n // Click destro: alla apertura del menu seleziono l'elemento (se non già selezionato)\n const menu = this.ContextMenu || this.tableEmptyMenu;\n if (menu)\n this.ctxMenuSub = menu.open.subscribe((e: any) => this.onContextMenuOpen(e?.item));\n }\n\n ngOnDestroy() {\n this.ctxMenuSub?.unsubscribe();\n this.headerRO?.disconnect();\n if (this.noticeTimer) clearTimeout(this.noticeTimer);\n if (this.searchCallTimeout) clearTimeout(this.searchCallTimeout);\n if (this.updateTimer) clearInterval(this.updateTimer);\n this.providerSubs.forEach(s => s.unsubscribe());\n }\n\n /** Risoluzione input: valore esplicito || default di progetto || hard default */\n private io<T>(v: T | null | undefined, d: T | null | undefined, hard: T): T {\n return (v !== null && v !== undefined) ? v : (d !== null && d !== undefined) ? d : hard;\n }\n\n ngAfterContentInit() {\n this.buildColumns();\n this.thDirectives?.changes.subscribe(() => { this.buildColumns(); this.refresh(); });\n this.tdDirectives?.changes.subscribe(() => { this.buildColumns(); this.refresh(); });\n this.wireProviders();\n this.thTdProviders?.changes.subscribe(() => this.wireProviders());\n }\n\n /** Provider `td_th_provider` attivi: quello passato via `[EsThTdProvider]` + quelli annidati */\n private collectProviders(): ThTdProvider[] {\n return [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.thTdProviders?.toArray() ?? [])];\n }\n\n private providerSubs: Subscription[] = [];\n /** (Ri)aggancia i provider: ricostruisce colonne quando caricano o cambiano i loro `*th`/`*td` */\n private wireProviders() {\n this.providerSubs.forEach(s => s.unsubscribe());\n this.providerSubs = [];\n for (const p of this.collectProviders()) {\n const rebuild = () => { this.buildColumns(); this.refresh(); };\n if (p.LoadedSignal) this.providerSubs.push(p.LoadedSignal.subscribe(rebuild));\n if (p.EsThsDirective) this.providerSubs.push(p.EsThsDirective.changes.subscribe(rebuild));\n if (p.EsTdsDirective) this.providerSubs.push(p.EsTdsDirective.changes.subscribe(rebuild));\n }\n this.buildColumns();\n this.refresh();\n }\n\n // ===========================================================================\n // ControlValueAccessor\n // ===========================================================================\n /** Timeout di debounce del writeValue in modalità EsTableHandledSearch */\n private searchCallTimeout: any = null;\n\n writeValue(obj: any, throttle: boolean = true): void {\n // Modalità EsTableHandledSearch: il writeValue viene debouncato (come l'originale),\n // così binding ravvicinati non generano ricerche a raffica.\n if (this.EsTableHandledSearch() && throttle) {\n if (this.searchCallTimeout) clearTimeout(this.searchCallTimeout);\n this.searchCallTimeout = setTimeout(() => this.writeValue(obj, false), this.SearchThrottle());\n return;\n }\n\n // È arrivato un nuovo modello → nessuna ricerca \"in progress\"\n this.researchInProgress.set(false);\n this.view.set(obj ?? null);\n this.detectMode(obj);\n this.syncOrdersFromView();\n this.refresh();\n if (obj) this.firstBind.set(false);\n this.cdr.markForCheck();\n\n // Auto-ricerca: la valorizzazione dell'ngModel chiede al consumer di cercare\n // (storicamente serviva ad applicare le preferenze colonne senza che il modello\n // in arrivo le sovrascrivesse). Il flag `selfsearch` evita loop; `firstsearch`\n // (true su `new AppSearch()`) salta l'auto-ricerca al primo bind.\n this.handleWriteValueAutoSearch();\n }\n registerOnChange(fn: (v: any) => void): void { this.onChange = fn; }\n registerOnTouched(fn: () => void): void { this.onTouched = fn; }\n setDisabledState?(): void { /* la tabella non ha uno stato disabled globale */ }\n\n /** Blocco auto-ricerca a fine writeValue (modalità EsTableHandledSearch) */\n private handleWriteValueAutoSearch() {\n if (!this.EsTableHandledSearch() || !this.view()) return;\n const v = this.view();\n if (!v.selfsearch && !v.firstsearch) {\n v.selfsearch = true;\n this.changed(true); // svuota gli items + propaga (mostra \"vuoto\" mentre cerca)\n this.onSearchRequest.emit(false);\n } else if (v.selfsearch) {\n v.selfsearch = false; // ricerca rientrata: azzero il guard\n this.changed();\n }\n }\n\n /**\n * Richiesta di ricerca (paging/ordinamento). In modalità EsTableHandledSearch\n * imposta il guard `selfsearch` così il writeValue di rientro non ri-cerca.\n */\n private emitSearchRequest(arg: boolean) {\n this.researchInProgress.set(true);\n const v = this.view();\n if (v && !v.selfsearch && this.EsTableHandledSearch()) {\n v.selfsearch = true;\n this.changed(true);\n this.onSearchRequest.emit(false);\n } else {\n this.onSearchRequest.emit(arg);\n }\n }\n\n // --- Auto-aggiornamento (polling) ------------------------------------------\n /** Interval attivo quando `autoUpdate` è on (in modalità `[AutoUpdate]`) */\n private updateTimer: any = null;\n /** (Ri)avvia/ferma il polling in base al toggle `autoUpdate` e a `seconds` */\n autoUpdateChanged() {\n if (this.updateTimer) { clearInterval(this.updateTimer); this.updateTimer = null; }\n if (!/^[1-9]\\d*$/.test(this.seconds())) this.seconds.set('10');\n if (this.autoUpdate())\n this.updateTimer = setInterval(() => this.emitSearchRequest(false), parseInt(this.seconds(), 10) * 1000);\n }\n\n private changed(clearItems: boolean = false) {\n if (clearItems && this.viewMode()) {\n const isp = this.ItemSourceProperty();\n const v = this.view();\n if (v) { if (!isp) (v as any).items = []; else (v as any)[isp] = []; }\n }\n this.onChange(this.view());\n }\n\n // ===========================================================================\n // Mode & column model\n // ===========================================================================\n private detectMode(obj: any) {\n const isSearch = obj instanceof AppSearch ||\n (obj && typeof obj === 'object' && typeof obj.itemsperpageoverride !== 'undefined' && !Array.isArray(obj));\n this.viewMode.set(!!isSearch);\n this.arrayMode.set(!isSearch && Array.isArray(obj));\n }\n\n private buildColumns() {\n // th/td diretti (proiettati) + quelli forniti dai provider `td_th_provider`\n const provs = this.collectProviders();\n const ths = [\n ...(this.thDirectives?.toArray() ?? []),\n ...provs.flatMap(p => p.EsThsDirective?.toArray() ?? [])\n ];\n const tds = [\n ...(this.tdDirectives?.toArray() ?? []),\n ...provs.flatMap(p => p.EsTdsDirective?.toArray() ?? [])\n ];\n this.directivesBased.set(ths.length > 0);\n if (ths.length === 0) {\n this.columns.set([]); this.directiveColumns = []; this.multiDefs = [];\n this.hgThById.set(new Map()); this.hgParentIds.set(new Set());\n this.baseThById = new Map(); this.baseParentIds = new Set();\n return;\n }\n\n const tdByCol = new Map<string, EsTdDirective>();\n for (const td of tds)\n if (!tdByCol.has(td.td)) tdByCol.set(td.td, td);\n\n // Colonne Multi (`*th Multi:true`): srotolate sui dati in resolveColumns()\n this.multiDefs = ths.filter(t => t.thMulti && t.thIf).map(t => ({ prop: t.th, th: t, td: tdByCol.get(t.th) }));\n this.multiColumnsBuilt = false;\n\n // Header groups multi-livello: un `*th` è un GRUPPO (non una colonna-dato) se\n // il suo id è referenziato da un altro `*th` come `Parent` (`thParent`).\n const parentIds = new Set<string>();\n for (const th of ths) if (th.thParent) parentIds.add(th.thParent);\n const thById = new Map<string, EsThDirective>();\n for (const th of ths) thById.set(th.th, th);\n this.baseThById = thById;\n this.baseParentIds = parentIds;\n this.hgThById.set(new Map(thById));\n this.hgParentIds.set(new Set(parentIds));\n\n const def = this.DefaultAlignment().toLowerCase() as 'left' | 'right' | 'center';\n // Mapping direttive → colonne delegato al motore puro `core/columns.ts`\n const cols = mapDirectiveColumns(ths, tdByCol, parentIds, def);\n this.directiveColumns = cols;\n this.setColumns(cols);\n }\n\n /**\n * Srotola le colonne `*th Multi:true` sui dati. Delega al motore puro\n * `core/columns.ts`; qui applico allo stato le mappe th/parent aggiornate.\n */\n private buildMultiColumns(items: any[]): Est2Column[] {\n const { columns, thById, parentIds } =\n buildMultiColumnsFn(this.multiDefs, this.baseThById, this.baseParentIds, items);\n this.hgThById.set(thById);\n this.hgParentIds.set(parentIds);\n this.multiColumnsBuilt = true;\n return columns;\n }\n\n /** Colonne dinamiche — delega al motore puro `core/columns.ts` */\n private buildDynamicColumns(defs: EsTableColumnsDefinition[]) {\n this.setColumns(mapDynamicColumns(defs, this.tdDirectives?.toArray() ?? []));\n }\n\n /** Colonne report — delega al motore puro `core/columns.ts` */\n private buildReportColumns(reportColumns: any[]) {\n this.setColumns(mapReportColumns(reportColumns));\n }\n\n /** Sceglie la sorgente delle colonne in base al modello: report → dinamica → direttive */\n private resolveColumns(items: any[]) {\n const v = this.view();\n if (this.viewMode() && v?.report_columns?.length) {\n this.reportMode.set(true);\n this.dynamicMode.set(false);\n this.buildReportColumns(v.report_columns);\n return;\n }\n this.reportMode.set(false);\n\n let defs = this.DynamicRowColumnsDefinition();\n const hasTh = (this.thDirectives?.length || 0) > 0;\n // Auto-derivazione da \"generic items\" (oggetti con bag `.properties`) se non ci sono direttive né definizioni\n if ((!defs || defs.length === 0) && !hasTh && items.length && items[0]?.properties) {\n defs = Object.keys(items[0].properties).map(k => new EsTableColumnsDefinition(k, k));\n this.DynamicRowColumnsDefinition.set(defs);\n }\n if (defs && defs.length > 0) {\n this.dynamicMode.set(true);\n this.buildDynamicColumns(defs);\n return;\n }\n this.dynamicMode.set(false);\n // Colonne da direttive (costruite in ngAfterContentInit). Se ci sono `*th Multi`\n // le srotolo sui dati correnti e le accodo alle colonne-direttiva.\n if (this.multiDefs.length && this.directiveColumns.length) {\n const multiCols = this.buildMultiColumns(items);\n this.setColumns([...this.directiveColumns, ...multiCols]);\n }\n }\n\n // ===========================================================================\n // Operazioni dinamiche (colonne-icona a sinistra)\n // ===========================================================================\n /** Visibilità di un'operazione su una riga (gate conditionField/conditionValue, case-insensitive) */\n operationVisible(op: EsTableOperationDefinition, item: any): boolean {\n if (!op.conditionField) return true;\n const src = item?.properties ?? item;\n const key = Object.keys(src ?? {}).find(k => k.toLowerCase() === op.conditionField!.toLowerCase());\n return key != null && String(src[key]) === String(op.conditionValue);\n }\n\n dynamicOperation(item: any, id: string) {\n this.onDynamicOperation.emit({ id, item });\n }\n\n // ===========================================================================\n // Valore/renderer di cella per modalità dinamica/report\n // ===========================================================================\n /** Valore di una cella report: `values[indice]` (fallback su accesso diretto) */\n reportCellValue(item: any, col: Est2Column): any {\n const idx = col.propAccessor as any;\n return item?.values ? item.values[idx] : item?.[idx];\n }\n\n /** Colore per-cella (fore/back) da `forecolors[i]`/`backcolors[i]`; vale sia report che dinamica */\n cellColor(item: any, col: Est2Column, kind: 'fore' | 'back'): string | null {\n if (col.colorIndex == null) return null;\n const arr = kind === 'fore' ? item?.forecolors : item?.backcolors;\n return arr ? (arr[col.colorIndex] || null) : null;\n }\n\n /** Valore report formattato (usa il formatter delle aggregazioni: F0-9 / small-long-verylong) */\n reportCellDisplay(item: any, col: Est2Column): string {\n const raw = this.reportCellValue(item, col);\n return formatAggValue(raw == null ? '' : String(raw), col.format || '', this.locale);\n }\n\n /** Costruisce il routerLink di una cella dinamica da `RoutePath` + `RouteParameterProperties` */\n routerLinkFor(item: any, col: Est2Column): any {\n let path = col.routePath || '';\n const pars = col.routeParams || [];\n const src = item?.properties ?? item;\n for (let i = 0; i < pars.length; i++) path = path.replace('{' + i + '}', src?.[pars[i]]);\n path = path.replace(/'/g, '\"').replace(/ /g, '');\n try { return JSON.parse(path); } catch { return path; }\n }\n\n // ===========================================================================\n // Refresh: ricostruisce boundSource in base a modalità/ordinamento/paginazione\n // ===========================================================================\n private refresh() {\n const v = this.view();\n if (!v) { this.boundSource.set([]); return; }\n\n // Determina la sorgente delle colonne (report / dinamica / direttive)\n const rawItems = this.viewMode()\n ? ((this.ItemSourceProperty() ? v[this.ItemSourceProperty()] : v.items) ?? [])\n : (Array.isArray(v) ? v : []);\n this.resolveColumns(rawItems);\n\n if (this.viewMode()) {\n // Il backend (consumer) fornisce già la pagina ordinata in v.items\n const items = rawItems;\n if (this.Hierarchy()) { this.grouped.set(false); this.boundSource.set(this.applyHierarchy(items, v.selection)); return; }\n this.applySelectionFlags(items, v.selection);\n this.boundSource.set(items);\n return;\n }\n\n if (this.arrayMode()) {\n let items = [...(this.view() as any[])];\n\n // Modalità gerarchica: albero padre/figlio (ignora paginazione)\n if (this.Hierarchy()) {\n this.grouped.set(false);\n this.boundSource.set(this.applyHierarchy(items, this.arraySelection));\n return;\n }\n\n // Raggruppamento client-side: se ci sono colonne `thGroup`, ignora la paginazione\n const groupCols = this.groupColumns();\n if (groupCols.length > 0) {\n this.grouped.set(true);\n const rows = buildGroupedRows(this.clientSort(items), groupCols, this.aggregationSpecs());\n this.applySelectionFlags(rows.filter(r => r._item), this.arraySelection);\n this.boundSource.set(rows);\n return;\n }\n this.grouped.set(false);\n\n items = this.clientSort(items);\n const ipp = this.ArraymodeItemsPerPage();\n if (this.UseArrayModePaging() && ipp && ipp < this.effectiveAllValue) {\n const page = Math.min(this.arrayPage(), Math.max(1, Math.ceil(items.length / ipp)));\n this.arrayPage.set(page);\n items = items.slice((page - 1) * ipp, page * ipp);\n }\n this.applySelectionFlags(items, this.arraySelection);\n this.boundSource.set(items);\n return;\n }\n\n this.boundSource.set([]);\n }\n\n /** Colonne chiave di raggruppamento, nell'ordine di dichiarazione */\n private groupColumns(): string[] {\n return this.columns().filter(c => c.isGroup).map(c => c.id);\n }\n\n /** Tutte le specifiche di aggregazione, appiattite su tutte le colonne */\n private aggregationSpecs(): Est2AggSpec[] {\n const specs: Est2AggSpec[] = [];\n for (const c of this.columns()) specs.push(...c.aggSpecs);\n return specs;\n }\n\n private clientSort(items: any[]): any[] {\n const ord = this.orders();\n if (ord.length === 0) return items;\n return items.sort((a, b) => {\n for (const o of ord) {\n const dir = o.order === 'DESC' ? -1 : 1;\n const av = a?.[o.id], bv = b?.[o.id];\n if (av == null && bv == null) continue;\n if (av == null) return -dir;\n if (bv == null) return dir;\n if (av < bv) return -dir;\n if (av > bv) return dir;\n }\n return 0;\n });\n }\n\n // ===========================================================================\n // Ordinamento\n // ===========================================================================\n orderOf(id: string): 'ASC' | 'DESC' | null {\n return this.orders().find(o => o.id === id)?.order ?? null;\n }\n orderIndex(id: string): number {\n const idx = this.orders().findIndex(o => o.id === id);\n return idx < 0 ? -1 : idx + 1;\n }\n\n toggleSort(col: Est2Column) {\n if (!this.OrderByColumn() || !col.orderable) return;\n\n const current = this.orderOf(col.id);\n const next: 'ASC' | 'DESC' | null = current === 'ASC' ? 'DESC' : current === 'DESC' ? null : 'ASC';\n\n let list = this.MultipleOrderingDirectives()\n ? this.orders().filter(o => o.id !== col.id)\n : [];\n if (next) list = [...list, new AppOrdering(col.id, next)];\n this.orders.set(list);\n\n if (this.viewMode()) {\n const v = this.view();\n v.orders = list;\n v.internalsearchrequest = true;\n this.onOrderChanged.emit(new AppOrdering(col.id, next ?? undefined));\n this.emitSearchRequest(false);\n } else {\n this.refresh();\n }\n if (this.SavePreferences()) this.saveColumnPrefs();\n this.cdr.markForCheck();\n }\n\n private syncOrdersFromView() {\n if (this.viewMode() && this.view()?.orders) this.orders.set([...this.view().orders]);\n }\n\n // ===========================================================================\n // Paginazione\n // ===========================================================================\n goToPage(p: number) {\n if (this.viewMode()) {\n const v = this.view();\n v.page = p;\n v.internalsearchrequest = true;\n this.emitSearchRequest(false);\n } else {\n this.arrayPage.set(p);\n this.refresh();\n }\n this.cdr.markForCheck();\n }\n\n changeItemsPerPage(n: number) {\n if (this.viewMode()) {\n const v = this.view();\n v.itemsperpageoverride = n;\n v.page = 1;\n v.internalsearchrequest = true;\n this.emitSearchRequest(false);\n } else {\n this.ArraymodeItemsPerPage.set(n);\n this.arrayPage.set(1);\n this.refresh();\n }\n this.cdr.markForCheck();\n }\n\n // ===========================================================================\n // Selezione (fase 1: pagina corrente; la cache cross-pagina arriva in fase 6)\n // ===========================================================================\n private arraySelection?: ItemsSelection<any>;\n /** Ancora per la selezione a range stile Windows (Shift+click) */\n private selectionAnchor: any = null;\n\n private currentSelection(): ItemsSelection<any> {\n if (this.viewMode()) {\n const v = this.view();\n if (!v.selection) v.selection = new ItemsSelection<any>([]);\n return v.selection;\n }\n if (!this.arraySelection) this.arraySelection = new ItemsSelection<any>([]);\n return this.arraySelection;\n }\n\n /** Righe realmente selezionabili: esclude le righe-gruppo quando il raggruppamento è attivo */\n private selectableRows(): any[] {\n const rows = this.boundSource();\n return this.grouped() ? rows.filter(r => r._item) : rows;\n }\n\n /**\n * Applica il flag _selected alle righe correnti in base allo stato di selezione.\n * In modalità **all** una riga è selezionata se NON è tra le esclusioni (vale anche\n * per le pagine non ancora visitate, dove tutte le righe risultano selezionate).\n */\n private applySelectionFlags(items: any[], sel?: ItemsSelection<any>) {\n if (!sel) { for (const it of items) it._selected = false; return; }\n for (const it of items)\n it._selected = sel.all ? !sel.exclusions.includes(it) : sel.items.includes(it);\n }\n\n /** Ricalcola il conteggio: in modalità **all** è (totale - esclusioni) */\n private refreshSelectionCount(sel: ItemsSelection<any>) {\n sel.count = sel.all ? Math.max(0, this.totalCount() - sel.exclusions.length) : sel.items.length;\n }\n\n /** Toggle della selezione di una singola riga (checkbox, click su riga o click destro) */\n toggleRow(item: any) {\n if (this.SelectionDisabled() || item?._sep) return;\n const sel = this.currentSelection();\n\n // Selezione in cascata (albero): propaga a discendenti e antenati\n if (this.Hierarchy() && this.CascadeSelection() && !this.SingleSelection()) {\n this.cascadeSelection(item, !item._selected);\n this.rebuildSelectionFromFlags(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n return;\n }\n\n if (this.SingleSelection()) {\n const wasSelected = item._selected;\n for (const it of this.selectableRows()) it._selected = false;\n sel.all = false; sel.exclusions = [];\n sel.items = wasSelected ? [] : [item];\n item._selected = !wasSelected;\n } else if (sel.all) {\n // \"Tutto selezionato\": deselezionare = aggiungere alle esclusioni\n item._selected = !item._selected;\n if (item._selected) sel.exclusions = sel.exclusions.filter(i => i !== item);\n else if (!sel.exclusions.includes(item)) sel.exclusions.push(item);\n } else {\n item._selected = !item._selected;\n if (item._selected) { if (!sel.items.includes(item)) sel.items.push(item); }\n else sel.items = sel.items.filter(i => i !== item);\n this.selectionAnchor = item;\n }\n\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /**\n * Checkbox globale in testata: seleziona/azzera la **pagina corrente**.\n * Per estendere la selezione a tutte le pagine si usa `selectEverything()`\n * (link mostrato nella barra di selezione).\n */\n toggleAll() {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n const pageFully = !sel.all && rows.length > 0 && rows.every(r => r._selected);\n\n if (sel.all || pageFully) {\n this.clearSelectionState(sel);\n } else {\n sel.all = false; sel.exclusions = [];\n sel.items = [...rows];\n for (const r of rows) r._selected = true;\n }\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /** Estende la selezione a TUTTI gli elementi, anche quelli delle altre pagine (`selection.all`) */\n selectEverything() {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const sel = this.currentSelection();\n sel.all = true; sel.items = []; sel.exclusions = [];\n for (const r of this.selectableRows()) r._selected = true;\n this.refreshSelectionCount(sel);\n this.globalCheck.set(true);\n this.emitSelection(sel);\n }\n\n /** Azzera completamente la selezione */\n clearSelection() {\n const sel = this.currentSelection();\n this.clearSelectionState(sel);\n this.refreshSelectionCount(sel);\n this.globalCheck.set(false);\n this.emitSelection(sel);\n }\n\n private clearSelectionState(sel: ItemsSelection<any>) {\n sel.all = false; sel.items = []; sel.exclusions = [];\n for (const r of this.selectableRows()) r._selected = false;\n }\n\n private syncGlobalCheck() {\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n this.globalCheck.set(sel.all ? sel.exclusions.length === 0 : (rows.length > 0 && rows.every(r => r._selected)));\n }\n\n private emitSelection(sel: ItemsSelection<any>) {\n // Una sola selezione alla volta: qualunque selezione di riga azzera il range di celle\n if (this.rangeSel()) this.rangeSel.set(null);\n this.onSelectionChanged.emit(sel);\n this.changed();\n this.cdr.markForCheck();\n }\n\n /** Click su una riga: espande/collassa un gruppo, oppure gestisce la selezione. */\n handleRowClick(item: any, event?: MouseEvent) {\n if (item?._group) { this.toggleGroup(item); return; }\n // In modalità range la selezione di riga avviene solo tramite le checkbox\n // (il click sulla cella pilota il range), così i due meccanismi non collidono.\n if (this.rangeActive()) return;\n if (!this.Selection()) return;\n if (this.SingleSelection()) { this.toggleRow(item); return; }\n\n // Selezione stile Windows (plain / Ctrl / Shift) quando ShiftClick è attivo\n if (this.ShiftClick() && !this.Hierarchy()) { this.windowsSelect(item, event); return; }\n\n // Comportamento classico: Ctrl+click lascia il default del browser (link, ecc.)\n if (event?.ctrlKey || event?.metaKey) return;\n this.toggleRow(item);\n }\n\n /** Selezione a click stile Esplora risorse: plain=solo questo, Ctrl=toggle, Shift=range dall'ancora */\n private windowsSelect(item: any, event?: MouseEvent) {\n if (this.SelectionDisabled() || item?._sep) return;\n const rows = this.selectableRows();\n const sel = this.currentSelection();\n const shift = !!event?.shiftKey;\n const ctrl = !!(event?.ctrlKey || event?.metaKey);\n\n // In modalità \"tutto selezionato\" (selectEverything → sel.all), un Ctrl+click\n // NON deve azzerare la selezione: deve solo togliere/rimettere la singola riga\n // dalle esclusioni, mantenendo sel.all. `toggleRow` gestisce già esattamente\n // questo caso (come fa la checkbox). Senza questo ramo, il reset di sel.all/\n // exclusions in coda a questa funzione collasserebbe la selezione a 0.\n if (sel.all && ctrl && !shift) { this.toggleRow(item); return; }\n\n if (shift && this.selectionAnchor != null && rows.indexOf(this.selectionAnchor) >= 0) {\n const a = rows.indexOf(this.selectionAnchor);\n const b = rows.indexOf(item);\n if (b >= 0) {\n const [lo, hi] = a <= b ? [a, b] : [b, a];\n if (!ctrl) { for (const r of rows) r._selected = false; sel.items = []; }\n for (let i = lo; i <= hi; i++) {\n rows[i]._selected = true;\n if (!sel.items.includes(rows[i])) sel.items.push(rows[i]);\n }\n // l'ancora resta invariata per estensioni successive\n }\n } else if (ctrl) {\n item._selected = !item._selected;\n if (item._selected) { if (!sel.items.includes(item)) sel.items.push(item); }\n else sel.items = sel.items.filter(i => i !== item);\n this.selectionAnchor = item;\n } else {\n // Re-click sull'unica riga selezionata => deseleziona; altrimenti seleziona solo questa\n const onlyThisSelected = item._selected && !sel.all && sel.items.length === 1 && sel.items[0] === item;\n for (const r of rows) r._selected = false;\n if (onlyThisSelected) {\n sel.items = [];\n this.selectionAnchor = null;\n } else {\n sel.items = [item];\n item._selected = true;\n this.selectionAnchor = item;\n }\n }\n\n sel.all = false;\n sel.exclusions = [];\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n // ===========================================================================\n // Fase 5 — Selezione a range (drag cella-per-cella), copia/incolla, editing\n //\n // Rispetto all'es-table originale (matrice `selectionStatus` con 8 flag di\n // bordo per cella, ricalcolata a ogni mousemove + subscription per-cella e\n // debounce anti-doppio-evento) qui il range è descritto da DUE sole\n // coordinate (ancora + fuoco); \"selezionata\"/bordi sono DERIVATI dal\n // rettangolo normalizzato. Gli eventi sono in delega sulla `<table>`\n // (un solo mousedown/mouseover/mouseup) e leggono `data-r`/`data-c` dal\n // `<td>`. Il \"debounce\" sparisce: `mouseover` aggiorna il fuoco solo se la\n // cella cambia davvero, quindi non ci sono doppie operazioni da smorzare.\n // ===========================================================================\n /** Pipe riusate per il testo di copia (dependency-free) */\n private fmt = new Est2FormatPipe();\n private lk = new Est2LookupPipe();\n\n /** Owner globale del range attivo: solo la tabella \"attiva\" reagisce a Ctrl+C/V */\n private static activeRangeOwner: EsTable2Component | null = null;\n\n /** Range di celle: ancora (a) + fuoco (f), indici in boundSource() / visibleColumns() */\n rangeSel = signal<{ a: { r: number; c: number }; f: { r: number; c: number } } | null>(null);\n /** true durante il trascinamento (per disabilitare la selezione testo via CSS) */\n rangeDragging = signal(false);\n\n /** Cella attualmente in editing (indici r/c) */\n editing = signal<{ r: number; c: number } | null>(null);\n /** Bozza del valore in editing */\n editDraft: any = '';\n\n /** true se la modalità range è realmente utilizzabile (colonne strutturate, no gruppi/gerarchia) */\n rangeActive = computed(() =>\n this.RangeSelection() && this.usesColumns() && !this.grouped() && !this.Hierarchy());\n\n /** Rettangolo normalizzato del range corrente (o null) */\n rangeRect = computed(() => {\n const s = this.rangeSel();\n if (!s) return null;\n return {\n top: Math.min(s.a.r, s.f.r), bottom: Math.max(s.a.r, s.f.r),\n left: Math.min(s.a.c, s.f.c), right: Math.max(s.a.c, s.f.c)\n };\n });\n\n /** true se la cella (r,c) è dentro il range */\n inRange(r: number, c: number): boolean {\n const rr = this.rangeRect();\n return !!rr && r >= rr.top && r <= rr.bottom && c >= rr.left && c <= rr.right;\n }\n\n /** Estrae gli indici r/c dal `<td data-r data-c>` più vicino al target */\n private cellCoords(target: EventTarget | null): { r: number; c: number } | null {\n const td = (target as HTMLElement | null)?.closest?.('td[data-r]') as HTMLElement | null;\n if (!td) return null;\n const r = parseInt(td.getAttribute('data-r') ?? '', 10);\n const c = parseInt(td.getAttribute('data-c') ?? '', 10);\n return isNaN(r) || isNaN(c) ? null : { r, c };\n }\n\n /** true se il mousedown corrente è un click sulla singola cella già selezionata\n * (→ un click senza trascinamento la deseleziona) */\n private rangeClickToggle = false;\n\n /** mousedown sulla griglia: apre un nuovo range sulla cella-ancora */\n onGridMouseDown(event: MouseEvent) {\n if (!this.rangeActive() || event.button !== 0 || this.editing()) return;\n const co = this.cellCoords(event.target);\n if (!co) return;\n EsTable2Component.activeRangeOwner = this;\n // Una sola selezione alla volta: avviare un range azzera l'eventuale selezione di riga\n if (this.hasSelection) this.clearSelection();\n // Se ri-clicco l'unica cella già selezionata (range 1×1 su questa cella), un\n // click senza drag la deseleziona (gestito nel mouseup).\n const prev = this.rangeSel();\n this.rangeClickToggle = !!prev &&\n prev.a.r === co.r && prev.a.c === co.c && prev.f.r === co.r && prev.f.c === co.c;\n this.rangeDragging.set(true);\n this.rangeSel.set({ a: co, f: co });\n this.clearTextSelection();\n this.cdr.markForCheck();\n }\n\n /** mouseover durante il drag: estende il range (solo se la cella cambia davvero) */\n onGridMouseOver(event: MouseEvent) {\n if (!this.rangeDragging() || !this.rangeActive()) return;\n if ((event.buttons & 1) === 0) { this.rangeDragging.set(false); return; } // tasto già rilasciato\n const s = this.rangeSel();\n const co = this.cellCoords(event.target);\n if (!s || !co) return;\n if (s.f.r === co.r && s.f.c === co.c) return; // nessun cambiamento → niente ricalcolo (no debounce necessario)\n this.rangeClickToggle = false; // è un drag, non un click di toggle\n this.rangeSel.set({ a: s.a, f: co });\n this.clearTextSelection();\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onDocMouseUp() {\n if (!this.rangeDragging()) return;\n this.rangeDragging.set(false);\n // click (nessun drag) sull'unica cella già selezionata → deseleziona\n if (this.rangeClickToggle) {\n this.rangeClickToggle = false;\n this.rangeSel.set(null);\n this.cdr.markForCheck();\n }\n }\n\n /** Avviso transitorio mostrato in un piccolo toast (es. incolla incompatibile) */\n notice = signal<string | null>(null);\n private noticeTimer: any = null;\n private flashNotice(msg: string) {\n this.notice.set(msg);\n this.cdr.markForCheck();\n if (this.noticeTimer) clearTimeout(this.noticeTimer);\n this.noticeTimer = setTimeout(() => { this.notice.set(null); this.cdr.markForCheck(); }, 4500);\n }\n\n private clearTextSelection() {\n const sel = typeof window !== 'undefined' ? window.getSelection?.() : null;\n if (sel && !sel.isCollapsed) sel.removeAllRanges();\n }\n\n // --- Copia / Incolla -------------------------------------------------------\n // Uso gli eventi nativi `copy`/`paste` (sincroni, dentro il gesto utente):\n // niente prompt di permessi né rifiuti silenziosi come con\n // navigator.clipboard.readText(), che in molti browser è bloccata.\n @HostListener('document:copy', ['$event'])\n onDocCopy(event: ClipboardEvent) {\n if (EsTable2Component.activeRangeOwner !== this || this.editing()) return;\n if (this.isFieldTarget(event.target)) return; // lascio la copia nativa nei campi\n const cells = this.rangeCells();\n if (!cells.length) return;\n const tsv = cells.map(row => row.map(({ item, col }) => this.cellDisplayText(item, col)).join('\\t')).join('\\n');\n event.clipboardData?.setData('text/plain', tsv);\n event.preventDefault();\n }\n\n @HostListener('document:paste', ['$event'])\n onDocPaste(event: ClipboardEvent) {\n if (EsTable2Component.activeRangeOwner !== this || this.editing() || !this.Editable()) return;\n if (this.isFieldTarget(event.target)) return; // lascio l'incolla nativo nei campi\n if (!this.rangeRect()) return;\n const text = event.clipboardData?.getData('text/plain') ?? '';\n event.preventDefault();\n this.applyPaste(text);\n }\n\n /** true se il target dell'evento è un campo di input (copia/incolla nativi) */\n private isFieldTarget(t: EventTarget | null): boolean {\n const tag = (t as HTMLElement | null)?.tagName;\n return tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT';\n }\n\n /** Celle (item+colonna) comprese nel rettangolo di selezione */\n private rangeCells(): { item: any; col: Est2Column }[][] {\n const rr = this.rangeRect();\n if (!rr) return [];\n const rows = this.boundSource();\n const cols = this.visibleColumns();\n const out: { item: any; col: Est2Column }[][] = [];\n for (let r = rr.top; r <= rr.bottom; r++) {\n const item = rows[r];\n if (!item) continue;\n const line: { item: any; col: Est2Column }[] = [];\n for (let c = rr.left; c <= rr.right; c++)\n if (cols[c]) line.push({ item, col: cols[c] });\n if (line.length) out.push(line);\n }\n return out;\n }\n\n private applyPaste(text: string) {\n if (text == null) return;\n const matrix = text.replace(/\\r/g, '').replace(/\\n$/, '').split('\\n').map(l => l.split('\\t'));\n const cells = this.rangeCells();\n if (!cells.length || !matrix.length) return;\n\n // Un singolo valore si applica all'intera selezione; altrimenti le dimensioni devono coincidere\n const single = matrix.length === 1 && matrix[0].length === 1;\n if (!single && (matrix.length !== cells.length || matrix[0].length !== cells[0].length)) {\n this.flashNotice(`Impossibile incollare: i dati (${matrix.length}×${matrix[0].length}) non corrispondono alla selezione (${cells.length}×${cells[0].length}).`);\n return;\n }\n\n // Pass 1 — convalido TUTTE le celle per tipo di colonna. Se anche una sola\n // è incompatibile, avviso e non applico NULLA (operazione atomica): meglio\n // un avviso chiaro che svuotare silenziosamente le celle.\n const coerced: any[][] = [];\n for (let r = 0; r < cells.length; r++) {\n coerced[r] = [];\n for (let c = 0; c < cells[r].length; c++) {\n const { col } = cells[r][c];\n const raw = single ? matrix[0][0] : matrix[r][c];\n const res = this.coerceValue(raw, col);\n if (!res.ok) {\n this.flashNotice(`Impossibile incollare: «${raw}» non è compatibile con la colonna «${col.headerText ?? col.id}» (tipo ${col.type ?? 'testo'}).`);\n return;\n }\n coerced[r][c] = res.value;\n }\n }\n\n // Pass 2 — applico i valori già convertiti\n const changes: EsTableModelChange[] = [];\n for (let r = 0; r < cells.length; r++)\n for (let c = 0; c < cells[r].length; c++) {\n const { item, col } = cells[r][c];\n const change = this.applyCoerced(item, col, coerced[r][c]);\n if (change) changes.push(change);\n }\n\n if (changes.length) { this.onModelChange.emit(changes); this.changed(); }\n this.cdr.markForCheck();\n }\n\n // --- Editing in cella ------------------------------------------------------\n /** Template di editor custom (`*editor`) per una colonna, se fornito dal consumer */\n editorFor(col: Est2Column): TemplateRef<any> | null {\n const eds = this.editorDirectives?.toArray() ?? [];\n const e = eds.find(x => (x.editor && x.editor === col.id) || (!!col.property && x.editorForProperty === col.property));\n return e?.Template ?? null;\n }\n\n /** Contesto passato ai template `*editor` custom */\n editorContext(item: any, col: Est2Column): any {\n return {\n $implicit: item,\n item, column: col,\n value: this.editDraft,\n setValue: (v: any) => { this.editDraft = v; },\n commit: () => this.commitEdit(item, col),\n cancel: () => this.cancelEdit()\n };\n }\n\n isEditing(r: number, c: number): boolean {\n const e = this.editing();\n return !!e && e.r === r && e.c === c;\n }\n\n /** Tipo dell'`<input>` di default in base al tipo di colonna */\n editorInputType(type: string | null): string {\n switch (type) {\n case 'number': case 'int': case 'float': case 'currency': return 'number';\n default: return 'text';\n }\n }\n\n onCellDblClick(item: any, col: Est2Column, r: number, c: number) {\n if (!this.Editable() || !col.property || item?._group) return;\n this.rangeSel.set(null);\n this.editDraft = this.rawCellValue(item, col) ?? '';\n this.editing.set({ r, c });\n this.cdr.markForCheck();\n requestAnimationFrame(() => {\n const el = this.hostEl?.nativeElement?.querySelector('.est2-editor-input') as HTMLElement | null;\n el?.focus();\n (el as HTMLInputElement)?.select?.();\n });\n }\n\n commitEdit(item: any, col: Est2Column) {\n if (!this.editing()) return; // già chiusa (es. blur dopo Enter/Escape)\n const res = this.coerceValue(this.editDraft, col);\n this.editing.set(null);\n if (!res.ok) {\n // valore incompatibile col tipo: avviso e NON modifico (nessun svuotamento)\n this.flashNotice(`Valore «${this.editDraft}» non valido per «${col.headerText ?? col.id}» (tipo ${col.type ?? 'testo'}).`);\n this.cdr.markForCheck();\n return;\n }\n const change = this.applyCoerced(item, col, res.value);\n if (change) { this.onModelChange.emit([change]); this.changed(); }\n this.cdr.markForCheck();\n }\n\n cancelEdit() {\n if (!this.editing()) return;\n this.editing.set(null);\n this.cdr.markForCheck();\n }\n\n // --- Valori: lettura/scrittura tipizzata + testo di copia ------------------\n /** Lettura bag-aware di una proprietà (gestisce gli oggetti \"generic\" con `properties`) */\n private readProp(item: any, key: string): any {\n return item?.properties ? item.properties[key] : item?.[key];\n }\n /** Scrittura bag-aware di una proprietà */\n private writeProp(item: any, key: string, v: any): void {\n if (item?.properties) item.properties[key] = v; else item[key] = v;\n }\n\n /** Valore grezzo su cui operano editing/paste (gestisce gli oggetti `properties`) */\n private rawCellValue(item: any, col: Est2Column): any {\n return col.property ? this.readProp(item, col.property) : null;\n }\n\n /** Scrive un valore GIÀ convertito e restituisce l'eventuale EsTableModelChange */\n private applyCoerced(item: any, col: Est2Column, niu: any): EsTableModelChange | null {\n if (!col.property) return null;\n const old = this.rawCellValue(item, col);\n if (old === niu) return null;\n this.writeProp(item, col.property, niu);\n return new EsTableModelChange(item, String(col.headerText ?? col.id), col.property, old as any, niu as any);\n }\n\n /** Coercizione valore → delega al motore puro `core/coercion.ts` */\n private coerceValue(raw: string, col: Est2Column): { ok: boolean; value: any } {\n return coerceValueFn(raw, col);\n }\n\n /** Testo visualizzato di una cella (usato dalla copia) */\n cellDisplayText(item: any, col: Est2Column): string {\n if (col.propAccessor != null) return this.reportCellDisplay(item, col);\n const val = this.cellValue(item, col);\n if (col.type === 'enum') return this.lk.transform(val, col.source).description;\n return this.fmt.transform(val, col.type, col.format, this.locale);\n }\n\n // ===========================================================================\n // Raggruppamento (array mode) — espansione/collasso e resa delle celle\n // ===========================================================================\n /** true se `childKey` è `ancestorKey` stesso o un suo discendente (senza collisioni di prefisso) */\n private isDescendantKey(childKey: string | null | undefined, ancestorKey: string): boolean {\n return !!childKey && (childKey === ancestorKey || childKey.startsWith(ancestorKey + '¦'));\n }\n\n /** Espande/collassa un gruppo agendo solo sui flag `_visible` (nessuna ricostruzione) */\n toggleGroup(group: any) {\n group._expanded = !group._expanded;\n const open = group._expanded;\n const key = group._thisKey;\n for (const r of this.boundSource()) {\n if (r === group) continue;\n // espandi: solo i figli immediati; collassa: l'intero sottoalbero\n const childGroup = r._group && (open ? r._parent === key : this.isDescendantKey(r._parent, key));\n const childItem = r._item && (open ? r._thisKey === key : this.isDescendantKey(r._thisKey, key));\n if (childGroup || childItem) {\n r._visible = open;\n if (r._group && !open) r._expanded = false; // ri-collassa i discendenti\n }\n }\n this.cdr.markForCheck();\n }\n\n /** Item (foglia) appartenenti a un gruppo, a qualsiasi profondità */\n private groupItems(group: any): any[] {\n return this.boundSource().filter(r => r._item && this.isDescendantKey(r._thisKey, group._thisKey));\n }\n\n /** Stato di selezione aggregato di un gruppo, per la sua checkbox */\n groupSelectionState(group: any): 'all' | 'some' | 'none' {\n const items = this.groupItems(group);\n if (items.length === 0) return 'none';\n const n = items.filter(it => it._selected).length;\n return n === 0 ? 'none' : n === items.length ? 'all' : 'some';\n }\n\n /** Seleziona/deseleziona tutti gli item di un gruppo */\n toggleGroupSelection(group: any) {\n if (this.SelectionDisabled() || this.SingleSelection()) return;\n const items = this.groupItems(group);\n const select = this.groupSelectionState(group) !== 'all';\n const sel = this.currentSelection();\n for (const it of items) {\n it._selected = select;\n if (sel.all) {\n if (select) sel.exclusions = sel.exclusions.filter(i => i !== it);\n else if (!sel.exclusions.includes(it)) sel.exclusions.push(it);\n } else {\n if (select) { if (!sel.items.includes(it)) sel.items.push(it); }\n else sel.items = sel.items.filter(i => i !== it);\n }\n }\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n\n /** Testo da mostrare nella cella `col` per una riga-gruppo */\n groupCellDisplay(group: any, col: Est2Column): string {\n if (group.column === col.id) {\n const gp = group._groupscount\n ? ` - ${group._groupscount} ${group._groupscount === 1 ? 'gruppo' : 'gruppi'}`\n : '';\n return `${group.value} (${group.count}${gp})`;\n }\n const colMap: Map<string, string> | undefined = group._agg?.get(col.id);\n if (!colMap || !col.header?.thAggregation) return '';\n let display = col.header.thAggregation;\n for (const spec of col.aggSpecs)\n display = display.replace(spec.match, formatAggValue(colMap.get(spec.func), spec.format, this.locale));\n return display;\n }\n\n /** true se la cella di una riga-oggetto va lasciata vuota (colonna di gruppo nascosta) */\n itemCellHidden(col: Est2Column): boolean {\n return this.grouped() && col.isGroup && !this.ShowItemGroupsColumns();\n }\n\n /** Indentazione (px) della cella-chiave in base al livello di gruppo */\n groupIndent(group: any): number {\n return (group?._grouplevel || 0) * 18;\n }\n\n // ===========================================================================\n // Modalità gerarchica (albero padre/figlio)\n // ===========================================================================\n /** Auto-rileva ownKey/parentKey ('id'/'parentid') se non specificati */\n private autoDetectHierarchyKeys(items: any[]) {\n if (!this.ParentKey() && !this.OwnKey() && items.length > 0) {\n if (items[0]['parentid'] !== undefined) this.ParentKey.set('parentid');\n if (items[0]['id'] !== undefined) this.OwnKey.set('id');\n }\n if (!this.OwnKey() || !this.ParentKey())\n console.error(\"[es-table2] La modalità gerarchica richiede sia OwnKey che ParentKey. Fallback a lista piatta.\");\n }\n\n /** Costruisce l'albero e applica la selezione; se mancano le chiavi torna la lista invariata */\n private applyHierarchy(items: any[], sel?: ItemsSelection<any>): any[] {\n this.autoDetectHierarchyKeys(items);\n if (!this.OwnKey() || !this.ParentKey()) { this.applySelectionFlags(items, sel); return items; }\n const ordered = assignHierarchyLevels(items, this.OwnKey(), this.ParentKey(), this.StartsExpanded(), this.AutoSortHierarchy());\n // mappa padre -> figli per lookup O(1) (cascade selection, indeterminate)\n this.hierChildren.clear();\n const pk = this.ParentKey();\n for (const r of ordered) {\n const pv = r[pk];\n if (pv === null || pv === undefined || pv === '') continue;\n const k = String(pv);\n const arr = this.hierChildren.get(k);\n if (arr) arr.push(r); else this.hierChildren.set(k, [r]);\n }\n this.applySelectionFlags(ordered, sel);\n return ordered;\n }\n\n private directChildren(item: any): any[] {\n return this.hierChildren.get(String(item[this.OwnKey()])) ?? [];\n }\n\n private hierDescendants(item: any): any[] {\n const out: any[] = [];\n const stack = [...this.directChildren(item)];\n while (stack.length) {\n const n = stack.pop();\n out.push(n);\n const kids = this.directChildren(n);\n if (kids.length) stack.push(...kids);\n }\n return out;\n }\n\n /** Selezione in cascata: propaga lo stato al sottoalbero e ricalcola gli antenati */\n private cascadeSelection(item: any, selected: boolean) {\n item._selected = selected;\n for (const d of this.hierDescendants(item)) d._selected = selected;\n // risali: un padre è selezionato sse tutti i figli lo sono\n const pk = this.ParentKey();\n let current = item;\n while (true) {\n const pv = current[pk];\n if (pv === null || pv === undefined || pv === '') break;\n const parent = this.boundSource().find(r => String(r[this.OwnKey()]) === String(pv));\n if (!parent) break;\n const kids = this.directChildren(parent);\n parent._selected = kids.length > 0 && kids.every(k => k._selected);\n current = parent;\n }\n }\n\n /** Ricostruisce ItemsSelection dai flag `_selected` correnti (usato dalla cascade) */\n private rebuildSelectionFromFlags(sel: ItemsSelection<any>) {\n sel.all = false;\n sel.exclusions = [];\n sel.items = this.boundSource().filter(r => r._selected);\n sel.count = sel.items.length;\n }\n\n /** Stato indeterminato di una riga-padre in cascade (alcuni discendenti selezionati) */\n hierarchyIndeterminate(item: any): boolean {\n if (!this.CascadeSelection() || !item?.parent || item._selected) return false;\n return this.hierDescendants(item).some(d => d._selected);\n }\n\n /** Espande/collassa un nodo dell'albero */\n toggleHierarchyNode(item: any) {\n if (!item?.parent) return;\n const rows = this.boundSource();\n if (item._expanded) collapseNode(rows, this.OwnKey(), this.ParentKey(), item[this.OwnKey()]);\n else expandNode(rows, this.OwnKey(), this.ParentKey(), item[this.OwnKey()]);\n this.cdr.markForCheck();\n }\n\n /** Indentazione (px) di una riga dell'albero in base al livello */\n hierarchyIndent(item: any): number {\n return ((item?._level || 1) - 1) * 20;\n }\n\n /** Apertura context menu: se la riga non è selezionata la seleziona (solo lei), poi notifica */\n private onContextMenuOpen(item: any) {\n // Il click destro apre il menu sulla riga: azzero l'eventuale range di celle\n // (la selezione a range e quella di riga sono meccanismi distinti)\n if (this.rangeSel()) { this.rangeSel.set(null); this.cdr.markForCheck(); }\n if (item && !item._sep && !item._group && !item._selected) {\n const sel = this.currentSelection();\n for (const r of this.selectableRows()) r._selected = false;\n sel.all = false; sel.exclusions = []; sel.items = [item];\n item._selected = true;\n this.refreshSelectionCount(sel);\n this.syncGlobalCheck();\n this.emitSelection(sel);\n }\n this.onOpenContextMenu.emit();\n }\n\n /** Indeterminato: alcune ma non tutte le righe selezionate (per la checkbox globale) */\n get selectionIndeterminate(): boolean {\n const sel = this.currentSelection();\n if (sel.all) return sel.exclusions.length > 0;\n const rows = this.selectableRows();\n const n = rows.filter(r => r._selected).length;\n return n > 0 && n < rows.length;\n }\n\n /** Numero di elementi selezionati (per la barra) */\n get selectedCount(): number { return this.currentSelection().count || 0; }\n\n /** true se c'è almeno un elemento selezionato (mostra la barra) */\n get hasSelection(): boolean {\n const sel = this.currentSelection();\n return sel.all || sel.items.length > 0;\n }\n\n /** true se sono selezionati TUTTI gli elementi (all senza esclusioni) */\n get allSelected(): boolean {\n const sel = this.currentSelection();\n return sel.all && sel.exclusions.length === 0;\n }\n\n /** true se ha senso proporre \"seleziona tutti\": pagina piena, non in all, e ci sono altre pagine */\n get canSelectEverything(): boolean {\n const sel = this.currentSelection();\n const rows = this.selectableRows();\n return !sel.all && rows.length > 0 && rows.every(r => r._selected) && this.totalCount() > rows.length;\n }\n\n // ===========================================================================\n // Rimozione\n // ===========================================================================\n canRemove(item: any): boolean {\n const cond = this.RemovalCondition();\n return cond ? !!item[cond] : true;\n }\n removeItem(item: any) { this.onRemoval.emit(item); }\n abortRemoval(item: any) { this.onAbortRemoval.emit(item); }\n\n // ===========================================================================\n // Fase 6 — Colonne (visibilità/ordine), preferenze, export\n // ===========================================================================\n /** Preferenze colonne in memoria (ordine + nascoste + pin + larghezze). Persistite se `SavePreferences`. */\n private columnPrefs: { order: string[]; hidden: string[]; pinned?: string[]; widths?: { [id: string]: number } } | null = null;\n\n /** Applica ordine + visibilità + pin + larghezze delle preferenze a una lista di colonne appena costruita */\n private setColumns(cols: Est2Column[]) {\n const p = this.columnPrefs;\n if (!p) { this.columns.set(cols); this.ensurePrefsLoaded(); return; }\n const byId = new Map(cols.map(c => [c.id, c] as const));\n const ordered: Est2Column[] = [];\n for (const id of p.order) { const c = byId.get(id); if (c) { ordered.push(c); byId.delete(id); } }\n for (const c of cols) if (byId.has(c.id)) ordered.push(c); // colonne nuove (non in prefs) in coda\n for (const c of ordered) {\n c.visible = !p.hidden.includes(c.id);\n // il pin salvato sovrascrive il default della direttiva (solo se presente nelle prefs)\n if (p.pinned) c.pinned = p.pinned.includes(c.id);\n // larghezza salvata (resize) → sovrascrive l'auto/pinnedWidth della direttiva\n if (p.widths && p.widths[c.id] != null) c.width = p.widths[c.id];\n }\n this.columns.set(ordered);\n this.ensurePrefsLoaded();\n }\n\n /** true una volta caricate le preferenze dal server (evita retrieve multipli) */\n private prefsLoaded = false;\n\n /**\n * Chiave di persistenza delle preferenze. Identica all'originale: il `name`\n * del controllo (ngModel/formControlName). In fallback usa `[Name]`.\n */\n private prefsKey(): string | null {\n const key = String(this.ngControl?.name ?? '') || this.Name() || null;\n if (!key && this.SavePreferences())\n console.error(\"[es-table2] Non posso usare le preferenze senza un 'name' (ngModel) o un [Name] per la tabella\");\n return key;\n }\n\n /**\n * Carica le preferenze dal `PreferencesService` (stesso formato dell'es-table\n * originale: `{ columns, column_ordering, orders }`). Chiamata una volta sola,\n * quando esistono già le colonne correnti per poter validare la coerenza.\n */\n private ensurePrefsLoaded() {\n if (this.prefsLoaded || !this.SavePreferences()) return;\n if (this.columns().length === 0) return; // attendo che le colonne esistano\n // Se ci sono colonne Multi (data-dependent), attendo che siano state generate:\n // altrimenti il guard di coerenza rifiuterebbe le prefs che le citano.\n if (this.multiDefs.length > 0 && !this.multiColumnsBuilt) return;\n const key = this.prefsKey();\n if (!key) { this.prefsLoaded = true; return; }\n if (!this.prefService) {\n console.error('[es-table2] SavePreferences attivo ma @esfaenza/preferences non è disponibile');\n this.prefsLoaded = true;\n return;\n }\n this.prefsLoaded = true;\n this.prefService.getItem<{ columns: string[]; column_ordering: string[]; orders: AppOrdering[]; pinned?: string[]; widths?: { [id: string]: number } }>(key, true)\n .subscribe(prefs => this.applyLoadedPrefs(prefs));\n }\n\n private applyLoadedPrefs(prefs: { columns: string[]; column_ordering: string[]; orders: AppOrdering[]; pinned?: string[]; widths?: { [id: string]: number } } | null | undefined) {\n if (!prefs) return;\n const currentIds = new Set(this.columns().map(c => c.id));\n const order = (prefs.column_ordering?.length ? prefs.column_ordering : prefs.columns) || [];\n const visible = prefs.columns || [];\n\n // Coerenza: se le preferenze citano colonne non più presenti, l'es-table è\n // cambiata → ignoro (come l'originale) per non nascondere/riordinare a vuoto.\n for (const id of order) if (id && !currentIds.has(id)) return;\n for (const id of visible) if (id && !currentIds.has(id)) return;\n if (order.length === 0 && visible.length === 0) return;\n\n // `pinned` è un'estensione retro-compatibile: se assente (prefs vecchie/originali)\n // resta il pin di default delle direttive.\n const pinned = Array.isArray(prefs.pinned) ? prefs.pinned.filter(id => currentIds.has(id)) : undefined;\n\n // Nascondo SOLO le colonne che le preferenze conoscevano davvero (presenti\n // nell'ordinamento o nell'elenco visibili) ma non marcate come visibili.\n // Una colonna del tutto assente dalle prefs è NUOVA (aggiunta dopo il\n // salvataggio): resta visibile — `setColumns` la accoda in fondo. Diversamente\n // dall'originale (che nascondeva ogni colonna non salvata), così gli utenti non\n // \"perdono\" le colonne aggiunte a una tabella con preferenze già memorizzate.\n const knownToPrefs = new Set([...order, ...visible]);\n const hidden = [...currentIds].filter(id => knownToPrefs.has(id) && !visible.includes(id));\n // `widths` (resize colonne pinnate): estensione retro-compatibile, filtrata sulle colonne presenti\n let widths: { [id: string]: number } | undefined;\n if (prefs.widths && typeof prefs.widths === 'object') {\n widths = {};\n for (const id of Object.keys(prefs.widths)) if (currentIds.has(id)) widths[id] = prefs.widths[id];\n }\n this.columnPrefs = { order, hidden, pinned, widths };\n this.setColumns(this.columns());\n\n if (prefs.orders?.length) {\n this.orders.set([...prefs.orders]);\n if (this.viewMode() && this.view()) this.view().orders = [...prefs.orders];\n }\n this.cdr.markForCheck();\n }\n\n /**\n * Persiste le preferenze correnti nel formato originale\n * `{ columns (visibili), column_ordering (ordine), orders (ordinamenti) }`.\n */\n private saveColumnPrefs() {\n if (!this.SavePreferences() || !this.prefService) return;\n const key = this.prefsKey();\n if (!key) return;\n // Includo anche le sotto-colonne Multi (id stabili `prop_index`): il\n // caricamento è gated finché non esistono, quindi il guard non le rifiuta.\n const cols = this.columns();\n // larghezze personalizzate (resize) di QUALSIASI colonna → { id: px }\n const widths: { [id: string]: number } = {};\n for (const c of cols) if (c.width != null) widths[c.id] = c.width;\n const payload = {\n columns: cols.filter(c => c.visible).map(c => c.id),\n column_ordering: cols.map(c => c.id),\n orders: this.orders(),\n // estensioni es-table2 (retro-compatibili: l'originale ignora i campi extra)\n pinned: cols.filter(c => c.pinned).map(c => c.id),\n widths\n };\n // allineo anche i campi wire dell'AppSearch (parità col server-side)\n if (this.viewMode() && this.view()) {\n this.view().columns = payload.columns;\n this.view().column_ordering = payload.column_ordering;\n }\n this.prefService.setItem(key, payload).subscribe();\n }\n\n // --- Pin/unpin dall'header --------------------------------------------------\n /** Attiva/disattiva il pin di una colonna e persiste (dall'indicatore in testata) */\n togglePin(col: Est2Column, ev?: Event) {\n ev?.stopPropagation();\n col.pinned = !col.pinned;\n // aggiorno le prefs correnti (ordine/visibilità invariati)\n const cols = this.columns();\n this.columnPrefs = {\n order: cols.map(c => c.id),\n hidden: cols.filter(c => !c.visible).map(c => c.id),\n pinned: cols.filter(c => c.pinned).map(c => c.id)\n };\n this.columns.set([...this.columns()]); // forza il ricalcolo di visibleColumns/headerGroupRows\n this.saveColumnPrefs();\n this.cdr.markForCheck();\n }\n\n // --- Dialog visibilità/ordine/pin colonne ----------------------------------\n columnsDialogOpen = signal(false);\n /** Lista di lavoro della dialog (copia, per poter annullare) */\n dialogCols = signal<{ id: string; label: string; visible: boolean; pinned: boolean; grouped: boolean }[]>([]);\n\n /** Etichetta leggibile di una colonna (header statico o id) */\n columnLabel(col: Est2Column): string {\n return (col.headerText && String(col.headerText).trim()) || col.id;\n }\n\n /** true se la colonna appartiene a un gruppo (multi o `Parent`): non è pinnabile */\n isGrouped(col: Est2Column): boolean {\n return !!this.hgThById().get(col.id)?.thParent;\n }\n\n /**\n * Etichetta della dialog: testo header renderizzato (letto dal DOM, così\n * rispetta casing/contenuto) preceduto dal percorso dei gruppi, es.\n * `( Energia - Attiva ) Fascia F1`.\n */\n private dialogLabelFor(col: Est2Column, headerTexts: Map<string, string>, groupLabels: Map<string, string>): string {\n const leaf = headerTexts.get(col.id) || this.columnLabel(col);\n const thById = this.hgThById();\n const path: string[] = [];\n let p = thById.get(col.id)?.thParent ?? null;\n let guard = 0;\n while (p && guard++ < 32) {\n path.push(groupLabels.get(p) || (thById.get(p)?.thStaticContent?.trim()) || p);\n p = thById.get(p)?.thParent ?? null;\n }\n path.reverse(); // root-first\n return path.length ? `( ${path.join(' - ')} ) ${leaf}` : leaf;\n }\n\n openColumnsDialog() {\n // Leggo dal DOM i testi header renderizzati (leaf + gruppi) per etichette esatte.\n const headerTexts = this.renderedHeaderTexts();\n const groupLabels = new Map<string, string>();\n const host = this.hostEl?.nativeElement;\n if (host)\n host.querySelectorAll('thead th[data-groupid]').forEach((el: Element) =>\n groupLabels.set(el.getAttribute('data-groupid') ?? '', (el.textContent || '').trim()));\n // TUTTE le colonne (comprese le Multi), con etichetta gruppo-consapevole.\n this.dialogCols.set(this.columns().map(c => ({\n id: c.id,\n label: this.dialogLabelFor(c, headerTexts, groupLabels),\n visible: c.visible,\n pinned: !!c.pinned,\n grouped: this.isGrouped(c)\n })));\n this.columnsDialogOpen.set(true);\n this.cdr.markForCheck();\n }\n closeColumnsDialog() { this.columnsDialogOpen.set(false); this.cdr.markForCheck(); }\n\n dialogToggle(i: number) {\n const list = [...this.dialogCols()];\n list[i] = { ...list[i], visible: !list[i].visible };\n this.dialogCols.set(list);\n }\n dialogTogglePin(i: number) {\n const list = [...this.dialogCols()];\n if (list[i].grouped) return; // le colonne raggruppate non sono pinnabili\n list[i] = { ...list[i], pinned: !list[i].pinned };\n this.dialogCols.set(list);\n }\n dialogSetAll(visible: boolean) {\n this.dialogCols.set(this.dialogCols().map(c => ({ ...c, visible })));\n }\n /**\n * Spostamento gruppo-consapevole nella dialog: i gruppi restano SEMPRE contigui\n * anche durante l'editing (non solo all'Applica). Se la colonna adiacente è nello\n * stesso gruppo → swap semplice (riordino interno); se è oltre il confine del\n * gruppo → si sposta l'INTERO blocco del gruppo (al livello di divergenza).\n */\n dialogMove(i: number, dir: -1 | 1) {\n const list = [...this.dialogCols()];\n const j = i + dir;\n if (j < 0 || j >= list.length) return;\n\n // Nessun gruppo: swap semplice\n if (this.hgParentIds().size === 0) {\n [list[i], list[j]] = [list[j], list[i]];\n this.dialogCols.set(list);\n return;\n }\n\n const chainA = this.columnChain(list[i].id);\n const chainB = this.columnChain(list[j].id);\n // livello dove le due catene divergono\n let d = 0;\n while (chainA[d] !== undefined && chainB[d] !== undefined && chainA[d] === chainB[d]) d++;\n\n const ancAt = (id: string, lvl: number): string | undefined => this.columnChain(id)[lvl];\n const blockAround = (idx: number): [number, number] => {\n const anc = ancAt(list[idx].id, d);\n if (anc === undefined) return [idx, idx]; // nessun gruppo a questo livello → singola colonna\n let s = idx, e = idx;\n while (s - 1 >= 0 && ancAt(list[s - 1].id, d) === anc) s--;\n while (e + 1 < list.length && ancAt(list[e + 1].id, d) === anc) e++;\n return [s, e];\n };\n\n const [aStart, aEnd] = blockAround(i);\n const [bStart, bEnd] = blockAround(j);\n // i due blocchi sono adiacenti: li scambio conservando tutto il resto\n const newList = dir === 1\n ? [...list.slice(0, aStart), ...list.slice(bStart, bEnd + 1), ...list.slice(aStart, aEnd + 1), ...list.slice(bEnd + 1)]\n : [...list.slice(0, bStart), ...list.slice(aStart, aEnd + 1), ...list.slice(bStart, bEnd + 1), ...list.slice(aEnd + 1)];\n this.dialogCols.set(newList);\n }\n\n // --- Riordino via drag-drop (gated da ColumnsOrdering) ---------------------\n /** Indice della riga trascinata (o null) */\n dragIndex = signal<number | null>(null);\n /** Indice della riga sotto il cursore durante il drag (per l'indicatore) */\n dragOverIndex = signal<number | null>(null);\n\n dialogDragStart(i: number, ev: DragEvent) {\n this.dragIndex.set(i);\n if (ev.dataTransfer) {\n ev.dataTransfer.effectAllowed = 'move';\n try { ev.dataTransfer.setData('text/plain', String(i)); } catch { /* alcuni browser */ }\n }\n this.cdr.markForCheck();\n }\n dialogDragOver(i: number, ev: DragEvent) {\n if (this.dragIndex() == null) return;\n ev.preventDefault(); // consente il drop\n if (ev.dataTransfer) ev.dataTransfer.dropEffect = 'move';\n if (this.dragOverIndex() !== i) { this.dragOverIndex.set(i); this.cdr.markForCheck(); }\n }\n dialogDrop(i: number, ev: DragEvent) {\n ev.preventDefault();\n const from = this.dragIndex();\n if (from != null && from !== i) this.dialogReorder(from, i);\n this.dialogDragEnd();\n }\n dialogDragEnd() {\n this.dragIndex.set(null);\n this.dragOverIndex.set(null);\n this.cdr.markForCheck();\n }\n\n /**\n * Sposta la riga `from` alla posizione `to`, poi RIPARA la contiguità dei gruppi\n * in tempo reale (come `dialogMove`): un drag che porterebbe una colonna fuori dal\n * suo gruppo la fa \"scattare\" nella posizione contigua più vicina, così la dialog\n * non mostra mai gruppi spezzati durante l'editing.\n */\n private dialogReorder(from: number, to: number) {\n const list = [...this.dialogCols()];\n if (from < 0 || to < 0 || from >= list.length || to >= list.length) return;\n const [moved] = list.splice(from, 1);\n list.splice(to, 0, moved);\n if (this.hgParentIds().size > 0) {\n const orderIds = this.enforceGroupContiguity(list.map(c => c.id));\n const byId = new Map(list.map(c => [c.id, c] as const));\n this.dialogCols.set(orderIds.map(id => byId.get(id)!));\n } else {\n this.dialogCols.set(list);\n }\n this.cdr.markForCheck();\n }\n\n applyColumnsDialog() {\n // Riparo l'ordine mantenendo CONTIGUI i membri di ogni gruppo: spostare una\n // colonna fuori dal suo gruppo non deve produrre header-group spezzati.\n const orderIds = this.enforceGroupContiguity(this.dialogCols().map(c => c.id));\n const hiddenSet = new Set(this.dialogCols().filter(c => !c.visible).map(c => c.id));\n const pinnedSet = new Set(this.dialogCols().filter(c => c.pinned).map(c => c.id));\n this.columnPrefs = {\n order: orderIds,\n hidden: [...hiddenSet],\n pinned: [...pinnedSet]\n };\n // riapplico alla lista corrente conservando gli oggetti-colonna...\n this.setColumns(this.columns());\n // ...e SOLO DOPO persisto (saveColumnPrefs deriva il payload da columns())\n this.saveColumnPrefs();\n this.columnsDialogOpen.set(false);\n this.cdr.markForCheck();\n }\n\n /**\n * Riordina gli id in modo che i membri di ogni gruppo-colonna restino contigui,\n * rispettando il più possibile l'ordine scelto dall'utente: ordina per chiave\n * = [prima-apparizione di ogni antenato (root→foglia), poi indice proprio].\n * Così due colonne dello stesso gruppo non possono essere interlacciate con\n * colonne esterne.\n */\n /** Catena degli antenati-gruppo (root→padre immediato) di una colonna; `[]` se non raggruppata */\n /** Catena antenati di una colonna — delega al motore `core/header-groups.ts` */\n private ancestorChain(id: string, rootFirst = false): string[] {\n return ancestorChainFn(id, this.hgThById(), rootFirst);\n }\n\n private columnChain(id: string): string[] { return this.ancestorChain(id, true); }\n\n /** Riordino group-contiguo — delega al motore `core/header-groups.ts` */\n private enforceGroupContiguity(orderIds: string[]): string[] {\n return enforceGroupContiguityFn(orderIds, this.hgThById(), this.hgParentIds().size > 0);\n }\n\n resetColumnsDialog() {\n this.columnPrefs = null;\n this.buildColumns(); // ricostruisce dalle direttive nell'ordine originale\n if (this.viewMode() || this.arrayMode()) this.refresh();\n this.saveColumnPrefs(); // persisto lo stato di default (dopo la ricostruzione)\n this.columnsDialogOpen.set(false);\n this.cdr.markForCheck();\n }\n\n // --- Export (CSV self-contained / XLSX via SheetJS opzionale) --------------\n exportMenuOpen = signal(false);\n cornerMenuOpen = signal(false);\n toggleExportMenu() { this.cornerMenuOpen.set(false); this.exportMenuOpen.set(!this.exportMenuOpen()); this.cdr.markForCheck(); }\n toggleCornerMenu() { this.exportMenuOpen.set(false); this.cornerMenuOpen.set(!this.cornerMenuOpen()); this.cdr.markForCheck(); }\n\n /** Chiude i menu a tendina del chrome quando si clicca fuori */\n @HostListener('document:click')\n onDocClick() {\n if (this.exportMenuOpen() || this.cornerMenuOpen()) {\n this.exportMenuOpen.set(false);\n this.cornerMenuOpen.set(false);\n this.cdr.markForCheck();\n }\n }\n\n /** Export delegato al controller `ExportController` (E4); chiude prima il menu chrome. */\n export(format: 'CSV' | 'XLSX' = 'CSV') {\n this.exportMenuOpen.set(false);\n this.exportCtrl.run(format);\n }\n\n /**\n * Mappa id-colonna → testo header RENDERIZZATO letto dal DOM (rispetta il casing\n * del template `*th`, es. \"ID\"). Costruita in un'unica passata; usata dall'export\n * self-contained e dalla dialog colonne (prima due letture DOM separate).\n */\n private renderedHeaderTexts(): Map<string, string> {\n const m = new Map<string, string>();\n const host = this.hostEl?.nativeElement;\n if (host) host.querySelectorAll('thead th[data-colid]').forEach((el: Element) =>\n m.set(el.getAttribute('data-colid') ?? '', (el.textContent || '').trim()));\n return m;\n }\n\n // ===========================================================================\n // Corner menu / helpers template\n // ===========================================================================\n cornerAction(id: string) { this.onCornerAction.emit({ id, estable: this }); }\n\n rowClass(item: any): string {\n return this.RowClassAssigner ? (this.RowClassAssigner(item) || '') : '';\n }\n\n hasChrome(): boolean {\n return this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions().length > 0;\n }\n\n /** Colspan totale per righe a piena larghezza (stato vuoto) */\n totalColspan(): number {\n let n = this.usesColumns() ? this.visibleColumns().length : 1;\n n += this.DynamicOperations().length;\n if (this.Selection()) n++;\n if (this.Removal()) n++;\n if (this.hasChrome()) n++;\n return Math.max(1, n);\n }\n\n /**\n * Valore grezzo di una proprietà, gestendo gli oggetti \"generic\" con `properties`.\n * Se la colonna non dichiara una `Property` esplicita si usa l'`id` del `*th` come\n * chiave (convenzione: l'id della colonna è il nome della proprietà) — così le\n * colonne rese solo via template `*td` (es. `*th='id'` senza `Property`) hanno\n * comunque un valore per export/copia. È un percorso di SOLA LETTURA: l'editing/\n * paste continua a richiedere una `Property` esplicita (vedi `rawCellValue`).\n */\n cellValue(item: any, col: Est2Column): any {\n const key = col.property || col.id;\n return key ? this.readProp(item, key) : null;\n }\n\n /** Entry Multi corrispondente a una cella (`item[multiProp][multiIndex]`) */\n multiCell(item: any, col: Est2Column): any {\n if (col.multiProp == null || col.multiIndex == null) return {};\n const arr = item?.[col.multiProp];\n return (Array.isArray(arr) ? arr[col.multiIndex] : null) ?? {};\n }\n\n /**\n * Tooltip \"smart\" al passaggio del mouse: mostra il testo REALMENTE renderizzato\n * della cella (qualunque sia il `*td`) SOLO se è troncato. Legge `el.textContent`\n * anziché `cellDisplayText`, che conosce solo `property`/`id` e non il contenuto di\n * un template custom (era il bug del tooltip che mostrava sempre l'id colonna).\n */\n onCellHover(ev: MouseEvent) {\n const el = ev.currentTarget as HTMLElement | null;\n if (!el) return;\n if (el.scrollWidth > el.clientWidth + 1) {\n const txt = (el.textContent || '').trim();\n if (txt) el.setAttribute('title', txt); else el.removeAttribute('title');\n } else {\n el.removeAttribute('title');\n }\n }\n\n // --- Ridimensionamento colonne ---------------------------------------------\n // L'handle è mostrato quando `col.pinned || ColumnsResizable()`: le colonne PINNATE\n // sono SEMPRE ridimensionabili (sono a larghezza fissa per contratto); `[Columns\n // Resizable]` estende il resize a QUALSIASI colonna. La larghezza va in `col.width`.\n /** Larghezza minima (px) di una colonna durante il resize */\n private readonly COL_MIN_W = 48;\n /** Stato del resize in corso (colonna + coordinate iniziali) */\n private resizing: { col: Est2Column; startX: number; startW: number } | null = null;\n\n /** mousedown sull'handle: avvia il ridimensionamento della colonna */\n startColumnResize(col: Est2Column, ev: MouseEvent) {\n ev.preventDefault();\n ev.stopPropagation(); // non deve innescare l'ordinamento sull'header\n // larghezza di partenza: quella impostata, o quella pinnata, o — per una colonna\n // auto non ancora ridimensionata — la larghezza REALE corrente letta dal `<th>`.\n const th = (ev.target as HTMLElement | null)?.closest('th') as HTMLElement | null;\n const startW = this.colWidthPx(col) ?? Math.round(th?.getBoundingClientRect().width || this.PINNED_DEFAULT_W);\n this.resizing = { col, startX: ev.clientX, startW };\n document.body.style.userSelect = 'none';\n document.body.style.cursor = 'col-resize';\n }\n\n @HostListener('document:mousemove', ['$event'])\n onResizeMove(ev: MouseEvent) {\n if (!this.resizing) return;\n this.resizing.col.width = Math.max(this.COL_MIN_W, Math.round(this.resizing.startW + (ev.clientX - this.resizing.startX)));\n this.columns.set([...this.columns()]); // forza il ricalcolo di pinnedOffsets/visibleColumns\n this.cdr.markForCheck();\n }\n\n @HostListener('document:mouseup')\n onResizeEnd() {\n if (!this.resizing) return;\n this.resizing = null;\n document.body.style.userSelect = '';\n document.body.style.cursor = '';\n // persisto la nuova larghezza nelle preferenze (colonna → px)\n this.persistColumnWidths();\n }\n\n /** Aggiorna `columnPrefs.widths` dalle larghezze impostate (qualsiasi colonna) e salva */\n private persistColumnWidths() {\n const cols = this.columns();\n const widths: { [id: string]: number } = {};\n for (const c of cols) if (c.width != null) widths[c.id] = c.width;\n this.columnPrefs = {\n order: cols.map(c => c.id),\n hidden: cols.filter(c => !c.visible).map(c => c.id),\n pinned: cols.filter(c => c.pinned).map(c => c.id),\n widths\n };\n this.saveColumnPrefs();\n }\n\n trackRow = (i: number, item: any) => item?._hash ?? item?.id ?? item;\n trackCol = (_: number, col: Est2Column) => col.id;\n}\n","@if (view()) {\n <div class=\"est2-wrap {{ ContainerClass() }}\"\n [style.height]=\"Height()\"\n [style.background-color]=\"EmptySpaceBackgroundColor() || null\">\n\n <!-- Auto-aggiornamento: toggle + intervallo (in alto a destra) -->\n @if (AutoUpdate()) {\n <div class=\"est2-autoupdate\">\n <label class=\"est2-autoupdate__label\">\n Aggiorna ogni\n <input type=\"text\" maxlength=\"3\" class=\"est2-autoupdate__secs\"\n [ngModel]=\"seconds()\" (ngModelChange)=\"seconds.set($event)\"\n [ngModelOptions]=\"{ standalone: true }\"\n (change)=\"autoUpdateChanged()\" />\n secondi\n </label>\n <label class=\"est2-switch\" title=\"Attiva/disattiva auto-aggiornamento\">\n <input type=\"checkbox\" [ngModel]=\"autoUpdate()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"autoUpdate.set($event); autoUpdateChanged()\" />\n <span class=\"est2-switch__slider\"></span>\n </label>\n </div>\n }\n\n <!-- Pager superiore -->\n @if (PagingStyle() === 'both' || PagingStyle() === 'top') {\n <ng-container *ngTemplateOutlet=\"pager\"></ng-container>\n }\n\n <!-- Barra \"seleziona tutto\" (visibile solo con selezione multipla attiva e righe presenti) -->\n @if (Selection() && !SingleSelection() && hasSelection) {\n <div class=\"est2-selectbar\" [style.height.px]=\"selbarHeight() ? selbarHeight() + 1 : null\">\n @if (allSelected) {\n <span>Tutti i <strong>{{ selectedCount }}</strong> elementi sono selezionati</span>\n } @else {\n <span><strong>{{ selectedCount }}</strong> {{ selectedCount === 1 ? 'elemento selezionato' : 'elementi selezionati' }}</span>\n @if (canSelectEverything) {\n <span class=\"est2-link\" (click)=\"selectEverything()\">Seleziona tutti i {{ totalCount() }} elementi</span>\n }\n }\n <span class=\"est2-selectbar__spacer\"></span>\n <span class=\"est2-link\" (click)=\"clearSelection()\">Azzera selezione</span>\n </div>\n }\n\n <div class=\"est2-scroll\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"est2-table {{ TableClass() }}\"\n [class.est2-table--range]=\"rangeActive()\"\n [class.est2-table--dragging]=\"rangeDragging()\"\n (mousedown)=\"onGridMouseDown($event)\"\n (mouseover)=\"onGridMouseOver($event)\">\n\n <!-- ================= HEADER ================= -->\n @if (!HeaderHidden()) {\n <thead #theadRef>\n <!-- Righe di header-group multi-livello (dall'alto verso il basso) -->\n @if (hasHeaderGroups()) {\n @for (grow of headerGroupRows(); track $index) {\n <tr class=\"est2-hgroup-row\">\n @if (Selection()) { <th class=\"est2-col-min est2-selcol\" [class.est2-pinned]=\"hasPinned()\" [style.left.px]=\"hasPinned() ? 0 : null\"></th> }\n @for (op of DynamicOperations(); track op.id) { <th class=\"est2-col-min\"></th> }\n @for (cell of grow; track cell.id; let gi = $index) {\n <th [attr.colspan]=\"cell.span\"\n [attr.data-groupid]=\"cell.isGroup ? cell.id : null\"\n [class.est2-hgroup]=\"cell.isGroup\"\n [class.est2-pinned]=\"gi < pinnedCount()\"\n [style.left.px]=\"gi < pinnedCount() ? pinnedLeftPx(gi) : null\"\n class=\"est2-hgroup-cell\">\n @if (cell.isGroup) {\n @if (cell.template) {\n <ng-container *ngTemplateOutlet=\"cell.template\"></ng-container>\n } @else {\n {{ cell.label }}\n }\n }\n </th>\n }\n @if (Removal()) { <th class=\"est2-col-min\"></th> }\n @if (hasChrome()) { <th class=\"est2-col-min\"></th> }\n </tr>\n }\n }\n <tr>\n <!-- Colonna di selezione -->\n @if (Selection()) {\n <th class=\"est2-col-min est2-selcol\"\n [class.est2-pinned]=\"hasPinned()\"\n [style.left.px]=\"hasPinned() ? 0 : null\">\n @if (!SingleSelection()) {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"globalCheck()\"\n [indeterminate]=\"selectionIndeterminate\"\n [disabled]=\"SelectionDisabled()\"\n (change)=\"toggleAll()\"\n aria-label=\"Seleziona tutto\" />\n }\n </th>\n }\n\n <!-- Header da colonne (direttive / dinamica / report) -->\n @if (usesColumns()) {\n <!-- intestazioni vuote per le operazioni dinamiche -->\n @for (op of DynamicOperations(); track op.id) {\n <th class=\"est2-col-min\"></th>\n }\n @for (col of visibleColumns(); track trackCol($index, col); let ci = $index) {\n <th [attr.data-colid]=\"col.id\"\n [class]=\"col.headerClass\"\n [class.est2-th--orderable]=\"OrderByColumn() && col.orderable\"\n [class.est2-col-min]=\"col.header?.thShrink\"\n [class.est2-col-groupstart]=\"columnGroupBoundaries().has(ci)\"\n [class.est2-pinned]=\"col.pinned\"\n [style.left.px]=\"col.pinned ? pinnedLeftPx(ci) : null\"\n [style.width.px]=\"colWidthPx(col)\"\n [style.min-width.px]=\"colWidthPx(col)\"\n [style.max-width.px]=\"colWidthPx(col)\"\n [style.text-align]=\"col.alignment\"\n [style.background-color]=\"col.headerBg || null\"\n (click)=\"toggleSort(col)\">\n <span class=\"est2-th__inner\">\n @if (col.header?.Template) {\n <ng-container *ngTemplateOutlet=\"col.header!.Template!; context: col.multiProp != null ? { $implicit: col.headerText } : null\"></ng-container>\n } @else {\n {{ col.headerText }}\n }\n @if (OrderByColumn() && col.orderable && orderOf(col.id)) {\n <span class=\"est2-sort est2-sort--active\"\n [class.est2-sort--desc]=\"orderOf(col.id) === 'DESC'\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M6 15l6-6 6 6\"/></svg>\n </span>\n @if (orderIndex(col.id) > 0 && MultipleOrderingDirectives()) {\n <span class=\"est2-sort__badge\">{{ orderIndex(col.id) }}</span>\n }\n }\n <!-- Indicatore/toggle di pin (visibile se pinnata o all'hover) -->\n @if (ColumnsPinnable() && col.multiProp == null) {\n <button type=\"button\" class=\"est2-pinbtn\"\n [class.est2-pinbtn--on]=\"col.pinned\"\n [title]=\"col.pinned ? 'Sblocca colonna' : 'Blocca colonna a sinistra'\"\n (click)=\"togglePin(col, $event)\">\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>\n </button>\n }\n </span>\n <!-- Handle di ridimensionamento (colonne pinnate, gated da ColumnsResizable) -->\n @if (col.pinned || ColumnsResizable()) {\n <span class=\"est2-resize-handle\" title=\"Trascina per ridimensionare\"\n (mousedown)=\"startColumnResize(col, $event)\"\n (click)=\"$event.stopPropagation()\"></span>\n }\n </th>\n }\n }\n <!-- Header da template semplice -->\n @else if (headerRef) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n\n <!-- Colonna rimozione -->\n @if (Removal()) { <th class=\"est2-col-min\"></th> }\n <!-- Colonna chrome (export / gestione colonne / menu) -->\n @if (hasChrome()) {\n <th class=\"est2-col-min est2-chrome-th\">\n <div class=\"est2-chrome\">\n @if (Export()) {\n <div class=\"est2-chrome-wrap\">\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Esporta\" (click)=\"$event.stopPropagation(); toggleExportMenu()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\"/><path d=\"M7 10l5 5 5-5\"/><path d=\"M12 15V3\"/></svg>\n </button>\n @if (exportMenuOpen()) {\n <div class=\"est2-menu\" (click)=\"$event.stopPropagation()\">\n @if (CSVExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('CSV')\">Esporta CSV</button> }\n @if (XLSXExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('XLSX')\">Esporta Excel (XLSX)</button> }\n @if (!CSVExport() && !XLSXExport()) { <button type=\"button\" class=\"est2-menu-item\" (click)=\"export('CSV')\">Esporta CSV</button> }\n </div>\n }\n </div>\n }\n @if (HiddenColumns() || ColumnsOrdering()) {\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Colonne\" (click)=\"$event.stopPropagation(); openColumnsDialog()\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"1\"/><path d=\"M9 3v18\"/><path d=\"M15 3v18\"/></svg>\n </button>\n }\n @if (CornerMenuOptions().length > 0) {\n <div class=\"est2-chrome-wrap\">\n <button type=\"button\" class=\"est2-chrome-btn\" title=\"Opzioni\" (click)=\"$event.stopPropagation(); toggleCornerMenu()\">⋮</button>\n @if (cornerMenuOpen()) {\n <div class=\"est2-menu\" (click)=\"$event.stopPropagation()\">\n @for (opt of CornerMenuOptions(); track opt.id) {\n <button type=\"button\" class=\"est2-menu-item\" (click)=\"cornerAction(opt.id); cornerMenuOpen.set(false)\">{{ opt.description }}</button>\n }\n </div>\n }\n </div>\n }\n </div>\n </th>\n }\n </tr>\n </thead>\n }\n\n <!-- ================= BODY ================= -->\n @if (!BodyHidden()) {\n <tbody>\n @for (item of boundSource(); track trackRow($index, item); let ri = $index) {\n @if ((!grouped() && !Hierarchy()) || item._visible) {\n <tr [class]=\"rowClass(item)\"\n [class.est2-row--selected]=\"item._selected\"\n [class.est2-row--removed]=\"item.removed || item.deleted\"\n [class.est2-row--group]=\"item._group\"\n [class.est2-row--clickable]=\"Selection() || item._group\"\n [contextMenu]=\"ContextMenu || emptyMenu\"\n [contextMenuSubject]=\"item\"\n (click)=\"handleRowClick(item, $event)\">\n\n <!-- Cella di selezione -->\n @if (Selection()) {\n <td class=\"est2-col-min est2-selcol\"\n [class.est2-pinned]=\"hasPinned()\"\n [style.left.px]=\"hasPinned() ? 0 : null\">\n @if (item._group) {\n @if (!SingleSelection()) {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"groupSelectionState(item) === 'all'\"\n [indeterminate]=\"groupSelectionState(item) === 'some'\"\n [disabled]=\"SelectionDisabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleGroupSelection(item)\"\n aria-label=\"Seleziona gruppo\" />\n }\n } @else {\n <input type=\"checkbox\" class=\"est2-check\"\n [checked]=\"item._selected\"\n [indeterminate]=\"hierarchyIndeterminate(item)\"\n [disabled]=\"SelectionDisabled()\"\n (click)=\"$event.stopPropagation()\"\n (change)=\"toggleRow(item)\"\n aria-label=\"Seleziona riga\" />\n }\n </td>\n }\n\n <!-- Celle da colonne (direttive / dinamica / report) -->\n @if (usesColumns()) {\n <!-- Operazioni dinamiche (icone a sinistra) -->\n @for (op of DynamicOperations(); track op.id) {\n <td class=\"est2-col-min est2-op-cell\">\n @if (!item._group && operationVisible(op, item)) {\n <span class=\"est2-op\" [class]=\"op.iconClass || ''\" [title]=\"op.title\"\n (click)=\"$event.stopPropagation(); dynamicOperation(item, op.id)\">{{ op.text }}</span>\n }\n </td>\n }\n @for (col of visibleColumns(); track trackCol($index, col); let first = $first, ci = $index) {\n <td [class]=\"col.cssClass\"\n [style.text-align]=\"col.alignment\"\n [style.color]=\"cellColor(item, col, 'fore')\"\n [style.background-color]=\"cellColor(item, col, 'back')\"\n [class.est2-nowrap]=\"!col.wrap\"\n [class.est2-col-groupstart]=\"columnGroupBoundaries().has(ci)\"\n [class.est2-pinned]=\"col.pinned\"\n [class.est2-fixedw]=\"colWidthPx(col) != null\"\n [style.left.px]=\"col.pinned ? pinnedLeftPx(ci) : null\"\n [style.width.px]=\"colWidthPx(col)\"\n [style.min-width.px]=\"colWidthPx(col)\"\n [style.max-width.px]=\"colWidthPx(col)\"\n (mouseenter)=\"onCellHover($event)\"\n [class.est2-td--group-key]=\"item._group && item.column === col.id\"\n [attr.data-r]=\"rangeActive() && !item._group ? ri : null\"\n [attr.data-c]=\"rangeActive() && !item._group ? ci : null\"\n [class.est2-cell-sel]=\"rangeActive() && inRange(ri, ci)\"\n [class.est2-cell-sel-t]=\"rangeActive() && inRange(ri, ci) && ri === rangeRect()!.top\"\n [class.est2-cell-sel-b]=\"rangeActive() && inRange(ri, ci) && ri === rangeRect()!.bottom\"\n [class.est2-cell-sel-l]=\"rangeActive() && inRange(ri, ci) && ci === rangeRect()!.left\"\n [class.est2-cell-sel-r]=\"rangeActive() && inRange(ri, ci) && ci === rangeRect()!.right\"\n [class.est2-cell-editing]=\"isEditing(ri, ci)\"\n (dblclick)=\"onCellDblClick(item, col, ri, ci)\">\n @if (isEditing(ri, ci)) {\n @if (editorFor(col); as edTpl) {\n <ng-container *ngTemplateOutlet=\"edTpl; context: editorContext(item, col)\"></ng-container>\n } @else {\n <ng-container *ngTemplateOutlet=\"defaultEditor; context: { $implicit: item, col: col }\"></ng-container>\n }\n } @else if (item._group) {\n @if (item.column === col.id) {\n <span class=\"est2-group-key\" [style.padding-left.px]=\"groupIndent(item)\">\n <span class=\"est2-group-chevron\" [class.est2-group-chevron--open]=\"item._expanded\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>\n </span>\n {{ groupCellDisplay(item, col) }}\n </span>\n } @else {\n {{ groupCellDisplay(item, col) }}\n }\n } @else {\n <!-- Navigatore albero nella prima colonna -->\n @if (Hierarchy() && first) {\n <span class=\"est2-hier-lead\" [style.padding-left.px]=\"hierarchyIndent(item)\">\n @if (item.parent) {\n <span class=\"est2-group-chevron est2-hier-toggle\" [class.est2-group-chevron--open]=\"item._expanded\"\n (click)=\"$event.stopPropagation(); toggleHierarchyNode(item)\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 6l6 6-6 6\"/></svg>\n </span>\n } @else {\n <span class=\"est2-hier-toggle\"></span>\n }\n </span>\n }\n @if (itemCellHidden(col)) {\n <!-- colonna di gruppo nascosta sulla riga-oggetto -->\n } @else if (col.multiProp != null) {\n @if (col.cell?.Template) {\n <ng-container *ngTemplateOutlet=\"col.cell!.Template; context: { $implicit: multiCell(item, col) }\"></ng-container>\n } @else {\n {{ multiCell(item, col)?.value }}\n }\n } @else if (col.cell?.Template) {\n <ng-container *ngTemplateOutlet=\"col.cell!.Template; context: { $implicit: item }\"></ng-container>\n } @else if (col.routePath) {\n <a class=\"est2-link\" [routerLink]=\"routerLinkFor(item, col)\">{{ cellValue(item, col) }}</a>\n } @else if (col.propAccessor != null) {\n {{ reportCellDisplay(item, col) }}\n } @else if (col.type === 'enum') {\n {{ (cellValue(item, col) | est2_lookup : col.source).description }}\n } @else {\n {{ cellValue(item, col) | est2_format : col.type : col.format : locale }}\n }\n }\n </td>\n }\n }\n <!-- Celle da template semplice -->\n @else if (bodyRef) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context: { $implicit: item }\"></ng-container>\n }\n\n <!-- Rimozione (non sulle righe-gruppo) -->\n @if (Removal()) {\n <td class=\"est2-col-min\">\n @if (!item._group && canRemove(item)) {\n @if (item.removed || item.deleted) {\n <button type=\"button\" class=\"est2-rowaction\" title=\"Ripristina\" (click)=\"abortRemoval(item)\">↺</button>\n } @else {\n <button type=\"button\" class=\"est2-rowaction est2-rowaction--danger\" title=\"Rimuovi\" (click)=\"removeItem(item)\">✕</button>\n }\n }\n </td>\n }\n <!-- Chrome -->\n @if (hasChrome()) { <td class=\"est2-col-min\"></td> }\n </tr>\n }\n } @empty {\n <tr>\n <td class=\"est2-empty\" [attr.colspan]=\"totalColspan()\">Nessun elemento da visualizzare</td>\n </tr>\n }\n </tbody>\n }\n </table>\n\n <!-- Overlay di caricamento -->\n @if (researchInProgress() || (firstBind() && ShowLoadingOnBootstrap())) {\n <div class=\"est2-loading\">\n <span class=\"est2-spinner\"></span>\n <span>Caricamento…</span>\n </div>\n }\n </div>\n\n <!-- Pager inferiore -->\n @if (PagingStyle() === 'both' || PagingStyle() === 'bottom') {\n <ng-container *ngTemplateOutlet=\"pager\"></ng-container>\n }\n\n <!-- Avviso transitorio (es. incolla con dimensioni incompatibili) -->\n @if (notice()) {\n <div class=\"est2-toast\" role=\"alert\">\n <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 9v4\"/><path d=\"M12 17h.01\"/><path d=\"M10.29 3.86 1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/></svg>\n <span>{{ notice() }}</span>\n </div>\n }\n\n <!-- Dialog visibilità / ordine colonne -->\n @if (columnsDialogOpen()) {\n <div class=\"est2-dialog-backdrop\" (click)=\"closeColumnsDialog()\">\n <div class=\"est2-dialog\" (click)=\"$event.stopPropagation()\" role=\"dialog\" aria-modal=\"true\">\n <div class=\"est2-dialog__head\">\n <span>\n @if (HiddenColumns() && ColumnsOrdering()) { Visibilità e ordine colonne }\n @else if (HiddenColumns()) { Visibilità colonne }\n @else { Ordine colonne }\n </span>\n <button type=\"button\" class=\"est2-dialog__close\" (click)=\"closeColumnsDialog()\" aria-label=\"Chiudi\">✕</button>\n </div>\n\n @if (HiddenColumns()) {\n <div class=\"est2-dialog__tools\">\n <button type=\"button\" class=\"est2-link\" (click)=\"dialogSetAll(true)\">Mostra tutte</button>\n <span class=\"est2-dialog__sep\">·</span>\n <button type=\"button\" class=\"est2-link\" (click)=\"dialogSetAll(false)\">Nascondi tutte</button>\n </div>\n }\n\n <ul class=\"est2-collist\">\n @for (c of dialogCols(); track c.id; let i = $index) {\n <li class=\"est2-collist__row\"\n [attr.draggable]=\"ColumnsOrdering() ? true : null\"\n [class.est2-collist__row--drag]=\"ColumnsOrdering()\"\n [class.est2-collist__row--dragging]=\"dragIndex() === i\"\n [class.est2-collist__row--drop-above]=\"dragOverIndex() === i && dragIndex() !== null && dragIndex()! > i\"\n [class.est2-collist__row--drop-below]=\"dragOverIndex() === i && dragIndex() !== null && dragIndex()! < i\"\n (dragstart)=\"dialogDragStart(i, $event)\"\n (dragover)=\"dialogDragOver(i, $event)\"\n (drop)=\"dialogDrop(i, $event)\"\n (dragend)=\"dialogDragEnd()\">\n @if (ColumnsOrdering()) {\n <span class=\"est2-collist__grip\" title=\"Trascina per riordinare\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 24 24\" width=\"14\" height=\"14\" fill=\"currentColor\"><circle cx=\"9\" cy=\"6\" r=\"1.6\"/><circle cx=\"15\" cy=\"6\" r=\"1.6\"/><circle cx=\"9\" cy=\"12\" r=\"1.6\"/><circle cx=\"15\" cy=\"12\" r=\"1.6\"/><circle cx=\"9\" cy=\"18\" r=\"1.6\"/><circle cx=\"15\" cy=\"18\" r=\"1.6\"/></svg>\n </span>\n }\n @if (HiddenColumns()) {\n <label class=\"est2-collist__vis\">\n <input type=\"checkbox\" class=\"est2-check\" [checked]=\"c.visible\" (change)=\"dialogToggle(i)\" />\n </label>\n }\n <span class=\"est2-collist__label\">{{ c.label }}</span>\n @if (ColumnsPinnable()) {\n <button type=\"button\" class=\"est2-iconbtn est2-collist__pin\" [class.est2-collist__pin--on]=\"c.pinned\"\n [disabled]=\"c.grouped\"\n [title]=\"c.grouped ? 'Le colonne di un gruppo non sono bloccabili' : (c.pinned ? 'Sblocca' : 'Blocca a sinistra')\"\n (click)=\"dialogTogglePin(i)\">\n <svg viewBox=\"0 0 24 24\" width=\"13\" height=\"13\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 17v5\"/><path d=\"M9 10.76a2 2 0 0 1-1.11 1.79l-1.78.9A2 2 0 0 0 5 15.24V16a1 1 0 0 0 1 1h12a1 1 0 0 0 1-1v-.76a2 2 0 0 0-1.11-1.79l-1.78-.9A2 2 0 0 1 15 10.76V7a1 1 0 0 1 1-1 2 2 0 0 0 0-4H8a2 2 0 0 0 0 4 1 1 0 0 1 1 1z\"/></svg>\n </button>\n }\n @if (ColumnsOrdering()) {\n <span class=\"est2-collist__ord\">\n <button type=\"button\" class=\"est2-iconbtn\" [disabled]=\"i === 0\" title=\"Su\" (click)=\"dialogMove(i, -1)\">↑</button>\n <button type=\"button\" class=\"est2-iconbtn\" [disabled]=\"i === dialogCols().length - 1\" title=\"Giù\" (click)=\"dialogMove(i, 1)\">↓</button>\n </span>\n }\n </li>\n }\n </ul>\n\n <div class=\"est2-dialog__foot\">\n <button type=\"button\" class=\"est2-btn est2-btn--ghost\" (click)=\"resetColumnsDialog()\">Ripristina</button>\n <span class=\"est2-dialog__spacer\"></span>\n <button type=\"button\" class=\"est2-btn est2-btn--ghost\" (click)=\"closeColumnsDialog()\">Annulla</button>\n <button type=\"button\" class=\"est2-btn est2-btn--primary\" (click)=\"applyColumnsDialog()\">Applica</button>\n </div>\n </div>\n </div>\n }\n </div>\n}\n\n<!-- Template pager riutilizzabile sopra/sotto -->\n<ng-template #pager>\n @if (!HidePaging() && !grouped()) {\n <es-table2-pager\n [page]=\"currentPage()\"\n [pages]=\"totalPages()\"\n [total]=\"totalCount()\"\n [itemsPerPage]=\"viewMode() ? (view()?.itemsperpageoverride ?? 15) : ArraymodeItemsPerPage()\"\n [countLabel]=\"CountLabel()\"\n [showCount]=\"!HidePagingCount()\"\n [showButtons]=\"!HidePagingButtons()\"\n [showPagingOptions]=\"!HidePagingButtons()\"\n [allowAll]=\"AllSearch()\"\n (pageChange)=\"goToPage($event)\"\n (itemsPerPageChange)=\"changeItemsPerPage($event)\">\n </es-table2-pager>\n }\n</ng-template>\n\n<!-- Editor di cella di default (usato quando il consumer non fornisce un `*editor`) -->\n<ng-template #defaultEditor let-item let-col=\"col\">\n @switch (col.type) {\n @case ('enum') {\n <select class=\"est2-editor-input\"\n [value]=\"editDraft\"\n (change)=\"editDraft = $any($event.target).value\"\n (keydown.enter)=\"commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\"\n (blur)=\"commitEdit(item, col)\">\n @for (o of col.source || []; track o.id) {\n <option [value]=\"o.id\" [selected]=\"o.id == editDraft\">{{ o.description }}</option>\n }\n </select>\n }\n @case ('boolean') {\n <input type=\"checkbox\" class=\"est2-editor-input est2-check\"\n [checked]=\"editDraft === true || editDraft === 'true'\"\n (change)=\"editDraft = $any($event.target).checked; commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\" />\n }\n @default {\n <input class=\"est2-editor-input\"\n [type]=\"editorInputType(col.type)\"\n [value]=\"editDraft\"\n (input)=\"editDraft = $any($event.target).value\"\n (keydown.enter)=\"commitEdit(item, col)\"\n (keydown.escape)=\"cancelEdit()\"\n (blur)=\"commitEdit(item, col)\" />\n }\n }\n</ng-template>\n\n<!-- Menu di default (nessuna operazione) usato quando il consumer non passa [ContextMenu] -->\n<context-menu #emptyMenu>\n <ng-template contextMenuItem [passive]=\"true\"><em>Nessuna operazione disponibile…</em></ng-template>\n</context-menu>\n","import { CommonModule } from '@angular/common';\r\nimport { NgModule, ModuleWithProviders } from '@angular/core';\r\nimport { FormsModule } from '@angular/forms';\r\nimport { RouterModule } from '@angular/router';\r\n\r\nimport { DragDropModule } from '@angular/cdk/drag-drop';\r\n\r\nimport { FormsAndValidationsModule } from '@esfaenza/forms-and-validations';\r\nimport { LocalizationModule } from '@esfaenza/localizations';\r\n\r\nimport { EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL } from './tokens';\r\nimport { EsTableModuleConfig } from './domain/configuration/EsTableModuleConfig';\r\n\r\nimport { EsTablePagerComponent } from './components/pager/table_pager.component';\r\nimport { EsTableComponent } from './components/es-table/es_table.component';\r\nimport { EsTh } from './components/es-th/es_th.component';\r\nimport { EsTd } from './components/es-td/es_td.component';\r\nimport { EsTdDirective } from './directives/es_td.directive';\r\nimport { EsThDirective } from './directives/es_th.directive';\r\nimport { EsTdEditorDirective } from './directives/es_td_editor.directive';\r\nimport { ThTdProvider } from './directives/es_th_td_provider.directive';\r\n\r\nimport { EstFormatPipe } from './components/pipes/est-format.pipe';\r\nimport { EstLookupPipe } from './components/pipes/est-lookup.pipe';\r\nimport { EstRouterLinkPipe } from './components/pipes/est-routerlink.pipe';\r\nimport { EstPropInsensitivePipe } from './components/pipes/est-propinsensitive.pipe';\r\nimport { EstRendererPipe } from './components/pipes/est-renderer.pipe';\r\nimport { EstEditorPipe } from './components/pipes/est_editor.pipe';\r\n\r\n// --- es-table2 (riscrittura 2026, stesso modulo/package) ---------------------\r\nimport { EsTable2Component } from './v2/es-table2.component';\r\nimport { EsTable2PagerComponent } from './v2/es-table2-pager.component';\r\nimport { Est2FormatPipe } from './v2/pipes/format.pipe';\r\nimport { Est2LookupPipe } from './v2/pipes/lookup.pipe';\r\nimport { EST2_DEBUG, EST2_DEFAULTS, EST2_EXPORT_GLOBAL_ACL } from './v2/tokens2';\r\n\r\nimport { ModalModule } from \"ngx-bootstrap/modal\";\r\nimport { BsDropdownModule } from \"ngx-bootstrap/dropdown\";\r\nimport { ContextMenuModule } from \"@esfaenza/ngx-contextmenu\";\r\nimport { SelectModule } from 'primeng/select';\r\nimport { TooltipModule } from 'primeng/tooltip';\r\nimport { AccessControlModule } from '@esfaenza/access-control';\r\nimport { ExtensionsModule } from '@esfaenza/extensions';\r\n\r\nconst MODULES = [\r\n CommonModule,\r\n FormsModule,\r\n RouterModule,\r\n LocalizationModule,\r\n ExtensionsModule,\r\n ModalModule,\r\n BsDropdownModule,\r\n ContextMenuModule,\r\n DragDropModule,\r\n FormsAndValidationsModule,\r\n TooltipModule,\r\n AccessControlModule\r\n]\r\n\r\nconst PUBLIC_ELEMENTS = [\r\n // Direttive (condivise da <es-table> e <es-table2>)\r\n EsTdDirective,\r\n EsThDirective,\r\n EsTdEditorDirective,\r\n\r\n // Componenti\r\n EsTableComponent,\r\n EsTablePagerComponent,\r\n ThTdProvider,\r\n\r\n // es-table2\r\n EsTable2Component\r\n]\r\n\r\nconst PRIVATE_ELEMENTS = [\r\n // Componenti\r\n EsTh,\r\n EsTd,\r\n\r\n // Pipes\r\n EstFormatPipe,\r\n EstLookupPipe,\r\n EstRouterLinkPipe,\r\n EstRendererPipe,\r\n EstEditorPipe,\r\n EstPropInsensitivePipe,\r\n\r\n // es-table2\r\n EsTable2PagerComponent,\r\n Est2FormatPipe,\r\n Est2LookupPipe\r\n]\r\n\r\n@NgModule({\r\n imports: [MODULES, SelectModule],\r\n declarations: [...PUBLIC_ELEMENTS, ...PRIVATE_ELEMENTS],\r\n exports: [...PUBLIC_ELEMENTS]\r\n})\r\nexport class EsTableModule {\r\n static forRoot(config?: EsTableModuleConfig): ModuleWithProviders<EsTableModule> {\r\n return {\r\n ngModule: EsTableModule,\r\n providers: [\r\n { provide: EST_DEBUG, useValue: config?.debugMode || false },\r\n { provide: EST_DEFAULTS, useValue: config?.defaults || null },\r\n { provide: EST_EXPORT_GLOBAL_ACL, useValue: config?.globalExportAclExpression || 'true' },\r\n // es-table2 condivide la stessa configurazione\r\n { provide: EST2_DEBUG, useValue: config?.debugMode || false },\r\n { provide: EST2_DEFAULTS, useValue: config?.defaults || null },\r\n { provide: EST2_EXPORT_GLOBAL_ACL, useValue: config?.globalExportAclExpression || 'true' },\r\n ]\r\n };\r\n }\r\n}","\r\n/** Indica un'opzione cliccabile nel Corner Menù della tabella (il menù richiamabile dai 3 pallini verticli in alto a destra) */\r\nexport class CornerMenuOption {\r\n\r\n /** Id dell'operazione. I callback relativi verranno effettuati con questo */\r\n public id: string;\r\n /** Descrizione dell'operazione da presentare all'utente */\r\n public description: string;\r\n}","\r\n/** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */\r\nexport class EsTableOperationDefinition {\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {string} id Codice dell'operazione\r\n * @param {string} title Titolo dell'operazione, da presentare all'utente su hover della cella\r\n * @param {string} iconClass Classe che fornisca un iconcina Es. \"fa fa-remove\"\r\n * @param {string} text Eventuale testo presentato nella cella, genericamente va in alternativa a **iconClass**\r\n * @param {string} conditionField Indica il campo dell'oggetto sottostante su cui verificare la visibilità o meno di questa icona\r\n * @param {string} conditionValue Indica il valore che la proprietà **conditionField** dell'oggetto sottostante deve assumere affinché questa opzione si veda\r\n */\r\n constructor(\r\n public id: string, \r\n public title: string, \r\n public iconClass?: string, \r\n public text?: string, \r\n public conditionField?: string, \r\n public conditionValue?: string) {\r\n }\r\n}","/** Classe che definisce un oggetto generico come lista di proprietà-valore */\r\nexport class GenericItem {\r\n\r\n /** @ignore */\r\n constructor() {\r\n this._selected = false;\r\n this._rowClass = null;\r\n this._hash = null;\r\n this.properties = {};\r\n }\r\n\r\n /** Dizionario delle proprietà dell'oggeto con il loro valore */\r\n public properties: Record<string, string>;\r\n /** Indica se l'oggetto in questione è selezionato o meno */\r\n public _selected: boolean;\r\n /** Viene valorizzato da un eventuale **RowClassAssigner** (o automaticamente se in modalità gerarchica) e serve applicare stili particolari alla intera riga */\r\n public _rowClass: string;\r\n /** Hash dell'oggetto per generare i contesti di bind all'interno dell'es-table (vedere eventualmente l'implementazione specifica) */\r\n public _hash: string;\r\n}","/** Classe che definisce un multi-elemento, cioè una proprietà particolare di un oggetto da visualizzare in es-table che genera dinamicamente gruppi di Header e valori sottostanti */\r\n\r\nexport class EsTableMultiValue {\r\n\r\n /**\r\n * Costruttore\r\n *\r\n * @param {string} value Valore di questo elemento\r\n * @param {string} header Nome di questo header\r\n * @param {string} header_group Gruppo dell'header, in caso di multipli gruppi innestati usare la sintassi \"G1 > G2 > G3\" ecc...\r\n * @param {boolean} exports Indica se questo header con questo valore dev'essere esportato\r\n * @param {string} export_format Qualora **export** fosse **true** indica il formato per l'esportazione\r\n */\r\n constructor(public value: any, public header: string, public header_group: string, exports: boolean = false, export_format: string = \"\") {\r\n this.exports = exports;\r\n this.export_format = export_format;\r\n this._headersHierarchy = header_group ? header_group.split(\">\").map(t => t.trim()) : [];\r\n }\r\n\r\n /** Indica se questo header con questo valore dev'essere esportato */\r\n public exports?: boolean = false;\r\n\r\n /** Qualora **export** fosse **true** indica il formato per l'esportazione */\r\n public export_format?: string = \"\"\r\n\r\n /** Generato automaticamente da **header_group** se passato da costruttore, altrimenti generato da es-table. Contiene la lista di gerarchie degli header groups (cioè **header_group** splittato su \">\" e trimmato) */\r\n public _headersHierarchy?: string[];\r\n}\r\n","/** Classe che rappresenta una colonna di un report */\r\nexport class ReportColumn {\r\n\r\n /** Id della colonna */\r\n public id: string;\r\n /** Descrizione della colonna (Header) */\r\n public description: string;\r\n /** Colore in notazione HTML */\r\n public color: string;\r\n /** Tipo di campo contenuto in questa colonna */\r\n public type: number;\r\n /** Sequenza per eventuali ordinamenti */\r\n public seq: number;\r\n /** Ordinamento dei dati presentati */\r\n public order?: string;\r\n /** Allineamento da tenere per questa colonna: **Center**, **Left** o **Right** */\r\n public alignment?: string;\r\n /** Formato dei dati da presentare in questa colonna */\r\n public format?: string;\r\n}","\r\n/** Classe che identifica un parametro generico per un report */\r\nexport class ReportParam {\r\n\r\n /** Codice del parametro */\r\n public id: string;\r\n /** Descrizione del parametro */\r\n public description: string;\r\n /** Sequenza del parametro per ordinarlo logicamente rispetto agli altri */\r\n public seq: number;\r\n /** Typecode C# della tipologia di parametro */\r\n public typecode: number;\r\n /** Indica se i parametro è richiesto o meno */\r\n public required: boolean;\r\n /** Valore del parametro, offerto sia come valore di default o in alternativa riempito lato UI */\r\n public value?: any;\r\n /** Indica se questo parametro si basa su un enum. Se questa proprietà è true mi aspetto che almeno **enumtype** sia valorizzato */\r\n public isenum: boolean;\r\n /** Indica se questo parametro si basa su un dizionario. Se questa proprietà è true mi aspetto che almeno **dictype** sia valorizzato */\r\n public isdictionary: boolean;\r\n /** Indica se il parametro è di tipo data */\r\n public isdate: boolean;\r\n /** Indica se il parametro è di tipo boolean */\r\n public isboolean: boolean;\r\n /** Valori disponibili per questo parametro, da valorizzare in caso **enumtype** o **dictype** fossero valorizzati */\r\n public availablevalues?: { id: string; description: string; }[];\r\n /** Tipo enumerabile del parametro (qualora fosse un dizionario di valori) */\r\n public enumtype?: string;\r\n /** Colonna relativa e questo parametro */\r\n public column?: string;\r\n /** Tipo del dizionario */\r\n public dictype?: string;\r\n /** Indica un filtro da applicare nei confronti del Backend qualora si vogliano caricare solo le possibilità logicamente accettabili per questo parametro */\r\n public dictionaryfilter?: string;\r\n /** Tipologia lato \"typescript\" di questo parametro, dev'essere sempre logicamente congruente al **typecode** */\r\n public type?: \"string\" | \"number\" | \"date\" | \"boolean\";\r\n /** Eventuale pattern di validazione per questo parametro */\r\n public pattern?: string;\r\n}","/** Classe che rappresenta i valori delle proprietà di un oggetto Report */\r\nexport class ReportRow {\r\n \r\n /** Valori dell'oggetto in ordine sequenziale */\r\n public values: string[];\r\n /** Colore di foreground per ogni cella */\r\n public forecolors?: string[];\r\n /** Colore di background per ogni cella */\r\n public backcolors?: string[];\r\n}","import { InputType } from \"../types\";\r\n\r\n/** Classe che rappresenta il riferimento ad una proprietà di un oggetto bindato sulla tabella */\r\nexport class ItemPropEditableReference {\r\n /** Stato di selezione della cella relativa */\r\n selected?: boolean;\r\n /** Oggetto relativo su cui si modificano le proprietà */\r\n item: any;\r\n /** ID dell'header in modifica (riferimento al TH relativo) */\r\n header?: string;\r\n /** Proprietà Javascript effettivamente in modifica */\r\n property?: string | null;\r\n /** Tipo dell'input */\r\n type?: InputType | string | null;\r\n /** Valore attuale della proprietà **property** dell'oggetto **item** */\r\n value?: string;\r\n /** Indica se la cella deve avere il bordino a sinistra */\r\n lborder?: boolean;\r\n /** Indica se la cella deve avere il bordino in alto */\r\n tborder?: boolean;\r\n /** Indica se la cella deve avere il bordino a destra */\r\n rborder?: boolean;\r\n /** Indica se la cella deve avere il bordino in basso */\r\n bborder?: boolean;\r\n /** Indica se il bordo a sinistra overlappa su un bordo di selezione destro della cella precedente */\r\n loverlaps? : boolean;\r\n /** Indica se il bordo a destra overlappa su un bordo di selezione sinistro della cella successiva */\r\n roverlaps?: boolean;\r\n /** Indica se il bordo in alto overlappa su un bordo di selezione basso della cella precedente */\r\n toverlaps?: boolean;\r\n /** Indica se il bordo in basso overlappa su un bordo di selezione in alto della cella successiva */\r\n boverlaps?: boolean;\r\n /** Funzione che imposta il nuovo valore della proprietà **property** dell'oggetto **item** ed aggiorna il **value** di questo oggetto */\r\n val_setter?: (value: string) => any;\r\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i3","i5","i1.Logger","i2","i4.UtilitiesHandler","i6.CopyPasteDetector","i7.Logger","buildMultiColumnsFn","coerceValueFn","ancestorChainFn","enforceGroupContiguityFn","i4","i6.EsTable2PagerComponent","i7.Est2FormatPipe","i8.Est2LookupPipe"],"mappings":"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"}