@esfaenza/es-table 11.2.67 → 11.2.70

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.
Files changed (33) hide show
  1. package/bundles/esfaenza-es-table.umd.js +403 -83
  2. package/bundles/esfaenza-es-table.umd.js.map +1 -1
  3. package/bundles/esfaenza-es-table.umd.min.js +1 -1
  4. package/bundles/esfaenza-es-table.umd.min.js.map +1 -1
  5. package/esfaenza-es-table.d.ts +3 -2
  6. package/esfaenza-es-table.metadata.json +1 -1
  7. package/esm2015/esfaenza-es-table.js +4 -3
  8. package/esm2015/lib/components/es-table/es_table.component.js +113 -27
  9. package/esm2015/lib/components/es-table/es_table.component.loc.js +4 -1
  10. package/esm2015/lib/core/CopyPasteDetector.js +19 -0
  11. package/esm2015/lib/core/handlers/SelectionHandler.js +173 -1
  12. package/esm2015/lib/core/handlers/UtilitiesHandler.js +2 -1
  13. package/esm2015/lib/directives/es_th.directive.js +8 -4
  14. package/esm2015/lib/domain/externals/EsTableModelChange.js +19 -0
  15. package/esm2015/lib/domain/externals/ItemPropEditableReference.js +4 -0
  16. package/esm2015/lib/domain/externals/appsearch/AppSearch.js +15 -14
  17. package/esm2015/lib/domain/internals/TdElement.js +1 -1
  18. package/esm2015/lib/domain/types.js +2 -0
  19. package/esm2015/lib/es-table.module.js +3 -1
  20. package/esm2015/public-api.js +4 -1
  21. package/fesm2015/esfaenza-es-table.js +350 -46
  22. package/fesm2015/esfaenza-es-table.js.map +1 -1
  23. package/lib/components/es-table/es_table.component.d.ts +37 -13
  24. package/lib/core/CopyPasteDetector.d.ts +6 -0
  25. package/lib/core/handlers/SelectionHandler.d.ts +68 -0
  26. package/lib/directives/es_th.directive.d.ts +9 -9
  27. package/lib/domain/externals/EsTableModelChange.d.ts +17 -0
  28. package/lib/domain/externals/ItemPropEditableReference.d.ts +18 -0
  29. package/lib/domain/externals/appsearch/AppSearch.d.ts +3 -2
  30. package/lib/domain/internals/TdElement.d.ts +4 -0
  31. package/lib/domain/types.d.ts +2 -0
  32. package/package.json +2 -2
  33. package/public-api.d.ts +3 -0
@@ -1,6 +1,6 @@
1
1
  import { QueryList, ChangeDetectorRef, EventEmitter, OnChanges, SimpleChanges, ElementRef, TemplateRef } from '@angular/core';
2
2
  import { ControlValueAccessor, NgControl } from '@angular/forms';
3
- import { UtilityService, ExportService, MessageService, DateService, CsvHeaders } from '@esfaenza/extensions';
3
+ import { UtilityService, ExportService, MessageService, DateService, CsvHeaders, ClipboardService } from '@esfaenza/extensions';
4
4
  import { LocalizationService } from '@esfaenza/localizations';
5
5
  import { PreferencesService } from '@esfaenza/preferences';
6
6
  import { ContextMenuComponent } from '@esfaenza/ngx-contextmenu';
@@ -16,6 +16,8 @@ import { ThElement } from "../../domain/internals/ThElement";
16
16
  import { TdElement } from "../../domain/internals/TdElement";
17
17
  import { ItemsSelection } from '../../domain/externals/appsearch/ItemsSelection';
18
18
  import { Group } from "../../domain/externals/appsearch/Group";
19
+ import { EsTableModelChange } from '../../domain/externals/EsTableModelChange';
20
+ import { ItemPropEditableReference } from '../../domain/externals/ItemPropEditableReference';
19
21
  import { EsTableDefaultable } from '../../domain/configuration/EsTableDefaultable';
20
22
  import { EsTdDirective } from '../../directives/es_td.directive';
21
23
  import { EsThDirective } from '../../directives/es_th.directive';
@@ -28,6 +30,7 @@ import { ReportModeHandler } from "../../core/handlers/ReportModeHandler";
28
30
  import { RowGroupingHandler } from "../../core/handlers/RowGroupingHandler";
29
31
  import { SelectionHandler } from "../../core/handlers/SelectionHandler";
30
32
  import { UtilitiesHandler } from "../../core/handlers/UtilitiesHandler";
33
+ import { CopyPasteDetector } from '../../core/CopyPasteDetector';
31
34
  import { Subject } from 'rxjs';
32
35
  /** Componente che permette di rappresentare una griglia di valori */
33
36
  export declare class EsTableComponent implements ControlValueAccessor, OnChanges {
@@ -38,10 +41,12 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
38
41
  lc: LocalizationService;
39
42
  cdr: ChangeDetectorRef;
40
43
  private utilities_H;
41
- private utiExts;
44
+ utiExts: UtilityService;
42
45
  private expExts;
43
- private dateExts;
46
+ dateExts: DateService;
44
47
  private msgExts;
48
+ private copyPasteDetector;
49
+ private clipboardService;
45
50
  export_H: ExportHandler;
46
51
  columnMetadata_H: ColumnMetadataHandler;
47
52
  dynamicMode_H: DynamicModeHandler;
@@ -50,8 +55,10 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
50
55
  reportMode_H: ReportModeHandler;
51
56
  rowGrouping_H: RowGroupingHandler;
52
57
  selection_H: SelectionHandler;
58
+ private copySubscription;
59
+ private pasteSubscription;
53
60
  /** @ignore */
54
- constructor(ngControl: NgControl, prefService: PreferencesService, deafults: EsTableDefaultable, locale: string, lc: LocalizationService, cdr: ChangeDetectorRef, utilities_H: UtilitiesHandler, utiExts: UtilityService, expExts: ExportService, dateExts: DateService, msgExts: MessageService);
61
+ constructor(ngControl: NgControl, prefService: PreferencesService, deafults: EsTableDefaultable, locale: string, lc: LocalizationService, cdr: ChangeDetectorRef, utilities_H: UtilitiesHandler, utiExts: UtilityService, expExts: ExportService, dateExts: DateService, msgExts: MessageService, copyPasteDetector: CopyPasteDetector, clipboardService: ClipboardService);
55
62
  /** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */
56
63
  FocusSubject: Subject<void>;
57
64
  /** Timer che verrà impostato a **doubleClickBufferMs** per capire se è stato effettuato un click singolo o un doubleclick */
@@ -288,7 +295,7 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
288
295
  /** Permette di decidere se, in modalità raggruppamento, mostrare o meno il valore delle colonne di gruppo negli oggetti finali. Di default sono nascosti */
289
296
  ShowItemGroupsColumns: any;
290
297
  /** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */
291
- UserEdits: boolean;
298
+ Editable: boolean;
292
299
  /** Evento che viene richiamato al cambio di oridnamento di una colonna */
293
300
  onOrderChanged: EventEmitter<AppOrdering>;
294
301
  /**
@@ -307,6 +314,8 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
307
314
  onRemoval: EventEmitter<any>;
308
315
  /** Evento richiamato all'annullamento di un'eliminazione */
309
316
  onAbortRemoval: EventEmitter<any>;
317
+ /** Evento richiamato alla modifica dei modelli bindati */
318
+ onModelChange: EventEmitter<EsTableModelChange[]>;
310
319
  /** Evento richiamato quando si clicca su un opzione definita nelle **CornerMenuOptions** */
311
320
  onCornerAction: EventEmitter<{
312
321
  id: string;
@@ -388,6 +397,12 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
388
397
  ArrayGrouping: boolean;
389
398
  /** Indica che l'es-table è basata sulle direttive (nuova modalità) */
390
399
  DirectivesBased: boolean;
400
+ /** Indica lo stato di selezione per singola cella */
401
+ selectionStatus: {
402
+ [index: number]: {
403
+ [index: number]: ItemPropEditableReference;
404
+ };
405
+ };
391
406
  /** Opzioni di paginazione */
392
407
  PagerOptions: {
393
408
  PagerCount: number;
@@ -507,6 +522,8 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
507
522
  */
508
523
  goToPageGroup(page: number, pager: GroupPager): void;
509
524
  /**
525
+ * @TODO Spostare in SelectionHandler
526
+ *
510
527
  * Gestisce i click sulla tabella solo per le righe a gruppo.
511
528
  * O rimuove gli elementi attualmente presenti o carica il contenuto del gruppo
512
529
  *
@@ -522,6 +539,8 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
522
539
  */
523
540
  globalCheckChanged(forcedVal?: boolean): void;
524
541
  /**
542
+ * @TODO Spostare in SelectionHandler
543
+ *
525
544
  * Gestisce i click sulla tabella, gestendo eventualmente anche gli Shift + Click per selezionare un range di oggetti
526
545
  *
527
546
  * @param {any} event Evento nativo HTML del click
@@ -603,11 +622,14 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
603
622
  * @param {any} $event Evento nativo javascript
604
623
  * @param {TdElement} rowItem Riferimento a binder della riga
605
624
  * @param {any} item Item che rappresenta il contesto su cui è stato effettuato un click
606
- */
607
- dbClickEditOrSingleClickRowSelection($event: any, rowItem: TdElement, item: any): void;
608
- /**
609
- * Ripulisce il timer utilizzato per capire se è stato effettuato un doppio click o meno
610
- */
625
+ * @param {number} rowIndex Indice della riga
626
+ */
627
+ dbClickEditOrSingleClickRowSelection($event: any, rowItem: TdElement, item: any, rowIndex: number): void;
628
+ /** Evento che gestisce il comando "Copia" buttando i valori selezionati nella clipboard in base al loro tipo */
629
+ private handleCopy;
630
+ /** 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 */
631
+ handlePaste(): void;
632
+ /** Ripulisce il timer utilizzato per capire se è stato effettuato un doppio click o meno */
611
633
  private clearCellClickTimer;
612
634
  /**
613
635
  * Handler click singolo su una riga
@@ -624,13 +646,15 @@ export declare class EsTableComponent implements ControlValueAccessor, OnChanges
624
646
  * Dopo che l'input è apparso, dopo un ciclo di Change Detection viene attivato il Subject collegato all'input che servirà a effettuare il focus
625
647
  *
626
648
  * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica
649
+ * @param {any} item Oggetto sopra il quale è stata attivata la modifica
627
650
  */
628
- setupUserEdit(rowItem: TdElement): void;
651
+ setupUserEdit(rowItem: TdElement, item: any): void;
629
652
  /**
630
- * La modifica dell'utente è terminata. Si reimposta la variabile relativa a "false" in modo da nascondere l'input di testo
653
+ * 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
631
654
  *
632
655
  * @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica
633
656
  * @param {any} item Oggetto sopra il quale è stata attivata la modifica
657
+ * @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
634
658
  */
635
- finalizeUserEdit(rowItem: TdElement, item: any): void;
659
+ finalizeUserEdit(rowItem: TdElement, item: any, columnIndex: number): void;
636
660
  }
@@ -0,0 +1,6 @@
1
+ import { Subject } from "rxjs";
2
+ export declare class CopyPasteDetector {
3
+ OnCopy: Subject<void>;
4
+ OnPaste: Subject<void>;
5
+ constructor();
6
+ }
@@ -1,6 +1,9 @@
1
1
  import { ItemsSelection } from "../../domain/externals/appsearch/ItemsSelection";
2
+ import { ItemPropEditableReference } from "../../domain/externals/ItemPropEditableReference";
2
3
  import { EsTableComponent } from "../../components/es-table/es_table.component";
4
+ import { EsThDirective } from "../../directives/es_th.directive";
3
5
  import { RowGroupingHandler } from "./RowGroupingHandler";
6
+ import { InputType } from '../../domain/types';
4
7
  /** Classe che gestisce le selezioni degli oggetti */
5
8
  export declare class SelectionHandler {
6
9
  private est;
@@ -21,6 +24,8 @@ export declare class SelectionHandler {
21
24
  private i_exclusionsCache;
22
25
  /** Cache di selezione Hash - Oggetto per la variabile **group_exclusions** dell'itemSelector. Facilita le operazioni di lookup via indice */
23
26
  private i_group_exclusionsCache;
27
+ /** Ultima cella selezionata singolarmente */
28
+ private lastSingleSelection;
24
29
  /** @ignore Costruttore */
25
30
  constructor(est: EsTableComponent, rgHandler: RowGroupingHandler);
26
31
  /** Ripulisce le cache di selezione */
@@ -32,6 +37,13 @@ export declare class SelectionHandler {
32
37
  * @param {ItemsSelection<any>} selectionItem Oggetti di selezione derivante dalla view o dall'oggetto per Array
33
38
  */
34
39
  evaluateSelection(items: any[], selectionItem: ItemsSelection<any>): void;
40
+ /**
41
+ * Precompila le informazioni sullo stato di selezione tutto a false per le celle della tabella
42
+ *
43
+ * @param {any[]} items Oggetti attualmente bindati sulla tabella
44
+ * @param {EsThDirective[]} ths Colonne su cui gli oggetti sono bindati
45
+ */
46
+ evaluateSingleCellSelection(items: any[], ths: EsThDirective[]): void;
35
47
  /**
36
48
  * Implementazione agnostica della valutazione delle selezioni degli oggetti. Richiede gli oggetti della vista attuale e l'itemSelector
37
49
  *
@@ -146,4 +158,60 @@ export declare class SelectionHandler {
146
158
  private evaluateSelected;
147
159
  /** Gestisce il comando di "Seleziona tutto in tutte le pagine" o il suo contrario, cioè "Reimposta selezione" */
148
160
  selectAllOrResetSelection(): void;
161
+ /**
162
+ * @TODO Spostare in SelectionHandler
163
+ *
164
+ * Registra la selezione singola su una cella sulla combo di comandi "CTRL + Click".
165
+ * Se viene premuto anche il tasto Shift viene creato un range di selezione il cui status di "selezionato" viene salvato nella
166
+ * matrice virtuale **selectionStatus**
167
+ *
168
+ * @param {any} event Evento Javascript di Click
169
+ * @param {number} row Indice della riga. Non è l'indice vero e proprio ma è l'ordinale (.ordinal) dell'oggetto bindato su quella riga
170
+ * @param {number} column Indice della colonna preso banalmente dall'ngIf sui thElement
171
+ */
172
+ singleCellSelection(event: any, row: number, column: number): void;
173
+ /**
174
+ * Helper per ripulire lo stato di selezione delle singole celle della tabella, ad esclusione di una singola coordinata
175
+ *
176
+ * @param {{row: number, column: number}} exclusion Coordinata da escludere nella pulizia
177
+ */
178
+ clearSelectionStatus(exclusion?: {
179
+ row: number;
180
+ column: number;
181
+ }): void;
182
+ /**
183
+ * Helper che esamina la matrice **selectionStatus** e ne estrappola gli elementi selezionati in una comoda matrice
184
+ *
185
+ * @returns {{ value: string, type: InputType, val_setter: Function }[][]} Matrice di elementi selezionati con la loro informazione sul tipo
186
+ */
187
+ getSelectionStatusSelection(): ItemPropEditableReference[][];
188
+ /**
189
+ * Helper per ripulire la selezione lato HTML
190
+ *
191
+ * @param {any} event Evento nativo Javascript
192
+ */
193
+ clearTextSelection(event: any): boolean;
194
+ /**
195
+ * Data la matrice di selezione generata dal metodo **getSelectionStatusSelection** genera la strigna vera e propria da copiare nella Clipboard
196
+ *
197
+ * @param {{ value: string, type: InputType }[][]} sel Matrice di selezione con valori e tipi dei dati selezionati
198
+ *
199
+ * @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
200
+ * in modo che siano compatibili anche con la copia su Excel
201
+ */
202
+ getClipbardTextFromSelection(sel: {
203
+ value: string;
204
+ type: InputType;
205
+ }[][]): string;
206
+ /**
207
+ * Ottiene la rappresentazione stringa di un valore dato un tipo
208
+ *
209
+ * @param {{ value: string, type: InputType }} valType Oggetto Valore - Tipo da cui estrapolare la rappresentazione del dato in stringa
210
+ *
211
+ * @returns {string} Valore convertito in stringa in base al tipo
212
+ */
213
+ getValueByType(valType: {
214
+ value: string;
215
+ type: InputType;
216
+ }): string;
149
217
  }
@@ -52,15 +52,15 @@ export declare class EsThDirective {
52
52
  thGroup: boolean;
53
53
  /** Indica che bisogna fare una aggregazione su questa colonna, a fronte di almeno un altra con un raggruppamento */
54
54
  thAggregation: string;
55
- /** Impostazioni per la modifica inline di questo campo: la **Property** di riferimento e il **Type** (a scelta fra quelli supportati dal form-adaptive) */
56
- thUserEdits: {
57
- Property: string;
58
- Type: 'string' | 'float' | 'date' | 'number' | 'int' | 'boolean' | 'enum' | 'autocomplete' | 'datetime' | 'time' | 'file' | 'currency';
59
- Source: {
60
- id: string;
61
- description: string;
62
- }[];
63
- };
55
+ /** Proprietà JS a cui si riferisce questa cella */
56
+ thProperty: string;
57
+ /** Tipo della proprietà JS a cui si riferisce questa cella. Se valorizzato l'utente la potrà modificare facendo doppio click */
58
+ thType: 'string' | 'float' | 'date' | 'number' | 'int' | 'boolean' | 'enum' | 'autocomplete' | 'datetime' | 'time' | 'file' | 'currency';
59
+ /** Sorgente dei valori disponibili per questa cella se il **Type** è di tipo 'enum' */
60
+ thSource: {
61
+ id: string;
62
+ description: string;
63
+ }[];
64
64
  /** Indica che questo header deve essere emesso una volta per ogni valore presente nella lista di **EsTableMultiValue** alla proprietà **th** dell'oggetto corrente */
65
65
  thMulti: boolean;
66
66
  /** Indica un contenuto statico da mostrare piuttosto che utilizzare il **Template**. Serve in caso questo oggetto venga generato programmaticamente */
@@ -0,0 +1,17 @@
1
+ /** Classe che rappresenta la modifica ad un singolo oggetto in una singola proprietà */
2
+ export declare class EsTableModelChange {
3
+ item: any;
4
+ header: string;
5
+ property: string;
6
+ old_value: string;
7
+ new_value: string;
8
+ /**
9
+ * Costruttore
10
+ * @param {any} item Oggetto modificato
11
+ * @param {string} header Nome dell'Header che è stato modificato
12
+ * @param {string} property Nome della proprietà modificata
13
+ * @param {string} old_value Vecchio valore della proprietà **property** dell'oggetto **item**
14
+ * @param {string} new_value Nuovo valore della proprietà **property** dell'oggetto **item**
15
+ */
16
+ constructor(item: any, header: string, property: string, old_value: string, new_value: string);
17
+ }
@@ -0,0 +1,18 @@
1
+ import { InputType } from "../types";
2
+ /** Classe che rappresenta il riferimento ad una proprietà di un oggetto bindato sulla tabella */
3
+ export declare class ItemPropEditableReference {
4
+ /** Stato di selezione della cella relativa */
5
+ selected: boolean;
6
+ /** Oggetto relativo su cui si modificano le proprietà */
7
+ item: any;
8
+ /** ID dell'header in modifica (riferimento al TH relativo) */
9
+ header: string;
10
+ /** Proprietà Javascript effettivamente in modifica */
11
+ property: string;
12
+ /** Tipo dell'input */
13
+ type: InputType;
14
+ /** Valore attuale della proprietà **property** dell'oggetto **item** */
15
+ value: string;
16
+ /** Funzione che imposta il nuovo valore della proprietà **property** dell'oggetto **item** ed aggiorna il **value** di questo oggetto */
17
+ val_setter?: (value: string) => any;
18
+ }
@@ -75,7 +75,8 @@ export declare class AppSearch<T> {
75
75
  */
76
76
  requestedgroups: GroupFilter[];
77
77
  /**
78
- * Permette di resettare questo oggetto ai valori di default
78
+ * Permette di resettare un AppSearch ai valori di default.
79
+ * Reso statico perché fra una deserializzazione e l'altra si potrebbe perdere il prototype del costruttore
79
80
  */
80
- reset(): void;
81
+ static reset(aps: AppSearch<any>): void;
81
82
  }
@@ -36,6 +36,10 @@ export interface TdElement {
36
36
  UserEdits?: {
37
37
  Property: string;
38
38
  Type: string;
39
+ Source?: {
40
+ id: string;
41
+ description: string;
42
+ }[];
39
43
  };
40
44
  /** Indica che l'oggetto di bindare per questo td è l'elemento all'indice Y della proprietà Z dove Y e Z vengono prese dall'**ID** scritto come Z_Y */
41
45
  Multi?: true;
@@ -0,0 +1,2 @@
1
+ /** Tipo che rappresenta gli input visualizzabili lato tabella */
2
+ export declare type InputType = 'string' | 'float' | 'date' | 'number' | 'int' | 'boolean' | 'enum' | 'autocomplete' | 'datetime' | 'time' | 'file' | 'currency';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@esfaenza/es-table",
3
- "version": "11.2.67",
3
+ "version": "11.2.70",
4
4
  "dependencies": {
5
5
  "tslib": "^2.0.0"
6
6
  },
@@ -8,7 +8,7 @@
8
8
  "@angular/common": "~11.2.14",
9
9
  "@angular/core": "~11.2.14",
10
10
  "@angular/material": "~11.2.13",
11
- "@esfaenza/extensions": "^11.2.19",
11
+ "@esfaenza/extensions": "^11.2.27",
12
12
  "@esfaenza/localizations": "^11.2.6",
13
13
  "@esfaenza/forms-and-validations": "^11.2.60",
14
14
  "@ctrl/ngx-csv": "4.0.0",
package/public-api.d.ts CHANGED
@@ -20,3 +20,6 @@ export * from './lib/domain/externals/appsearch/EsTableMultiValue';
20
20
  export * from './lib/domain/externals/report/ReportColumn';
21
21
  export * from './lib/domain/externals/report/ReportParam';
22
22
  export * from './lib/domain/externals/report/ReportRow';
23
+ export * from './lib/domain/externals/EsTableModelChange';
24
+ export * from './lib/domain/externals/ItemPropEditableReference';
25
+ export * from './lib/domain/types';