@esfaenza/es-table 19.2.18 → 19.2.20

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.
@@ -1,5 +1,5 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, ViewChild, Pipe, ContentChild, NgModule } from '@angular/core';
2
+ import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, ViewChild, Pipe, model, ContentChild, NgModule } from '@angular/core';
3
3
  import * as i2 from '@esfaenza/localizations';
4
4
  import { LocalizationService, LocalizationModule } from '@esfaenza/localizations';
5
5
  import * as i5 from '@esfaenza/extensions';
@@ -9,7 +9,7 @@ import * as i1 from '@angular/forms';
9
9
  import { FormsModule } from '@angular/forms';
10
10
  import * as i5$1 from 'primeng/select';
11
11
  import { SelectModule } from 'primeng/select';
12
- import { Subject, forkJoin } from 'rxjs';
12
+ import { Subject, forkJoin, fromEvent, takeUntil } from 'rxjs';
13
13
  import * as i13 from '@angular/cdk/drag-drop';
14
14
  import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
15
15
  import * as i2$1 from '@esfaenza/preferences';
@@ -576,10 +576,10 @@ class ExportHandler {
576
576
  this.msgExts.simpleWarning(this.est.lc.loc("Cannot export an empty dataset"));
577
577
  return;
578
578
  }
579
- let drcd = this.est.DynamicRowColumnsDefinition;
580
- let columnsFilter = this.est.ExportOnlyVisibleColumns ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;
579
+ let drcd = this.est.DynamicRowColumnsDefinition();
580
+ let columnsFilter = this.est.ExportOnlyVisibleColumns() ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;
581
581
  let csvHeadersOverride = drcd && drcd.length > 0 ? drcd.map(t => { return { label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' }; }) : null;
582
- this.expExts.export(data, format, this.est.ExportFileName, type, columnsFilter, csvHeadersOverride);
582
+ this.expExts.export(data, format, this.est.ExportFileName(), type, columnsFilter, csvHeadersOverride);
583
583
  }, format);
584
584
  }
585
585
  }
@@ -650,13 +650,13 @@ class ColumnMetadataHandler {
650
650
  * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna
651
651
  */
652
652
  handleTHOrderChange(id, order) {
653
- let orders = this.est.viewMode ? this.est.View.orders : this.est.arrayOrders;
653
+ let orders = this.est.viewMode() ? this.est.View.orders : this.est.arrayOrders;
654
654
  let orderToAdd = true;
655
655
  let orderToRemove = null;
656
656
  // Se per qualche motivo il costruttore non è passato (cache tarpate o simila) fixo
657
- if (!orders && this.est.viewMode)
657
+ if (!orders && this.est.viewMode())
658
658
  this.est.View.orders = [];
659
- else if (!orders && this.est.arrayMode)
659
+ else if (!orders && this.est.arrayMode())
660
660
  this.est.arrayOrders = [];
661
661
  for (let i = 0; i < orders.length; i++) {
662
662
  let t = orders[i];
@@ -673,23 +673,23 @@ class ColumnMetadataHandler {
673
673
  orders.splice(orderToRemove, 1);
674
674
  }
675
675
  else if (orderToAdd) {
676
- if (this.est.MultipleOrderingDirectives)
676
+ if (this.est.MultipleOrderingDirectives())
677
677
  orders.push(new AppOrdering(id, order));
678
678
  else {
679
- if (this.est.viewMode)
679
+ if (this.est.viewMode())
680
680
  this.est.View.orders = [new AppOrdering(id, order)];
681
- else if (this.est.arrayMode)
681
+ else if (this.est.arrayMode())
682
682
  this.est.arrayOrders = [new AppOrdering(id, order)];
683
683
  }
684
684
  }
685
685
  //Salvo le preferences di questa view
686
686
  //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
687
- if (this.est.SavePreferences) {
688
- let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
687
+ if (this.est.SavePreferences()) {
688
+ let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View) : null;
689
689
  this.registerViewPreferences(castedView);
690
690
  }
691
691
  this.est.onOrderChanged.emit({ id, order });
692
- if (this.est.viewMode) {
692
+ if (this.est.viewMode()) {
693
693
  if (this.est.groupSearchRequestsCache.length > 0)
694
694
  this.rgH.emitRowGroupingSearches(id, orders);
695
695
  else
@@ -712,9 +712,10 @@ class ColumnMetadataHandler {
712
712
  console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
713
713
  return false;
714
714
  }
715
- let columns = this.est.arrayMode ? this.est.arrayColumns : castedView.columns;
716
- let columnsOrderings = this.est.arrayMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
717
- let columnOrders = this.est.arrayMode ? [] : castedView.orders;
715
+ let arrMode = this.est.arrayMode();
716
+ let columns = arrMode ? this.est.arrayColumns : castedView.columns;
717
+ let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
718
+ let columnOrders = arrMode ? [] : castedView.orders;
718
719
  var toStore = {
719
720
  columns: this.utiExts.deepClone(columns),
720
721
  column_ordering: this.utiExts.deepClone(columnsOrderings),
@@ -742,7 +743,7 @@ class ColumnMetadataHandler {
742
743
  continue;
743
744
  // Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
744
745
  // Di default la visibilità è quella impostata nel componente
745
- if ((this.est.HiddenColumns || th.thVisible) && th.thIf) {
746
+ if ((this.est.HiddenColumns() || th.thVisible) && th.thIf) {
746
747
  let previouslyPinned = !this.est.ColumnsList || this.est.ColumnsList.length == 0 ? null : this.est.ColumnsList.find(t => t.id == column) || null;
747
748
  let toAdd = new EsTableColumn(column, th.thStaticContent, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnable, th.thPinnedWidth, th.Template, th._thParents, th._multi, th._multi_content);
748
749
  if (previouslyPinned)
@@ -910,39 +911,39 @@ class ColumnMetadataHandler {
910
911
  let item = tds[i];
911
912
  newTds[columnsIndexCache[item.td]] = item;
912
913
  }
913
- this.est.HasPinnedColumns = pinneds > 0;
914
+ this.est.HasPinnedColumns.set(pinneds > 0);
914
915
  }
915
916
  /** In base alla configurazione delle colonne calcola le dimenioni delle colonne pinnate */
916
917
  evaluatePinnedColumnsWidth() {
917
- if (!this.est.HasPinnedColumns)
918
+ if (!this.est.HasPinnedColumns())
918
919
  return;
919
- this.est.PinnedContainerWidth = 0;
920
+ let pcw = 0;
920
921
  for (let i = 0; i < this.est.ColumnsList.length; i++) {
921
922
  let col = this.est.ColumnsList[i];
922
923
  if (col.pinned && col.visible)
923
- this.est.PinnedContainerWidth += col.pinnedWidth;
924
+ pcw += col.pinnedWidth;
924
925
  }
925
- this.est.PinnedContainerWidth += this.est.Selection ? 25 : 0;
926
+ pcw += this.est.Selection() ? 25 : 0;
927
+ this.est.PinnedContainerWidth.set(pcw);
926
928
  }
927
929
  /**
928
930
  * Terminato il binding delle colonne da **reviewColumnsList** e della **View** dal **writeValue** questo metodo si occupa
929
931
  * dell'allineamento delle informazioni fra le colonne calcolate internamente e le informazioni sulle colonne che arrivano dall'AppSearch
930
932
  *
931
933
  * @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
932
- * @param {boolean} useLocalVisibility Indica di utilizzare le impostazioni di visibilità locali senza allinearle alla view
933
934
  */
934
935
  alignColumnsIfLoadedView(view) {
935
- let emitChanged = this.est.viewMode && view.savedstate;
936
+ let emitChanged = this.est.viewMode() && view.savedstate;
936
937
  let newColset = [];
937
938
  if (!this.est.ColumnsList || this.est.ColumnsList.length == 0)
938
939
  return;
939
940
  let columns = [];
940
941
  // Modlaità view ->
941
- if (this.est.viewMode) {
942
+ if (this.est.viewMode()) {
942
943
  // colonne dinamiche -> prendo l'insieme delle colonne e operazioni dinamiche definite
943
944
  // standard -> prendo le colonne della view
944
- if (this.est.DynamicRowColumnsDefinition)
945
- columns = [...(this.est.DynamicRowColumnsDefinition?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations?.map(t => t.id) || [])];
945
+ if (this.est.DynamicRowColumnsDefinition())
946
+ columns = [...(this.est.DynamicRowColumnsDefinition()?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations()?.map(t => t.id) || [])];
946
947
  else
947
948
  columns = view.columns;
948
949
  }
@@ -967,12 +968,12 @@ class ColumnMetadataHandler {
967
968
  });
968
969
  // Non ho colonne nella appsearch, vuol dire che sono al primo binding
969
970
  if (columns.length == 0) {
970
- if (this.est.viewMode)
971
+ if (this.est.viewMode())
971
972
  view.columns = newColset;
972
973
  else
973
974
  this.est.arrayColumns = newColset;
974
975
  }
975
- if ((this.est.viewMode && view.savedstate) && this.est.ColumnsOrdering && view.column_ordering.length > 0) {
976
+ if ((this.est.viewMode() && view.savedstate) && this.est.ColumnsOrdering() && view.column_ordering.length > 0) {
976
977
  // Scorro gli ordinamenti che avevo salvato e ricreo la ColumnsList in base a loro
977
978
  let newColList = [];
978
979
  view.column_ordering.forEach(co => {
@@ -989,7 +990,7 @@ class ColumnMetadataHandler {
989
990
  this.est.ColumnsList = newColList;
990
991
  }
991
992
  // In ogni caso questo non mi serve più, lo resetto **
992
- if (this.est.viewMode)
993
+ if (this.est.viewMode())
993
994
  view.savedstate = false;
994
995
  // Reset di questa variabile usata one-bind
995
996
  if (this.est.useLocalVisibility)
@@ -1141,8 +1142,8 @@ class ColumnMetadataHandler {
1141
1142
  for (let l = 0; l < expandedGroups.length; l++) {
1142
1143
  let levelArray = [];
1143
1144
  finalHeaders.push(levelArray);
1144
- if (this.est.Selection || this.est.HasPinnedColumns)
1145
- levelArray.push({ ID: "_base_sel_pinned", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns });
1145
+ if (this.est.Selection() || this.est.HasPinnedColumns())
1146
+ levelArray.push({ ID: "_base_sel_pinned", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns() });
1146
1147
  for (let h = 0; h < expandedGroups[l].length; h++) {
1147
1148
  let item = expandedGroups[l][h];
1148
1149
  if (item == currentParent)
@@ -1157,9 +1158,9 @@ class ColumnMetadataHandler {
1157
1158
  // Ultima aggiunta che altrimenti mi rimarrebbe in cache
1158
1159
  levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : null, Borders: !!currentParent });
1159
1160
  // Aggiungo i pezzettini per la rimozione e gli export, se presenti
1160
- if (this.est.Removal)
1161
+ if (this.est.Removal())
1161
1162
  levelArray.push({ ID: "_base_removal", Span: 1, Template: null });
1162
- if (this.est.Export || this.est.HiddenColumns || this.est.ColumnsOrdering || this.est.CornerMenuOptions)
1163
+ if (this.est.Export() || this.est.HiddenColumns() || this.est.ColumnsOrdering() || this.est.CornerMenuOptions())
1163
1164
  levelArray.push({ ID: "_base_extra_opts", Span: 1, Template: null });
1164
1165
  currentSpan = 0;
1165
1166
  currentParent = "";
@@ -1215,10 +1216,10 @@ class ColumnMetadataHandler {
1215
1216
  return;
1216
1217
  //*********************************************** Fix ordinamenti per colonne sparite ****************************** */
1217
1218
  // Considero solo gli ordinamenti per colonne effettivamente presenti all'interno della tabella
1218
- if (this.est.viewMode)
1219
+ if (this.est.viewMode())
1219
1220
  view.column_ordering = view.column_ordering.filter(ord => ths.find(t => t.th == ord));
1220
1221
  //*********************************************** Fix ordinamenti per colonne sparite ****************************** */
1221
- let orderings = this.est.viewMode ? view.column_ordering : this.est.arrayColumnOrdering;
1222
+ let orderings = this.est.viewMode() ? view.column_ordering : this.est.arrayColumnOrdering;
1222
1223
  // Genero ordinamento di default da 0 fino a dove deve arrivare. Situazione attuale senza hotpotato
1223
1224
  if (!orderings || orderings.length == 0) {
1224
1225
  for (let i = 0; i < ths.length; i++) {
@@ -1263,7 +1264,7 @@ class ColumnMetadataHandler {
1263
1264
  let context = this.est.TMPRowTDs[this.est.RowContexts[i]];
1264
1265
  let newContext = [];
1265
1266
  this.est.OrderDirectives.forEach(o => {
1266
- let contextItem = context.filter(t => t.ID == o)[0];
1267
+ let contextItem = context.filter(t => t().ID == o)[0];
1267
1268
  // potrebbe esser undefined nel caso ci fossero colonne sotto thIf
1268
1269
  if (contextItem)
1269
1270
  newContext.push(contextItem);
@@ -1271,7 +1272,7 @@ class ColumnMetadataHandler {
1271
1272
  this.est.TMPRowTDs[this.est.RowContexts[i]] = newContext;
1272
1273
  }
1273
1274
  }
1274
- if (this.est.viewMode)
1275
+ if (this.est.viewMode())
1275
1276
  view.column_ordering = this.est.OrderDirectives;
1276
1277
  else
1277
1278
  this.est.arrayColumnOrdering = this.est.OrderDirectives;
@@ -1377,7 +1378,7 @@ class ColumnMetadataHandler {
1377
1378
  /** Effettua la selezione o meno del check globale (**globalColVisCheck**) di visibilità in base a se tutte le **TMPColumnsList** sono visibili o no */
1378
1379
  updateGlobalColVisCheck() {
1379
1380
  // TMPColList viene riempita di undefined nel caso in cui sia disattivata la selezione delle colonne nascoste
1380
- this.est.globalColVisCheck = this.est.TMPColumnsList.every(t => t.visible);
1381
+ this.est.globalColVisCheck.set(this.est.TMPColumnsList.every(t => t.visible));
1381
1382
  }
1382
1383
  /**
1383
1384
  * Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne
@@ -1410,7 +1411,7 @@ class ColumnMetadataHandler {
1410
1411
  // Non permetto di non selezionare nulla
1411
1412
  if (this.est.TMPColumnsList.every(t => !t.visible))
1412
1413
  return false;
1413
- let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
1414
+ let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View) : null;
1414
1415
  this.est.ColumnsList = [];
1415
1416
  this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });
1416
1417
  this.refreshColumnOrdering();
@@ -1418,11 +1419,11 @@ class ColumnMetadataHandler {
1418
1419
  this.refreshColumnsVisibility(null, null, castedView);
1419
1420
  //Salvo le preferences di questa view
1420
1421
  //Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
1421
- if (this.est.SavePreferences)
1422
+ if (this.est.SavePreferences())
1422
1423
  this.registerViewPreferences(castedView);
1423
1424
  // Rieseguo l'ultima ricerca bindata alla tabella
1424
1425
  // Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono
1425
- if (this.est.viewMode)
1426
+ if (this.est.viewMode())
1426
1427
  setTimeout(() => {
1427
1428
  if (this.est.MainGroupView) {
1428
1429
  for (let i = 0; i < this.est.groupSearchRequestsCache.length; i++) {
@@ -1435,7 +1436,7 @@ class ColumnMetadataHandler {
1435
1436
  else
1436
1437
  this.est.emitSearchRequest(true);
1437
1438
  });
1438
- else if (this.est.arrayMode)
1439
+ else if (this.est.arrayMode())
1439
1440
  setTimeout(() => { this.est.internalWriteValue(); });
1440
1441
  // Lo vorrei mettere lato template ma no
1441
1442
  this.est.lastSelectedItemID = null;
@@ -1455,7 +1456,7 @@ class ColumnMetadataHandler {
1455
1456
  globalColVisCheckChanged() {
1456
1457
  this.est.TMPColumnsList.forEach(t => {
1457
1458
  if (!t.fixed)
1458
- t.visible = this.est.globalColVisCheck;
1459
+ t.visible = this.est.globalColVisCheck();
1459
1460
  });
1460
1461
  }
1461
1462
  }
@@ -1520,32 +1521,33 @@ class DynamicModeHandler {
1520
1521
  if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)
1521
1522
  return;
1522
1523
  var useGenericItems = !!this.est.TMPBoundSource[0]["properties"];
1523
- if (!useGenericItems || (!this.est.FirstBind && this.est.DynamicRowColumnsDefinition && this.est.DynamicRowColumnsDefinition.length > 0))
1524
+ if (!useGenericItems || (!this.est.FirstBind() && this.est.DynamicRowColumnsDefinition()?.length > 0))
1524
1525
  return;
1525
- if ((!this.est.DynamicRowColumnsDefinition || this.est.DynamicRowColumnsDefinition.length == 0)) {
1526
+ if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0) {
1526
1527
  var props = this.est.TMPBoundSource[0]["properties"];
1527
- this.est.DynamicRowColumnsDefinition = [];
1528
+ let drcd = [];
1528
1529
  for (let key in props)
1529
- this.est.DynamicRowColumnsDefinition.push(new EsTableColumnsDefinition(key, key));
1530
- this.est.UserDefinedDynamicCols = false;
1530
+ drcd.push(new EsTableColumnsDefinition(key, key));
1531
+ this.est.DynamicRowColumnsDefinition.set(drcd);
1532
+ this.est.UserDefinedDynamicCols.set(false);
1531
1533
  }
1532
1534
  else
1533
- this.est.UserDefinedDynamicCols = true;
1535
+ this.est.UserDefinedDynamicCols.set(true);
1534
1536
  }
1535
1537
  /** Genera partendo dalle **DynamicRowColumnsDefinition** la lista di **EsThDirective** e **EsTdDirective** che servono per la tabella */
1536
1538
  emitThsAndTdsBasedOnDynamicDefinition() {
1537
1539
  // Senza dynamic columns esco
1538
- if (!this.est.DynamicRowColumnsDefinition || this.est.DynamicRowColumnsDefinition.length == 0)
1540
+ if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0)
1539
1541
  return null;
1540
1542
  let ths = [];
1541
1543
  let tds = [];
1542
- for (let i = 0; i < this.est.DynamicOperations.length; i++) {
1543
- let op = this.est.DynamicOperations[i];
1544
+ for (let i = 0; i < this.est.DynamicOperations().length; i++) {
1545
+ let op = this.est.DynamicOperations()[i];
1544
1546
  ths.push(this.getThFromOperation(op));
1545
1547
  tds.push(this.getTdFromOperation(op));
1546
1548
  }
1547
- for (let i = 0; i < this.est.DynamicRowColumnsDefinition.length; i++) {
1548
- let col = this.est.DynamicRowColumnsDefinition[i];
1549
+ for (let i = 0; i < this.est.DynamicRowColumnsDefinition().length; i++) {
1550
+ let col = this.est.DynamicRowColumnsDefinition()[i];
1549
1551
  ths.push(this.getThFromColumnDef(col));
1550
1552
  tds.push(this.getTdFromColumnDef(col));
1551
1553
  }
@@ -1629,14 +1631,14 @@ class HierarchyModeHandler {
1629
1631
  if (!objs || !objs.length)
1630
1632
  return;
1631
1633
  //Se mancano entrambe le info le cerco di valorizzare in automatico coi default "parentid" e "id" (posto che le props esistano nell'oggetto)
1632
- if (!this.est.ParentKey && !this.est.OwnKey) {
1634
+ if (!this.est.ParentKey() && !this.est.OwnKey()) {
1633
1635
  if (objs[0]['parentid'] !== undefined)
1634
- this.est.ParentKey = 'parentid';
1636
+ this.est.ParentKey.set('parentid');
1635
1637
  if (objs[0]['id'] !== undefined)
1636
- this.est.OwnKey = 'id';
1638
+ this.est.OwnKey.set('id');
1637
1639
  }
1638
1640
  //Check finale per assicurarmi che le props ci siano
1639
- if (!this.est.ParentKey || !this.est.OwnKey) {
1641
+ if (!this.est.ParentKey() || !this.est.OwnKey()) {
1640
1642
  console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');
1641
1643
  return;
1642
1644
  }
@@ -1662,7 +1664,7 @@ class HierarchyModeHandler {
1662
1664
  for (let i = 0; i < objs.length; i++) {
1663
1665
  let obj = objs[i];
1664
1666
  // Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)
1665
- if (!obj[this.est.ParentKey] && levelToAssign == 1) {
1667
+ if (!obj[this.est.ParentKey()] && levelToAssign == 1) {
1666
1668
  obj._level = 1;
1667
1669
  obj._visible = true;
1668
1670
  obj._expanded = this.est.StartsExpanded;
@@ -1670,12 +1672,12 @@ class HierarchyModeHandler {
1670
1672
  continue;
1671
1673
  }
1672
1674
  // Per i livelli superiore al primo
1673
- if (obj[this.est.ParentKey] && levelToAssign > 1) {
1675
+ if (obj[this.est.ParentKey()] && levelToAssign > 1) {
1674
1676
  // trovo il parent
1675
1677
  for (let p = 0; p < objs.length; p++) {
1676
1678
  let possibleParent = objs[p];
1677
1679
  // Trovato il parent dell'item, assegno all'item il livello giusto
1678
- if (possibleParent[this.est.OwnKey] == obj[this.est.ParentKey] && possibleParent._level == levelToAssign - 1) {
1680
+ if (possibleParent[this.est.OwnKey()] == obj[this.est.ParentKey()] && possibleParent._level == levelToAssign - 1) {
1679
1681
  obj._level = levelToAssign;
1680
1682
  // So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica
1681
1683
  // per la visibilità del figlio
@@ -1696,15 +1698,16 @@ class HierarchyModeHandler {
1696
1698
  * @param {string} key Chiave del parent da espandere
1697
1699
  */
1698
1700
  expandParent(key) {
1699
- for (let i = 0; i < this.est.boundSource.length; i++) {
1700
- let obj = this.est.boundSource[i];
1701
+ let bs = this.est.boundSource();
1702
+ for (let i = 0; i < bs.length; i++) {
1703
+ let obj = bs[i];
1701
1704
  // Trovo il parent con quell'id e lo espando
1702
- if (obj[this.est.OwnKey] == key) {
1705
+ if (obj[this.est.OwnKey()] == key) {
1703
1706
  obj._expanded = true;
1704
- for (let ic = 0; ic < this.est.boundSource.length; ic++) {
1705
- let child = this.est.boundSource[ic];
1707
+ for (let ic = 0; ic < bs.length; ic++) {
1708
+ let child = bs[ic];
1706
1709
  // Trovo tutti i child di quel parent e li rendo visibili
1707
- if (child[this.est.ParentKey] == key)
1710
+ if (child[this.est.ParentKey()] == key)
1708
1711
  child._visible = true;
1709
1712
  }
1710
1713
  return;
@@ -1717,10 +1720,11 @@ class HierarchyModeHandler {
1717
1720
  * @param {string} key Chiave del parent da collassare
1718
1721
  */
1719
1722
  collapseParent(key) {
1720
- for (let i = 0; i < this.est.boundSource.length; i++) {
1721
- let obj = this.est.boundSource[i];
1723
+ let bs = this.est.boundSource();
1724
+ for (let i = 0; i < bs.length; i++) {
1725
+ let obj = bs[i];
1722
1726
  // Trovo il parent con quell'id e lo collasso
1723
- if (obj[this.est.OwnKey] == key) {
1727
+ if (obj[this.est.OwnKey()] == key) {
1724
1728
  obj._expanded = false;
1725
1729
  // Collasso/nascondo tutti i child del parent
1726
1730
  this.collapseChildOfParent(key);
@@ -1734,16 +1738,17 @@ class HierarchyModeHandler {
1734
1738
  * @param {string} parentKey Chiave del parent di cui collassare i figli
1735
1739
  */
1736
1740
  collapseChildOfParent(parentKey) {
1737
- for (let ic = 0; ic < this.est.boundSource.length; ic++) {
1738
- let child = this.est.boundSource[ic];
1741
+ let bs = this.est.boundSource();
1742
+ for (let ic = 0; ic < bs.length; ic++) {
1743
+ let child = bs[ic];
1739
1744
  // Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,
1740
1745
  // lo collasso e vado in ricorsione sui figli
1741
- if (child[this.est.ParentKey] == parentKey && !child.parent)
1746
+ if (child[this.est.ParentKey()] == parentKey && !child.parent)
1742
1747
  child._visible = false;
1743
- else if (child[this.est.ParentKey] == parentKey && child.parent) {
1748
+ else if (child[this.est.ParentKey()] == parentKey && child.parent) {
1744
1749
  child._expanded = false;
1745
1750
  child._visible = false;
1746
- this.collapseChildOfParent(child[this.est.OwnKey]);
1751
+ this.collapseChildOfParent(child[this.est.OwnKey()]);
1747
1752
  }
1748
1753
  }
1749
1754
  }
@@ -1768,22 +1773,23 @@ class ItemsHandler {
1768
1773
  */
1769
1774
  getItemsByMode(onlyselected = false, refreshPaging = false, allIfPossible = false) {
1770
1775
  let items = [];
1771
- if ((this.est.viewMode && this.est.View instanceof AppSearch)) {
1776
+ if ((this.est.viewMode() && this.est.View instanceof AppSearch)) {
1772
1777
  items = this.getViewItemsBySource();
1773
1778
  }
1774
- else if (this.est.arrayMode) {
1779
+ else if (this.est.arrayMode()) {
1775
1780
  this.est.View.forEach(itm => { itm._item = true; });
1776
1781
  // Se faccio dei raggruppamenti ignoro la paginazione
1777
- if (this.est.UseArrayModePaging && !allIfPossible) {
1782
+ if (this.est.UseArrayModePaging() && !allIfPossible) {
1778
1783
  // Se sono in modalità array ma la ricerca dipende da una view devo riallineare gli itemperpage
1779
- if (this.est.SearchView) {
1780
- this.est.ArraymodeItemsPerPage = this.est.SearchView.itemsperpageoverride;
1781
- this.est.arraymodePage = this.est.SearchView.page;
1782
- this.est.arraymodePages = this.est.SearchView.pages;
1784
+ let fakeView = this.est.SearchView();
1785
+ if (fakeView) {
1786
+ this.est.ArraymodeItemsPerPage.set(fakeView.itemsperpageoverride);
1787
+ this.est.arraymodePage = fakeView.page;
1788
+ this.est.arraymodePages = fakeView.pages;
1783
1789
  }
1784
1790
  // Devo chiamare il refresh page solo se vengo richiamato da un binding esterno
1785
1791
  else if (refreshPaging)
1786
- this.refreshPaging(this.est.ArraymodeItemsPerPage);
1792
+ this.refreshPaging(this.est.ArraymodeItemsPerPage());
1787
1793
  items = this.adaptViewToPaging();
1788
1794
  }
1789
1795
  else {
@@ -1803,8 +1809,8 @@ class ItemsHandler {
1803
1809
  * @param {number} pageSize Dimensione della pagina
1804
1810
  */
1805
1811
  refreshPaging(pageSize) {
1806
- this.est.ArraymodeItemsPerPage = pageSize;
1807
- this.est.arraymodePages = Math.ceil(this.est.View.length / this.est.ArraymodeItemsPerPage);
1812
+ this.est.ArraymodeItemsPerPage.set(pageSize);
1813
+ this.est.arraymodePages = Math.ceil(this.est.View.length / pageSize);
1808
1814
  this.est.arraymodePage = 1;
1809
1815
  // Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca
1810
1816
  this.est.internalWriteValue();
@@ -1827,7 +1833,7 @@ class ItemsHandler {
1827
1833
  return ret;
1828
1834
  }
1829
1835
  else {
1830
- let ret = this.est.ItemSourceProperty ? this.est.View[this.est.ItemSourceProperty] : this.est.View.items;
1836
+ let ret = this.est.ItemSourceProperty() ? this.est.View[this.est.ItemSourceProperty()] : this.est.View.items;
1831
1837
  if (!ret)
1832
1838
  ret = [];
1833
1839
  // Setto variabile interna per specificare che questo è un elemento normale, non un gruppo o altro
@@ -1841,8 +1847,8 @@ class ItemsHandler {
1841
1847
  // Se ho una search view l'array pulsanti viene calcolato da lei, non devo prendere quello della modalità array,
1842
1848
  // inoltre non ho bisogno di fare ragionamenti su quanti elementi ci sono e sulla pagina, dato che viene tutto gestito esternamente,
1843
1849
  // unendo al risultato della view tutti gli oggetti addizionali
1844
- if (!this.est.SearchView)
1845
- this.est.arrayPulsanti = this.utilities.getPagesArray(6, this.est.arraymodePage, this.est.arraymodePages);
1850
+ if (!this.est.SearchView())
1851
+ this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.arraymodePage, this.est.arraymodePages));
1846
1852
  else
1847
1853
  return this.est.View;
1848
1854
  // Applico eventuali oridnamenti lato Array prima di tirare fuori la pagina selezionata
@@ -1850,7 +1856,7 @@ class ItemsHandler {
1850
1856
  if (this.est)
1851
1857
  items = this.arrayModeReviewOrderings(items);
1852
1858
  // Poi per tutti i valori dopo compresi fra la pagina - 1 e la pagina
1853
- for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage; i++) {
1859
+ for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage()); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage(); i++) {
1854
1860
  if (i <= items.length - 1)
1855
1861
  tmpItems.push(items[i]);
1856
1862
  }
@@ -1890,7 +1896,7 @@ class ReportModeHandler {
1890
1896
  count = this.est.previousCount;
1891
1897
  let ipp = (this.est.View.itemsperpageoverride || 15);
1892
1898
  this.est.View.pages = Math.ceil(count / ipp);
1893
- this.est.arrayPulsanti = this.utilities.getPagesArray(6, this.est.View.page, this.est.View.pages);
1899
+ this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.View.page, this.est.View.pages));
1894
1900
  }
1895
1901
  /**
1896
1902
  * Data una AppSearch questo metodo genera la lista di th e td che si possono collegare al giro standard.
@@ -2042,7 +2048,7 @@ class RowGroupingHandler {
2042
2048
  // 1) Se non viene richiesto il dettaglio di alcun gruppo significa che la chiamata restituisce la lista paginata dei gruppi principali.
2043
2049
  // Li tratto come se fosse una qualsiasi altra query paginata su N elementi
2044
2050
  if ((view.requestedgroups?.length || 0) == 0) {
2045
- this.est.boundSource = this.est.TMPBoundSource;
2051
+ this.est.boundSource.set(this.est.TMPBoundSource);
2046
2052
  this.rgGroupCache = new Map();
2047
2053
  this.rgItemCache = new Map();
2048
2054
  this.rgChildGroupsCache = new Map();
@@ -2086,7 +2092,7 @@ class RowGroupingHandler {
2086
2092
  * GruppoE GruppoE
2087
2093
  */
2088
2094
  let intermediateGroup = view.requestedgroups.length != groupingKeys;
2089
- let items = this.est.boundSource;
2095
+ let items = this.est.boundSource();
2090
2096
  let insertIndex = 0;
2091
2097
  let insertGroup = null;
2092
2098
  let groupKey = "";
@@ -2144,29 +2150,31 @@ class RowGroupingHandler {
2144
2150
  itemsCacheReference.push(itm);
2145
2151
  }
2146
2152
  });
2153
+ let bs = this.est.boundSource();
2147
2154
  // Elimino gli oggetti vecchi
2148
2155
  // 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
2149
2156
  // le cache di ricerca effettuate su una path più profonda dell'attuale
2150
2157
  // 2) Ricerca finale o ricerca intermedia senza stato salvato - Elimino tutti gli item relativi alla path corrente
2151
2158
  // Per "stato salvato" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse
2152
2159
  if (intermediateGroup && view.savedstate) {
2153
- this.est.boundSource = this.est.boundSource.filter(t => !(t._item || t._thisRoute.length > groupRoute.length));
2160
+ bs = bs.filter(t => !(t._item || t._thisRoute.length > groupRoute.length));
2154
2161
  this.est.groupSearchRequestsCache = this.est.groupSearchRequestsCache.filter(t => !(t.route.length > groupRoute.length));
2155
2162
  }
2156
2163
  else if (intermediateGroup) {
2157
2164
  // Se invece lo stato non è salvato vuol dire che c'è stato un cambio di pagina interno ad un gruppo già aperto:
2158
2165
  // - Elimino tutti gli elementi riconducibili a questo gruppo che erano già presenti
2159
- this.est.boundSource = this.est.boundSource.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));
2166
+ bs = bs.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));
2160
2167
  }
2161
- this.est.boundSource = this.est.boundSource.filter(t => !(t._parent == groupKey));
2162
- let thisGroup = this.est.boundSource[insertIndex];
2168
+ bs = bs.filter(t => !(t._parent == groupKey));
2169
+ let thisGroup = bs[insertIndex];
2163
2170
  if (intermediateGroup)
2164
2171
  thisGroup._groupscount = this.est.View?.groupcount;
2165
2172
  // Li sostituisco coi nuovi di questa ricerca
2166
- this.est.boundSource.splice(insertIndex + 1, 0, ...this.est.TMPBoundSource);
2173
+ bs.splice(insertIndex + 1, 0, ...this.est.TMPBoundSource);
2167
2174
  // Aggiungo un separatore alla fine o all'inizio di questi gruppi che dovrà occuparsi di caricare ALTRI gruppi o oggetti (se sono all'ultimo gruppo)
2168
2175
  let addLast = false;
2169
- this.est.boundSource.splice(insertIndex + 1 + (addLast ? this.est.TMPBoundSource.length : 0), 0, this.getGroupSeparator(view, groupKey, groupRoute, view.requestedgroups.length, intermediateGroup ? 'groups' : 'items'));
2176
+ bs.splice(insertIndex + 1 + (addLast ? this.est.TMPBoundSource.length : 0), 0, this.getGroupSeparator(view, groupKey, groupRoute, view.requestedgroups.length, intermediateGroup ? 'groups' : 'items'));
2177
+ this.est.boundSource.set(bs);
2170
2178
  // Aggiungo la ricerca alla cache di questa "sessione"
2171
2179
  let toAdd = { path: groupKey, route: groupRoute, view: Object.assign({}, view), group_column: intermediateGroup ? this.est.TMPBoundSource[0].column : '' };
2172
2180
  let prev = this.est.groupSearchRequestsCache.findIndex(t => t.path == toAdd.path && t.group_column == toAdd.group_column);
@@ -2198,8 +2206,8 @@ class RowGroupingHandler {
2198
2206
  this.rgGroupCache.clear();
2199
2207
  this.rgItemCache.clear();
2200
2208
  this.rgChildGroupsCache.clear();
2201
- this.est.ArrayGrouping = true;
2202
- this.est.boundSource = this.getGroupsRecursive(headerGroups, 0, this.est.boundSource, headerAggregations, null);
2209
+ this.est.ArrayGrouping.set(true);
2210
+ this.est.boundSource.set(this.getGroupsRecursive(headerGroups, 0, this.est.boundSource(), headerAggregations, null));
2203
2211
  }
2204
2212
  }
2205
2213
  /**
@@ -2693,14 +2701,14 @@ class SelectionHandler {
2693
2701
  }
2694
2702
  // Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true
2695
2703
  // Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni
2696
- this.est.globalCheck = this.est.boundSource.length > 0 && this.est.boundSource.filter(t => t._group || t._item).every(t => t._selected);
2697
- this.est.canSelectAll = selectionItem.count > 0 && this.est.SelectAll && !this.est.SingleSelection;
2704
+ this.est.globalCheck.set(this.est.boundSource().length > 0 && this.est.boundSource().filter(t => t._group || t._item).every(t => t._selected));
2705
+ this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
2698
2706
  // Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella
2699
2707
  // Comunque costa 0 quindi mi permetto di refreshare
2700
- if (this.est.arrayMode) {
2701
- let prevSelected = this.est.selectedObjects;
2708
+ if (this.est.arrayMode()) {
2709
+ let prevSelected = this.est.selectedObjects();
2702
2710
  this.finalizeSelectionInformations(selectionItem);
2703
- if (this.est.selectedObjects != prevSelected)
2711
+ if (this.est.selectedObjects() != prevSelected)
2704
2712
  this.est.onSelectionChanged.emit(selectionItem);
2705
2713
  }
2706
2714
  }
@@ -2756,20 +2764,20 @@ class SelectionHandler {
2756
2764
  handleItemsSelection(items, forcedVal = null, globalCheck = null) {
2757
2765
  let si = this.est.View?.selection || this.est.arraymodeSelection;
2758
2766
  // Se sono in modalità di selezione singola e devo selezionare un'oggetto, per prima cosa devo deselezionare tutti gli altri
2759
- if (this.est.SingleSelection && items[0]?._selected && !items[0]?._group) {
2767
+ if (this.est.SingleSelection() && items[0]?._selected && !items[0]?._group) {
2760
2768
  if (items.length > 1 && forcedVal == null)
2761
2769
  throw "Tentativo di selezionare o deselezionare più di un elemento con SingleSelection attivo";
2762
2770
  if (items.length == 1 && forcedVal == null) {
2763
- si = this.handleItemsSelection(this.est.boundSource.filter(t => !t._group), false, null);
2771
+ si = this.handleItemsSelection(this.est.boundSource().filter(t => !t._group), false, null);
2764
2772
  items[0]._selected = true;
2765
2773
  }
2766
2774
  }
2767
2775
  for (let i = 0; i < items.length; i++) {
2768
2776
  let item = items[i];
2769
- let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck : false;
2777
+ let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck() : false;
2770
2778
  // Se dev'essere overridato il valore di check effettuo l'override o col valore forzato o col valore globale
2771
2779
  if (toChange && !item.locked)
2772
- item._selected = forcedVal != null ? forcedVal : this.est.globalCheck;
2780
+ item._selected = forcedVal != null ? forcedVal : this.est.globalCheck();
2773
2781
  // Se il valore non dev'essere variato e vengo da una selezione globale semplicemente evito di effettuare operaizoni inutili. L'item/gruppo è già nello stato giusto
2774
2782
  if (!toChange && globalCheck != null)
2775
2783
  continue;
@@ -2793,7 +2801,7 @@ class SelectionHandler {
2793
2801
  parentGroupSelected = itemGroup == null ? null : itemGroup._selected;
2794
2802
  parentGroupUnselected = itemGroup == null ? null : !itemGroup._selected;
2795
2803
  }
2796
- if (!this.est.ArrayGrouping)
2804
+ if (!this.est.ArrayGrouping())
2797
2805
  this.performSelectionOperations(si, item, allSelection, isGroup, isSelection, selectedItems, selectedGroups, unselectedItems, unselectedGroups, allItems, allGroups, parentGroupSelected, parentGroupUnselected);
2798
2806
  else
2799
2807
  this.performSimpleSelectionOperations(si, item, isGroup, isSelection, itemGroup, selectedItems, unselectedItems, allItems, allGroups);
@@ -2801,14 +2809,14 @@ class SelectionHandler {
2801
2809
  // Imposto il check globale in base a se tutti gli elementi sono selezionati o meno.
2802
2810
  // Evito di fare queste operazioni se la selezione deriva proprio dal global Check
2803
2811
  if (globalCheck == null)
2804
- this.est.globalCheck = !this.est.boundSource.some(t => !t._selected && !t._sep);
2812
+ this.est.globalCheck.set(!this.est.boundSource().some(t => !t._selected && !t._sep));
2805
2813
  this.finalizeSelectionInformations(si);
2806
2814
  return si;
2807
2815
  }
2808
2816
  /**
2809
2817
  * Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.
2810
2818
  *
2811
- * Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping** = true)
2819
+ * Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping()** = true)
2812
2820
  */
2813
2821
  performSimpleSelectionOperations(base, item, group, sel, itm_group, sel_itm, desel_itm, all_itms, all_grps) {
2814
2822
  let tripticItem = this.getTriptic('item', base);
@@ -2981,7 +2989,7 @@ class SelectionHandler {
2981
2989
  items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));
2982
2990
  // Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione.
2983
2991
  // Questo può essere vero solo se NON sono in modalità array, in caso contrario gli oggetti li devo per forza avere tutti
2984
- if (items.length != 0 || !sel || this.est.arrayMode)
2992
+ if (items.length != 0 || !sel || this.est.arrayMode())
2985
2993
  return items;
2986
2994
  if (status == 'unselected')
2987
2995
  items = sel.exclusions.filter(t => t != null &&
@@ -3089,7 +3097,7 @@ class SelectionHandler {
3089
3097
  selectionItem.count = this.evaluateSelected();
3090
3098
  // Se ho fatto selezione "all" ma poi mi sono messo a togliere tutti gli elementi fino a rimanerne 0 resetto l'oggetto di selezione
3091
3099
  if (selectionItem.count == 0) {
3092
- this.est.boundSource.forEach(t => t._selected = false);
3100
+ this.est.boundSource().forEach(t => t._selected = false);
3093
3101
  selectionItem.all = false;
3094
3102
  selectionItem.exclusions = [];
3095
3103
  selectionItem.items = [];
@@ -3099,7 +3107,7 @@ class SelectionHandler {
3099
3107
  this.clearSelectionCaches();
3100
3108
  }
3101
3109
  // Se la possibilità di fare "Seleziona tutto" è abilitata allora la considero appena mi viene selezionato qualcosa
3102
- this.est.canSelectAll = selectionItem.count > 0 && this.est.SelectAll && !this.est.SingleSelection;
3110
+ this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
3103
3111
  }
3104
3112
  /** Compatta una cache di indici */
3105
3113
  compactIndexMap(map) {
@@ -3118,8 +3126,9 @@ class SelectionHandler {
3118
3126
  let si = this.est.View?.selection || this.est.arraymodeSelection;
3119
3127
  let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);
3120
3128
  let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);
3121
- this.est.selectedObjects = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
3122
- return this.est.selectedObjects;
3129
+ let count = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
3130
+ this.est.selectedObjects.set(count);
3131
+ return count;
3123
3132
  }
3124
3133
  /** Gestisce il comando di "Seleziona tutto in tutte le pagine" o il suo contrario, cioè "Reimposta selezione" */
3125
3134
  selectAllOrResetSelection() {
@@ -3132,13 +3141,13 @@ class SelectionHandler {
3132
3141
  selectionItem.items = [];
3133
3142
  // Ripulisco gli stati UI di selezione globale se l'ho disattivata
3134
3143
  if (!selectionItem.all) {
3135
- this.est.canSelectAll = false;
3136
- this.est.globalCheck = false;
3144
+ this.est.canSelectAll.set(false);
3145
+ this.est.globalCheck.set(false);
3137
3146
  }
3138
3147
  this.finalizeSelectionInformations(selectionItem);
3139
3148
  this.est.onSelectionChanged.emit(selectionItem);
3140
3149
  // Dopo aver resettato direttamente il solo oggetto this.View.selection devo anche riallineare a tutti gli oggetti bindati
3141
- this.evaluateSelection(this.est.boundSource, selectionItem);
3150
+ this.evaluateSelection(this.est.boundSource(), selectionItem);
3142
3151
  }
3143
3152
  /**
3144
3153
  * @TODO Spostare in SelectionHandler
@@ -3496,32 +3505,43 @@ class EsTh {
3496
3505
  */
3497
3506
  this.startOffset = null;
3498
3507
  /** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
3499
- this.ID = "";
3508
+ this.ID = input("", { alias: "es-th" });
3509
+ /** Ordinamento attuale della colonna */
3510
+ this._Order = input(null, { alias: 'Order' });
3511
+ this.Order = signal(null);
3500
3512
  /** Indica se questa colonna è ordinabile o meno */
3501
- this.Orderable = true;
3513
+ this.Orderable = input(true);
3502
3514
  /** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
3503
- this.Display = "";
3515
+ this.Display = input("");
3504
3516
  /** Indica se le dimnsioni di questa colonna sono modificabili o meno */
3505
- this.Resizable = false;
3517
+ this.Resizable = input(false);
3506
3518
  /** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */
3507
- this.Pinned = false;
3519
+ this.Pinned = input(false);
3508
3520
  /**
3509
3521
  * Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio
3510
3522
  * come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi
3511
3523
  */
3512
- this.SearchInProgress = false;
3524
+ this.SearchInProgress = input(false);
3525
+ /** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */
3526
+ this.OrderBy = input(null);
3513
3527
  /** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
3514
- this.Wrap = false;
3528
+ this.Wrap = input(false);
3515
3529
  /** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
3516
- this.Fixed = false;
3530
+ this.Fixed = input(false);
3517
3531
  /** Template Angular da istanziare per questo TH */
3518
3532
  this.Template = null;
3519
3533
  /** Evento emesso al cambio di ordinamento effettuato su questa colonna */
3520
3534
  this.onOrderChange = new EventEmitter();
3521
3535
  /** Evento emesso all'unpinning della colonna */
3522
3536
  this.onUnpinning = new EventEmitter();
3537
+ /** Classi da applicare alla colonna */
3538
+ this.Class = signal("");
3523
3539
  /** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
3524
- this._referenced = false;
3540
+ this._referenced = signal(false);
3541
+ /** Variabile finale su cui è bindato il contenuto della cella. Sarà valorizzato a **Display** se specificato, all'**innerHTML** dell'elemento proiettato altrimenti */
3542
+ this.Description = computed(() => {
3543
+ return this.Display() === null || this.Display() === "" ? this.content.nativeElement.innerText : this.Display();
3544
+ });
3525
3545
  }
3526
3546
  /**
3527
3547
  * Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
@@ -3548,31 +3568,30 @@ class EsTh {
3548
3568
  /** @ignore */
3549
3569
  ngAfterViewInit() {
3550
3570
  //Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
3551
- this.Description = this.Display === null || this.Display === "" ? this.content.nativeElement.innerText : this.Display;
3552
- this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
3571
+ this.Class.set(this.myself.nativeElement.className.replace("app-display-none", ""));
3553
3572
  //Resize
3554
- if (this.Resizable)
3573
+ if (this.Resizable())
3555
3574
  this.renderer.addClass(this.myself.nativeElement, "app-relative");
3556
3575
  }
3557
3576
  /** Emette l'evento di unpinning */
3558
3577
  unpin() {
3559
- this.onUnpinning.emit(this.ID);
3578
+ this.onUnpinning.emit(this.ID());
3560
3579
  }
3561
3580
  /** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */
3562
3581
  setupNextOrderAndNotify() {
3563
- if (!this.ID) {
3582
+ if (!this.ID()) {
3564
3583
  console.log("Attempt to order a column without ID. Operation ignored");
3565
3584
  return;
3566
3585
  }
3567
- if (this.SearchInProgress) {
3586
+ if (this.SearchInProgress()) {
3568
3587
  console.log("Attempt to order a column during a search. Operation ignored");
3569
3588
  return;
3570
3589
  }
3571
- if (!this.OrderBy || !this.Orderable)
3590
+ if (!this.OrderBy() || !this.Orderable())
3572
3591
  return;
3573
- var nextOrder = this.orderNext[this.Order || "NONE"];
3574
- this.Order = nextOrder;
3575
- this.onOrderChange.emit(this.Order);
3592
+ var nextOrder = this.orderNext[this._Order() || "NONE"];
3593
+ this.Order.set(nextOrder);
3594
+ this.onOrderChange.emit(nextOrder);
3576
3595
  }
3577
3596
  /**
3578
3597
  * Evento di inizio resize della colonna
@@ -3580,14 +3599,14 @@ class EsTh {
3580
3599
  * @param {any} ev Evento MouseDown
3581
3600
  */
3582
3601
  onResizeStart(ev) {
3583
- if (!this.Resizable)
3602
+ if (!this.Resizable())
3584
3603
  return;
3585
3604
  this.resizingThis = true;
3586
3605
  this.startOffset = this.myself.nativeElement.offsetWidth - ev.pageX;
3587
3606
  }
3588
3607
  /** Listener per la fine dell'operazione di resize */
3589
3608
  onMouseUp() {
3590
- if (!this.Resizable)
3609
+ if (!this.Resizable())
3591
3610
  return;
3592
3611
  this.resizingThis = false;
3593
3612
  }
@@ -3597,7 +3616,7 @@ class EsTh {
3597
3616
  * @param {$event} ev Evento MouseMove
3598
3617
  */
3599
3618
  onMouseMove($event) {
3600
- if (!this.Resizable || !this.resizingThis)
3619
+ if (!this.Resizable() || !this.resizingThis)
3601
3620
  return;
3602
3621
  //Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo
3603
3622
  //(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)
@@ -3606,33 +3625,12 @@ class EsTh {
3606
3625
  $event.preventDefault();
3607
3626
  }
3608
3627
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTh, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
3609
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsTh, isStandalone: false, selector: "[es-th]", inputs: { ID: ["es-th", "ID"], Order: "Order", Orderable: "Orderable", Display: "Display", Resizable: "Resizable", Pinned: "Pinned", SearchInProgress: "SearchInProgress", OrderBy: "OrderBy", Wrap: "Wrap", Fixed: "Fixed", Template: "Template", Visible: "Visible" }, outputs: { onOrderChange: "onOrderChange", onUnpinning: "onUnpinning" }, host: { listeners: { "window:mouseup.out-zone": "onMouseUp()", "window:mousemove.out-zone": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID && Orderable\" [class.app-pointer]=\"!!ID && Orderable\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order == 'DESC'\" [class.fa-chevron-up]=\"Order == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned && !Fixed\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable || Fixed || Pinned\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>", dependencies: [{ kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3628
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTh, isStandalone: false, selector: "[es-th]", inputs: { ID: { classPropertyName: "ID", publicName: "es-th", isSignal: true, isRequired: false, transformFunction: null }, _Order: { classPropertyName: "_Order", publicName: "Order", isSignal: true, isRequired: false, transformFunction: null }, Orderable: { classPropertyName: "Orderable", publicName: "Orderable", isSignal: true, isRequired: false, transformFunction: null }, Display: { classPropertyName: "Display", publicName: "Display", isSignal: true, isRequired: false, transformFunction: null }, Resizable: { classPropertyName: "Resizable", publicName: "Resizable", isSignal: true, isRequired: false, transformFunction: null }, Pinned: { classPropertyName: "Pinned", publicName: "Pinned", isSignal: true, isRequired: false, transformFunction: null }, SearchInProgress: { classPropertyName: "SearchInProgress", publicName: "SearchInProgress", isSignal: true, isRequired: false, transformFunction: null }, OrderBy: { classPropertyName: "OrderBy", publicName: "OrderBy", isSignal: true, isRequired: false, transformFunction: null }, Wrap: { classPropertyName: "Wrap", publicName: "Wrap", isSignal: true, isRequired: false, transformFunction: null }, Fixed: { classPropertyName: "Fixed", publicName: "Fixed", isSignal: true, isRequired: false, transformFunction: null }, Template: { classPropertyName: "Template", publicName: "Template", isSignal: false, isRequired: false, transformFunction: null }, Visible: { classPropertyName: "Visible", publicName: "Visible", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onOrderChange: "onOrderChange", onUnpinning: "onUnpinning" }, host: { listeners: { "window:mouseup.out-zone": "onMouseUp()", "window:mousemove.out-zone": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>", dependencies: [{ kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3610
3629
  }
3611
3630
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTh, decorators: [{
3612
3631
  type: Component,
3613
- args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID && Orderable\" [class.app-pointer]=\"!!ID && Orderable\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order == 'DESC'\" [class.fa-chevron-up]=\"Order == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned && !Fixed\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable || Fixed || Pinned\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>" }]
3614
- }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { ID: [{
3615
- type: Input,
3616
- args: ['es-th']
3617
- }], Order: [{
3618
- type: Input
3619
- }], Orderable: [{
3620
- type: Input
3621
- }], Display: [{
3622
- type: Input
3623
- }], Resizable: [{
3624
- type: Input
3625
- }], Pinned: [{
3626
- type: Input
3627
- }], SearchInProgress: [{
3628
- type: Input
3629
- }], OrderBy: [{
3630
- type: Input
3631
- }], Wrap: [{
3632
- type: Input
3633
- }], Fixed: [{
3634
- type: Input
3635
- }], Template: [{
3632
+ args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>" }]
3633
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { Template: [{
3636
3634
  type: Input
3637
3635
  }], onOrderChange: [{
3638
3636
  type: Output
@@ -3655,36 +3653,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
3655
3653
  /** Componente rappresentante una singola cella del body della tabella */
3656
3654
  class EsTd {
3657
3655
  /** @ignore */
3658
- constructor(cdr) {
3659
- this.cdr = cdr;
3656
+ constructor(el) {
3657
+ this.el = el;
3660
3658
  /** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */
3661
- this.ID = "";
3659
+ this.ID = input("", { alias: "es-td" });
3660
+ /** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */
3661
+ this.Context = input();
3662
3662
  /** Quando questa cella viene generata questo evento permette di dire "ehi, sono nato!" */
3663
3663
  this.onCellGeneration = new EventEmitter();
3664
3664
  /** Errore attualmente presente sulla cella */
3665
- this.ValidationError = "";
3665
+ this.ValidationError = signal("");
3666
3666
  }
3667
3667
  /** @ignore */
3668
3668
  ngAfterViewInit() {
3669
- this.onCellGeneration.emit({ id: this.ID, hash: this.Context, self: this });
3669
+ this.onCellGeneration.emit({ id: this.ID(), hash: this.Context(), self: this });
3670
3670
  }
3671
3671
  /** Api per impostare un "errore" su questa cella in maniera programmatica */
3672
3672
  validationError(error) {
3673
- this.ValidationError = error;
3674
- this.cdr.markForCheck();
3673
+ this.ValidationError.set(error);
3675
3674
  }
3676
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
3677
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsTd, isStandalone: false, selector: "[es-td]", inputs: { ID: ["es-td", "ID"], Context: "Context" }, outputs: { onCellGeneration: "onCellGeneration" }, ngImport: i0, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError\" [pTooltip]=\"ValidationError\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"], dependencies: [{ kind: "directive", type: i1$1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3675
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
3676
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTd, isStandalone: false, selector: "[es-td]", inputs: { ID: { classPropertyName: "ID", publicName: "es-td", isSignal: true, isRequired: false, transformFunction: null }, Context: { classPropertyName: "Context", publicName: "Context", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCellGeneration: "onCellGeneration" }, ngImport: i0, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"], dependencies: [{ kind: "directive", type: i1$1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
3678
3677
  }
3679
3678
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, decorators: [{
3680
3679
  type: Component,
3681
- args: [{ selector: "[es-td]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError\" [pTooltip]=\"ValidationError\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"] }]
3682
- }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { ID: [{
3683
- type: Input,
3684
- args: ['es-td']
3685
- }], Context: [{
3686
- type: Input
3687
- }], onCellGeneration: [{
3680
+ args: [{ selector: "[es-td]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"] }]
3681
+ }], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { onCellGeneration: [{
3688
3682
  type: Output
3689
3683
  }] } });
3690
3684
 
@@ -3894,7 +3888,8 @@ class EsTableDefaultable {
3894
3888
  /** Componente che permette di rappresentare una griglia di valori */
3895
3889
  class EsTableComponent {
3896
3890
  /** @ignore */
3897
- constructor(ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
3891
+ constructor(_zone, ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
3892
+ this._zone = _zone;
3898
3893
  this.ngControl = ngControl;
3899
3894
  this.prefService = prefService;
3900
3895
  this.deafults = deafults;
@@ -3910,29 +3905,32 @@ class EsTableComponent {
3910
3905
  this.logger = logger;
3911
3906
  this.emb = emb;
3912
3907
  this.rendererRef = rendererRef;
3908
+ this._destroyed$ = new Subject();
3913
3909
  /** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */
3914
3910
  this.FocusSubject = new Subject();
3915
3911
  /** Se vengono effettuati 2 click a distanza inferiore a questi Millisecondi viene considerato un doppio click */
3916
3912
  this.doubleClickBufferMs = 200;
3917
- /** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */
3918
- this.View = null;
3919
- /** Indica se l'es-table deve mostrare il check globale nell'header per fare il "seleziona tutto" */
3920
- this.globalCheck = false;
3921
3913
  /** Tiene da conto l'ultimo elemento selezionato in modo da poter effettuare il SHIFT+CLICK */
3922
3914
  this.lastSelected = null;
3915
+ /** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */
3916
+ this.View = null; // TODO: signal
3917
+ /** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */
3918
+ this.arrayPulsanti = signal(null);
3919
+ /** Indica se l'es-table deve mostrare il check globale nell'header per fare il "seleziona tutto" */
3920
+ this.globalCheck = model(false);
3923
3921
  /** Conteggio interno per il numero di elementi selezionati */
3924
- this.selectedObjects = 0;
3922
+ this.selectedObjects = signal(0);
3925
3923
  /** Indica se è possibile effettuare una selezione massiva */
3926
- this.canSelectAll = false;
3924
+ this.canSelectAll = signal(false);
3927
3925
  /** Indica se il componente sta gestendo un IAppSearch<any> */
3928
- this.viewMode = false;
3926
+ this.viewMode = signal(false);
3929
3927
  /** Indica se il componente sta gestendo un any[] */
3930
- this.arrayMode = false;
3928
+ this.arrayMode = signal(false);
3931
3929
  /**
3932
3930
  * Contenitore degli elementi da listare lato interfaccia dopo tutte le elaborazioni del caso,
3933
3931
  * generalmente non sono altro che tutti gli oggetti da presentare con in più l'hash calcolato per identificare 1 oggetto con la propria riga
3934
3932
  */
3935
- this.boundSource = [];
3933
+ this.boundSource = signal([]);
3936
3934
  /** Stessa cosa della **boundSource**, utilizzata come appoggio temporaneo interno */
3937
3935
  this.TMPBoundSource = [];
3938
3936
  /** @deprecated "Fetta" di oggetti utilizzata nell'endless scroll, ogni elemento di questo array è un blocchetto di 100 elementi */
@@ -3942,17 +3940,17 @@ class EsTableComponent {
3942
3940
  /** Variabile che identifica il valore del "seleziona Tutto" nella paginazione */
3943
3941
  this.defaultAllPageOverride = 999999;
3944
3942
  /** Indica se utilizzare il sistema di autoupdate, cioè un trigger time-izzato in alto a destra della tabella che ripete le ricerche ogni X **seconds** */
3945
- this.autoUpdate = false;
3943
+ this.autoUpdate = model(false);
3946
3944
  /** Numero di secondi da fare trascorrere fra una ricerca e l'altra */
3947
- this.seconds = '10';
3945
+ this.seconds = model("10");
3948
3946
  /** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */
3949
- this.researchInProgress = false;
3947
+ this.researchInProgress = model(false);
3950
3948
  /** Modello di appoggio temporaneo per i **RowTDs** */
3951
3949
  this.TMPRowTDs = null;
3952
3950
  /** Modello rappresentante un dizionario di righe della tabella, con chiave l'hash e valore la lista di celle */
3953
3951
  this.RowTDs = null;
3954
3952
  /** Indica se **RowTDs** è un oggetto vuoto o meno */
3955
- this.EmptyRowTds = true;
3953
+ this.EmptyRowTds = signal(true);
3956
3954
  /** Modello di appoggio temporaneo per i **RowTHs** */
3957
3955
  this.TMPRowTHs = null;
3958
3956
  /** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */
@@ -3983,145 +3981,171 @@ class EsTableComponent {
3983
3981
  * ecc...
3984
3982
  * viene dedotto dal sistema in automatico
3985
3983
  */
3986
- this.UseCustomCells = null;
3984
+ this.UseCustomCells = signal(null);
3987
3985
  /**
3988
3986
  * Indica se oltre alle colonne dinamiche specifiche di un tipo di oggetto ci sono anche colonne dinamiche aggiunte dall'utente
3989
3987
  *
3990
3988
  * Es. una colonna in cui mostrare sempre un iconcina
3991
3989
  */
3992
- this.UserDefinedDynamicCols = false;
3990
+ this.UserDefinedDynamicCols = signal(false);
3993
3991
  /** Indica che questo è il primo Bind della tabella, viene settato a false non appena il primo bind viene terminato con successo */
3994
- this.FirstBind = true;
3992
+ this.FirstBind = signal(true);
3995
3993
  /** Lista di colonne che si possono visualizzare/ordinare fra di loro */
3996
3994
  this.ColumnsList = [];
3997
3995
  /** Variabile d'appoggio usata dalla dialog di selezione/nascondimento, per evitare di danneggiare **ColumnsList** in caso di modifiche poi annullate */
3998
3996
  this.TMPColumnsList = [];
3999
3997
  /** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */
4000
- this.globalColVisCheck = false;
3998
+ this.globalColVisCheck = model(false);
4001
3999
  /** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */
4002
- this.CornerMenuOptions = null;
4000
+ this.CornerMenuOptions = input(null);
4003
4001
  /** Indica se dev'essere possibile effettuare il resize delle colonne */
4004
- this.ColumnsResizable = null;
4002
+ this._ColumnsResizable = input(null, { alias: "ColumnsResizable" });
4003
+ this.ColumnsResizable = signal(null);
4005
4004
  /** Indica se dev'essere possibile effettuare il pinning delle colonne */
4006
- this.ColumnsPinnable = null;
4005
+ this._ColumnsPinnable = input(null, { alias: "ColumnsPinnable" });
4006
+ this.ColumnsPinnable = signal(null);
4007
4007
  /** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
4008
- this.AutoUpdate = null;
4008
+ this._AutoUpdate = input(null, { alias: "AutoUpdate" });
4009
+ this.AutoUpdate = signal(null);
4009
4010
  /** Indica l'altezza cablata che deve assumere la tabella. Es: "100px" | "100%" ... */
4010
- this.Height = null;
4011
+ this.Height = input(null);
4011
4012
  /** Indica il colore di sfondo dello spazio vuoto (non ricoperto da dati). Particolarmente utile da impostare in caso di **Height** diverso da null */
4012
- this.EmptySpaceBackgroundColor = null;
4013
+ this.EmptySpaceBackgroundColor = input(null);
4013
4014
  /** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/
4014
- this.EsTableHandledSearch = false;
4015
+ this.EsTableHandledSearch = input(false);
4015
4016
  /** Permette di impostare l'altezza massima della tabella. Se null la dimensione si adatta al numero di elementi attualmente in visualizzazione */
4016
- this.MaxHeight = null;
4017
+ this.MaxHeight = input(null);
4017
4018
  /** Classi da applicare al contenitore della tabella */
4018
- this.ContainerClass = null;
4019
+ this._ContainerClass = input(null, { alias: "ContainerClass" });
4020
+ this.ContainerClass = signal(null);
4019
4021
  /** Permette o meno l'export in formato XLSX */
4020
- this.XLSXExport = null;
4022
+ this.XLSXExport = input(null);
4021
4023
  /** Permette o meno l'export in formato CSV */
4022
- this.CSVExport = true;
4024
+ this.CSVExport = input(true);
4023
4025
  /** Permette di visualizzare o meno l'opzione di paginazione "Tutti" */
4024
- this.AllSearch = null;
4026
+ this._AllSearch = input(null, { alias: "AllSearch" });
4027
+ this.AllSearch = signal(null);
4025
4028
  /** Diminuisce gli spazi fra una cella e l'altra, e internamente il padding del font in modo da presentare molti più dati in un'unica pagina */
4026
- this.HighCellDensity = null;
4029
+ this.HighCellDensity = input(null);
4027
4030
  /** Abilita o meno la possibilità di selezionare oggetti */
4028
- this.Selection = null;
4031
+ this._Selection = input(null, { alias: "Selection" });
4032
+ this.Selection = signal(null);
4029
4033
  /** Mostra o meno un messaggio di Loading al primo caricamento della tabella */
4030
- this.ShowLoadingOnBootstrap = null;
4034
+ this.ShowLoadingOnBootstrap = input(null);
4031
4035
  /** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */
4032
- this.Removal = null;
4036
+ this.Removal = input(null);
4033
4037
  /**
4034
4038
  * Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata
4035
4039
  *
4036
4040
  * Come condizione si considera un semplice campo su cui effettuare un controllo booleano, come ad esempio "canremove"
4037
4041
  */
4038
- this.RemovalCondition = '';
4042
+ this.RemovalCondition = input('');
4039
4043
  /** Indica se abilitare la possibilità di esportare la vista dati attuale */
4040
- this.Export = null;
4044
+ this._Export = input(null, { alias: "Export" });
4045
+ this.Export = signal(null);
4041
4046
  /** Indica se permettere la selezione multipla Windows-like cliccando un oggetto e facendo poi Shift + click su un oggetto successivo */
4042
- this.ShiftClick = null;
4047
+ this._ShiftClick = input(null, { alias: "ShiftClick" });
4048
+ this.ShiftClick = signal(null);
4043
4049
  /** Indica il testo che va a sostituire "Oggetti Visualizzati" in caso si stia facendo qualcosa di custom */
4044
- this.CountLabel = null;
4050
+ this.CountLabel = input(null);
4045
4051
  /** Indica se nascondere o mostrare il componente di paginazione */
4046
- this.HidePaging = null;
4052
+ this._HidePaging = input(null, { alias: "HidePaging" });
4053
+ this.HidePaging = signal(null);
4047
4054
  /** Indica se nascondere o mostrare il conteggio degli elementi trovati */
4048
- this.HidePagingCount = null;
4055
+ this._HidePagingCount = input(null, { alias: "HidePagingCount" });
4056
+ this.HidePagingCount = signal(null);
4049
4057
  /** Indica se nascondere o mostrare i pulsanti di paginazione */
4050
- this.HidePagingButtons = null;
4058
+ this._HidePagingButtons = input(null, { alias: "HidePagingButtons" });
4059
+ this.HidePagingButtons = signal(null);
4051
4060
  /** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */
4052
4061
  this.ContextMenu = null;
4053
4062
  /** Nome dell'esportazione generata da questa tabella */
4054
- this.ExportFileName = 'Export.csv';
4063
+ this.ExportFileName = input("Export.csv");
4055
4064
  /** Classe (HTML) di default della tabella */
4056
- this.TableClass = null;
4065
+ this._TableClass = input(null, { alias: "TableClass" });
4066
+ this.TableClass = signal(null);
4057
4067
  /** Indica di esportare solo le colonne attualmente visibili della view */
4058
- this.ExportOnlyVisibleColumns = false;
4068
+ this.ExportOnlyVisibleColumns = input(false);
4059
4069
  /** @deprecated Indica la presenza di raggruppamenti a livello di header */
4060
- this.HasHeaderGroup = null;
4070
+ this.HasHeaderGroup = input(null);
4061
4071
  /** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
4062
- this.HasSecondaryHeaderGroup = null;
4072
+ this.HasSecondaryHeaderGroup = input(null);
4063
4073
  /** Indica se nascondere gli Header della tabella */
4064
- this.HeaderHidden = null;
4074
+ this.HeaderHidden = input(null);
4065
4075
  /** Indica se nascondere il Body della tabella */
4066
- this.BodyHidden = null;
4076
+ this.BodyHidden = input(null);
4067
4077
  /**
4068
4078
  * Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,
4069
4079
  * questo Input gestisce se questi input sono abilitati o meno
4070
4080
  */
4071
- this.SelectionDisabled = null;
4081
+ this.SelectionDisabled = input(null);
4072
4082
  /**
4073
4083
  * Indica se forzare il sistema di selezione a gestire un elemento per volta.
4074
4084
  * Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale
4075
4085
  */
4076
- this.SingleSelection = null;
4086
+ this.SingleSelection = input(null);
4077
4087
  /** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */
4078
4088
  this.RowClassAssigner = null;
4079
4089
  /** Permette di ordinare i dati in maniera discendente o ascendente */
4080
- this.OrderByColumn = null;
4090
+ this._OrderByColumn = input(null, { alias: "OrderByColumn" });
4091
+ this.OrderByColumn = signal(null);
4081
4092
  /** Permette di avere più direttive di ordinamento dei dati */
4082
- this.MultipleOrderingDirectives = true;
4093
+ this.MultipleOrderingDirectives = input(true);
4083
4094
  /** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */
4084
- this.HiddenColumns = null;
4095
+ this._HiddenColumns = input(null, { alias: "HiddenColumns" });
4096
+ this.HiddenColumns = signal(null);
4085
4097
  /** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */
4086
- this.ColumnsOrdering = null;
4098
+ this._ColumnsOrdering = input(null, { alias: "ColumnsOrdering" });
4099
+ this.ColumnsOrdering = signal(null);
4087
4100
  /** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */
4088
- this.SearchView = null;
4101
+ this.SearchView = input(null);
4089
4102
  /** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */
4090
- this.SelectAll = null;
4103
+ this._SelectAll = input(null, { alias: "SelectAll" });
4104
+ this.SelectAll = signal(null);
4091
4105
  /** Simula la paginazione anche per le tabelle che funzionano in modalità Array */
4092
- this.UseArrayModePaging = true;
4106
+ this._UseArrayModePaging = input(true, { alias: "UseArrayModePaging" });
4107
+ this.UseArrayModePaging = signal(true);
4093
4108
  /** Definizione di colonne dinamche per la modalità, appunto, dinamica */
4094
- this.DynamicRowColumnsDefinition = null;
4109
+ this._DynamicRowColumnsDefinition = input(null, { alias: 'DynamicRowColumnsDefinition' });
4110
+ this.DynamicRowColumnsDefinition = signal(null);
4095
4111
  /** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
4096
- this.DynamicOperations = [];
4112
+ this.DynamicOperations = input([]);
4097
4113
  /** Indica se visualizzare i dati in maniera gerarchica */
4098
- this.Hierarchy = null;
4114
+ this.Hierarchy = input(null);
4099
4115
  /** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */
4100
- this.ParentKey = '';
4116
+ this._ParentKey = input('', { alias: "ParentKey" });
4117
+ this.ParentKey = signal('');
4101
4118
  /** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */
4102
- this.OwnKey = '';
4119
+ this._OwnKey = input('', { alias: "OwnKey" });
4120
+ this.OwnKey = signal('');
4103
4121
  /** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */
4104
- this.StartsExpanded = true;
4122
+ this.StartsExpanded = input(true);
4105
4123
  /** Indica se effettuare il salvataggio delle preferenze di ricerca */
4106
- this.SavePreferences = null;
4124
+ this._SavePreferences = input(null, { alias: "SavePreferences" });
4125
+ this.SavePreferences = signal(null);
4107
4126
  /** Allineamento di default per celle e headers */
4108
- this.DefaultAlignment = null;
4127
+ this._DefaultAlignment = input(null, { alias: "DefaultAlignment" });
4128
+ this.DefaultAlignment = signal(null);
4109
4129
  /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
4110
- this.PagingStyle = null;
4130
+ this._PagingStyle = input(null, { alias: "PagingStyle" });
4131
+ this.PagingStyle = signal(null);
4111
4132
  /** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
4112
- this.RowGroupingPagingStyle = null;
4133
+ this._RowGroupingPagingStyle = input(null, { alias: "RowGroupingPagingStyle" });
4134
+ this.RowGroupingPagingStyle = signal(null);
4113
4135
  /** Qualora per qualsiasi motivo non venisse usato **items** dell'AppSearch questo Input indica qual è il nome della proprietà da utilizzare */
4114
- this.ItemSourceProperty = "";
4136
+ this.ItemSourceProperty = input('');
4115
4137
  /** Indica se utilizzare la cache di selezione che permette di mantenere gli stati di selezione dei vari oggetti navigando da una pagina all'altra */
4116
- this.UseSelectionCache = null;
4138
+ this._UseSelectionCache = input(null, { alias: "UseSelectionCache" });
4139
+ this.UseSelectionCache = signal(null);
4117
4140
  /** Permette di decidere se, in modalità raggruppamento, mostrare o meno il valore delle colonne di gruppo negli oggetti finali. Di default sono nascosti */
4118
- this.ShowItemGroupsColumns = null;
4141
+ this._ShowItemGroupsColumns = input(null, { alias: "ShowItemGroupsColumns" });
4142
+ this.ShowItemGroupsColumns = signal(null);
4119
4143
  /** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */
4120
- this.Editable = false;
4144
+ this.Editable = input(false);
4121
4145
  /** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */
4122
- this.RangeSelection = false;
4146
+ this.RangeSelection = input(false);
4123
4147
  /** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */
4124
- this.SearchThrottle = 50;
4148
+ this.SearchThrottle = input(50);
4125
4149
  /** Evento che viene richiamato al cambio di oridnamento di una colonna */
4126
4150
  this.onOrderChanged = new EventEmitter();
4127
4151
  /**
@@ -4153,7 +4177,8 @@ class EsTableComponent {
4153
4177
  /** Numero di pagine (durante la paginazione in modalità Array) */
4154
4178
  this.arraymodePages = 1;
4155
4179
  /** Oggetti per ogni pagina (durante la paginazione in modalità Array) */
4156
- this.ArraymodeItemsPerPage = null;
4180
+ this._ArraymodeItemsPerPage = input(null, { alias: "ArraymodeItemsPerPage" });
4181
+ this.ArraymodeItemsPerPage = signal(null);
4157
4182
  /** Colonne da visualizzare in modalità array */
4158
4183
  this.arrayColumns = [];
4159
4184
  /** Ordine delle colonne da visualizzare in modalità array */
@@ -4185,15 +4210,19 @@ class EsTableComponent {
4185
4210
  /** Variabile d'appoggio per capire se c'è bisogno di ri-effettuare una ricerca o meno */
4186
4211
  this.ResearchNeeded = false;
4187
4212
  /** Colonne visibili della vista attuale. Valorizzato di default al numero massimo di colonne supportate dalla tabella per le casistiche in assenza di custom cells */
4188
- this.Columns = { Visibile: 100, VisibleUnpinned: 100, Global: 100 };
4213
+ this.Columns = signal({ Visibile: 100, VisibleUnpinned: 100, Global: 100 });
4189
4214
  /** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */
4190
4215
  this.MainGroupView = null;
4191
4216
  /** Conteggio base degli oggetti. In modalità normale viene resettato ad ogni nuova View inserita, in modalità RowGrouping viene resettato solo ad una nuova View di livello "0" */
4192
4217
  this.BaseItemsCount = null;
4218
+ /** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/
4219
+ this.HasPinnedColumns = signal(null);
4220
+ /** Larghezza calcolata del container delle colonne pinnate */
4221
+ this.PinnedContainerWidth = signal(null);
4193
4222
  /** Indica se nonostante siamo in modalità array sono stati individuati dei gruppi. In tal caso es-table si comporta da pseudo backend ed effettua le aggregazioni e raggruppamenti completamente lato client */
4194
- this.ArrayGrouping = false;
4223
+ this.ArrayGrouping = signal(false);
4195
4224
  /** Indica che l'es-table è basata sulle direttive (nuova modalità) */
4196
- this.DirectivesBased = false;
4225
+ this.DirectivesBased = signal(false);
4197
4226
  /** Indica lo stato di selezione per singola cella */
4198
4227
  this.selectionStatus = {};
4199
4228
  /** Chiamata reale al writeValue dopo il passaggio di **SearchThrottle** millisecondi. Solo modalità EsTableHandledSearch */
@@ -4230,6 +4259,19 @@ class EsTableComponent {
4230
4259
  this.firstCoordinates = null;
4231
4260
  //* Piango
4232
4261
  this.EsTdsCache = {};
4262
+ effect(() => {
4263
+ if (this.SearchView())
4264
+ this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.SearchView().page, this.SearchView().pages || 1, this.SearchView().objectcount || this.SearchView().items.length, this.SearchView().itemsperpageoverride));
4265
+ });
4266
+ // Sarebbe bello... per quando View diventa signal
4267
+ /*effect(() => {
4268
+
4269
+ if (this.View) {
4270
+ let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;
4271
+ if (firstItemGroupOrNoGrouping)
4272
+ this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));
4273
+ }
4274
+ })*/
4233
4275
  // Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata
4234
4276
  this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this)
4235
4277
  this.handleCopy(); });
@@ -4262,24 +4304,33 @@ class EsTableComponent {
4262
4304
  this.onSelectionChanged.emit(itemSelection);
4263
4305
  });
4264
4306
  // Assegnazione per tutti gli Input di default
4265
- this.ColumnsResizable = this.utilities_H.InputOrDefault(this.ColumnsResizable, this.deafults?.ColumnsResizable);
4266
- this.AutoUpdate = this.utilities_H.InputOrDefault(this.AutoUpdate, this.deafults?.AutoUpdate);
4267
- this.AllSearch = this.utilities_H.InputOrDefault(this.AllSearch, this.deafults?.AllSearch, true);
4268
- this.Export = this.utilities_H.InputOrDefault(this.Export, this.deafults?.Export);
4269
- this.HidePaging = this.utilities_H.InputOrDefault(this.HidePaging, this.deafults?.HidePaging, false);
4270
- this.HidePagingCount = this.utilities_H.InputOrDefault(this.HidePagingCount, this.deafults?.HidePagingCount);
4271
- this.HidePagingButtons = this.utilities_H.InputOrDefault(this.HidePagingButtons, this.deafults?.HidePagingButtons);
4272
- this.ContainerClass = this.utilities_H.InputOrDefault(this.ContainerClass, this.deafults?.ContainerClass, '');
4273
- this.TableClass = this.utilities_H.InputOrDefault(this.TableClass, this.deafults?.TableClass, 'table table-striped table-hover table-sm');
4274
- this.Selection = this.utilities_H.InputOrDefault(this.Selection, this.deafults?.Selection);
4275
- this.SavePreferences = this.utilities_H.InputOrDefault(this.SavePreferences, this.deafults?.SavePreferences);
4276
- this.PagingStyle = this.utilities_H.InputOrDefault(this.PagingStyle, this.deafults?.PagingStyle, 'bottom');
4277
- this.RowGroupingPagingStyle = this.utilities_H.InputOrDefault(this.RowGroupingPagingStyle, this.deafults?.RowGroupingPagingStyle, 'left');
4278
- this.UseSelectionCache = this.utilities_H.InputOrDefault(this.UseSelectionCache, this.deafults?.UseSelectionCache, true);
4279
- this.ShowItemGroupsColumns = this.utilities_H.InputOrDefault(this.ShowItemGroupsColumns, this.deafults?.ShowItemGroupsColumns, false);
4280
- this.ArraymodeItemsPerPage = this.utilities_H.InputOrDefault(this.ArraymodeItemsPerPage, this.deafults?.ArraymodeItemsPerPage, 15);
4281
- this.ColumnsPinnable = this.utilities_H.InputOrDefault(this.ColumnsPinnable, this.deafults?.ColumnsPinnable, true);
4282
- this.DefaultAlignment = this.utilities_H.InputOrDefault(this.DefaultAlignment, this.deafults?.DefaultAlignment, 'Left');
4307
+ this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));
4308
+ this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));
4309
+ this.AllSearch.set(this.utilities_H.InputOrDefault(this._AllSearch(), this.deafults?.AllSearch, true));
4310
+ this.Export.set(this.utilities_H.InputOrDefault(this._Export(), this.deafults?.Export));
4311
+ this.HidePaging.set(this.utilities_H.InputOrDefault(this._HidePaging(), this.deafults?.HidePaging, false));
4312
+ this.HidePagingCount.set(this.utilities_H.InputOrDefault(this._HidePagingCount(), this.deafults?.HidePagingCount));
4313
+ this.HidePagingButtons.set(this.utilities_H.InputOrDefault(this._HidePagingButtons(), this.deafults?.HidePagingButtons));
4314
+ this.ContainerClass.set(this.utilities_H.InputOrDefault(this._ContainerClass(), this.deafults?.ContainerClass, ''));
4315
+ this.TableClass.set(this.utilities_H.InputOrDefault(this._TableClass(), this.deafults?.TableClass, 'table table-striped table-hover table-sm'));
4316
+ this.Selection.set(this.utilities_H.InputOrDefault(this._Selection(), this.deafults?.Selection));
4317
+ this.SavePreferences.set(this.utilities_H.InputOrDefault(this._SavePreferences(), this.deafults?.SavePreferences));
4318
+ this.PagingStyle.set(this.utilities_H.InputOrDefault(this._PagingStyle(), this.deafults?.PagingStyle, 'bottom'));
4319
+ this.RowGroupingPagingStyle.set(this.utilities_H.InputOrDefault(this._RowGroupingPagingStyle(), this.deafults?.RowGroupingPagingStyle, 'left'));
4320
+ this.UseSelectionCache.set(this.utilities_H.InputOrDefault(this._UseSelectionCache(), this.deafults?.UseSelectionCache, true));
4321
+ this.ShowItemGroupsColumns.set(this.utilities_H.InputOrDefault(this._ShowItemGroupsColumns(), this.deafults?.ShowItemGroupsColumns, false));
4322
+ this.ArraymodeItemsPerPage.set(this.utilities_H.InputOrDefault(this._ArraymodeItemsPerPage(), this.deafults?.ArraymodeItemsPerPage, 15));
4323
+ this.ColumnsPinnable.set(this.utilities_H.InputOrDefault(this._ColumnsPinnable(), this.deafults?.ColumnsPinnable, true));
4324
+ this.DefaultAlignment.set(this.utilities_H.InputOrDefault(this._DefaultAlignment(), this.deafults?.DefaultAlignment, 'Left'));
4325
+ this.HiddenColumns.set(this.utilities_H.InputOrDefault(this._HiddenColumns(), null));
4326
+ this.ColumnsOrdering.set(this.utilities_H.InputOrDefault(this._ColumnsOrdering(), null));
4327
+ this.OrderByColumn.set(this.utilities_H.InputOrDefault(this._OrderByColumn(), null));
4328
+ this.SelectAll.set(this.utilities_H.InputOrDefault(this._SelectAll(), null));
4329
+ this.ShiftClick.set(this.utilities_H.InputOrDefault(this._ShiftClick(), null));
4330
+ this.UseArrayModePaging.set(this.utilities_H.InputOrDefault(this._UseArrayModePaging(), true));
4331
+ this.OwnKey.set(this.utilities_H.InputOrDefault(this._OwnKey(), ''));
4332
+ this.ParentKey.set(this.utilities_H.InputOrDefault(this._ParentKey(), ''));
4333
+ this.DynamicRowColumnsDefinition.set(this.utilities_H.InputOrDefault(this._DynamicRowColumnsDefinition(), null));
4283
4334
  }
4284
4335
  /** @ignore */
4285
4336
  async ngAfterViewInit() {
@@ -4296,23 +4347,23 @@ class EsTableComponent {
4296
4347
  let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;
4297
4348
  let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;
4298
4349
  if (usesThsAndTdsDirectives || hasNoContentProjection) {
4299
- if (this.UseCustomCells == null)
4300
- this.UseCustomCells = true;
4301
- if (this.HiddenColumns == null && this.UseCustomCells)
4302
- this.HiddenColumns = true;
4303
- if (this.ColumnsOrdering == null && this.UseCustomCells)
4304
- this.ColumnsOrdering = true;
4305
- if (this.OrderByColumn == null && this.UseCustomCells)
4306
- this.OrderByColumn = true;
4307
- if (this.SelectAll == null && this.Selection)
4308
- this.SelectAll = true;
4309
- if (this.ShiftClick == null && this.Selection)
4310
- this.ShiftClick = true;
4311
- this.DirectivesBased = true;
4350
+ if (this.UseCustomCells() == null)
4351
+ this.UseCustomCells.set(true);
4352
+ if (this.HiddenColumns() == null && this.UseCustomCells)
4353
+ this.HiddenColumns.set(true);
4354
+ if (this.ColumnsOrdering() == null && this.UseCustomCells)
4355
+ this.ColumnsOrdering.set(true);
4356
+ if (this.OrderByColumn() == null && this.UseCustomCells)
4357
+ this.OrderByColumn.set(true);
4358
+ if (this.SelectAll() == null && this.Selection)
4359
+ this.SelectAll.set(true);
4360
+ if (this.ShiftClick() == null && this.Selection)
4361
+ this.ShiftClick.set(true);
4362
+ this.DirectivesBased.set(true);
4312
4363
  }
4313
4364
  //Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,
4314
4365
  //che con solo la proiezione (senza celle cusotm) non è disponibile
4315
- if (this.Hierarchy && !this.UseCustomCells)
4366
+ if (this.Hierarchy() && !this.UseCustomCells())
4316
4367
  throw "Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\"true\" è richiesto anche [UseCustomCells]=\"true\"";
4317
4368
  }
4318
4369
  /** @ignore */
@@ -4325,12 +4376,8 @@ class EsTableComponent {
4325
4376
  this.ctxMenuSubscription.unsubscribe();
4326
4377
  if (this.copyPasteDetector.ActiveEstReference == this)
4327
4378
  this.copyPasteDetector.ActiveEstReference = null;
4328
- }
4329
- /** @ignore */
4330
- async ngOnChanges(changes) {
4331
- let newSearchView = changes['SearchView'];
4332
- if (newSearchView && this.SearchView)
4333
- this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.objectcount, this.SearchView.itemsperpageoverride);
4379
+ this._destroyed$.next();
4380
+ this._destroyed$.complete();
4334
4381
  }
4335
4382
  /** @ignore */
4336
4383
  registerOnChange(fn) { this.propagateChange = fn; }
@@ -4338,28 +4385,28 @@ class EsTableComponent {
4338
4385
  registerOnTouched(fn) { }
4339
4386
  /** @ignore */
4340
4387
  changed(clearItems = false) {
4341
- if (clearItems && this.viewMode) {
4388
+ if (clearItems && this.viewMode()) {
4342
4389
  if (!this.ItemSourceProperty)
4343
4390
  this.View.items = [];
4344
4391
  else
4345
- this.View[this.ItemSourceProperty] = [];
4392
+ this.View[this.ItemSourceProperty()] = [];
4346
4393
  }
4347
4394
  this.propagateChange(this.View);
4348
4395
  }
4349
4396
  /** @ignore */
4350
4397
  async writeValue(obj, throttle = true) {
4351
4398
  this.View = obj ? obj : null;
4352
- if (this.EsTableHandledSearch && throttle) {
4399
+ if (this.EsTableHandledSearch() && throttle) {
4353
4400
  if (this.callTimeout)
4354
4401
  clearTimeout(this.callTimeout);
4355
- this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle);
4402
+ this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle());
4356
4403
  return;
4357
4404
  }
4358
4405
  // Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress
4359
- this.researchInProgress = false;
4360
- if (!this.View && !this.SearchView) {
4406
+ this.researchInProgress.set(false);
4407
+ if (!this.View && !this.SearchView()) {
4361
4408
  // Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla
4362
- this.boundSource = this.TMPBoundSource || [];
4409
+ this.boundSource.set(this.TMPBoundSource || []);
4363
4410
  // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
4364
4411
  this.cdr.markForCheck();
4365
4412
  return;
@@ -4368,23 +4415,23 @@ class EsTableComponent {
4368
4415
  // lo correggo--------------------------------------------------------------------------------------------------------------
4369
4416
  if (this.View && typeof this.View.itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))
4370
4417
  this.View.__proto__ = new AppSearch();
4371
- else if (this.SearchView && typeof this.SearchView.itemsperpageoverride != 'undefined' && !(this.SearchView instanceof AppSearch))
4372
- this.SearchView.__proto__ = new AppSearch();
4418
+ else if (this.SearchView() && typeof this.SearchView().itemsperpageoverride != 'undefined' && !(this.SearchView() instanceof AppSearch))
4419
+ this.SearchView().__proto__ = new AppSearch();
4373
4420
  // -------------------------------------------------------------------------------------------------------------------------
4374
4421
  if (this.View && this.View instanceof AppSearch) {
4375
4422
  // Se cambia l'oggetto intero significa che ho rimandato la ricerca
4376
4423
  this.setMode('view');
4377
4424
  let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;
4378
4425
  // Queste sono item source custom. Le valorizzo al default se non esistono
4379
- if (this.ItemSourceProperty && !this.View[this.ItemSourceProperty])
4380
- this.View[this.ItemSourceProperty] = [];
4426
+ if (this.ItemSourceProperty() && !this.View[this.ItemSourceProperty()])
4427
+ this.View[this.ItemSourceProperty()] = [];
4381
4428
  // Se vengo da una ricerca interna mantengo lo stato di selezione precedente (quindi su cambio pagina, cambio ipp, ecc...)
4382
4429
  // se invece l'utente ha fatto una ricerca lui (quindi cambiando filtri), secco le info di selezione
4383
- if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache)
4430
+ if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache())
4384
4431
  this.resetSelection(true);
4385
4432
  this.View.internalsearchrequest = false;
4386
4433
  // Recupero Preference
4387
- if (this.SavePreferences) {
4434
+ if (this.SavePreferences()) {
4388
4435
  if (!this.ngControl.name)
4389
4436
  console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
4390
4437
  else if (!this.prefService)
@@ -4435,16 +4482,15 @@ class EsTableComponent {
4435
4482
  }
4436
4483
  }
4437
4484
  }
4438
- // 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)
4439
4485
  if (firstItemGroupOrNoGrouping)
4440
- this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty ? this.View[this.ItemSourceProperty] : this.View.items).length, this.View.itemsperpageoverride);
4486
+ this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));
4441
4487
  }
4442
4488
  else if (this.View && (this.View.length != null && this.View.length != undefined)) {
4443
4489
  this.setMode('array');
4444
- if (!this.UseSelectionCache || !this.arraymodeSelection)
4490
+ if (!this.UseSelectionCache() || !this.arraymodeSelection)
4445
4491
  this.resetSelection(true);
4446
4492
  // Recupero Preference
4447
- if (this.SavePreferences) {
4493
+ if (this.SavePreferences()) {
4448
4494
  if (!this.ngControl.name)
4449
4495
  console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
4450
4496
  else if (!this.prefService)
@@ -4484,17 +4530,15 @@ class EsTableComponent {
4484
4530
  }
4485
4531
  }
4486
4532
  }
4487
- if (this.SearchView)
4488
- this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.items.length, this.SearchView.itemsperpageoverride);
4489
4533
  }
4490
4534
  this.finalizeContext();
4491
4535
  this.postBoundSourceCalculation();
4492
- if (this.View && !this.View.selfsearch && this.EsTableHandledSearch && !this.View.firstsearch) {
4536
+ if (this.View && !this.View.selfsearch && this.EsTableHandledSearch() && !this.View.firstsearch) {
4493
4537
  this.View.selfsearch = true;
4494
4538
  this.changed(true);
4495
4539
  this.onSearchRequest.emit(false);
4496
4540
  }
4497
- else if (this.View && this.View.selfsearch && this.EsTableHandledSearch) {
4541
+ else if (this.View && this.View.selfsearch && this.EsTableHandledSearch()) {
4498
4542
  this.View.selfsearch = false;
4499
4543
  this.changed();
4500
4544
  }
@@ -4505,54 +4549,54 @@ class EsTableComponent {
4505
4549
  */
4506
4550
  finalizeContext() {
4507
4551
  let viewCasted = this.View;
4508
- let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode && this.EsThsDirective.some(t => t.thGroup));
4552
+ let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective.some(t => t.thGroup));
4509
4553
  // Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
4510
- if (this.arrayMode && hasRowGroups)
4511
- this.UseArrayModePaging = false;
4554
+ if (this.arrayMode() && hasRowGroups)
4555
+ this.UseArrayModePaging.set(false);
4512
4556
  // Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia
4513
4557
  this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);
4514
4558
  // Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource
4515
- if (this.Hierarchy && !hasRowGroups)
4559
+ if (this.Hierarchy() && !hasRowGroups)
4516
4560
  this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);
4517
4561
  // L'hashing degli oggetti lo faccio a prescindere
4518
4562
  this.utilities_H.calculateHash(this.TMPBoundSource);
4519
4563
  // Assegno a una variabile mia l'eventuale override per la classe della riga
4520
4564
  // Se poi sono in modalità gerarchica inietto anche la classe per la configurazione del livello della riga
4521
- if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy) {
4565
+ if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy()) {
4522
4566
  for (let i = 0; i < this.TMPBoundSource.length; i++) {
4523
4567
  let item = this.TMPBoundSource[i];
4524
- item._rowClass = this.RowClassAssigner ? this.RowClassAssigner(item) : "";
4525
- item._rowClass += this.Hierarchy ? " est-row-lvl-" + item._level : "";
4568
+ item._rowClass = this.RowClassAssigner?.(item) || "";
4569
+ item._rowClass += this.Hierarchy() ? " est-row-lvl-" + item._level : "";
4526
4570
  }
4527
4571
  }
4528
4572
  }
4529
4573
  /** Genera le informzioni di paginazione per la vista globale dell'es-table */
4530
4574
  setupPagingInformations() {
4531
4575
  // Default che valgono di base, poi eventualmente moddati dalle funzioni sotto
4532
- this.PagerOptions.ShowCount = !this.HidePagingCount;
4533
- this.PagerOptions.ShowButtons = !this.HidePagingButtons;
4534
- this.PagerOptions.ShowPaging = !this.HidePaging;
4576
+ this.PagerOptions.ShowCount = !this.HidePagingCount();
4577
+ this.PagerOptions.ShowButtons = !this.HidePagingButtons();
4578
+ this.PagerOptions.ShowPaging = !this.HidePaging();
4535
4579
  this.PagerOptions.UsesView = true;
4536
- if (this.arrayMode && this.UseArrayModePaging && !this.SearchView) {
4580
+ if (this.arrayMode() && this.UseArrayModePaging() && !this.SearchView()) {
4537
4581
  this.PagerOptions.PagerCount = this.View.length || 0;
4538
4582
  this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && this.View.length > 10;
4539
4583
  this.PagerOptions.View = this.View;
4540
4584
  this.PagerOptions.UsesView = false;
4541
4585
  this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
4542
4586
  }
4543
- else if (this.arrayMode && (!this.UseArrayModePaging || this.SearchView)) {
4544
- if (this.SearchView) {
4545
- this.PagerOptions.View = this.SearchView;
4546
- this.PagerOptions.PagerCount = this.SearchView.objectcount || 0;
4587
+ else if (this.arrayMode() && (!this.UseArrayModePaging() || this.SearchView())) {
4588
+ if (this.SearchView()) {
4589
+ this.PagerOptions.View = this.SearchView();
4590
+ this.PagerOptions.PagerCount = this.SearchView().objectcount || 0;
4547
4591
  }
4548
4592
  else
4549
4593
  this.PagerOptions.PagerCount = this.View.length || 0;
4550
- this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (this.SearchView?.objectcount || 0) > 10);
4551
- this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView && this.SearchView.objectcount && this.SearchView.objectcount != -1);
4594
+ this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (this.SearchView()?.objectcount || 0) > 10);
4595
+ this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView() && this.SearchView().objectcount && this.SearchView().objectcount != -1);
4552
4596
  this.PagerOptions.ShowPaging = this.PagerOptions.ShowPaging && (this.PagerOptions.ShowButtons || this.PagerOptions.ShowCount);
4553
4597
  this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
4554
4598
  }
4555
- else if (this.viewMode) {
4599
+ else if (this.viewMode()) {
4556
4600
  let tmpView = this.MainGroupView || this.View;
4557
4601
  let count = tmpView?.groupcount || tmpView?.objectcount;
4558
4602
  this.PagerOptions.Searches = tmpView?.groupcount != null && tmpView?.groupcount != undefined ? 'groups' : 'items';
@@ -4587,21 +4631,21 @@ class EsTableComponent {
4587
4631
  // Questo dev'essere per forza lanciato dopo **bindDisplayToLoadedItemsOrGroups** dato che è lì che alcune cose vengono valorizzate
4588
4632
  this.setupPagingInformations();
4589
4633
  // Molte cose sono ovviamente disponibili solo in modalità View
4590
- if ((this.viewMode || this.arrayMode) && this.UseCustomCells) {
4591
- let view = this.viewMode ? View : null;
4592
- let itemsAndGroups = this.viewMode ? [...((this.ItemSourceProperty ? view[this.ItemSourceProperty] : view.items) || []), ...(view.groups || [])] : View;
4593
- let si = this.viewMode ? view.selection : this.arraymodeSelection;
4634
+ if ((this.viewMode() || this.arrayMode()) && this.UseCustomCells()) {
4635
+ let view = this.viewMode() ? View : null;
4636
+ let itemsAndGroups = this.viewMode() ? [...((this.ItemSourceProperty() ? view[this.ItemSourceProperty()] : view.items) || []), ...(view.groups || [])] : View;
4637
+ let si = this.viewMode() ? view.selection : this.arraymodeSelection;
4594
4638
  // N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE
4595
4639
  // ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************
4596
4640
  // Se ho definizioni dinamiche, prima di qualsiasi altra cosa devo trasformarle in th/td in modo che poi il codice qui sotto faccia le sue magie
4597
- if (this.DynamicRowColumnsDefinition?.length > 0) {
4641
+ if ((this.DynamicRowColumnsDefinition()?.length || 0) > 0) {
4598
4642
  this.logger.log("Generating ths and tds from Dynamic definition");
4599
4643
  let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();
4600
4644
  this.EsThs = ret.ths;
4601
4645
  this.EsTds = ret.tds;
4602
4646
  }
4603
4647
  // Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view
4604
- if (!this.arrayMode && view.report_columns) {
4648
+ if (!this.arrayMode() && view.report_columns) {
4605
4649
  this.logger.log("Generating ths and tds from report results");
4606
4650
  let ret = this.reportMode_H.generateThsAndTdsFromView(view);
4607
4651
  this.EsThs = ret.ths;
@@ -4620,8 +4664,8 @@ class EsTableComponent {
4620
4664
  // Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
4621
4665
  let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);
4622
4666
  // Valuta lo stato iniziale di selezione a range
4623
- this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition);
4624
- if (this.arrayMode) // In modalità array non ho un backend...
4667
+ this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition());
4668
+ if (this.arrayMode()) // In modalità array non ho un backend...
4625
4669
  this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client
4626
4670
  this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc
4627
4671
  this.columnMetadata_H.alignColumnsIfLoadedView(view); // Se sto caricando una View da hotpotato (quindi con savedstate = true) riallineo la visibilità delle colonne e il loro ordine.
@@ -4644,15 +4688,15 @@ class EsTableComponent {
4644
4688
  this.ResearchNeeded = false;
4645
4689
  }
4646
4690
  }
4647
- else if ((this.viewMode || this.arrayMode) && !this.UseCustomCells) {
4691
+ else if ((this.viewMode() || this.arrayMode()) && !this.UseCustomCells()) {
4648
4692
  // Riallineo le info di selezione degli elementi della View
4649
- let items = this.viewMode ? (this.ItemSourceProperty ? View[this.ItemSourceProperty] : View.items) : View;
4650
- let si = this.viewMode ? View.selection : this.arraymodeSelection;
4693
+ let items = this.viewMode() ? (this.ItemSourceProperty() ? View[this.ItemSourceProperty()] : View.items) : View;
4694
+ let si = this.viewMode() ? View.selection : this.arraymodeSelection;
4651
4695
  this.selection_H.evaluateSelection(items, si);
4652
4696
  }
4653
4697
  // Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
4654
4698
  this.cdr.markForCheck();
4655
- this.FirstBind = false;
4699
+ this.FirstBind.set(false);
4656
4700
  }
4657
4701
  /**
4658
4702
  * Effettua il binding degli oggetti pervenuti da questa chiamata con gli oggetti effettivamente da graficare
@@ -4662,17 +4706,17 @@ class EsTableComponent {
4662
4706
  bindDisplayToLoadedItemsOrGroups(view) {
4663
4707
  if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {
4664
4708
  this.BaseItemsCount = 0;
4665
- this.boundSource = [];
4709
+ this.boundSource.set([]);
4666
4710
  return;
4667
4711
  }
4668
- if (this.arrayMode || !this.UseCustomCells) {
4669
- this.boundSource = this.TMPBoundSource;
4712
+ if (this.arrayMode() || !this.UseCustomCells()) {
4713
+ this.boundSource.set(this.TMPBoundSource);
4670
4714
  this.BaseItemsCount = view?.objectcount || view?.length || 0;
4671
4715
  return;
4672
4716
  }
4673
4717
  let groupingKeys = view?.groupings?.filter(t => !t.aggregation)?.length || 0;
4674
4718
  if (groupingKeys == 0) {
4675
- this.boundSource = this.TMPBoundSource;
4719
+ this.boundSource.set(this.TMPBoundSource);
4676
4720
  this.BaseItemsCount = view?.objectcount || 0;
4677
4721
  return;
4678
4722
  }
@@ -4683,10 +4727,12 @@ class EsTableComponent {
4683
4727
  this.RowTDs = this.TMPRowTDs;
4684
4728
  this.RowTHs = this.TMPRowTHs;
4685
4729
  this.RowThGroups = this.TMPRowThGroups ? this.TMPRowThGroups.reverse() : null;
4686
- this.EmptyRowTds = this.isEmpty(this.RowTDs);
4687
- this.Columns.Visibile = this.RowTHs.filter(t => t.Visible).length;
4688
- this.Columns.VisibleUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;
4689
- this.Columns.Global = this.Columns.VisibleUnpinned + (this.HasPinnedColumns ? 1 : 0) + (this.Selection ? 1 : 0) + (this.Removal ? 1 : 0) + (this.Export || this.HiddenColumns || this.ColumnsOrdering || this.CornerMenuOptions ? 1 : 0);
4730
+ this.EmptyRowTds.set(this.isEmpty(this.RowTDs));
4731
+ let vis = this.RowTHs.filter(t => t.Visible).length;
4732
+ let visUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;
4733
+ let global = visUnpinned + (this.HasPinnedColumns() ? 1 : 0) + (this.Selection() ? 1 : 0) + (this.Removal() ? 1 : 0) + (this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions() ? 1 : 0);
4734
+ let newValue = { Visibile: vis, VisibleUnpinned: visUnpinned, Global: global };
4735
+ this.Columns.set(newValue);
4690
4736
  }
4691
4737
  /**
4692
4738
  * Metodo per capire se un oggetto è completamente vuoto
@@ -4709,7 +4755,7 @@ class EsTableComponent {
4709
4755
  */
4710
4756
  setSelectionStatus(items, all, select, emit = false) {
4711
4757
  if (all) {
4712
- if (!this.SelectAll) {
4758
+ if (!this.SelectAll()) {
4713
4759
  console.error("Impossibile impostare la selezione con l'all selection quando l'Input SelectAll è false");
4714
4760
  return;
4715
4761
  }
@@ -4729,12 +4775,12 @@ class EsTableComponent {
4729
4775
  */
4730
4776
  resetSelection(emit = false) {
4731
4777
  this.selection_H.clearSelectionCaches();
4732
- if (this.viewMode && this.View) {
4778
+ if (this.viewMode() && this.View) {
4733
4779
  this.View.selection = new ItemsSelection([]);
4734
4780
  if (emit)
4735
4781
  this.onSelectionChanged.emit(this.View.selection);
4736
4782
  }
4737
- else if (this.arrayMode) {
4783
+ else if (this.arrayMode()) {
4738
4784
  this.arraymodeSelection = new ItemsSelection([]);
4739
4785
  if (emit)
4740
4786
  this.onSelectionChanged.emit(this.arraymodeSelection);
@@ -4747,11 +4793,11 @@ class EsTableComponent {
4747
4793
  * @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna
4748
4794
  */
4749
4795
  thOrderChanged(id, order) {
4750
- if (!this.viewMode && !this.arrayMode) {
4796
+ if (!this.viewMode() && !this.arrayMode()) {
4751
4797
  console.warn('Order changed on a table not in viewMode or Array mode. Operation not supported');
4752
4798
  return;
4753
4799
  }
4754
- if (!this.OrderByColumn)
4800
+ if (!this.OrderByColumn())
4755
4801
  return;
4756
4802
  this.columnMetadata_H.handleTHOrderChange(id, order);
4757
4803
  }
@@ -4762,7 +4808,7 @@ class EsTableComponent {
4762
4808
  * @param {AppSearch<any>} viewOverride Override della view da emettere per questa ricerca
4763
4809
  */
4764
4810
  emitSearchRequest(resetsPage, viewOverride) {
4765
- if (this.viewMode && !viewOverride) {
4811
+ if (this.viewMode() && !viewOverride) {
4766
4812
  this.View.internalsearchrequest = true;
4767
4813
  this.changed();
4768
4814
  }
@@ -4771,8 +4817,8 @@ class EsTableComponent {
4771
4817
  viewOverride.page = 1;
4772
4818
  viewOverride.internalsearchrequest = true;
4773
4819
  }
4774
- this.researchInProgress = true;
4775
- if (this.View && !this.View.selfsearch && this.EsTableHandledSearch) {
4820
+ this.researchInProgress.set(true);
4821
+ if (this.View && !this.View.selfsearch && this.EsTableHandledSearch()) {
4776
4822
  this.View.selfsearch = true;
4777
4823
  this.changed(true);
4778
4824
  this.onSearchRequest.emit(false);
@@ -4803,8 +4849,9 @@ class EsTableComponent {
4803
4849
  let contextFixeds = {};
4804
4850
  for (let i = 0; i < tds.length; i++) {
4805
4851
  let td = tds[i];
4806
- for (let i = 0; i < this.boundSource.length; i++) {
4807
- let item = this.boundSource[i];
4852
+ let bs = this.boundSource();
4853
+ for (let i = 0; i < bs.length; i++) {
4854
+ let item = bs[i];
4808
4855
  let ctx = item._hash;
4809
4856
  let key = td.td;
4810
4857
  let th = this.thsCache[td.td];
@@ -4835,7 +4882,7 @@ class EsTableComponent {
4835
4882
  Multi: td._multi,
4836
4883
  MultiProp: td._multi ? td.td.split('_')[0] : null,
4837
4884
  MultiIndex: td._multi ? td.td.split('_')[1] : null,
4838
- Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment).toLowerCase(),
4885
+ Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment()).toLowerCase(),
4839
4886
  Format: td.tdFormat || th.thFormat,
4840
4887
  PropertyName: th.thProperty,
4841
4888
  PropertyType: th.thType,
@@ -4843,7 +4890,7 @@ class EsTableComponent {
4843
4890
  EditorOptions: th.thEditorOptions,
4844
4891
  PropAccessor: td.tdPropertyAccessor,
4845
4892
  RoutePath: thCasted.thRoutePath,
4846
- RouteParameterProperties: thCasted.thRouteParameterProperties,
4893
+ RouteParameterProperties: thCasted.thRouteParameterProperties
4847
4894
  } :
4848
4895
  {
4849
4896
  LeftBorder: thCasted._lbord,
@@ -4859,11 +4906,11 @@ class EsTableComponent {
4859
4906
  Content: this.rowGrouping_H.getGroupCellDisplay(item, key, th)
4860
4907
  };
4861
4908
  if (this.TMPRowTDs[ctx]) {
4862
- this.TMPRowTDs[ctx].push(itemToAdd);
4909
+ this.TMPRowTDs[ctx].push(signal(itemToAdd));
4863
4910
  }
4864
4911
  else {
4865
4912
  this.RowContexts.push(ctx);
4866
- this.TMPRowTDs[ctx] = [itemToAdd];
4913
+ this.TMPRowTDs[ctx] = [signal(itemToAdd)];
4867
4914
  contextFixeds[ctx] = isFixed ? 1 : 0;
4868
4915
  }
4869
4916
  }
@@ -4897,7 +4944,7 @@ class EsTableComponent {
4897
4944
  return;
4898
4945
  let columnsListCache = {};
4899
4946
  let castedView = this.View;
4900
- let groupingsUndefined = this.viewMode && (castedView && !castedView.groupings || castedView.groupings.length == 0);
4947
+ let groupingsUndefined = this.viewMode() && (castedView && !castedView.groupings || castedView.groupings.length == 0);
4901
4948
  for (let i = 0; i < this.ColumnsList.length; i++) {
4902
4949
  let itm = this.ColumnsList[i];
4903
4950
  columnsListCache[itm.id] = itm;
@@ -4918,7 +4965,7 @@ class EsTableComponent {
4918
4965
  Order: th.thOrder,
4919
4966
  Orderable: th.thOrderable,
4920
4967
  Template: th.Template,
4921
- Alignment: (th.thAlignment || this.DefaultAlignment).toLowerCase(),
4968
+ Alignment: (th.thAlignment || this.DefaultAlignment()).toLowerCase(),
4922
4969
  // Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header
4923
4970
  Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,
4924
4971
  Wrap: th.thWrap,
@@ -4979,8 +5026,8 @@ class EsTableComponent {
4979
5026
  let anyG = group;
4980
5027
  anyG._expanded = !anyG._expanded;
4981
5028
  // Sono in modalità raggruppamento virtuale da array: Espandere significa rendere visibili tutti gli oggetti relativi a questo gruppo, viceversa il contrarre
4982
- if (this.ArrayGrouping) {
4983
- let allRelatives = this.boundSource.filter(t => (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||
5029
+ if (this.ArrayGrouping()) {
5030
+ let allRelatives = this.boundSource().filter(t => (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||
4984
5031
  (t._item && ((anyG._expanded && t._thisKey == anyG._thisKey) || (!anyG._expanded && t._thisKey.startsWith(anyG._thisKey)))));
4985
5032
  allRelatives.forEach(t => { t._visible = anyG._expanded; if (t._group)
4986
5033
  t._expanded = false; });
@@ -5011,7 +5058,7 @@ class EsTableComponent {
5011
5058
  else {
5012
5059
  let path = (anyG._parent || '') + group.value;
5013
5060
  // Se ho chiuso un gruppo non mi serve rieffettuare ricerce, mi basta eliminare dagli oggetti bindati tutti gli elementi sottostanti a quel gruppo
5014
- this.boundSource = this.boundSource.filter(t => !t._parent || !t._parent.startsWith(path));
5061
+ this.boundSource.set(this.boundSource().filter(t => !t._parent || !t._parent.startsWith(path)));
5015
5062
  // devo però anche rimuovere eventuali cache relative
5016
5063
  this.groupSearchRequestsCache = this.groupSearchRequestsCache.filter(t => t.path != path);
5017
5064
  }
@@ -5023,10 +5070,11 @@ class EsTableComponent {
5023
5070
  * @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti
5024
5071
  */
5025
5072
  globalCheckChanged(forcedVal = null) {
5073
+ debugger;
5026
5074
  this.selection_H.clearSelectionStatusExcluding(null);
5027
5075
  // Prendo tutti gli elementi presenti in questa vista. Se ho gruppi prendo solo i gruppi a livello 0, altrimenti prendo tutti gli oggetti per selezionarli
5028
- let items = this.boundSource.find(t => t._group) ? this.boundSource.filter(t => t._group && !t._parent) : this.boundSource;
5029
- var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck);
5076
+ let items = this.boundSource().find(t => t._group) ? this.boundSource().filter(t => t._group && !t._parent) : this.boundSource();
5077
+ var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck());
5030
5078
  this.changed();
5031
5079
  this.onSelectionChanged.emit(itemSelection);
5032
5080
  }
@@ -5043,10 +5091,10 @@ class EsTableComponent {
5043
5091
  handleClick(event, item) {
5044
5092
  this.selection_H.clearSelectionStatusExcluding(null);
5045
5093
  let selecteditems = [];
5046
- if (event.shiftKey && this.ShiftClick && !this.SingleSelection) {
5094
+ if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {
5047
5095
  this.utiExts.clearTextSelection();
5048
5096
  let startSelecting = false;
5049
- let items = this.boundSource.filter(t => !t._group && !t._sep);
5097
+ let items = this.boundSource().filter(t => !t._group && !t._sep);
5050
5098
  for (let i = 0; i < items.length; i++) {
5051
5099
  let t = items[i];
5052
5100
  if (startSelecting) {
@@ -5079,7 +5127,7 @@ class EsTableComponent {
5079
5127
  */
5080
5128
  addToPage(page) {
5081
5129
  let view = this.MainGroupView ? this.MainGroupView : this.View;
5082
- this.goToPage(((this.SearchView || view)?.page || 0) + page);
5130
+ this.goToPage(((this.SearchView() || view)?.page || 0) + page);
5083
5131
  }
5084
5132
  /**
5085
5133
  * Sposta la ricerca alla pagina specificata
@@ -5087,18 +5135,18 @@ class EsTableComponent {
5087
5135
  * @param {number} page Pagina a cui navigare
5088
5136
  */
5089
5137
  goToPage(page) {
5090
- let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode ? this.SearchView : this.View);
5138
+ let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode() ? this.SearchView() : this.View);
5091
5139
  if (!view.page || !view.pages)
5092
5140
  return;
5093
- let appSearchElement = this.SearchView || view;
5141
+ let appSearchElement = this.SearchView() || view;
5094
5142
  if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))
5095
5143
  return;
5096
5144
  appSearchElement.page = page;
5097
5145
  let count = (view.items.length || view.groups?.length || 0);
5098
5146
  let ipp = view.itemsperpageoverride || 15;
5099
- this.arrayPulsanti = this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp);
5147
+ this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp));
5100
5148
  let hasGroupings = !!this.MainGroupView;
5101
- this.emitSearchRequest(false, hasGroupings ? view : this.SearchView ? this.SearchView : null);
5149
+ this.emitSearchRequest(false, hasGroupings ? view : (this.SearchView() || null));
5102
5150
  }
5103
5151
  /**
5104
5152
  * Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest**
@@ -5109,10 +5157,10 @@ class EsTableComponent {
5109
5157
  this.changed();
5110
5158
  if (this.MainGroupView)
5111
5159
  this.emitSearchRequest(true, this.MainGroupView);
5112
- else if (this.SearchView) {
5160
+ else if (this.SearchView()) {
5113
5161
  // Questo secondo me si può portare a livello un po' più alto
5114
- this.SearchView.page = 1;
5115
- this.emitSearchRequest(true, this.SearchView);
5162
+ this.SearchView().page = 1;
5163
+ this.emitSearchRequest(true, this.SearchView());
5116
5164
  }
5117
5165
  else
5118
5166
  this.emitSearchRequest(true);
@@ -5124,9 +5172,9 @@ class EsTableComponent {
5124
5172
  }
5125
5173
  /** Metodo che gestisce la modifica del tempo specificato per l'aggiornamento automatico */
5126
5174
  autoUpdateChanged() {
5127
- if (!/^[1-9]\d*$/.test(this.seconds))
5128
- this.seconds = '10';
5129
- let secondsInMs = parseInt(this.seconds, null) * 1000;
5175
+ if (!/^[1-9]\d*$/.test(this.seconds()))
5176
+ this.seconds.set('10');
5177
+ let secondsInMs = parseInt(this.seconds(), null) * 1000;
5130
5178
  if (this.autoUpdate)
5131
5179
  this.updateTimer = setInterval(() => { this.emitSearchRequest(false); }, secondsInMs);
5132
5180
  else
@@ -5205,8 +5253,8 @@ class EsTableComponent {
5205
5253
  * @param {'array' | 'view' | 'report'} mode Modalità da impostare
5206
5254
  **/
5207
5255
  setMode(mode) {
5208
- this.viewMode = mode == 'view';
5209
- this.arrayMode = mode == 'array';
5256
+ this.viewMode.set(mode == 'view');
5257
+ this.arrayMode.set(mode == 'array');
5210
5258
  }
5211
5259
  /**
5212
5260
  * Helper per effettuare chiamate interne di allineamento alla funzione **writeValue**,
@@ -5222,16 +5270,16 @@ class EsTableComponent {
5222
5270
  // Se sono in modalità View viene mantenuto in automatico il numero di pagina, ma per la modalità array devo prendere le info di paginazione prima e riapplicarle dopo
5223
5271
  let arrayPage;
5224
5272
  let arrayIpp;
5225
- if (this.arrayMode) {
5273
+ if (this.arrayMode()) {
5226
5274
  arrayPage = this.arraymodePage;
5227
- arrayIpp = this.ArraymodeItemsPerPage;
5275
+ arrayIpp = this.ArraymodeItemsPerPage();
5228
5276
  }
5229
- if (!relaunchSearch && this.viewMode)
5277
+ if (!relaunchSearch && this.viewMode())
5230
5278
  this.View.selfsearch = true;
5231
5279
  this.writeValue(this.View);
5232
5280
  this.cdr.detectChanges();
5233
- if (this.arrayMode) {
5234
- this.ArraymodeItemsPerPage = arrayIpp;
5281
+ if (this.arrayMode()) {
5282
+ this.ArraymodeItemsPerPage.set(arrayIpp);
5235
5283
  this.arrayGoToPage(arrayPage);
5236
5284
  }
5237
5285
  }
@@ -5266,52 +5314,52 @@ class EsTableComponent {
5266
5314
  */
5267
5315
  dbClickEditOrSingleClickRowSelection($event, rowItem, item) {
5268
5316
  // Prima cosa da fare è controllare se ci sono dei range lasciati da operazioni precedenti (se applicabile) e ripulirli
5269
- if (this.rangeSelected && !$event.ctrlKey && this.Selection) {
5317
+ if (this.rangeSelected && !$event.ctrlKey && this.Selection()) {
5270
5318
  this.logger.log("clearing previously selected range");
5271
5319
  this.selection_H.clearSelectionStatusExcluding(null);
5272
5320
  this.rangeSelected = false;
5273
5321
  return;
5274
5322
  }
5275
5323
  // Modalità Editable, gestisco i doppi click senza però rallentare la modalità di selezione a range
5276
- if (this.Editable) {
5324
+ if (this.Editable()) {
5277
5325
  // Secondo click: se il timer non è scaduto è un doppio click ed eseguo il resto
5278
5326
  if (this.cellDbClickTimer) {
5279
- this.logger.log("handling doubleclick on editable cell: " + (rowItem.PropertyName ? 'edit mode for property ' + rowItem.PropertyName : 'no property set, fallback to simple click'));
5280
- if (rowItem.PropertyName)
5327
+ this.logger.log("handling doubleclick on editable cell: " + (rowItem().PropertyName ? 'edit mode for property ' + rowItem().PropertyName : 'no property set, fallback to simple click'));
5328
+ if (rowItem().PropertyName)
5281
5329
  this.setupUserEdit(rowItem, item);
5282
5330
  else
5283
- this.handleRowClick($event, item, this.Selection, true);
5331
+ this.handleRowClick($event, item, this.Selection(), true);
5284
5332
  this.clearCellClickTimer();
5285
5333
  return;
5286
5334
  }
5287
5335
  // Primo click: non fa niente e se il tempo per il secondo click scade resetta tutto
5288
5336
  this.cellDbClickTimer = setTimeout(() => {
5289
5337
  this.clearCellClickTimer();
5290
- if (!this.RangeSelection || !this.mouseIsDown) {
5338
+ if (!this.RangeSelection() || !this.mouseIsDown) {
5291
5339
  this.logger.log("time's up for second click, handling single click");
5292
- this.handleRowClick($event, item, this.Selection, true);
5340
+ this.handleRowClick($event, item, this.Selection(), true);
5293
5341
  }
5294
5342
  }, this.doubleClickBufferMs);
5295
5343
  }
5296
5344
  // In modalità a range la creazione del range è gestita dai mousedown, move ed up...
5297
5345
  // La selezione delle righe invece è gestita dalle caselline a sinistra
5298
- if (this.RangeSelection)
5346
+ if (this.RangeSelection())
5299
5347
  return;
5300
5348
  // Se ho fatto click col control attaccato esco subito dato che deve solo permettere la navigazione dei link
5301
5349
  if ($event.ctrlKey)
5302
5350
  return;
5303
5351
  // Tutti i click su una cella già in edit non devono effettuare la selezione della riga
5304
- if (rowItem._editing)
5352
+ if (rowItem()._editing)
5305
5353
  return;
5306
5354
  // Per evitare di rallentare a prescindere
5307
- if (!this.Editable) {
5308
- this.handleRowClick($event, item, this.Selection, true);
5355
+ if (!this.Editable()) {
5356
+ this.handleRowClick($event, item, this.Selection(), true);
5309
5357
  return;
5310
5358
  }
5311
5359
  }
5312
5360
  /** Evento che gestisce il comando "Copia" buttando i valori selezionati nella clipboard in base al loro tipo */
5313
5361
  handleCopy() {
5314
- if (!this.RangeSelection)
5362
+ if (!this.RangeSelection())
5315
5363
  return;
5316
5364
  let sel = this.selection_H.getSelectionStatusSelection();
5317
5365
  if (sel.length > 0 && sel[0].length > 0) {
@@ -5322,7 +5370,7 @@ class EsTableComponent {
5322
5370
  }
5323
5371
  /** Evento che gestisce il comando "Incolla" prendendo i dati della clipboard e applicandoli al range di selezione attuale in base al tipo delle celle sotto */
5324
5372
  handlePaste() {
5325
- if (!this.RangeSelection)
5373
+ if (!this.RangeSelection())
5326
5374
  return;
5327
5375
  let sel = this.selection_H.getSelectionStatusSelection();
5328
5376
  if (sel.length > 0 && sel[0].length > 0) {
@@ -5332,7 +5380,7 @@ class EsTableComponent {
5332
5380
  values.splice(values.length - 1, 1);
5333
5381
  if (values.length > 0 && values[0].length > 0) {
5334
5382
  // Check se la modifica è abilitata
5335
- if (!this.Editable) {
5383
+ if (!this.Editable()) {
5336
5384
  this.msgExts.simpleWarning(this.lc.loc("Data for this table cannot be edited"));
5337
5385
  return;
5338
5386
  }
@@ -5381,7 +5429,7 @@ class EsTableComponent {
5381
5429
  handleRowClick($event, item, selection, internalCall = false) {
5382
5430
  // Se ho un ctrl premuto esco con true in modo da fare bubbling dell'evento e lasciarlo gestire al browser (link ecc...)
5383
5431
  // Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD
5384
- if ($event.ctrlKey || (this.UseCustomCells && !internalCall))
5432
+ if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))
5385
5433
  return true;
5386
5434
  if (selection)
5387
5435
  this.selection_H.clearSelectionStatusExcluding(null);
@@ -5396,7 +5444,7 @@ class EsTableComponent {
5396
5444
  * Gestione del click destro sull'es-table
5397
5445
  */
5398
5446
  onRightClick() {
5399
- if (this.Selection)
5447
+ if (this.Selection())
5400
5448
  this.onOpenContextMenu.emit();
5401
5449
  }
5402
5450
  /**
@@ -5409,13 +5457,13 @@ class EsTableComponent {
5409
5457
  */
5410
5458
  setupUserEdit(rowItem, item) {
5411
5459
  this.selection_H.clearSelectionStatusExcluding(null);
5412
- if (this.Editable && rowItem.PropertyName) {
5413
- let dynMode = this.DynamicRowColumnsDefinition?.length > 0;
5414
- rowItem._editing = true;
5415
- rowItem.old_value = dynMode ? item.properties[rowItem.PropertyName] : item[rowItem.PropertyName];
5460
+ if (this.Editable() && rowItem().PropertyName) {
5461
+ let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
5462
+ let newValues = { _editing: true, old_value: dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName] };
5463
+ rowItem.set(Object.assign(rowItem(), newValues));
5416
5464
  }
5417
5465
  this.cdr.detectChanges();
5418
- setTimeout(() => { this.FocusSubject.next(); });
5466
+ requestAnimationFrame(() => { this.FocusSubject.next(); });
5419
5467
  }
5420
5468
  /**
5421
5469
  * La modifica dell'utente è terminata. Si reimposta la variabile relativa a "false" in modo da nascondere l'input di testo e si emette la modifica del valore
@@ -5425,21 +5473,24 @@ class EsTableComponent {
5425
5473
  * @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
5426
5474
  */
5427
5475
  finalizeUserEdit(rowItem, item, columnIndex) {
5428
- let dynMode = this.DynamicRowColumnsDefinition?.length > 0;
5429
- let rowItm = rowItem;
5430
- rowItm._editing = false;
5431
- let old = rowItm.old_value;
5432
- let niu = dynMode ? item.properties[rowItem.PropertyName] : item[rowItem.PropertyName];
5433
- let olddate = this.dateExts.getDateConvertion(old);
5434
- let niudate = this.dateExts.getDateConvertion(niu);
5435
- if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
5436
- return;
5437
- this.onModelChange.emit([new EsTableModelChange(item, rowItem.ID, rowItem.PropertyName, old, niu)]);
5438
- this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);
5476
+ // Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo
5477
+ requestAnimationFrame(() => {
5478
+ let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
5479
+ let newValues = { _editing: false };
5480
+ rowItem.set(Object.assign(rowItem(), newValues));
5481
+ let old = rowItem().old_value;
5482
+ let niu = dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName];
5483
+ let olddate = this.dateExts.getDateConvertion(old);
5484
+ let niudate = this.dateExts.getDateConvertion(niu);
5485
+ if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
5486
+ return;
5487
+ this.onModelChange.emit([new EsTableModelChange(item, rowItem().ID, rowItem().PropertyName, old, niu)]);
5488
+ this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);
5489
+ });
5439
5490
  }
5440
5491
  mousedown(event, rowItem, _) {
5441
5492
  // Tasto diverso dal click sinistro -> ciao è stato bello e intenso
5442
- if (event.buttons != 1 || !this.RangeSelection)
5493
+ if (event.buttons != 1 || !this.RangeSelection())
5443
5494
  return;
5444
5495
  // Sto lavorando su QUESTA es-table
5445
5496
  this.copyPasteDetector.ActiveEstReference = this;
@@ -5453,14 +5504,16 @@ class EsTableComponent {
5453
5504
  this.firstCoordinates = { row, column };
5454
5505
  // Se ho già un range di selezione ignoro temporanemaente questa selezione in modo da capire bene cosa devo fare dopo (click sulla riga / altra selezione)
5455
5506
  // e gestire la grafica in maniera un po' più precisa
5456
- if (!this.rangeSelected || (event.ctrlKey || !this.Selection))
5507
+ if (!this.rangeSelected || (event.ctrlKey || !this.Selection())) {
5457
5508
  this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
5509
+ this.cdr.markForCheck();
5510
+ }
5458
5511
  else
5459
5512
  this.rangeStartWasIgnored = true;
5460
5513
  this.logger.log(`mouse down on ${row}:${column}`);
5461
5514
  }
5462
5515
  mouseenter(event) {
5463
- if (!this.RangeSelection)
5516
+ if (!this.RangeSelection())
5464
5517
  return;
5465
5518
  if (event.buttons == 0)
5466
5519
  this.mouseIsDown = false;
@@ -5478,9 +5531,10 @@ class EsTableComponent {
5478
5531
  this.logger.log(`mouse move over ${row}:${column}`);
5479
5532
  this.rangeSelected = true;
5480
5533
  }
5534
+ this.cdr.markForCheck();
5481
5535
  }
5482
5536
  mouseup(event) {
5483
- if (!this.RangeSelection)
5537
+ if (!this.RangeSelection())
5484
5538
  return;
5485
5539
  let id = event.currentTarget.id;
5486
5540
  let coords = id.split('_');
@@ -5488,10 +5542,11 @@ class EsTableComponent {
5488
5542
  let column = parseInt(coords[coords.length - 1]);
5489
5543
  // Se il mouseup viene effettuato sulla stessa cella del primo mousedown e siamo in modalità di selezione deseleziono la cella perché è un semplice click
5490
5544
  if (this.mouseIsDown && this.firstCoordinates) {
5491
- if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection)
5545
+ if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection())
5492
5546
  this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
5493
- else if (event.ctrlKey || !this.Selection)
5547
+ else if (event.ctrlKey || !this.Selection())
5494
5548
  this.rangeSelected = true;
5549
+ this.cdr.markForCheck();
5495
5550
  }
5496
5551
  this.mouseIsDown = false;
5497
5552
  this.logger.log(`mouse lifted up`);
@@ -5504,8 +5559,13 @@ class EsTableComponent {
5504
5559
  let toRet = this.EsTdsCache[`${prop}_${hash}`];
5505
5560
  return toRet;
5506
5561
  }
5507
- registerCell(event) {
5562
+ registerCell(event, rowItem, _, cellRef) {
5508
5563
  this.EsTdsCache[`${event.id}_${event.hash}`] = event.self;
5564
+ this._zone.runOutsideAngular(() => {
5565
+ fromEvent(cellRef.nativeElement, 'mousedown').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mousedown(e, rowItem, _); });
5566
+ fromEvent(cellRef.nativeElement, 'mouseenter').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseenter(e); });
5567
+ fromEvent(cellRef.nativeElement, 'mouseup').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseup(e); });
5568
+ });
5509
5569
  }
5510
5570
  //* Piango ancora
5511
5571
  //* Gestione Embedding
@@ -5538,13 +5598,13 @@ class EsTableComponent {
5538
5598
  return;
5539
5599
  this.emb.MainWindow.postMessage({ type: "modal-close" }, "*");
5540
5600
  }
5541
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2$1.PreferencesService, optional: true }, { token: EST_DEFAULTS, optional: true }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: UtilitiesHandler }, { token: i5.UtilityService }, { token: i5.ExportService }, { token: i5.DateService }, { token: i5.MessageService }, { token: CopyPasteDetector }, { token: i5.ClipboardService }, { token: Logger }, { token: i5.AppEmbeddingExtensions }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
5542
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsTableComponent, isStandalone: false, selector: "es-table", inputs: { EsThTdProvider: "EsThTdProvider", CornerMenuOptions: "CornerMenuOptions", ColumnsResizable: "ColumnsResizable", ColumnsPinnable: "ColumnsPinnable", AutoUpdate: "AutoUpdate", Height: "Height", EmptySpaceBackgroundColor: "EmptySpaceBackgroundColor", EsTableHandledSearch: "EsTableHandledSearch", MaxHeight: "MaxHeight", ContainerClass: "ContainerClass", XLSXExport: "XLSXExport", CSVExport: "CSVExport", AllSearch: "AllSearch", HighCellDensity: "HighCellDensity", Selection: "Selection", ShowLoadingOnBootstrap: "ShowLoadingOnBootstrap", Removal: "Removal", RemovalCondition: "RemovalCondition", Export: "Export", ShiftClick: "ShiftClick", CountLabel: "CountLabel", HidePaging: "HidePaging", HidePagingCount: "HidePagingCount", HidePagingButtons: "HidePagingButtons", ContextMenu: "ContextMenu", ExportFileName: "ExportFileName", TableClass: "TableClass", ExportFunction: "ExportFunction", ExportOnlyVisibleColumns: "ExportOnlyVisibleColumns", HasHeaderGroup: "HasHeaderGroup", HasSecondaryHeaderGroup: "HasSecondaryHeaderGroup", HeaderHidden: "HeaderHidden", BodyHidden: "BodyHidden", SelectionDisabled: "SelectionDisabled", SingleSelection: "SingleSelection", RowClassAssigner: "RowClassAssigner", OrderByColumn: "OrderByColumn", MultipleOrderingDirectives: "MultipleOrderingDirectives", HiddenColumns: "HiddenColumns", ColumnsOrdering: "ColumnsOrdering", SearchView: "SearchView", SelectAll: "SelectAll", UseArrayModePaging: "UseArrayModePaging", DynamicRowColumnsDefinition: "DynamicRowColumnsDefinition", DynamicOperations: "DynamicOperations", Hierarchy: "Hierarchy", ParentKey: "ParentKey", OwnKey: "OwnKey", StartsExpanded: "StartsExpanded", SavePreferences: "SavePreferences", DefaultAlignment: "DefaultAlignment", PagingStyle: "PagingStyle", RowGroupingPagingStyle: "RowGroupingPagingStyle", ItemSourceProperty: "ItemSourceProperty", UseSelectionCache: "UseSelectionCache", ShowItemGroupsColumns: "ShowItemGroupsColumns", Editable: "Editable", RangeSelection: "RangeSelection", SearchThrottle: "SearchThrottle", ArraymodeItemsPerPage: "ArraymodeItemsPerPage" }, outputs: { onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }, { propertyName: "ThTdProvider", predicate: ThTdProvider }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, 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\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \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=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <es-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\r\n <es-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);\"></es-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \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)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><es-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);\"></es-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\"><es-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);\"></es-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.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{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.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-14,.est-fs-13{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{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(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-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.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:0px 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:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.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:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!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 #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.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{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i10.ModalDirective, selector: "[bsModal]", inputs: ["config", "closeInterceptor"], outputs: ["onShow", "onShown", "onHide", "onHidden"], exportAs: ["bs-modal"] }, { kind: "directive", type: i11.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i11.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i11.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i12.ContextMenuAttachDirective, selector: "[contextMenu]", inputs: ["contextMenuSubject", "contextMenu"] }, { kind: "component", type: i12.ContextMenuComponent, selector: "context-menu", inputs: ["menuClass", "autoFocus", "useBootstrap4", "disabled"], outputs: ["close", "open"] }, { kind: "directive", type: i12.ContextMenuItemDirective, selector: "[contextMenuItem]", inputs: ["subMenu", "divider", "enabled", "passive", "visible"], outputs: ["execute"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i14.EsFormAdaptiveComponent, selector: "form-adaptive", inputs: ["Type", "TypeMissingMessage", "SearchFunction", "Precision", "TypePattern"] }, { kind: "component", type: EsTablePagerComponent, selector: "es-paging", inputs: ["CurrentPageSize", "View", "WarnOnAll", "AllSearch", "DefaultAll", "GroupMode", "GroupCount", "CountLabel", "ShowCount", "ShowPaging", "PagerCount", "Hidden"], outputs: ["pagingSelected"] }, { kind: "component", type: EsTh, selector: "[es-th]", inputs: ["es-th", "Order", "Orderable", "Display", "Resizable", "Pinned", "SearchInProgress", "OrderBy", "Wrap", "Fixed", "Template", "Visible"], outputs: ["onOrderChange", "onUnpinning"] }, { kind: "component", type: EsTd, selector: "[es-td]", inputs: ["es-td", "Context"], outputs: ["onCellGeneration"] }, { kind: "pipe", type: i8.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }, { kind: "pipe", type: EstFormatPipe, name: "est_format" }, { kind: "pipe", type: EstLookupPipe, name: "est_lookup" }, { kind: "pipe", type: EstRouterLinkPipe, name: "est_routerlink" }, { kind: "pipe", type: EstRendererPipe, name: "est_renderer" }, { kind: "pipe", type: EstEditorPipe, name: "est_editor" }, { kind: "pipe", type: EstPropInsensitivePipe, name: "est_propinsensitive" }], viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5601
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, deps: [{ token: i0.NgZone }, { token: i1.NgControl, optional: true, self: true }, { token: i2$1.PreferencesService, optional: true }, { token: EST_DEFAULTS, optional: true }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: UtilitiesHandler }, { token: i5.UtilityService }, { token: i5.ExportService }, { token: i5.DateService }, { token: i5.MessageService }, { token: CopyPasteDetector }, { token: i5.ClipboardService }, { token: Logger }, { token: i5.AppEmbeddingExtensions }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
5602
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTableComponent, isStandalone: false, selector: "es-table", inputs: { globalCheck: { classPropertyName: "globalCheck", publicName: "globalCheck", isSignal: true, isRequired: false, transformFunction: null }, autoUpdate: { classPropertyName: "autoUpdate", publicName: "autoUpdate", isSignal: true, isRequired: false, transformFunction: null }, seconds: { classPropertyName: "seconds", publicName: "seconds", isSignal: true, isRequired: false, transformFunction: null }, researchInProgress: { classPropertyName: "researchInProgress", publicName: "researchInProgress", isSignal: true, isRequired: false, transformFunction: null }, globalColVisCheck: { classPropertyName: "globalColVisCheck", publicName: "globalColVisCheck", isSignal: true, isRequired: false, transformFunction: null }, EsThTdProvider: { classPropertyName: "EsThTdProvider", publicName: "EsThTdProvider", isSignal: false, isRequired: false, transformFunction: null }, CornerMenuOptions: { classPropertyName: "CornerMenuOptions", publicName: "CornerMenuOptions", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsResizable: { classPropertyName: "_ColumnsResizable", publicName: "ColumnsResizable", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsPinnable: { classPropertyName: "_ColumnsPinnable", publicName: "ColumnsPinnable", isSignal: true, isRequired: false, transformFunction: null }, _AutoUpdate: { classPropertyName: "_AutoUpdate", publicName: "AutoUpdate", isSignal: true, isRequired: false, transformFunction: null }, Height: { classPropertyName: "Height", publicName: "Height", isSignal: true, isRequired: false, transformFunction: null }, EmptySpaceBackgroundColor: { classPropertyName: "EmptySpaceBackgroundColor", publicName: "EmptySpaceBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, EsTableHandledSearch: { classPropertyName: "EsTableHandledSearch", publicName: "EsTableHandledSearch", isSignal: true, isRequired: false, transformFunction: null }, MaxHeight: { classPropertyName: "MaxHeight", publicName: "MaxHeight", isSignal: true, isRequired: false, transformFunction: null }, _ContainerClass: { classPropertyName: "_ContainerClass", publicName: "ContainerClass", isSignal: true, isRequired: false, transformFunction: null }, XLSXExport: { classPropertyName: "XLSXExport", publicName: "XLSXExport", isSignal: true, isRequired: false, transformFunction: null }, CSVExport: { classPropertyName: "CSVExport", publicName: "CSVExport", isSignal: true, isRequired: false, transformFunction: null }, _AllSearch: { classPropertyName: "_AllSearch", publicName: "AllSearch", isSignal: true, isRequired: false, transformFunction: null }, HighCellDensity: { classPropertyName: "HighCellDensity", publicName: "HighCellDensity", isSignal: true, isRequired: false, transformFunction: null }, _Selection: { classPropertyName: "_Selection", publicName: "Selection", isSignal: true, isRequired: false, transformFunction: null }, ShowLoadingOnBootstrap: { classPropertyName: "ShowLoadingOnBootstrap", publicName: "ShowLoadingOnBootstrap", isSignal: true, isRequired: false, transformFunction: null }, Removal: { classPropertyName: "Removal", publicName: "Removal", isSignal: true, isRequired: false, transformFunction: null }, RemovalCondition: { classPropertyName: "RemovalCondition", publicName: "RemovalCondition", isSignal: true, isRequired: false, transformFunction: null }, _Export: { classPropertyName: "_Export", publicName: "Export", isSignal: true, isRequired: false, transformFunction: null }, _ShiftClick: { classPropertyName: "_ShiftClick", publicName: "ShiftClick", isSignal: true, isRequired: false, transformFunction: null }, CountLabel: { classPropertyName: "CountLabel", publicName: "CountLabel", isSignal: true, isRequired: false, transformFunction: null }, _HidePaging: { classPropertyName: "_HidePaging", publicName: "HidePaging", isSignal: true, isRequired: false, transformFunction: null }, _HidePagingCount: { classPropertyName: "_HidePagingCount", publicName: "HidePagingCount", isSignal: true, isRequired: false, transformFunction: null }, _HidePagingButtons: { classPropertyName: "_HidePagingButtons", publicName: "HidePagingButtons", isSignal: true, isRequired: false, transformFunction: null }, ContextMenu: { classPropertyName: "ContextMenu", publicName: "ContextMenu", isSignal: false, isRequired: false, transformFunction: null }, ExportFileName: { classPropertyName: "ExportFileName", publicName: "ExportFileName", isSignal: true, isRequired: false, transformFunction: null }, _TableClass: { classPropertyName: "_TableClass", publicName: "TableClass", isSignal: true, isRequired: false, transformFunction: null }, ExportFunction: { classPropertyName: "ExportFunction", publicName: "ExportFunction", isSignal: false, isRequired: false, transformFunction: null }, ExportOnlyVisibleColumns: { classPropertyName: "ExportOnlyVisibleColumns", publicName: "ExportOnlyVisibleColumns", isSignal: true, isRequired: false, transformFunction: null }, HasHeaderGroup: { classPropertyName: "HasHeaderGroup", publicName: "HasHeaderGroup", isSignal: true, isRequired: false, transformFunction: null }, HasSecondaryHeaderGroup: { classPropertyName: "HasSecondaryHeaderGroup", publicName: "HasSecondaryHeaderGroup", isSignal: true, isRequired: false, transformFunction: null }, HeaderHidden: { classPropertyName: "HeaderHidden", publicName: "HeaderHidden", isSignal: true, isRequired: false, transformFunction: null }, BodyHidden: { classPropertyName: "BodyHidden", publicName: "BodyHidden", isSignal: true, isRequired: false, transformFunction: null }, SelectionDisabled: { classPropertyName: "SelectionDisabled", publicName: "SelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, SingleSelection: { classPropertyName: "SingleSelection", publicName: "SingleSelection", isSignal: true, isRequired: false, transformFunction: null }, RowClassAssigner: { classPropertyName: "RowClassAssigner", publicName: "RowClassAssigner", isSignal: false, isRequired: false, transformFunction: null }, _OrderByColumn: { classPropertyName: "_OrderByColumn", publicName: "OrderByColumn", isSignal: true, isRequired: false, transformFunction: null }, MultipleOrderingDirectives: { classPropertyName: "MultipleOrderingDirectives", publicName: "MultipleOrderingDirectives", isSignal: true, isRequired: false, transformFunction: null }, _HiddenColumns: { classPropertyName: "_HiddenColumns", publicName: "HiddenColumns", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsOrdering: { classPropertyName: "_ColumnsOrdering", publicName: "ColumnsOrdering", isSignal: true, isRequired: false, transformFunction: null }, SearchView: { classPropertyName: "SearchView", publicName: "SearchView", isSignal: true, isRequired: false, transformFunction: null }, _SelectAll: { classPropertyName: "_SelectAll", publicName: "SelectAll", isSignal: true, isRequired: false, transformFunction: null }, _UseArrayModePaging: { classPropertyName: "_UseArrayModePaging", publicName: "UseArrayModePaging", isSignal: true, isRequired: false, transformFunction: null }, _DynamicRowColumnsDefinition: { classPropertyName: "_DynamicRowColumnsDefinition", publicName: "DynamicRowColumnsDefinition", isSignal: true, isRequired: false, transformFunction: null }, DynamicOperations: { classPropertyName: "DynamicOperations", publicName: "DynamicOperations", isSignal: true, isRequired: false, transformFunction: null }, Hierarchy: { classPropertyName: "Hierarchy", publicName: "Hierarchy", isSignal: true, isRequired: false, transformFunction: null }, _ParentKey: { classPropertyName: "_ParentKey", publicName: "ParentKey", isSignal: true, isRequired: false, transformFunction: null }, _OwnKey: { classPropertyName: "_OwnKey", publicName: "OwnKey", isSignal: true, isRequired: false, transformFunction: null }, StartsExpanded: { classPropertyName: "StartsExpanded", publicName: "StartsExpanded", isSignal: true, isRequired: false, transformFunction: null }, _SavePreferences: { classPropertyName: "_SavePreferences", publicName: "SavePreferences", isSignal: true, isRequired: false, transformFunction: null }, _DefaultAlignment: { classPropertyName: "_DefaultAlignment", publicName: "DefaultAlignment", isSignal: true, isRequired: false, transformFunction: null }, _PagingStyle: { classPropertyName: "_PagingStyle", publicName: "PagingStyle", isSignal: true, isRequired: false, transformFunction: null }, _RowGroupingPagingStyle: { classPropertyName: "_RowGroupingPagingStyle", publicName: "RowGroupingPagingStyle", isSignal: true, isRequired: false, transformFunction: null }, ItemSourceProperty: { classPropertyName: "ItemSourceProperty", publicName: "ItemSourceProperty", isSignal: true, isRequired: false, transformFunction: null }, _UseSelectionCache: { classPropertyName: "_UseSelectionCache", publicName: "UseSelectionCache", isSignal: true, isRequired: false, transformFunction: null }, _ShowItemGroupsColumns: { classPropertyName: "_ShowItemGroupsColumns", publicName: "ShowItemGroupsColumns", isSignal: true, isRequired: false, transformFunction: null }, Editable: { classPropertyName: "Editable", publicName: "Editable", isSignal: true, isRequired: false, transformFunction: null }, RangeSelection: { classPropertyName: "RangeSelection", publicName: "RangeSelection", isSignal: true, isRequired: false, transformFunction: null }, SearchThrottle: { classPropertyName: "SearchThrottle", publicName: "SearchThrottle", isSignal: true, isRequired: false, transformFunction: null }, _ArraymodeItemsPerPage: { classPropertyName: "_ArraymodeItemsPerPage", publicName: "ArraymodeItemsPerPage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { globalCheck: "globalCheckChange", autoUpdate: "autoUpdateChange", seconds: "secondsChange", researchInProgress: "researchInProgressChange", globalColVisCheck: "globalColVisCheckChange", onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }, { propertyName: "ThTdProvider", predicate: ThTdProvider }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], ngImport: i0, 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\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\r\n <div *ngIf=\"FirstBind() && ShowLoadingOnBootstrap()\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll() || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\r\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\r\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection()}}\r\n HasPinnedColumns: {{HasPinnedColumns()}}\r\n arrayMode: {{arrayMode()}}\r\n viewMode: {{viewMode()}}\r\n UseCustomCells: {{UseCustomCells()}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \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=\"arrayMode() || viewMode()\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()\">\r\n <th *ngFor=\"let operation of DynamicOperations(); trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition(); trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn()\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\" [SearchInProgress]=\"researchInProgress()\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn()\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells() && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns()\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection()\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection()\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable()\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn()\"\r\n [SearchInProgress]=\"researchInProgress()\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable()\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn()\"\r\n [SearchInProgress]=\"researchInProgress()\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal()\" [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns() || ColumnsOrdering()\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export() && CSVExport()\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export() && XLSXExport()\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions(); trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection()\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection()\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind()\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode()\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode() && UseArrayModePaging() && !SearchView()\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <es-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\r\n <es-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);\"></es-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \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)=\"!RangeSelection() && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns()\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns()\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource(); let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy()\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns()\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle() == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><es-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);\"></es-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\"><es-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);\"></es-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells() && !EmptyRowTds()\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns()\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection()\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection()\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell().Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell().Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell().IconClass && cell().Visible\">\r\n <ng-container *ngIf=\"!cell().ConditionField || (((item.properties || item) | est_propinsensitive : cell().ConditionField) == cell().ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell().Title}}\" class=\"{{cell().IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell().ID)\">{{cell().Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell().ConditionField && (((item.properties || item) | est_propinsensitive : cell().ConditionField) != cell().ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell().IconClass && cell().Visible\"\r\n es-td=\"{{cell().Property || cell().ID}}\"\r\n id=\"estd_{{cell().Property || cell().ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell().Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity()\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable() && cell().PropertyName\"\r\n [class.est-rg-hdr]=\"cell().GroupHeader\"\r\n [class.est-rg-agg]=\"cell().GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy() || !cell().Wraps\"\r\n\r\n [style.text-align]=\"(!pinned && cell().Alignment) ? cell().Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell().PropAccessor) ? item.forecolors[cell().PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell().PropAccessor) ? item.backcolors[cell().PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell().PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell().LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell().RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell().LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell().RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n #cellRef\r\n\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\r\n\r\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\r\n\r\n <!-- \r\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n -->\r\n\r\n <div [class.est-edit-hidden]=\"cell()._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell().Template\">\r\n <ng-container *ngIf=\"!cell().Multi\"><ng-container *ngTemplateOutlet=\"cell().Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell().Multi\"><ng-container *ngTemplateOutlet=\"cell().Template; context: { $implicit: (item[cell().MultiProp] ? item[cell().MultiProp][cell().MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell().Template && !cell().Multi && !cell().Content\">\r\n <a *ngIf=\"cell().RoutePath\" [routerLink]=\"item | est_routerlink : cell().RoutePath : cell().RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell().PropertyName] : item[cell().PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell().PropAccessor\">\r\n {{(item.values? item.values[cell().PropAccessor] : item[cell().PropAccessor]) | est_format: cell().Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell().PropAccessor && !cell().RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell().PropertyName | est_renderer: { name: cell().RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell(), value: item.properties ? item.properties[cell().PropertyName] : item[cell().PropertyName], type: cell().PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy() && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell().Content\">\r\n {{cell().Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell()._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell().PropertyName | est_editor: { name: cell().EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell(), columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal() && !RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal() && RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export() || HiddenColumns() || CornerMenuOptions()\" class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns()\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased()\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns()\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased() && ColumnsPinnable()\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.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{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.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-14,.est-fs-13{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{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(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-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.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:0px 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:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.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:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!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 #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.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{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i10.ModalDirective, selector: "[bsModal]", inputs: ["config", "closeInterceptor"], outputs: ["onShow", "onShown", "onHide", "onHidden"], exportAs: ["bs-modal"] }, { kind: "directive", type: i11.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i11.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i11.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i12.ContextMenuAttachDirective, selector: "[contextMenu]", inputs: ["contextMenuSubject", "contextMenu"] }, { kind: "component", type: i12.ContextMenuComponent, selector: "context-menu", inputs: ["menuClass", "autoFocus", "useBootstrap4", "disabled"], outputs: ["close", "open"] }, { kind: "directive", type: i12.ContextMenuItemDirective, selector: "[contextMenuItem]", inputs: ["subMenu", "divider", "enabled", "passive", "visible"], outputs: ["execute"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i13.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i13.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "component", type: i14.EsFormAdaptiveComponent, selector: "form-adaptive", inputs: ["Type", "TypeMissingMessage", "SearchFunction", "Precision", "TypePattern"] }, { kind: "component", type: EsTablePagerComponent, selector: "es-paging", inputs: ["CurrentPageSize", "View", "WarnOnAll", "AllSearch", "DefaultAll", "GroupMode", "GroupCount", "CountLabel", "ShowCount", "ShowPaging", "PagerCount", "Hidden"], outputs: ["pagingSelected"] }, { kind: "component", type: EsTh, selector: "[es-th]", inputs: ["es-th", "Order", "Orderable", "Display", "Resizable", "Pinned", "SearchInProgress", "OrderBy", "Wrap", "Fixed", "Template", "Visible"], outputs: ["onOrderChange", "onUnpinning"] }, { kind: "component", type: EsTd, selector: "[es-td]", inputs: ["es-td", "Context"], outputs: ["onCellGeneration"] }, { kind: "pipe", type: i8.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }, { kind: "pipe", type: EstFormatPipe, name: "est_format" }, { kind: "pipe", type: EstLookupPipe, name: "est_lookup" }, { kind: "pipe", type: EstRouterLinkPipe, name: "est_routerlink" }, { kind: "pipe", type: EstRendererPipe, name: "est_renderer" }, { kind: "pipe", type: EstEditorPipe, name: "est_editor" }, { kind: "pipe", type: EstPropInsensitivePipe, name: "est_propinsensitive" }], viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
5543
5603
  }
5544
5604
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, decorators: [{
5545
5605
  type: Component,
5546
- args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: false, 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\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height\" [style.background-color]=\"EmptySpaceBackgroundColor\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity\">\r\n <thead [hidden]=\"HeaderHidden || FirstBind\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll && !SingleSelection) || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && !(View?.selection || arraymodeSelection)?.all && PagingStyle == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection}}\r\n HasPinnedColumns: {{HasPinnedColumns}}\r\n arrayMode: {{arrayMode}}\r\n viewMode: {{viewMode}}\r\n UseCustomCells: {{UseCustomCells}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \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=\"arrayMode || viewMode\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations; trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition; trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn\"\r\n [SearchInProgress]=\"!!researchInProgress\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal\" [class.est-right-9]=\"Export || HiddenColumns\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export || HiddenColumns || ColumnsOrdering || CornerMenuOptions\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns || ColumnsOrdering\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions; trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" [class.est-no-selection]=\"RangeSelection\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode ? false : SelectionDisabled, sel: Selection }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle == 'both' || PagingStyle == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode && UseArrayModePaging && !SearchView\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <es-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\r\n <es-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);\"></es-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \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)=\"!RangeSelection && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource; let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns.VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><es-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);\"></es-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\"><es-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);\"></es-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells || EmptyRowTds) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && !EmptyRowTds\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell.Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell.Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell.IconClass && cell.Visible\">\r\n <ng-container *ngIf=\"!cell.ConditionField || (((item.properties || item) | est_propinsensitive : cell.ConditionField) == cell.ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations.length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell.Title}}\" class=\"{{cell.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell.ID)\">{{cell.Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell.ConditionField && (((item.properties || item) | est_propinsensitive : cell.ConditionField) != cell.ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell.IconClass && cell.Visible\"\r\n es-td=\"{{cell.Property || cell.ID}}\"\r\n id=\"estd_{{cell.Property || cell.ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell.Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable && cell.PropertyName\"\r\n [class.est-rg-hdr]=\"cell.GroupHeader\"\r\n [class.est-rg-agg]=\"cell.GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy || !cell.Wraps\"\r\n\r\n [style.text-align]=\" (!pinned && cell.Alignment) ? cell.Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell.PropAccessor) ? item.forecolors[cell.PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell.PropAccessor) ? item.backcolors[cell.PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell.PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n (onCellGeneration)=\"registerCell($event)\"\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\">\r\n\r\n <div [class.est-edit-hidden]=\"cell._editing\" [class.est-pre]=\"!(Hierarchy && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell.Template\">\r\n <ng-container *ngIf=\"!cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell.Multi\"><ng-container *ngTemplateOutlet=\"cell.Template; context: { $implicit: (item[cell.MultiProp] ? item[cell.MultiProp][cell.MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell.Template && !cell.Multi && !cell.Content\">\r\n <a *ngIf=\"cell.RoutePath\" [routerLink]=\"item | est_routerlink : cell.RoutePath : cell.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell.PropAccessor\">\r\n {{(item.values? item.values[cell.PropAccessor] : item[cell.PropAccessor]) | est_format: cell.Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell.PropAccessor && !cell.RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_renderer: { name: cell.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell, value: item.properties ? item.properties[cell.PropertyName] : item[cell.PropertyName], type: cell.PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell.Content\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell.PropertyName | est_editor: { name: cell.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal && !RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal && RemovalCondition\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export || HiddenColumns || CornerMenuOptions ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export || HiddenColumns || CornerMenuOptions\" class=\"est-sticky-last-column{{options.even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased && ColumnsPinnable\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.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{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.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-14,.est-fs-13{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{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(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-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.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:0px 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:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.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:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!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 #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.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{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"] }]
5547
- }], ctorParameters: () => [{ type: i1.NgControl, decorators: [{
5606
+ args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: false, 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\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\r\n <div class=\"est-slider round\"></div>\r\n </label>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\r\n <div *ngIf=\"FirstBind() && ShowLoadingOnBootstrap()\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll() || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\r\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\r\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\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; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection()}}\r\n HasPinnedColumns: {{HasPinnedColumns()}}\r\n arrayMode: {{arrayMode()}}\r\n viewMode: {{viewMode()}}\r\n UseCustomCells: {{UseCustomCells()}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \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=\"arrayMode() || viewMode()\">\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()\">\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n\r\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\r\n <ng-container *ngIf=\"(!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()\">\r\n <th *ngFor=\"let operation of DynamicOperations(); trackBy: idTrackBy\" class=\"est-col-min est-no-side-padding\"></th>\r\n\r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition(); trackBy: PropertyNameTrackBy\">\r\n <ng-container *ngIf=\"rowHeader.Visible\">\r\n <th *ngIf=\"OrderByColumn()\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\" [SearchInProgress]=\"researchInProgress()\" (onOrderChange)=\"thOrderChanged(rowHeader.PropertyName, $event)\">{{rowHeader.Description}}</th>\r\n <th *ngIf=\"!OrderByColumn()\" id=\"esth_{{rowHeader.PropertyName}}\" es-th=\"{{rowHeader.PropertyName}}\" class=\"{{UserDefinedDynamicCols() ? ((rowHeader.Clss || '') + (rowHeader.HeaderWraps ? '' : ' est-nowrap')) : ' est-nowrap'}}\" [Order]=\"rowHeader.DataOrder\" [Resizable]=\"ColumnsResizable()\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn()\">{{rowHeader.Description}}</th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\r\n <ng-container *ngIf=\"UseCustomCells() && RowTHs?.length > 0\">\r\n <th *ngIf=\"HasPinnedColumns()\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection()\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection()\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\"\r\n [style.width.px]=\"rowHeader.PinnedWidth\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [class.est-pinned-internal-header]=\"true\"\r\n [class.est-no-border]=\"true\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Pinned]=\"true\"\r\n [Fixed]=\"rowHeader.Fixed\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable()\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn()\"\r\n [SearchInProgress]=\"researchInProgress()\"\r\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDTrackBy\">\r\n\r\n <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n rowHeader: {{!!rowHeader}}\r\n rowHeader.Visible: {{rowHeader?.Visible}}\r\n rowHeader.Pinned: {{rowHeader?.Pinned}}\r\n rowHeader.Template: {{!!rowHeader.Template}}\r\n </div>\r\n\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\"\r\n es-th=\"{{rowHeader.ID}}\"\r\n class=\"{{rowHeader.Class || ''}}\"\r\n [style.text-align]=\" rowHeader.Alignment || null\"\r\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\r\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\r\n [class.est-nowrap]=\"!rowHeader.Wrap\"\r\n [Order]=\"rowHeader.Order\"\r\n [Resizable]=\"ColumnsResizable()\"\r\n [Orderable]=\"rowHeader.Orderable\"\r\n [OrderBy]=\"OrderByColumn()\"\r\n [SearchInProgress]=\"researchInProgress()\"\r\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\r\n\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\r\n <th *ngIf=\"Removal()\" [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\r\n\r\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\r\n <th *ngIf=\"Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()\" class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\r\n\r\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\r\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\r\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\r\n\r\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\r\n <div class=\"est-pointer\">\r\n <a class=\"dropdown-item\" *ngIf=\"HiddenColumns() || ColumnsOrdering()\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export() && CSVExport()\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export() && XLSXExport()\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions(); trackBy: idTrackBy\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\r\n </div>\r\n </div>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n\r\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\r\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\r\n <ng-container *ngIf=\"Selection()\">\r\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\r\n </ng-container>\r\n\r\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\r\n <ng-container *ngIf=\"!Selection()\">\r\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n <div *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'bottom'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n</div>\r\n\r\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\r\n<ng-template #pagingElement>\r\n <ng-container *ngIf=\"!FirstBind()\">\r\n <!-- Pulsanti avanti-indietro di paginazione -->\r\n <div *ngIf=\"PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)\" class=\"pull-right btn-toolbar\">\r\n <ng-container *ngIf=\"PagerOptions.View?.pagingavailable || viewMode()\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"arrayMode() && UseArrayModePaging() && !SearchView()\">\r\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\r\n <div class=\"pull-right\" *ngIf=\"PagerOptions.ShowCount || PagerOptions.ShowPagingOptions\">\r\n <div class=\"est-mt-min-5\" *ngIf=\"PagerOptions.ShowPaging\">\r\n <es-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\r\n <es-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);\"></es-paging>\r\n </div>\r\n </div>\r\n <div class=\"clearfix\"></div>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Template che contiene i pulsanti per cambiare pagina -->\r\n<ng-template #pagingButtons let-options>\r\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\r\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\r\n <div *ngIf=\"options.Array\" class=\"est-inline\"><a *ngFor=\"let p of options.Array; trackBy: valTrackBy\" class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a></div>\r\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \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)=\"!RangeSelection() && handleRowClick($event, item, true)\"\r\n (contextmenu)=\"onRightClick();\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns()\">\r\n <input type=\"checkbox\"\r\n [disabled]=\"templateOptions.selDisabled\"\r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns()\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #TBody>\r\n <ng-container *ngFor=\"let item of boundSource(); let i = index, let even = even; trackBy: bodyTrackBy\">\r\n <tr *ngIf=\"item._visible || !Hierarchy()\"\r\n [class]=\"item._rowClass ? item._rowClass : ''\"\r\n [class.est-line-through]=\"item.removed || item.deleted\"\r\n [class.est-rg]=\"item._group\"\r\n [class.est-rg-sep]=\"item._sep\"\r\n (click)=\"handleRowClick($event, item, false)\">\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\r\n </tr>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #groupPager let-item>\r\n <td class=\"est-pinned-body \" *ngIf=\"HasPinnedColumns()\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </td>\r\n <td *ngIf=\"item._grouplevel > 1\" [attr.colspan]=\"item._grouplevel-1\"></td>\r\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\r\n <div class=\"est-rg-sep-flex-right\" *ngIf=\"RowGroupingPagingStyle() == 'right'\">\r\n <div class=\"est-rg-page\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n <div class=\"est-rg-ipp\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><es-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);\"></es-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\"><es-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);\"></es-paging></div>\r\n <div class=\"est-rg-page\" *ngIf=\"(item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10\"><ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { separator: item, ATP: addToPageGroup.bind(this), GTP: goToPageGroup.bind(this), Array: item.buttons }}\"></ng-container></div>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\r\n<ng-template #basicColumns let-item let-index=\"index\">\r\n <ng-container *ngIf=\"(!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEditor let-ctx>\r\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\r\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\r\n <ng-container *ngIf=\"ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item.properties[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n <ng-container *ngIf=\"!ctx.item.properties\">\r\n <form-adaptive [FormLayout]=\"false\" [Validation]=\"false\" [Configuration]=\"ctx.definition.EditorOptions\" [(ngModel)]=\"ctx.item[ctx.definition.PropertyName]\" name=\"{{ ctx.definition.PropertyName + '_' + ctx.item._hash }}\" [Type]=\"ctx.definition.PropertyType\" [Source]=\"ctx.definition.PropertySource\" (inputFinalized)=\"ctx.finalizer()\"></form-adaptive>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-ctx>\r\n <!-- TODO: Formattare il valore in base a valType.type -->\r\n <ng-container *ngIf=\"ctx.type == 'enum'\">\r\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\r\n </ng-container>\r\n <ng-container *ngIf=\"ctx.type != 'enum'\">\r\n {{ctx.value}}\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells() && !EmptyRowTds()\">\r\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\r\n <td *ngIf=\"HasPinnedColumns()\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection()\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection()\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"cell().Pinned\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: true, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <!-- Body effettivo della riga -->\r\n <ng-container *ngFor=\"let cell of RowTDs[item._hash]; let index = index; trackBy: IDTrackBy\">\r\n <ng-container *ngIf=\"!cell().Pinned;\">\r\n <ng-container *ngTemplateOutlet=\"customTd; context: { \r\n $implicit: item, \r\n index: index, \r\n cell: cell, \r\n pinned: false, \r\n selectionStatus: selectionStatus[item._ordinal]?.[index],\r\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\r\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\r\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\r\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \r\n };\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Cella customizzata, elemento grafico base per la tabella -->\r\n<ng-template #customTd let-item let-cell=\"cell\" let-index=\"index\" let-pinned=\"pinned\" let-selStatus=\"selectionStatus\" let-selStatusUp=\"selectionStatusUp\" let-selStatusDown=\"selectionStatusDown\" let-selStatusLeft=\"selectionStatusLeft\" let-selStatusRight=\"selectionStatusRight\">\r\n\r\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\r\n <ng-container *ngIf=\"cell().IconClass && cell().Visible\">\r\n <ng-container *ngIf=\"!cell().ConditionField || (((item.properties || item) | est_propinsensitive : cell().ConditionField) == cell().ConditionValue)\">\r\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{cell().Title}}\" class=\"{{cell().IconClass}} est-pointer\" (click)=\"dynamicOperation(item, cell().ID)\">{{cell().Content}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"cell().ConditionField && (((item.properties || item) | est_propinsensitive : cell().ConditionField) != cell().ConditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-----------------------------------------------------------------------------------------------------------------------\r\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\r\n - . Generiche -\r\n - . Gestione allineamento e colori per la modalit\u00E0 report -\r\n - . Gestioni grafiche particolari per il Pinned -\r\n - . Gestione della selezione a singola cella in assenza di pinned -\r\n - . Gestione click classico e selezione multicella -\r\n ------------------------------------------------------------------------------------------------------------------------->\r\n\r\n <td *ngIf=\"!cell().IconClass && cell().Visible\"\r\n es-td=\"{{cell().Property || cell().ID}}\"\r\n id=\"estd_{{cell().Property || cell().ID}}_{{item._ordinal}}_{{index}}\"\r\n class=\"{{ cell().Class }}\"\r\n\r\n [Context]=\"item._hash\"\r\n [class.est-default-row-height]=\"!HighCellDensity()\"\r\n [class.est-white-selected]=\"item._selected\"\r\n [class.est-no-selection]=\"Editable() && cell().PropertyName\"\r\n [class.est-rg-hdr]=\"cell().GroupHeader\"\r\n [class.est-rg-agg]=\"cell().GroupAggregation\"\r\n [class.est-nowrap]=\"Hierarchy() || !cell().Wraps\"\r\n\r\n [style.text-align]=\"(!pinned && cell().Alignment) ? cell().Alignment : null\"\r\n [style.color]=\"(!pinned && item.forecolors && cell().PropAccessor) ? item.forecolors[cell().PropAccessor] : null\"\r\n [style.background-color]=\"(!pinned && item.backcolors && cell().PropAccessor) ? item.backcolors[cell().PropAccessor] : null\"\r\n \r\n [style.width.px]=\"pinned ? cell().PinnedWidth : null\"\r\n [class.est-no-border]=\"pinned\"\r\n\r\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\r\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\r\n [class.est-ltab-border]=\"cell().LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\r\n [class.est-rtab-border]=\"cell().RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\r\n \r\n [class.est-selected-cell]=\"selStatus?.selected\"\r\n [class.est-cell-lborder]=\" selStatus?.lborder\"\r\n [class.est-cell-rborder]=\" selStatus?.rborder\"\r\n [class.est-cell-tborder]=\" selStatus?.tborder\"\r\n [class.est-cell-bborder]=\" selStatus?.bborder\"\r\n [class.est-cell-lborder-tmp]=\"!cell().LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\r\n [class.est-cell-rborder-tmp]=\"!cell().RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\r\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\r\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\r\n\r\n #cellRef\r\n\r\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\r\n\r\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\r\n\r\n <!-- \r\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\r\n\r\n (mousedown)=\"mousedown($event, cell, item)\"\r\n (mouseenter)=\"mouseenter($event)\"\r\n (mouseup)=\"mouseup($event)\"\r\n -->\r\n\r\n <div [class.est-edit-hidden]=\"cell()._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\r\n\r\n <ng-container #DEBUG>\r\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\r\n </ng-container>\r\n\r\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\r\n <ng-container *ngIf=\"cell().Template\">\r\n <ng-container *ngIf=\"!cell().Multi\"><ng-container *ngTemplateOutlet=\"cell().Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"cell().Multi\"><ng-container *ngTemplateOutlet=\"cell().Template; context: { $implicit: (item[cell().MultiProp] ? item[cell().MultiProp][cell().MultiIndex] : {}) }\"></ng-container></span>\r\n </ng-container>\r\n\r\n <!-- 8%\r\n Template non disponibile, pu\u00F2 venire da\r\n RoutePath in caso sia un link di una tabella dinamica\r\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\r\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\r\n -->\r\n <ng-container *ngIf=\"!cell().Template && !cell().Multi && !cell().Content\">\r\n <a *ngIf=\"cell().RoutePath\" [routerLink]=\"item | est_routerlink : cell().RoutePath : cell().RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[cell().PropertyName] : item[cell().PropertyName]\"></a>\r\n\r\n <span *ngIf=\"cell().PropAccessor\">\r\n {{(item.values? item.values[cell().PropAccessor] : item[cell().PropAccessor]) | est_format: cell().Format }}\r\n </span>\r\n\r\n <ng-container *ngIf=\"!cell().PropAccessor && !cell().RoutePath\">\r\n <ng-container *ngTemplateOutlet=\"cell().PropertyName | est_renderer: { name: cell().RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: cell(), value: item.properties ? item.properties[cell().PropertyName] : item[cell().PropertyName], type: cell().PropertyType} }\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n\r\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\r\n <ng-container *ngIf=\"Hierarchy() && index == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n\r\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\r\n <ng-container *ngIf=\"cell().Content\">\r\n {{cell().Content}}\r\n </ng-container>\r\n </div>\r\n\r\n <div *ngIf=\"cell()._editing\" class=\"est-mt-min-5\">\r\n <ng-container *ngTemplateOutlet=\"cell().PropertyName | est_editor: { name: cell().EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: cell(), columnIndex: index, item: item, finalizer: finalizeUserEdit.bind(this, cell, item, index) } }\"></ng-container>\r\n </div>\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()])\"></span>\r\n &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal() && !RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal() && RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export() || HiddenColumns() || CornerMenuOptions()\" class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns()\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased()\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n [cdkDropListData]=\"TMPColumnsList\"\r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last; trackBy: idTrackBy\"\r\n class=\"est-pointer est-droplist\"\r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns()\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased() && ColumnsPinnable()\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.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{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.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-14,.est-fs-13{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{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(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-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.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:0px 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:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.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:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!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 #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.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{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"] }]
5607
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgControl, decorators: [{
5548
5608
  type: Self
5549
5609
  }, {
5550
5610
  type: Optional
@@ -5584,122 +5644,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
5584
5644
  }], inputField: [{
5585
5645
  type: ViewChild,
5586
5646
  args: ['input', { static: false }]
5587
- }], CornerMenuOptions: [{
5588
- type: Input
5589
- }], ColumnsResizable: [{
5590
- type: Input
5591
- }], ColumnsPinnable: [{
5592
- type: Input
5593
- }], AutoUpdate: [{
5594
- type: Input
5595
- }], Height: [{
5596
- type: Input
5597
- }], EmptySpaceBackgroundColor: [{
5598
- type: Input
5599
- }], EsTableHandledSearch: [{
5600
- type: Input
5601
- }], MaxHeight: [{
5602
- type: Input
5603
- }], ContainerClass: [{
5604
- type: Input
5605
- }], XLSXExport: [{
5606
- type: Input
5607
- }], CSVExport: [{
5608
- type: Input
5609
- }], AllSearch: [{
5610
- type: Input
5611
- }], HighCellDensity: [{
5612
- type: Input
5613
- }], Selection: [{
5614
- type: Input
5615
- }], ShowLoadingOnBootstrap: [{
5616
- type: Input
5617
- }], Removal: [{
5618
- type: Input
5619
- }], RemovalCondition: [{
5620
- type: Input
5621
- }], Export: [{
5622
- type: Input
5623
- }], ShiftClick: [{
5624
- type: Input
5625
- }], CountLabel: [{
5626
- type: Input
5627
- }], HidePaging: [{
5628
- type: Input
5629
- }], HidePagingCount: [{
5630
- type: Input
5631
- }], HidePagingButtons: [{
5632
- type: Input
5633
5647
  }], ContextMenu: [{
5634
5648
  type: Input
5635
- }], ExportFileName: [{
5636
- type: Input
5637
- }], TableClass: [{
5638
- type: Input
5639
5649
  }], ExportFunction: [{
5640
5650
  type: Input
5641
- }], ExportOnlyVisibleColumns: [{
5642
- type: Input
5643
- }], HasHeaderGroup: [{
5644
- type: Input
5645
- }], HasSecondaryHeaderGroup: [{
5646
- type: Input
5647
- }], HeaderHidden: [{
5648
- type: Input
5649
- }], BodyHidden: [{
5650
- type: Input
5651
- }], SelectionDisabled: [{
5652
- type: Input
5653
- }], SingleSelection: [{
5654
- type: Input
5655
5651
  }], RowClassAssigner: [{
5656
5652
  type: Input
5657
- }], OrderByColumn: [{
5658
- type: Input
5659
- }], MultipleOrderingDirectives: [{
5660
- type: Input
5661
- }], HiddenColumns: [{
5662
- type: Input
5663
- }], ColumnsOrdering: [{
5664
- type: Input
5665
- }], SearchView: [{
5666
- type: Input
5667
- }], SelectAll: [{
5668
- type: Input
5669
- }], UseArrayModePaging: [{
5670
- type: Input
5671
- }], DynamicRowColumnsDefinition: [{
5672
- type: Input
5673
- }], DynamicOperations: [{
5674
- type: Input
5675
- }], Hierarchy: [{
5676
- type: Input
5677
- }], ParentKey: [{
5678
- type: Input
5679
- }], OwnKey: [{
5680
- type: Input
5681
- }], StartsExpanded: [{
5682
- type: Input
5683
- }], SavePreferences: [{
5684
- type: Input
5685
- }], DefaultAlignment: [{
5686
- type: Input
5687
- }], PagingStyle: [{
5688
- type: Input
5689
- }], RowGroupingPagingStyle: [{
5690
- type: Input
5691
- }], ItemSourceProperty: [{
5692
- type: Input
5693
- }], UseSelectionCache: [{
5694
- type: Input
5695
- }], ShowItemGroupsColumns: [{
5696
- type: Input
5697
- }], Editable: [{
5698
- type: Input
5699
- }], RangeSelection: [{
5700
- type: Input
5701
- }], SearchThrottle: [{
5702
- type: Input
5703
5653
  }], onOrderChanged: [{
5704
5654
  type: Output
5705
5655
  }], onSearchRequest: [{
@@ -5724,8 +5674,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
5724
5674
  }], tableEmptyMenu: [{
5725
5675
  type: ViewChild,
5726
5676
  args: ['emptyMenu', { static: true }]
5727
- }], ArraymodeItemsPerPage: [{
5728
- type: Input
5729
5677
  }] } });
5730
5678
  class EsTdReference {
5731
5679
  }