@esfaenza/es-table 20.3.32 → 20.3.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/index.d.ts CHANGED
@@ -2687,6 +2687,8 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2687
2687
  ShowItemGroupsColumns: _angular_core.WritableSignal<boolean>;
2688
2688
  /** Mappa ownKey(string) -> figli diretti, per la modalità gerarchica */
2689
2689
  private hierChildren;
2690
+ /** Indice `chiave-propria → riga`: evita la scansione lineare per risalire ai padri */
2691
+ private hierByKey;
2690
2692
  /** Paginazione arrayMode */
2691
2693
  private arrayPage;
2692
2694
  /** Ordinamenti attivi (id -> 'ASC'|'DESC') */
@@ -2714,6 +2716,17 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2714
2716
  * Una colonna `Fixed` resta quindi sempre in testa e solo una pinnata può precederla.
2715
2717
  */
2716
2718
  private sortStructural;
2719
+ /**
2720
+ * Stile PER-COLONNA precalcolato (larghezza, offset sticky, inizio gruppo).
2721
+ * Il ciclo delle celle è annidato in quello delle righe, quindi senza questo ogni
2722
+ * valore si ricalcolerebbe righe×colonne volte a ogni render: qui si calcola una
2723
+ * volta per colonna e la cella fa un solo accesso per indice.
2724
+ */
2725
+ colStyles: _angular_core.Signal<{
2726
+ width: number | null;
2727
+ left: number | null;
2728
+ groupStart: boolean;
2729
+ }[]>;
2717
2730
  /** Numero di colonne pinnate visibili */
2718
2731
  pinnedCount: _angular_core.Signal<number>;
2719
2732
  /** true se c'è almeno una colonna pinnata */
@@ -2960,6 +2973,17 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2960
2973
  /** Espande/collassa un gruppo agendo solo sui flag `_visible` (nessuna ricostruzione) */
2961
2974
  toggleGroup(group: any): void;
2962
2975
  /** Item (foglia) appartenenti a un gruppo, a qualsiasi profondità */
2976
+ /**
2977
+ * Indice `chiave-gruppo → item[]`, ricalcolato una sola volta per ogni nuova
2978
+ * `boundSource()`. Le chiavi di gruppo sono composite (`IT¦Roma¦Shop`), quindi ogni
2979
+ * PREFISSO della chiave di un item è un suo gruppo antenato: l'indice si costruisce
2980
+ * in O(righe × profondità) con una sola passata.
2981
+ *
2982
+ * Serve perché la checkbox di gruppo chiama `groupSelectionState` DUE volte per
2983
+ * riga-gruppo a ogni ciclo di change-detection: con la vecchia `filter` su tutte le
2984
+ * righe erano 2·gruppi·righe confronti per render (quadratico nel numero di righe).
2985
+ */
2986
+ private groupItemsIndex;
2963
2987
  private groupItems;
2964
2988
  /** Stato di selezione aggregato di un gruppo, per la sua checkbox */
2965
2989
  groupSelectionState(group: any): 'all' | 'some' | 'none';
@@ -2976,13 +3000,19 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2976
3000
  /** Costruisce l'albero e applica la selezione; se mancano le chiavi torna la lista invariata */
2977
3001
  private applyHierarchy;
2978
3002
  private directChildren;
2979
- private hierDescendants;
2980
3003
  /** Selezione in cascata: propaga lo stato al sottoalbero e ricalcola gli antenati */
2981
3004
  private cascadeSelection;
2982
3005
  /** Ricostruisce ItemsSelection dai flag `_selected` correnti (usato dalla cascade) */
2983
3006
  private rebuildSelectionFromFlags;
2984
3007
  /** Stato indeterminato di una riga-padre in cascade (alcuni discendenti selezionati) */
2985
3008
  hierarchyIndeterminate(item: any): boolean;
3009
+ /**
3010
+ * Visita in profondità con USCITA ANTICIPATA al primo discendente selezionato.
3011
+ * È legata alla checkbox di OGNI riga, quindi girava a ogni ciclo di
3012
+ * change-detection: la versione precedente materializzava invece l'intero
3013
+ * sottoalbero in un array nuovo per ogni riga e per ogni render.
3014
+ */
3015
+ private hierAnyDescendantSelected;
2986
3016
  /** Espande/collassa un nodo dell'albero */
2987
3017
  toggleHierarchyNode(item: any): void;
2988
3018
  /** Indentazione (px) di una riga dell'albero in base al livello */
@@ -3169,7 +3199,16 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
3169
3199
  * anziché `cellDisplayText`, che conosce solo `property`/`id` e non il contenuto di
3170
3200
  * un template custom (era il bug del tooltip che mostrava sempre l'id colonna).
3171
3201
  */
3202
+ /**
3203
+ * Tooltip "intelligente" sulle celle a larghezza fissa: mostra il testo REALE
3204
+ * solo quando è troncato. In DELEGA sulla `<table>` (non un `(mouseenter)` per
3205
+ * cella): un listener per cella significava installarne uno per ogni `<td>` a
3206
+ * ogni creazione di riga — su una pagina da 50×43 sono 2.150 listener per
3207
+ * cambio pagina.
3208
+ */
3172
3209
  onCellHover(ev: MouseEvent): void;
3210
+ /** Ultima cella già valutata per il tooltip (evita di rimisurare a ogni mousemove) */
3211
+ private hoveredCell;
3173
3212
  /** Larghezza minima (px) di una colonna durante il resize */
3174
3213
  private readonly COL_MIN_W;
3175
3214
  /** Stato del resize in corso (colonna + coordinate iniziali) */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/es-table",
3
- "version": "20.3.32",
3
+ "version": "20.3.33",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },