@esfaenza/es-table 20.3.21 → 20.3.23

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
@@ -2352,6 +2352,15 @@ declare class EsTableModuleConfig {
2352
2352
  globalExportAclExpression?: string;
2353
2353
  }
2354
2354
 
2355
+ /** Cella di una riga di header-group multi-livello (span su N colonne-dato). */
2356
+ interface Est2HeaderGroupCell {
2357
+ id: string;
2358
+ span: number;
2359
+ isGroup: boolean;
2360
+ label: string;
2361
+ template: TemplateRef<any> | null;
2362
+ }
2363
+
2355
2364
  /** Specifica di una singola aggregazione estratta da un template `{func:format}` */
2356
2365
  interface Est2AggSpec {
2357
2366
  /** Colonna su cui calcolare l'aggregazione */
@@ -2378,13 +2387,16 @@ interface Est2Column {
2378
2387
  orderable: boolean;
2379
2388
  alignment: 'left' | 'right' | 'center';
2380
2389
  property: string | null;
2381
- type: string | null;
2390
+ type: InputType | null;
2382
2391
  source: {
2383
2392
  id: any;
2384
2393
  description: string;
2385
2394
  }[] | null;
2386
2395
  format: string | null;
2396
+ /** classe CSS della CELLA (`*td Class`) — applicata solo ai `<td>` */
2387
2397
  cssClass: string;
2398
+ /** classe CSS dell'HEADER (`*th Class`) — applicata solo ai `<th>` */
2399
+ headerClass: string;
2388
2400
  wrap: boolean;
2389
2401
  /** true se questa colonna è una chiave di raggruppamento (`thGroup`) */
2390
2402
  isGroup: boolean;
@@ -2412,18 +2424,44 @@ interface Est2Column {
2412
2424
  /** colonna Multi: indice dell'entry dentro l'array della proprietà */
2413
2425
  multiIndex?: number | null;
2414
2426
  }
2415
- /** Cella di una riga di header-group multi-livello (span su N colonne-dato). */
2416
- interface Est2HeaderGroupCell {
2417
- /** id del gruppo, o chiave sintetica per gli spacer */
2418
- id: string;
2419
- /** numero di colonne-dato coperte */
2420
- span: number;
2421
- /** true se è un vero header di gruppo (ha contenuto), false se spacer vuoto */
2422
- isGroup: boolean;
2423
- /** etichetta di fallback (quando non c'è un template proiettato) */
2424
- label: string;
2425
- /** template proiettato dell'header di gruppo (contenuto del `*th`) */
2426
- template: TemplateRef<any> | null;
2427
+
2428
+ /**
2429
+ * Riga della tabella. Oltre ai dati aperti del consumer (index signature) porta
2430
+ * un insieme FISSO di flag interni iniettati da grouping/hierarchy/selezione. Tiparli
2431
+ * qui documenta il contratto in un unico posto e riduce la superficie di refuso.
2432
+ */
2433
+ interface Est2Row {
2434
+ [k: string]: any;
2435
+ /** selezione di riga */
2436
+ _selected?: boolean;
2437
+ /** riga-gruppo (intestazione di un raggruppamento) */
2438
+ _group?: boolean;
2439
+ /** riga-dato (foglia) */
2440
+ _item?: boolean;
2441
+ /** visibile (collasso gruppo / gerarchia) */
2442
+ _visible?: boolean;
2443
+ /** gruppo/nodo espanso */
2444
+ _expanded?: boolean;
2445
+ /** livello gerarchico (1-based) */
2446
+ _level?: number;
2447
+ /** profondità di annidamento gruppo (0-based) */
2448
+ _grouplevel?: number;
2449
+ /** aggregazioni per colonna → funzione → valore formattato */
2450
+ _agg?: Map<string, Map<string, string>>;
2451
+ /** chiave path del gruppo/item */
2452
+ _thisKey?: string;
2453
+ /** chiave del gruppo padre */
2454
+ _parent?: string | null;
2455
+ /** numero di sotto-gruppi */
2456
+ _groupscount?: number;
2457
+ /** riga separatore (consumer) */
2458
+ _sep?: boolean;
2459
+ /** gerarchia: il nodo ha figli */
2460
+ parent?: boolean;
2461
+ /** id per trackBy (consumer) */
2462
+ _hash?: any;
2463
+ /** oggetti "generic": bag delle proprietà */
2464
+ properties?: Record<string, any>;
2427
2465
  }
2428
2466
  /**
2429
2467
  * es-table2 — riscrittura 2026 dell'es-table.
@@ -2472,6 +2510,7 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2472
2510
  SelectionDisabled: _angular_core.InputSignal<boolean>;
2473
2511
  readonly _SelectAll: _angular_core.InputSignal<boolean>;
2474
2512
  SelectAll: _angular_core.WritableSignal<boolean>;
2513
+ /** @deprecated NO-OP di parità v1 (cache selezione cross-pagina): dichiarato per il drop-in, non usato */
2475
2514
  readonly _UseSelectionCache: _angular_core.InputSignal<boolean>;
2476
2515
  UseSelectionCache: _angular_core.WritableSignal<boolean>;
2477
2516
  readonly _ShiftClick: _angular_core.InputSignal<boolean>;
@@ -2512,6 +2551,7 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2512
2551
  ContainerClass: _angular_core.WritableSignal<string>;
2513
2552
  EsTableHandledSearch: _angular_core.InputSignal<boolean>;
2514
2553
  SearchThrottle: _angular_core.InputSignal<number>;
2554
+ /** @deprecated NO-OP di parità v1 (ridimensionamento colonne): dichiarato per il drop-in, non implementato */
2515
2555
  readonly _ColumnsResizable: _angular_core.InputSignal<boolean>;
2516
2556
  ColumnsResizable: _angular_core.WritableSignal<boolean>;
2517
2557
  readonly _ColumnsPinnable: _angular_core.InputSignal<boolean>;
@@ -2545,13 +2585,17 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2545
2585
  SavePreferences: _angular_core.WritableSignal<boolean>;
2546
2586
  /** Nome della tabella: chiave per la persistenza delle preferenze colonne (localStorage) */
2547
2587
  Name: _angular_core.InputSignal<string>;
2588
+ /** @deprecated NO-OP di parità v1 (stile paginazione gruppi): dichiarato per il drop-in, non risolto/usato */
2548
2589
  readonly _RowGroupingPagingStyle: _angular_core.InputSignal<"left" | "right">;
2549
2590
  readonly _ShowItemGroupsColumns: _angular_core.InputSignal<boolean>;
2550
2591
  Editable: _angular_core.InputSignal<boolean>;
2551
2592
  RangeSelection: _angular_core.InputSignal<boolean>;
2552
2593
  ItemSourceProperty: _angular_core.InputSignal<string>;
2594
+ /** @deprecated NO-OP di parità v1 (header-group manuali, superati da `Parent:`/`Multi`) */
2553
2595
  HasHeaderGroup: _angular_core.InputSignal<boolean>;
2596
+ /** @deprecated NO-OP di parità v1 (seconda riga header-group manuale) */
2554
2597
  HasSecondaryHeaderGroup: _angular_core.InputSignal<boolean>;
2598
+ /** @deprecated NO-OP di parità v1 (drill-down gruppi server-side, non portato) */
2555
2599
  SearchView: _angular_core.InputSignal<AppSearch<any>>;
2556
2600
  /** Abilita il "patacchino" di auto-aggiornamento (toggle + intervallo) in alto a destra */
2557
2601
  readonly _AutoUpdate: _angular_core.InputSignal<boolean>;
@@ -2559,7 +2603,7 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2559
2603
  /** Provider esterno di `*th`/`*td` (pattern `td_th_provider`), passato per riferimento */
2560
2604
  EsThTdProvider?: ThTdProvider;
2561
2605
  onOrderChanged: EventEmitter<AppOrdering>;
2562
- onSearchRequest: EventEmitter<any>;
2606
+ onSearchRequest: EventEmitter<boolean>;
2563
2607
  onSelectionChanged: EventEmitter<ItemsSelection<any>>;
2564
2608
  onRemoval: EventEmitter<any>;
2565
2609
  onAbortRemoval: EventEmitter<any>;
@@ -2585,7 +2629,7 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2585
2629
  arrayMode: _angular_core.WritableSignal<boolean>;
2586
2630
  firstBind: _angular_core.WritableSignal<boolean>;
2587
2631
  /** Righe attualmente visualizzate (già paginate/ordinate) */
2588
- boundSource: _angular_core.WritableSignal<any[]>;
2632
+ boundSource: _angular_core.WritableSignal<Est2Row[]>;
2589
2633
  /** Colonne derivate dalle direttive `*th`/`*td` */
2590
2634
  columns: _angular_core.WritableSignal<Est2Column[]>;
2591
2635
  /** true se la tabella è pilotata dalle direttive (`*th`), false se template semplice */
@@ -2628,25 +2672,26 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2628
2672
  hasPinned: _angular_core.Signal<boolean>;
2629
2673
  /** Larghezza (px) della colonna di selezione quando sticky */
2630
2674
  private readonly SEL_STICKY_W;
2675
+ /**
2676
+ * Offset `left` (px) cumulativi delle colonne sticky, memoizzati: ricalcolati solo
2677
+ * quando cambiano `visibleColumns`/`Selection`. Prima `pinnedLeftPx` era O(n) per
2678
+ * chiamata e veniva invocato per OGNI cella pinnata del corpo → O(P²·R) per CD.
2679
+ */
2680
+ pinnedOffsets: _angular_core.Signal<number[]>;
2631
2681
  /** Offset `left` (px) di una colonna sticky all'indice `ci` in visibleColumns */
2632
2682
  pinnedLeftPx(ci: number): number;
2633
2683
  /** true se la tabella renderizza colonne strutturate (direttive/dinamica/report), non template semplici */
2634
2684
  usesColumns: _angular_core.Signal<boolean>;
2635
2685
  /**
2636
- * Righe di header-group multi-livello, dall'alto (root) verso il basso (padre
2637
- * immediato). Ricalcolate automaticamente su riordino/visibilità colonne.
2638
- *
2639
- * Ogni gruppo si allinea in BASSO: il padre immediato di una colonna sta sempre
2640
- * nella riga direttamente sopra la colonna; gli antenati più alti salgono. Le
2641
- * colonne senza gruppo (o con catena più corta) hanno celle-spacer vuote in alto.
2686
+ * Righe di header-group multi-livello (bottom-aligned). Delega al motore puro
2687
+ * `core/header-groups.ts`; ricalcolate automaticamente su riordino/visibilità.
2642
2688
  */
2643
2689
  headerGroupRows: _angular_core.Signal<Est2HeaderGroupCell[][]>;
2644
2690
  /** true se ci sono header-group da renderizzare */
2645
2691
  hasHeaderGroups: _angular_core.Signal<boolean>;
2646
2692
  /**
2647
- * Indici (in visibleColumns) delle colonne che aprono un nuovo gruppo-colonna,
2648
- * cioè dove il gruppo padre immediato cambia rispetto alla colonna precedente.
2649
- * Serve a disegnare i confini dei gruppi anche nel corpo della tabella.
2693
+ * Indici (in visibleColumns) delle colonne che aprono un nuovo gruppo-colonna.
2694
+ * Delega al motore puro; disegna i confini dei gruppi anche nel corpo tabella.
2650
2695
  */
2651
2696
  columnGroupBoundaries: _angular_core.Signal<Set<number>>;
2652
2697
  /** Numero di elementi totali (per il pager) */
@@ -2656,10 +2701,11 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2656
2701
  /** Numero totale di pagine per il pager */
2657
2702
  totalPages: _angular_core.Signal<any>;
2658
2703
  private readonly effectiveAllValue;
2659
- private inited;
2660
2704
  private onChange;
2661
2705
  private onTouched;
2662
2706
  constructor(ngControl: NgControl, cdr: ChangeDetectorRef, hostEl: ElementRef<HTMLElement>, prefService: PreferencesService, injector: Injector, defaults: EsTableDefaultable, debugMode: boolean, exportGlobalAcl: string);
2707
+ /** Controller di esportazione (E4) — logica in `controllers/export.controller.ts` */
2708
+ private exportCtrl;
2663
2709
  ngOnInit(): void;
2664
2710
  ngOnDestroy(): void;
2665
2711
  /** Risoluzione input: valore esplicito || default di progetto || hard default */
@@ -2691,14 +2737,13 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2691
2737
  private detectMode;
2692
2738
  private buildColumns;
2693
2739
  /**
2694
- * Srotola le colonne `*th Multi:true` sui dati: ogni entry unica
2695
- * `(header_group, header)` della proprietà-array diventa una colonna sintetica,
2696
- * e i livelli di `header_group` (separati da ">") alimentano gli header-group.
2740
+ * Srotola le colonne `*th Multi:true` sui dati. Delega al motore puro
2741
+ * `core/columns.ts`; qui applico allo stato le mappe th/parent aggiornate.
2697
2742
  */
2698
2743
  private buildMultiColumns;
2699
- /** Costruisce le colonne da una `EsTableColumnsDefinition[]` (modalità dinamica) */
2744
+ /** Colonne dinamiche delega al motore puro `core/columns.ts` */
2700
2745
  private buildDynamicColumns;
2701
- /** Costruisce le colonne da `report_columns` (modalità report): il valore è preso per indice */
2746
+ /** Colonne report delega al motore puro `core/columns.ts` */
2702
2747
  private buildReportColumns;
2703
2748
  /** Sceglie la sorgente delle colonne in base al modello: report → dinamica → direttive */
2704
2749
  private resolveColumns;
@@ -2826,21 +2871,16 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2826
2871
  onCellDblClick(item: any, col: Est2Column, r: number, c: number): void;
2827
2872
  commitEdit(item: any, col: Est2Column): void;
2828
2873
  cancelEdit(): void;
2874
+ /** Lettura bag-aware di una proprietà (gestisce gli oggetti "generic" con `properties`) */
2875
+ private readProp;
2876
+ /** Scrittura bag-aware di una proprietà */
2877
+ private writeProp;
2829
2878
  /** Valore grezzo su cui operano editing/paste (gestisce gli oggetti `properties`) */
2830
2879
  private rawCellValue;
2831
2880
  /** Scrive un valore GIÀ convertito e restituisce l'eventuale EsTableModelChange */
2832
2881
  private applyCoerced;
2833
- /**
2834
- * Converte una stringa (digitata/incollata) nel tipo della colonna, segnalando
2835
- * se è compatibile. `ok:false` = valore incompatibile col tipo (es. testo in una
2836
- * colonna numerica) → chi chiama avvisa e non scrive. Una stringa vuota è sempre
2837
- * valida e azzera il valore (null).
2838
- */
2882
+ /** Coercizione valore → delega al motore puro `core/coercion.ts` */
2839
2883
  private coerceValue;
2840
- /** Parsing numerico tollerante (separatori di migliaia + virgola/punto decimale). `NaN` = non numerico */
2841
- private toNumber;
2842
- /** Parsing date tollerante: `dd/MM/yyyy [HH:mm[:ss]]` o formati nativi. `null` = non valida */
2843
- private parseDateLoose;
2844
2884
  /** Testo visualizzato di una cella (usato dalla copia) */
2845
2885
  cellDisplayText(item: any, col: Est2Column): string;
2846
2886
  /** true se `childKey` è `ancestorKey` stesso o un suo discendente (senza collisioni di prefisso) */
@@ -2955,7 +2995,10 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2955
2995
  * colonne esterne.
2956
2996
  */
2957
2997
  /** Catena degli antenati-gruppo (root→padre immediato) di una colonna; `[]` se non raggruppata */
2998
+ /** Catena antenati di una colonna — delega al motore `core/header-groups.ts` */
2999
+ private ancestorChain;
2958
3000
  private columnChain;
3001
+ /** Riordino group-contiguo — delega al motore `core/header-groups.ts` */
2959
3002
  private enforceGroupContiguity;
2960
3003
  resetColumnsDialog(): void;
2961
3004
  exportMenuOpen: _angular_core.WritableSignal<boolean>;
@@ -2964,45 +3007,14 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
2964
3007
  toggleCornerMenu(): void;
2965
3008
  /** Chiude i menu a tendina del chrome quando si clicca fuori */
2966
3009
  onDocClick(): void;
2967
- /** Colonne da esportare (tutte o solo visibili) e con dato testuale */
2968
- private exportColumns;
2969
- /** Righe-dato correnti (esclude righe-gruppo) */
2970
- private exportRows;
2971
- /** Matrice [header, ...righe] con i valori visualizzati */
2972
- private buildExportMatrix;
2973
- /**
2974
- * Etichetta di intestazione per l'export self-contained: usa il testo header
2975
- * RENDERIZZATO letto dal DOM (rispetta il casing del template `*th`, es. "ID"),
2976
- * con fallback su `columnLabel` (headerText statico / id) se il DOM non è leggibile.
2977
- */
2978
- private headerLabel;
2979
- /** @ignore Evita esportazioni concorrenti (parità con l'`ExportHandler` originale) */
2980
- private exportInProgress;
2981
- /**
2982
- * `ExportService` risolto PIGRAMENTE e in modo difensivo: `undefined` = non ancora
2983
- * risolto, `null` = non disponibile. È `providedIn:'root'` ma la sua costruzione
2984
- * dipende da `LocalizationService`/`DateService`/`UtilityService`; se quella catena
2985
- * non è presente (test isolati, o consumer che non importa `@esfaenza/extensions`),
2986
- * `injector.get` lancia → catturo e faccio fallback al percorso self-contained.
2987
- */
2988
- private exportService;
2989
- private resolveExportService;
3010
+ /** Export delegato al controller `ExportController` (E4); chiude prima il menu chrome. */
2990
3011
  export(format?: 'CSV' | 'XLSX'): void;
2991
3012
  /**
2992
- * Delego all'`ExportService` originale replicando esattamente `ExportHandler.tryExport`:
2993
- * `export(data, format, fileName, type, columnsFilter, genericHeaders)`. Così l'export
2994
- * è guidato dai decoratori `@Export` della classe `type`, byte-compatibile con es-table1.
2995
- * Se il servizio non è disponibile (raro: è `providedIn:'root'` nel package), fallback
2996
- * al percorso self-contained mappando le colonne `*th`.
2997
- */
2998
- private exportViaService;
2999
- /** @deprecated Percorso di fallback self-contained (usato solo senza ExportService) */
3000
- private exportData;
3001
- private exportCsv;
3002
- private exportXlsx;
3003
- /** Nome file rispettando l'estensione richiesta */
3004
- private exportFileName;
3005
- private downloadBlob;
3013
+ * Mappa id-colonna testo header RENDERIZZATO letto dal DOM (rispetta il casing
3014
+ * del template `*th`, es. "ID"). Costruita in un'unica passata; usata dall'export
3015
+ * self-contained e dalla dialog colonne (prima due letture DOM separate).
3016
+ */
3017
+ private renderedHeaderTexts;
3006
3018
  cornerAction(id: string): void;
3007
3019
  rowClass(item: any): string;
3008
3020
  hasChrome(): boolean;
@@ -3019,7 +3031,6 @@ declare class EsTable2Component implements ControlValueAccessor, AfterContentIni
3019
3031
  cellValue(item: any, col: Est2Column): any;
3020
3032
  /** Entry Multi corrispondente a una cella (`item[multiProp][multiIndex]`) */
3021
3033
  multiCell(item: any, col: Est2Column): any;
3022
- trackByIndex: (i: number) => number;
3023
3034
  trackRow: (i: number, item: any) => any;
3024
3035
  trackCol: (_: number, col: Est2Column) => string;
3025
3036
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<EsTable2Component, [{ optional: true; self: true; }, null, null, { optional: true; }, null, { optional: true; }, { optional: true; }, { optional: true; }]>;
@@ -3317,4 +3328,4 @@ declare const EST2_EXPORT_GLOBAL_ACL: InjectionToken<string>;
3317
3328
  declare const EST2_DEFAULTS: InjectionToken<EsTableDefaultable>;
3318
3329
 
3319
3330
  export { AppOrdering, AppSearch, CornerMenuOption, EST2_DEBUG, EST2_DEFAULTS, EST2_EXPORT_GLOBAL_ACL, EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL, EsTable2Component, EsTableColumnsDefinition, EsTableComponent, EsTableDefaultable, EsTableModelChange, EsTableModule, EsTableModuleConfig, EsTableMultiValue, EsTableOperationDefinition, EsTablePagerComponent, EsTdDirective, EsTdEditorDirective, EsThDirective, GenericItem, Group, GroupAggregation, GroupFilter, GroupOrAggregation, ItemPropEditableReference, ItemsSelection, ReportColumn, ReportParam, ReportRow, ThTdProvider };
3320
- export type { Est2Column, Est2HeaderGroupCell, InputType };
3331
+ export type { Est2Column, Est2HeaderGroupCell, Est2Row, InputType };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/es-table",
3
- "version": "20.3.21",
3
+ "version": "20.3.23",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },