@esfaenza/es-table 11.2.37-beta2 → 11.2.40

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 (125) hide show
  1. package/bundles/esfaenza-es-table.umd.js +501 -510
  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 +1 -1
  6. package/esfaenza-es-table.metadata.json +1 -1
  7. package/esm2015/esfaenza-es-table.js +2 -2
  8. package/esm2015/lib/components/es-table/es_table.component.js +27 -13
  9. package/esm2015/lib/core/handlers/ColumnMetadataHandler.js +669 -0
  10. package/esm2015/lib/core/handlers/DynamicModeHandler.js +63 -0
  11. package/esm2015/lib/core/handlers/ExportHandler.js +106 -0
  12. package/esm2015/lib/core/handlers/HierarchyModeHandler.js +136 -0
  13. package/esm2015/lib/core/handlers/ItemsHandler.js +112 -0
  14. package/esm2015/lib/core/handlers/ReportModeHandler.js +70 -0
  15. package/esm2015/lib/core/handlers/RowGroupingHandler.js +481 -0
  16. package/esm2015/lib/core/handlers/SelectionHandler.js +526 -0
  17. package/esm2015/lib/core/handlers/UtilitiesHandler.js +155 -0
  18. package/esm2015/lib/directives/es_th.directive.js +4 -1
  19. package/esm2015/lib/domain/configuration/EsTableDefaultable.js +1 -1
  20. package/esm2015/lib/domain/externals/CornerMenuOption.js +4 -0
  21. package/esm2015/lib/domain/externals/EsTableColumnsDefinition.js +31 -0
  22. package/esm2015/lib/domain/externals/EsTableOperationDefinition.js +22 -0
  23. package/esm2015/lib/domain/externals/appsearch/AppOrdering.js +16 -0
  24. package/esm2015/lib/domain/externals/appsearch/AppSearch.js +35 -0
  25. package/esm2015/lib/domain/externals/appsearch/GenericItem.js +11 -0
  26. package/esm2015/lib/domain/externals/appsearch/Group.js +17 -0
  27. package/esm2015/lib/domain/externals/appsearch/GroupAggregation.js +16 -0
  28. package/esm2015/lib/domain/externals/appsearch/GroupFilter.js +14 -0
  29. package/esm2015/lib/domain/externals/appsearch/GroupOrAggregation.js +16 -0
  30. package/esm2015/lib/domain/externals/appsearch/ItemsSelection.js +23 -0
  31. package/esm2015/lib/domain/externals/report/ReportColumn.js +4 -0
  32. package/esm2015/lib/domain/externals/report/ReportDefinition.js +4 -0
  33. package/esm2015/lib/domain/externals/report/ReportOrder.js +4 -0
  34. package/esm2015/lib/domain/externals/report/ReportParam.js +4 -0
  35. package/esm2015/lib/domain/externals/report/ReportResult.js +4 -0
  36. package/esm2015/lib/domain/externals/report/ReportRow.js +4 -0
  37. package/esm2015/lib/domain/internals/CacheTriptic.js +16 -0
  38. package/esm2015/lib/domain/internals/EsTableColumn.js +27 -0
  39. package/esm2015/lib/domain/internals/GroupPager.js +22 -0
  40. package/esm2015/lib/domain/internals/GroupRouteFragment.js +17 -0
  41. package/esm2015/lib/domain/internals/TdElement.js +2 -0
  42. package/esm2015/lib/domain/internals/ThAggregation.js +16 -0
  43. package/esm2015/lib/domain/internals/ThElement.js +2 -0
  44. package/esm2015/public-api.js +18 -5
  45. package/fesm2015/esfaenza-es-table.js +451 -461
  46. package/fesm2015/esfaenza-es-table.js.map +1 -1
  47. package/lib/components/es-table/es_table.component.d.ts +25 -5
  48. package/lib/core/handlers/{classes/ColumnMetadataHandler.d.ts → ColumnMetadataHandler.d.ts} +9 -7
  49. package/lib/core/handlers/{classes/DynamicModeHandler.d.ts → DynamicModeHandler.d.ts} +2 -2
  50. package/lib/core/handlers/{classes/ExportHandler.d.ts → ExportHandler.d.ts} +1 -1
  51. package/lib/core/handlers/{classes/HierarchyModeHandler.d.ts → HierarchyModeHandler.d.ts} +1 -1
  52. package/lib/core/handlers/{classes/ItemsHandler.d.ts → ItemsHandler.d.ts} +1 -1
  53. package/lib/core/handlers/{classes/ReportModeHandler.d.ts → ReportModeHandler.d.ts} +2 -2
  54. package/lib/core/handlers/{classes/RowGroupingHandler.d.ts → RowGroupingHandler.d.ts} +8 -3
  55. package/lib/core/handlers/{classes/SelectionHandler.d.ts → SelectionHandler.d.ts} +3 -3
  56. package/lib/core/handlers/{classes/UtilitiesHandler.d.ts → UtilitiesHandler.d.ts} +0 -0
  57. package/lib/directives/es_th.directive.d.ts +3 -1
  58. package/lib/domain/configuration/EsTableDefaultable.d.ts +1 -0
  59. package/lib/domain/externals/{classes/CornerMenuOption.d.ts → CornerMenuOption.d.ts} +0 -0
  60. package/lib/domain/externals/{classes/EsTableColumnsDefinition.d.ts → EsTableColumnsDefinition.d.ts} +0 -0
  61. package/lib/domain/externals/{classes/EsTableOperationDefinition.d.ts → EsTableOperationDefinition.d.ts} +0 -0
  62. package/lib/domain/externals/{classes/appsearch → appsearch}/AppOrdering.d.ts +0 -0
  63. package/lib/domain/externals/{classes/appsearch → appsearch}/AppSearch.d.ts +0 -0
  64. package/lib/domain/externals/{classes/appsearch → appsearch}/GenericItem.d.ts +0 -0
  65. package/lib/domain/externals/{classes/appsearch → appsearch}/Group.d.ts +0 -0
  66. package/lib/domain/externals/{classes/appsearch → appsearch}/GroupAggregation.d.ts +0 -0
  67. package/lib/domain/externals/{classes/appsearch → appsearch}/GroupFilter.d.ts +0 -0
  68. package/lib/domain/externals/{classes/appsearch → appsearch}/GroupOrAggregation.d.ts +0 -0
  69. package/lib/domain/externals/{classes/appsearch → appsearch}/ItemsSelection.d.ts +1 -1
  70. package/lib/domain/externals/{classes/report → report}/ReportColumn.d.ts +0 -0
  71. package/lib/domain/externals/{classes/report → report}/ReportDefinition.d.ts +3 -1
  72. package/lib/domain/externals/{classes/report → report}/ReportOrder.d.ts +0 -0
  73. package/lib/domain/externals/{classes/report → report}/ReportParam.d.ts +0 -0
  74. package/lib/domain/externals/{classes/report → report}/ReportResult.d.ts +2 -1
  75. package/lib/domain/externals/{classes/report → report}/ReportRow.d.ts +0 -0
  76. package/lib/domain/internals/{classes/CacheTriptic.d.ts → CacheTriptic.d.ts} +0 -0
  77. package/lib/domain/internals/{classes/EsTableColumn.d.ts → EsTableColumn.d.ts} +2 -1
  78. package/lib/domain/internals/{classes/GroupPager.d.ts → GroupPager.d.ts} +4 -1
  79. package/lib/domain/internals/{classes/GroupRouteFragment.d.ts → GroupRouteFragment.d.ts} +0 -0
  80. package/lib/domain/internals/{classes/TdElement.d.ts → TdElement.d.ts} +17 -1
  81. package/lib/domain/internals/{classes/ThAggregation.d.ts → ThAggregation.d.ts} +0 -0
  82. package/lib/domain/internals/{classes/ThElement.d.ts → ThElement.d.ts} +0 -0
  83. package/package.json +1 -1
  84. package/public-api.d.ts +17 -1
  85. package/esm2015/lib/core/handlers/classes/ColumnMetadataHandler.js +0 -667
  86. package/esm2015/lib/core/handlers/classes/DynamicModeHandler.js +0 -64
  87. package/esm2015/lib/core/handlers/classes/ExportHandler.js +0 -106
  88. package/esm2015/lib/core/handlers/classes/HierarchyModeHandler.js +0 -136
  89. package/esm2015/lib/core/handlers/classes/ItemsHandler.js +0 -112
  90. package/esm2015/lib/core/handlers/classes/ReportModeHandler.js +0 -70
  91. package/esm2015/lib/core/handlers/classes/RowGroupingHandler.js +0 -473
  92. package/esm2015/lib/core/handlers/classes/SelectionHandler.js +0 -527
  93. package/esm2015/lib/core/handlers/classes/UtilitiesHandler.js +0 -155
  94. package/esm2015/lib/core/handlers/index.js +0 -10
  95. package/esm2015/lib/domain/externals/classes/CornerMenuOption.js +0 -4
  96. package/esm2015/lib/domain/externals/classes/EsTableColumnsDefinition.js +0 -31
  97. package/esm2015/lib/domain/externals/classes/EsTableOperationDefinition.js +0 -22
  98. package/esm2015/lib/domain/externals/classes/appsearch/AppOrdering.js +0 -16
  99. package/esm2015/lib/domain/externals/classes/appsearch/AppSearch.js +0 -35
  100. package/esm2015/lib/domain/externals/classes/appsearch/GenericItem.js +0 -11
  101. package/esm2015/lib/domain/externals/classes/appsearch/Group.js +0 -17
  102. package/esm2015/lib/domain/externals/classes/appsearch/GroupAggregation.js +0 -16
  103. package/esm2015/lib/domain/externals/classes/appsearch/GroupFilter.js +0 -14
  104. package/esm2015/lib/domain/externals/classes/appsearch/GroupOrAggregation.js +0 -16
  105. package/esm2015/lib/domain/externals/classes/appsearch/ItemsSelection.js +0 -23
  106. package/esm2015/lib/domain/externals/classes/report/ReportColumn.js +0 -4
  107. package/esm2015/lib/domain/externals/classes/report/ReportDefinition.js +0 -4
  108. package/esm2015/lib/domain/externals/classes/report/ReportOrder.js +0 -4
  109. package/esm2015/lib/domain/externals/classes/report/ReportParam.js +0 -4
  110. package/esm2015/lib/domain/externals/classes/report/ReportResult.js +0 -4
  111. package/esm2015/lib/domain/externals/classes/report/ReportRow.js +0 -4
  112. package/esm2015/lib/domain/externals/index.js +0 -18
  113. package/esm2015/lib/domain/index.js +0 -3
  114. package/esm2015/lib/domain/internals/classes/CacheTriptic.js +0 -16
  115. package/esm2015/lib/domain/internals/classes/EsTableColumn.js +0 -26
  116. package/esm2015/lib/domain/internals/classes/GroupPager.js +0 -21
  117. package/esm2015/lib/domain/internals/classes/GroupRouteFragment.js +0 -17
  118. package/esm2015/lib/domain/internals/classes/TdElement.js +0 -2
  119. package/esm2015/lib/domain/internals/classes/ThAggregation.js +0 -16
  120. package/esm2015/lib/domain/internals/classes/ThElement.js +0 -2
  121. package/esm2015/lib/domain/internals/index.js +0 -8
  122. package/lib/core/handlers/index.d.ts +0 -9
  123. package/lib/domain/externals/index.d.ts +0 -17
  124. package/lib/domain/index.d.ts +0 -2
  125. package/lib/domain/internals/index.d.ts +0 -7
@@ -336,23 +336,6 @@
336
336
  return value;
337
337
  }
338
338
 
339
- /**
340
- * Classe che identifica un ordinamento di una colonna
341
- */
342
- var AppOrdering = /** @class */ (function () {
343
- /**
344
- * Costruttore
345
- *
346
- * @param {string} id ID della colonna a cui si vogliono applicare ordinamenti, deve combaciare all'id messo nella dichiarazione dell'ES-TD/TH
347
- * @param {'DESC' | 'ASC' } order Ordinamento da applicare alla colonna, Discendente/Ascendente, default 'null' per indicare assenza di ordine
348
- */
349
- function AppOrdering(id, order) {
350
- this.id = id;
351
- this.order = order;
352
- }
353
- return AppOrdering;
354
- }());
355
-
356
339
  /**
357
340
  * Classe che identifica una ricerca paginata in tutte le sue sfumature (di grigio)
358
341
  */
@@ -389,65 +372,6 @@
389
372
  return AppSearch;
390
373
  }());
391
374
 
392
- /** Classe che identifica una colonna. Utilizzata in modalità "Colonne dinamiche" */
393
- var EsTableColumnsDefinition = /** @class */ (function () {
394
- /**
395
- * Costruttore
396
- *
397
- * @param {string} description Descrizione della colonna
398
- * @param {string} propertyName Nome della proprietà del modello in cui sono contenuti i dati da visualizzare per questa colonna
399
- * @param {string} routePath Route di navigazione. Es. "['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]"
400
- * @param {string[]} routeParameterProperties Proprietà da bindare a **routePath** per generare la route completa.
401
- * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. ["iditem", "iditem2"]
402
- * @param {'ASC' | 'DESC' } dataOrder Ordinamento dei dati presentati in questa colonna
403
- * @param {number} columnOrder Ordinamento di questa colonna
404
- * @param {boolean} visible Visibilità o meno della colonna
405
- * @param {string} clss Classe da applicare sia ai TD che ai TH relativi a questa colonna
406
- * @param {boolean} orderable Indica se la colonna è ordinabile o no (nel senso ASC / DESC / NONE)
407
- * @param {boolean} headerWraps Indica se il testo dell'header dev'essere wrappato all'interno del th. Di default no.
408
- */
409
- function EsTableColumnsDefinition(description, propertyName, routePath, routeParameterProperties, dataOrder, columnOrder, visible, clss, orderable, headerWraps) {
410
- if (routePath === void 0) { routePath = null; }
411
- if (routeParameterProperties === void 0) { routeParameterProperties = null; }
412
- if (dataOrder === void 0) { dataOrder = null; }
413
- if (columnOrder === void 0) { columnOrder = null; }
414
- if (visible === void 0) { visible = true; }
415
- if (clss === void 0) { clss = null; }
416
- if (orderable === void 0) { orderable = true; }
417
- if (headerWraps === void 0) { headerWraps = false; }
418
- this.description = description;
419
- this.propertyName = propertyName;
420
- this.routePath = routePath;
421
- this.routeParameterProperties = routeParameterProperties;
422
- this.dataOrder = dataOrder;
423
- this.columnOrder = columnOrder;
424
- this.visible = visible;
425
- this.clss = clss;
426
- this.orderable = orderable;
427
- this.headerWraps = headerWraps;
428
- }
429
- return EsTableColumnsDefinition;
430
- }());
431
-
432
- /** Classe che definisce un oggetto generico come lista di proprietà-valore */
433
- var GenericItem = /** @class */ (function () {
434
- /** @ignore */
435
- function GenericItem() {
436
- this._selected = false;
437
- this._rowClass = null;
438
- this._hash = null;
439
- this.properties = {};
440
- }
441
- return GenericItem;
442
- }());
443
-
444
- /** Indica un'opzione cliccabile nel Corner Menù della tabella (il menù richiamabile dai 3 pallini verticli in alto a destra) */
445
- var CornerMenuOption = /** @class */ (function () {
446
- function CornerMenuOption() {
447
- }
448
- return CornerMenuOption;
449
- }());
450
-
451
375
  /** Definizione generica di un report che può o no disporre di paginazione/export e la cui richiesta è basata su uno o più parametri */
452
376
  var ReportDefinition = /** @class */ (function () {
453
377
  function ReportDefinition() {
@@ -455,64 +379,6 @@
455
379
  return ReportDefinition;
456
380
  }());
457
381
 
458
- /** Classe che identifica una direttiva di ordinamento per un report */
459
- var ReportOrder = /** @class */ (function () {
460
- function ReportOrder() {
461
- }
462
- return ReportOrder;
463
- }());
464
-
465
- /** Classe che rappresenta una colonna di un report */
466
- var ReportColumn = /** @class */ (function () {
467
- function ReportColumn() {
468
- }
469
- return ReportColumn;
470
- }());
471
-
472
- /** Classe che rappresenta una lista di oggetti generati da un report */
473
- var ReportResult = /** @class */ (function () {
474
- function ReportResult() {
475
- }
476
- return ReportResult;
477
- }());
478
-
479
- /** Classe che rappresenta i valori delle proprietà di un oggetto Report */
480
- var ReportRow = /** @class */ (function () {
481
- function ReportRow() {
482
- }
483
- return ReportRow;
484
- }());
485
-
486
- /** Classe che identifica un parametro generico per un report */
487
- var ReportParam = /** @class */ (function () {
488
- function ReportParam() {
489
- }
490
- return ReportParam;
491
- }());
492
-
493
- /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
494
- var EsTableOperationDefinition = /** @class */ (function () {
495
- /**
496
- * Costruttore
497
- *
498
- * @param {string} id Codice dell'operazione
499
- * @param {string} title Titolo dell'operazione, da presentare all'utente su hover della cella
500
- * @param {string} iconClass Classe che fornisca un iconcina Es. "fa fa-remove"
501
- * @param {string} text Eventuale testo presentato nella cella, genericamente va in alternativa a **iconClass**
502
- * @param {string} conditionField Indica il campo dell'oggetto sottostante su cui verificare la visibilità o meno di questa icona
503
- * @param {string} conditionValue Indica il valore che la proprietà **conditionField** dell'oggetto sottostante deve assumere affinché questa opzione si veda
504
- */
505
- function EsTableOperationDefinition(id, title, iconClass, text, conditionField, conditionValue) {
506
- this.id = id;
507
- this.title = title;
508
- this.iconClass = iconClass;
509
- this.text = text;
510
- this.conditionField = conditionField;
511
- this.conditionValue = conditionValue;
512
- }
513
- return EsTableOperationDefinition;
514
- }());
515
-
516
382
  /** Identifica una selezione applicabile agli oggetti presentati in una tabella */
517
383
  var ItemsSelection = /** @class */ (function () {
518
384
  /**
@@ -537,41 +403,6 @@
537
403
  return ItemsSelection;
538
404
  }());
539
405
 
540
- /** Classe che rappresenta un Gruppo con le proprie aggregazioni */
541
- var Group = /** @class */ (function () {
542
- /**
543
- * Costruttore
544
- *
545
- * @param {string} column ID della colonna raggruppata
546
- * @param {number} count Numero di elementi raggruppati sotto questa colonna
547
- * @param {string} value Valore del Gruppo
548
- */
549
- function Group(column, count, value) {
550
- this.column = column;
551
- this.count = count;
552
- this.value = value;
553
- this.aggregations = [];
554
- }
555
- return Group;
556
- }());
557
-
558
- /** Classe che rappresenta un'aggregazione */
559
- var GroupAggregation = /** @class */ (function () {
560
- /**
561
- * Costruttore
562
- *
563
- * @param {string} column ID della colonna aggregata
564
- * @param {'min' | 'max' | 'sum' } aggregation Aggregazione da effettuare su questa colonna
565
- * @param {string} value Valore dell'aggregazione
566
- */
567
- function GroupAggregation(column, aggregation, value) {
568
- this.column = column;
569
- this.aggregation = aggregation;
570
- this.value = value;
571
- }
572
- return GroupAggregation;
573
- }());
574
-
575
406
  /** Classe che rappresenta un filtro su un gruppo */
576
407
  var GroupFilter = /** @class */ (function () {
577
408
  /**
@@ -587,122 +418,11 @@
587
418
  return GroupFilter;
588
419
  }());
589
420
 
590
- /** Classe che rappresenta o un gruppo o una aggregazione su una colonna. Usata solo internamente */
591
- var GroupOrAggregation = /** @class */ (function () {
592
- /**
593
- * Costruttore
594
- *
595
- * @param {string} column Colonna su cui è presente o un gruppo o un'aggregazione
596
- * @param {'min' | 'max' | 'sum' } aggregation Aggregazione presente sulla **column**. Se questo campo è nullo significa che è un gruppo.
597
- * @param {'string' | 'date' | 'number'} datatype Tipo di dati contenuto nella colonna **column** se non c'è alcuna aggregazione è inutile, pertanto non sarà valorizzato
598
- */
599
- function GroupOrAggregation(column, aggregation, datatype) {
600
- this.column = column;
601
- this.aggregation = aggregation;
602
- this.datatype = datatype;
603
- }
604
- return GroupOrAggregation;
605
- }());
606
-
607
- /** 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 */
608
- var CacheTriptic = /** @class */ (function () {
609
- /**
610
- * Costruttore
611
- *
612
- * @param {Map<string, any>} cache Cache Chiave-Oggetto
613
- * @param {Map<string, number>} index_cache Cache Indice-Oggetto
614
- * @param {any[]} array Array contenente gli oggetti
615
- */
616
- function CacheTriptic(cache, index_cache, array) {
617
- this.cache = cache;
618
- this.index_cache = index_cache;
619
- this.array = array;
620
- }
621
- return CacheTriptic;
622
- }());
623
-
624
- /** Definizione di una colonna, utilizzato nella dialog che permette di modificare le posizioni e le visibilità */
625
- var EsTableColumn = /** @class */ (function () {
626
- /**
627
- * Costruttore
628
- *
629
- * @param {string} id Id colonna
630
- * @param {string} description Descrizione (Header)
631
- * @param {boolean} visible Indica se di default mostrarla o meno
632
- * @param {boolean} fixed Indica se è una colonna fixed
633
- * @param {boolean} pinned Indica se è una colonna pinnata
634
- * @param {number} pinnedWidth Indica la dimensione da assegnare a questa colonna quando è pinnata
635
- * @param {TemplateRef<any>} template Indica il template da usare per mostrare il testo dell'Header
636
- * @param {TemplateRef<any>[]} parentTemplates Indica la lista di template padri collegata a questo header
637
- */
638
- function EsTableColumn(id, description, visible, fixed, pinned, pinnedWidth, template, parentTemplates) {
639
- this.id = id;
640
- this.description = description;
641
- this.visible = visible;
642
- this.fixed = fixed;
643
- this.pinned = pinned;
644
- this.pinnedWidth = pinnedWidth;
645
- this.template = template;
646
- this.parentTemplates = parentTemplates;
647
- }
648
- return EsTableColumn;
649
- }());
650
-
651
- /** Classe che rappresenta un separatore da inserire fra gli oggetti dell'es-table per le operazioni di paginazione dei raggruppamenti per riga */
652
- var GroupPager = /** @class */ (function () {
653
- /**
654
- * Costruttore
655
- *
656
- * @param {number} groupLevel Livello del gruppo a cui questo separatore fa riferimento
657
- * @param {string} parentKey Chiave del gruppo parent se esiste
658
- * @param {AppSearch<any>} view Vista di ricerca collegata a questo elemento
659
- * @param {'groups' | 'items'} searches Indica che cosa cerca questo separatore, se sottogruppi o oggetti
660
- */
661
- function GroupPager(_grouplevel, _thisRoute, _parent, view, searches) {
662
- this._grouplevel = _grouplevel;
663
- this._thisRoute = _thisRoute;
664
- this._parent = _parent;
665
- this.view = view;
666
- this.searches = searches;
667
- this._sep = true;
668
- this.buttons = [];
669
- }
670
- return GroupPager;
671
- }());
672
-
673
- /**
674
- * 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
675
- * per arrivare ad una ricerca su sottogruppi o elementi relativi
676
- */
677
- var GroupRouteFragment = /** @class */ (function () {
678
- /**
679
- * Costruttore
680
- *
681
- * @param {string} column Colonna di raggruppamento
682
- * @param {string} value Valore della colonna di raggruppamento
683
- */
684
- function GroupRouteFragment(column, value) {
685
- this.column = column;
686
- this.value = value;
687
- }
688
- return GroupRouteFragment;
689
- }());
690
-
691
- /** Classe rappresentante una singola aggregazione effettuata su una colonna */
692
- var ThAggregation = /** @class */ (function () {
693
- /**
694
- * Costruttore
695
- *
696
- * @param {'min' | 'max' | 'sum'} func Funzione di aggergazione, può essere **min**, **max** o **sum**
697
- * @param {string} format Formato richiesto per il valore dell'aggregazione
698
- * @param {string} match Match intero del pezzo di testo da cui si è estrapolata l'aggregazione, da rimpiazzare col valore calcolato
699
- */
700
- function ThAggregation(func, format, match) {
701
- this.func = func;
702
- this.format = format;
703
- this.match = match;
421
+ /** Raccolta di tutti gli Input dell'EsTable a cui può essere logicamente sensato assegnare default per progetto */
422
+ var EsTableDefaultable = /** @class */ (function () {
423
+ function EsTableDefaultable() {
704
424
  }
705
- return ThAggregation;
425
+ return EsTableDefaultable;
706
426
  }());
707
427
 
708
428
  /** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */
@@ -753,6 +473,8 @@
753
473
  this.th = "";
754
474
  /** Indica se la colonna è pinnata o no */
755
475
  this.thPinned = false;
476
+ /** Indica se la colonna è pinnabile o no */
477
+ this.thPinnable = true;
756
478
  /** Indica le dimensioni che deve avere questa colonna quando viene pinnata, senza questo tutte le colonne mi collasserebbero l'una sull'altra */
757
479
  this.thPinnedWidth = 150;
758
480
  /** Indicazione sulla visibilità della colonna */
@@ -787,6 +509,7 @@
787
509
  EsThDirective.propDecorators = {
788
510
  th: [{ type: i0.Input }],
789
511
  thPinned: [{ type: i0.Input }],
512
+ thPinnable: [{ type: i0.Input }],
790
513
  thPinnedWidth: [{ type: i0.Input }],
791
514
  thVisible: [{ type: i0.Input }],
792
515
  thFixed: [{ type: i0.Input }],
@@ -837,23 +560,193 @@
837
560
  _super.prototype.set.call(_this, "en->it", "Paging options are not available for this report", ["Le opzioni di paginazione non sono disponibili per questo report"]);
838
561
  return _this;
839
562
  }
840
- return EsTableLoc;
841
- }(localizations.LocalizationService));
842
- EsTableLoc.decorators = [
843
- { type: i0.Injectable }
844
- ];
845
- EsTableLoc.ctorParameters = function () { return [
846
- { type: String, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [EST_LOCALE,] }] }
847
- ]; };
563
+ return EsTableLoc;
564
+ }(localizations.LocalizationService));
565
+ EsTableLoc.decorators = [
566
+ { type: i0.Injectable }
567
+ ];
568
+ EsTableLoc.ctorParameters = function () { return [
569
+ { type: String, decorators: [{ type: i0.Optional }, { type: i0.Inject, args: [EST_LOCALE,] }] }
570
+ ]; };
571
+
572
+ /** Classe contenente la gestione delle importazioni */
573
+ var ExportHandler = /** @class */ (function () {
574
+ /** @ignore Costruttore*/
575
+ function ExportHandler(est, expExts, msgExts, utiExts, dateExts) {
576
+ this.est = est;
577
+ this.expExts = expExts;
578
+ this.msgExts = msgExts;
579
+ this.utiExts = utiExts;
580
+ this.dateExts = dateExts;
581
+ }
582
+ /**
583
+ * Effettua l'esportazione dei dati
584
+ *
585
+ * @param {string} format Formato di esportazione. Letto solo in modalità Report della tabella
586
+ */
587
+ ExportHandler.prototype.tryExport = function (format) {
588
+ var _this = this;
589
+ if (!this.est.ExportFunction)
590
+ return;
591
+ if (this.est.reportMode)
592
+ this.est.ExportFunction(format);
593
+ else
594
+ this.est.ExportFunction(function (data, cancel) {
595
+ if (cancel === void 0) { cancel = false; }
596
+ return __awaiter(_this, void 0, void 0, function () {
597
+ var _b, _a_1;
598
+ var _this = this;
599
+ return __generator(this, function (_c) {
600
+ switch (_c.label) {
601
+ case 0:
602
+ if (cancel)
603
+ return [2 /*return*/];
604
+ if (data.length == 0) {
605
+ this.msgExts.simpleWarning(this.est.lc.loc("Cannot export an empty dataset"));
606
+ return [2 /*return*/];
607
+ }
608
+ this.setupExport(data);
609
+ if (!(format == "CSV")) return [3 /*break*/, 1];
610
+ this.est.cdr.detectChanges();
611
+ setTimeout(function () { _this.est.exportDownloader.nativeElement.click(); });
612
+ return [3 /*break*/, 7];
613
+ case 1:
614
+ if (!(format == "XLSX")) return [3 /*break*/, 6];
615
+ if (this.ExcelJS != null) {
616
+ this.exportExcel();
617
+ return [2 /*return*/];
618
+ }
619
+ _c.label = 2;
620
+ case 2:
621
+ _c.trys.push([2, 4, , 5]);
622
+ _b = this;
623
+ return [4 /*yield*/, import('exceljs')];
624
+ case 3:
625
+ _b.ExcelJS = _c.sent();
626
+ this.exportExcel();
627
+ return [3 /*break*/, 5];
628
+ case 4:
629
+ _a_1 = _c.sent();
630
+ throw "Impossibile caricare la libreria per l'esportazione in Excel";
631
+ case 5: return [3 /*break*/, 7];
632
+ case 6: throw "Formato di esportazione non riconosciuto";
633
+ case 7: return [2 /*return*/];
634
+ }
635
+ });
636
+ });
637
+ });
638
+ };
639
+ /** Effettua l'esportazione del file Excel basandosi sul modulo **ExcelJS**, sugli header **this.est.headers** e sui dati **this.est.data** */
640
+ ExportHandler.prototype.exportExcel = function () {
641
+ return __awaiter(this, void 0, void 0, function () {
642
+ var iFix, workbook, sheet, header, i, h, i, row, item, i_1, h, cell, val, buffer, blob, objectUrl, fn;
643
+ return __generator(this, function (_b) {
644
+ switch (_b.label) {
645
+ case 0:
646
+ iFix = 1;
647
+ workbook = new this.ExcelJS.Workbook();
648
+ workbook.creator = "Ema's big Es-Table";
649
+ workbook.created = new Date();
650
+ sheet = workbook.addWorksheet('Data');
651
+ header = sheet.getRow(1);
652
+ header.font = { bold: true };
653
+ this.est.headers = this.est.headers.sort(function (a, b) { return a.order - b.order; });
654
+ for (i = 0; i < this.est.headers.length; i++) {
655
+ h = this.est.headers[i];
656
+ header.getCell(i + iFix).value = h.label;
657
+ }
658
+ for (i = 0; i < this.est.data.length; i++) {
659
+ row = sheet.getRow(i + iFix + 1);
660
+ item = this.est.data[i];
661
+ for (i_1 = 0; i_1 < this.est.headers.length; i_1++) {
662
+ h = this.est.headers[i_1];
663
+ cell = row.getCell(i_1 + 1);
664
+ val = item[h.key];
665
+ if (val == null || val == undefined)
666
+ cell.value = "";
667
+ else {
668
+ switch (h.type) {
669
+ case 'date':
670
+ cell.value = this.dateExts.getDateConvertion(val).toDate();
671
+ case 'number':
672
+ cell.value = parseFloat(val.replace(',', '.'));
673
+ default:
674
+ cell.value = val;
675
+ }
676
+ }
677
+ }
678
+ }
679
+ return [4 /*yield*/, workbook.xlsx.writeBuffer()];
680
+ case 1:
681
+ buffer = _b.sent();
682
+ blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;" });
683
+ objectUrl = window.URL.createObjectURL(blob);
684
+ fn = this.est.ExportFileName;
685
+ this.utiExts.fileDownload(objectUrl, fn.endsWith('.csv') ? fn.replace('.csv', '.xlsx') : fn.endsWith('.xlsx') ? fn : fn + ".xlsx");
686
+ return [2 /*return*/];
687
+ }
688
+ });
689
+ });
690
+ };
691
+ /**
692
+ * Metodo che effettivamente genera gli header e i dati per l'esportazione con **ngx-csv**
693
+ *
694
+ * @param {any[]} items Oggetti da esportare
695
+ */
696
+ ExportHandler.prototype.setupExport = function (items) {
697
+ var drcd = this.est.DynamicRowColumnsDefinition;
698
+ this.est.headers = drcd && drcd.length > 0 ? this.expExts.setupForGenericExport(items, drcd.map(function (t) { return { label: t.description, key: t.propertyName, order: t.columnOrder, type: 'string' }; })) : this.expExts.setupForExport(items);
699
+ this.est.data = items;
700
+ };
701
+ return ExportHandler;
702
+ }());
703
+
704
+ /**
705
+ * Classe che identifica un ordinamento di una colonna
706
+ */
707
+ var AppOrdering = /** @class */ (function () {
708
+ /**
709
+ * Costruttore
710
+ *
711
+ * @param {string} id ID della colonna a cui si vogliono applicare ordinamenti, deve combaciare all'id messo nella dichiarazione dell'ES-TD/TH
712
+ * @param {'DESC' | 'ASC' } order Ordinamento da applicare alla colonna, Discendente/Ascendente, default 'null' per indicare assenza di ordine
713
+ */
714
+ function AppOrdering(id, order) {
715
+ this.id = id;
716
+ this.order = order;
717
+ }
718
+ return AppOrdering;
719
+ }());
848
720
 
849
- /** Raccolta di tutti gli Input dell'EsTable a cui può essere logicamente sensato assegnare default per progetto */
850
- var EsTableDefaultable = /** @class */ (function () {
851
- function EsTableDefaultable() {
721
+ /** Definizione di una colonna, utilizzato nella dialog che permette di modificare le posizioni e le visibilità */
722
+ var EsTableColumn = /** @class */ (function () {
723
+ /**
724
+ * Costruttore
725
+ *
726
+ * @param {string} id Id colonna
727
+ * @param {string} description Descrizione (Header)
728
+ * @param {boolean} visible Indica se di default mostrarla o meno
729
+ * @param {boolean} fixed Indica se è una colonna fixed
730
+ * @param {boolean} pinned Indica se è una colonna pinnata
731
+ * @param {number} pinnedWidth Indica la dimensione da assegnare a questa colonna quando è pinnata
732
+ * @param {TemplateRef<any>} template Indica il template da usare per mostrare il testo dell'Header
733
+ * @param {TemplateRef<any>[]} parentTemplates Indica la lista di template padri collegata a questo header
734
+ */
735
+ function EsTableColumn(id, description, visible, fixed, pinned, pinnable, pinnedWidth, template, parentTemplates) {
736
+ this.id = id;
737
+ this.description = description;
738
+ this.visible = visible;
739
+ this.fixed = fixed;
740
+ this.pinned = pinned;
741
+ this.pinnable = pinnable;
742
+ this.pinnedWidth = pinnedWidth;
743
+ this.template = template;
744
+ this.parentTemplates = parentTemplates;
852
745
  }
853
- return EsTableDefaultable;
746
+ return EsTableColumn;
854
747
  }());
855
748
 
856
- // Modelli
749
+ // Angular
857
750
  /** Classe che gestisce tutte le informaizoni relative alle colonne: visibilità, posizione, stato di pin/unpin, ecc ecc... */
858
751
  var ColumnMetadataHandler = /** @class */ (function () {
859
752
  /** @ignore Costruttore*/
@@ -935,7 +828,7 @@
935
828
  // Di default la visibilità è quella impostata nel componente
936
829
  if ((this_1.est.HiddenColumns || th.thVisible) && th.thIf) {
937
830
  var previouslyPinned = !this_1.est.ColumnsList || this_1.est.ColumnsList.length == 0 ? null : this_1.est.ColumnsList.find(function (t) { return t.id == column; }) || null;
938
- var toAdd = new EsTableColumn(column, null, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnedWidth, th.Template, th._thParents);
831
+ var toAdd = new EsTableColumn(column, null, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnable, th.thPinnedWidth, th.Template, th._thParents);
939
832
  if (previouslyPinned)
940
833
  toAdd.prev_index = previouslyPinned.prev_index;
941
834
  this_1.est.TMPColumnsList.push(toAdd);
@@ -1537,200 +1430,107 @@
1537
1430
  return ColumnMetadataHandler;
1538
1431
  }());
1539
1432
 
1540
- // Dominio
1541
- /** Classe contenente le gestioni particolari della modalità dinamica dell'es-table */
1542
- var DynamicModeHandler = /** @class */ (function () {
1543
- /** @ignore Costruttore*/
1544
- function DynamicModeHandler(est) {
1545
- this.est = est;
1546
- }
1547
- /**
1548
- * Metodo di supporto alla creazione di un router link parametrizzato all'oggetto corrente utilizzato nella modalità dinamica
1549
- *
1550
- * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...
1551
- * @param {string[]} parameterProps Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**
1552
- * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**
1553
- * @param {GenericItem} item Oggetto generico collegato a questo contesto
1554
- *
1555
- * @returns {any} Router link generato in base al parametri
1556
- */
1557
- DynamicModeHandler.prototype.generateRouterLink = function (path, parameterProps, item) {
1558
- if (this.est.DynamicTableRouterLinkCache[item._hash + path]) {
1559
- return this.est.DynamicTableRouterLinkCache[item._hash + path];
1560
- }
1561
- else {
1562
- var link = this.getRouterLink(path, parameterProps, item);
1563
- this.est.DynamicTableRouterLinkCache[item._hash + path] = link;
1564
- return link;
1565
- }
1566
- };
1567
- /**
1568
- * Crea un router link
1569
- *
1570
- * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...
1571
- * @param {string[]} pars Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**
1572
- * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**
1573
- * @param {GenericItem} item Oggetto generico collegato a questo contesto
1574
- *
1575
- * @returns {any} Router link generato in base al parametri
1576
- */
1577
- DynamicModeHandler.prototype.getRouterLink = function (path, pars, item) {
1578
- for (var i = 0; i < pars.length; i++)
1579
- path = path.replace('{' + i + '}', item.properties[pars[i]]);
1580
- path = path.replace(/'/g, '"').replace(/ /g, '');
1581
- return JSON.parse(path);
1582
- };
1583
- /** Se non ho l'Input **DynamicRowColumnsDefinition** in modalità dinamica lo riempio con il default nome della colonna = testo della colonna */
1584
- DynamicModeHandler.prototype.eventuallyReviewDynamicColumns = function () {
1585
- // Senza oggetti esco
1586
- if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)
1587
- return;
1588
- var useGenericItems = !!this.est.TMPBoundSource[0]["properties"];
1589
- if (!useGenericItems || (!this.est.FirstBind && this.est.DynamicRowColumnsDefinition && this.est.DynamicRowColumnsDefinition.length > 0))
1590
- return;
1591
- if ((!this.est.DynamicRowColumnsDefinition || this.est.DynamicRowColumnsDefinition.length == 0)) {
1592
- var props = this.est.TMPBoundSource[0]["properties"];
1593
- this.est.DynamicRowColumnsDefinition = [];
1594
- for (var key in props)
1595
- this.est.DynamicRowColumnsDefinition.push(new EsTableColumnsDefinition(key, key));
1596
- this.est.UserDefinedDynamicCols = false;
1597
- }
1598
- else
1599
- this.est.UserDefinedDynamicCols = true;
1600
- };
1601
- return DynamicModeHandler;
1602
- }());
1603
-
1604
- /** Classe contenente la gestione delle importazioni */
1605
- var ExportHandler = /** @class */ (function () {
1606
- /** @ignore Costruttore*/
1607
- function ExportHandler(est, expExts, msgExts, utiExts, dateExts) {
1608
- this.est = est;
1609
- this.expExts = expExts;
1610
- this.msgExts = msgExts;
1611
- this.utiExts = utiExts;
1612
- this.dateExts = dateExts;
1613
- }
1433
+ /** Classe che identifica una colonna. Utilizzata in modalità "Colonne dinamiche" */
1434
+ var EsTableColumnsDefinition = /** @class */ (function () {
1614
1435
  /**
1615
- * Effettua l'esportazione dei dati
1436
+ * Costruttore
1616
1437
  *
1617
- * @param {string} format Formato di esportazione. Letto solo in modalità Report della tabella
1438
+ * @param {string} description Descrizione della colonna
1439
+ * @param {string} propertyName Nome della proprietà del modello in cui sono contenuti i dati da visualizzare per questa colonna
1440
+ * @param {string} routePath Route di navigazione. Es. "['/pages/mod/mod_detail', { 'idItem': '{0}', 'idItem2' : '{1}' }]"
1441
+ * @param {string[]} routeParameterProperties Proprietà da bindare a **routePath** per generare la route completa.
1442
+ * L'indice scritto in **routePath** è l'indice di accesso a questo array. Es. ["iditem", "iditem2"]
1443
+ * @param {'ASC' | 'DESC' } dataOrder Ordinamento dei dati presentati in questa colonna
1444
+ * @param {number} columnOrder Ordinamento di questa colonna
1445
+ * @param {boolean} visible Visibilità o meno della colonna
1446
+ * @param {string} clss Classe da applicare sia ai TD che ai TH relativi a questa colonna
1447
+ * @param {boolean} orderable Indica se la colonna è ordinabile o no (nel senso ASC / DESC / NONE)
1448
+ * @param {boolean} headerWraps Indica se il testo dell'header dev'essere wrappato all'interno del th. Di default no.
1618
1449
  */
1619
- ExportHandler.prototype.tryExport = function (format) {
1620
- var _this = this;
1621
- if (!this.est.ExportFunction)
1622
- return;
1623
- if (this.est.reportMode)
1624
- this.est.ExportFunction(format);
1625
- else
1626
- this.est.ExportFunction(function (data, cancel) {
1627
- if (cancel === void 0) { cancel = false; }
1628
- return __awaiter(_this, void 0, void 0, function () {
1629
- var _b, _a_1;
1630
- var _this = this;
1631
- return __generator(this, function (_c) {
1632
- switch (_c.label) {
1633
- case 0:
1634
- if (cancel)
1635
- return [2 /*return*/];
1636
- if (data.length == 0) {
1637
- this.msgExts.simpleWarning(this.est.lc.loc("Cannot export an empty dataset"));
1638
- return [2 /*return*/];
1639
- }
1640
- this.setupExport(data);
1641
- if (!(format == "CSV")) return [3 /*break*/, 1];
1642
- this.est.cdr.detectChanges();
1643
- setTimeout(function () { _this.est.exportDownloader.nativeElement.click(); });
1644
- return [3 /*break*/, 7];
1645
- case 1:
1646
- if (!(format == "XLSX")) return [3 /*break*/, 6];
1647
- if (this.ExcelJS != null) {
1648
- this.exportExcel();
1649
- return [2 /*return*/];
1650
- }
1651
- _c.label = 2;
1652
- case 2:
1653
- _c.trys.push([2, 4, , 5]);
1654
- _b = this;
1655
- return [4 /*yield*/, import('exceljs')];
1656
- case 3:
1657
- _b.ExcelJS = _c.sent();
1658
- this.exportExcel();
1659
- return [3 /*break*/, 5];
1660
- case 4:
1661
- _a_1 = _c.sent();
1662
- throw "Impossibile caricare la libreria per l'esportazione in Excel";
1663
- case 5: return [3 /*break*/, 7];
1664
- case 6: throw "Formato di esportazione non riconosciuto";
1665
- case 7: return [2 /*return*/];
1666
- }
1667
- });
1668
- });
1669
- });
1670
- };
1671
- /** Effettua l'esportazione del file Excel basandosi sul modulo **ExcelJS**, sugli header **this.est.headers** e sui dati **this.est.data** */
1672
- ExportHandler.prototype.exportExcel = function () {
1673
- return __awaiter(this, void 0, void 0, function () {
1674
- var iFix, workbook, sheet, header, i, h, i, row, item, i_1, h, cell, val, buffer, blob, objectUrl, fn;
1675
- return __generator(this, function (_b) {
1676
- switch (_b.label) {
1677
- case 0:
1678
- iFix = 1;
1679
- workbook = new this.ExcelJS.Workbook();
1680
- workbook.creator = "Ema's big Es-Table";
1681
- workbook.created = new Date();
1682
- sheet = workbook.addWorksheet('Data');
1683
- header = sheet.getRow(1);
1684
- header.font = { bold: true };
1685
- this.est.headers = this.est.headers.sort(function (a, b) { return a.order - b.order; });
1686
- for (i = 0; i < this.est.headers.length; i++) {
1687
- h = this.est.headers[i];
1688
- header.getCell(i + iFix).value = h.label;
1689
- }
1690
- for (i = 0; i < this.est.data.length; i++) {
1691
- row = sheet.getRow(i + iFix + 1);
1692
- item = this.est.data[i];
1693
- for (i_1 = 0; i_1 < this.est.headers.length; i_1++) {
1694
- h = this.est.headers[i_1];
1695
- cell = row.getCell(i_1 + 1);
1696
- val = item[h.key];
1697
- if (val == null || val == undefined)
1698
- cell.value = "";
1699
- else {
1700
- switch (h.type) {
1701
- case 'date':
1702
- cell.value = this.dateExts.getDateConvertion(val).toDate();
1703
- case 'number':
1704
- cell.value = parseFloat(val.replace(',', '.'));
1705
- default:
1706
- cell.value = val;
1707
- }
1708
- }
1709
- }
1710
- }
1711
- return [4 /*yield*/, workbook.xlsx.writeBuffer()];
1712
- case 1:
1713
- buffer = _b.sent();
1714
- blob = new Blob([buffer], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;" });
1715
- objectUrl = window.URL.createObjectURL(blob);
1716
- fn = this.est.ExportFileName;
1717
- this.utiExts.fileDownload(objectUrl, fn.endsWith('.csv') ? fn.replace('.csv', '.xlsx') : fn.endsWith('.xlsx') ? fn : fn + ".xlsx");
1718
- return [2 /*return*/];
1719
- }
1720
- });
1721
- });
1450
+ function EsTableColumnsDefinition(description, propertyName, routePath, routeParameterProperties, dataOrder, columnOrder, visible, clss, orderable, headerWraps) {
1451
+ if (routePath === void 0) { routePath = null; }
1452
+ if (routeParameterProperties === void 0) { routeParameterProperties = null; }
1453
+ if (dataOrder === void 0) { dataOrder = null; }
1454
+ if (columnOrder === void 0) { columnOrder = null; }
1455
+ if (visible === void 0) { visible = true; }
1456
+ if (clss === void 0) { clss = null; }
1457
+ if (orderable === void 0) { orderable = true; }
1458
+ if (headerWraps === void 0) { headerWraps = false; }
1459
+ this.description = description;
1460
+ this.propertyName = propertyName;
1461
+ this.routePath = routePath;
1462
+ this.routeParameterProperties = routeParameterProperties;
1463
+ this.dataOrder = dataOrder;
1464
+ this.columnOrder = columnOrder;
1465
+ this.visible = visible;
1466
+ this.clss = clss;
1467
+ this.orderable = orderable;
1468
+ this.headerWraps = headerWraps;
1469
+ }
1470
+ return EsTableColumnsDefinition;
1471
+ }());
1472
+
1473
+ /** Classe contenente le gestioni particolari della modalità dinamica dell'es-table */
1474
+ var DynamicModeHandler = /** @class */ (function () {
1475
+ /** @ignore Costruttore*/
1476
+ function DynamicModeHandler(est) {
1477
+ this.est = est;
1478
+ }
1479
+ /**
1480
+ * Metodo di supporto alla creazione di un router link parametrizzato all'oggetto corrente utilizzato nella modalità dinamica
1481
+ *
1482
+ * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...
1483
+ * @param {string[]} parameterProps Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**
1484
+ * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**
1485
+ * @param {GenericItem} item Oggetto generico collegato a questo contesto
1486
+ *
1487
+ * @returns {any} Router link generato in base al parametri
1488
+ */
1489
+ DynamicModeHandler.prototype.generateRouterLink = function (path, parameterProps, item) {
1490
+ if (this.est.DynamicTableRouterLinkCache[item._hash + path]) {
1491
+ return this.est.DynamicTableRouterLinkCache[item._hash + path];
1492
+ }
1493
+ else {
1494
+ var link = this.getRouterLink(path, parameterProps, item);
1495
+ this.est.DynamicTableRouterLinkCache[item._hash + path] = link;
1496
+ return link;
1497
+ }
1722
1498
  };
1723
1499
  /**
1724
- * Metodo che effettivamente genera gli header e i dati per l'esportazione con **ngx-csv**
1500
+ * Crea un router link
1725
1501
  *
1726
- * @param {any[]} items Oggetti da esportare
1502
+ * @param {string} path Path su cui navigare con eventuali parametri riferiti all'oggetto cotnestuale come {0}, {1}, ecc...
1503
+ * @param {string[]} pars Lista posizionale delle proprietà a cui bindare i riferimenti del parametro **path**
1504
+ * Es. Il valore dela proprietà all'indice 0 di questo array verrà sostituita al valore {0} del parametro **path**
1505
+ * @param {GenericItem} item Oggetto generico collegato a questo contesto
1506
+ *
1507
+ * @returns {any} Router link generato in base al parametri
1727
1508
  */
1728
- ExportHandler.prototype.setupExport = function (items) {
1729
- var drcd = this.est.DynamicRowColumnsDefinition;
1730
- this.est.headers = drcd && drcd.length > 0 ? this.expExts.setupForGenericExport(items, drcd.map(function (t) { return { label: t.description, key: t.propertyName, order: t.columnOrder, type: 'string' }; })) : this.expExts.setupForExport(items);
1731
- this.est.data = items;
1509
+ DynamicModeHandler.prototype.getRouterLink = function (path, pars, item) {
1510
+ for (var i = 0; i < pars.length; i++)
1511
+ path = path.replace('{' + i + '}', item.properties[pars[i]]);
1512
+ path = path.replace(/'/g, '"').replace(/ /g, '');
1513
+ return JSON.parse(path);
1732
1514
  };
1733
- return ExportHandler;
1515
+ /** Se non ho l'Input **DynamicRowColumnsDefinition** in modalità dinamica lo riempio con il default nome della colonna = testo della colonna */
1516
+ DynamicModeHandler.prototype.eventuallyReviewDynamicColumns = function () {
1517
+ // Senza oggetti esco
1518
+ if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)
1519
+ return;
1520
+ var useGenericItems = !!this.est.TMPBoundSource[0]["properties"];
1521
+ if (!useGenericItems || (!this.est.FirstBind && this.est.DynamicRowColumnsDefinition && this.est.DynamicRowColumnsDefinition.length > 0))
1522
+ return;
1523
+ if ((!this.est.DynamicRowColumnsDefinition || this.est.DynamicRowColumnsDefinition.length == 0)) {
1524
+ var props = this.est.TMPBoundSource[0]["properties"];
1525
+ this.est.DynamicRowColumnsDefinition = [];
1526
+ for (var key in props)
1527
+ this.est.DynamicRowColumnsDefinition.push(new EsTableColumnsDefinition(key, key));
1528
+ this.est.UserDefinedDynamicCols = false;
1529
+ }
1530
+ else
1531
+ this.est.UserDefinedDynamicCols = true;
1532
+ };
1533
+ return DynamicModeHandler;
1734
1534
  }());
1735
1535
 
1736
1536
  /** Classe contenente la gestione della modalità gerarchica */
@@ -1987,7 +1787,13 @@
1987
1787
  return ItemsHandler;
1988
1788
  }());
1989
1789
 
1990
- // Modelli
1790
+ /** Classe che identifica una direttiva di ordinamento per un report */
1791
+ var ReportOrder = /** @class */ (function () {
1792
+ function ReportOrder() {
1793
+ }
1794
+ return ReportOrder;
1795
+ }());
1796
+
1991
1797
  /** Classe che gestisce la modalità Report dell'es-table utilizzata nel Metering */
1992
1798
  var ReportModeHandler = /** @class */ (function () {
1993
1799
  /** @ignore Costruttore */
@@ -2058,6 +1864,99 @@
2058
1864
  return ReportModeHandler;
2059
1865
  }());
2060
1866
 
1867
+ /** Classe che rappresenta un Gruppo con le proprie aggregazioni */
1868
+ var Group = /** @class */ (function () {
1869
+ /**
1870
+ * Costruttore
1871
+ *
1872
+ * @param {string} column ID della colonna raggruppata
1873
+ * @param {number} count Numero di elementi raggruppati sotto questa colonna
1874
+ * @param {string} value Valore del Gruppo
1875
+ */
1876
+ function Group(column, count, value) {
1877
+ this.column = column;
1878
+ this.count = count;
1879
+ this.value = value;
1880
+ this.aggregations = [];
1881
+ }
1882
+ return Group;
1883
+ }());
1884
+
1885
+ /** Classe che rappresenta un'aggregazione */
1886
+ var GroupAggregation = /** @class */ (function () {
1887
+ /**
1888
+ * Costruttore
1889
+ *
1890
+ * @param {string} column ID della colonna aggregata
1891
+ * @param {'min' | 'max' | 'sum' } aggregation Aggregazione da effettuare su questa colonna
1892
+ * @param {string} value Valore dell'aggregazione
1893
+ */
1894
+ function GroupAggregation(column, aggregation, value) {
1895
+ this.column = column;
1896
+ this.aggregation = aggregation;
1897
+ this.value = value;
1898
+ }
1899
+ return GroupAggregation;
1900
+ }());
1901
+
1902
+ /** Classe che rappresenta o un gruppo o una aggregazione su una colonna. Usata solo internamente */
1903
+ var GroupOrAggregation = /** @class */ (function () {
1904
+ /**
1905
+ * Costruttore
1906
+ *
1907
+ * @param {string} column Colonna su cui è presente o un gruppo o un'aggregazione
1908
+ * @param {'min' | 'max' | 'sum' } aggregation Aggregazione presente sulla **column**. Se questo campo è nullo significa che è un gruppo.
1909
+ * @param {'string' | 'date' | 'number'} datatype Tipo di dati contenuto nella colonna **column** se non c'è alcuna aggregazione è inutile, pertanto non sarà valorizzato
1910
+ */
1911
+ function GroupOrAggregation(column, aggregation, datatype) {
1912
+ this.column = column;
1913
+ this.aggregation = aggregation;
1914
+ this.datatype = datatype;
1915
+ }
1916
+ return GroupOrAggregation;
1917
+ }());
1918
+
1919
+ /** Classe che rappresenta un separatore da inserire fra gli oggetti dell'es-table per le operazioni di paginazione dei raggruppamenti per riga */
1920
+ var GroupPager = /** @class */ (function () {
1921
+ /**
1922
+ * Costruttore
1923
+ *
1924
+ * @param {number} groupLevel Livello del gruppo a cui questo separatore fa riferimento
1925
+ * @param {string} parentKey Chiave del gruppo parent se esiste
1926
+ * @param {AppSearch<any>} view Vista di ricerca collegata a questo elemento
1927
+ * @param {'groups' | 'items'} searches Indica che cosa cerca questo separatore, se sottogruppi o oggetti
1928
+ */
1929
+ function GroupPager(_grouplevel, _thisRoute, _parent, view, searches) {
1930
+ this._grouplevel = _grouplevel;
1931
+ this._thisRoute = _thisRoute;
1932
+ this._parent = _parent;
1933
+ this.view = view;
1934
+ this.searches = searches;
1935
+ this._sep = true;
1936
+ this.buttons = [];
1937
+ this._thisKey = _parent + "_sep";
1938
+ }
1939
+ return GroupPager;
1940
+ }());
1941
+
1942
+ /**
1943
+ * 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
1944
+ * per arrivare ad una ricerca su sottogruppi o elementi relativi
1945
+ */
1946
+ var GroupRouteFragment = /** @class */ (function () {
1947
+ /**
1948
+ * Costruttore
1949
+ *
1950
+ * @param {string} column Colonna di raggruppamento
1951
+ * @param {string} value Valore della colonna di raggruppamento
1952
+ */
1953
+ function GroupRouteFragment(column, value) {
1954
+ this.column = column;
1955
+ this.value = value;
1956
+ }
1957
+ return GroupRouteFragment;
1958
+ }());
1959
+
2061
1960
  /** Classe che gestisce la modalità Row Grouping dell'es-table */
2062
1961
  var RowGroupingHandler = /** @class */ (function () {
2063
1962
  /** @ignore Costruttore */
@@ -2106,7 +2005,7 @@
2106
2005
  this.est.BaseItemsCount = view.objectcount;
2107
2006
  }
2108
2007
  else {
2109
- // 2) Se viene richiesto il dettaglio di un qualsiasi gruppo diverso dall'ultimo vuol dire che devo aggiungere
2008
+ // 2) Se viene richiesto il dettaglio di un qualsiasi gruppo diverso dall'ultimo vuol dire che devo aggiungere
2110
2009
  // dopo al gruppo che ho cliccato la lista dei gruppi tirata fuori questa volta (intermediateGroup = true)
2111
2010
  /*
2112
2011
  * GruppoA GruppoA
@@ -2117,7 +2016,7 @@
2117
2016
  * GruppoD
2118
2017
  * GruppoE
2119
2018
  */
2120
- // 3) se i gruppi richiesti dalla view sono uguali ai gruppi presenti vuol dire che sto prendendo gli oggetti veri e propri, sono in
2019
+ // 3) se i gruppi richiesti dalla view sono uguali ai gruppi presenti vuol dire che sto prendendo gli oggetti veri e propri, sono in
2121
2020
  // view.items e quindi in TMPBoundSource, ho inoltre le informazioni di paginazione **per il singolo sottogruppo** (intermediateGroup = false)
2122
2021
  /*
2123
2022
  * GruppoA GruppoA
@@ -2213,15 +2112,20 @@
2213
2112
  itemsCacheReference_1.push(itm);
2214
2113
  }
2215
2114
  });
2216
- // Elimino gli oggetti vecchi
2115
+ // Elimino gli oggetti vecchi
2217
2116
  // 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
2218
2117
  // le cache di ricerca effettuate su una path più profonda dell'attuale
2219
2118
  // 2) Ricerca finale o ricerca intermedia senza stato salvato - Elimino tutti gli item relativi alla path corrente
2220
- // Per "stato salvato" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse
2119
+ // Per "stato salvato" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse
2221
2120
  if (intermediateGroup_1 && view.savedstate) {
2222
2121
  this.est.boundSource = this.est.boundSource.filter(function (t) { return !(t._item || t._thisRoute.length > groupRoute_1.length); });
2223
2122
  this.est.groupSearchRequestsCache = this.est.groupSearchRequestsCache.filter(function (t) { return !(t.route.length > groupRoute_1.length); });
2224
2123
  }
2124
+ else if (intermediateGroup_1) {
2125
+ // Se invece lo stato non è salvato vuol dire che c'è stato un cambio di pagina interno ad un gruppo già aperto:
2126
+ // - Elimino tutti gli elementi riconducibili a questo gruppo che erano già presenti
2127
+ this.est.boundSource = this.est.boundSource.filter(function (t) { return !(t._item || (t._thisKey.startsWith(groupKey_1) && t._thisKey != groupKey_1)); });
2128
+ }
2225
2129
  this.est.boundSource = this.est.boundSource.filter(function (t) { return !(t._parent == groupKey_1); });
2226
2130
  var thisGroup = this.est.boundSource[insertIndex];
2227
2131
  if (intermediateGroup_1)
@@ -2357,7 +2261,7 @@
2357
2261
  anygp._thisKey = parent._thisKey + gp.value;
2358
2262
  anygp._grouplevel = parent._grouplevel + 1;
2359
2263
  }
2360
- // Pusho il gruppo, tutti i gruppi del livello sotto, o gli item se io sono l'ultimo gruppo.
2264
+ // Pusho il gruppo, tutti i gruppi del livello sotto, o gli item se io sono l'ultimo gruppo.
2361
2265
  // La visibilità è solo per il gruppo a livello 0, tutti gli altri gruppi saranno mostrati o nascosti di conseguenza
2362
2266
  if (currentIndex == 0)
2363
2267
  anygp._visible = true;
@@ -2560,6 +2464,23 @@
2560
2464
  return RowGroupingHandler;
2561
2465
  }());
2562
2466
 
2467
+ /** 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 */
2468
+ var CacheTriptic = /** @class */ (function () {
2469
+ /**
2470
+ * Costruttore
2471
+ *
2472
+ * @param {Map<string, any>} cache Cache Chiave-Oggetto
2473
+ * @param {Map<string, number>} index_cache Cache Indice-Oggetto
2474
+ * @param {any[]} array Array contenente gli oggetti
2475
+ */
2476
+ function CacheTriptic(cache, index_cache, array) {
2477
+ this.cache = cache;
2478
+ this.index_cache = index_cache;
2479
+ this.array = array;
2480
+ }
2481
+ return CacheTriptic;
2482
+ }());
2483
+
2563
2484
  /** Classe che gestisce le selezioni degli oggetti */
2564
2485
  var SelectionHandler = /** @class */ (function () {
2565
2486
  /** @ignore Costruttore */
@@ -3287,7 +3208,7 @@
3287
3208
  var EsTableComponent = /** @class */ (function () {
3288
3209
  /** @ignore */
3289
3210
  function EsTableComponent(ngControl, prefService, deafults, locale, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts) {
3290
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r;
3211
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o, _p, _q, _r, _s;
3291
3212
  this.ngControl = ngControl;
3292
3213
  this.prefService = prefService;
3293
3214
  this.deafults = deafults;
@@ -3376,6 +3297,8 @@
3376
3297
  this.CornerMenuOptions = null;
3377
3298
  /** Indica se dev'essere possibile effettuare il resize delle colonne */
3378
3299
  this.ColumnsResizable = null;
3300
+ /** Indica se dev'essere possibile effettuare il pinning delle colonne */
3301
+ this.ColumnsPinnable = null;
3379
3302
  /** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
3380
3303
  this.AutoUpdate = null;
3381
3304
  /**
@@ -3601,6 +3524,7 @@
3601
3524
  this.UseSelectionCache = this.utilities_H.InputOrDefault(this.UseSelectionCache, (_p = this.deafults) === null || _p === void 0 ? void 0 : _p.UseSelectionCache, true);
3602
3525
  this.ShowItemGroupsColumns = this.utilities_H.InputOrDefault(this.ShowItemGroupsColumns, (_q = this.deafults) === null || _q === void 0 ? void 0 : _q.ShowItemGroupsColumns, false);
3603
3526
  this.ArraymodeItemsPerPage = this.utilities_H.InputOrDefault(this.ArraymodeItemsPerPage, (_r = this.deafults) === null || _r === void 0 ? void 0 : _r.ArraymodeItemsPerPage, 15);
3527
+ this.ColumnsPinnable = this.utilities_H.InputOrDefault(this.ColumnsPinnable, (_s = this.deafults) === null || _s === void 0 ? void 0 : _s.ColumnsPinnable, true);
3604
3528
  }
3605
3529
  /** @ignore */
3606
3530
  EsTableComponent.prototype.ngOnInit = function () {
@@ -3651,7 +3575,7 @@
3651
3575
  EsTableComponent.prototype.ngOnChanges = function (changes) {
3652
3576
  return __awaiter(this, void 0, void 0, function () {
3653
3577
  var newSearchView;
3654
- return __generator(this, function (_s) {
3578
+ return __generator(this, function (_t) {
3655
3579
  newSearchView = changes['SearchView'];
3656
3580
  if (newSearchView && this.SearchView)
3657
3581
  this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.items.length, this.SearchView.itemsperpageoverride);
@@ -3670,8 +3594,8 @@
3670
3594
  var _a;
3671
3595
  return __awaiter(this, void 0, void 0, function () {
3672
3596
  var firstItemGroupOrNoGrouping, prefs, prefs;
3673
- return __generator(this, function (_s) {
3674
- switch (_s.label) {
3597
+ return __generator(this, function (_t) {
3598
+ switch (_t.label) {
3675
3599
  case 0:
3676
3600
  this.View = obj ? obj : null;
3677
3601
  // Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress
@@ -3721,10 +3645,10 @@
3721
3645
  return [3 /*break*/, 5];
3722
3646
  case 3: return [4 /*yield*/, this.prefService.getItem(this.ngControl.name).toPromise()];
3723
3647
  case 4:
3724
- prefs = _s.sent();
3648
+ prefs = _t.sent();
3725
3649
  this.View.columns = (prefs === null || prefs === void 0 ? void 0 : prefs.columns) || [];
3726
3650
  this.View.column_ordering = (prefs === null || prefs === void 0 ? void 0 : prefs.column_ordering) || [];
3727
- _s.label = 5;
3651
+ _t.label = 5;
3728
3652
  case 5:
3729
3653
  // 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)
3730
3654
  if (firstItemGroupOrNoGrouping)
@@ -3748,14 +3672,14 @@
3748
3672
  return [3 /*break*/, 10];
3749
3673
  case 8: return [4 /*yield*/, this.prefService.getItem(this.ngControl.name).toPromise()];
3750
3674
  case 9:
3751
- prefs = _s.sent();
3675
+ prefs = _t.sent();
3752
3676
  this.arrayColumns = (prefs === null || prefs === void 0 ? void 0 : prefs.columns) || [];
3753
3677
  this.arrayColumnOrdering = (prefs === null || prefs === void 0 ? void 0 : prefs.column_ordering) || [];
3754
- _s.label = 10;
3678
+ _t.label = 10;
3755
3679
  case 10:
3756
3680
  if (this.SearchView)
3757
3681
  this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.items.length, this.SearchView.itemsperpageoverride);
3758
- _s.label = 11;
3682
+ _t.label = 11;
3759
3683
  case 11:
3760
3684
  if (this.View && !(this.View instanceof ReportDefinition))
3761
3685
  this.finalizeContext();
@@ -3908,20 +3832,20 @@
3908
3832
  */
3909
3833
  EsTableComponent.prototype.bindDisplayToLoadedItemsOrGroups = function (view) {
3910
3834
  var _a, _b;
3911
- if (this.TMPBoundSource.length == 0) {
3835
+ if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {
3912
3836
  this.BaseItemsCount = 0;
3913
- this.boundSource = this.TMPBoundSource;
3837
+ this.boundSource = [];
3914
3838
  return;
3915
3839
  }
3916
3840
  if (this.arrayMode || !this.UseCustomCells) {
3917
3841
  this.boundSource = this.TMPBoundSource;
3918
- this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || view.length;
3842
+ this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || (view === null || view === void 0 ? void 0 : view.length) || 0;
3919
3843
  return;
3920
3844
  }
3921
- var groupingKeys = ((_b = (_a = view.groupings) === null || _a === void 0 ? void 0 : _a.filter(function (t) { return !t.aggregation; })) === null || _b === void 0 ? void 0 : _b.length) || 0;
3845
+ var groupingKeys = ((_b = (_a = view === null || view === void 0 ? void 0 : view.groupings) === null || _a === void 0 ? void 0 : _a.filter(function (t) { return !t.aggregation; })) === null || _b === void 0 ? void 0 : _b.length) || 0;
3922
3846
  if (groupingKeys == 0) {
3923
3847
  this.boundSource = this.TMPBoundSource;
3924
- this.BaseItemsCount = view.objectcount;
3848
+ this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || 0;
3925
3849
  return;
3926
3850
  }
3927
3851
  this.rowGrouping_H.handleNewDataOnRowGrouping(view, groupingKeys);
@@ -4057,7 +3981,7 @@
4057
3981
  * @param {EsThDirective[]} ths Colonne della tabella
4058
3982
  */
4059
3983
  EsTableComponent.prototype.evaluateRowThs = function (ths) {
4060
- var _s;
3984
+ var _t;
4061
3985
  if (ths.length == 0)
4062
3986
  return;
4063
3987
  var columnsListCache = {};
@@ -4082,7 +4006,7 @@
4082
4006
  if (!castedView.groupings)
4083
4007
  castedView.groupings = groupAggregations;
4084
4008
  else
4085
- (_s = castedView.groupings).push.apply(_s, __spread(groupAggregations));
4009
+ (_t = castedView.groupings).push.apply(_t, __spread(groupAggregations));
4086
4010
  this.ResearchNeeded = true;
4087
4011
  }
4088
4012
  }
@@ -4383,7 +4307,7 @@
4383
4307
  viewProviders: [{ provide: localizations.LocalizationService, useClass: EsTableLoc }],
4384
4308
  changeDetection: i0.ChangeDetectionStrategy.OnPush,
4385
4309
  encapsulation: i0.ViewEncapsulation.None,
4386
- template: "<!-- 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\" />&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\" (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\">\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 || (!reportMode && (View?.selection || arraymodeSelection).all)\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : 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 {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10\" [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 || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && (reportMode || !(View?.selection || arraymodeSelection).all) && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</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\">\r\n <th *ngFor=\"let cell of level\" [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; Else: cell.Template\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\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 <!-- Aggiungo una checkbox se la selezione \u00E8 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=\"(viewMode || arrayMode)\">\r\n\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && !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\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.visible\">\r\n <th *ngIf=\"OrderByColumn\" 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\" 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\">\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\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" 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\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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 <!--Casistica in cui ho il setup proveniente da un report. Gli header sono definiti da come \u00E8 fatto il report-->\r\n <ng-container *ngIf=\"reportMode\">\r\n <th [style.color]=\"clm.color\" *ngFor=\"let clm of ReportValues.columns\" class=\"est-no-selection est-pointer est-nowrap\" (click)=\"reportMode_H.setupNextOrderAndSearch(clm)\">\r\n {{clm.description}}<span class=\"fa\" [class.fa-chevron-down]=\"clm.order == 'DESC'\" [class.fa-chevron-up]=\"clm.order == 'ASC'\"></span>\r\n </th>\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 <!-- Link nascosto che serve a scaricare il file -->\r\n <a *ngIf=\"headers\" hidden #exportDownloader csvLink [data]=\"data\" [headers]=\"headers\" [delimiter]=\"';'\" [filename]=\"ExportFileName.endsWith('.xlsx') ? ExportFileName.replace('.xlsx', '.csv') : ExportFileName.endsWith('.csv') ? ExportFileName : ExportFileName + '.csv'\"></a>\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(); changeColumnVisibilityModal.show();\">\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\" (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 <!-- Valido per modalit\u00E0 View o Array. Se sono in report mode il body \u00E8 creato in altro modo -->\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" *ngIf=\"(arrayMode || viewMode)\">\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\r\n <!-- Per la modalit\u00E0 a report c'\u00E8 un body particolare semi-dinamico -->\r\n <tbody [hidden]=\"BodyHidden\" *ngIf=\"reportMode\">\r\n <tr *ngFor=\"let row of ReportValues.rows; let even = even;\">\r\n <td class=\"est-nowrap\" *ngFor=\"let val of row.values\">{{val}}</td>\r\n <td class=\"est-sticky-last-column{{even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n </tr>\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=\"(!reportMode || View?.pagingavailable) && (!arrayMode || SearchView)\">\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 *ngIf=\"reportMode && !PagerOptions.ShowPaging\"><em>{{'Paging options are not available for this report' | localize: lc}}</em></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\" 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 \u00E8 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)=\"(!item.locked && !item._sep && !item._group && handleClick($event, item)) || item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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 even = even;\">\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)=\"item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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\"><div class=\"est-pinned-border est-cell-group-padding\"></div></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>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowItem.routePath && rowItem.visible\">\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.routePath, rowItem.routeParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.propertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem.routePath && rowItem.visible\">\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.propertyName) || defaultEsTd; context: { $implicit: item.properties[rowItem.propertyName], rowItem : rowItem, item : item }\"> </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-value let-rowItem='rowItem' let-item='item'>\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n {{value}}\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && RowTDs\">\r\n\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 rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-ltab-border]=\"rowItem.LeftBorder\" [class.est-rtab-border]=\"rowItem.RightBorder\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <a [routerLink]='rowItem.RouterLink' class=\"est-link\" [innerHTML]=\"rowItem.Content\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (NON RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"!rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\">\r\n <ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!rowItem.Template\" [innerHTML]=\"rowItem.Content\"></span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\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<!-- Questo template contiene i 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>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" 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)=\"changeColumnVisibilityModal.hide();\" 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\" \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\" *ngIf=\"ColumnsOrdering\">\r\n <span class=\"fa fa-arrow-up\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; i != 0 && !item.fixed && columnMetadata_H.sendUp(item); $event.stopPropagation();\"></span>\r\n <span class=\"fa fa-arrow-down\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; !last && !item.fixed && columnMetadata_H.sendDown(item); $event.stopPropagation();\"></span>\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\">\r\n <ng-container *ngTemplateOutlet=\"parent\"></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\"></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\"><span *ngIf=\"!item.fixed\" 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; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
4310
+ template: "<!-- 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\" />&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\" (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\">\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 || (!reportMode && (View?.selection || arraymodeSelection)?.all)\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : 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 {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10\" [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 || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && (reportMode || !(View?.selection || arraymodeSelection)?.all) && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</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\">\r\n <th *ngFor=\"let cell of level\" [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; Else: cell.Template\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\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 <!-- Aggiungo una checkbox se la selezione \u00E8 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=\"(viewMode || arrayMode)\">\r\n\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && !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\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.visible\">\r\n <th *ngIf=\"OrderByColumn\" 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\" 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\">\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\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" 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\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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 <!--Casistica in cui ho il setup proveniente da un report. Gli header sono definiti da come \u00E8 fatto il report-->\r\n <ng-container *ngIf=\"reportMode\">\r\n <th [style.color]=\"clm.color\" *ngFor=\"let clm of ReportValues.columns\" class=\"est-no-selection est-pointer est-nowrap\" (click)=\"reportMode_H.setupNextOrderAndSearch(clm)\">\r\n {{clm.description}}<span class=\"fa\" [class.fa-chevron-down]=\"clm.order == 'DESC'\" [class.fa-chevron-up]=\"clm.order == 'ASC'\"></span>\r\n </th>\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 <!-- Link nascosto che serve a scaricare il file -->\r\n <a *ngIf=\"headers\" hidden #exportDownloader csvLink [data]=\"data\" [headers]=\"headers\" [delimiter]=\"';'\" [filename]=\"ExportFileName.endsWith('.xlsx') ? ExportFileName.replace('.xlsx', '.csv') : ExportFileName.endsWith('.csv') ? ExportFileName : ExportFileName + '.csv'\"></a>\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(); changeColumnVisibilityModal.show();\">\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\" (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 <!-- Valido per modalit\u00E0 View o Array. Se sono in report mode il body \u00E8 creato in altro modo -->\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" *ngIf=\"(arrayMode || viewMode)\">\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\r\n <!-- Per la modalit\u00E0 a report c'\u00E8 un body particolare semi-dinamico -->\r\n <tbody [hidden]=\"BodyHidden\" *ngIf=\"reportMode\">\r\n <tr *ngFor=\"let row of ReportValues.rows; let even = even;\">\r\n <td class=\"est-nowrap\" *ngFor=\"let val of row.values\">{{val}}</td>\r\n <td class=\"est-sticky-last-column{{even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n </tr>\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=\"(!reportMode || View?.pagingavailable) && (!arrayMode || SearchView)\">\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 *ngIf=\"reportMode && !PagerOptions.ShowPaging\"><em>{{'Paging options are not available for this report' | localize: lc}}</em></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\" 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 \u00E8 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)=\"(!item.locked && !item._sep && !item._group && handleClick($event, item)) || item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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 even = even;\">\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)=\"item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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\"><div class=\"est-pinned-border est-cell-group-padding\"></div></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>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowItem.routePath && rowItem.visible\">\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.routePath, rowItem.routeParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.propertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem.routePath && rowItem.visible\">\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.propertyName) || defaultEsTd; context: { $implicit: item.properties[rowItem.propertyName], rowItem : rowItem, item : item }\"> </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-value let-rowItem='rowItem' let-item='item'>\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n {{value}}\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && RowTDs\">\r\n\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 rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned && rowItem.Visible\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-ltab-border]=\"rowItem.LeftBorder\" [class.est-rtab-border]=\"rowItem.RightBorder\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <a [routerLink]='rowItem.RouterLink' class=\"est-link\" [innerHTML]=\"rowItem.Content\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (NON RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"!rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\">\r\n <ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!rowItem.Template\" [innerHTML]=\"rowItem.Content\"></span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\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<!-- Questo template contiene i 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>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" 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)=\"changeColumnVisibilityModal.hide();\" 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\" \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\">\r\n <ng-container *ngTemplateOutlet=\"parent\"></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\"></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; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
4387
4311
  styles: [".est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{top:0;right:0;left:6px;bottom:0;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density td,.est-high-density th{padding:0 .2rem}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-13,.est-fs-14{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc}.est-slider,.est-slider:before{position:absolute;transition:.4s}.est-slider:before{content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translateX(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-next,.est-page-prev{color:#000;font-size:inherit;padding:2px 0 0}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0 solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:2px solid #bbb}.est-rtab-border{border-right:2px solid #bbb}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:hsla(0,0%,46.7%,.4666666666666667)!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:hsla(0,0%,73.3%,.7333333333333333)!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating,.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}"]
4388
4312
  },] }
4389
4313
  ];
@@ -4409,6 +4333,7 @@
4409
4333
  secondaryHeaderGroupRef: [{ type: i0.ContentChild, args: ['secondaryHeaderGroup', { static: false },] }],
4410
4334
  CornerMenuOptions: [{ type: i0.Input }],
4411
4335
  ColumnsResizable: [{ type: i0.Input }],
4336
+ ColumnsPinnable: [{ type: i0.Input }],
4412
4337
  AutoUpdate: [{ type: i0.Input }],
4413
4338
  UseCustomCells: [{ type: i0.Input }],
4414
4339
  MaxHeight: [{ type: i0.Input }],
@@ -4874,9 +4799,75 @@
4874
4799
  },] }
4875
4800
  ];
4876
4801
 
4877
- /*
4878
- * Public API Surface of es-table
4879
- */
4802
+ /** Indica un'opzione cliccabile nel Corner Menù della tabella (il menù richiamabile dai 3 pallini verticli in alto a destra) */
4803
+ var CornerMenuOption = /** @class */ (function () {
4804
+ function CornerMenuOption() {
4805
+ }
4806
+ return CornerMenuOption;
4807
+ }());
4808
+
4809
+ /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
4810
+ var EsTableOperationDefinition = /** @class */ (function () {
4811
+ /**
4812
+ * Costruttore
4813
+ *
4814
+ * @param {string} id Codice dell'operazione
4815
+ * @param {string} title Titolo dell'operazione, da presentare all'utente su hover della cella
4816
+ * @param {string} iconClass Classe che fornisca un iconcina Es. "fa fa-remove"
4817
+ * @param {string} text Eventuale testo presentato nella cella, genericamente va in alternativa a **iconClass**
4818
+ * @param {string} conditionField Indica il campo dell'oggetto sottostante su cui verificare la visibilità o meno di questa icona
4819
+ * @param {string} conditionValue Indica il valore che la proprietà **conditionField** dell'oggetto sottostante deve assumere affinché questa opzione si veda
4820
+ */
4821
+ function EsTableOperationDefinition(id, title, iconClass, text, conditionField, conditionValue) {
4822
+ this.id = id;
4823
+ this.title = title;
4824
+ this.iconClass = iconClass;
4825
+ this.text = text;
4826
+ this.conditionField = conditionField;
4827
+ this.conditionValue = conditionValue;
4828
+ }
4829
+ return EsTableOperationDefinition;
4830
+ }());
4831
+
4832
+ /** Classe che definisce un oggetto generico come lista di proprietà-valore */
4833
+ var GenericItem = /** @class */ (function () {
4834
+ /** @ignore */
4835
+ function GenericItem() {
4836
+ this._selected = false;
4837
+ this._rowClass = null;
4838
+ this._hash = null;
4839
+ this.properties = {};
4840
+ }
4841
+ return GenericItem;
4842
+ }());
4843
+
4844
+ /** Classe che rappresenta una colonna di un report */
4845
+ var ReportColumn = /** @class */ (function () {
4846
+ function ReportColumn() {
4847
+ }
4848
+ return ReportColumn;
4849
+ }());
4850
+
4851
+ /** Classe che identifica un parametro generico per un report */
4852
+ var ReportParam = /** @class */ (function () {
4853
+ function ReportParam() {
4854
+ }
4855
+ return ReportParam;
4856
+ }());
4857
+
4858
+ /** Classe che rappresenta una lista di oggetti generati da un report */
4859
+ var ReportResult = /** @class */ (function () {
4860
+ function ReportResult() {
4861
+ }
4862
+ return ReportResult;
4863
+ }());
4864
+
4865
+ /** Classe che rappresenta i valori delle proprietà di un oggetto Report */
4866
+ var ReportRow = /** @class */ (function () {
4867
+ function ReportRow() {
4868
+ }
4869
+ return ReportRow;
4870
+ }());
4880
4871
 
4881
4872
  /**
4882
4873
  * Generated bundle index. Do not edit.