@esfaenza/es-table 19.2.17 → 19.2.19
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/esfaenza-es-table.mjs +361 -435
- package/fesm2022/esfaenza-es-table.mjs.map +1 -1
- package/lib/components/es-table/es_table.component.d.ts +107 -80
- package/lib/components/es-td/es_td.component.d.ts +7 -7
- package/lib/components/es-th/es_th.component.d.ts +15 -14
- package/lib/domain/internals/TdElement.d.ts +2 -0
- package/package.json +8 -8
|
@@ -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
|
}
|
|
@@ -673,7 +673,7 @@ 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
679
|
if (this.est.viewMode)
|
|
@@ -684,7 +684,7 @@ class ColumnMetadataHandler {
|
|
|
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) {
|
|
687
|
+
if (this.est.SavePreferences()) {
|
|
688
688
|
let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
|
|
689
689
|
this.registerViewPreferences(castedView);
|
|
690
690
|
}
|
|
@@ -742,7 +742,7 @@ class ColumnMetadataHandler {
|
|
|
742
742
|
continue;
|
|
743
743
|
// Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
|
|
744
744
|
// Di default la visibilità è quella impostata nel componente
|
|
745
|
-
if ((this.est.HiddenColumns || th.thVisible) && th.thIf) {
|
|
745
|
+
if ((this.est.HiddenColumns() || th.thVisible) && th.thIf) {
|
|
746
746
|
let previouslyPinned = !this.est.ColumnsList || this.est.ColumnsList.length == 0 ? null : this.est.ColumnsList.find(t => t.id == column) || null;
|
|
747
747
|
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
748
|
if (previouslyPinned)
|
|
@@ -910,19 +910,20 @@ class ColumnMetadataHandler {
|
|
|
910
910
|
let item = tds[i];
|
|
911
911
|
newTds[columnsIndexCache[item.td]] = item;
|
|
912
912
|
}
|
|
913
|
-
this.est.HasPinnedColumns
|
|
913
|
+
this.est.HasPinnedColumns.set(pinneds > 0);
|
|
914
914
|
}
|
|
915
915
|
/** In base alla configurazione delle colonne calcola le dimenioni delle colonne pinnate */
|
|
916
916
|
evaluatePinnedColumnsWidth() {
|
|
917
|
-
if (!this.est.HasPinnedColumns)
|
|
917
|
+
if (!this.est.HasPinnedColumns())
|
|
918
918
|
return;
|
|
919
|
-
|
|
919
|
+
let pcw = 0;
|
|
920
920
|
for (let i = 0; i < this.est.ColumnsList.length; i++) {
|
|
921
921
|
let col = this.est.ColumnsList[i];
|
|
922
922
|
if (col.pinned && col.visible)
|
|
923
|
-
|
|
923
|
+
pcw += col.pinnedWidth;
|
|
924
924
|
}
|
|
925
|
-
|
|
925
|
+
pcw += this.est.Selection() ? 25 : 0;
|
|
926
|
+
this.est.PinnedContainerWidth.set(pcw);
|
|
926
927
|
}
|
|
927
928
|
/**
|
|
928
929
|
* Terminato il binding delle colonne da **reviewColumnsList** e della **View** dal **writeValue** questo metodo si occupa
|
|
@@ -941,8 +942,8 @@ class ColumnMetadataHandler {
|
|
|
941
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
|
}
|
|
@@ -972,7 +973,7 @@ class ColumnMetadataHandler {
|
|
|
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 => {
|
|
@@ -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 = "";
|
|
@@ -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);
|
|
@@ -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
|
|
1524
|
+
if (!useGenericItems || (!this.est.FirstBind() && this.est.DynamicRowColumnsDefinition()?.length > 0))
|
|
1524
1525
|
return;
|
|
1525
|
-
if ((
|
|
1526
|
+
if ((this.est.DynamicRowColumnsDefinition()?.length || 0) == 0) {
|
|
1526
1527
|
var props = this.est.TMPBoundSource[0]["properties"];
|
|
1527
|
-
|
|
1528
|
+
let drcd = [];
|
|
1528
1529
|
for (let key in props)
|
|
1529
|
-
|
|
1530
|
-
this.est.
|
|
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
|
|
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 (
|
|
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
|
}
|
|
@@ -1631,9 +1633,9 @@ class HierarchyModeHandler {
|
|
|
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
1634
|
if (!this.est.ParentKey && !this.est.OwnKey) {
|
|
1633
1635
|
if (objs[0]['parentid'] !== undefined)
|
|
1634
|
-
this.est.ParentKey
|
|
1636
|
+
this.est.ParentKey.set('parentid');
|
|
1635
1637
|
if (objs[0]['id'] !== undefined)
|
|
1636
|
-
this.est.OwnKey
|
|
1638
|
+
this.est.OwnKey.set('id');
|
|
1637
1639
|
}
|
|
1638
1640
|
//Check finale per assicurarmi che le props ci siano
|
|
1639
1641
|
if (!this.est.ParentKey || !this.est.OwnKey) {
|
|
@@ -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
|
|
@@ -1699,12 +1701,12 @@ class HierarchyModeHandler {
|
|
|
1699
1701
|
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
1700
1702
|
let obj = this.est.boundSource[i];
|
|
1701
1703
|
// Trovo il parent con quell'id e lo espando
|
|
1702
|
-
if (obj[this.est.OwnKey] == key) {
|
|
1704
|
+
if (obj[this.est.OwnKey()] == key) {
|
|
1703
1705
|
obj._expanded = true;
|
|
1704
1706
|
for (let ic = 0; ic < this.est.boundSource.length; ic++) {
|
|
1705
1707
|
let child = this.est.boundSource[ic];
|
|
1706
1708
|
// Trovo tutti i child di quel parent e li rendo visibili
|
|
1707
|
-
if (child[this.est.ParentKey] == key)
|
|
1709
|
+
if (child[this.est.ParentKey()] == key)
|
|
1708
1710
|
child._visible = true;
|
|
1709
1711
|
}
|
|
1710
1712
|
return;
|
|
@@ -1720,7 +1722,7 @@ class HierarchyModeHandler {
|
|
|
1720
1722
|
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
1721
1723
|
let obj = this.est.boundSource[i];
|
|
1722
1724
|
// Trovo il parent con quell'id e lo collasso
|
|
1723
|
-
if (obj[this.est.OwnKey] == key) {
|
|
1725
|
+
if (obj[this.est.OwnKey()] == key) {
|
|
1724
1726
|
obj._expanded = false;
|
|
1725
1727
|
// Collasso/nascondo tutti i child del parent
|
|
1726
1728
|
this.collapseChildOfParent(key);
|
|
@@ -1738,12 +1740,12 @@ class HierarchyModeHandler {
|
|
|
1738
1740
|
let child = this.est.boundSource[ic];
|
|
1739
1741
|
// Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,
|
|
1740
1742
|
// lo collasso e vado in ricorsione sui figli
|
|
1741
|
-
if (child[this.est.ParentKey] == parentKey && !child.parent)
|
|
1743
|
+
if (child[this.est.ParentKey()] == parentKey && !child.parent)
|
|
1742
1744
|
child._visible = false;
|
|
1743
|
-
else if (child[this.est.ParentKey] == parentKey && child.parent) {
|
|
1745
|
+
else if (child[this.est.ParentKey()] == parentKey && child.parent) {
|
|
1744
1746
|
child._expanded = false;
|
|
1745
1747
|
child._visible = false;
|
|
1746
|
-
this.collapseChildOfParent(child[this.est.OwnKey]);
|
|
1748
|
+
this.collapseChildOfParent(child[this.est.OwnKey()]);
|
|
1747
1749
|
}
|
|
1748
1750
|
}
|
|
1749
1751
|
}
|
|
@@ -1776,14 +1778,14 @@ class ItemsHandler {
|
|
|
1776
1778
|
// Se faccio dei raggruppamenti ignoro la paginazione
|
|
1777
1779
|
if (this.est.UseArrayModePaging && !allIfPossible) {
|
|
1778
1780
|
// 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
|
|
1781
|
-
this.est.arraymodePage = this.est.SearchView.page;
|
|
1782
|
-
this.est.arraymodePages = this.est.SearchView.pages;
|
|
1781
|
+
if (this.est.SearchView()) {
|
|
1782
|
+
this.est.ArraymodeItemsPerPage.set(this.est.SearchView().itemsperpageoverride);
|
|
1783
|
+
this.est.arraymodePage = this.est.SearchView().page;
|
|
1784
|
+
this.est.arraymodePages = this.est.SearchView().pages;
|
|
1783
1785
|
}
|
|
1784
1786
|
// Devo chiamare il refresh page solo se vengo richiamato da un binding esterno
|
|
1785
1787
|
else if (refreshPaging)
|
|
1786
|
-
this.refreshPaging(this.est.ArraymodeItemsPerPage);
|
|
1788
|
+
this.refreshPaging(this.est.ArraymodeItemsPerPage());
|
|
1787
1789
|
items = this.adaptViewToPaging();
|
|
1788
1790
|
}
|
|
1789
1791
|
else {
|
|
@@ -1803,8 +1805,8 @@ class ItemsHandler {
|
|
|
1803
1805
|
* @param {number} pageSize Dimensione della pagina
|
|
1804
1806
|
*/
|
|
1805
1807
|
refreshPaging(pageSize) {
|
|
1806
|
-
this.est.ArraymodeItemsPerPage
|
|
1807
|
-
this.est.arraymodePages = Math.ceil(this.est.View.length /
|
|
1808
|
+
this.est.ArraymodeItemsPerPage.set(pageSize);
|
|
1809
|
+
this.est.arraymodePages = Math.ceil(this.est.View.length / pageSize);
|
|
1808
1810
|
this.est.arraymodePage = 1;
|
|
1809
1811
|
// Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca
|
|
1810
1812
|
this.est.internalWriteValue();
|
|
@@ -1827,7 +1829,7 @@ class ItemsHandler {
|
|
|
1827
1829
|
return ret;
|
|
1828
1830
|
}
|
|
1829
1831
|
else {
|
|
1830
|
-
let ret = this.est.ItemSourceProperty ? this.est.View[this.est.ItemSourceProperty] : this.est.View.items;
|
|
1832
|
+
let ret = this.est.ItemSourceProperty() ? this.est.View[this.est.ItemSourceProperty()] : this.est.View.items;
|
|
1831
1833
|
if (!ret)
|
|
1832
1834
|
ret = [];
|
|
1833
1835
|
// Setto variabile interna per specificare che questo è un elemento normale, non un gruppo o altro
|
|
@@ -1850,7 +1852,7 @@ class ItemsHandler {
|
|
|
1850
1852
|
if (this.est)
|
|
1851
1853
|
items = this.arrayModeReviewOrderings(items);
|
|
1852
1854
|
// 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++) {
|
|
1855
|
+
for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage()); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage(); i++) {
|
|
1854
1856
|
if (i <= items.length - 1)
|
|
1855
1857
|
tmpItems.push(items[i]);
|
|
1856
1858
|
}
|
|
@@ -2694,13 +2696,13 @@ class SelectionHandler {
|
|
|
2694
2696
|
// Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true
|
|
2695
2697
|
// Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni
|
|
2696
2698
|
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
|
|
2699
|
+
this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
|
|
2698
2700
|
// Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella
|
|
2699
2701
|
// Comunque costa 0 quindi mi permetto di refreshare
|
|
2700
2702
|
if (this.est.arrayMode) {
|
|
2701
|
-
let prevSelected = this.est.selectedObjects;
|
|
2703
|
+
let prevSelected = this.est.selectedObjects();
|
|
2702
2704
|
this.finalizeSelectionInformations(selectionItem);
|
|
2703
|
-
if (this.est.selectedObjects != prevSelected)
|
|
2705
|
+
if (this.est.selectedObjects() != prevSelected)
|
|
2704
2706
|
this.est.onSelectionChanged.emit(selectionItem);
|
|
2705
2707
|
}
|
|
2706
2708
|
}
|
|
@@ -2756,7 +2758,7 @@ class SelectionHandler {
|
|
|
2756
2758
|
handleItemsSelection(items, forcedVal = null, globalCheck = null) {
|
|
2757
2759
|
let si = this.est.View?.selection || this.est.arraymodeSelection;
|
|
2758
2760
|
// 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) {
|
|
2761
|
+
if (this.est.SingleSelection() && items[0]?._selected && !items[0]?._group) {
|
|
2760
2762
|
if (items.length > 1 && forcedVal == null)
|
|
2761
2763
|
throw "Tentativo di selezionare o deselezionare più di un elemento con SingleSelection attivo";
|
|
2762
2764
|
if (items.length == 1 && forcedVal == null) {
|
|
@@ -3099,7 +3101,7 @@ class SelectionHandler {
|
|
|
3099
3101
|
this.clearSelectionCaches();
|
|
3100
3102
|
}
|
|
3101
3103
|
// Se la possibilità di fare "Seleziona tutto" è abilitata allora la considero appena mi viene selezionato qualcosa
|
|
3102
|
-
this.est.canSelectAll
|
|
3104
|
+
this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
|
|
3103
3105
|
}
|
|
3104
3106
|
/** Compatta una cache di indici */
|
|
3105
3107
|
compactIndexMap(map) {
|
|
@@ -3118,8 +3120,9 @@ class SelectionHandler {
|
|
|
3118
3120
|
let si = this.est.View?.selection || this.est.arraymodeSelection;
|
|
3119
3121
|
let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);
|
|
3120
3122
|
let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);
|
|
3121
|
-
|
|
3122
|
-
|
|
3123
|
+
let count = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
|
|
3124
|
+
this.est.selectedObjects.set(count);
|
|
3125
|
+
return count;
|
|
3123
3126
|
}
|
|
3124
3127
|
/** Gestisce il comando di "Seleziona tutto in tutte le pagine" o il suo contrario, cioè "Reimposta selezione" */
|
|
3125
3128
|
selectAllOrResetSelection() {
|
|
@@ -3132,7 +3135,7 @@ class SelectionHandler {
|
|
|
3132
3135
|
selectionItem.items = [];
|
|
3133
3136
|
// Ripulisco gli stati UI di selezione globale se l'ho disattivata
|
|
3134
3137
|
if (!selectionItem.all) {
|
|
3135
|
-
this.est.canSelectAll
|
|
3138
|
+
this.est.canSelectAll.set(false);
|
|
3136
3139
|
this.est.globalCheck = false;
|
|
3137
3140
|
}
|
|
3138
3141
|
this.finalizeSelectionInformations(selectionItem);
|
|
@@ -3496,32 +3499,43 @@ class EsTh {
|
|
|
3496
3499
|
*/
|
|
3497
3500
|
this.startOffset = null;
|
|
3498
3501
|
/** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
|
|
3499
|
-
this.ID = "";
|
|
3502
|
+
this.ID = input("", { alias: "es-th" });
|
|
3503
|
+
/** Ordinamento attuale della colonna */
|
|
3504
|
+
this._Order = input(null, { alias: 'Order' });
|
|
3505
|
+
this.Order = signal(null);
|
|
3500
3506
|
/** Indica se questa colonna è ordinabile o meno */
|
|
3501
|
-
this.Orderable = true;
|
|
3507
|
+
this.Orderable = input(true);
|
|
3502
3508
|
/** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
3503
|
-
this.Display = "";
|
|
3509
|
+
this.Display = input("");
|
|
3504
3510
|
/** Indica se le dimnsioni di questa colonna sono modificabili o meno */
|
|
3505
|
-
this.Resizable = false;
|
|
3511
|
+
this.Resizable = input(false);
|
|
3506
3512
|
/** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */
|
|
3507
|
-
this.Pinned = false;
|
|
3513
|
+
this.Pinned = input(false);
|
|
3508
3514
|
/**
|
|
3509
3515
|
* Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio
|
|
3510
3516
|
* come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi
|
|
3511
3517
|
*/
|
|
3512
|
-
this.SearchInProgress = false;
|
|
3518
|
+
this.SearchInProgress = input(false);
|
|
3519
|
+
/** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */
|
|
3520
|
+
this.OrderBy = input(null);
|
|
3513
3521
|
/** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
|
|
3514
|
-
this.Wrap = false;
|
|
3522
|
+
this.Wrap = input(false);
|
|
3515
3523
|
/** 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;
|
|
3524
|
+
this.Fixed = input(false);
|
|
3517
3525
|
/** Template Angular da istanziare per questo TH */
|
|
3518
3526
|
this.Template = null;
|
|
3519
3527
|
/** Evento emesso al cambio di ordinamento effettuato su questa colonna */
|
|
3520
3528
|
this.onOrderChange = new EventEmitter();
|
|
3521
3529
|
/** Evento emesso all'unpinning della colonna */
|
|
3522
3530
|
this.onUnpinning = new EventEmitter();
|
|
3531
|
+
/** Classi da applicare alla colonna */
|
|
3532
|
+
this.Class = signal("");
|
|
3523
3533
|
/** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
3524
|
-
this._referenced = false;
|
|
3534
|
+
this._referenced = signal(false);
|
|
3535
|
+
/** Variabile finale su cui è bindato il contenuto della cella. Sarà valorizzato a **Display** se specificato, all'**innerHTML** dell'elemento proiettato altrimenti */
|
|
3536
|
+
this.Description = computed(() => {
|
|
3537
|
+
return this.Display() === null || this.Display() === "" ? this.content.nativeElement.innerText : this.Display();
|
|
3538
|
+
});
|
|
3525
3539
|
}
|
|
3526
3540
|
/**
|
|
3527
3541
|
* Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
@@ -3548,31 +3562,30 @@ class EsTh {
|
|
|
3548
3562
|
/** @ignore */
|
|
3549
3563
|
ngAfterViewInit() {
|
|
3550
3564
|
//Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
|
|
3551
|
-
this.
|
|
3552
|
-
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
3565
|
+
this.Class.set(this.myself.nativeElement.className.replace("app-display-none", ""));
|
|
3553
3566
|
//Resize
|
|
3554
|
-
if (this.Resizable)
|
|
3567
|
+
if (this.Resizable())
|
|
3555
3568
|
this.renderer.addClass(this.myself.nativeElement, "app-relative");
|
|
3556
3569
|
}
|
|
3557
3570
|
/** Emette l'evento di unpinning */
|
|
3558
3571
|
unpin() {
|
|
3559
|
-
this.onUnpinning.emit(this.ID);
|
|
3572
|
+
this.onUnpinning.emit(this.ID());
|
|
3560
3573
|
}
|
|
3561
3574
|
/** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */
|
|
3562
3575
|
setupNextOrderAndNotify() {
|
|
3563
|
-
if (!this.ID) {
|
|
3576
|
+
if (!this.ID()) {
|
|
3564
3577
|
console.log("Attempt to order a column without ID. Operation ignored");
|
|
3565
3578
|
return;
|
|
3566
3579
|
}
|
|
3567
|
-
if (this.SearchInProgress) {
|
|
3580
|
+
if (this.SearchInProgress()) {
|
|
3568
3581
|
console.log("Attempt to order a column during a search. Operation ignored");
|
|
3569
3582
|
return;
|
|
3570
3583
|
}
|
|
3571
|
-
if (!this.OrderBy || !this.Orderable)
|
|
3584
|
+
if (!this.OrderBy() || !this.Orderable())
|
|
3572
3585
|
return;
|
|
3573
|
-
var nextOrder = this.orderNext[this.
|
|
3574
|
-
this.Order
|
|
3575
|
-
this.onOrderChange.emit(
|
|
3586
|
+
var nextOrder = this.orderNext[this._Order() || "NONE"];
|
|
3587
|
+
this.Order.set(nextOrder);
|
|
3588
|
+
this.onOrderChange.emit(nextOrder);
|
|
3576
3589
|
}
|
|
3577
3590
|
/**
|
|
3578
3591
|
* Evento di inizio resize della colonna
|
|
@@ -3580,14 +3593,14 @@ class EsTh {
|
|
|
3580
3593
|
* @param {any} ev Evento MouseDown
|
|
3581
3594
|
*/
|
|
3582
3595
|
onResizeStart(ev) {
|
|
3583
|
-
if (!this.Resizable)
|
|
3596
|
+
if (!this.Resizable())
|
|
3584
3597
|
return;
|
|
3585
3598
|
this.resizingThis = true;
|
|
3586
3599
|
this.startOffset = this.myself.nativeElement.offsetWidth - ev.pageX;
|
|
3587
3600
|
}
|
|
3588
3601
|
/** Listener per la fine dell'operazione di resize */
|
|
3589
3602
|
onMouseUp() {
|
|
3590
|
-
if (!this.Resizable)
|
|
3603
|
+
if (!this.Resizable())
|
|
3591
3604
|
return;
|
|
3592
3605
|
this.resizingThis = false;
|
|
3593
3606
|
}
|
|
@@ -3597,7 +3610,7 @@ class EsTh {
|
|
|
3597
3610
|
* @param {$event} ev Evento MouseMove
|
|
3598
3611
|
*/
|
|
3599
3612
|
onMouseMove($event) {
|
|
3600
|
-
if (!this.Resizable || !this.resizingThis)
|
|
3613
|
+
if (!this.Resizable() || !this.resizingThis)
|
|
3601
3614
|
return;
|
|
3602
3615
|
//Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo
|
|
3603
3616
|
//(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)
|
|
@@ -3606,33 +3619,12 @@ class EsTh {
|
|
|
3606
3619
|
$event.preventDefault();
|
|
3607
3620
|
}
|
|
3608
3621
|
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: "
|
|
3622
|
+
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> \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
3623
|
}
|
|
3611
3624
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTh, decorators: [{
|
|
3612
3625
|
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> \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: {
|
|
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: [{
|
|
3626
|
+
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> \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>" }]
|
|
3627
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { Template: [{
|
|
3636
3628
|
type: Input
|
|
3637
3629
|
}], onOrderChange: [{
|
|
3638
3630
|
type: Output
|
|
@@ -3655,36 +3647,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
3655
3647
|
/** Componente rappresentante una singola cella del body della tabella */
|
|
3656
3648
|
class EsTd {
|
|
3657
3649
|
/** @ignore */
|
|
3658
|
-
constructor(
|
|
3659
|
-
this.
|
|
3650
|
+
constructor(el) {
|
|
3651
|
+
this.el = el;
|
|
3660
3652
|
/** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */
|
|
3661
|
-
this.ID = "";
|
|
3653
|
+
this.ID = input("", { alias: "es-td" });
|
|
3654
|
+
/** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */
|
|
3655
|
+
this.Context = input();
|
|
3662
3656
|
/** Quando questa cella viene generata questo evento permette di dire "ehi, sono nato!" */
|
|
3663
3657
|
this.onCellGeneration = new EventEmitter();
|
|
3664
3658
|
/** Errore attualmente presente sulla cella */
|
|
3665
|
-
this.ValidationError = "";
|
|
3659
|
+
this.ValidationError = signal("");
|
|
3666
3660
|
}
|
|
3667
3661
|
/** @ignore */
|
|
3668
3662
|
ngAfterViewInit() {
|
|
3669
|
-
this.onCellGeneration.emit({ id: this.ID, hash: this.Context, self: this });
|
|
3663
|
+
this.onCellGeneration.emit({ id: this.ID(), hash: this.Context(), self: this });
|
|
3670
3664
|
}
|
|
3671
3665
|
/** Api per impostare un "errore" su questa cella in maniera programmatica */
|
|
3672
3666
|
validationError(error) {
|
|
3673
|
-
this.ValidationError
|
|
3674
|
-
this.cdr.markForCheck();
|
|
3667
|
+
this.ValidationError.set(error);
|
|
3675
3668
|
}
|
|
3676
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, deps: [{ token: i0.
|
|
3677
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
3669
|
+
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 }); }
|
|
3670
|
+
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
3671
|
}
|
|
3679
3672
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, decorators: [{
|
|
3680
3673
|
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.
|
|
3683
|
-
type: Input,
|
|
3684
|
-
args: ['es-td']
|
|
3685
|
-
}], Context: [{
|
|
3686
|
-
type: Input
|
|
3687
|
-
}], onCellGeneration: [{
|
|
3674
|
+
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"] }]
|
|
3675
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { onCellGeneration: [{
|
|
3688
3676
|
type: Output
|
|
3689
3677
|
}] } });
|
|
3690
3678
|
|
|
@@ -3894,7 +3882,8 @@ class EsTableDefaultable {
|
|
|
3894
3882
|
/** Componente che permette di rappresentare una griglia di valori */
|
|
3895
3883
|
class EsTableComponent {
|
|
3896
3884
|
/** @ignore */
|
|
3897
|
-
constructor(ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3885
|
+
constructor(_zone, ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3886
|
+
this._zone = _zone;
|
|
3898
3887
|
this.ngControl = ngControl;
|
|
3899
3888
|
this.prefService = prefService;
|
|
3900
3889
|
this.deafults = deafults;
|
|
@@ -3910,6 +3899,7 @@ class EsTableComponent {
|
|
|
3910
3899
|
this.logger = logger;
|
|
3911
3900
|
this.emb = emb;
|
|
3912
3901
|
this.rendererRef = rendererRef;
|
|
3902
|
+
this._destroyed$ = new Subject();
|
|
3913
3903
|
/** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */
|
|
3914
3904
|
this.FocusSubject = new Subject();
|
|
3915
3905
|
/** Se vengono effettuati 2 click a distanza inferiore a questi Millisecondi viene considerato un doppio click */
|
|
@@ -3921,9 +3911,9 @@ class EsTableComponent {
|
|
|
3921
3911
|
/** Tiene da conto l'ultimo elemento selezionato in modo da poter effettuare il SHIFT+CLICK */
|
|
3922
3912
|
this.lastSelected = null;
|
|
3923
3913
|
/** Conteggio interno per il numero di elementi selezionati */
|
|
3924
|
-
this.selectedObjects = 0;
|
|
3914
|
+
this.selectedObjects = signal(0);
|
|
3925
3915
|
/** Indica se è possibile effettuare una selezione massiva */
|
|
3926
|
-
this.canSelectAll = false;
|
|
3916
|
+
this.canSelectAll = signal(false);
|
|
3927
3917
|
/** Indica se il componente sta gestendo un IAppSearch<any> */
|
|
3928
3918
|
this.viewMode = false;
|
|
3929
3919
|
/** Indica se il componente sta gestendo un any[] */
|
|
@@ -3944,7 +3934,7 @@ class EsTableComponent {
|
|
|
3944
3934
|
/** 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
3935
|
this.autoUpdate = false;
|
|
3946
3936
|
/** Numero di secondi da fare trascorrere fra una ricerca e l'altra */
|
|
3947
|
-
this.seconds =
|
|
3937
|
+
this.seconds = "10";
|
|
3948
3938
|
/** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */
|
|
3949
3939
|
this.researchInProgress = false;
|
|
3950
3940
|
/** Modello di appoggio temporaneo per i **RowTDs** */
|
|
@@ -3983,15 +3973,15 @@ class EsTableComponent {
|
|
|
3983
3973
|
* ecc...
|
|
3984
3974
|
* viene dedotto dal sistema in automatico
|
|
3985
3975
|
*/
|
|
3986
|
-
this.UseCustomCells = null;
|
|
3976
|
+
this.UseCustomCells = signal(null);
|
|
3987
3977
|
/**
|
|
3988
3978
|
* Indica se oltre alle colonne dinamiche specifiche di un tipo di oggetto ci sono anche colonne dinamiche aggiunte dall'utente
|
|
3989
3979
|
*
|
|
3990
3980
|
* Es. una colonna in cui mostrare sempre un iconcina
|
|
3991
3981
|
*/
|
|
3992
|
-
this.UserDefinedDynamicCols = false;
|
|
3982
|
+
this.UserDefinedDynamicCols = signal(false);
|
|
3993
3983
|
/** 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;
|
|
3984
|
+
this.FirstBind = signal(true);
|
|
3995
3985
|
/** Lista di colonne che si possono visualizzare/ordinare fra di loro */
|
|
3996
3986
|
this.ColumnsList = [];
|
|
3997
3987
|
/** Variabile d'appoggio usata dalla dialog di selezione/nascondimento, per evitare di danneggiare **ColumnsList** in caso di modifiche poi annullate */
|
|
@@ -3999,129 +3989,155 @@ class EsTableComponent {
|
|
|
3999
3989
|
/** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */
|
|
4000
3990
|
this.globalColVisCheck = false;
|
|
4001
3991
|
/** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */
|
|
4002
|
-
this.CornerMenuOptions = null;
|
|
3992
|
+
this.CornerMenuOptions = input(null);
|
|
4003
3993
|
/** Indica se dev'essere possibile effettuare il resize delle colonne */
|
|
4004
|
-
this.
|
|
3994
|
+
this._ColumnsResizable = input(null, { alias: "ColumnsResizable" });
|
|
3995
|
+
this.ColumnsResizable = signal(null);
|
|
4005
3996
|
/** Indica se dev'essere possibile effettuare il pinning delle colonne */
|
|
4006
|
-
this.
|
|
3997
|
+
this._ColumnsPinnable = input(null, { alias: "ColumnsPinnable" });
|
|
3998
|
+
this.ColumnsPinnable = signal(null);
|
|
4007
3999
|
/** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
|
|
4008
|
-
this.
|
|
4000
|
+
this._AutoUpdate = input(null, { alias: "AutoUpdate" });
|
|
4001
|
+
this.AutoUpdate = signal(null);
|
|
4009
4002
|
/** Indica l'altezza cablata che deve assumere la tabella. Es: "100px" | "100%" ... */
|
|
4010
|
-
this.Height = null;
|
|
4003
|
+
this.Height = input(null);
|
|
4011
4004
|
/** 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;
|
|
4005
|
+
this.EmptySpaceBackgroundColor = input(null);
|
|
4013
4006
|
/** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/
|
|
4014
|
-
this.EsTableHandledSearch = false;
|
|
4007
|
+
this.EsTableHandledSearch = input(false);
|
|
4015
4008
|
/** 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;
|
|
4009
|
+
this.MaxHeight = input(null);
|
|
4017
4010
|
/** Classi da applicare al contenitore della tabella */
|
|
4018
|
-
this.
|
|
4011
|
+
this._ContainerClass = input(null, { alias: "ContainerClass" });
|
|
4012
|
+
this.ContainerClass = signal(null);
|
|
4019
4013
|
/** Permette o meno l'export in formato XLSX */
|
|
4020
|
-
this.XLSXExport = null;
|
|
4014
|
+
this.XLSXExport = input(null);
|
|
4021
4015
|
/** Permette o meno l'export in formato CSV */
|
|
4022
|
-
this.CSVExport = true;
|
|
4016
|
+
this.CSVExport = input(true);
|
|
4023
4017
|
/** Permette di visualizzare o meno l'opzione di paginazione "Tutti" */
|
|
4024
|
-
this.
|
|
4018
|
+
this._AllSearch = input(null, { alias: "AllSearch" });
|
|
4019
|
+
this.AllSearch = signal(null);
|
|
4025
4020
|
/** 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;
|
|
4021
|
+
this.HighCellDensity = input(null);
|
|
4027
4022
|
/** Abilita o meno la possibilità di selezionare oggetti */
|
|
4028
|
-
this.
|
|
4023
|
+
this._Selection = input(null, { alias: "Selection" });
|
|
4024
|
+
this.Selection = signal(null);
|
|
4029
4025
|
/** Mostra o meno un messaggio di Loading al primo caricamento della tabella */
|
|
4030
|
-
this.ShowLoadingOnBootstrap = null;
|
|
4026
|
+
this.ShowLoadingOnBootstrap = input(null);
|
|
4031
4027
|
/** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */
|
|
4032
|
-
this.Removal = null;
|
|
4028
|
+
this.Removal = input(null);
|
|
4033
4029
|
/**
|
|
4034
4030
|
* Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata
|
|
4035
4031
|
*
|
|
4036
4032
|
* Come condizione si considera un semplice campo su cui effettuare un controllo booleano, come ad esempio "canremove"
|
|
4037
4033
|
*/
|
|
4038
|
-
this.RemovalCondition = '';
|
|
4034
|
+
this.RemovalCondition = input('');
|
|
4039
4035
|
/** Indica se abilitare la possibilità di esportare la vista dati attuale */
|
|
4040
|
-
this.
|
|
4036
|
+
this._Export = input(null, { alias: "Export" });
|
|
4037
|
+
this.Export = signal(null);
|
|
4041
4038
|
/** Indica se permettere la selezione multipla Windows-like cliccando un oggetto e facendo poi Shift + click su un oggetto successivo */
|
|
4042
|
-
this.
|
|
4039
|
+
this._ShiftClick = input(null, { alias: "ShiftClick" });
|
|
4040
|
+
this.ShiftClick = signal(null);
|
|
4043
4041
|
/** Indica il testo che va a sostituire "Oggetti Visualizzati" in caso si stia facendo qualcosa di custom */
|
|
4044
|
-
this.CountLabel = null;
|
|
4042
|
+
this.CountLabel = input(null);
|
|
4045
4043
|
/** Indica se nascondere o mostrare il componente di paginazione */
|
|
4046
|
-
this.
|
|
4044
|
+
this._HidePaging = input(null, { alias: "HidePaging" });
|
|
4045
|
+
this.HidePaging = signal(null);
|
|
4047
4046
|
/** Indica se nascondere o mostrare il conteggio degli elementi trovati */
|
|
4048
|
-
this.
|
|
4047
|
+
this._HidePagingCount = input(null, { alias: "HidePagingCount" });
|
|
4048
|
+
this.HidePagingCount = signal(null);
|
|
4049
4049
|
/** Indica se nascondere o mostrare i pulsanti di paginazione */
|
|
4050
|
-
this.
|
|
4050
|
+
this._HidePagingButtons = input(null, { alias: "HidePagingButtons" });
|
|
4051
|
+
this.HidePagingButtons = signal(null);
|
|
4051
4052
|
/** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */
|
|
4052
4053
|
this.ContextMenu = null;
|
|
4053
4054
|
/** Nome dell'esportazione generata da questa tabella */
|
|
4054
|
-
this.ExportFileName =
|
|
4055
|
+
this.ExportFileName = input("Export.csv");
|
|
4055
4056
|
/** Classe (HTML) di default della tabella */
|
|
4056
|
-
this.
|
|
4057
|
+
this._TableClass = input(null, { alias: "TableClass" });
|
|
4058
|
+
this.TableClass = signal(null);
|
|
4057
4059
|
/** Indica di esportare solo le colonne attualmente visibili della view */
|
|
4058
|
-
this.ExportOnlyVisibleColumns = false;
|
|
4060
|
+
this.ExportOnlyVisibleColumns = input(false);
|
|
4059
4061
|
/** @deprecated Indica la presenza di raggruppamenti a livello di header */
|
|
4060
|
-
this.HasHeaderGroup = null;
|
|
4062
|
+
this.HasHeaderGroup = input(null);
|
|
4061
4063
|
/** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
|
|
4062
|
-
this.HasSecondaryHeaderGroup = null;
|
|
4064
|
+
this.HasSecondaryHeaderGroup = input(null);
|
|
4063
4065
|
/** Indica se nascondere gli Header della tabella */
|
|
4064
|
-
this.HeaderHidden = null;
|
|
4066
|
+
this.HeaderHidden = input(null);
|
|
4065
4067
|
/** Indica se nascondere il Body della tabella */
|
|
4066
|
-
this.BodyHidden = null;
|
|
4068
|
+
this.BodyHidden = input(null);
|
|
4067
4069
|
/**
|
|
4068
4070
|
* Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,
|
|
4069
4071
|
* questo Input gestisce se questi input sono abilitati o meno
|
|
4070
4072
|
*/
|
|
4071
|
-
this.SelectionDisabled = null;
|
|
4073
|
+
this.SelectionDisabled = input(null);
|
|
4072
4074
|
/**
|
|
4073
4075
|
* Indica se forzare il sistema di selezione a gestire un elemento per volta.
|
|
4074
4076
|
* Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale
|
|
4075
4077
|
*/
|
|
4076
|
-
this.SingleSelection = null;
|
|
4078
|
+
this.SingleSelection = input(null);
|
|
4077
4079
|
/** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */
|
|
4078
4080
|
this.RowClassAssigner = null;
|
|
4079
4081
|
/** Permette di ordinare i dati in maniera discendente o ascendente */
|
|
4080
|
-
this.
|
|
4082
|
+
this._OrderByColumn = input(null, { alias: "OrderByColumn" });
|
|
4083
|
+
this.OrderByColumn = signal(null);
|
|
4081
4084
|
/** Permette di avere più direttive di ordinamento dei dati */
|
|
4082
|
-
this.MultipleOrderingDirectives = true;
|
|
4085
|
+
this.MultipleOrderingDirectives = input(true);
|
|
4083
4086
|
/** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */
|
|
4084
|
-
this.
|
|
4087
|
+
this._HiddenColumns = input(null, { alias: "HiddenColumns" });
|
|
4088
|
+
this.HiddenColumns = signal(null);
|
|
4085
4089
|
/** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */
|
|
4086
|
-
this.
|
|
4090
|
+
this._ColumnsOrdering = input(null, { alias: "ColumnsOrdering" });
|
|
4091
|
+
this.ColumnsOrdering = signal(null);
|
|
4087
4092
|
/** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */
|
|
4088
|
-
this.SearchView = null;
|
|
4093
|
+
this.SearchView = input(null);
|
|
4089
4094
|
/** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */
|
|
4090
|
-
this.
|
|
4095
|
+
this._SelectAll = input(null, { alias: "SelectAll" });
|
|
4096
|
+
this.SelectAll = signal(null);
|
|
4091
4097
|
/** Simula la paginazione anche per le tabelle che funzionano in modalità Array */
|
|
4092
|
-
this.
|
|
4098
|
+
this._UseArrayModePaging = input(true, { alias: "UseArrayModePaging" });
|
|
4099
|
+
this.UseArrayModePaging = signal(true);
|
|
4093
4100
|
/** Definizione di colonne dinamche per la modalità, appunto, dinamica */
|
|
4094
|
-
this.
|
|
4101
|
+
this._DynamicRowColumnsDefinition = input(null, { alias: 'DynamicRowColumnsDefinition' });
|
|
4102
|
+
this.DynamicRowColumnsDefinition = signal(null);
|
|
4095
4103
|
/** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
|
|
4096
|
-
this.DynamicOperations = [];
|
|
4104
|
+
this.DynamicOperations = input([]);
|
|
4097
4105
|
/** Indica se visualizzare i dati in maniera gerarchica */
|
|
4098
|
-
this.Hierarchy = null;
|
|
4106
|
+
this.Hierarchy = input(null);
|
|
4099
4107
|
/** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */
|
|
4100
|
-
this.
|
|
4108
|
+
this._ParentKey = input('', { alias: "ParentKey" });
|
|
4109
|
+
this.ParentKey = signal('');
|
|
4101
4110
|
/** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */
|
|
4102
|
-
this.
|
|
4111
|
+
this._OwnKey = input('', { alias: "OwnKey" });
|
|
4112
|
+
this.OwnKey = signal('');
|
|
4103
4113
|
/** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */
|
|
4104
|
-
this.StartsExpanded = true;
|
|
4114
|
+
this.StartsExpanded = input(true);
|
|
4105
4115
|
/** Indica se effettuare il salvataggio delle preferenze di ricerca */
|
|
4106
|
-
this.
|
|
4116
|
+
this._SavePreferences = input(null, { alias: "SavePreferences" });
|
|
4117
|
+
this.SavePreferences = signal(null);
|
|
4107
4118
|
/** Allineamento di default per celle e headers */
|
|
4108
|
-
this.
|
|
4119
|
+
this._DefaultAlignment = input(null, { alias: "DefaultAlignment" });
|
|
4120
|
+
this.DefaultAlignment = signal(null);
|
|
4109
4121
|
/** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
|
|
4110
|
-
this.
|
|
4122
|
+
this._PagingStyle = input(null, { alias: "PagingStyle" });
|
|
4123
|
+
this.PagingStyle = signal(null);
|
|
4111
4124
|
/** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
|
|
4112
|
-
this.
|
|
4125
|
+
this._RowGroupingPagingStyle = input(null, { alias: "RowGroupingPagingStyle" });
|
|
4126
|
+
this.RowGroupingPagingStyle = signal(null);
|
|
4113
4127
|
/** Qualora per qualsiasi motivo non venisse usato **items** dell'AppSearch questo Input indica qual è il nome della proprietà da utilizzare */
|
|
4114
|
-
this.ItemSourceProperty =
|
|
4128
|
+
this.ItemSourceProperty = input('');
|
|
4115
4129
|
/** 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.
|
|
4130
|
+
this._UseSelectionCache = input(null, { alias: "UseSelectionCache" });
|
|
4131
|
+
this.UseSelectionCache = signal(null);
|
|
4117
4132
|
/** 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.
|
|
4133
|
+
this._ShowItemGroupsColumns = input(null, { alias: "ShowItemGroupsColumns" });
|
|
4134
|
+
this.ShowItemGroupsColumns = signal(null);
|
|
4119
4135
|
/** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */
|
|
4120
|
-
this.Editable = false;
|
|
4136
|
+
this.Editable = input(false);
|
|
4121
4137
|
/** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */
|
|
4122
|
-
this.RangeSelection = false;
|
|
4138
|
+
this.RangeSelection = input(false);
|
|
4123
4139
|
/** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */
|
|
4124
|
-
this.SearchThrottle = 50;
|
|
4140
|
+
this.SearchThrottle = input(50);
|
|
4125
4141
|
/** Evento che viene richiamato al cambio di oridnamento di una colonna */
|
|
4126
4142
|
this.onOrderChanged = new EventEmitter();
|
|
4127
4143
|
/**
|
|
@@ -4153,7 +4169,8 @@ class EsTableComponent {
|
|
|
4153
4169
|
/** Numero di pagine (durante la paginazione in modalità Array) */
|
|
4154
4170
|
this.arraymodePages = 1;
|
|
4155
4171
|
/** Oggetti per ogni pagina (durante la paginazione in modalità Array) */
|
|
4156
|
-
this.
|
|
4172
|
+
this._ArraymodeItemsPerPage = input(null, { alias: "ArraymodeItemsPerPage" });
|
|
4173
|
+
this.ArraymodeItemsPerPage = signal(null);
|
|
4157
4174
|
/** Colonne da visualizzare in modalità array */
|
|
4158
4175
|
this.arrayColumns = [];
|
|
4159
4176
|
/** Ordine delle colonne da visualizzare in modalità array */
|
|
@@ -4185,15 +4202,19 @@ class EsTableComponent {
|
|
|
4185
4202
|
/** Variabile d'appoggio per capire se c'è bisogno di ri-effettuare una ricerca o meno */
|
|
4186
4203
|
this.ResearchNeeded = false;
|
|
4187
4204
|
/** 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 };
|
|
4205
|
+
this.Columns = signal({ Visibile: 100, VisibleUnpinned: 100, Global: 100 });
|
|
4189
4206
|
/** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */
|
|
4190
4207
|
this.MainGroupView = null;
|
|
4191
4208
|
/** 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
4209
|
this.BaseItemsCount = null;
|
|
4210
|
+
/** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/
|
|
4211
|
+
this.HasPinnedColumns = signal(null);
|
|
4212
|
+
/** Larghezza calcolata del container delle colonne pinnate */
|
|
4213
|
+
this.PinnedContainerWidth = signal(null);
|
|
4193
4214
|
/** 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
4215
|
this.ArrayGrouping = false;
|
|
4195
4216
|
/** Indica che l'es-table è basata sulle direttive (nuova modalità) */
|
|
4196
|
-
this.DirectivesBased = false;
|
|
4217
|
+
this.DirectivesBased = signal(false);
|
|
4197
4218
|
/** Indica lo stato di selezione per singola cella */
|
|
4198
4219
|
this.selectionStatus = {};
|
|
4199
4220
|
/** Chiamata reale al writeValue dopo il passaggio di **SearchThrottle** millisecondi. Solo modalità EsTableHandledSearch */
|
|
@@ -4230,6 +4251,10 @@ class EsTableComponent {
|
|
|
4230
4251
|
this.firstCoordinates = null;
|
|
4231
4252
|
//* Piango
|
|
4232
4253
|
this.EsTdsCache = {};
|
|
4254
|
+
effect(() => {
|
|
4255
|
+
if (this.SearchView())
|
|
4256
|
+
this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView().page, this.SearchView().pages || 1, this.SearchView().objectcount || this.SearchView().items.length, this.SearchView().itemsperpageoverride);
|
|
4257
|
+
});
|
|
4233
4258
|
// Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata
|
|
4234
4259
|
this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this)
|
|
4235
4260
|
this.handleCopy(); });
|
|
@@ -4262,24 +4287,32 @@ class EsTableComponent {
|
|
|
4262
4287
|
this.onSelectionChanged.emit(itemSelection);
|
|
4263
4288
|
});
|
|
4264
4289
|
// Assegnazione per tutti gli Input di default
|
|
4265
|
-
this.ColumnsResizable
|
|
4266
|
-
this.AutoUpdate
|
|
4267
|
-
this.AllSearch
|
|
4268
|
-
this.Export
|
|
4269
|
-
this.HidePaging
|
|
4270
|
-
this.HidePagingCount
|
|
4271
|
-
this.HidePagingButtons
|
|
4272
|
-
this.ContainerClass
|
|
4273
|
-
this.TableClass
|
|
4274
|
-
this.Selection
|
|
4275
|
-
this.SavePreferences
|
|
4276
|
-
this.PagingStyle
|
|
4277
|
-
this.RowGroupingPagingStyle
|
|
4278
|
-
this.UseSelectionCache
|
|
4279
|
-
this.ShowItemGroupsColumns
|
|
4280
|
-
this.ArraymodeItemsPerPage
|
|
4281
|
-
this.ColumnsPinnable
|
|
4282
|
-
this.DefaultAlignment
|
|
4290
|
+
this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));
|
|
4291
|
+
this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));
|
|
4292
|
+
this.AllSearch.set(this.utilities_H.InputOrDefault(this._AllSearch(), this.deafults?.AllSearch, true));
|
|
4293
|
+
this.Export.set(this.utilities_H.InputOrDefault(this._Export(), this.deafults?.Export));
|
|
4294
|
+
this.HidePaging.set(this.utilities_H.InputOrDefault(this._HidePaging(), this.deafults?.HidePaging, false));
|
|
4295
|
+
this.HidePagingCount.set(this.utilities_H.InputOrDefault(this._HidePagingCount(), this.deafults?.HidePagingCount));
|
|
4296
|
+
this.HidePagingButtons.set(this.utilities_H.InputOrDefault(this._HidePagingButtons(), this.deafults?.HidePagingButtons));
|
|
4297
|
+
this.ContainerClass.set(this.utilities_H.InputOrDefault(this._ContainerClass(), this.deafults?.ContainerClass, ''));
|
|
4298
|
+
this.TableClass.set(this.utilities_H.InputOrDefault(this._TableClass(), this.deafults?.TableClass, 'table table-striped table-hover table-sm'));
|
|
4299
|
+
this.Selection.set(this.utilities_H.InputOrDefault(this._Selection(), this.deafults?.Selection));
|
|
4300
|
+
this.SavePreferences.set(this.utilities_H.InputOrDefault(this._SavePreferences(), this.deafults?.SavePreferences));
|
|
4301
|
+
this.PagingStyle.set(this.utilities_H.InputOrDefault(this._PagingStyle(), this.deafults?.PagingStyle, 'bottom'));
|
|
4302
|
+
this.RowGroupingPagingStyle.set(this.utilities_H.InputOrDefault(this._RowGroupingPagingStyle(), this.deafults?.RowGroupingPagingStyle, 'left'));
|
|
4303
|
+
this.UseSelectionCache.set(this.utilities_H.InputOrDefault(this._UseSelectionCache(), this.deafults?.UseSelectionCache, true));
|
|
4304
|
+
this.ShowItemGroupsColumns.set(this.utilities_H.InputOrDefault(this._ShowItemGroupsColumns(), this.deafults?.ShowItemGroupsColumns, false));
|
|
4305
|
+
this.ArraymodeItemsPerPage.set(this.utilities_H.InputOrDefault(this._ArraymodeItemsPerPage(), this.deafults?.ArraymodeItemsPerPage, 15));
|
|
4306
|
+
this.ColumnsPinnable.set(this.utilities_H.InputOrDefault(this._ColumnsPinnable(), this.deafults?.ColumnsPinnable, true));
|
|
4307
|
+
this.DefaultAlignment.set(this.utilities_H.InputOrDefault(this._DefaultAlignment(), this.deafults?.DefaultAlignment, 'Left'));
|
|
4308
|
+
this.HiddenColumns.set(this.utilities_H.InputOrDefault(this._HiddenColumns(), null));
|
|
4309
|
+
this.ColumnsOrdering.set(this.utilities_H.InputOrDefault(this._ColumnsOrdering(), null));
|
|
4310
|
+
this.OrderByColumn.set(this.utilities_H.InputOrDefault(this._OrderByColumn(), null));
|
|
4311
|
+
this.SelectAll.set(this.utilities_H.InputOrDefault(this._SelectAll(), null));
|
|
4312
|
+
this.ShiftClick.set(this.utilities_H.InputOrDefault(this._ShiftClick(), null));
|
|
4313
|
+
this.UseArrayModePaging.set(this.utilities_H.InputOrDefault(this._UseArrayModePaging(), true));
|
|
4314
|
+
this.OwnKey.set(this.utilities_H.InputOrDefault(this._OwnKey(), ''));
|
|
4315
|
+
this.DynamicRowColumnsDefinition.set(this.utilities_H.InputOrDefault(this._DynamicRowColumnsDefinition(), null));
|
|
4283
4316
|
}
|
|
4284
4317
|
/** @ignore */
|
|
4285
4318
|
async ngAfterViewInit() {
|
|
@@ -4296,23 +4329,23 @@ class EsTableComponent {
|
|
|
4296
4329
|
let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;
|
|
4297
4330
|
let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;
|
|
4298
4331
|
if (usesThsAndTdsDirectives || hasNoContentProjection) {
|
|
4299
|
-
if (this.UseCustomCells == null)
|
|
4300
|
-
this.UseCustomCells
|
|
4301
|
-
if (this.HiddenColumns == null && this.UseCustomCells)
|
|
4302
|
-
this.HiddenColumns
|
|
4303
|
-
if (this.ColumnsOrdering == null && this.UseCustomCells)
|
|
4304
|
-
this.ColumnsOrdering
|
|
4305
|
-
if (this.OrderByColumn == null && this.UseCustomCells)
|
|
4306
|
-
this.OrderByColumn
|
|
4307
|
-
if (this.SelectAll == null && this.Selection)
|
|
4308
|
-
this.SelectAll
|
|
4309
|
-
if (this.ShiftClick == null && this.Selection)
|
|
4310
|
-
this.ShiftClick
|
|
4311
|
-
this.DirectivesBased
|
|
4332
|
+
if (this.UseCustomCells() == null)
|
|
4333
|
+
this.UseCustomCells.set(true);
|
|
4334
|
+
if (this.HiddenColumns() == null && this.UseCustomCells)
|
|
4335
|
+
this.HiddenColumns.set(true);
|
|
4336
|
+
if (this.ColumnsOrdering() == null && this.UseCustomCells)
|
|
4337
|
+
this.ColumnsOrdering.set(true);
|
|
4338
|
+
if (this.OrderByColumn() == null && this.UseCustomCells)
|
|
4339
|
+
this.OrderByColumn.set(true);
|
|
4340
|
+
if (this.SelectAll() == null && this.Selection)
|
|
4341
|
+
this.SelectAll.set(true);
|
|
4342
|
+
if (this.ShiftClick() == null && this.Selection)
|
|
4343
|
+
this.ShiftClick.set(true);
|
|
4344
|
+
this.DirectivesBased.set(true);
|
|
4312
4345
|
}
|
|
4313
4346
|
//Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,
|
|
4314
4347
|
//che con solo la proiezione (senza celle cusotm) non è disponibile
|
|
4315
|
-
if (this.Hierarchy && !this.UseCustomCells)
|
|
4348
|
+
if (this.Hierarchy() && !this.UseCustomCells())
|
|
4316
4349
|
throw "Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\"true\" è richiesto anche [UseCustomCells]=\"true\"";
|
|
4317
4350
|
}
|
|
4318
4351
|
/** @ignore */
|
|
@@ -4325,12 +4358,8 @@ class EsTableComponent {
|
|
|
4325
4358
|
this.ctxMenuSubscription.unsubscribe();
|
|
4326
4359
|
if (this.copyPasteDetector.ActiveEstReference == this)
|
|
4327
4360
|
this.copyPasteDetector.ActiveEstReference = null;
|
|
4328
|
-
|
|
4329
|
-
|
|
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);
|
|
4361
|
+
this._destroyed$.next();
|
|
4362
|
+
this._destroyed$.complete();
|
|
4334
4363
|
}
|
|
4335
4364
|
/** @ignore */
|
|
4336
4365
|
registerOnChange(fn) { this.propagateChange = fn; }
|
|
@@ -4342,22 +4371,22 @@ class EsTableComponent {
|
|
|
4342
4371
|
if (!this.ItemSourceProperty)
|
|
4343
4372
|
this.View.items = [];
|
|
4344
4373
|
else
|
|
4345
|
-
this.View[this.ItemSourceProperty] = [];
|
|
4374
|
+
this.View[this.ItemSourceProperty()] = [];
|
|
4346
4375
|
}
|
|
4347
4376
|
this.propagateChange(this.View);
|
|
4348
4377
|
}
|
|
4349
4378
|
/** @ignore */
|
|
4350
4379
|
async writeValue(obj, throttle = true) {
|
|
4351
4380
|
this.View = obj ? obj : null;
|
|
4352
|
-
if (this.EsTableHandledSearch && throttle) {
|
|
4381
|
+
if (this.EsTableHandledSearch() && throttle) {
|
|
4353
4382
|
if (this.callTimeout)
|
|
4354
4383
|
clearTimeout(this.callTimeout);
|
|
4355
|
-
this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle);
|
|
4384
|
+
this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle());
|
|
4356
4385
|
return;
|
|
4357
4386
|
}
|
|
4358
4387
|
// Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress
|
|
4359
4388
|
this.researchInProgress = false;
|
|
4360
|
-
if (!this.View && !this.SearchView) {
|
|
4389
|
+
if (!this.View && !this.SearchView()) {
|
|
4361
4390
|
// Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla
|
|
4362
4391
|
this.boundSource = this.TMPBoundSource || [];
|
|
4363
4392
|
// Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
|
|
@@ -4368,23 +4397,23 @@ class EsTableComponent {
|
|
|
4368
4397
|
// lo correggo--------------------------------------------------------------------------------------------------------------
|
|
4369
4398
|
if (this.View && typeof this.View.itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))
|
|
4370
4399
|
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();
|
|
4400
|
+
else if (this.SearchView() && typeof this.SearchView().itemsperpageoverride != 'undefined' && !(this.SearchView() instanceof AppSearch))
|
|
4401
|
+
this.SearchView().__proto__ = new AppSearch();
|
|
4373
4402
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
4374
4403
|
if (this.View && this.View instanceof AppSearch) {
|
|
4375
4404
|
// Se cambia l'oggetto intero significa che ho rimandato la ricerca
|
|
4376
4405
|
this.setMode('view');
|
|
4377
4406
|
let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;
|
|
4378
4407
|
// 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] = [];
|
|
4408
|
+
if (this.ItemSourceProperty() && !this.View[this.ItemSourceProperty()])
|
|
4409
|
+
this.View[this.ItemSourceProperty()] = [];
|
|
4381
4410
|
// Se vengo da una ricerca interna mantengo lo stato di selezione precedente (quindi su cambio pagina, cambio ipp, ecc...)
|
|
4382
4411
|
// 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)
|
|
4412
|
+
if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache())
|
|
4384
4413
|
this.resetSelection(true);
|
|
4385
4414
|
this.View.internalsearchrequest = false;
|
|
4386
4415
|
// Recupero Preference
|
|
4387
|
-
if (this.SavePreferences) {
|
|
4416
|
+
if (this.SavePreferences()) {
|
|
4388
4417
|
if (!this.ngControl.name)
|
|
4389
4418
|
console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
|
|
4390
4419
|
else if (!this.prefService)
|
|
@@ -4437,14 +4466,14 @@ class EsTableComponent {
|
|
|
4437
4466
|
}
|
|
4438
4467
|
// 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
4468
|
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);
|
|
4469
|
+
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);
|
|
4441
4470
|
}
|
|
4442
4471
|
else if (this.View && (this.View.length != null && this.View.length != undefined)) {
|
|
4443
4472
|
this.setMode('array');
|
|
4444
|
-
if (!this.UseSelectionCache || !this.arraymodeSelection)
|
|
4473
|
+
if (!this.UseSelectionCache() || !this.arraymodeSelection)
|
|
4445
4474
|
this.resetSelection(true);
|
|
4446
4475
|
// Recupero Preference
|
|
4447
|
-
if (this.SavePreferences) {
|
|
4476
|
+
if (this.SavePreferences()) {
|
|
4448
4477
|
if (!this.ngControl.name)
|
|
4449
4478
|
console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
|
|
4450
4479
|
else if (!this.prefService)
|
|
@@ -4484,17 +4513,15 @@ class EsTableComponent {
|
|
|
4484
4513
|
}
|
|
4485
4514
|
}
|
|
4486
4515
|
}
|
|
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
4516
|
}
|
|
4490
4517
|
this.finalizeContext();
|
|
4491
4518
|
this.postBoundSourceCalculation();
|
|
4492
|
-
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch && !this.View.firstsearch) {
|
|
4519
|
+
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch() && !this.View.firstsearch) {
|
|
4493
4520
|
this.View.selfsearch = true;
|
|
4494
4521
|
this.changed(true);
|
|
4495
4522
|
this.onSearchRequest.emit(false);
|
|
4496
4523
|
}
|
|
4497
|
-
else if (this.View && this.View.selfsearch && this.EsTableHandledSearch) {
|
|
4524
|
+
else if (this.View && this.View.selfsearch && this.EsTableHandledSearch()) {
|
|
4498
4525
|
this.View.selfsearch = false;
|
|
4499
4526
|
this.changed();
|
|
4500
4527
|
}
|
|
@@ -4508,47 +4535,47 @@ class EsTableComponent {
|
|
|
4508
4535
|
let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode && this.EsThsDirective.some(t => t.thGroup));
|
|
4509
4536
|
// Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
|
|
4510
4537
|
if (this.arrayMode && hasRowGroups)
|
|
4511
|
-
this.UseArrayModePaging
|
|
4538
|
+
this.UseArrayModePaging.set(false);
|
|
4512
4539
|
// Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia
|
|
4513
4540
|
this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);
|
|
4514
4541
|
// Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource
|
|
4515
|
-
if (this.Hierarchy && !hasRowGroups)
|
|
4542
|
+
if (this.Hierarchy() && !hasRowGroups)
|
|
4516
4543
|
this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);
|
|
4517
4544
|
// L'hashing degli oggetti lo faccio a prescindere
|
|
4518
4545
|
this.utilities_H.calculateHash(this.TMPBoundSource);
|
|
4519
4546
|
// Assegno a una variabile mia l'eventuale override per la classe della riga
|
|
4520
4547
|
// 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) {
|
|
4548
|
+
if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy()) {
|
|
4522
4549
|
for (let i = 0; i < this.TMPBoundSource.length; i++) {
|
|
4523
4550
|
let item = this.TMPBoundSource[i];
|
|
4524
|
-
item._rowClass = this.RowClassAssigner
|
|
4525
|
-
item._rowClass += this.Hierarchy ? " est-row-lvl-" + item._level : "";
|
|
4551
|
+
item._rowClass = this.RowClassAssigner?.(item) || "";
|
|
4552
|
+
item._rowClass += this.Hierarchy() ? " est-row-lvl-" + item._level : "";
|
|
4526
4553
|
}
|
|
4527
4554
|
}
|
|
4528
4555
|
}
|
|
4529
4556
|
/** Genera le informzioni di paginazione per la vista globale dell'es-table */
|
|
4530
4557
|
setupPagingInformations() {
|
|
4531
4558
|
// 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;
|
|
4559
|
+
this.PagerOptions.ShowCount = !this.HidePagingCount();
|
|
4560
|
+
this.PagerOptions.ShowButtons = !this.HidePagingButtons();
|
|
4561
|
+
this.PagerOptions.ShowPaging = !this.HidePaging();
|
|
4535
4562
|
this.PagerOptions.UsesView = true;
|
|
4536
|
-
if (this.arrayMode && this.UseArrayModePaging && !this.SearchView) {
|
|
4563
|
+
if (this.arrayMode && this.UseArrayModePaging() && !this.SearchView()) {
|
|
4537
4564
|
this.PagerOptions.PagerCount = this.View.length || 0;
|
|
4538
4565
|
this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && this.View.length > 10;
|
|
4539
4566
|
this.PagerOptions.View = this.View;
|
|
4540
4567
|
this.PagerOptions.UsesView = false;
|
|
4541
4568
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
4542
4569
|
}
|
|
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;
|
|
4570
|
+
else if (this.arrayMode && (!this.UseArrayModePaging() || this.SearchView())) {
|
|
4571
|
+
if (this.SearchView()) {
|
|
4572
|
+
this.PagerOptions.View = this.SearchView();
|
|
4573
|
+
this.PagerOptions.PagerCount = this.SearchView().objectcount || 0;
|
|
4547
4574
|
}
|
|
4548
4575
|
else
|
|
4549
4576
|
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);
|
|
4577
|
+
this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (this.SearchView()?.objectcount || 0) > 10);
|
|
4578
|
+
this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView() && this.SearchView().objectcount && this.SearchView().objectcount != -1);
|
|
4552
4579
|
this.PagerOptions.ShowPaging = this.PagerOptions.ShowPaging && (this.PagerOptions.ShowButtons || this.PagerOptions.ShowCount);
|
|
4553
4580
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
4554
4581
|
}
|
|
@@ -4587,14 +4614,14 @@ class EsTableComponent {
|
|
|
4587
4614
|
// Questo dev'essere per forza lanciato dopo **bindDisplayToLoadedItemsOrGroups** dato che è lì che alcune cose vengono valorizzate
|
|
4588
4615
|
this.setupPagingInformations();
|
|
4589
4616
|
// Molte cose sono ovviamente disponibili solo in modalità View
|
|
4590
|
-
if ((this.viewMode || this.arrayMode) && this.UseCustomCells) {
|
|
4617
|
+
if ((this.viewMode || this.arrayMode) && this.UseCustomCells()) {
|
|
4591
4618
|
let view = this.viewMode ? View : null;
|
|
4592
|
-
let itemsAndGroups = this.viewMode ? [...((this.ItemSourceProperty ? view[this.ItemSourceProperty] : view.items) || []), ...(view.groups || [])] : View;
|
|
4619
|
+
let itemsAndGroups = this.viewMode ? [...((this.ItemSourceProperty() ? view[this.ItemSourceProperty()] : view.items) || []), ...(view.groups || [])] : View;
|
|
4593
4620
|
let si = this.viewMode ? view.selection : this.arraymodeSelection;
|
|
4594
4621
|
// N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE
|
|
4595
4622
|
// ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************
|
|
4596
4623
|
// 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) {
|
|
4624
|
+
if ((this.DynamicRowColumnsDefinition()?.length || 0) > 0) {
|
|
4598
4625
|
this.logger.log("Generating ths and tds from Dynamic definition");
|
|
4599
4626
|
let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();
|
|
4600
4627
|
this.EsThs = ret.ths;
|
|
@@ -4620,7 +4647,7 @@ class EsTableComponent {
|
|
|
4620
4647
|
// Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
|
|
4621
4648
|
let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);
|
|
4622
4649
|
// Valuta lo stato iniziale di selezione a range
|
|
4623
|
-
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition);
|
|
4650
|
+
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition());
|
|
4624
4651
|
if (this.arrayMode) // In modalità array non ho un backend...
|
|
4625
4652
|
this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client
|
|
4626
4653
|
this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc
|
|
@@ -4644,15 +4671,15 @@ class EsTableComponent {
|
|
|
4644
4671
|
this.ResearchNeeded = false;
|
|
4645
4672
|
}
|
|
4646
4673
|
}
|
|
4647
|
-
else if ((this.viewMode || this.arrayMode) && !this.UseCustomCells) {
|
|
4674
|
+
else if ((this.viewMode || this.arrayMode) && !this.UseCustomCells()) {
|
|
4648
4675
|
// Riallineo le info di selezione degli elementi della View
|
|
4649
|
-
let items = this.viewMode ? (this.ItemSourceProperty ? View[this.ItemSourceProperty] : View.items) : View;
|
|
4676
|
+
let items = this.viewMode ? (this.ItemSourceProperty() ? View[this.ItemSourceProperty()] : View.items) : View;
|
|
4650
4677
|
let si = this.viewMode ? View.selection : this.arraymodeSelection;
|
|
4651
4678
|
this.selection_H.evaluateSelection(items, si);
|
|
4652
4679
|
}
|
|
4653
4680
|
// Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
|
|
4654
4681
|
this.cdr.markForCheck();
|
|
4655
|
-
this.FirstBind
|
|
4682
|
+
this.FirstBind.set(false);
|
|
4656
4683
|
}
|
|
4657
4684
|
/**
|
|
4658
4685
|
* Effettua il binding degli oggetti pervenuti da questa chiamata con gli oggetti effettivamente da graficare
|
|
@@ -4665,7 +4692,7 @@ class EsTableComponent {
|
|
|
4665
4692
|
this.boundSource = [];
|
|
4666
4693
|
return;
|
|
4667
4694
|
}
|
|
4668
|
-
if (this.arrayMode || !this.UseCustomCells) {
|
|
4695
|
+
if (this.arrayMode || !this.UseCustomCells()) {
|
|
4669
4696
|
this.boundSource = this.TMPBoundSource;
|
|
4670
4697
|
this.BaseItemsCount = view?.objectcount || view?.length || 0;
|
|
4671
4698
|
return;
|
|
@@ -4684,9 +4711,11 @@ class EsTableComponent {
|
|
|
4684
4711
|
this.RowTHs = this.TMPRowTHs;
|
|
4685
4712
|
this.RowThGroups = this.TMPRowThGroups ? this.TMPRowThGroups.reverse() : null;
|
|
4686
4713
|
this.EmptyRowTds = this.isEmpty(this.RowTDs);
|
|
4687
|
-
|
|
4688
|
-
|
|
4689
|
-
|
|
4714
|
+
let vis = this.RowTHs.filter(t => t.Visible).length;
|
|
4715
|
+
let visUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;
|
|
4716
|
+
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);
|
|
4717
|
+
let newValue = { Visibile: vis, VisibleUnpinned: visUnpinned, Global: global };
|
|
4718
|
+
this.Columns.set(newValue);
|
|
4690
4719
|
}
|
|
4691
4720
|
/**
|
|
4692
4721
|
* Metodo per capire se un oggetto è completamente vuoto
|
|
@@ -4709,7 +4738,7 @@ class EsTableComponent {
|
|
|
4709
4738
|
*/
|
|
4710
4739
|
setSelectionStatus(items, all, select, emit = false) {
|
|
4711
4740
|
if (all) {
|
|
4712
|
-
if (!this.SelectAll) {
|
|
4741
|
+
if (!this.SelectAll()) {
|
|
4713
4742
|
console.error("Impossibile impostare la selezione con l'all selection quando l'Input SelectAll è false");
|
|
4714
4743
|
return;
|
|
4715
4744
|
}
|
|
@@ -4751,7 +4780,7 @@ class EsTableComponent {
|
|
|
4751
4780
|
console.warn('Order changed on a table not in viewMode or Array mode. Operation not supported');
|
|
4752
4781
|
return;
|
|
4753
4782
|
}
|
|
4754
|
-
if (!this.OrderByColumn)
|
|
4783
|
+
if (!this.OrderByColumn())
|
|
4755
4784
|
return;
|
|
4756
4785
|
this.columnMetadata_H.handleTHOrderChange(id, order);
|
|
4757
4786
|
}
|
|
@@ -4772,7 +4801,7 @@ class EsTableComponent {
|
|
|
4772
4801
|
viewOverride.internalsearchrequest = true;
|
|
4773
4802
|
}
|
|
4774
4803
|
this.researchInProgress = true;
|
|
4775
|
-
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch) {
|
|
4804
|
+
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch()) {
|
|
4776
4805
|
this.View.selfsearch = true;
|
|
4777
4806
|
this.changed(true);
|
|
4778
4807
|
this.onSearchRequest.emit(false);
|
|
@@ -4835,7 +4864,7 @@ class EsTableComponent {
|
|
|
4835
4864
|
Multi: td._multi,
|
|
4836
4865
|
MultiProp: td._multi ? td.td.split('_')[0] : null,
|
|
4837
4866
|
MultiIndex: td._multi ? td.td.split('_')[1] : null,
|
|
4838
|
-
Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment).toLowerCase(),
|
|
4867
|
+
Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment()).toLowerCase(),
|
|
4839
4868
|
Format: td.tdFormat || th.thFormat,
|
|
4840
4869
|
PropertyName: th.thProperty,
|
|
4841
4870
|
PropertyType: th.thType,
|
|
@@ -4843,7 +4872,7 @@ class EsTableComponent {
|
|
|
4843
4872
|
EditorOptions: th.thEditorOptions,
|
|
4844
4873
|
PropAccessor: td.tdPropertyAccessor,
|
|
4845
4874
|
RoutePath: thCasted.thRoutePath,
|
|
4846
|
-
RouteParameterProperties: thCasted.thRouteParameterProperties
|
|
4875
|
+
RouteParameterProperties: thCasted.thRouteParameterProperties
|
|
4847
4876
|
} :
|
|
4848
4877
|
{
|
|
4849
4878
|
LeftBorder: thCasted._lbord,
|
|
@@ -4859,11 +4888,11 @@ class EsTableComponent {
|
|
|
4859
4888
|
Content: this.rowGrouping_H.getGroupCellDisplay(item, key, th)
|
|
4860
4889
|
};
|
|
4861
4890
|
if (this.TMPRowTDs[ctx]) {
|
|
4862
|
-
this.TMPRowTDs[ctx].push(itemToAdd);
|
|
4891
|
+
this.TMPRowTDs[ctx].push(signal(itemToAdd));
|
|
4863
4892
|
}
|
|
4864
4893
|
else {
|
|
4865
4894
|
this.RowContexts.push(ctx);
|
|
4866
|
-
this.TMPRowTDs[ctx] = [itemToAdd];
|
|
4895
|
+
this.TMPRowTDs[ctx] = [signal(itemToAdd)];
|
|
4867
4896
|
contextFixeds[ctx] = isFixed ? 1 : 0;
|
|
4868
4897
|
}
|
|
4869
4898
|
}
|
|
@@ -4918,7 +4947,7 @@ class EsTableComponent {
|
|
|
4918
4947
|
Order: th.thOrder,
|
|
4919
4948
|
Orderable: th.thOrderable,
|
|
4920
4949
|
Template: th.Template,
|
|
4921
|
-
Alignment: (th.thAlignment || this.DefaultAlignment).toLowerCase(),
|
|
4950
|
+
Alignment: (th.thAlignment || this.DefaultAlignment()).toLowerCase(),
|
|
4922
4951
|
// Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header
|
|
4923
4952
|
Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,
|
|
4924
4953
|
Wrap: th.thWrap,
|
|
@@ -5043,7 +5072,7 @@ class EsTableComponent {
|
|
|
5043
5072
|
handleClick(event, item) {
|
|
5044
5073
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5045
5074
|
let selecteditems = [];
|
|
5046
|
-
if (event.shiftKey && this.ShiftClick && !this.SingleSelection) {
|
|
5075
|
+
if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {
|
|
5047
5076
|
this.utiExts.clearTextSelection();
|
|
5048
5077
|
let startSelecting = false;
|
|
5049
5078
|
let items = this.boundSource.filter(t => !t._group && !t._sep);
|
|
@@ -5079,7 +5108,7 @@ class EsTableComponent {
|
|
|
5079
5108
|
*/
|
|
5080
5109
|
addToPage(page) {
|
|
5081
5110
|
let view = this.MainGroupView ? this.MainGroupView : this.View;
|
|
5082
|
-
this.goToPage(((this.SearchView || view)?.page || 0) + page);
|
|
5111
|
+
this.goToPage(((this.SearchView() || view)?.page || 0) + page);
|
|
5083
5112
|
}
|
|
5084
5113
|
/**
|
|
5085
5114
|
* Sposta la ricerca alla pagina specificata
|
|
@@ -5087,10 +5116,10 @@ class EsTableComponent {
|
|
|
5087
5116
|
* @param {number} page Pagina a cui navigare
|
|
5088
5117
|
*/
|
|
5089
5118
|
goToPage(page) {
|
|
5090
|
-
let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode ? this.SearchView : this.View);
|
|
5119
|
+
let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode ? this.SearchView() : this.View);
|
|
5091
5120
|
if (!view.page || !view.pages)
|
|
5092
5121
|
return;
|
|
5093
|
-
let appSearchElement = this.SearchView || view;
|
|
5122
|
+
let appSearchElement = this.SearchView() || view;
|
|
5094
5123
|
if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))
|
|
5095
5124
|
return;
|
|
5096
5125
|
appSearchElement.page = page;
|
|
@@ -5098,7 +5127,7 @@ class EsTableComponent {
|
|
|
5098
5127
|
let ipp = view.itemsperpageoverride || 15;
|
|
5099
5128
|
this.arrayPulsanti = this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp);
|
|
5100
5129
|
let hasGroupings = !!this.MainGroupView;
|
|
5101
|
-
this.emitSearchRequest(false, hasGroupings ? view : this.SearchView
|
|
5130
|
+
this.emitSearchRequest(false, hasGroupings ? view : (this.SearchView() || null));
|
|
5102
5131
|
}
|
|
5103
5132
|
/**
|
|
5104
5133
|
* Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest**
|
|
@@ -5109,10 +5138,10 @@ class EsTableComponent {
|
|
|
5109
5138
|
this.changed();
|
|
5110
5139
|
if (this.MainGroupView)
|
|
5111
5140
|
this.emitSearchRequest(true, this.MainGroupView);
|
|
5112
|
-
else if (this.SearchView) {
|
|
5141
|
+
else if (this.SearchView()) {
|
|
5113
5142
|
// Questo secondo me si può portare a livello un po' più alto
|
|
5114
|
-
this.SearchView.page = 1;
|
|
5115
|
-
this.emitSearchRequest(true, this.SearchView);
|
|
5143
|
+
this.SearchView().page = 1;
|
|
5144
|
+
this.emitSearchRequest(true, this.SearchView());
|
|
5116
5145
|
}
|
|
5117
5146
|
else
|
|
5118
5147
|
this.emitSearchRequest(true);
|
|
@@ -5224,14 +5253,14 @@ class EsTableComponent {
|
|
|
5224
5253
|
let arrayIpp;
|
|
5225
5254
|
if (this.arrayMode) {
|
|
5226
5255
|
arrayPage = this.arraymodePage;
|
|
5227
|
-
arrayIpp = this.ArraymodeItemsPerPage;
|
|
5256
|
+
arrayIpp = this.ArraymodeItemsPerPage();
|
|
5228
5257
|
}
|
|
5229
5258
|
if (!relaunchSearch && this.viewMode)
|
|
5230
5259
|
this.View.selfsearch = true;
|
|
5231
5260
|
this.writeValue(this.View);
|
|
5232
5261
|
this.cdr.detectChanges();
|
|
5233
5262
|
if (this.arrayMode) {
|
|
5234
|
-
this.ArraymodeItemsPerPage
|
|
5263
|
+
this.ArraymodeItemsPerPage.set(arrayIpp);
|
|
5235
5264
|
this.arrayGoToPage(arrayPage);
|
|
5236
5265
|
}
|
|
5237
5266
|
}
|
|
@@ -5266,52 +5295,52 @@ class EsTableComponent {
|
|
|
5266
5295
|
*/
|
|
5267
5296
|
dbClickEditOrSingleClickRowSelection($event, rowItem, item) {
|
|
5268
5297
|
// 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) {
|
|
5298
|
+
if (this.rangeSelected && !$event.ctrlKey && this.Selection()) {
|
|
5270
5299
|
this.logger.log("clearing previously selected range");
|
|
5271
5300
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5272
5301
|
this.rangeSelected = false;
|
|
5273
5302
|
return;
|
|
5274
5303
|
}
|
|
5275
5304
|
// Modalità Editable, gestisco i doppi click senza però rallentare la modalità di selezione a range
|
|
5276
|
-
if (this.Editable) {
|
|
5305
|
+
if (this.Editable()) {
|
|
5277
5306
|
// Secondo click: se il timer non è scaduto è un doppio click ed eseguo il resto
|
|
5278
5307
|
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)
|
|
5308
|
+
this.logger.log("handling doubleclick on editable cell: " + (rowItem().PropertyName ? 'edit mode for property ' + rowItem().PropertyName : 'no property set, fallback to simple click'));
|
|
5309
|
+
if (rowItem().PropertyName)
|
|
5281
5310
|
this.setupUserEdit(rowItem, item);
|
|
5282
5311
|
else
|
|
5283
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5312
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5284
5313
|
this.clearCellClickTimer();
|
|
5285
5314
|
return;
|
|
5286
5315
|
}
|
|
5287
5316
|
// Primo click: non fa niente e se il tempo per il secondo click scade resetta tutto
|
|
5288
5317
|
this.cellDbClickTimer = setTimeout(() => {
|
|
5289
5318
|
this.clearCellClickTimer();
|
|
5290
|
-
if (!this.RangeSelection || !this.mouseIsDown) {
|
|
5319
|
+
if (!this.RangeSelection() || !this.mouseIsDown) {
|
|
5291
5320
|
this.logger.log("time's up for second click, handling single click");
|
|
5292
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5321
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5293
5322
|
}
|
|
5294
5323
|
}, this.doubleClickBufferMs);
|
|
5295
5324
|
}
|
|
5296
5325
|
// In modalità a range la creazione del range è gestita dai mousedown, move ed up...
|
|
5297
5326
|
// La selezione delle righe invece è gestita dalle caselline a sinistra
|
|
5298
|
-
if (this.RangeSelection)
|
|
5327
|
+
if (this.RangeSelection())
|
|
5299
5328
|
return;
|
|
5300
5329
|
// Se ho fatto click col control attaccato esco subito dato che deve solo permettere la navigazione dei link
|
|
5301
5330
|
if ($event.ctrlKey)
|
|
5302
5331
|
return;
|
|
5303
5332
|
// Tutti i click su una cella già in edit non devono effettuare la selezione della riga
|
|
5304
|
-
if (rowItem._editing)
|
|
5333
|
+
if (rowItem()._editing)
|
|
5305
5334
|
return;
|
|
5306
5335
|
// Per evitare di rallentare a prescindere
|
|
5307
|
-
if (!this.Editable) {
|
|
5308
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5336
|
+
if (!this.Editable()) {
|
|
5337
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5309
5338
|
return;
|
|
5310
5339
|
}
|
|
5311
5340
|
}
|
|
5312
5341
|
/** Evento che gestisce il comando "Copia" buttando i valori selezionati nella clipboard in base al loro tipo */
|
|
5313
5342
|
handleCopy() {
|
|
5314
|
-
if (!this.RangeSelection)
|
|
5343
|
+
if (!this.RangeSelection())
|
|
5315
5344
|
return;
|
|
5316
5345
|
let sel = this.selection_H.getSelectionStatusSelection();
|
|
5317
5346
|
if (sel.length > 0 && sel[0].length > 0) {
|
|
@@ -5322,7 +5351,7 @@ class EsTableComponent {
|
|
|
5322
5351
|
}
|
|
5323
5352
|
/** 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
5353
|
handlePaste() {
|
|
5325
|
-
if (!this.RangeSelection)
|
|
5354
|
+
if (!this.RangeSelection())
|
|
5326
5355
|
return;
|
|
5327
5356
|
let sel = this.selection_H.getSelectionStatusSelection();
|
|
5328
5357
|
if (sel.length > 0 && sel[0].length > 0) {
|
|
@@ -5332,7 +5361,7 @@ class EsTableComponent {
|
|
|
5332
5361
|
values.splice(values.length - 1, 1);
|
|
5333
5362
|
if (values.length > 0 && values[0].length > 0) {
|
|
5334
5363
|
// Check se la modifica è abilitata
|
|
5335
|
-
if (!this.Editable) {
|
|
5364
|
+
if (!this.Editable()) {
|
|
5336
5365
|
this.msgExts.simpleWarning(this.lc.loc("Data for this table cannot be edited"));
|
|
5337
5366
|
return;
|
|
5338
5367
|
}
|
|
@@ -5381,7 +5410,7 @@ class EsTableComponent {
|
|
|
5381
5410
|
handleRowClick($event, item, selection, internalCall = false) {
|
|
5382
5411
|
// Se ho un ctrl premuto esco con true in modo da fare bubbling dell'evento e lasciarlo gestire al browser (link ecc...)
|
|
5383
5412
|
// Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD
|
|
5384
|
-
if ($event.ctrlKey || (this.UseCustomCells && !internalCall))
|
|
5413
|
+
if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))
|
|
5385
5414
|
return true;
|
|
5386
5415
|
if (selection)
|
|
5387
5416
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
@@ -5396,7 +5425,7 @@ class EsTableComponent {
|
|
|
5396
5425
|
* Gestione del click destro sull'es-table
|
|
5397
5426
|
*/
|
|
5398
5427
|
onRightClick() {
|
|
5399
|
-
if (this.Selection)
|
|
5428
|
+
if (this.Selection())
|
|
5400
5429
|
this.onOpenContextMenu.emit();
|
|
5401
5430
|
}
|
|
5402
5431
|
/**
|
|
@@ -5409,13 +5438,13 @@ class EsTableComponent {
|
|
|
5409
5438
|
*/
|
|
5410
5439
|
setupUserEdit(rowItem, item) {
|
|
5411
5440
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5412
|
-
if (this.Editable && rowItem.PropertyName) {
|
|
5413
|
-
let dynMode = this.DynamicRowColumnsDefinition?.length > 0;
|
|
5414
|
-
rowItem.
|
|
5415
|
-
rowItem.
|
|
5441
|
+
if (this.Editable() && rowItem().PropertyName) {
|
|
5442
|
+
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
5443
|
+
let newValues = { _editing: true, old_value: dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName] };
|
|
5444
|
+
rowItem.set(Object.assign(rowItem(), newValues));
|
|
5416
5445
|
}
|
|
5417
5446
|
this.cdr.detectChanges();
|
|
5418
|
-
|
|
5447
|
+
requestAnimationFrame(() => { this.FocusSubject.next(); });
|
|
5419
5448
|
}
|
|
5420
5449
|
/**
|
|
5421
5450
|
* 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 +5454,21 @@ class EsTableComponent {
|
|
|
5425
5454
|
* @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
|
|
5426
5455
|
*/
|
|
5427
5456
|
finalizeUserEdit(rowItem, item, columnIndex) {
|
|
5428
|
-
let dynMode = this.DynamicRowColumnsDefinition?.length > 0;
|
|
5429
|
-
let
|
|
5430
|
-
|
|
5431
|
-
let old =
|
|
5432
|
-
let niu = dynMode ? item.properties[rowItem.PropertyName] : item[rowItem.PropertyName];
|
|
5457
|
+
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
5458
|
+
let newValues = { _editing: false };
|
|
5459
|
+
rowItem.set(Object.assign(rowItem(), newValues));
|
|
5460
|
+
let old = rowItem().old_value;
|
|
5461
|
+
let niu = dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName];
|
|
5433
5462
|
let olddate = this.dateExts.getDateConvertion(old);
|
|
5434
5463
|
let niudate = this.dateExts.getDateConvertion(niu);
|
|
5435
5464
|
if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
|
|
5436
5465
|
return;
|
|
5437
|
-
this.onModelChange.emit([new EsTableModelChange(item, rowItem.ID, rowItem.PropertyName, old, niu)]);
|
|
5466
|
+
this.onModelChange.emit([new EsTableModelChange(item, rowItem().ID, rowItem().PropertyName, old, niu)]);
|
|
5438
5467
|
this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);
|
|
5439
5468
|
}
|
|
5440
5469
|
mousedown(event, rowItem, _) {
|
|
5441
5470
|
// Tasto diverso dal click sinistro -> ciao è stato bello e intenso
|
|
5442
|
-
if (event.buttons != 1 || !this.RangeSelection)
|
|
5471
|
+
if (event.buttons != 1 || !this.RangeSelection())
|
|
5443
5472
|
return;
|
|
5444
5473
|
// Sto lavorando su QUESTA es-table
|
|
5445
5474
|
this.copyPasteDetector.ActiveEstReference = this;
|
|
@@ -5453,14 +5482,16 @@ class EsTableComponent {
|
|
|
5453
5482
|
this.firstCoordinates = { row, column };
|
|
5454
5483
|
// 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
5484
|
// e gestire la grafica in maniera un po' più precisa
|
|
5456
|
-
if (!this.rangeSelected || (event.ctrlKey || !this.Selection))
|
|
5485
|
+
if (!this.rangeSelected || (event.ctrlKey || !this.Selection())) {
|
|
5457
5486
|
this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
|
|
5487
|
+
this.cdr.markForCheck();
|
|
5488
|
+
}
|
|
5458
5489
|
else
|
|
5459
5490
|
this.rangeStartWasIgnored = true;
|
|
5460
5491
|
this.logger.log(`mouse down on ${row}:${column}`);
|
|
5461
5492
|
}
|
|
5462
5493
|
mouseenter(event) {
|
|
5463
|
-
if (!this.RangeSelection)
|
|
5494
|
+
if (!this.RangeSelection())
|
|
5464
5495
|
return;
|
|
5465
5496
|
if (event.buttons == 0)
|
|
5466
5497
|
this.mouseIsDown = false;
|
|
@@ -5478,9 +5509,10 @@ class EsTableComponent {
|
|
|
5478
5509
|
this.logger.log(`mouse move over ${row}:${column}`);
|
|
5479
5510
|
this.rangeSelected = true;
|
|
5480
5511
|
}
|
|
5512
|
+
this.cdr.markForCheck();
|
|
5481
5513
|
}
|
|
5482
5514
|
mouseup(event) {
|
|
5483
|
-
if (!this.RangeSelection)
|
|
5515
|
+
if (!this.RangeSelection())
|
|
5484
5516
|
return;
|
|
5485
5517
|
let id = event.currentTarget.id;
|
|
5486
5518
|
let coords = id.split('_');
|
|
@@ -5488,10 +5520,11 @@ class EsTableComponent {
|
|
|
5488
5520
|
let column = parseInt(coords[coords.length - 1]);
|
|
5489
5521
|
// 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
5522
|
if (this.mouseIsDown && this.firstCoordinates) {
|
|
5491
|
-
if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection)
|
|
5523
|
+
if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection())
|
|
5492
5524
|
this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
|
|
5493
|
-
else if (event.ctrlKey || !this.Selection)
|
|
5525
|
+
else if (event.ctrlKey || !this.Selection())
|
|
5494
5526
|
this.rangeSelected = true;
|
|
5527
|
+
this.cdr.markForCheck();
|
|
5495
5528
|
}
|
|
5496
5529
|
this.mouseIsDown = false;
|
|
5497
5530
|
this.logger.log(`mouse lifted up`);
|
|
@@ -5504,8 +5537,13 @@ class EsTableComponent {
|
|
|
5504
5537
|
let toRet = this.EsTdsCache[`${prop}_${hash}`];
|
|
5505
5538
|
return toRet;
|
|
5506
5539
|
}
|
|
5507
|
-
registerCell(event) {
|
|
5540
|
+
registerCell(event, rowItem, _, cellRef) {
|
|
5508
5541
|
this.EsTdsCache[`${event.id}_${event.hash}`] = event.self;
|
|
5542
|
+
this._zone.runOutsideAngular(() => {
|
|
5543
|
+
fromEvent(cellRef.nativeElement, 'mousedown').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mousedown(e, rowItem, _); });
|
|
5544
|
+
fromEvent(cellRef.nativeElement, 'mouseenter').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseenter(e); });
|
|
5545
|
+
fromEvent(cellRef.nativeElement, 'mouseup').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseup(e); });
|
|
5546
|
+
});
|
|
5509
5547
|
}
|
|
5510
5548
|
//* Piango ancora
|
|
5511
5549
|
//* Gestione Embedding
|
|
@@ -5538,13 +5576,13 @@ class EsTableComponent {
|
|
|
5538
5576
|
return;
|
|
5539
5577
|
this.emb.MainWindow.postMessage({ type: "modal-close" }, "*");
|
|
5540
5578
|
}
|
|
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}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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> {{'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> \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 \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\">×</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 ( \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\"> - </span>\r\n </ng-container>\r\n )\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 }); }
|
|
5579
|
+
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 }); }
|
|
5580
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTableComponent, isStandalone: false, selector: "es-table", inputs: { 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: { 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}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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> {{'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> \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 \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\">×</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 ( \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\"> - </span>\r\n </ng-container>\r\n )\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
5581
|
}
|
|
5544
5582
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, decorators: [{
|
|
5545
5583
|
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}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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> {{'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> \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 \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\">×</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 ( \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\"> - </span>\r\n </ng-container>\r\n )\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: [{
|
|
5584
|
+
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}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" /> {{'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> {{'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> \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 \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\">×</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 ( \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\"> - </span>\r\n </ng-container>\r\n )\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"] }]
|
|
5585
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgControl, decorators: [{
|
|
5548
5586
|
type: Self
|
|
5549
5587
|
}, {
|
|
5550
5588
|
type: Optional
|
|
@@ -5584,122 +5622,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
5584
5622
|
}], inputField: [{
|
|
5585
5623
|
type: ViewChild,
|
|
5586
5624
|
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
5625
|
}], ContextMenu: [{
|
|
5634
5626
|
type: Input
|
|
5635
|
-
}], ExportFileName: [{
|
|
5636
|
-
type: Input
|
|
5637
|
-
}], TableClass: [{
|
|
5638
|
-
type: Input
|
|
5639
5627
|
}], ExportFunction: [{
|
|
5640
5628
|
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
5629
|
}], RowClassAssigner: [{
|
|
5656
5630
|
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
5631
|
}], onOrderChanged: [{
|
|
5704
5632
|
type: Output
|
|
5705
5633
|
}], onSearchRequest: [{
|
|
@@ -5724,8 +5652,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
5724
5652
|
}], tableEmptyMenu: [{
|
|
5725
5653
|
type: ViewChild,
|
|
5726
5654
|
args: ['emptyMenu', { static: true }]
|
|
5727
|
-
}], ArraymodeItemsPerPage: [{
|
|
5728
|
-
type: Input
|
|
5729
5655
|
}] } });
|
|
5730
5656
|
class EsTdReference {
|
|
5731
5657
|
}
|