{"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/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 **TablePagerComponent** */\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: \"app-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 TablePagerComponent {\r\n\r\n    /** Dimensione di pagina attuale */\r\n    CurrentPageSize = input<number>(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>(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);\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);\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> = 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() >= 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        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        }\r\n        else {\r\n            this.pagingSelected.emit(pageSize);\r\n            this.Model.set(pageSize);\r\n        }\r\n    }\r\n}","<div *ngIf=\"!Hidden()\" [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\r\n  <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}:&nbsp;</span>\r\n  <ng-container *ngIf=\"ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)\">\r\n\r\n    <p-select  \r\n      style=\"width: 95px\"\r\n      size=\"small\"\r\n      name=\"input\"\r\n      appendTo=\"body\"\r\n      [options]=\"PagingOptionsForSelect()\"\r\n      optionLabel=\"description\"\r\n      optionValue=\"id\"\r\n      [ngModel]=\"Model()\"\r\n      (ngModelChange)=\"choice($event)\"\r\n      />\r\n\r\n    <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">&nbsp;/&nbsp;</span>\r\n  </ng-container>\r\n  <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\r\n</div>","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[] = null;\r\n\r\n    /** Variabile interna contenente in maniera ordinata i template dei padri */\r\n    public _thParents: { id: string, tmpl?: TemplateRef<any>, content?: string }[] = null;\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 = \"\";\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;\r\n\r\n    /** Proprietà JS a cui si riferisce questa cella */\r\n    @Input() thProperty: string = 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;\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;\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;\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>) { }\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 { Subject } 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: Subject<void> = new Subject<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 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>) => {\r\n            this.exportInProgress = false;\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,\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>, \r\n        public parentTemplates?: { id: string, tmpl?: TemplateRef<any>, 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 } 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\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') {\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;\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>) {\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 columns = this.est.arrayMode ? this.est.arrayColumns : castedView.columns;\r\n        let columnsOrderings = this.est.arrayMode ? this.est.arrayColumnOrdering : castedView.column_ordering;\r\n        let columnOrders = this.est.arrayMode ? [] : 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, 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 = 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        this.est.PinnedContainerWidth = 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                this.est.PinnedContainerWidth += col.pinnedWidth;\r\n        }\r\n        this.est.PinnedContainerWidth += this.est.Selection ? 25 : 0;\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     * @param {boolean} useLocalVisibility Indica di utilizzare le impostazioni di visibilità locali senza allinearle alla view\r\n     */\r\n    public alignColumnsIfLoadedView(view: AppSearch<any>) {\r\n        let emitChanged = this.est.viewMode && view.savedstate;\r\n        let newColset = [];\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 = [];\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 == 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[], tds: EsTdDirective[], view: AppSearch<any>) {\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 = null;\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 = [];\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 = \"\";\r\n        for (let i = 0; i < orderedLeafs.length; i++) {\r\n            let refTh: EsThDirective = orderedLeafs[i];\r\n            let prevTh: EsThDirective = 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: { ID: string, Span: number; Template: TemplateRef<any>; Content?: string, Pinned?: boolean; Borders?: boolean; }[][] = [];\r\n        for (let l = 0; l < expandedGroups.length; l++) {\r\n            let levelArray: { ID:string, Span: number; Template: TemplateRef<any>; Content?: string, Pinned?: boolean; Borders?: boolean; }[] = [];\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 : null, 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 : null , 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>, 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>, finalize: boolean) {\r\n        // Genero ordinamento per gli header\r\n        let newHeaders = [];\r\n\r\n        // Se devo finalizzare aggancio tutte le variabili di bind\r\n        if (finalize) {\r\n            this.est.OrderDirectives.forEach(o => {\r\n                let heaedrItem = this.est.TMPRowTHs.filter(t => t.ID == o)[0];\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 = [];\r\n\r\n                this.est.OrderDirectives.forEach(o => {\r\n                    let contextItem = context.filter(t => t.ID == o)[0];\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)\r\n            view.column_ordering = this.est.OrderDirectives;\r\n\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 = [];\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 = [];\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        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 = [];\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 = 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                    //this.emitSearchRequest(true, this.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     */\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    }\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        );\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 && this.est.DynamicRowColumnsDefinition.length > 0))\r\n            return;\r\n\r\n        if ((!this.est.DynamicRowColumnsDefinition || this.est.DynamicRowColumnsDefinition.length == 0)) {\r\n            var props = <Record<string, string>>this.est.TMPBoundSource[0][\"properties\"];\r\n            this.est.DynamicRowColumnsDefinition = [];\r\n            for (let key in props)\r\n                this.est.DynamicRowColumnsDefinition.push(new EsTableColumnsDefinition(key, key));\r\n            this.est.UserDefinedDynamicCols = false;\r\n        }\r\n        else\r\n            this.est.UserDefinedDynamicCols = 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 || this.est.DynamicRowColumnsDefinition.length == 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\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 = 'parentid';\r\n            if (objs[0]['id'] !== undefined)\r\n                this.est.OwnKey = '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\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        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[this.est.ParentKey] && levelToAssign == 1) {\r\n                obj._level = 1;\r\n                obj._visible = true;\r\n                obj._expanded = this.est.StartsExpanded;\r\n                assigned++;\r\n                continue;\r\n            }\r\n\r\n            // Per i livelli superiore al primo\r\n            if (obj[this.est.ParentKey] && 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[this.est.OwnKey] == obj[this.est.ParentKey] && 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 = this.est.StartsExpanded;\r\n                        possibleParent.parent = true;\r\n                        obj._visible = this.est.StartsExpanded;\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        for (let i = 0; i < this.est.boundSource.length; i++) {\r\n            let obj = this.est.boundSource[i];\r\n\r\n            // Trovo il parent con quell'id e lo espando\r\n            if (obj[this.est.OwnKey] == key) {\r\n                obj._expanded = true;\r\n\r\n                for (let ic = 0; ic < this.est.boundSource.length; ic++) {\r\n                    let child = this.est.boundSource[ic];\r\n\r\n                    // Trovo tutti i child di quel parent e li rendo visibili\r\n                    if (child[this.est.ParentKey] == 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        for (let i = 0; i < this.est.boundSource.length; i++) {\r\n            let obj = this.est.boundSource[i];\r\n\r\n            // Trovo il parent con quell'id e lo collasso\r\n            if (obj[this.est.OwnKey] == 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        for (let ic = 0; ic < this.est.boundSource.length; ic++) {\r\n            let child = this.est.boundSource[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[this.est.ParentKey] == parentKey && !child.parent)\r\n                child._visible = false;\r\n            else if (child[this.est.ParentKey] == parentKey && child.parent) {\r\n                child._expanded = false;\r\n                child._visible = false;\r\n                this.collapseChildOfParent(child[this.est.OwnKey]);\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                if (this.est.SearchView)\r\n                {\r\n                    this.est.ArraymodeItemsPerPage = this.est.SearchView.itemsperpageoverride;\r\n                    this.est.arraymodePage = this.est.SearchView.page;\r\n                    this.est.arraymodePages = this.est.SearchView.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 = pageSize;\r\n        this.est.arraymodePages = Math.ceil((this.est.View as any[]).length / this.est.ArraymodeItemsPerPage);\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 = 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 = 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 = 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            // 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                this.est.boundSource = this.est.boundSource.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                this.est.boundSource = this.est.boundSource.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));\r\n            }\r\n\r\n            this.est.boundSource = this.est.boundSource.filter(t => !(t._parent == groupKey));\r\n\r\n            let thisGroup = this.est.boundSource[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            this.est.boundSource.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            this.est.boundSource.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            // 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 = true;\r\n            this.est.boundSource = 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>) {\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                    item[th.thProperty] = value;\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 = this.est.boundSource.length > 0 && this.est.boundSource.filter(t => t._group || t._item).every(t => t._selected);\r\n        this.est.canSelectAll = 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, globalCheck: boolean = 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, null, 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, null, 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 = !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[], desel_itm: any[], all_itms: any[], all_grps: any[]) {\r\n        let tripticItem = this.getTriptic('item', base);\r\n\r\n        if (group) {\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, null, 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[], sel_grp: any[], desel_itm: any[], desel_grp: any[], all_itms: any[], all_grps: any[], parent_incl: boolean, parent_excl: boolean) {\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        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.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): 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>, group: any, status?: 'selected' | 'unselected', recursive: boolean = false, allbase: any[] = 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 = 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\r\n        this.est.selectedObjects = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;\r\n        return this.est.selectedObjects;\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 = false;\r\n            this.est.globalCheck = 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: { value: string, type: InputType | string }[][]): 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 {{ value: string, type: InputType }} 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: { value: string, type: InputType | string }): 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        }\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    public log(text: string) {\r\n        if (this.debugMode)\r\n            console.log(\"[@esfaenza/es-table @ \" + (new Date()).toISOString() + \"] \" + text);\r\n    }\r\n}","//Angular\r\nimport { Component, Input, Output, EventEmitter, ElementRef, ViewChild, Renderer2, HostListener, ChangeDetectionStrategy } 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 = null;\r\n\r\n    /** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */\r\n    @Input('es-th') ID: string = \"\";\r\n\r\n    /** Ordinamento attuale della colonna */\r\n    @Input() Order?: 'DESC' | 'ASC';\r\n\r\n    /** Indica se questa colonna è ordinabile o meno */\r\n    @Input() Orderable: 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    @Input() Display: string = \"\";\r\n\r\n    /** Indica se le dimnsioni di questa colonna sono modificabili o meno */\r\n    @Input() Resizable: boolean = false;\r\n\r\n    /** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */\r\n    @Input() Pinned: 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    @Input() SearchInProgress: boolean = false;\r\n\r\n    /** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */\r\n    @Input() OrderBy: boolean;\r\n\r\n    /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */\r\n    @Input() Wrap: 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    @Input() Fixed: boolean = false;\r\n\r\n    /** Template Angular da istanziare per questo TH */\r\n    @Input() Template?: any = null;\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    /** Proiezione del contenuto di questa colonna */\r\n    @ViewChild(\"content\", { static: false }) content: ElementRef;\r\n\r\n    /** Classi da applicare alla colonna */\r\n    public Class: string;\r\n\r\n    /** Impostato 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 finale su cui è bindato il contenuto della cella. Sarà valorizzato a **Display** se specificato, all'**innerHTML** dell'elemento proiettato altrimenti */\r\n    public Description: string;\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        //Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo\r\n        this.Description = this.Display === null || this.Display === \"\" ? this.content.nativeElement.innerText : this.Display;\r\n\r\n        this.Class = 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 = nextOrder;\r\n\r\n        this.onOrderChange.emit(this.Order);\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) {\r\n        if (!this.Resizable)\r\n            return;\r\n\r\n        this.resizingThis = true;\r\n        this.startOffset = this.myself.nativeElement.offsetWidth - ev.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): 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.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\">\r\n    <span #content>\r\n        <ng-container *ngIf=\"!!Template\">\r\n            <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n        </ng-container>\r\n        <ng-content *ngIf=\"!Template\"></ng-content>\r\n    </span>&nbsp;\r\n    <span class=\"fa\" [class.fa-chevron-down]=\"Order == 'DESC'\" [class.fa-chevron-up]=\"Order == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned && !Fixed\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable || Fixed || Pinned\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n    <div class=\"est-head-resizer-internal\"></div>\r\n</div>","// Angular\r\nimport { Component, Input, ChangeDetectionStrategy, EventEmitter, Output, ChangeDetectorRef } 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    @Input('es-td') ID: string = \"\";\r\n\r\n    /** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */\r\n    @Input() Context: 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: string = \"\";\r\n\r\n    /** @ignore */\r\n    constructor(private cdr: ChangeDetectorRef) { }\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 = error;\r\n        this.cdr.markForCheck();\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>, fallback: any }) {\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 ||\r\n                !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>, fallback: any }) {\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 ||\r\n                !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, OnChanges, SimpleChanges, ViewChild, ElementRef, ViewEncapsulation, Optional, Self, TemplateRef, Inject, Type,\r\n    Renderer2\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\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\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_DEFAULTS } 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 } from 'rxjs';\r\nimport { ModalDirective } from 'ngx-bootstrap/modal';\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, OnChanges {\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        @Self() @Optional() public ngControl: NgControl,\r\n        @Optional() private prefService: PreferencesService,\r\n        @Optional() @Inject(EST_DEFAULTS) private deafults: EsTableDefaultable,\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        // 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    /** 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;\r\n    /** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */\r\n    public arrayPulsanti: { 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 = false;\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    /** Conteggio interno per il numero di elementi selezionati */\r\n    public selectedObjects = 0;\r\n    /** Indica se è possibile effettuare una selezione massiva */\r\n    public canSelectAll = false;\r\n    /** Indica se il componente sta gestendo un IAppSearch<any> */\r\n    public viewMode = false;\r\n    /** Indica se il componente sta gestendo un any[] */\r\n    public arrayMode = 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: 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 = false;\r\n    /** Numero di secondi da fare trascorrere fra una ricerca e l'altra */\r\n    public seconds = '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: boolean = false;\r\n    /** Modello di appoggio temporaneo per i **RowTDs** */\r\n    public TMPRowTDs: { [context: string]: TdElement[] } = null;\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]: TdElement[] } = null;\r\n    /** Indica se **RowTDs** è un oggetto vuoto o meno */\r\n    public EmptyRowTds: boolean = true;\r\n    /** Modello di appoggio temporaneo per i **RowTHs** */\r\n    public TMPRowTHs: ThElement[] = null;\r\n    /** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */\r\n    public RowTHs: ThElement[] = null;\r\n    /** Modello di appoggio temporaneo per i **RowThGroups** */\r\n    public TMPRowThGroups: ThGroup[][] = null;\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 = 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: boolean = 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: 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: 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 = false;\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    @Input() CornerMenuOptions: CornerMenuOption[] = null;\r\n    /** Indica se dev'essere possibile effettuare il resize delle colonne */\r\n    @Input() ColumnsResizable: boolean = null;\r\n    /** Indica se dev'essere possibile effettuare il pinning delle colonne */\r\n    @Input() ColumnsPinnable: boolean = null;\r\n    /** Indica se dev'essere disponibile il sistema di aggiornamento automatico */\r\n    @Input() AutoUpdate: boolean = null;\r\n    /** Indica l'altezza cablata che deve assumere la tabella. Es: \"100px\" | \"100%\" ...  */\r\n    @Input() Height: string = null;\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    @Input() EmptySpaceBackgroundColor: string = null;\r\n    /** Indica se dev'essere l'estable a gestire la ricerca, anche la prima.  **/\r\n    @Input() EsTableHandledSearch: 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    @Input() MaxHeight: number = null;\r\n    /** Classi da applicare al contenitore della tabella */\r\n    @Input() ContainerClass = null;\r\n    /** Permette o meno l'export in formato XLSX */\r\n    @Input() XLSXExport: boolean = null;\r\n    /** Permette o meno l'export in formato CSV */\r\n    @Input() CSVExport = true;\r\n    /** Permette di visualizzare o meno l'opzione di paginazione \"Tutti\" */\r\n    @Input() AllSearch = 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    @Input() HighCellDensity: boolean = null;\r\n    /** Abilita o meno la possibilità di selezionare oggetti */\r\n    @Input() Selection: boolean = null;\r\n    /** Mostra o meno un messaggio di Loading al primo caricamento della tabella */\r\n    @Input() ShowLoadingOnBootstrap: boolean = null;\r\n    /** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */\r\n    @Input() Removal: boolean = null;\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    @Input() RemovalCondition = '';\r\n    /** Indica se abilitare la possibilità di esportare la vista dati attuale */\r\n    @Input() Export: boolean = 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    @Input() ShiftClick: boolean = null;\r\n    /** Indica il testo che va a sostituire \"Oggetti Visualizzati\" in caso si stia facendo qualcosa di custom */\r\n    @Input() CountLabel: string = null;\r\n    /** Indica se nascondere o mostrare il componente di paginazione */\r\n    @Input() HidePaging: boolean = null;\r\n    /** Indica se nascondere o mostrare il conteggio degli elementi trovati */\r\n    @Input() HidePagingCount: boolean = null;\r\n    /** Indica se nascondere o mostrare i pulsanti di paginazione */\r\n    @Input() HidePagingButtons: boolean = 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 = null;\r\n    /** Nome dell'esportazione generata da questa tabella */\r\n    @Input() ExportFileName = 'Export.csv';\r\n    /** Classe (HTML) di default della tabella */\r\n    @Input() TableClass = 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    @Input() ExportOnlyVisibleColumns: boolean = false;\r\n    /** @deprecated Indica la presenza di raggruppamenti a livello di header */\r\n    @Input() HasHeaderGroup: boolean = null;\r\n    /** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */\r\n    @Input() HasSecondaryHeaderGroup: boolean = null;\r\n    /** Indica se nascondere gli Header della tabella */\r\n    @Input() HeaderHidden: boolean = null;\r\n    /** Indica se nascondere il Body della tabella */\r\n    @Input() BodyHidden: boolean = null;\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    @Input() SelectionDisabled: boolean = null;\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    @Input() SingleSelection: boolean = null;\r\n    /** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */\r\n    @Input() RowClassAssigner: any = null;\r\n    /** Permette di ordinare i dati in maniera discendente o ascendente */\r\n    @Input() OrderByColumn: boolean = null;\r\n    /** Permette di avere più direttive di ordinamento dei dati */\r\n    @Input() MultipleOrderingDirectives = true;\r\n    /** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */\r\n    @Input() HiddenColumns: boolean = null;\r\n    /** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */\r\n    @Input() ColumnsOrdering: boolean = null;\r\n    /** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */\r\n    @Input() SearchView = null as AppSearch<any>;\r\n    /** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */\r\n    @Input() SelectAll: boolean = null;\r\n    /** Simula la paginazione anche per le tabelle che funzionano in modalità Array */\r\n    @Input() UseArrayModePaging = true;\r\n    /** Definizione di colonne dinamche per la modalità, appunto, dinamica */\r\n    @Input() DynamicRowColumnsDefinition: EsTableColumnsDefinition[] = null;\r\n    /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */\r\n    @Input() DynamicOperations: EsTableOperationDefinition[] = [];\r\n    /** Indica se visualizzare i dati in maniera gerarchica */\r\n    @Input() Hierarchy: boolean = null;\r\n    /** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */\r\n    @Input() ParentKey = '';\r\n    /** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */\r\n    @Input() OwnKey = '';\r\n    /** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */\r\n    @Input() StartsExpanded = true;\r\n    /** Indica se effettuare il salvataggio delle preferenze di ricerca */\r\n    @Input() SavePreferences: boolean = null;\r\n    /** Allineamento di default per celle e headers */\r\n    @Input() DefaultAlignment: 'Left' | 'Right' | 'Center' = null;\r\n    /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n    @Input() PagingStyle: 'both' | 'top' | 'bottom' = null;\r\n    /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */\r\n    @Input() RowGroupingPagingStyle: 'left' | 'right' = 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    @Input() ItemSourceProperty: 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    @Input() UseSelectionCache = 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    @Input() ShowItemGroupsColumns = null;\r\n    /** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */\r\n    @Input() Editable: boolean = false;\r\n    /** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */\r\n    @Input() RangeSelection: boolean = false;\r\n    /** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */\r\n    @Input() SearchThrottle: 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    @Input() ArraymodeItemsPerPage = 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: { 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> = null;\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 = 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: boolean\r\n    /** Larghezza calcolata del container delle colonne pinnate */\r\n    public PinnedContainerWidth: number;\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: boolean = false;\r\n    /** Indica che l'es-table è basata sulle direttive (nuova modalità) */\r\n    public DirectivesBased: 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        this.ctxMenuSubscription = (this.ContextMenu || this.tableEmptyMenu).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(null);\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 = this.utilities_H.InputOrDefault(this.ColumnsResizable, this.deafults?.ColumnsResizable);\r\n        this.AutoUpdate = this.utilities_H.InputOrDefault(this.AutoUpdate, this.deafults?.AutoUpdate);\r\n        this.AllSearch = this.utilities_H.InputOrDefault(this.AllSearch, this.deafults?.AllSearch, true);\r\n        this.Export = this.utilities_H.InputOrDefault(this.Export, this.deafults?.Export);\r\n        this.HidePaging = this.utilities_H.InputOrDefault(this.HidePaging, this.deafults?.HidePaging, false);\r\n        this.HidePagingCount = this.utilities_H.InputOrDefault(this.HidePagingCount, this.deafults?.HidePagingCount);\r\n        this.HidePagingButtons = this.utilities_H.InputOrDefault(this.HidePagingButtons, this.deafults?.HidePagingButtons);\r\n        this.ContainerClass = this.utilities_H.InputOrDefault(this.ContainerClass, this.deafults?.ContainerClass, '');\r\n        this.TableClass = this.utilities_H.InputOrDefault(this.TableClass, this.deafults?.TableClass, 'table table-striped table-hover table-sm');\r\n        this.Selection = this.utilities_H.InputOrDefault(this.Selection, this.deafults?.Selection);\r\n        this.SavePreferences = this.utilities_H.InputOrDefault(this.SavePreferences, this.deafults?.SavePreferences);\r\n        this.PagingStyle = this.utilities_H.InputOrDefault(this.PagingStyle, this.deafults?.PagingStyle, 'bottom');\r\n        this.RowGroupingPagingStyle = this.utilities_H.InputOrDefault(this.RowGroupingPagingStyle, this.deafults?.RowGroupingPagingStyle, 'left');\r\n        this.UseSelectionCache = this.utilities_H.InputOrDefault(this.UseSelectionCache, this.deafults?.UseSelectionCache, true);\r\n        this.ShowItemGroupsColumns = this.utilities_H.InputOrDefault(this.ShowItemGroupsColumns, this.deafults?.ShowItemGroupsColumns, false);\r\n        this.ArraymodeItemsPerPage = this.utilities_H.InputOrDefault(this.ArraymodeItemsPerPage, this.deafults?.ArraymodeItemsPerPage, 15);\r\n        this.ColumnsPinnable = this.utilities_H.InputOrDefault(this.ColumnsPinnable, this.deafults?.ColumnsPinnable, true);\r\n        this.DefaultAlignment = this.utilities_H.InputOrDefault(this.DefaultAlignment, this.deafults?.DefaultAlignment, 'Left');\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 = true;\r\n            if (this.HiddenColumns == null && this.UseCustomCells) this.HiddenColumns = true;\r\n            if (this.ColumnsOrdering == null && this.UseCustomCells) this.ColumnsOrdering = true;\r\n            if (this.OrderByColumn == null && this.UseCustomCells) this.OrderByColumn = true;\r\n            if (this.SelectAll == null && this.Selection) this.SelectAll = true;\r\n            if (this.ShiftClick == null && this.Selection) this.ShiftClick = true;\r\n            this.DirectivesBased = 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\r\n    /** @ignore */\r\n    public async ngOnChanges(changes: SimpleChanges) {\r\n        let newSearchView = changes['SearchView'];\r\n        if (newSearchView && this.SearchView)\r\n            this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.objectcount, this.SearchView.itemsperpageoverride);\r\n    }\r\n\r\n    /** @ignore */\r\n    public registerOnChange(fn): void { this.propagateChange = fn; }\r\n    /** @ignore */\r\n    public registerOnTouched(fn): 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            if (!this.ItemSourceProperty)\r\n                (<AppSearch<any>>this.View).items = [];\r\n            else\r\n                (<AppSearch<any>>this.View)[this.ItemSourceProperty] = [];\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        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 = false;\r\n\r\n        if (!this.View && !this.SearchView) {\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 = 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 (this.SearchView && typeof (this.SearchView as any).itemsperpageoverride != 'undefined' && !(this.SearchView instanceof AppSearch))\r\n            (this.SearchView as any).__proto__ = new AppSearch();\r\n        // -------------------------------------------------------------------------------------------------------------------------\r\n\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(this.ItemSourceProperty && !this.View[this.ItemSourceProperty])\r\n                this.View[this.ItemSourceProperty] = [];\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                        \r\n                        if (this.EsThsDirective?.length > 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            // La paginazione devo farla solamente quando richiedo o un gruppo principale (se sono in row grouping) o se non richiedo gruppi (in tutti lgi altri casi)\r\n            if (firstItemGroupOrNoGrouping)\r\n                this.arrayPulsanti = 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        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 => 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            if (this.SearchView)\r\n                this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.items.length, this.SearchView.itemsperpageoverride);\r\n        }\r\n\r\n        this.finalizeContext();\r\n\r\n        this.postBoundSourceCalculation();\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 if (this.View && this.View.selfsearch && this.EsTableHandledSearch) {\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\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\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\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\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 = 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 ? 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        if (this.arrayMode && this.UseArrayModePaging && !this.SearchView) {\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 || this.SearchView)) {\r\n            if (this.SearchView) {\r\n                this.PagerOptions.View = this.SearchView\r\n                this.PagerOptions.PagerCount = this.SearchView.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 || (this.SearchView?.objectcount || 0) > 10);\r\n            this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView && this.SearchView.objectcount && this.SearchView.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 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        // 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        // 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 ((this.viewMode || this.arrayMode) && this.UseCustomCells) {\r\n            let view = this.viewMode ? View as AppSearch<any> : null;\r\n            let itemsAndGroups = this.viewMode ? [...((this.ItemSourceProperty ? view[this.ItemSourceProperty] : view.items) || []), ...(view.groups || [])] : View as any[];\r\n            let si = this.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 (this.DynamicRowColumnsDefinition?.length > 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, this.DynamicRowColumnsDefinition);\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 ((this.viewMode || this.arrayMode) && !this.UseCustomCells) {\r\n            // Riallineo le info di selezione degli elementi della View\r\n            let items = this.viewMode ? (this.ItemSourceProperty ? (View as AppSearch<any>)[this.ItemSourceProperty] : (View as AppSearch<any>).items) : View as any[];\r\n            let si = this.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 = 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 = [];\r\n            return;\r\n        }\r\n\r\n        if (this.arrayMode || !this.UseCustomCells) {\r\n            this.boundSource = 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 => !t.aggregation)?.length || 0;\r\n        if (groupingKeys == 0) {\r\n            this.boundSource = 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 = this.isEmpty(this.RowTDs);\r\n\r\n        this.Columns.Visibile = this.RowTHs.filter(t => t.Visible).length;\r\n        this.Columns.VisibleUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;\r\n        this.Columns.Global = this.Columns.VisibleUnpinned + (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\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') {\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);\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 = 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        // 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            for (let i = 0; i < this.boundSource.length; i++) {\r\n                let item = this.boundSource[i];\r\n                let ctx = item._hash;\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                    let thCasted = <EsThDirective>th;\r\n                    let isFixed = th.thFixed || th.thGroup || th.thPinned;\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: columnsCache[td.td].pinned,\r\n                            PinnedWidth: thCasted.thPinnedWidth,\r\n                            GroupHeader: false,\r\n                            GroupAggregation: false,\r\n                            Visible: columnsCache[td.td].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: thCasted.thGroup && !this.ShowItemGroupsColumns ? null : td.Template,\r\n                            Multi: td._multi,\r\n                            MultiProp: td._multi ? td.td.split('_')[0] : null,\r\n                            MultiIndex: td._multi ? td.td.split('_')[1] : null,\r\n                            Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment).toLowerCase(),\r\n                            Format: td.tdFormat || th.thFormat,\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: columnsCache[td.td].pinned,\r\n                            PinnedWidth: thCasted.thPinnedWidth,\r\n                            GroupHeader: thCasted.thGroup,\r\n                            GroupAggregation: !!thCasted.thAggregation,\r\n                            Visible: columnsCache[td.td].visible,\r\n                            Wraps: false,\r\n                            Class: thCasted.thGroupClass || '',\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(itemToAdd);\r\n                    }\r\n                    else {\r\n                        this.RowContexts.push(ctx);\r\n                        this.TMPRowTDs[ctx] = [itemToAdd];\r\n                        contextFixeds[ctx] = isFixed ? 1 : 0;\r\n                    }\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,\r\n                    Orderable: th.thOrderable,\r\n                    Template: th.Template,\r\n                    Alignment: (th.thAlignment || this.DefaultAlignment).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;\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 = 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) {\r\n\r\n        this.selection_H.clearSelectionStatusExcluding(null);\r\n\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 = this.boundSource.find(t => t._group) ? this.boundSource.filter(t => t._group && !t._parent) : this.boundSource;\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(null);\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 = 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 ? 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) {\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 = '10';\r\n\r\n        let secondsInMs = parseInt(this.seconds, null) * 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     * Ottiene il contenuto dell'EsTd da utilizzare per la colonna specificata\r\n     * \r\n     * @param {string} column Colonna per cui cercare la cella\r\n     * @param {string} name Nome diretto per cercare il TD con l'ID. Questa variabile ha priorità rispetto a **column**\r\n     * \r\n     * @returns {TemplateRef<any>} Template da usare per la colonna\r\n     */\r\n    public findEsTd(column: string, name: string = null): TemplateRef<any> {\r\n        var EsTd = this.EsTdsDirective.find((item) => name ? item.td === name : item.tdForProperty === column);\r\n        // Name non trovato, fallback al nome della colonna\r\n        if (name && column && !EsTd)\r\n            EsTd = this.EsTdsDirective.find((item) => item.tdForProperty === column);\r\n        return EsTd ? EsTd.Template : null;\r\n    }\r\n\r\n    /**\r\n     * Ottiene il contenuto dell'editor EsTd da utilizzare per la colonna specificata\r\n     * \r\n     * @param {string} column Colonna per cui cercare l'editor\r\n     * @param {string} name Nome diretto per cercare l'Editor con l'ID. Questa variabile ha priorità rispetto a **column**\r\n     * \r\n     * @returns {TemplateRef<any>} Template da usare per la colonna\r\n     */\r\n    public findEditor(column: string, name: string = null): TemplateRef<any> {\r\n        var Editor = this.EsTdEditorDirectives.find((item) => name ? item.editor === name : item.editorForProperty === column);\r\n        // Name non trovato, fallback al nome della colonna\r\n        if (name && column && !Editor)\r\n            Editor = this.EsTdEditorDirectives.find((item) => item.editorForProperty === column);\r\n        return Editor ? Editor.Template : null;\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 = mode == 'view';\r\n        this.arrayMode = 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 internalWriteValue() {\r\n        this.internalWriteCall = true;\r\n        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;\r\n        let arrayIpp: number;\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 = arrayIpp;\r\n            this.arrayGoToPage(arrayPage);\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: TdElement, item: any) {\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 && this.Selection) {\r\n            this.logger.log(\"clearing previously selected range\");\r\n            this.selection_H.clearSelectionStatusExcluding(null);\r\n            this.rangeSelected = false;\r\n            return;\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            // 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: \" + (rowItem.PropertyName ? 'edit mode for property ' + rowItem.PropertyName : 'no property set, fallback to simple click'));\r\n                if (rowItem.PropertyName)\r\n                    this.setupUserEdit(rowItem, item);\r\n                else\r\n                    this.handleRowClick($event, item, this.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, this.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 ((<any>rowItem)._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, this.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[][]) => {\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        if (selection)\r\n            this.selection_H.clearSelectionStatusExcluding(null);\r\n\r\n        if (selection && !item.locked && !item._sep && !item._group)\r\n            this.handleClick($event, item);\r\n        else if (item._group)\r\n            this.handleGroupClick(item);\r\n\r\n        // Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping\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: TdElement, item: any) {\r\n        this.selection_H.clearSelectionStatusExcluding(null);\r\n        if (this.Editable && rowItem.PropertyName) {\r\n            let dynMode = this.DynamicRowColumnsDefinition?.length > 0;\r\n            (<any>rowItem)._editing = true;\r\n            (<any>rowItem).old_value = dynMode ? item.properties[rowItem.PropertyName] : item[rowItem.PropertyName];\r\n        }\r\n\r\n        this.cdr.detectChanges();\r\n        setTimeout(() => { 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     * @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: TdElement, item: any, columnIndex: number) {\r\n\r\n        let dynMode = this.DynamicRowColumnsDefinition?.length > 0;\r\n        let rowItm = <any>rowItem;\r\n        rowItm._editing = false;\r\n\r\n        let old = rowItm.old_value;\r\n        let niu = dynMode ? item.properties[rowItem.PropertyName] : item[rowItem.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, rowItem.ID, rowItem.PropertyName, old, niu)]);\r\n        this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);\r\n    }\r\n\r\n    // Range selection Experimentals\r\n\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;\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        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        }\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\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) {\r\n        this.EsTdsCache[`${event.id}_${event.hash}`] = event.self\r\n    }\r\n    //* Piango ancora\r\n\r\n    //* Gestione Embedding\r\n    showDialog(dlg: ModalDirective, elementRef: ElementRef) {\r\n        dlg.show();\r\n\r\n        if (this.emb.Embedded) {\r\n            this.rendererRef.setStyle(elementRef.nativeElement, \"padding-top\", \"5%\");\r\n            this.rendererRef.setStyle(elementRef.nativeElement, \"margin-left\", \"-110px\");\r\n            this.rendererRef.setStyle(elementRef.nativeElement, \"width\", \"calc(100% + 110px)\");\r\n            this.rendererRef.setStyle(elementRef.nativeElement, \"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\r\n    doFixBody(elementRef: ElementRef) {\r\n        let body = (<HTMLElement>elementRef.nativeElement).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\nexport class EsTdReference {\r\n    id: string;\r\n    hash: string; \r\n    self: EsTd;\r\n}","<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n    <div class=\"pull-right\">\r\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}}\r\n    </div>\r\n    <div class=\"pull-right m-t-2\">\r\n        <label class=\"est-switch\">\r\n            <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n            <div class=\"est-slider round\"></div>\r\n        </label>\r\n    </div>\r\n    <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n    <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n        <div class=\"est-loading-content\">\r\n            <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n        </div>\r\n    </div>\r\n\r\n    <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n        <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n    </div>\r\n\r\n    <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\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;\r\n        <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n    </div>\r\n\r\n    <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n        <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\"  [class.est-high-density]=\"HighCellDensity\">\r\n            <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n                <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n                <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n                    <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n                        <p class=\"est-hidden-view app-margin-bottom-0\">§</p>\r\n                    </th>\r\n                </tr>\r\n\r\n                <!-- Blocco header group -->\r\n                <ng-container *ngIf=\"RowThGroups\">\r\n                    <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n                        <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n                            [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n                            [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n                            class=\"est-text-center\">\r\n                            <ng-container *ngIf=\"cell.Pinned;\">\r\n                                <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n                            </ng-container>\r\n                            <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n                                {{cell.Content}}\r\n                            </ng-container>\r\n                        </th>\r\n                    </tr>\r\n                </ng-container>\r\n\r\n                <ng-container *ngIf=\"!RowThGroups\">\r\n                    <tr *ngIf=\"HasHeaderGroup\">\r\n                        <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n                        <th *ngIf=\"Export\"></th>\r\n                    </tr>\r\n\r\n                    <!-- Blocco header group secondario -->\r\n                    <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n                        <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n                        <th *ngIf=\"Export\"></th>\r\n                    </tr>\r\n                </ng-container>\r\n\r\n                <!-- Blocco effettivo degli header -->\r\n                <tr>\r\n                    <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n                        Selection: {{Selection}}\r\n                        HasPinnedColumns: {{HasPinnedColumns}}\r\n                        arrayMode: {{arrayMode}}\r\n                        viewMode: {{viewMode}}\r\n                        UseCustomCells: {{UseCustomCells}}\r\n                        RowTHs: {{!!RowTHs}}\r\n                        RowTHs.length: {{RowTHs?.length}}\r\n                        DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n                    </div>\r\n\r\n                    <!-- Aggiungo una checkbox se la selezione è attiva -->\r\n                    <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n                        <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n                    </th>\r\n\r\n                    <!-- Header che valgono per view mode e array mode -->\r\n                    <ng-container *ngIf=\"arrayMode || viewMode\">\r\n                        <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n                        <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n                            <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n                        </ng-container>\r\n\r\n                        <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle proprietà -->\r\n                        <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n                            <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n                            <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n                                <ng-container *ngIf=\"rowHeader.Visible\">\r\n                                    <th *ngIf=\"OrderByColumn\"  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>\r\n                                    <th *ngIf=\"!OrderByColumn\" 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>\r\n                                </ng-container>\r\n                            </ng-container>\r\n                        </ng-container>\r\n\r\n                        <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n                        <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n                            <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n                                <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n                                    <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n                                        <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n                                    </th>\r\n                                    <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n                                        <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n                                            [style.width.px]=\"rowHeader.PinnedWidth\"\r\n                                            es-th=\"{{rowHeader.ID}}\"\r\n                                            class=\"{{rowHeader.Class || ''}}\"\r\n                                            [class.est-pinned-internal-header]=\"true\"\r\n                                            [class.est-no-border]=\"true\"\r\n                                            [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n                                            [Pinned]=\"true\"\r\n                                            [Fixed]=\"rowHeader.Fixed\"\r\n                                            [Order]=\"rowHeader.Order\"\r\n                                            [Resizable]=\"ColumnsResizable\"\r\n                                            [Orderable]=\"rowHeader.Orderable\"\r\n                                            [OrderBy]=\"OrderByColumn\"\r\n                                            [SearchInProgress]=\"!!researchInProgress\"\r\n                                            (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n                                            (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n                                            <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n                                            <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n                                        </th>\r\n                                    </ng-container>\r\n                                </div>\r\n                            </th>\r\n                            <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n                                <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n                                    rowHeader: {{!!rowHeader}}\r\n                                    rowHeader.Visible: {{rowHeader?.Visible}}\r\n                                    rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n                                    rowHeader.Template: {{!!rowHeader.Template}}\r\n                                </div>\r\n\r\n                                <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n                                    es-th=\"{{rowHeader.ID}}\"\r\n                                    class=\"{{rowHeader.Class || ''}}\"\r\n                                    [style.text-align]=\" rowHeader.Alignment || null\"\r\n                                    [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n                                    [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n                                    [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n                                    [Order]=\"rowHeader.Order\"\r\n                                    [Resizable]=\"ColumnsResizable\"\r\n                                    [Orderable]=\"rowHeader.Orderable\"\r\n                                    [OrderBy]=\"OrderByColumn\"\r\n                                    [SearchInProgress]=\"!!researchInProgress\"\r\n                                    (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n                                    <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n                                    <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n                                </th>\r\n                            </ng-container>\r\n                        </ng-container>\r\n                    </ng-container>\r\n\r\n                    <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n                    <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n                    <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n                    <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n                        <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n                        <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n                            <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n                            <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n                                <div class=\"est-pointer\">\r\n                                    <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\r\n                                        <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n                                            {{'Columns Order' | localize : lc}}\r\n                                        </ng-container>\r\n                                        <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n                                            {{'Columns Visibility' | localize : lc}}\r\n                                        </ng-container>\r\n                                        <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n                                            {{'Columns Visibility and Order' | localize : lc}}\r\n                                        </ng-container>\r\n                                    </a>\r\n                                    <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n                                    <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n                                    <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n                                </div>\r\n                            </div>\r\n                        </div>\r\n                    </th>\r\n                </tr>\r\n            </thead>\r\n\r\n            <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n                <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n                <ng-container *ngIf=\"Selection\">\r\n                    <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n                </ng-container>\r\n\r\n                <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n                <ng-container *ngIf=\"!Selection\">\r\n                    <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n                </ng-container>\r\n            </tbody>\r\n        </table>\r\n    </div>\r\n\r\n    <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n        <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n    </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n    <ng-container *ngIf=\"!FirstBind\">\r\n        <!-- Pulsanti avanti-indietro di paginazione -->\r\n        <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n            <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n                <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n            </ng-container>\r\n            <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n                <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n            </ng-container>\r\n        </div>\r\n        <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n        <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n            <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n                <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n                <app-paging *ngIf=\"PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [GroupMode]=\"PagerOptions.Searches == 'groups'\" [AllSearch]=\"AllSearch\" [View]=\"PagerOptions.View\" (pagingSelected)=\"onItemsPerPageChanged($event);\"></app-paging>\r\n            </div>\r\n        </div>\r\n        <div class=\"clearfix\"></div>\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n    <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n        <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n        <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n        <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n    </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto è templatizzato -->\r\n<ng-template #TBodySelection let-templateOptions>\r\n    <ng-container *ngFor=\"let item of boundSource; let even = even; let i=index; trackBy: bodyTrackBy\">\r\n        <tr *ngIf=\"item._visible || (!Hierarchy && !ArrayGrouping)\"\r\n            [class]=\"item._rowClass ? item._rowClass : ''\"\r\n            [class.est-line-through]=\"item.removed || item.deleted\"\r\n            [class.est-pointer]=\"!item.locked\"\r\n            [class.est-white-selected]=\"item._selected && !item.locked\"\r\n            [class.est-rg]=\"item._group\"\r\n            [class.est-rg-sep]=\"item._sep\"\r\n            [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\r\n            (click)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n            (contextmenu)=\"onRightClick();\">\r\n\r\n            <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n                <input  type=\"checkbox\"\r\n                        [disabled]=\"templateOptions.selDisabled\"\r\n                        [class.est-pointer]=\"!item.locked\"\r\n                        [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n                        (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n            </td>\r\n            <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n            <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n            <ng-container *ngIf=\"!item._sep\">\r\n                <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n                <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n            </ng-container>\r\n            <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n        </tr>\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n    <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n        <tr *ngIf=\"item._visible || !Hierarchy\"\r\n            [class]=\"item._rowClass ? item._rowClass : ''\"\r\n            [class.est-line-through]=\"item.removed || item.deleted\"\r\n            [class.est-rg]=\"item._group\"\r\n            [class.est-rg-sep]=\"item._sep\"\r\n            (click)=\"handleRowClick($event, item, false)\">\r\n\r\n            <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n            <ng-container *ngIf=\"!item._sep\">\r\n                <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n                <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n            </ng-container>\r\n            <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n        </tr>\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n    <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n        <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n    </td>\r\n    <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n    <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n        <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\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>\r\n            <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><app-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);\"></app-paging></div>\r\n        </div>\r\n\r\n        <div class=\"est-rg-sep-flex-left\" *ngIf=\"RowGroupingPagingStyle == 'left'\">\r\n            <div class=\"est-rg-ipp\"><app-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);\"></app-paging></div>\r\n            <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n        </div>\r\n    </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n    <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n        <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n    <!-- Un po' triste ma questo è il metodo più semplice per gestire il cambio di modello -->\r\n     <!-- Manca da reimplementare il  [FocusSubject]=\"FocusSubject\" -->\r\n    <ng-container *ngIf=\"ctx.item.properties\">\r\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()\"></form-adaptive>\r\n    </ng-container>\r\n    <ng-container *ngIf=\"!ctx.item.properties\">\r\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()\"></form-adaptive>\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n    <!-- TODO: Formattare il valore in base a valType.type -->\r\n    <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n        {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n    </ng-container>\r\n    <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n        {{ctx.value}}\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n    <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n        <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n        <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n            <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n                <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n                    <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n                </td>\r\n                <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n                <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n                    <ng-container *ngIf=\"cell.Pinned\">\r\n                        <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n                                $implicit: item, \r\n                                index: index, \r\n                                cell: cell, \r\n                                pinned: true, \r\n                                selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n                                selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n                                selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n                                selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n                                selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n                            };\"></ng-container>\r\n                    </ng-container>\r\n                </ng-container>\r\n            </div>\r\n        </td>\r\n\r\n        <!-- Body effettivo della riga -->\r\n        <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n            <ng-container *ngIf=\"!cell.Pinned;\">\r\n                <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n                        $implicit: item, \r\n                        index: index, \r\n                        cell: cell, \r\n                        pinned: false, \r\n                        selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n                        selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n                        selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n                        selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n                        selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n                    };\"></ng-container>\r\n            </ng-container>\r\n        </ng-container>\r\n\r\n    </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\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\">\r\n\r\n    <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n    <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n        <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n            <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n        </ng-container>\r\n        <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n            <td class=\"est-col-min est-no-side-padding\"></td>\r\n        </ng-container>\r\n    </ng-container>\r\n\r\n    <!-----------------------------------------------------------------------------------------------------------------------\r\n    -   ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni:    -\r\n    -   . Generiche                                                                                                         -\r\n    -   . Gestione allineamento e colori per la modalità report                                                             -\r\n    -   . Gestioni grafiche particolari per il Pinned                                                                       -\r\n    -   . Gestione della selezione a singola cella in assenza di pinned                                                     -\r\n    -   . Gestione click classico e selezione multicella                                                                                          -\r\n    ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n    <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n        es-td=\"{{cell.Property || cell.ID}}\"\r\n        id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n        class=\"{{ cell.Class }}\"\r\n\r\n        [Context]=\"item._hash\"\r\n        [class.est-default-row-height]=\"!HighCellDensity\"\r\n        [class.est-white-selected]=\"item._selected\"\r\n        [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n        [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n        [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n        [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n        [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n        [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n        [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n        \r\n        [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n        [class.est-no-border]=\"pinned\"\r\n\r\n        [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n        [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n        [class.est-ltab-border]=\"cell.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n        [class.est-rtab-border]=\"cell.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n        \r\n        [class.est-selected-cell]=\"selStatus?.selected\"\r\n        [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n        [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n        [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n        [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n        [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n        [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n        [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n        [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n        (mousedown)=\"mousedown($event, cell, item)\"\r\n        (mouseenter)=\"mouseenter($event)\"\r\n        (mouseup)=\"mouseup($event)\"\r\n        (onCellGeneration)=\"registerCell($event)\"\r\n        (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n        <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n            <ng-container #DEBUG>\r\n                <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n            </ng-container>\r\n\r\n            <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n            <ng-container *ngIf=\"cell.Template\">\r\n                <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n                <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n            </ng-container>\r\n\r\n            <!-- 8%\r\n                Template non disponibile, può venire da\r\n                RoutePath in caso sia un link di una tabella dinamica\r\n                PropAccessor in caso di ReportRow (quindi oggetti con \"values\"  dentro),\r\n                o Renderer se modalità dinamica/standard (in qual caso il renderer è il default)\r\n            -->\r\n            <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n                <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n                <span *ngIf=\"cell.PropAccessor\">\r\n                    {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n                </span>\r\n\r\n                <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n                    <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n                </ng-container>\r\n            </ng-container>\r\n\r\n            <!-- 1% Se in modalità gerarchica metto il td per navigare la gerarchia -->\r\n            <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n            <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n            <ng-container *ngIf=\"cell.Content\">\r\n                {{cell.Content}}\r\n            </ng-container>\r\n        </div>\r\n\r\n        <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n            <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n        </div>\r\n    </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n    <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n    <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n    <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n    &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n    <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n        <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n        <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo  text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n    </ng-container>\r\n    <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n        <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n        <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo  text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n        <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n    </ng-container>\r\n    <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n    <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilità delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n    <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n        <div class=\"modal-content\">\r\n            <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n                <h5 class=\"modal-title pull-left\">\r\n                    <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n                        {{'Columns Order' | localize : lc}}\r\n                    </ng-container>\r\n                    <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n                        {{'Columns Visibility' | localize : lc}}\r\n                    </ng-container>\r\n                    <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n                        {{'Columns Visibility and Order' | localize : lc}}\r\n                    </ng-container>\r\n                </h5>\r\n                <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n                    <span aria-hidden=\"true\">&times;</span>\r\n                </button>\r\n            </div>\r\n            <div class=\"modal-body\">\r\n                <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n                    {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n                </div>\r\n                <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\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-->\r\n                    <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n                        <thead>\r\n                            <tr>\r\n                                <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n                                    <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n                                </th>\r\n                                <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n                                <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n                                <!--Filler-->\r\n                                <th></th>\r\n                                <!-- Pinner -->\r\n                                <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n                            </tr>\r\n                        </thead>\r\n                        <tbody\r\n                            cdkDropList\r\n                            [cdkDropListData]=\"TMPColumnsList\"\r\n                            (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n                            [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n                            class=\"est-dropbox\">\r\n\r\n                            <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n                                class=\"est-pointer est-droplist\"\r\n                                [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n                                [class.est-no-selection]=\"!item.visible\"\r\n                                cdkDrag\r\n                                [cdkDragData]=\"item\"\r\n                                [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n                                <td *ngIf=\"HiddenColumns\">\r\n                                    <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n                                </td>\r\n                                <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n                                    <ng-container *ngIf=\"item.template\">\r\n                                        <!-- Padri -->\r\n                                        <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n                                            (&nbsp;\r\n                                            <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n                                                <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n                                                <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n                                                <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n                                            </ng-container>\r\n                                            &nbsp;)\r\n                                        </span>\r\n                                        <!-- Template header originale -->\r\n                                        <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n                                    </ng-container>\r\n                                    <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n                                </td>\r\n                                <!--Filler-->\r\n                                <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n                                <!-- Pinner -->\r\n                                <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n                            </tr>\r\n                        </tbody>\r\n                    </table>\r\n                </div>\r\n            </div>\r\n            <div class=\"modal-footer\">\r\n                <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n                <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n            </div>\r\n        </div>\r\n    </div>\r\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}","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 } from './tokens';\r\nimport { EsTableModuleConfig } from './domain/configuration/EsTableModuleConfig';\r\n\r\nimport { TablePagerComponent } 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\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\n\r\nconst MODULES = [\r\n  CommonModule,\r\n  FormsModule,\r\n  RouterModule,\r\n  LocalizationModule,\r\n  ModalModule,\r\n  BsDropdownModule,\r\n  ContextMenuModule,\r\n  DragDropModule,\r\n  FormsAndValidationsModule,\r\n  TooltipModule\r\n]\r\n\r\nconst PUBLIC_ELEMENTS = [\r\n  // Direttive\r\n  EsTdDirective,\r\n  EsThDirective,\r\n  EsTdEditorDirective,\r\n\r\n  // Componenti\r\n  EsTableComponent,\r\n  TablePagerComponent,\r\n  ThTdProvider\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\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      ]\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;\r\n    /** Tipo dell'input */\r\n    type: InputType | string;\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","i4","i5","i1.Logger","i4.UtilitiesHandler","i6.CopyPasteDetector","i7.Logger"],"mappings":"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"}