@esfaenza/es-table 19.2.18 → 19.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/esfaenza-es-table.mjs +502 -554
- package/fesm2022/esfaenza-es-table.mjs.map +1 -1
- package/lib/components/es-table/es_table.component.d.ts +121 -94
- 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/core/handlers/ColumnMetadataHandler.d.ts +0 -1
- package/lib/core/handlers/SelectionHandler.d.ts +1 -1
- package/lib/domain/internals/TdElement.d.ts +2 -0
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, ViewChild, Pipe, ContentChild, NgModule } from '@angular/core';
|
|
2
|
+
import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, ViewChild, Pipe, model, ContentChild, NgModule } from '@angular/core';
|
|
3
3
|
import * as i2 from '@esfaenza/localizations';
|
|
4
4
|
import { LocalizationService, LocalizationModule } from '@esfaenza/localizations';
|
|
5
5
|
import * as i5 from '@esfaenza/extensions';
|
|
@@ -9,7 +9,7 @@ import * as i1 from '@angular/forms';
|
|
|
9
9
|
import { FormsModule } from '@angular/forms';
|
|
10
10
|
import * as i5$1 from 'primeng/select';
|
|
11
11
|
import { SelectModule } from 'primeng/select';
|
|
12
|
-
import { Subject, forkJoin } from 'rxjs';
|
|
12
|
+
import { Subject, forkJoin, fromEvent, takeUntil } from 'rxjs';
|
|
13
13
|
import * as i13 from '@angular/cdk/drag-drop';
|
|
14
14
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
15
15
|
import * as i2$1 from '@esfaenza/preferences';
|
|
@@ -576,10 +576,10 @@ class ExportHandler {
|
|
|
576
576
|
this.msgExts.simpleWarning(this.est.lc.loc("Cannot export an empty dataset"));
|
|
577
577
|
return;
|
|
578
578
|
}
|
|
579
|
-
let drcd = this.est.DynamicRowColumnsDefinition;
|
|
580
|
-
let columnsFilter = this.est.ExportOnlyVisibleColumns ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;
|
|
579
|
+
let drcd = this.est.DynamicRowColumnsDefinition();
|
|
580
|
+
let columnsFilter = this.est.ExportOnlyVisibleColumns() ? this.est.ColumnsList.filter(t => t.visible).map(t => t.id) : null;
|
|
581
581
|
let csvHeadersOverride = drcd && drcd.length > 0 ? drcd.map(t => { return { label: t.Description, key: t.PropertyName, propKey: t.PropertyName, order: t.ColumnOrder, type: 'string' }; }) : null;
|
|
582
|
-
this.expExts.export(data, format, this.est.ExportFileName, type, columnsFilter, csvHeadersOverride);
|
|
582
|
+
this.expExts.export(data, format, this.est.ExportFileName(), type, columnsFilter, csvHeadersOverride);
|
|
583
583
|
}, format);
|
|
584
584
|
}
|
|
585
585
|
}
|
|
@@ -650,13 +650,13 @@ class ColumnMetadataHandler {
|
|
|
650
650
|
* @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna
|
|
651
651
|
*/
|
|
652
652
|
handleTHOrderChange(id, order) {
|
|
653
|
-
let orders = this.est.viewMode ? this.est.View.orders : this.est.arrayOrders;
|
|
653
|
+
let orders = this.est.viewMode() ? this.est.View.orders : this.est.arrayOrders;
|
|
654
654
|
let orderToAdd = true;
|
|
655
655
|
let orderToRemove = null;
|
|
656
656
|
// Se per qualche motivo il costruttore non è passato (cache tarpate o simila) fixo
|
|
657
|
-
if (!orders && this.est.viewMode)
|
|
657
|
+
if (!orders && this.est.viewMode())
|
|
658
658
|
this.est.View.orders = [];
|
|
659
|
-
else if (!orders && this.est.arrayMode)
|
|
659
|
+
else if (!orders && this.est.arrayMode())
|
|
660
660
|
this.est.arrayOrders = [];
|
|
661
661
|
for (let i = 0; i < orders.length; i++) {
|
|
662
662
|
let t = orders[i];
|
|
@@ -673,23 +673,23 @@ class ColumnMetadataHandler {
|
|
|
673
673
|
orders.splice(orderToRemove, 1);
|
|
674
674
|
}
|
|
675
675
|
else if (orderToAdd) {
|
|
676
|
-
if (this.est.MultipleOrderingDirectives)
|
|
676
|
+
if (this.est.MultipleOrderingDirectives())
|
|
677
677
|
orders.push(new AppOrdering(id, order));
|
|
678
678
|
else {
|
|
679
|
-
if (this.est.viewMode)
|
|
679
|
+
if (this.est.viewMode())
|
|
680
680
|
this.est.View.orders = [new AppOrdering(id, order)];
|
|
681
|
-
else if (this.est.arrayMode)
|
|
681
|
+
else if (this.est.arrayMode())
|
|
682
682
|
this.est.arrayOrders = [new AppOrdering(id, order)];
|
|
683
683
|
}
|
|
684
684
|
}
|
|
685
685
|
//Salvo le preferences di questa view
|
|
686
686
|
//Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
|
|
687
|
-
if (this.est.SavePreferences) {
|
|
688
|
-
let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
|
|
687
|
+
if (this.est.SavePreferences()) {
|
|
688
|
+
let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View) : null;
|
|
689
689
|
this.registerViewPreferences(castedView);
|
|
690
690
|
}
|
|
691
691
|
this.est.onOrderChanged.emit({ id, order });
|
|
692
|
-
if (this.est.viewMode) {
|
|
692
|
+
if (this.est.viewMode()) {
|
|
693
693
|
if (this.est.groupSearchRequestsCache.length > 0)
|
|
694
694
|
this.rgH.emitRowGroupingSearches(id, orders);
|
|
695
695
|
else
|
|
@@ -712,9 +712,10 @@ class ColumnMetadataHandler {
|
|
|
712
712
|
console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
|
|
713
713
|
return false;
|
|
714
714
|
}
|
|
715
|
-
let
|
|
716
|
-
let
|
|
717
|
-
let
|
|
715
|
+
let arrMode = this.est.arrayMode();
|
|
716
|
+
let columns = arrMode ? this.est.arrayColumns : castedView.columns;
|
|
717
|
+
let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
|
|
718
|
+
let columnOrders = arrMode ? [] : castedView.orders;
|
|
718
719
|
var toStore = {
|
|
719
720
|
columns: this.utiExts.deepClone(columns),
|
|
720
721
|
column_ordering: this.utiExts.deepClone(columnsOrderings),
|
|
@@ -742,7 +743,7 @@ class ColumnMetadataHandler {
|
|
|
742
743
|
continue;
|
|
743
744
|
// Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
|
|
744
745
|
// Di default la visibilità è quella impostata nel componente
|
|
745
|
-
if ((this.est.HiddenColumns || th.thVisible) && th.thIf) {
|
|
746
|
+
if ((this.est.HiddenColumns() || th.thVisible) && th.thIf) {
|
|
746
747
|
let previouslyPinned = !this.est.ColumnsList || this.est.ColumnsList.length == 0 ? null : this.est.ColumnsList.find(t => t.id == column) || null;
|
|
747
748
|
let toAdd = new EsTableColumn(column, th.thStaticContent, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnable, th.thPinnedWidth, th.Template, th._thParents, th._multi, th._multi_content);
|
|
748
749
|
if (previouslyPinned)
|
|
@@ -910,39 +911,39 @@ class ColumnMetadataHandler {
|
|
|
910
911
|
let item = tds[i];
|
|
911
912
|
newTds[columnsIndexCache[item.td]] = item;
|
|
912
913
|
}
|
|
913
|
-
this.est.HasPinnedColumns
|
|
914
|
+
this.est.HasPinnedColumns.set(pinneds > 0);
|
|
914
915
|
}
|
|
915
916
|
/** In base alla configurazione delle colonne calcola le dimenioni delle colonne pinnate */
|
|
916
917
|
evaluatePinnedColumnsWidth() {
|
|
917
|
-
if (!this.est.HasPinnedColumns)
|
|
918
|
+
if (!this.est.HasPinnedColumns())
|
|
918
919
|
return;
|
|
919
|
-
|
|
920
|
+
let pcw = 0;
|
|
920
921
|
for (let i = 0; i < this.est.ColumnsList.length; i++) {
|
|
921
922
|
let col = this.est.ColumnsList[i];
|
|
922
923
|
if (col.pinned && col.visible)
|
|
923
|
-
|
|
924
|
+
pcw += col.pinnedWidth;
|
|
924
925
|
}
|
|
925
|
-
|
|
926
|
+
pcw += this.est.Selection() ? 25 : 0;
|
|
927
|
+
this.est.PinnedContainerWidth.set(pcw);
|
|
926
928
|
}
|
|
927
929
|
/**
|
|
928
930
|
* Terminato il binding delle colonne da **reviewColumnsList** e della **View** dal **writeValue** questo metodo si occupa
|
|
929
931
|
* dell'allineamento delle informazioni fra le colonne calcolate internamente e le informazioni sulle colonne che arrivano dall'AppSearch
|
|
930
932
|
*
|
|
931
933
|
* @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
|
|
932
|
-
* @param {boolean} useLocalVisibility Indica di utilizzare le impostazioni di visibilità locali senza allinearle alla view
|
|
933
934
|
*/
|
|
934
935
|
alignColumnsIfLoadedView(view) {
|
|
935
|
-
let emitChanged = this.est.viewMode && view.savedstate;
|
|
936
|
+
let emitChanged = this.est.viewMode() && view.savedstate;
|
|
936
937
|
let newColset = [];
|
|
937
938
|
if (!this.est.ColumnsList || this.est.ColumnsList.length == 0)
|
|
938
939
|
return;
|
|
939
940
|
let columns = [];
|
|
940
941
|
// Modlaità view ->
|
|
941
|
-
if (this.est.viewMode) {
|
|
942
|
+
if (this.est.viewMode()) {
|
|
942
943
|
// colonne dinamiche -> prendo l'insieme delle colonne e operazioni dinamiche definite
|
|
943
944
|
// standard -> prendo le colonne della view
|
|
944
|
-
if (this.est.DynamicRowColumnsDefinition)
|
|
945
|
-
columns = [...(this.est.DynamicRowColumnsDefinition?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations?.map(t => t.id) || [])];
|
|
945
|
+
if (this.est.DynamicRowColumnsDefinition())
|
|
946
|
+
columns = [...(this.est.DynamicRowColumnsDefinition()?.map(t => t.PropertyName) || []), ...(this.est.DynamicOperations()?.map(t => t.id) || [])];
|
|
946
947
|
else
|
|
947
948
|
columns = view.columns;
|
|
948
949
|
}
|
|
@@ -967,12 +968,12 @@ class ColumnMetadataHandler {
|
|
|
967
968
|
});
|
|
968
969
|
// Non ho colonne nella appsearch, vuol dire che sono al primo binding
|
|
969
970
|
if (columns.length == 0) {
|
|
970
|
-
if (this.est.viewMode)
|
|
971
|
+
if (this.est.viewMode())
|
|
971
972
|
view.columns = newColset;
|
|
972
973
|
else
|
|
973
974
|
this.est.arrayColumns = newColset;
|
|
974
975
|
}
|
|
975
|
-
if ((this.est.viewMode && view.savedstate) && this.est.ColumnsOrdering && view.column_ordering.length > 0) {
|
|
976
|
+
if ((this.est.viewMode() && view.savedstate) && this.est.ColumnsOrdering() && view.column_ordering.length > 0) {
|
|
976
977
|
// Scorro gli ordinamenti che avevo salvato e ricreo la ColumnsList in base a loro
|
|
977
978
|
let newColList = [];
|
|
978
979
|
view.column_ordering.forEach(co => {
|
|
@@ -989,7 +990,7 @@ class ColumnMetadataHandler {
|
|
|
989
990
|
this.est.ColumnsList = newColList;
|
|
990
991
|
}
|
|
991
992
|
// In ogni caso questo non mi serve più, lo resetto **
|
|
992
|
-
if (this.est.viewMode)
|
|
993
|
+
if (this.est.viewMode())
|
|
993
994
|
view.savedstate = false;
|
|
994
995
|
// Reset di questa variabile usata one-bind
|
|
995
996
|
if (this.est.useLocalVisibility)
|
|
@@ -1141,8 +1142,8 @@ class ColumnMetadataHandler {
|
|
|
1141
1142
|
for (let l = 0; l < expandedGroups.length; l++) {
|
|
1142
1143
|
let levelArray = [];
|
|
1143
1144
|
finalHeaders.push(levelArray);
|
|
1144
|
-
if (this.est.Selection || this.est.HasPinnedColumns)
|
|
1145
|
-
levelArray.push({ ID: "_base_sel_pinned", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns });
|
|
1145
|
+
if (this.est.Selection() || this.est.HasPinnedColumns())
|
|
1146
|
+
levelArray.push({ ID: "_base_sel_pinned", Span: 1, Template: null, Pinned: this.est.HasPinnedColumns() });
|
|
1146
1147
|
for (let h = 0; h < expandedGroups[l].length; h++) {
|
|
1147
1148
|
let item = expandedGroups[l][h];
|
|
1148
1149
|
if (item == currentParent)
|
|
@@ -1157,9 +1158,9 @@ class ColumnMetadataHandler {
|
|
|
1157
1158
|
// Ultima aggiunta che altrimenti mi rimarrebbe in cache
|
|
1158
1159
|
levelArray.push({ ID: `${currentParent ? infos.thsCache[currentParent].th : 'noth'}_${currentSpan}`, Span: currentSpan, Template: currentParent ? infos.thsCache[currentParent].Template : null, Content: currentParent ? infos.thsCache[currentParent]._multi_content : null, Borders: !!currentParent });
|
|
1159
1160
|
// Aggiungo i pezzettini per la rimozione e gli export, se presenti
|
|
1160
|
-
if (this.est.Removal)
|
|
1161
|
+
if (this.est.Removal())
|
|
1161
1162
|
levelArray.push({ ID: "_base_removal", Span: 1, Template: null });
|
|
1162
|
-
if (this.est.Export || this.est.HiddenColumns || this.est.ColumnsOrdering || this.est.CornerMenuOptions)
|
|
1163
|
+
if (this.est.Export() || this.est.HiddenColumns() || this.est.ColumnsOrdering() || this.est.CornerMenuOptions())
|
|
1163
1164
|
levelArray.push({ ID: "_base_extra_opts", Span: 1, Template: null });
|
|
1164
1165
|
currentSpan = 0;
|
|
1165
1166
|
currentParent = "";
|
|
@@ -1215,10 +1216,10 @@ class ColumnMetadataHandler {
|
|
|
1215
1216
|
return;
|
|
1216
1217
|
//*********************************************** Fix ordinamenti per colonne sparite ****************************** */
|
|
1217
1218
|
// Considero solo gli ordinamenti per colonne effettivamente presenti all'interno della tabella
|
|
1218
|
-
if (this.est.viewMode)
|
|
1219
|
+
if (this.est.viewMode())
|
|
1219
1220
|
view.column_ordering = view.column_ordering.filter(ord => ths.find(t => t.th == ord));
|
|
1220
1221
|
//*********************************************** Fix ordinamenti per colonne sparite ****************************** */
|
|
1221
|
-
let orderings = this.est.viewMode ? view.column_ordering : this.est.arrayColumnOrdering;
|
|
1222
|
+
let orderings = this.est.viewMode() ? view.column_ordering : this.est.arrayColumnOrdering;
|
|
1222
1223
|
// Genero ordinamento di default da 0 fino a dove deve arrivare. Situazione attuale senza hotpotato
|
|
1223
1224
|
if (!orderings || orderings.length == 0) {
|
|
1224
1225
|
for (let i = 0; i < ths.length; i++) {
|
|
@@ -1263,7 +1264,7 @@ class ColumnMetadataHandler {
|
|
|
1263
1264
|
let context = this.est.TMPRowTDs[this.est.RowContexts[i]];
|
|
1264
1265
|
let newContext = [];
|
|
1265
1266
|
this.est.OrderDirectives.forEach(o => {
|
|
1266
|
-
let contextItem = context.filter(t => t.ID == o)[0];
|
|
1267
|
+
let contextItem = context.filter(t => t().ID == o)[0];
|
|
1267
1268
|
// potrebbe esser undefined nel caso ci fossero colonne sotto thIf
|
|
1268
1269
|
if (contextItem)
|
|
1269
1270
|
newContext.push(contextItem);
|
|
@@ -1271,7 +1272,7 @@ class ColumnMetadataHandler {
|
|
|
1271
1272
|
this.est.TMPRowTDs[this.est.RowContexts[i]] = newContext;
|
|
1272
1273
|
}
|
|
1273
1274
|
}
|
|
1274
|
-
if (this.est.viewMode)
|
|
1275
|
+
if (this.est.viewMode())
|
|
1275
1276
|
view.column_ordering = this.est.OrderDirectives;
|
|
1276
1277
|
else
|
|
1277
1278
|
this.est.arrayColumnOrdering = this.est.OrderDirectives;
|
|
@@ -1377,7 +1378,7 @@ class ColumnMetadataHandler {
|
|
|
1377
1378
|
/** Effettua la selezione o meno del check globale (**globalColVisCheck**) di visibilità in base a se tutte le **TMPColumnsList** sono visibili o no */
|
|
1378
1379
|
updateGlobalColVisCheck() {
|
|
1379
1380
|
// TMPColList viene riempita di undefined nel caso in cui sia disattivata la selezione delle colonne nascoste
|
|
1380
|
-
this.est.globalColVisCheck
|
|
1381
|
+
this.est.globalColVisCheck.set(this.est.TMPColumnsList.every(t => t.visible));
|
|
1381
1382
|
}
|
|
1382
1383
|
/**
|
|
1383
1384
|
* Chiamato quando una colonna viene riordinata all'interno della lista delle visibilità/posizioni colonne
|
|
@@ -1410,7 +1411,7 @@ class ColumnMetadataHandler {
|
|
|
1410
1411
|
// Non permetto di non selezionare nulla
|
|
1411
1412
|
if (this.est.TMPColumnsList.every(t => !t.visible))
|
|
1412
1413
|
return false;
|
|
1413
|
-
let castedView = this.est.viewMode ? (this.est.MainGroupView || this.est.View) : null;
|
|
1414
|
+
let castedView = this.est.viewMode() ? (this.est.MainGroupView || this.est.View) : null;
|
|
1414
1415
|
this.est.ColumnsList = [];
|
|
1415
1416
|
this.est.TMPColumnsList.forEach(c => { this.est.ColumnsList.push(Object.assign({}, c)); });
|
|
1416
1417
|
this.refreshColumnOrdering();
|
|
@@ -1418,11 +1419,11 @@ class ColumnMetadataHandler {
|
|
|
1418
1419
|
this.refreshColumnsVisibility(null, null, castedView);
|
|
1419
1420
|
//Salvo le preferences di questa view
|
|
1420
1421
|
//Di default registro ordinamento e visibilità delle colonne nella vista. Solo le cose di UI
|
|
1421
|
-
if (this.est.SavePreferences)
|
|
1422
|
+
if (this.est.SavePreferences())
|
|
1422
1423
|
this.registerViewPreferences(castedView);
|
|
1423
1424
|
// Rieseguo l'ultima ricerca bindata alla tabella
|
|
1424
1425
|
// Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono
|
|
1425
|
-
if (this.est.viewMode)
|
|
1426
|
+
if (this.est.viewMode())
|
|
1426
1427
|
setTimeout(() => {
|
|
1427
1428
|
if (this.est.MainGroupView) {
|
|
1428
1429
|
for (let i = 0; i < this.est.groupSearchRequestsCache.length; i++) {
|
|
@@ -1435,7 +1436,7 @@ class ColumnMetadataHandler {
|
|
|
1435
1436
|
else
|
|
1436
1437
|
this.est.emitSearchRequest(true);
|
|
1437
1438
|
});
|
|
1438
|
-
else if (this.est.arrayMode)
|
|
1439
|
+
else if (this.est.arrayMode())
|
|
1439
1440
|
setTimeout(() => { this.est.internalWriteValue(); });
|
|
1440
1441
|
// Lo vorrei mettere lato template ma no
|
|
1441
1442
|
this.est.lastSelectedItemID = null;
|
|
@@ -1455,7 +1456,7 @@ class ColumnMetadataHandler {
|
|
|
1455
1456
|
globalColVisCheckChanged() {
|
|
1456
1457
|
this.est.TMPColumnsList.forEach(t => {
|
|
1457
1458
|
if (!t.fixed)
|
|
1458
|
-
t.visible = this.est.globalColVisCheck;
|
|
1459
|
+
t.visible = this.est.globalColVisCheck();
|
|
1459
1460
|
});
|
|
1460
1461
|
}
|
|
1461
1462
|
}
|
|
@@ -1520,32 +1521,33 @@ class DynamicModeHandler {
|
|
|
1520
1521
|
if (!this.est.TMPBoundSource || this.est.TMPBoundSource.length == 0)
|
|
1521
1522
|
return;
|
|
1522
1523
|
var useGenericItems = !!this.est.TMPBoundSource[0]["properties"];
|
|
1523
|
-
if (!useGenericItems || (!this.est.FirstBind && this.est.DynamicRowColumnsDefinition
|
|
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
|
}
|
|
@@ -1629,14 +1631,14 @@ class HierarchyModeHandler {
|
|
|
1629
1631
|
if (!objs || !objs.length)
|
|
1630
1632
|
return;
|
|
1631
1633
|
//Se mancano entrambe le info le cerco di valorizzare in automatico coi default "parentid" e "id" (posto che le props esistano nell'oggetto)
|
|
1632
|
-
if (!this.est.ParentKey && !this.est.OwnKey) {
|
|
1634
|
+
if (!this.est.ParentKey() && !this.est.OwnKey()) {
|
|
1633
1635
|
if (objs[0]['parentid'] !== undefined)
|
|
1634
|
-
this.est.ParentKey
|
|
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
|
-
if (!this.est.ParentKey || !this.est.OwnKey) {
|
|
1641
|
+
if (!this.est.ParentKey() || !this.est.OwnKey()) {
|
|
1640
1642
|
console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');
|
|
1641
1643
|
return;
|
|
1642
1644
|
}
|
|
@@ -1662,7 +1664,7 @@ class HierarchyModeHandler {
|
|
|
1662
1664
|
for (let i = 0; i < objs.length; i++) {
|
|
1663
1665
|
let obj = objs[i];
|
|
1664
1666
|
// Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)
|
|
1665
|
-
if (!obj[this.est.ParentKey] && levelToAssign == 1) {
|
|
1667
|
+
if (!obj[this.est.ParentKey()] && levelToAssign == 1) {
|
|
1666
1668
|
obj._level = 1;
|
|
1667
1669
|
obj._visible = true;
|
|
1668
1670
|
obj._expanded = this.est.StartsExpanded;
|
|
@@ -1670,12 +1672,12 @@ class HierarchyModeHandler {
|
|
|
1670
1672
|
continue;
|
|
1671
1673
|
}
|
|
1672
1674
|
// Per i livelli superiore al primo
|
|
1673
|
-
if (obj[this.est.ParentKey] && levelToAssign > 1) {
|
|
1675
|
+
if (obj[this.est.ParentKey()] && levelToAssign > 1) {
|
|
1674
1676
|
// trovo il parent
|
|
1675
1677
|
for (let p = 0; p < objs.length; p++) {
|
|
1676
1678
|
let possibleParent = objs[p];
|
|
1677
1679
|
// Trovato il parent dell'item, assegno all'item il livello giusto
|
|
1678
|
-
if (possibleParent[this.est.OwnKey] == obj[this.est.ParentKey] && possibleParent._level == levelToAssign - 1) {
|
|
1680
|
+
if (possibleParent[this.est.OwnKey()] == obj[this.est.ParentKey()] && possibleParent._level == levelToAssign - 1) {
|
|
1679
1681
|
obj._level = levelToAssign;
|
|
1680
1682
|
// So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica
|
|
1681
1683
|
// per la visibilità del figlio
|
|
@@ -1696,15 +1698,16 @@ class HierarchyModeHandler {
|
|
|
1696
1698
|
* @param {string} key Chiave del parent da espandere
|
|
1697
1699
|
*/
|
|
1698
1700
|
expandParent(key) {
|
|
1699
|
-
|
|
1700
|
-
|
|
1701
|
+
let bs = this.est.boundSource();
|
|
1702
|
+
for (let i = 0; i < bs.length; i++) {
|
|
1703
|
+
let obj = bs[i];
|
|
1701
1704
|
// Trovo il parent con quell'id e lo espando
|
|
1702
|
-
if (obj[this.est.OwnKey] == key) {
|
|
1705
|
+
if (obj[this.est.OwnKey()] == key) {
|
|
1703
1706
|
obj._expanded = true;
|
|
1704
|
-
for (let ic = 0; ic <
|
|
1705
|
-
let child =
|
|
1707
|
+
for (let ic = 0; ic < bs.length; ic++) {
|
|
1708
|
+
let child = bs[ic];
|
|
1706
1709
|
// Trovo tutti i child di quel parent e li rendo visibili
|
|
1707
|
-
if (child[this.est.ParentKey] == key)
|
|
1710
|
+
if (child[this.est.ParentKey()] == key)
|
|
1708
1711
|
child._visible = true;
|
|
1709
1712
|
}
|
|
1710
1713
|
return;
|
|
@@ -1717,10 +1720,11 @@ class HierarchyModeHandler {
|
|
|
1717
1720
|
* @param {string} key Chiave del parent da collassare
|
|
1718
1721
|
*/
|
|
1719
1722
|
collapseParent(key) {
|
|
1720
|
-
|
|
1721
|
-
|
|
1723
|
+
let bs = this.est.boundSource();
|
|
1724
|
+
for (let i = 0; i < bs.length; i++) {
|
|
1725
|
+
let obj = bs[i];
|
|
1722
1726
|
// Trovo il parent con quell'id e lo collasso
|
|
1723
|
-
if (obj[this.est.OwnKey] == key) {
|
|
1727
|
+
if (obj[this.est.OwnKey()] == key) {
|
|
1724
1728
|
obj._expanded = false;
|
|
1725
1729
|
// Collasso/nascondo tutti i child del parent
|
|
1726
1730
|
this.collapseChildOfParent(key);
|
|
@@ -1734,16 +1738,17 @@ class HierarchyModeHandler {
|
|
|
1734
1738
|
* @param {string} parentKey Chiave del parent di cui collassare i figli
|
|
1735
1739
|
*/
|
|
1736
1740
|
collapseChildOfParent(parentKey) {
|
|
1737
|
-
|
|
1738
|
-
|
|
1741
|
+
let bs = this.est.boundSource();
|
|
1742
|
+
for (let ic = 0; ic < bs.length; ic++) {
|
|
1743
|
+
let child = bs[ic];
|
|
1739
1744
|
// Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,
|
|
1740
1745
|
// lo collasso e vado in ricorsione sui figli
|
|
1741
|
-
if (child[this.est.ParentKey] == parentKey && !child.parent)
|
|
1746
|
+
if (child[this.est.ParentKey()] == parentKey && !child.parent)
|
|
1742
1747
|
child._visible = false;
|
|
1743
|
-
else if (child[this.est.ParentKey] == parentKey && child.parent) {
|
|
1748
|
+
else if (child[this.est.ParentKey()] == parentKey && child.parent) {
|
|
1744
1749
|
child._expanded = false;
|
|
1745
1750
|
child._visible = false;
|
|
1746
|
-
this.collapseChildOfParent(child[this.est.OwnKey]);
|
|
1751
|
+
this.collapseChildOfParent(child[this.est.OwnKey()]);
|
|
1747
1752
|
}
|
|
1748
1753
|
}
|
|
1749
1754
|
}
|
|
@@ -1768,22 +1773,23 @@ class ItemsHandler {
|
|
|
1768
1773
|
*/
|
|
1769
1774
|
getItemsByMode(onlyselected = false, refreshPaging = false, allIfPossible = false) {
|
|
1770
1775
|
let items = [];
|
|
1771
|
-
if ((this.est.viewMode && this.est.View instanceof AppSearch)) {
|
|
1776
|
+
if ((this.est.viewMode() && this.est.View instanceof AppSearch)) {
|
|
1772
1777
|
items = this.getViewItemsBySource();
|
|
1773
1778
|
}
|
|
1774
|
-
else if (this.est.arrayMode) {
|
|
1779
|
+
else if (this.est.arrayMode()) {
|
|
1775
1780
|
this.est.View.forEach(itm => { itm._item = true; });
|
|
1776
1781
|
// Se faccio dei raggruppamenti ignoro la paginazione
|
|
1777
|
-
if (this.est.UseArrayModePaging && !allIfPossible) {
|
|
1782
|
+
if (this.est.UseArrayModePaging() && !allIfPossible) {
|
|
1778
1783
|
// Se sono in modalità array ma la ricerca dipende da una view devo riallineare gli itemperpage
|
|
1779
|
-
|
|
1780
|
-
|
|
1781
|
-
this.est.
|
|
1782
|
-
this.est.
|
|
1784
|
+
let fakeView = this.est.SearchView();
|
|
1785
|
+
if (fakeView) {
|
|
1786
|
+
this.est.ArraymodeItemsPerPage.set(fakeView.itemsperpageoverride);
|
|
1787
|
+
this.est.arraymodePage = fakeView.page;
|
|
1788
|
+
this.est.arraymodePages = fakeView.pages;
|
|
1783
1789
|
}
|
|
1784
1790
|
// Devo chiamare il refresh page solo se vengo richiamato da un binding esterno
|
|
1785
1791
|
else if (refreshPaging)
|
|
1786
|
-
this.refreshPaging(this.est.ArraymodeItemsPerPage);
|
|
1792
|
+
this.refreshPaging(this.est.ArraymodeItemsPerPage());
|
|
1787
1793
|
items = this.adaptViewToPaging();
|
|
1788
1794
|
}
|
|
1789
1795
|
else {
|
|
@@ -1803,8 +1809,8 @@ class ItemsHandler {
|
|
|
1803
1809
|
* @param {number} pageSize Dimensione della pagina
|
|
1804
1810
|
*/
|
|
1805
1811
|
refreshPaging(pageSize) {
|
|
1806
|
-
this.est.ArraymodeItemsPerPage
|
|
1807
|
-
this.est.arraymodePages = Math.ceil(this.est.View.length /
|
|
1812
|
+
this.est.ArraymodeItemsPerPage.set(pageSize);
|
|
1813
|
+
this.est.arraymodePages = Math.ceil(this.est.View.length / pageSize);
|
|
1808
1814
|
this.est.arraymodePage = 1;
|
|
1809
1815
|
// Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca
|
|
1810
1816
|
this.est.internalWriteValue();
|
|
@@ -1827,7 +1833,7 @@ class ItemsHandler {
|
|
|
1827
1833
|
return ret;
|
|
1828
1834
|
}
|
|
1829
1835
|
else {
|
|
1830
|
-
let ret = this.est.ItemSourceProperty ? this.est.View[this.est.ItemSourceProperty] : this.est.View.items;
|
|
1836
|
+
let ret = this.est.ItemSourceProperty() ? this.est.View[this.est.ItemSourceProperty()] : this.est.View.items;
|
|
1831
1837
|
if (!ret)
|
|
1832
1838
|
ret = [];
|
|
1833
1839
|
// Setto variabile interna per specificare che questo è un elemento normale, non un gruppo o altro
|
|
@@ -1841,8 +1847,8 @@ class ItemsHandler {
|
|
|
1841
1847
|
// Se ho una search view l'array pulsanti viene calcolato da lei, non devo prendere quello della modalità array,
|
|
1842
1848
|
// inoltre non ho bisogno di fare ragionamenti su quanti elementi ci sono e sulla pagina, dato che viene tutto gestito esternamente,
|
|
1843
1849
|
// unendo al risultato della view tutti gli oggetti addizionali
|
|
1844
|
-
if (!this.est.SearchView)
|
|
1845
|
-
this.est.arrayPulsanti
|
|
1850
|
+
if (!this.est.SearchView())
|
|
1851
|
+
this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.arraymodePage, this.est.arraymodePages));
|
|
1846
1852
|
else
|
|
1847
1853
|
return this.est.View;
|
|
1848
1854
|
// Applico eventuali oridnamenti lato Array prima di tirare fuori la pagina selezionata
|
|
@@ -1850,7 +1856,7 @@ class ItemsHandler {
|
|
|
1850
1856
|
if (this.est)
|
|
1851
1857
|
items = this.arrayModeReviewOrderings(items);
|
|
1852
1858
|
// Poi per tutti i valori dopo compresi fra la pagina - 1 e la pagina
|
|
1853
|
-
for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage; i++) {
|
|
1859
|
+
for (let i = ((this.est.arraymodePage - 1) * this.est.ArraymodeItemsPerPage()); i < this.est.arraymodePage * this.est.ArraymodeItemsPerPage(); i++) {
|
|
1854
1860
|
if (i <= items.length - 1)
|
|
1855
1861
|
tmpItems.push(items[i]);
|
|
1856
1862
|
}
|
|
@@ -1890,7 +1896,7 @@ class ReportModeHandler {
|
|
|
1890
1896
|
count = this.est.previousCount;
|
|
1891
1897
|
let ipp = (this.est.View.itemsperpageoverride || 15);
|
|
1892
1898
|
this.est.View.pages = Math.ceil(count / ipp);
|
|
1893
|
-
this.est.arrayPulsanti
|
|
1899
|
+
this.est.arrayPulsanti.set(this.utilities.getPagesArray(6, this.est.View.page, this.est.View.pages));
|
|
1894
1900
|
}
|
|
1895
1901
|
/**
|
|
1896
1902
|
* Data una AppSearch questo metodo genera la lista di th e td che si possono collegare al giro standard.
|
|
@@ -2042,7 +2048,7 @@ class RowGroupingHandler {
|
|
|
2042
2048
|
// 1) Se non viene richiesto il dettaglio di alcun gruppo significa che la chiamata restituisce la lista paginata dei gruppi principali.
|
|
2043
2049
|
// Li tratto come se fosse una qualsiasi altra query paginata su N elementi
|
|
2044
2050
|
if ((view.requestedgroups?.length || 0) == 0) {
|
|
2045
|
-
this.est.boundSource
|
|
2051
|
+
this.est.boundSource.set(this.est.TMPBoundSource);
|
|
2046
2052
|
this.rgGroupCache = new Map();
|
|
2047
2053
|
this.rgItemCache = new Map();
|
|
2048
2054
|
this.rgChildGroupsCache = new Map();
|
|
@@ -2086,7 +2092,7 @@ class RowGroupingHandler {
|
|
|
2086
2092
|
* GruppoE GruppoE
|
|
2087
2093
|
*/
|
|
2088
2094
|
let intermediateGroup = view.requestedgroups.length != groupingKeys;
|
|
2089
|
-
let items = this.est.boundSource;
|
|
2095
|
+
let items = this.est.boundSource();
|
|
2090
2096
|
let insertIndex = 0;
|
|
2091
2097
|
let insertGroup = null;
|
|
2092
2098
|
let groupKey = "";
|
|
@@ -2144,29 +2150,31 @@ class RowGroupingHandler {
|
|
|
2144
2150
|
itemsCacheReference.push(itm);
|
|
2145
2151
|
}
|
|
2146
2152
|
});
|
|
2153
|
+
let bs = this.est.boundSource();
|
|
2147
2154
|
// Elimino gli oggetti vecchi
|
|
2148
2155
|
// 1) Ricerca intermedia, stato salvato - Elimino tutti gli item e tutti i gruppi la cui route è più lunga della corrente, tutti gli item relativi alla path corrente, e tutte
|
|
2149
2156
|
// le cache di ricerca effettuate su una path più profonda dell'attuale
|
|
2150
2157
|
// 2) Ricerca finale o ricerca intermedia senza stato salvato - Elimino tutti gli item relativi alla path corrente
|
|
2151
2158
|
// Per "stato salvato" si intendono ricerche vecchie salvate per poter essere rieffettuate in caso di ordinamenti su colonne di interesse
|
|
2152
2159
|
if (intermediateGroup && view.savedstate) {
|
|
2153
|
-
|
|
2160
|
+
bs = bs.filter(t => !(t._item || t._thisRoute.length > groupRoute.length));
|
|
2154
2161
|
this.est.groupSearchRequestsCache = this.est.groupSearchRequestsCache.filter(t => !(t.route.length > groupRoute.length));
|
|
2155
2162
|
}
|
|
2156
2163
|
else if (intermediateGroup) {
|
|
2157
2164
|
// Se invece lo stato non è salvato vuol dire che c'è stato un cambio di pagina interno ad un gruppo già aperto:
|
|
2158
2165
|
// - Elimino tutti gli elementi riconducibili a questo gruppo che erano già presenti
|
|
2159
|
-
|
|
2166
|
+
bs = bs.filter(t => !(t._item || (t._thisKey.startsWith(groupKey) && t._thisKey != groupKey)));
|
|
2160
2167
|
}
|
|
2161
|
-
|
|
2162
|
-
let thisGroup =
|
|
2168
|
+
bs = bs.filter(t => !(t._parent == groupKey));
|
|
2169
|
+
let thisGroup = bs[insertIndex];
|
|
2163
2170
|
if (intermediateGroup)
|
|
2164
2171
|
thisGroup._groupscount = this.est.View?.groupcount;
|
|
2165
2172
|
// Li sostituisco coi nuovi di questa ricerca
|
|
2166
|
-
|
|
2173
|
+
bs.splice(insertIndex + 1, 0, ...this.est.TMPBoundSource);
|
|
2167
2174
|
// Aggiungo un separatore alla fine o all'inizio di questi gruppi che dovrà occuparsi di caricare ALTRI gruppi o oggetti (se sono all'ultimo gruppo)
|
|
2168
2175
|
let addLast = false;
|
|
2169
|
-
|
|
2176
|
+
bs.splice(insertIndex + 1 + (addLast ? this.est.TMPBoundSource.length : 0), 0, this.getGroupSeparator(view, groupKey, groupRoute, view.requestedgroups.length, intermediateGroup ? 'groups' : 'items'));
|
|
2177
|
+
this.est.boundSource.set(bs);
|
|
2170
2178
|
// Aggiungo la ricerca alla cache di questa "sessione"
|
|
2171
2179
|
let toAdd = { path: groupKey, route: groupRoute, view: Object.assign({}, view), group_column: intermediateGroup ? this.est.TMPBoundSource[0].column : '' };
|
|
2172
2180
|
let prev = this.est.groupSearchRequestsCache.findIndex(t => t.path == toAdd.path && t.group_column == toAdd.group_column);
|
|
@@ -2198,8 +2206,8 @@ class RowGroupingHandler {
|
|
|
2198
2206
|
this.rgGroupCache.clear();
|
|
2199
2207
|
this.rgItemCache.clear();
|
|
2200
2208
|
this.rgChildGroupsCache.clear();
|
|
2201
|
-
this.est.ArrayGrouping
|
|
2202
|
-
this.est.boundSource
|
|
2209
|
+
this.est.ArrayGrouping.set(true);
|
|
2210
|
+
this.est.boundSource.set(this.getGroupsRecursive(headerGroups, 0, this.est.boundSource(), headerAggregations, null));
|
|
2203
2211
|
}
|
|
2204
2212
|
}
|
|
2205
2213
|
/**
|
|
@@ -2693,14 +2701,14 @@ class SelectionHandler {
|
|
|
2693
2701
|
}
|
|
2694
2702
|
// Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true
|
|
2695
2703
|
// Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni
|
|
2696
|
-
this.est.globalCheck
|
|
2697
|
-
this.est.canSelectAll
|
|
2704
|
+
this.est.globalCheck.set(this.est.boundSource().length > 0 && this.est.boundSource().filter(t => t._group || t._item).every(t => t._selected));
|
|
2705
|
+
this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
|
|
2698
2706
|
// Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella
|
|
2699
2707
|
// Comunque costa 0 quindi mi permetto di refreshare
|
|
2700
|
-
if (this.est.arrayMode) {
|
|
2701
|
-
let prevSelected = this.est.selectedObjects;
|
|
2708
|
+
if (this.est.arrayMode()) {
|
|
2709
|
+
let prevSelected = this.est.selectedObjects();
|
|
2702
2710
|
this.finalizeSelectionInformations(selectionItem);
|
|
2703
|
-
if (this.est.selectedObjects != prevSelected)
|
|
2711
|
+
if (this.est.selectedObjects() != prevSelected)
|
|
2704
2712
|
this.est.onSelectionChanged.emit(selectionItem);
|
|
2705
2713
|
}
|
|
2706
2714
|
}
|
|
@@ -2756,20 +2764,20 @@ class SelectionHandler {
|
|
|
2756
2764
|
handleItemsSelection(items, forcedVal = null, globalCheck = null) {
|
|
2757
2765
|
let si = this.est.View?.selection || this.est.arraymodeSelection;
|
|
2758
2766
|
// Se sono in modalità di selezione singola e devo selezionare un'oggetto, per prima cosa devo deselezionare tutti gli altri
|
|
2759
|
-
if (this.est.SingleSelection && items[0]?._selected && !items[0]?._group) {
|
|
2767
|
+
if (this.est.SingleSelection() && items[0]?._selected && !items[0]?._group) {
|
|
2760
2768
|
if (items.length > 1 && forcedVal == null)
|
|
2761
2769
|
throw "Tentativo di selezionare o deselezionare più di un elemento con SingleSelection attivo";
|
|
2762
2770
|
if (items.length == 1 && forcedVal == null) {
|
|
2763
|
-
si = this.handleItemsSelection(this.est.boundSource.filter(t => !t._group), false, null);
|
|
2771
|
+
si = this.handleItemsSelection(this.est.boundSource().filter(t => !t._group), false, null);
|
|
2764
2772
|
items[0]._selected = true;
|
|
2765
2773
|
}
|
|
2766
2774
|
}
|
|
2767
2775
|
for (let i = 0; i < items.length; i++) {
|
|
2768
2776
|
let item = items[i];
|
|
2769
|
-
let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck : false;
|
|
2777
|
+
let toChange = forcedVal != null ? item._selected != forcedVal : globalCheck != null ? item._selected != this.est.globalCheck() : false;
|
|
2770
2778
|
// Se dev'essere overridato il valore di check effettuo l'override o col valore forzato o col valore globale
|
|
2771
2779
|
if (toChange && !item.locked)
|
|
2772
|
-
item._selected = forcedVal != null ? forcedVal : this.est.globalCheck;
|
|
2780
|
+
item._selected = forcedVal != null ? forcedVal : this.est.globalCheck();
|
|
2773
2781
|
// Se il valore non dev'essere variato e vengo da una selezione globale semplicemente evito di effettuare operaizoni inutili. L'item/gruppo è già nello stato giusto
|
|
2774
2782
|
if (!toChange && globalCheck != null)
|
|
2775
2783
|
continue;
|
|
@@ -2793,7 +2801,7 @@ class SelectionHandler {
|
|
|
2793
2801
|
parentGroupSelected = itemGroup == null ? null : itemGroup._selected;
|
|
2794
2802
|
parentGroupUnselected = itemGroup == null ? null : !itemGroup._selected;
|
|
2795
2803
|
}
|
|
2796
|
-
if (!this.est.ArrayGrouping)
|
|
2804
|
+
if (!this.est.ArrayGrouping())
|
|
2797
2805
|
this.performSelectionOperations(si, item, allSelection, isGroup, isSelection, selectedItems, selectedGroups, unselectedItems, unselectedGroups, allItems, allGroups, parentGroupSelected, parentGroupUnselected);
|
|
2798
2806
|
else
|
|
2799
2807
|
this.performSimpleSelectionOperations(si, item, isGroup, isSelection, itemGroup, selectedItems, unselectedItems, allItems, allGroups);
|
|
@@ -2801,14 +2809,14 @@ class SelectionHandler {
|
|
|
2801
2809
|
// Imposto il check globale in base a se tutti gli elementi sono selezionati o meno.
|
|
2802
2810
|
// Evito di fare queste operazioni se la selezione deriva proprio dal global Check
|
|
2803
2811
|
if (globalCheck == null)
|
|
2804
|
-
this.est.globalCheck
|
|
2812
|
+
this.est.globalCheck.set(!this.est.boundSource().some(t => !t._selected && !t._sep));
|
|
2805
2813
|
this.finalizeSelectionInformations(si);
|
|
2806
2814
|
return si;
|
|
2807
2815
|
}
|
|
2808
2816
|
/**
|
|
2809
2817
|
* Dato L'oggetto di selezione, l'oggetto da selezionare/deselezionare e tutti i parametri del caso effettua le operazioni che servono.
|
|
2810
2818
|
*
|
|
2811
|
-
* Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping** = true)
|
|
2819
|
+
* Logica semplificata rispetto all'originale **performSelectionOperations** per lavorare in una modalità in cui tutti gli elementi sono caricati (**ArrayGrouping()** = true)
|
|
2812
2820
|
*/
|
|
2813
2821
|
performSimpleSelectionOperations(base, item, group, sel, itm_group, sel_itm, desel_itm, all_itms, all_grps) {
|
|
2814
2822
|
let tripticItem = this.getTriptic('item', base);
|
|
@@ -2981,7 +2989,7 @@ class SelectionHandler {
|
|
|
2981
2989
|
items = items.filter(t => !status || (t._selected && status == 'selected') || (!t._selected && status == 'unselected'));
|
|
2982
2990
|
// Non trovo nessun oggetto, però magari di oggetti ne ho all'interno dell'oggetto di selezione.
|
|
2983
2991
|
// Questo può essere vero solo se NON sono in modalità array, in caso contrario gli oggetti li devo per forza avere tutti
|
|
2984
|
-
if (items.length != 0 || !sel || this.est.arrayMode)
|
|
2992
|
+
if (items.length != 0 || !sel || this.est.arrayMode())
|
|
2985
2993
|
return items;
|
|
2986
2994
|
if (status == 'unselected')
|
|
2987
2995
|
items = sel.exclusions.filter(t => t != null &&
|
|
@@ -3089,7 +3097,7 @@ class SelectionHandler {
|
|
|
3089
3097
|
selectionItem.count = this.evaluateSelected();
|
|
3090
3098
|
// Se ho fatto selezione "all" ma poi mi sono messo a togliere tutti gli elementi fino a rimanerne 0 resetto l'oggetto di selezione
|
|
3091
3099
|
if (selectionItem.count == 0) {
|
|
3092
|
-
this.est.boundSource.forEach(t => t._selected = false);
|
|
3100
|
+
this.est.boundSource().forEach(t => t._selected = false);
|
|
3093
3101
|
selectionItem.all = false;
|
|
3094
3102
|
selectionItem.exclusions = [];
|
|
3095
3103
|
selectionItem.items = [];
|
|
@@ -3099,7 +3107,7 @@ class SelectionHandler {
|
|
|
3099
3107
|
this.clearSelectionCaches();
|
|
3100
3108
|
}
|
|
3101
3109
|
// Se la possibilità di fare "Seleziona tutto" è abilitata allora la considero appena mi viene selezionato qualcosa
|
|
3102
|
-
this.est.canSelectAll
|
|
3110
|
+
this.est.canSelectAll.set(selectionItem.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
|
|
3103
3111
|
}
|
|
3104
3112
|
/** Compatta una cache di indici */
|
|
3105
3113
|
compactIndexMap(map) {
|
|
@@ -3118,8 +3126,9 @@ class SelectionHandler {
|
|
|
3118
3126
|
let si = this.est.View?.selection || this.est.arraymodeSelection;
|
|
3119
3127
|
let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);
|
|
3120
3128
|
let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);
|
|
3121
|
-
|
|
3122
|
-
|
|
3129
|
+
let count = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
|
|
3130
|
+
this.est.selectedObjects.set(count);
|
|
3131
|
+
return count;
|
|
3123
3132
|
}
|
|
3124
3133
|
/** Gestisce il comando di "Seleziona tutto in tutte le pagine" o il suo contrario, cioè "Reimposta selezione" */
|
|
3125
3134
|
selectAllOrResetSelection() {
|
|
@@ -3132,13 +3141,13 @@ class SelectionHandler {
|
|
|
3132
3141
|
selectionItem.items = [];
|
|
3133
3142
|
// Ripulisco gli stati UI di selezione globale se l'ho disattivata
|
|
3134
3143
|
if (!selectionItem.all) {
|
|
3135
|
-
this.est.canSelectAll
|
|
3136
|
-
this.est.globalCheck
|
|
3144
|
+
this.est.canSelectAll.set(false);
|
|
3145
|
+
this.est.globalCheck.set(false);
|
|
3137
3146
|
}
|
|
3138
3147
|
this.finalizeSelectionInformations(selectionItem);
|
|
3139
3148
|
this.est.onSelectionChanged.emit(selectionItem);
|
|
3140
3149
|
// Dopo aver resettato direttamente il solo oggetto this.View.selection devo anche riallineare a tutti gli oggetti bindati
|
|
3141
|
-
this.evaluateSelection(this.est.boundSource, selectionItem);
|
|
3150
|
+
this.evaluateSelection(this.est.boundSource(), selectionItem);
|
|
3142
3151
|
}
|
|
3143
3152
|
/**
|
|
3144
3153
|
* @TODO Spostare in SelectionHandler
|
|
@@ -3496,32 +3505,43 @@ class EsTh {
|
|
|
3496
3505
|
*/
|
|
3497
3506
|
this.startOffset = null;
|
|
3498
3507
|
/** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
|
|
3499
|
-
this.ID = "";
|
|
3508
|
+
this.ID = input("", { alias: "es-th" });
|
|
3509
|
+
/** Ordinamento attuale della colonna */
|
|
3510
|
+
this._Order = input(null, { alias: 'Order' });
|
|
3511
|
+
this.Order = signal(null);
|
|
3500
3512
|
/** Indica se questa colonna è ordinabile o meno */
|
|
3501
|
-
this.Orderable = true;
|
|
3513
|
+
this.Orderable = input(true);
|
|
3502
3514
|
/** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
3503
|
-
this.Display = "";
|
|
3515
|
+
this.Display = input("");
|
|
3504
3516
|
/** Indica se le dimnsioni di questa colonna sono modificabili o meno */
|
|
3505
|
-
this.Resizable = false;
|
|
3517
|
+
this.Resizable = input(false);
|
|
3506
3518
|
/** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */
|
|
3507
|
-
this.Pinned = false;
|
|
3519
|
+
this.Pinned = input(false);
|
|
3508
3520
|
/**
|
|
3509
3521
|
* Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio
|
|
3510
3522
|
* come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi
|
|
3511
3523
|
*/
|
|
3512
|
-
this.SearchInProgress = false;
|
|
3524
|
+
this.SearchInProgress = input(false);
|
|
3525
|
+
/** Impostato dall'**EsTable**, serve per permettere o meno di effettuare ordinamenti dati su questa colonna */
|
|
3526
|
+
this.OrderBy = input(null);
|
|
3513
3527
|
/** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
|
|
3514
|
-
this.Wrap = false;
|
|
3528
|
+
this.Wrap = input(false);
|
|
3515
3529
|
/** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
|
|
3516
|
-
this.Fixed = false;
|
|
3530
|
+
this.Fixed = input(false);
|
|
3517
3531
|
/** Template Angular da istanziare per questo TH */
|
|
3518
3532
|
this.Template = null;
|
|
3519
3533
|
/** Evento emesso al cambio di ordinamento effettuato su questa colonna */
|
|
3520
3534
|
this.onOrderChange = new EventEmitter();
|
|
3521
3535
|
/** Evento emesso all'unpinning della colonna */
|
|
3522
3536
|
this.onUnpinning = new EventEmitter();
|
|
3537
|
+
/** Classi da applicare alla colonna */
|
|
3538
|
+
this.Class = signal("");
|
|
3523
3539
|
/** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
3524
|
-
this._referenced = false;
|
|
3540
|
+
this._referenced = signal(false);
|
|
3541
|
+
/** Variabile finale su cui è bindato il contenuto della cella. Sarà valorizzato a **Display** se specificato, all'**innerHTML** dell'elemento proiettato altrimenti */
|
|
3542
|
+
this.Description = computed(() => {
|
|
3543
|
+
return this.Display() === null || this.Display() === "" ? this.content.nativeElement.innerText : this.Display();
|
|
3544
|
+
});
|
|
3525
3545
|
}
|
|
3526
3546
|
/**
|
|
3527
3547
|
* Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
@@ -3548,31 +3568,30 @@ class EsTh {
|
|
|
3548
3568
|
/** @ignore */
|
|
3549
3569
|
ngAfterViewInit() {
|
|
3550
3570
|
//Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
|
|
3551
|
-
this.
|
|
3552
|
-
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
3571
|
+
this.Class.set(this.myself.nativeElement.className.replace("app-display-none", ""));
|
|
3553
3572
|
//Resize
|
|
3554
|
-
if (this.Resizable)
|
|
3573
|
+
if (this.Resizable())
|
|
3555
3574
|
this.renderer.addClass(this.myself.nativeElement, "app-relative");
|
|
3556
3575
|
}
|
|
3557
3576
|
/** Emette l'evento di unpinning */
|
|
3558
3577
|
unpin() {
|
|
3559
|
-
this.onUnpinning.emit(this.ID);
|
|
3578
|
+
this.onUnpinning.emit(this.ID());
|
|
3560
3579
|
}
|
|
3561
3580
|
/** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */
|
|
3562
3581
|
setupNextOrderAndNotify() {
|
|
3563
|
-
if (!this.ID) {
|
|
3582
|
+
if (!this.ID()) {
|
|
3564
3583
|
console.log("Attempt to order a column without ID. Operation ignored");
|
|
3565
3584
|
return;
|
|
3566
3585
|
}
|
|
3567
|
-
if (this.SearchInProgress) {
|
|
3586
|
+
if (this.SearchInProgress()) {
|
|
3568
3587
|
console.log("Attempt to order a column during a search. Operation ignored");
|
|
3569
3588
|
return;
|
|
3570
3589
|
}
|
|
3571
|
-
if (!this.OrderBy || !this.Orderable)
|
|
3590
|
+
if (!this.OrderBy() || !this.Orderable())
|
|
3572
3591
|
return;
|
|
3573
|
-
var nextOrder = this.orderNext[this.
|
|
3574
|
-
this.Order
|
|
3575
|
-
this.onOrderChange.emit(
|
|
3592
|
+
var nextOrder = this.orderNext[this._Order() || "NONE"];
|
|
3593
|
+
this.Order.set(nextOrder);
|
|
3594
|
+
this.onOrderChange.emit(nextOrder);
|
|
3576
3595
|
}
|
|
3577
3596
|
/**
|
|
3578
3597
|
* Evento di inizio resize della colonna
|
|
@@ -3580,14 +3599,14 @@ class EsTh {
|
|
|
3580
3599
|
* @param {any} ev Evento MouseDown
|
|
3581
3600
|
*/
|
|
3582
3601
|
onResizeStart(ev) {
|
|
3583
|
-
if (!this.Resizable)
|
|
3602
|
+
if (!this.Resizable())
|
|
3584
3603
|
return;
|
|
3585
3604
|
this.resizingThis = true;
|
|
3586
3605
|
this.startOffset = this.myself.nativeElement.offsetWidth - ev.pageX;
|
|
3587
3606
|
}
|
|
3588
3607
|
/** Listener per la fine dell'operazione di resize */
|
|
3589
3608
|
onMouseUp() {
|
|
3590
|
-
if (!this.Resizable)
|
|
3609
|
+
if (!this.Resizable())
|
|
3591
3610
|
return;
|
|
3592
3611
|
this.resizingThis = false;
|
|
3593
3612
|
}
|
|
@@ -3597,7 +3616,7 @@ class EsTh {
|
|
|
3597
3616
|
* @param {$event} ev Evento MouseMove
|
|
3598
3617
|
*/
|
|
3599
3618
|
onMouseMove($event) {
|
|
3600
|
-
if (!this.Resizable || !this.resizingThis)
|
|
3619
|
+
if (!this.Resizable() || !this.resizingThis)
|
|
3601
3620
|
return;
|
|
3602
3621
|
//Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo
|
|
3603
3622
|
//(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)
|
|
@@ -3606,33 +3625,12 @@ class EsTh {
|
|
|
3606
3625
|
$event.preventDefault();
|
|
3607
3626
|
}
|
|
3608
3627
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTh, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3609
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
3628
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTh, isStandalone: false, selector: "[es-th]", inputs: { ID: { classPropertyName: "ID", publicName: "es-th", isSignal: true, isRequired: false, transformFunction: null }, _Order: { classPropertyName: "_Order", publicName: "Order", isSignal: true, isRequired: false, transformFunction: null }, Orderable: { classPropertyName: "Orderable", publicName: "Orderable", isSignal: true, isRequired: false, transformFunction: null }, Display: { classPropertyName: "Display", publicName: "Display", isSignal: true, isRequired: false, transformFunction: null }, Resizable: { classPropertyName: "Resizable", publicName: "Resizable", isSignal: true, isRequired: false, transformFunction: null }, Pinned: { classPropertyName: "Pinned", publicName: "Pinned", isSignal: true, isRequired: false, transformFunction: null }, SearchInProgress: { classPropertyName: "SearchInProgress", publicName: "SearchInProgress", isSignal: true, isRequired: false, transformFunction: null }, OrderBy: { classPropertyName: "OrderBy", publicName: "OrderBy", isSignal: true, isRequired: false, transformFunction: null }, Wrap: { classPropertyName: "Wrap", publicName: "Wrap", isSignal: true, isRequired: false, transformFunction: null }, Fixed: { classPropertyName: "Fixed", publicName: "Fixed", isSignal: true, isRequired: false, transformFunction: null }, Template: { classPropertyName: "Template", publicName: "Template", isSignal: false, isRequired: false, transformFunction: null }, Visible: { classPropertyName: "Visible", publicName: "Visible", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onOrderChange: "onOrderChange", onUnpinning: "onUnpinning" }, host: { listeners: { "window:mouseup.out-zone": "onMouseUp()", "window:mousemove.out-zone": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span> \r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>", dependencies: [{ kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3610
3629
|
}
|
|
3611
3630
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTh, decorators: [{
|
|
3612
3631
|
type: Component,
|
|
3613
|
-
args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID && Orderable\" [class.app-pointer]=\"!!ID && Orderable\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span> \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: [{
|
|
3632
|
+
args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span> \r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>" }]
|
|
3633
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { Template: [{
|
|
3636
3634
|
type: Input
|
|
3637
3635
|
}], onOrderChange: [{
|
|
3638
3636
|
type: Output
|
|
@@ -3655,36 +3653,32 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
3655
3653
|
/** Componente rappresentante una singola cella del body della tabella */
|
|
3656
3654
|
class EsTd {
|
|
3657
3655
|
/** @ignore */
|
|
3658
|
-
constructor(
|
|
3659
|
-
this.
|
|
3656
|
+
constructor(el) {
|
|
3657
|
+
this.el = el;
|
|
3660
3658
|
/** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */
|
|
3661
|
-
this.ID = "";
|
|
3659
|
+
this.ID = input("", { alias: "es-td" });
|
|
3660
|
+
/** Contesto dell'oggetto a cui si riferisce il dato visualizzato. Contiene l'hash dell'oggetto in questione */
|
|
3661
|
+
this.Context = input();
|
|
3662
3662
|
/** Quando questa cella viene generata questo evento permette di dire "ehi, sono nato!" */
|
|
3663
3663
|
this.onCellGeneration = new EventEmitter();
|
|
3664
3664
|
/** Errore attualmente presente sulla cella */
|
|
3665
|
-
this.ValidationError = "";
|
|
3665
|
+
this.ValidationError = signal("");
|
|
3666
3666
|
}
|
|
3667
3667
|
/** @ignore */
|
|
3668
3668
|
ngAfterViewInit() {
|
|
3669
|
-
this.onCellGeneration.emit({ id: this.ID, hash: this.Context, self: this });
|
|
3669
|
+
this.onCellGeneration.emit({ id: this.ID(), hash: this.Context(), self: this });
|
|
3670
3670
|
}
|
|
3671
3671
|
/** Api per impostare un "errore" su questa cella in maniera programmatica */
|
|
3672
3672
|
validationError(error) {
|
|
3673
|
-
this.ValidationError
|
|
3674
|
-
this.cdr.markForCheck();
|
|
3673
|
+
this.ValidationError.set(error);
|
|
3675
3674
|
}
|
|
3676
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, deps: [{ token: i0.
|
|
3677
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "
|
|
3675
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3676
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTd, isStandalone: false, selector: "[es-td]", inputs: { ID: { classPropertyName: "ID", publicName: "es-td", isSignal: true, isRequired: false, transformFunction: null }, Context: { classPropertyName: "Context", publicName: "Context", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCellGeneration: "onCellGeneration" }, ngImport: i0, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"], dependencies: [{ kind: "directive", type: i1$1.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3678
3677
|
}
|
|
3679
3678
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTd, decorators: [{
|
|
3680
3679
|
type: Component,
|
|
3681
|
-
args: [{ selector: "[es-td]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError\" [pTooltip]=\"ValidationError\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"] }]
|
|
3682
|
-
}], ctorParameters: () => [{ type: i0.
|
|
3683
|
-
type: Input,
|
|
3684
|
-
args: ['es-td']
|
|
3685
|
-
}], Context: [{
|
|
3686
|
-
type: Input
|
|
3687
|
-
}], onCellGeneration: [{
|
|
3680
|
+
args: [{ selector: "[es-td]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<div class=\"td-content\" [class.td-error]=\"!!ValidationError()\" [pTooltip]=\"ValidationError()\">\r\n <ng-content></ng-content>\r\n</div>", styles: [".td-error{background-color:#f003;-webkit-box-shadow:inset 0px 0px 0px 1px #f00;-moz-box-shadow:inset 0px 0px 0px 1px #f00;box-shadow:inset 0 0 0 1px red}.td-content{padding:.3rem;margin:-.3rem;box-sizing:border-box!important}\n"] }]
|
|
3681
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }], propDecorators: { onCellGeneration: [{
|
|
3688
3682
|
type: Output
|
|
3689
3683
|
}] } });
|
|
3690
3684
|
|
|
@@ -3894,7 +3888,8 @@ class EsTableDefaultable {
|
|
|
3894
3888
|
/** Componente che permette di rappresentare una griglia di valori */
|
|
3895
3889
|
class EsTableComponent {
|
|
3896
3890
|
/** @ignore */
|
|
3897
|
-
constructor(ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3891
|
+
constructor(_zone, ngControl, prefService, deafults, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3892
|
+
this._zone = _zone;
|
|
3898
3893
|
this.ngControl = ngControl;
|
|
3899
3894
|
this.prefService = prefService;
|
|
3900
3895
|
this.deafults = deafults;
|
|
@@ -3910,29 +3905,32 @@ class EsTableComponent {
|
|
|
3910
3905
|
this.logger = logger;
|
|
3911
3906
|
this.emb = emb;
|
|
3912
3907
|
this.rendererRef = rendererRef;
|
|
3908
|
+
this._destroyed$ = new Subject();
|
|
3913
3909
|
/** Subject utilizzato internamente lato EsTable per causare il Focus lato componente di Input */
|
|
3914
3910
|
this.FocusSubject = new Subject();
|
|
3915
3911
|
/** Se vengono effettuati 2 click a distanza inferiore a questi Millisecondi viene considerato un doppio click */
|
|
3916
3912
|
this.doubleClickBufferMs = 200;
|
|
3917
|
-
/** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */
|
|
3918
|
-
this.View = null;
|
|
3919
|
-
/** Indica se l'es-table deve mostrare il check globale nell'header per fare il "seleziona tutto" */
|
|
3920
|
-
this.globalCheck = false;
|
|
3921
3913
|
/** Tiene da conto l'ultimo elemento selezionato in modo da poter effettuare il SHIFT+CLICK */
|
|
3922
3914
|
this.lastSelected = null;
|
|
3915
|
+
/** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */
|
|
3916
|
+
this.View = null; // TODO: signal
|
|
3917
|
+
/** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */
|
|
3918
|
+
this.arrayPulsanti = signal(null);
|
|
3919
|
+
/** Indica se l'es-table deve mostrare il check globale nell'header per fare il "seleziona tutto" */
|
|
3920
|
+
this.globalCheck = model(false);
|
|
3923
3921
|
/** Conteggio interno per il numero di elementi selezionati */
|
|
3924
|
-
this.selectedObjects = 0;
|
|
3922
|
+
this.selectedObjects = signal(0);
|
|
3925
3923
|
/** Indica se è possibile effettuare una selezione massiva */
|
|
3926
|
-
this.canSelectAll = false;
|
|
3924
|
+
this.canSelectAll = signal(false);
|
|
3927
3925
|
/** Indica se il componente sta gestendo un IAppSearch<any> */
|
|
3928
|
-
this.viewMode = false;
|
|
3926
|
+
this.viewMode = signal(false);
|
|
3929
3927
|
/** Indica se il componente sta gestendo un any[] */
|
|
3930
|
-
this.arrayMode = false;
|
|
3928
|
+
this.arrayMode = signal(false);
|
|
3931
3929
|
/**
|
|
3932
3930
|
* Contenitore degli elementi da listare lato interfaccia dopo tutte le elaborazioni del caso,
|
|
3933
3931
|
* generalmente non sono altro che tutti gli oggetti da presentare con in più l'hash calcolato per identificare 1 oggetto con la propria riga
|
|
3934
3932
|
*/
|
|
3935
|
-
this.boundSource = [];
|
|
3933
|
+
this.boundSource = signal([]);
|
|
3936
3934
|
/** Stessa cosa della **boundSource**, utilizzata come appoggio temporaneo interno */
|
|
3937
3935
|
this.TMPBoundSource = [];
|
|
3938
3936
|
/** @deprecated "Fetta" di oggetti utilizzata nell'endless scroll, ogni elemento di questo array è un blocchetto di 100 elementi */
|
|
@@ -3942,17 +3940,17 @@ class EsTableComponent {
|
|
|
3942
3940
|
/** Variabile che identifica il valore del "seleziona Tutto" nella paginazione */
|
|
3943
3941
|
this.defaultAllPageOverride = 999999;
|
|
3944
3942
|
/** Indica se utilizzare il sistema di autoupdate, cioè un trigger time-izzato in alto a destra della tabella che ripete le ricerche ogni X **seconds** */
|
|
3945
|
-
this.autoUpdate = false;
|
|
3943
|
+
this.autoUpdate = model(false);
|
|
3946
3944
|
/** Numero di secondi da fare trascorrere fra una ricerca e l'altra */
|
|
3947
|
-
this.seconds =
|
|
3945
|
+
this.seconds = model("10");
|
|
3948
3946
|
/** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */
|
|
3949
|
-
this.researchInProgress = false;
|
|
3947
|
+
this.researchInProgress = model(false);
|
|
3950
3948
|
/** Modello di appoggio temporaneo per i **RowTDs** */
|
|
3951
3949
|
this.TMPRowTDs = null;
|
|
3952
3950
|
/** Modello rappresentante un dizionario di righe della tabella, con chiave l'hash e valore la lista di celle */
|
|
3953
3951
|
this.RowTDs = null;
|
|
3954
3952
|
/** Indica se **RowTDs** è un oggetto vuoto o meno */
|
|
3955
|
-
this.EmptyRowTds = true;
|
|
3953
|
+
this.EmptyRowTds = signal(true);
|
|
3956
3954
|
/** Modello di appoggio temporaneo per i **RowTHs** */
|
|
3957
3955
|
this.TMPRowTHs = null;
|
|
3958
3956
|
/** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */
|
|
@@ -3983,145 +3981,171 @@ class EsTableComponent {
|
|
|
3983
3981
|
* ecc...
|
|
3984
3982
|
* viene dedotto dal sistema in automatico
|
|
3985
3983
|
*/
|
|
3986
|
-
this.UseCustomCells = null;
|
|
3984
|
+
this.UseCustomCells = signal(null);
|
|
3987
3985
|
/**
|
|
3988
3986
|
* Indica se oltre alle colonne dinamiche specifiche di un tipo di oggetto ci sono anche colonne dinamiche aggiunte dall'utente
|
|
3989
3987
|
*
|
|
3990
3988
|
* Es. una colonna in cui mostrare sempre un iconcina
|
|
3991
3989
|
*/
|
|
3992
|
-
this.UserDefinedDynamicCols = false;
|
|
3990
|
+
this.UserDefinedDynamicCols = signal(false);
|
|
3993
3991
|
/** Indica che questo è il primo Bind della tabella, viene settato a false non appena il primo bind viene terminato con successo */
|
|
3994
|
-
this.FirstBind = true;
|
|
3992
|
+
this.FirstBind = signal(true);
|
|
3995
3993
|
/** Lista di colonne che si possono visualizzare/ordinare fra di loro */
|
|
3996
3994
|
this.ColumnsList = [];
|
|
3997
3995
|
/** Variabile d'appoggio usata dalla dialog di selezione/nascondimento, per evitare di danneggiare **ColumnsList** in caso di modifiche poi annullate */
|
|
3998
3996
|
this.TMPColumnsList = [];
|
|
3999
3997
|
/** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */
|
|
4000
|
-
this.globalColVisCheck = false;
|
|
3998
|
+
this.globalColVisCheck = model(false);
|
|
4001
3999
|
/** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */
|
|
4002
|
-
this.CornerMenuOptions = null;
|
|
4000
|
+
this.CornerMenuOptions = input(null);
|
|
4003
4001
|
/** Indica se dev'essere possibile effettuare il resize delle colonne */
|
|
4004
|
-
this.
|
|
4002
|
+
this._ColumnsResizable = input(null, { alias: "ColumnsResizable" });
|
|
4003
|
+
this.ColumnsResizable = signal(null);
|
|
4005
4004
|
/** Indica se dev'essere possibile effettuare il pinning delle colonne */
|
|
4006
|
-
this.
|
|
4005
|
+
this._ColumnsPinnable = input(null, { alias: "ColumnsPinnable" });
|
|
4006
|
+
this.ColumnsPinnable = signal(null);
|
|
4007
4007
|
/** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
|
|
4008
|
-
this.
|
|
4008
|
+
this._AutoUpdate = input(null, { alias: "AutoUpdate" });
|
|
4009
|
+
this.AutoUpdate = signal(null);
|
|
4009
4010
|
/** Indica l'altezza cablata che deve assumere la tabella. Es: "100px" | "100%" ... */
|
|
4010
|
-
this.Height = null;
|
|
4011
|
+
this.Height = input(null);
|
|
4011
4012
|
/** Indica il colore di sfondo dello spazio vuoto (non ricoperto da dati). Particolarmente utile da impostare in caso di **Height** diverso da null */
|
|
4012
|
-
this.EmptySpaceBackgroundColor = null;
|
|
4013
|
+
this.EmptySpaceBackgroundColor = input(null);
|
|
4013
4014
|
/** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/
|
|
4014
|
-
this.EsTableHandledSearch = false;
|
|
4015
|
+
this.EsTableHandledSearch = input(false);
|
|
4015
4016
|
/** Permette di impostare l'altezza massima della tabella. Se null la dimensione si adatta al numero di elementi attualmente in visualizzazione */
|
|
4016
|
-
this.MaxHeight = null;
|
|
4017
|
+
this.MaxHeight = input(null);
|
|
4017
4018
|
/** Classi da applicare al contenitore della tabella */
|
|
4018
|
-
this.
|
|
4019
|
+
this._ContainerClass = input(null, { alias: "ContainerClass" });
|
|
4020
|
+
this.ContainerClass = signal(null);
|
|
4019
4021
|
/** Permette o meno l'export in formato XLSX */
|
|
4020
|
-
this.XLSXExport = null;
|
|
4022
|
+
this.XLSXExport = input(null);
|
|
4021
4023
|
/** Permette o meno l'export in formato CSV */
|
|
4022
|
-
this.CSVExport = true;
|
|
4024
|
+
this.CSVExport = input(true);
|
|
4023
4025
|
/** Permette di visualizzare o meno l'opzione di paginazione "Tutti" */
|
|
4024
|
-
this.
|
|
4026
|
+
this._AllSearch = input(null, { alias: "AllSearch" });
|
|
4027
|
+
this.AllSearch = signal(null);
|
|
4025
4028
|
/** Diminuisce gli spazi fra una cella e l'altra, e internamente il padding del font in modo da presentare molti più dati in un'unica pagina */
|
|
4026
|
-
this.HighCellDensity = null;
|
|
4029
|
+
this.HighCellDensity = input(null);
|
|
4027
4030
|
/** Abilita o meno la possibilità di selezionare oggetti */
|
|
4028
|
-
this.
|
|
4031
|
+
this._Selection = input(null, { alias: "Selection" });
|
|
4032
|
+
this.Selection = signal(null);
|
|
4029
4033
|
/** Mostra o meno un messaggio di Loading al primo caricamento della tabella */
|
|
4030
|
-
this.ShowLoadingOnBootstrap = null;
|
|
4034
|
+
this.ShowLoadingOnBootstrap = input(null);
|
|
4031
4035
|
/** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */
|
|
4032
|
-
this.Removal = null;
|
|
4036
|
+
this.Removal = input(null);
|
|
4033
4037
|
/**
|
|
4034
4038
|
* Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata
|
|
4035
4039
|
*
|
|
4036
4040
|
* Come condizione si considera un semplice campo su cui effettuare un controllo booleano, come ad esempio "canremove"
|
|
4037
4041
|
*/
|
|
4038
|
-
this.RemovalCondition = '';
|
|
4042
|
+
this.RemovalCondition = input('');
|
|
4039
4043
|
/** Indica se abilitare la possibilità di esportare la vista dati attuale */
|
|
4040
|
-
this.
|
|
4044
|
+
this._Export = input(null, { alias: "Export" });
|
|
4045
|
+
this.Export = signal(null);
|
|
4041
4046
|
/** Indica se permettere la selezione multipla Windows-like cliccando un oggetto e facendo poi Shift + click su un oggetto successivo */
|
|
4042
|
-
this.
|
|
4047
|
+
this._ShiftClick = input(null, { alias: "ShiftClick" });
|
|
4048
|
+
this.ShiftClick = signal(null);
|
|
4043
4049
|
/** Indica il testo che va a sostituire "Oggetti Visualizzati" in caso si stia facendo qualcosa di custom */
|
|
4044
|
-
this.CountLabel = null;
|
|
4050
|
+
this.CountLabel = input(null);
|
|
4045
4051
|
/** Indica se nascondere o mostrare il componente di paginazione */
|
|
4046
|
-
this.
|
|
4052
|
+
this._HidePaging = input(null, { alias: "HidePaging" });
|
|
4053
|
+
this.HidePaging = signal(null);
|
|
4047
4054
|
/** Indica se nascondere o mostrare il conteggio degli elementi trovati */
|
|
4048
|
-
this.
|
|
4055
|
+
this._HidePagingCount = input(null, { alias: "HidePagingCount" });
|
|
4056
|
+
this.HidePagingCount = signal(null);
|
|
4049
4057
|
/** Indica se nascondere o mostrare i pulsanti di paginazione */
|
|
4050
|
-
this.
|
|
4058
|
+
this._HidePagingButtons = input(null, { alias: "HidePagingButtons" });
|
|
4059
|
+
this.HidePagingButtons = signal(null);
|
|
4051
4060
|
/** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */
|
|
4052
4061
|
this.ContextMenu = null;
|
|
4053
4062
|
/** Nome dell'esportazione generata da questa tabella */
|
|
4054
|
-
this.ExportFileName =
|
|
4063
|
+
this.ExportFileName = input("Export.csv");
|
|
4055
4064
|
/** Classe (HTML) di default della tabella */
|
|
4056
|
-
this.
|
|
4065
|
+
this._TableClass = input(null, { alias: "TableClass" });
|
|
4066
|
+
this.TableClass = signal(null);
|
|
4057
4067
|
/** Indica di esportare solo le colonne attualmente visibili della view */
|
|
4058
|
-
this.ExportOnlyVisibleColumns = false;
|
|
4068
|
+
this.ExportOnlyVisibleColumns = input(false);
|
|
4059
4069
|
/** @deprecated Indica la presenza di raggruppamenti a livello di header */
|
|
4060
|
-
this.HasHeaderGroup = null;
|
|
4070
|
+
this.HasHeaderGroup = input(null);
|
|
4061
4071
|
/** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
|
|
4062
|
-
this.HasSecondaryHeaderGroup = null;
|
|
4072
|
+
this.HasSecondaryHeaderGroup = input(null);
|
|
4063
4073
|
/** Indica se nascondere gli Header della tabella */
|
|
4064
|
-
this.HeaderHidden = null;
|
|
4074
|
+
this.HeaderHidden = input(null);
|
|
4065
4075
|
/** Indica se nascondere il Body della tabella */
|
|
4066
|
-
this.BodyHidden = null;
|
|
4076
|
+
this.BodyHidden = input(null);
|
|
4067
4077
|
/**
|
|
4068
4078
|
* Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,
|
|
4069
4079
|
* questo Input gestisce se questi input sono abilitati o meno
|
|
4070
4080
|
*/
|
|
4071
|
-
this.SelectionDisabled = null;
|
|
4081
|
+
this.SelectionDisabled = input(null);
|
|
4072
4082
|
/**
|
|
4073
4083
|
* Indica se forzare il sistema di selezione a gestire un elemento per volta.
|
|
4074
4084
|
* Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale
|
|
4075
4085
|
*/
|
|
4076
|
-
this.SingleSelection = null;
|
|
4086
|
+
this.SingleSelection = input(null);
|
|
4077
4087
|
/** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */
|
|
4078
4088
|
this.RowClassAssigner = null;
|
|
4079
4089
|
/** Permette di ordinare i dati in maniera discendente o ascendente */
|
|
4080
|
-
this.
|
|
4090
|
+
this._OrderByColumn = input(null, { alias: "OrderByColumn" });
|
|
4091
|
+
this.OrderByColumn = signal(null);
|
|
4081
4092
|
/** Permette di avere più direttive di ordinamento dei dati */
|
|
4082
|
-
this.MultipleOrderingDirectives = true;
|
|
4093
|
+
this.MultipleOrderingDirectives = input(true);
|
|
4083
4094
|
/** Permette di nascondere le colonne in base alle selezioni effettuate dal Menù contestuale in alto a destra */
|
|
4084
|
-
this.
|
|
4095
|
+
this._HiddenColumns = input(null, { alias: "HiddenColumns" });
|
|
4096
|
+
this.HiddenColumns = signal(null);
|
|
4085
4097
|
/** Permette di riordinare le colonne in base alle impostazioni effettuate dal Menù contestuale in alto a destra */
|
|
4086
|
-
this.
|
|
4098
|
+
this._ColumnsOrdering = input(null, { alias: "ColumnsOrdering" });
|
|
4099
|
+
this.ColumnsOrdering = signal(null);
|
|
4087
4100
|
/** @deprecated Eventuale supporto alle ricerche applicate alla modalità Array */
|
|
4088
|
-
this.SearchView = null;
|
|
4101
|
+
this.SearchView = input(null);
|
|
4089
4102
|
/** Abilita o disabilita il sistema che permette di selezionare tutti gli elementi nella vista */
|
|
4090
|
-
this.
|
|
4103
|
+
this._SelectAll = input(null, { alias: "SelectAll" });
|
|
4104
|
+
this.SelectAll = signal(null);
|
|
4091
4105
|
/** Simula la paginazione anche per le tabelle che funzionano in modalità Array */
|
|
4092
|
-
this.
|
|
4106
|
+
this._UseArrayModePaging = input(true, { alias: "UseArrayModePaging" });
|
|
4107
|
+
this.UseArrayModePaging = signal(true);
|
|
4093
4108
|
/** Definizione di colonne dinamche per la modalità, appunto, dinamica */
|
|
4094
|
-
this.
|
|
4109
|
+
this._DynamicRowColumnsDefinition = input(null, { alias: 'DynamicRowColumnsDefinition' });
|
|
4110
|
+
this.DynamicRowColumnsDefinition = signal(null);
|
|
4095
4111
|
/** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
|
|
4096
|
-
this.DynamicOperations = [];
|
|
4112
|
+
this.DynamicOperations = input([]);
|
|
4097
4113
|
/** Indica se visualizzare i dati in maniera gerarchica */
|
|
4098
|
-
this.Hierarchy = null;
|
|
4114
|
+
this.Hierarchy = input(null);
|
|
4099
4115
|
/** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */
|
|
4100
|
-
this.
|
|
4116
|
+
this._ParentKey = input('', { alias: "ParentKey" });
|
|
4117
|
+
this.ParentKey = signal('');
|
|
4101
4118
|
/** Nome della proprietà che contiene l'ID dell'oggetto attuale. Da utilizzare se **Hierarchy** è impostato */
|
|
4102
|
-
this.
|
|
4119
|
+
this._OwnKey = input('', { alias: "OwnKey" });
|
|
4120
|
+
this.OwnKey = signal('');
|
|
4103
4121
|
/** Indica se partire con un albero espanso. Da utilizzare se **Hierarchy** è impostato */
|
|
4104
|
-
this.StartsExpanded = true;
|
|
4122
|
+
this.StartsExpanded = input(true);
|
|
4105
4123
|
/** Indica se effettuare il salvataggio delle preferenze di ricerca */
|
|
4106
|
-
this.
|
|
4124
|
+
this._SavePreferences = input(null, { alias: "SavePreferences" });
|
|
4125
|
+
this.SavePreferences = signal(null);
|
|
4107
4126
|
/** Allineamento di default per celle e headers */
|
|
4108
|
-
this.
|
|
4127
|
+
this._DefaultAlignment = input(null, { alias: "DefaultAlignment" });
|
|
4128
|
+
this.DefaultAlignment = signal(null);
|
|
4109
4129
|
/** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
|
|
4110
|
-
this.
|
|
4130
|
+
this._PagingStyle = input(null, { alias: "PagingStyle" });
|
|
4131
|
+
this.PagingStyle = signal(null);
|
|
4111
4132
|
/** Indica dove visualizzare le informazioni di paginazione, se sopra, sotto o in entrambi */
|
|
4112
|
-
this.
|
|
4133
|
+
this._RowGroupingPagingStyle = input(null, { alias: "RowGroupingPagingStyle" });
|
|
4134
|
+
this.RowGroupingPagingStyle = signal(null);
|
|
4113
4135
|
/** Qualora per qualsiasi motivo non venisse usato **items** dell'AppSearch questo Input indica qual è il nome della proprietà da utilizzare */
|
|
4114
|
-
this.ItemSourceProperty =
|
|
4136
|
+
this.ItemSourceProperty = input('');
|
|
4115
4137
|
/** Indica se utilizzare la cache di selezione che permette di mantenere gli stati di selezione dei vari oggetti navigando da una pagina all'altra */
|
|
4116
|
-
this.
|
|
4138
|
+
this._UseSelectionCache = input(null, { alias: "UseSelectionCache" });
|
|
4139
|
+
this.UseSelectionCache = signal(null);
|
|
4117
4140
|
/** Permette di decidere se, in modalità raggruppamento, mostrare o meno il valore delle colonne di gruppo negli oggetti finali. Di default sono nascosti */
|
|
4118
|
-
this.
|
|
4141
|
+
this._ShowItemGroupsColumns = input(null, { alias: "ShowItemGroupsColumns" });
|
|
4142
|
+
this.ShowItemGroupsColumns = signal(null);
|
|
4119
4143
|
/** Indica che tutti i campi che definiscono le modalità di modifica campo possono essere modificati in base alle impostazioni */
|
|
4120
|
-
this.Editable = false;
|
|
4144
|
+
this.Editable = input(false);
|
|
4121
4145
|
/** Indica se è possibile effettuare selezioni a range per poi farci eventualmente copia incolla */
|
|
4122
|
-
this.RangeSelection = false;
|
|
4146
|
+
this.RangeSelection = input(false);
|
|
4123
4147
|
/** Indica il numero di millisecondi per cui debouncare il writeValue per la modalità **EsTableHandledSearch** */
|
|
4124
|
-
this.SearchThrottle = 50;
|
|
4148
|
+
this.SearchThrottle = input(50);
|
|
4125
4149
|
/** Evento che viene richiamato al cambio di oridnamento di una colonna */
|
|
4126
4150
|
this.onOrderChanged = new EventEmitter();
|
|
4127
4151
|
/**
|
|
@@ -4153,7 +4177,8 @@ class EsTableComponent {
|
|
|
4153
4177
|
/** Numero di pagine (durante la paginazione in modalità Array) */
|
|
4154
4178
|
this.arraymodePages = 1;
|
|
4155
4179
|
/** Oggetti per ogni pagina (durante la paginazione in modalità Array) */
|
|
4156
|
-
this.
|
|
4180
|
+
this._ArraymodeItemsPerPage = input(null, { alias: "ArraymodeItemsPerPage" });
|
|
4181
|
+
this.ArraymodeItemsPerPage = signal(null);
|
|
4157
4182
|
/** Colonne da visualizzare in modalità array */
|
|
4158
4183
|
this.arrayColumns = [];
|
|
4159
4184
|
/** Ordine delle colonne da visualizzare in modalità array */
|
|
@@ -4185,15 +4210,19 @@ class EsTableComponent {
|
|
|
4185
4210
|
/** Variabile d'appoggio per capire se c'è bisogno di ri-effettuare una ricerca o meno */
|
|
4186
4211
|
this.ResearchNeeded = false;
|
|
4187
4212
|
/** Colonne visibili della vista attuale. Valorizzato di default al numero massimo di colonne supportate dalla tabella per le casistiche in assenza di custom cells */
|
|
4188
|
-
this.Columns = { Visibile: 100, VisibleUnpinned: 100, Global: 100 };
|
|
4213
|
+
this.Columns = signal({ Visibile: 100, VisibleUnpinned: 100, Global: 100 });
|
|
4189
4214
|
/** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */
|
|
4190
4215
|
this.MainGroupView = null;
|
|
4191
4216
|
/** Conteggio base degli oggetti. In modalità normale viene resettato ad ogni nuova View inserita, in modalità RowGrouping viene resettato solo ad una nuova View di livello "0" */
|
|
4192
4217
|
this.BaseItemsCount = null;
|
|
4218
|
+
/** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/
|
|
4219
|
+
this.HasPinnedColumns = signal(null);
|
|
4220
|
+
/** Larghezza calcolata del container delle colonne pinnate */
|
|
4221
|
+
this.PinnedContainerWidth = signal(null);
|
|
4193
4222
|
/** Indica se nonostante siamo in modalità array sono stati individuati dei gruppi. In tal caso es-table si comporta da pseudo backend ed effettua le aggregazioni e raggruppamenti completamente lato client */
|
|
4194
|
-
this.ArrayGrouping = false;
|
|
4223
|
+
this.ArrayGrouping = signal(false);
|
|
4195
4224
|
/** Indica che l'es-table è basata sulle direttive (nuova modalità) */
|
|
4196
|
-
this.DirectivesBased = false;
|
|
4225
|
+
this.DirectivesBased = signal(false);
|
|
4197
4226
|
/** Indica lo stato di selezione per singola cella */
|
|
4198
4227
|
this.selectionStatus = {};
|
|
4199
4228
|
/** Chiamata reale al writeValue dopo il passaggio di **SearchThrottle** millisecondi. Solo modalità EsTableHandledSearch */
|
|
@@ -4230,6 +4259,19 @@ class EsTableComponent {
|
|
|
4230
4259
|
this.firstCoordinates = null;
|
|
4231
4260
|
//* Piango
|
|
4232
4261
|
this.EsTdsCache = {};
|
|
4262
|
+
effect(() => {
|
|
4263
|
+
if (this.SearchView())
|
|
4264
|
+
this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.SearchView().page, this.SearchView().pages || 1, this.SearchView().objectcount || this.SearchView().items.length, this.SearchView().itemsperpageoverride));
|
|
4265
|
+
});
|
|
4266
|
+
// Sarebbe bello... per quando View diventa signal
|
|
4267
|
+
/*effect(() => {
|
|
4268
|
+
|
|
4269
|
+
if (this.View) {
|
|
4270
|
+
let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;
|
|
4271
|
+
if (firstItemGroupOrNoGrouping)
|
|
4272
|
+
this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));
|
|
4273
|
+
}
|
|
4274
|
+
})*/
|
|
4233
4275
|
// Copia e incolla si effettuano solo se la tabella attuale è univocamente selezionata
|
|
4234
4276
|
this.copySubscription = this.copyPasteDetector.OnCopy.subscribe(() => { if (this.copyPasteDetector.ActiveEstReference == this)
|
|
4235
4277
|
this.handleCopy(); });
|
|
@@ -4262,24 +4304,33 @@ class EsTableComponent {
|
|
|
4262
4304
|
this.onSelectionChanged.emit(itemSelection);
|
|
4263
4305
|
});
|
|
4264
4306
|
// Assegnazione per tutti gli Input di default
|
|
4265
|
-
this.ColumnsResizable
|
|
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
|
|
4307
|
+
this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));
|
|
4308
|
+
this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));
|
|
4309
|
+
this.AllSearch.set(this.utilities_H.InputOrDefault(this._AllSearch(), this.deafults?.AllSearch, true));
|
|
4310
|
+
this.Export.set(this.utilities_H.InputOrDefault(this._Export(), this.deafults?.Export));
|
|
4311
|
+
this.HidePaging.set(this.utilities_H.InputOrDefault(this._HidePaging(), this.deafults?.HidePaging, false));
|
|
4312
|
+
this.HidePagingCount.set(this.utilities_H.InputOrDefault(this._HidePagingCount(), this.deafults?.HidePagingCount));
|
|
4313
|
+
this.HidePagingButtons.set(this.utilities_H.InputOrDefault(this._HidePagingButtons(), this.deafults?.HidePagingButtons));
|
|
4314
|
+
this.ContainerClass.set(this.utilities_H.InputOrDefault(this._ContainerClass(), this.deafults?.ContainerClass, ''));
|
|
4315
|
+
this.TableClass.set(this.utilities_H.InputOrDefault(this._TableClass(), this.deafults?.TableClass, 'table table-striped table-hover table-sm'));
|
|
4316
|
+
this.Selection.set(this.utilities_H.InputOrDefault(this._Selection(), this.deafults?.Selection));
|
|
4317
|
+
this.SavePreferences.set(this.utilities_H.InputOrDefault(this._SavePreferences(), this.deafults?.SavePreferences));
|
|
4318
|
+
this.PagingStyle.set(this.utilities_H.InputOrDefault(this._PagingStyle(), this.deafults?.PagingStyle, 'bottom'));
|
|
4319
|
+
this.RowGroupingPagingStyle.set(this.utilities_H.InputOrDefault(this._RowGroupingPagingStyle(), this.deafults?.RowGroupingPagingStyle, 'left'));
|
|
4320
|
+
this.UseSelectionCache.set(this.utilities_H.InputOrDefault(this._UseSelectionCache(), this.deafults?.UseSelectionCache, true));
|
|
4321
|
+
this.ShowItemGroupsColumns.set(this.utilities_H.InputOrDefault(this._ShowItemGroupsColumns(), this.deafults?.ShowItemGroupsColumns, false));
|
|
4322
|
+
this.ArraymodeItemsPerPage.set(this.utilities_H.InputOrDefault(this._ArraymodeItemsPerPage(), this.deafults?.ArraymodeItemsPerPage, 15));
|
|
4323
|
+
this.ColumnsPinnable.set(this.utilities_H.InputOrDefault(this._ColumnsPinnable(), this.deafults?.ColumnsPinnable, true));
|
|
4324
|
+
this.DefaultAlignment.set(this.utilities_H.InputOrDefault(this._DefaultAlignment(), this.deafults?.DefaultAlignment, 'Left'));
|
|
4325
|
+
this.HiddenColumns.set(this.utilities_H.InputOrDefault(this._HiddenColumns(), null));
|
|
4326
|
+
this.ColumnsOrdering.set(this.utilities_H.InputOrDefault(this._ColumnsOrdering(), null));
|
|
4327
|
+
this.OrderByColumn.set(this.utilities_H.InputOrDefault(this._OrderByColumn(), null));
|
|
4328
|
+
this.SelectAll.set(this.utilities_H.InputOrDefault(this._SelectAll(), null));
|
|
4329
|
+
this.ShiftClick.set(this.utilities_H.InputOrDefault(this._ShiftClick(), null));
|
|
4330
|
+
this.UseArrayModePaging.set(this.utilities_H.InputOrDefault(this._UseArrayModePaging(), true));
|
|
4331
|
+
this.OwnKey.set(this.utilities_H.InputOrDefault(this._OwnKey(), ''));
|
|
4332
|
+
this.ParentKey.set(this.utilities_H.InputOrDefault(this._ParentKey(), ''));
|
|
4333
|
+
this.DynamicRowColumnsDefinition.set(this.utilities_H.InputOrDefault(this._DynamicRowColumnsDefinition(), null));
|
|
4283
4334
|
}
|
|
4284
4335
|
/** @ignore */
|
|
4285
4336
|
async ngAfterViewInit() {
|
|
@@ -4296,23 +4347,23 @@ class EsTableComponent {
|
|
|
4296
4347
|
let usesThsAndTdsDirectives = this.EsTds?.length > 0 && this.EsThs?.length > 0;
|
|
4297
4348
|
let hasNoContentProjection = !this.bodyRef && !this.headerRef && !this.headerGroupRef && !this.secondaryHeaderGroupRef;
|
|
4298
4349
|
if (usesThsAndTdsDirectives || hasNoContentProjection) {
|
|
4299
|
-
if (this.UseCustomCells == null)
|
|
4300
|
-
this.UseCustomCells
|
|
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
|
|
4350
|
+
if (this.UseCustomCells() == null)
|
|
4351
|
+
this.UseCustomCells.set(true);
|
|
4352
|
+
if (this.HiddenColumns() == null && this.UseCustomCells)
|
|
4353
|
+
this.HiddenColumns.set(true);
|
|
4354
|
+
if (this.ColumnsOrdering() == null && this.UseCustomCells)
|
|
4355
|
+
this.ColumnsOrdering.set(true);
|
|
4356
|
+
if (this.OrderByColumn() == null && this.UseCustomCells)
|
|
4357
|
+
this.OrderByColumn.set(true);
|
|
4358
|
+
if (this.SelectAll() == null && this.Selection)
|
|
4359
|
+
this.SelectAll.set(true);
|
|
4360
|
+
if (this.ShiftClick() == null && this.Selection)
|
|
4361
|
+
this.ShiftClick.set(true);
|
|
4362
|
+
this.DirectivesBased.set(true);
|
|
4312
4363
|
}
|
|
4313
4364
|
//Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,
|
|
4314
4365
|
//che con solo la proiezione (senza celle cusotm) non è disponibile
|
|
4315
|
-
if (this.Hierarchy && !this.UseCustomCells)
|
|
4366
|
+
if (this.Hierarchy() && !this.UseCustomCells())
|
|
4316
4367
|
throw "Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\"true\" è richiesto anche [UseCustomCells]=\"true\"";
|
|
4317
4368
|
}
|
|
4318
4369
|
/** @ignore */
|
|
@@ -4325,12 +4376,8 @@ class EsTableComponent {
|
|
|
4325
4376
|
this.ctxMenuSubscription.unsubscribe();
|
|
4326
4377
|
if (this.copyPasteDetector.ActiveEstReference == this)
|
|
4327
4378
|
this.copyPasteDetector.ActiveEstReference = null;
|
|
4328
|
-
|
|
4329
|
-
|
|
4330
|
-
async ngOnChanges(changes) {
|
|
4331
|
-
let newSearchView = changes['SearchView'];
|
|
4332
|
-
if (newSearchView && this.SearchView)
|
|
4333
|
-
this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.objectcount, this.SearchView.itemsperpageoverride);
|
|
4379
|
+
this._destroyed$.next();
|
|
4380
|
+
this._destroyed$.complete();
|
|
4334
4381
|
}
|
|
4335
4382
|
/** @ignore */
|
|
4336
4383
|
registerOnChange(fn) { this.propagateChange = fn; }
|
|
@@ -4338,28 +4385,28 @@ class EsTableComponent {
|
|
|
4338
4385
|
registerOnTouched(fn) { }
|
|
4339
4386
|
/** @ignore */
|
|
4340
4387
|
changed(clearItems = false) {
|
|
4341
|
-
if (clearItems && this.viewMode) {
|
|
4388
|
+
if (clearItems && this.viewMode()) {
|
|
4342
4389
|
if (!this.ItemSourceProperty)
|
|
4343
4390
|
this.View.items = [];
|
|
4344
4391
|
else
|
|
4345
|
-
this.View[this.ItemSourceProperty] = [];
|
|
4392
|
+
this.View[this.ItemSourceProperty()] = [];
|
|
4346
4393
|
}
|
|
4347
4394
|
this.propagateChange(this.View);
|
|
4348
4395
|
}
|
|
4349
4396
|
/** @ignore */
|
|
4350
4397
|
async writeValue(obj, throttle = true) {
|
|
4351
4398
|
this.View = obj ? obj : null;
|
|
4352
|
-
if (this.EsTableHandledSearch && throttle) {
|
|
4399
|
+
if (this.EsTableHandledSearch() && throttle) {
|
|
4353
4400
|
if (this.callTimeout)
|
|
4354
4401
|
clearTimeout(this.callTimeout);
|
|
4355
|
-
this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle);
|
|
4402
|
+
this.callTimeout = setTimeout(() => { this.writeValue(obj, false); }, this.SearchThrottle());
|
|
4356
4403
|
return;
|
|
4357
4404
|
}
|
|
4358
4405
|
// Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress
|
|
4359
|
-
this.researchInProgress
|
|
4360
|
-
if (!this.View && !this.SearchView) {
|
|
4406
|
+
this.researchInProgress.set(false);
|
|
4407
|
+
if (!this.View && !this.SearchView()) {
|
|
4361
4408
|
// Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla
|
|
4362
|
-
this.boundSource
|
|
4409
|
+
this.boundSource.set(this.TMPBoundSource || []);
|
|
4363
4410
|
// Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
|
|
4364
4411
|
this.cdr.markForCheck();
|
|
4365
4412
|
return;
|
|
@@ -4368,23 +4415,23 @@ class EsTableComponent {
|
|
|
4368
4415
|
// lo correggo--------------------------------------------------------------------------------------------------------------
|
|
4369
4416
|
if (this.View && typeof this.View.itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))
|
|
4370
4417
|
this.View.__proto__ = new AppSearch();
|
|
4371
|
-
else if (this.SearchView && typeof this.SearchView.itemsperpageoverride != 'undefined' && !(this.SearchView instanceof AppSearch))
|
|
4372
|
-
this.SearchView.__proto__ = new AppSearch();
|
|
4418
|
+
else if (this.SearchView() && typeof this.SearchView().itemsperpageoverride != 'undefined' && !(this.SearchView() instanceof AppSearch))
|
|
4419
|
+
this.SearchView().__proto__ = new AppSearch();
|
|
4373
4420
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
4374
4421
|
if (this.View && this.View instanceof AppSearch) {
|
|
4375
4422
|
// Se cambia l'oggetto intero significa che ho rimandato la ricerca
|
|
4376
4423
|
this.setMode('view');
|
|
4377
4424
|
let firstItemGroupOrNoGrouping = (this.View.requestedgroups?.length || 0) == 0;
|
|
4378
4425
|
// Queste sono item source custom. Le valorizzo al default se non esistono
|
|
4379
|
-
if (this.ItemSourceProperty && !this.View[this.ItemSourceProperty])
|
|
4380
|
-
this.View[this.ItemSourceProperty] = [];
|
|
4426
|
+
if (this.ItemSourceProperty() && !this.View[this.ItemSourceProperty()])
|
|
4427
|
+
this.View[this.ItemSourceProperty()] = [];
|
|
4381
4428
|
// Se vengo da una ricerca interna mantengo lo stato di selezione precedente (quindi su cambio pagina, cambio ipp, ecc...)
|
|
4382
4429
|
// se invece l'utente ha fatto una ricerca lui (quindi cambiando filtri), secco le info di selezione
|
|
4383
|
-
if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache)
|
|
4430
|
+
if (!this.View.selection || (!this.View.internalsearchrequest && firstItemGroupOrNoGrouping) || !this.UseSelectionCache())
|
|
4384
4431
|
this.resetSelection(true);
|
|
4385
4432
|
this.View.internalsearchrequest = false;
|
|
4386
4433
|
// Recupero Preference
|
|
4387
|
-
if (this.SavePreferences) {
|
|
4434
|
+
if (this.SavePreferences()) {
|
|
4388
4435
|
if (!this.ngControl.name)
|
|
4389
4436
|
console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
|
|
4390
4437
|
else if (!this.prefService)
|
|
@@ -4435,16 +4482,15 @@ class EsTableComponent {
|
|
|
4435
4482
|
}
|
|
4436
4483
|
}
|
|
4437
4484
|
}
|
|
4438
|
-
// La paginazione devo farla solamente quando richiedo o un gruppo principale (se sono in row grouping) o se non richiedo gruppi (in tutti lgi altri casi)
|
|
4439
4485
|
if (firstItemGroupOrNoGrouping)
|
|
4440
|
-
this.arrayPulsanti
|
|
4486
|
+
this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.View.page, this.View.pages || 1, (this.ItemSourceProperty() ? this.View[this.ItemSourceProperty()] : this.View.items).length, this.View.itemsperpageoverride));
|
|
4441
4487
|
}
|
|
4442
4488
|
else if (this.View && (this.View.length != null && this.View.length != undefined)) {
|
|
4443
4489
|
this.setMode('array');
|
|
4444
|
-
if (!this.UseSelectionCache || !this.arraymodeSelection)
|
|
4490
|
+
if (!this.UseSelectionCache() || !this.arraymodeSelection)
|
|
4445
4491
|
this.resetSelection(true);
|
|
4446
4492
|
// Recupero Preference
|
|
4447
|
-
if (this.SavePreferences) {
|
|
4493
|
+
if (this.SavePreferences()) {
|
|
4448
4494
|
if (!this.ngControl.name)
|
|
4449
4495
|
console.error("Non posso utilizzare le preference senza avere un 'name' per questa tabella");
|
|
4450
4496
|
else if (!this.prefService)
|
|
@@ -4484,17 +4530,15 @@ class EsTableComponent {
|
|
|
4484
4530
|
}
|
|
4485
4531
|
}
|
|
4486
4532
|
}
|
|
4487
|
-
if (this.SearchView)
|
|
4488
|
-
this.arrayPulsanti = this.utilities_H.getPagesArray(6, this.SearchView.page, this.SearchView.pages || 1, this.SearchView.items.length, this.SearchView.itemsperpageoverride);
|
|
4489
4533
|
}
|
|
4490
4534
|
this.finalizeContext();
|
|
4491
4535
|
this.postBoundSourceCalculation();
|
|
4492
|
-
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch && !this.View.firstsearch) {
|
|
4536
|
+
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch() && !this.View.firstsearch) {
|
|
4493
4537
|
this.View.selfsearch = true;
|
|
4494
4538
|
this.changed(true);
|
|
4495
4539
|
this.onSearchRequest.emit(false);
|
|
4496
4540
|
}
|
|
4497
|
-
else if (this.View && this.View.selfsearch && this.EsTableHandledSearch) {
|
|
4541
|
+
else if (this.View && this.View.selfsearch && this.EsTableHandledSearch()) {
|
|
4498
4542
|
this.View.selfsearch = false;
|
|
4499
4543
|
this.changed();
|
|
4500
4544
|
}
|
|
@@ -4505,54 +4549,54 @@ class EsTableComponent {
|
|
|
4505
4549
|
*/
|
|
4506
4550
|
finalizeContext() {
|
|
4507
4551
|
let viewCasted = this.View;
|
|
4508
|
-
let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode && this.EsThsDirective.some(t => t.thGroup));
|
|
4552
|
+
let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective.some(t => t.thGroup));
|
|
4509
4553
|
// Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
|
|
4510
|
-
if (this.arrayMode && hasRowGroups)
|
|
4511
|
-
this.UseArrayModePaging
|
|
4554
|
+
if (this.arrayMode() && hasRowGroups)
|
|
4555
|
+
this.UseArrayModePaging.set(false);
|
|
4512
4556
|
// Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia
|
|
4513
4557
|
this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);
|
|
4514
4558
|
// Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource
|
|
4515
|
-
if (this.Hierarchy && !hasRowGroups)
|
|
4559
|
+
if (this.Hierarchy() && !hasRowGroups)
|
|
4516
4560
|
this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);
|
|
4517
4561
|
// L'hashing degli oggetti lo faccio a prescindere
|
|
4518
4562
|
this.utilities_H.calculateHash(this.TMPBoundSource);
|
|
4519
4563
|
// Assegno a una variabile mia l'eventuale override per la classe della riga
|
|
4520
4564
|
// Se poi sono in modalità gerarchica inietto anche la classe per la configurazione del livello della riga
|
|
4521
|
-
if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy) {
|
|
4565
|
+
if ((this.TMPBoundSource && this.RowClassAssigner) || this.Hierarchy()) {
|
|
4522
4566
|
for (let i = 0; i < this.TMPBoundSource.length; i++) {
|
|
4523
4567
|
let item = this.TMPBoundSource[i];
|
|
4524
|
-
item._rowClass = this.RowClassAssigner
|
|
4525
|
-
item._rowClass += this.Hierarchy ? " est-row-lvl-" + item._level : "";
|
|
4568
|
+
item._rowClass = this.RowClassAssigner?.(item) || "";
|
|
4569
|
+
item._rowClass += this.Hierarchy() ? " est-row-lvl-" + item._level : "";
|
|
4526
4570
|
}
|
|
4527
4571
|
}
|
|
4528
4572
|
}
|
|
4529
4573
|
/** Genera le informzioni di paginazione per la vista globale dell'es-table */
|
|
4530
4574
|
setupPagingInformations() {
|
|
4531
4575
|
// Default che valgono di base, poi eventualmente moddati dalle funzioni sotto
|
|
4532
|
-
this.PagerOptions.ShowCount = !this.HidePagingCount;
|
|
4533
|
-
this.PagerOptions.ShowButtons = !this.HidePagingButtons;
|
|
4534
|
-
this.PagerOptions.ShowPaging = !this.HidePaging;
|
|
4576
|
+
this.PagerOptions.ShowCount = !this.HidePagingCount();
|
|
4577
|
+
this.PagerOptions.ShowButtons = !this.HidePagingButtons();
|
|
4578
|
+
this.PagerOptions.ShowPaging = !this.HidePaging();
|
|
4535
4579
|
this.PagerOptions.UsesView = true;
|
|
4536
|
-
if (this.arrayMode && this.UseArrayModePaging && !this.SearchView) {
|
|
4580
|
+
if (this.arrayMode() && this.UseArrayModePaging() && !this.SearchView()) {
|
|
4537
4581
|
this.PagerOptions.PagerCount = this.View.length || 0;
|
|
4538
4582
|
this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && this.View.length > 10;
|
|
4539
4583
|
this.PagerOptions.View = this.View;
|
|
4540
4584
|
this.PagerOptions.UsesView = false;
|
|
4541
4585
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
4542
4586
|
}
|
|
4543
|
-
else if (this.arrayMode && (!this.UseArrayModePaging || this.SearchView)) {
|
|
4544
|
-
if (this.SearchView) {
|
|
4545
|
-
this.PagerOptions.View = this.SearchView;
|
|
4546
|
-
this.PagerOptions.PagerCount = this.SearchView.objectcount || 0;
|
|
4587
|
+
else if (this.arrayMode() && (!this.UseArrayModePaging() || this.SearchView())) {
|
|
4588
|
+
if (this.SearchView()) {
|
|
4589
|
+
this.PagerOptions.View = this.SearchView();
|
|
4590
|
+
this.PagerOptions.PagerCount = this.SearchView().objectcount || 0;
|
|
4547
4591
|
}
|
|
4548
4592
|
else
|
|
4549
4593
|
this.PagerOptions.PagerCount = this.View.length || 0;
|
|
4550
|
-
this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (this.SearchView?.objectcount || 0) > 10);
|
|
4551
|
-
this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView && this.SearchView.objectcount && this.SearchView.objectcount != -1);
|
|
4594
|
+
this.PagerOptions.ShowButtons = this.PagerOptions.ShowButtons && (this.View.length > 10 || (this.SearchView()?.objectcount || 0) > 10);
|
|
4595
|
+
this.PagerOptions.ShowCount = this.PagerOptions.ShowCount || (this.View && this.View.length) || (this.SearchView() && this.SearchView().objectcount && this.SearchView().objectcount != -1);
|
|
4552
4596
|
this.PagerOptions.ShowPaging = this.PagerOptions.ShowPaging && (this.PagerOptions.ShowButtons || this.PagerOptions.ShowCount);
|
|
4553
4597
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
4554
4598
|
}
|
|
4555
|
-
else if (this.viewMode) {
|
|
4599
|
+
else if (this.viewMode()) {
|
|
4556
4600
|
let tmpView = this.MainGroupView || this.View;
|
|
4557
4601
|
let count = tmpView?.groupcount || tmpView?.objectcount;
|
|
4558
4602
|
this.PagerOptions.Searches = tmpView?.groupcount != null && tmpView?.groupcount != undefined ? 'groups' : 'items';
|
|
@@ -4587,21 +4631,21 @@ class EsTableComponent {
|
|
|
4587
4631
|
// Questo dev'essere per forza lanciato dopo **bindDisplayToLoadedItemsOrGroups** dato che è lì che alcune cose vengono valorizzate
|
|
4588
4632
|
this.setupPagingInformations();
|
|
4589
4633
|
// Molte cose sono ovviamente disponibili solo in modalità View
|
|
4590
|
-
if ((this.viewMode || this.arrayMode) && this.UseCustomCells) {
|
|
4591
|
-
let view = this.viewMode ? View : null;
|
|
4592
|
-
let itemsAndGroups = this.viewMode ? [...((this.ItemSourceProperty ? view[this.ItemSourceProperty] : view.items) || []), ...(view.groups || [])] : View;
|
|
4593
|
-
let si = this.viewMode ? view.selection : this.arraymodeSelection;
|
|
4634
|
+
if ((this.viewMode() || this.arrayMode()) && this.UseCustomCells()) {
|
|
4635
|
+
let view = this.viewMode() ? View : null;
|
|
4636
|
+
let itemsAndGroups = this.viewMode() ? [...((this.ItemSourceProperty() ? view[this.ItemSourceProperty()] : view.items) || []), ...(view.groups || [])] : View;
|
|
4637
|
+
let si = this.viewMode() ? view.selection : this.arraymodeSelection;
|
|
4594
4638
|
// N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE
|
|
4595
4639
|
// ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************
|
|
4596
4640
|
// Se ho definizioni dinamiche, prima di qualsiasi altra cosa devo trasformarle in th/td in modo che poi il codice qui sotto faccia le sue magie
|
|
4597
|
-
if (this.DynamicRowColumnsDefinition?.length > 0) {
|
|
4641
|
+
if ((this.DynamicRowColumnsDefinition()?.length || 0) > 0) {
|
|
4598
4642
|
this.logger.log("Generating ths and tds from Dynamic definition");
|
|
4599
4643
|
let ret = this.dynamicMode_H.emitThsAndTdsBasedOnDynamicDefinition();
|
|
4600
4644
|
this.EsThs = ret.ths;
|
|
4601
4645
|
this.EsTds = ret.tds;
|
|
4602
4646
|
}
|
|
4603
4647
|
// Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view
|
|
4604
|
-
if (!this.arrayMode && view.report_columns) {
|
|
4648
|
+
if (!this.arrayMode() && view.report_columns) {
|
|
4605
4649
|
this.logger.log("Generating ths and tds from report results");
|
|
4606
4650
|
let ret = this.reportMode_H.generateThsAndTdsFromView(view);
|
|
4607
4651
|
this.EsThs = ret.ths;
|
|
@@ -4620,8 +4664,8 @@ class EsTableComponent {
|
|
|
4620
4664
|
// Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
|
|
4621
4665
|
let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);
|
|
4622
4666
|
// Valuta lo stato iniziale di selezione a range
|
|
4623
|
-
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition);
|
|
4624
|
-
if (this.arrayMode) // In modalità array non ho un backend...
|
|
4667
|
+
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, this.DynamicRowColumnsDefinition());
|
|
4668
|
+
if (this.arrayMode()) // In modalità array non ho un backend...
|
|
4625
4669
|
this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client
|
|
4626
4670
|
this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc
|
|
4627
4671
|
this.columnMetadata_H.alignColumnsIfLoadedView(view); // Se sto caricando una View da hotpotato (quindi con savedstate = true) riallineo la visibilità delle colonne e il loro ordine.
|
|
@@ -4644,15 +4688,15 @@ class EsTableComponent {
|
|
|
4644
4688
|
this.ResearchNeeded = false;
|
|
4645
4689
|
}
|
|
4646
4690
|
}
|
|
4647
|
-
else if ((this.viewMode || this.arrayMode) && !this.UseCustomCells) {
|
|
4691
|
+
else if ((this.viewMode() || this.arrayMode()) && !this.UseCustomCells()) {
|
|
4648
4692
|
// Riallineo le info di selezione degli elementi della View
|
|
4649
|
-
let items = this.viewMode ? (this.ItemSourceProperty ? View[this.ItemSourceProperty] : View.items) : View;
|
|
4650
|
-
let si = this.viewMode ? View.selection : this.arraymodeSelection;
|
|
4693
|
+
let items = this.viewMode() ? (this.ItemSourceProperty() ? View[this.ItemSourceProperty()] : View.items) : View;
|
|
4694
|
+
let si = this.viewMode() ? View.selection : this.arraymodeSelection;
|
|
4651
4695
|
this.selection_H.evaluateSelection(items, si);
|
|
4652
4696
|
}
|
|
4653
4697
|
// Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
|
|
4654
4698
|
this.cdr.markForCheck();
|
|
4655
|
-
this.FirstBind
|
|
4699
|
+
this.FirstBind.set(false);
|
|
4656
4700
|
}
|
|
4657
4701
|
/**
|
|
4658
4702
|
* Effettua il binding degli oggetti pervenuti da questa chiamata con gli oggetti effettivamente da graficare
|
|
@@ -4662,17 +4706,17 @@ class EsTableComponent {
|
|
|
4662
4706
|
bindDisplayToLoadedItemsOrGroups(view) {
|
|
4663
4707
|
if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {
|
|
4664
4708
|
this.BaseItemsCount = 0;
|
|
4665
|
-
this.boundSource
|
|
4709
|
+
this.boundSource.set([]);
|
|
4666
4710
|
return;
|
|
4667
4711
|
}
|
|
4668
|
-
if (this.arrayMode || !this.UseCustomCells) {
|
|
4669
|
-
this.boundSource
|
|
4712
|
+
if (this.arrayMode() || !this.UseCustomCells()) {
|
|
4713
|
+
this.boundSource.set(this.TMPBoundSource);
|
|
4670
4714
|
this.BaseItemsCount = view?.objectcount || view?.length || 0;
|
|
4671
4715
|
return;
|
|
4672
4716
|
}
|
|
4673
4717
|
let groupingKeys = view?.groupings?.filter(t => !t.aggregation)?.length || 0;
|
|
4674
4718
|
if (groupingKeys == 0) {
|
|
4675
|
-
this.boundSource
|
|
4719
|
+
this.boundSource.set(this.TMPBoundSource);
|
|
4676
4720
|
this.BaseItemsCount = view?.objectcount || 0;
|
|
4677
4721
|
return;
|
|
4678
4722
|
}
|
|
@@ -4683,10 +4727,12 @@ class EsTableComponent {
|
|
|
4683
4727
|
this.RowTDs = this.TMPRowTDs;
|
|
4684
4728
|
this.RowTHs = this.TMPRowTHs;
|
|
4685
4729
|
this.RowThGroups = this.TMPRowThGroups ? this.TMPRowThGroups.reverse() : null;
|
|
4686
|
-
this.EmptyRowTds
|
|
4687
|
-
|
|
4688
|
-
|
|
4689
|
-
|
|
4730
|
+
this.EmptyRowTds.set(this.isEmpty(this.RowTDs));
|
|
4731
|
+
let vis = this.RowTHs.filter(t => t.Visible).length;
|
|
4732
|
+
let visUnpinned = this.RowTHs.filter(t => t.Visible && !t.Pinned).length;
|
|
4733
|
+
let global = visUnpinned + (this.HasPinnedColumns() ? 1 : 0) + (this.Selection() ? 1 : 0) + (this.Removal() ? 1 : 0) + (this.Export() || this.HiddenColumns() || this.ColumnsOrdering() || this.CornerMenuOptions() ? 1 : 0);
|
|
4734
|
+
let newValue = { Visibile: vis, VisibleUnpinned: visUnpinned, Global: global };
|
|
4735
|
+
this.Columns.set(newValue);
|
|
4690
4736
|
}
|
|
4691
4737
|
/**
|
|
4692
4738
|
* Metodo per capire se un oggetto è completamente vuoto
|
|
@@ -4709,7 +4755,7 @@ class EsTableComponent {
|
|
|
4709
4755
|
*/
|
|
4710
4756
|
setSelectionStatus(items, all, select, emit = false) {
|
|
4711
4757
|
if (all) {
|
|
4712
|
-
if (!this.SelectAll) {
|
|
4758
|
+
if (!this.SelectAll()) {
|
|
4713
4759
|
console.error("Impossibile impostare la selezione con l'all selection quando l'Input SelectAll è false");
|
|
4714
4760
|
return;
|
|
4715
4761
|
}
|
|
@@ -4729,12 +4775,12 @@ class EsTableComponent {
|
|
|
4729
4775
|
*/
|
|
4730
4776
|
resetSelection(emit = false) {
|
|
4731
4777
|
this.selection_H.clearSelectionCaches();
|
|
4732
|
-
if (this.viewMode && this.View) {
|
|
4778
|
+
if (this.viewMode() && this.View) {
|
|
4733
4779
|
this.View.selection = new ItemsSelection([]);
|
|
4734
4780
|
if (emit)
|
|
4735
4781
|
this.onSelectionChanged.emit(this.View.selection);
|
|
4736
4782
|
}
|
|
4737
|
-
else if (this.arrayMode) {
|
|
4783
|
+
else if (this.arrayMode()) {
|
|
4738
4784
|
this.arraymodeSelection = new ItemsSelection([]);
|
|
4739
4785
|
if (emit)
|
|
4740
4786
|
this.onSelectionChanged.emit(this.arraymodeSelection);
|
|
@@ -4747,11 +4793,11 @@ class EsTableComponent {
|
|
|
4747
4793
|
* @param {'DESC' | 'ASC'} order Nuovo ordine selezionato per la colonna
|
|
4748
4794
|
*/
|
|
4749
4795
|
thOrderChanged(id, order) {
|
|
4750
|
-
if (!this.viewMode && !this.arrayMode) {
|
|
4796
|
+
if (!this.viewMode() && !this.arrayMode()) {
|
|
4751
4797
|
console.warn('Order changed on a table not in viewMode or Array mode. Operation not supported');
|
|
4752
4798
|
return;
|
|
4753
4799
|
}
|
|
4754
|
-
if (!this.OrderByColumn)
|
|
4800
|
+
if (!this.OrderByColumn())
|
|
4755
4801
|
return;
|
|
4756
4802
|
this.columnMetadata_H.handleTHOrderChange(id, order);
|
|
4757
4803
|
}
|
|
@@ -4762,7 +4808,7 @@ class EsTableComponent {
|
|
|
4762
4808
|
* @param {AppSearch<any>} viewOverride Override della view da emettere per questa ricerca
|
|
4763
4809
|
*/
|
|
4764
4810
|
emitSearchRequest(resetsPage, viewOverride) {
|
|
4765
|
-
if (this.viewMode && !viewOverride) {
|
|
4811
|
+
if (this.viewMode() && !viewOverride) {
|
|
4766
4812
|
this.View.internalsearchrequest = true;
|
|
4767
4813
|
this.changed();
|
|
4768
4814
|
}
|
|
@@ -4771,8 +4817,8 @@ class EsTableComponent {
|
|
|
4771
4817
|
viewOverride.page = 1;
|
|
4772
4818
|
viewOverride.internalsearchrequest = true;
|
|
4773
4819
|
}
|
|
4774
|
-
this.researchInProgress
|
|
4775
|
-
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch) {
|
|
4820
|
+
this.researchInProgress.set(true);
|
|
4821
|
+
if (this.View && !this.View.selfsearch && this.EsTableHandledSearch()) {
|
|
4776
4822
|
this.View.selfsearch = true;
|
|
4777
4823
|
this.changed(true);
|
|
4778
4824
|
this.onSearchRequest.emit(false);
|
|
@@ -4803,8 +4849,9 @@ class EsTableComponent {
|
|
|
4803
4849
|
let contextFixeds = {};
|
|
4804
4850
|
for (let i = 0; i < tds.length; i++) {
|
|
4805
4851
|
let td = tds[i];
|
|
4806
|
-
|
|
4807
|
-
|
|
4852
|
+
let bs = this.boundSource();
|
|
4853
|
+
for (let i = 0; i < bs.length; i++) {
|
|
4854
|
+
let item = bs[i];
|
|
4808
4855
|
let ctx = item._hash;
|
|
4809
4856
|
let key = td.td;
|
|
4810
4857
|
let th = this.thsCache[td.td];
|
|
@@ -4835,7 +4882,7 @@ class EsTableComponent {
|
|
|
4835
4882
|
Multi: td._multi,
|
|
4836
4883
|
MultiProp: td._multi ? td.td.split('_')[0] : null,
|
|
4837
4884
|
MultiIndex: td._multi ? td.td.split('_')[1] : null,
|
|
4838
|
-
Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment).toLowerCase(),
|
|
4885
|
+
Alignment: (td.tdAlignment || th.thAlignment || this.DefaultAlignment()).toLowerCase(),
|
|
4839
4886
|
Format: td.tdFormat || th.thFormat,
|
|
4840
4887
|
PropertyName: th.thProperty,
|
|
4841
4888
|
PropertyType: th.thType,
|
|
@@ -4843,7 +4890,7 @@ class EsTableComponent {
|
|
|
4843
4890
|
EditorOptions: th.thEditorOptions,
|
|
4844
4891
|
PropAccessor: td.tdPropertyAccessor,
|
|
4845
4892
|
RoutePath: thCasted.thRoutePath,
|
|
4846
|
-
RouteParameterProperties: thCasted.thRouteParameterProperties
|
|
4893
|
+
RouteParameterProperties: thCasted.thRouteParameterProperties
|
|
4847
4894
|
} :
|
|
4848
4895
|
{
|
|
4849
4896
|
LeftBorder: thCasted._lbord,
|
|
@@ -4859,11 +4906,11 @@ class EsTableComponent {
|
|
|
4859
4906
|
Content: this.rowGrouping_H.getGroupCellDisplay(item, key, th)
|
|
4860
4907
|
};
|
|
4861
4908
|
if (this.TMPRowTDs[ctx]) {
|
|
4862
|
-
this.TMPRowTDs[ctx].push(itemToAdd);
|
|
4909
|
+
this.TMPRowTDs[ctx].push(signal(itemToAdd));
|
|
4863
4910
|
}
|
|
4864
4911
|
else {
|
|
4865
4912
|
this.RowContexts.push(ctx);
|
|
4866
|
-
this.TMPRowTDs[ctx] = [itemToAdd];
|
|
4913
|
+
this.TMPRowTDs[ctx] = [signal(itemToAdd)];
|
|
4867
4914
|
contextFixeds[ctx] = isFixed ? 1 : 0;
|
|
4868
4915
|
}
|
|
4869
4916
|
}
|
|
@@ -4897,7 +4944,7 @@ class EsTableComponent {
|
|
|
4897
4944
|
return;
|
|
4898
4945
|
let columnsListCache = {};
|
|
4899
4946
|
let castedView = this.View;
|
|
4900
|
-
let groupingsUndefined = this.viewMode && (castedView && !castedView.groupings || castedView.groupings.length == 0);
|
|
4947
|
+
let groupingsUndefined = this.viewMode() && (castedView && !castedView.groupings || castedView.groupings.length == 0);
|
|
4901
4948
|
for (let i = 0; i < this.ColumnsList.length; i++) {
|
|
4902
4949
|
let itm = this.ColumnsList[i];
|
|
4903
4950
|
columnsListCache[itm.id] = itm;
|
|
@@ -4918,7 +4965,7 @@ class EsTableComponent {
|
|
|
4918
4965
|
Order: th.thOrder,
|
|
4919
4966
|
Orderable: th.thOrderable,
|
|
4920
4967
|
Template: th.Template,
|
|
4921
|
-
Alignment: (th.thAlignment || this.DefaultAlignment).toLowerCase(),
|
|
4968
|
+
Alignment: (th.thAlignment || this.DefaultAlignment()).toLowerCase(),
|
|
4922
4969
|
// Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header
|
|
4923
4970
|
Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,
|
|
4924
4971
|
Wrap: th.thWrap,
|
|
@@ -4979,8 +5026,8 @@ class EsTableComponent {
|
|
|
4979
5026
|
let anyG = group;
|
|
4980
5027
|
anyG._expanded = !anyG._expanded;
|
|
4981
5028
|
// Sono in modalità raggruppamento virtuale da array: Espandere significa rendere visibili tutti gli oggetti relativi a questo gruppo, viceversa il contrarre
|
|
4982
|
-
if (this.ArrayGrouping) {
|
|
4983
|
-
let allRelatives = this.boundSource.filter(t => (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||
|
|
5029
|
+
if (this.ArrayGrouping()) {
|
|
5030
|
+
let allRelatives = this.boundSource().filter(t => (t._group && ((anyG._expanded && t._parent == anyG._thisKey) || (!anyG._expanded && t._parent && t._parent.startsWith(anyG._thisKey)))) ||
|
|
4984
5031
|
(t._item && ((anyG._expanded && t._thisKey == anyG._thisKey) || (!anyG._expanded && t._thisKey.startsWith(anyG._thisKey)))));
|
|
4985
5032
|
allRelatives.forEach(t => { t._visible = anyG._expanded; if (t._group)
|
|
4986
5033
|
t._expanded = false; });
|
|
@@ -5011,7 +5058,7 @@ class EsTableComponent {
|
|
|
5011
5058
|
else {
|
|
5012
5059
|
let path = (anyG._parent || '') + group.value;
|
|
5013
5060
|
// Se ho chiuso un gruppo non mi serve rieffettuare ricerce, mi basta eliminare dagli oggetti bindati tutti gli elementi sottostanti a quel gruppo
|
|
5014
|
-
this.boundSource
|
|
5061
|
+
this.boundSource.set(this.boundSource().filter(t => !t._parent || !t._parent.startsWith(path)));
|
|
5015
5062
|
// devo però anche rimuovere eventuali cache relative
|
|
5016
5063
|
this.groupSearchRequestsCache = this.groupSearchRequestsCache.filter(t => t.path != path);
|
|
5017
5064
|
}
|
|
@@ -5023,10 +5070,11 @@ class EsTableComponent {
|
|
|
5023
5070
|
* @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti
|
|
5024
5071
|
*/
|
|
5025
5072
|
globalCheckChanged(forcedVal = null) {
|
|
5073
|
+
debugger;
|
|
5026
5074
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5027
5075
|
// Prendo tutti gli elementi presenti in questa vista. Se ho gruppi prendo solo i gruppi a livello 0, altrimenti prendo tutti gli oggetti per selezionarli
|
|
5028
|
-
let items = this.boundSource.find(t => t._group) ? this.boundSource.filter(t => t._group && !t._parent) : this.boundSource;
|
|
5029
|
-
var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck);
|
|
5076
|
+
let items = this.boundSource().find(t => t._group) ? this.boundSource().filter(t => t._group && !t._parent) : this.boundSource();
|
|
5077
|
+
var itemSelection = this.selection_H.handleItemsSelection(items, forcedVal, this.globalCheck());
|
|
5030
5078
|
this.changed();
|
|
5031
5079
|
this.onSelectionChanged.emit(itemSelection);
|
|
5032
5080
|
}
|
|
@@ -5043,10 +5091,10 @@ class EsTableComponent {
|
|
|
5043
5091
|
handleClick(event, item) {
|
|
5044
5092
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5045
5093
|
let selecteditems = [];
|
|
5046
|
-
if (event.shiftKey && this.ShiftClick && !this.SingleSelection) {
|
|
5094
|
+
if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {
|
|
5047
5095
|
this.utiExts.clearTextSelection();
|
|
5048
5096
|
let startSelecting = false;
|
|
5049
|
-
let items = this.boundSource.filter(t => !t._group && !t._sep);
|
|
5097
|
+
let items = this.boundSource().filter(t => !t._group && !t._sep);
|
|
5050
5098
|
for (let i = 0; i < items.length; i++) {
|
|
5051
5099
|
let t = items[i];
|
|
5052
5100
|
if (startSelecting) {
|
|
@@ -5079,7 +5127,7 @@ class EsTableComponent {
|
|
|
5079
5127
|
*/
|
|
5080
5128
|
addToPage(page) {
|
|
5081
5129
|
let view = this.MainGroupView ? this.MainGroupView : this.View;
|
|
5082
|
-
this.goToPage(((this.SearchView || view)?.page || 0) + page);
|
|
5130
|
+
this.goToPage(((this.SearchView() || view)?.page || 0) + page);
|
|
5083
5131
|
}
|
|
5084
5132
|
/**
|
|
5085
5133
|
* Sposta la ricerca alla pagina specificata
|
|
@@ -5087,18 +5135,18 @@ class EsTableComponent {
|
|
|
5087
5135
|
* @param {number} page Pagina a cui navigare
|
|
5088
5136
|
*/
|
|
5089
5137
|
goToPage(page) {
|
|
5090
|
-
let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode ? this.SearchView : this.View);
|
|
5138
|
+
let view = this.MainGroupView ? this.MainGroupView : (this.arrayMode() ? this.SearchView() : this.View);
|
|
5091
5139
|
if (!view.page || !view.pages)
|
|
5092
5140
|
return;
|
|
5093
|
-
let appSearchElement = this.SearchView || view;
|
|
5141
|
+
let appSearchElement = this.SearchView() || view;
|
|
5094
5142
|
if (page === 0 || (page > appSearchElement.pages && appSearchElement.pages > 0))
|
|
5095
5143
|
return;
|
|
5096
5144
|
appSearchElement.page = page;
|
|
5097
5145
|
let count = (view.items.length || view.groups?.length || 0);
|
|
5098
5146
|
let ipp = view.itemsperpageoverride || 15;
|
|
5099
|
-
this.arrayPulsanti
|
|
5147
|
+
this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, appSearchElement.page, appSearchElement.pages, count, ipp));
|
|
5100
5148
|
let hasGroupings = !!this.MainGroupView;
|
|
5101
|
-
this.emitSearchRequest(false, hasGroupings ? view : this.SearchView
|
|
5149
|
+
this.emitSearchRequest(false, hasGroupings ? view : (this.SearchView() || null));
|
|
5102
5150
|
}
|
|
5103
5151
|
/**
|
|
5104
5152
|
* Evento richiamato sul cambio della paginazione. Verrà richiamato l'evento **emitSearchRequest**
|
|
@@ -5109,10 +5157,10 @@ class EsTableComponent {
|
|
|
5109
5157
|
this.changed();
|
|
5110
5158
|
if (this.MainGroupView)
|
|
5111
5159
|
this.emitSearchRequest(true, this.MainGroupView);
|
|
5112
|
-
else if (this.SearchView) {
|
|
5160
|
+
else if (this.SearchView()) {
|
|
5113
5161
|
// Questo secondo me si può portare a livello un po' più alto
|
|
5114
|
-
this.SearchView.page = 1;
|
|
5115
|
-
this.emitSearchRequest(true, this.SearchView);
|
|
5162
|
+
this.SearchView().page = 1;
|
|
5163
|
+
this.emitSearchRequest(true, this.SearchView());
|
|
5116
5164
|
}
|
|
5117
5165
|
else
|
|
5118
5166
|
this.emitSearchRequest(true);
|
|
@@ -5124,9 +5172,9 @@ class EsTableComponent {
|
|
|
5124
5172
|
}
|
|
5125
5173
|
/** Metodo che gestisce la modifica del tempo specificato per l'aggiornamento automatico */
|
|
5126
5174
|
autoUpdateChanged() {
|
|
5127
|
-
if (!/^[1-9]\d*$/.test(this.seconds))
|
|
5128
|
-
this.seconds
|
|
5129
|
-
let secondsInMs = parseInt(this.seconds, null) * 1000;
|
|
5175
|
+
if (!/^[1-9]\d*$/.test(this.seconds()))
|
|
5176
|
+
this.seconds.set('10');
|
|
5177
|
+
let secondsInMs = parseInt(this.seconds(), null) * 1000;
|
|
5130
5178
|
if (this.autoUpdate)
|
|
5131
5179
|
this.updateTimer = setInterval(() => { this.emitSearchRequest(false); }, secondsInMs);
|
|
5132
5180
|
else
|
|
@@ -5205,8 +5253,8 @@ class EsTableComponent {
|
|
|
5205
5253
|
* @param {'array' | 'view' | 'report'} mode Modalità da impostare
|
|
5206
5254
|
**/
|
|
5207
5255
|
setMode(mode) {
|
|
5208
|
-
this.viewMode
|
|
5209
|
-
this.arrayMode
|
|
5256
|
+
this.viewMode.set(mode == 'view');
|
|
5257
|
+
this.arrayMode.set(mode == 'array');
|
|
5210
5258
|
}
|
|
5211
5259
|
/**
|
|
5212
5260
|
* Helper per effettuare chiamate interne di allineamento alla funzione **writeValue**,
|
|
@@ -5222,16 +5270,16 @@ class EsTableComponent {
|
|
|
5222
5270
|
// Se sono in modalità View viene mantenuto in automatico il numero di pagina, ma per la modalità array devo prendere le info di paginazione prima e riapplicarle dopo
|
|
5223
5271
|
let arrayPage;
|
|
5224
5272
|
let arrayIpp;
|
|
5225
|
-
if (this.arrayMode) {
|
|
5273
|
+
if (this.arrayMode()) {
|
|
5226
5274
|
arrayPage = this.arraymodePage;
|
|
5227
|
-
arrayIpp = this.ArraymodeItemsPerPage;
|
|
5275
|
+
arrayIpp = this.ArraymodeItemsPerPage();
|
|
5228
5276
|
}
|
|
5229
|
-
if (!relaunchSearch && this.viewMode)
|
|
5277
|
+
if (!relaunchSearch && this.viewMode())
|
|
5230
5278
|
this.View.selfsearch = true;
|
|
5231
5279
|
this.writeValue(this.View);
|
|
5232
5280
|
this.cdr.detectChanges();
|
|
5233
|
-
if (this.arrayMode) {
|
|
5234
|
-
this.ArraymodeItemsPerPage
|
|
5281
|
+
if (this.arrayMode()) {
|
|
5282
|
+
this.ArraymodeItemsPerPage.set(arrayIpp);
|
|
5235
5283
|
this.arrayGoToPage(arrayPage);
|
|
5236
5284
|
}
|
|
5237
5285
|
}
|
|
@@ -5266,52 +5314,52 @@ class EsTableComponent {
|
|
|
5266
5314
|
*/
|
|
5267
5315
|
dbClickEditOrSingleClickRowSelection($event, rowItem, item) {
|
|
5268
5316
|
// Prima cosa da fare è controllare se ci sono dei range lasciati da operazioni precedenti (se applicabile) e ripulirli
|
|
5269
|
-
if (this.rangeSelected && !$event.ctrlKey && this.Selection) {
|
|
5317
|
+
if (this.rangeSelected && !$event.ctrlKey && this.Selection()) {
|
|
5270
5318
|
this.logger.log("clearing previously selected range");
|
|
5271
5319
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5272
5320
|
this.rangeSelected = false;
|
|
5273
5321
|
return;
|
|
5274
5322
|
}
|
|
5275
5323
|
// Modalità Editable, gestisco i doppi click senza però rallentare la modalità di selezione a range
|
|
5276
|
-
if (this.Editable) {
|
|
5324
|
+
if (this.Editable()) {
|
|
5277
5325
|
// Secondo click: se il timer non è scaduto è un doppio click ed eseguo il resto
|
|
5278
5326
|
if (this.cellDbClickTimer) {
|
|
5279
|
-
this.logger.log("handling doubleclick on editable cell: " + (rowItem.PropertyName ? 'edit mode for property ' + rowItem.PropertyName : 'no property set, fallback to simple click'));
|
|
5280
|
-
if (rowItem.PropertyName)
|
|
5327
|
+
this.logger.log("handling doubleclick on editable cell: " + (rowItem().PropertyName ? 'edit mode for property ' + rowItem().PropertyName : 'no property set, fallback to simple click'));
|
|
5328
|
+
if (rowItem().PropertyName)
|
|
5281
5329
|
this.setupUserEdit(rowItem, item);
|
|
5282
5330
|
else
|
|
5283
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5331
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5284
5332
|
this.clearCellClickTimer();
|
|
5285
5333
|
return;
|
|
5286
5334
|
}
|
|
5287
5335
|
// Primo click: non fa niente e se il tempo per il secondo click scade resetta tutto
|
|
5288
5336
|
this.cellDbClickTimer = setTimeout(() => {
|
|
5289
5337
|
this.clearCellClickTimer();
|
|
5290
|
-
if (!this.RangeSelection || !this.mouseIsDown) {
|
|
5338
|
+
if (!this.RangeSelection() || !this.mouseIsDown) {
|
|
5291
5339
|
this.logger.log("time's up for second click, handling single click");
|
|
5292
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5340
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5293
5341
|
}
|
|
5294
5342
|
}, this.doubleClickBufferMs);
|
|
5295
5343
|
}
|
|
5296
5344
|
// In modalità a range la creazione del range è gestita dai mousedown, move ed up...
|
|
5297
5345
|
// La selezione delle righe invece è gestita dalle caselline a sinistra
|
|
5298
|
-
if (this.RangeSelection)
|
|
5346
|
+
if (this.RangeSelection())
|
|
5299
5347
|
return;
|
|
5300
5348
|
// Se ho fatto click col control attaccato esco subito dato che deve solo permettere la navigazione dei link
|
|
5301
5349
|
if ($event.ctrlKey)
|
|
5302
5350
|
return;
|
|
5303
5351
|
// Tutti i click su una cella già in edit non devono effettuare la selezione della riga
|
|
5304
|
-
if (rowItem._editing)
|
|
5352
|
+
if (rowItem()._editing)
|
|
5305
5353
|
return;
|
|
5306
5354
|
// Per evitare di rallentare a prescindere
|
|
5307
|
-
if (!this.Editable) {
|
|
5308
|
-
this.handleRowClick($event, item, this.Selection, true);
|
|
5355
|
+
if (!this.Editable()) {
|
|
5356
|
+
this.handleRowClick($event, item, this.Selection(), true);
|
|
5309
5357
|
return;
|
|
5310
5358
|
}
|
|
5311
5359
|
}
|
|
5312
5360
|
/** Evento che gestisce il comando "Copia" buttando i valori selezionati nella clipboard in base al loro tipo */
|
|
5313
5361
|
handleCopy() {
|
|
5314
|
-
if (!this.RangeSelection)
|
|
5362
|
+
if (!this.RangeSelection())
|
|
5315
5363
|
return;
|
|
5316
5364
|
let sel = this.selection_H.getSelectionStatusSelection();
|
|
5317
5365
|
if (sel.length > 0 && sel[0].length > 0) {
|
|
@@ -5322,7 +5370,7 @@ class EsTableComponent {
|
|
|
5322
5370
|
}
|
|
5323
5371
|
/** Evento che gestisce il comando "Incolla" prendendo i dati della clipboard e applicandoli al range di selezione attuale in base al tipo delle celle sotto */
|
|
5324
5372
|
handlePaste() {
|
|
5325
|
-
if (!this.RangeSelection)
|
|
5373
|
+
if (!this.RangeSelection())
|
|
5326
5374
|
return;
|
|
5327
5375
|
let sel = this.selection_H.getSelectionStatusSelection();
|
|
5328
5376
|
if (sel.length > 0 && sel[0].length > 0) {
|
|
@@ -5332,7 +5380,7 @@ class EsTableComponent {
|
|
|
5332
5380
|
values.splice(values.length - 1, 1);
|
|
5333
5381
|
if (values.length > 0 && values[0].length > 0) {
|
|
5334
5382
|
// Check se la modifica è abilitata
|
|
5335
|
-
if (!this.Editable) {
|
|
5383
|
+
if (!this.Editable()) {
|
|
5336
5384
|
this.msgExts.simpleWarning(this.lc.loc("Data for this table cannot be edited"));
|
|
5337
5385
|
return;
|
|
5338
5386
|
}
|
|
@@ -5381,7 +5429,7 @@ class EsTableComponent {
|
|
|
5381
5429
|
handleRowClick($event, item, selection, internalCall = false) {
|
|
5382
5430
|
// Se ho un ctrl premuto esco con true in modo da fare bubbling dell'evento e lasciarlo gestire al browser (link ecc...)
|
|
5383
5431
|
// Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD
|
|
5384
|
-
if ($event.ctrlKey || (this.UseCustomCells && !internalCall))
|
|
5432
|
+
if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))
|
|
5385
5433
|
return true;
|
|
5386
5434
|
if (selection)
|
|
5387
5435
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
@@ -5396,7 +5444,7 @@ class EsTableComponent {
|
|
|
5396
5444
|
* Gestione del click destro sull'es-table
|
|
5397
5445
|
*/
|
|
5398
5446
|
onRightClick() {
|
|
5399
|
-
if (this.Selection)
|
|
5447
|
+
if (this.Selection())
|
|
5400
5448
|
this.onOpenContextMenu.emit();
|
|
5401
5449
|
}
|
|
5402
5450
|
/**
|
|
@@ -5409,13 +5457,13 @@ class EsTableComponent {
|
|
|
5409
5457
|
*/
|
|
5410
5458
|
setupUserEdit(rowItem, item) {
|
|
5411
5459
|
this.selection_H.clearSelectionStatusExcluding(null);
|
|
5412
|
-
if (this.Editable && rowItem.PropertyName) {
|
|
5413
|
-
let dynMode = this.DynamicRowColumnsDefinition?.length > 0;
|
|
5414
|
-
rowItem.
|
|
5415
|
-
rowItem.
|
|
5460
|
+
if (this.Editable() && rowItem().PropertyName) {
|
|
5461
|
+
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
5462
|
+
let newValues = { _editing: true, old_value: dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName] };
|
|
5463
|
+
rowItem.set(Object.assign(rowItem(), newValues));
|
|
5416
5464
|
}
|
|
5417
5465
|
this.cdr.detectChanges();
|
|
5418
|
-
|
|
5466
|
+
requestAnimationFrame(() => { this.FocusSubject.next(); });
|
|
5419
5467
|
}
|
|
5420
5468
|
/**
|
|
5421
5469
|
* La modifica dell'utente è terminata. Si reimposta la variabile relativa a "false" in modo da nascondere l'input di testo e si emette la modifica del valore
|
|
@@ -5425,21 +5473,24 @@ class EsTableComponent {
|
|
|
5425
5473
|
* @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
|
|
5426
5474
|
*/
|
|
5427
5475
|
finalizeUserEdit(rowItem, item, columnIndex) {
|
|
5428
|
-
|
|
5429
|
-
|
|
5430
|
-
|
|
5431
|
-
|
|
5432
|
-
|
|
5433
|
-
|
|
5434
|
-
|
|
5435
|
-
|
|
5436
|
-
|
|
5437
|
-
|
|
5438
|
-
|
|
5476
|
+
// Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo
|
|
5477
|
+
requestAnimationFrame(() => {
|
|
5478
|
+
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
5479
|
+
let newValues = { _editing: false };
|
|
5480
|
+
rowItem.set(Object.assign(rowItem(), newValues));
|
|
5481
|
+
let old = rowItem().old_value;
|
|
5482
|
+
let niu = dynMode ? item.properties[rowItem().PropertyName] : item[rowItem().PropertyName];
|
|
5483
|
+
let olddate = this.dateExts.getDateConvertion(old);
|
|
5484
|
+
let niudate = this.dateExts.getDateConvertion(niu);
|
|
5485
|
+
if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
|
|
5486
|
+
return;
|
|
5487
|
+
this.onModelChange.emit([new EsTableModelChange(item, rowItem().ID, rowItem().PropertyName, old, niu)]);
|
|
5488
|
+
this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);
|
|
5489
|
+
});
|
|
5439
5490
|
}
|
|
5440
5491
|
mousedown(event, rowItem, _) {
|
|
5441
5492
|
// Tasto diverso dal click sinistro -> ciao è stato bello e intenso
|
|
5442
|
-
if (event.buttons != 1 || !this.RangeSelection)
|
|
5493
|
+
if (event.buttons != 1 || !this.RangeSelection())
|
|
5443
5494
|
return;
|
|
5444
5495
|
// Sto lavorando su QUESTA es-table
|
|
5445
5496
|
this.copyPasteDetector.ActiveEstReference = this;
|
|
@@ -5453,14 +5504,16 @@ class EsTableComponent {
|
|
|
5453
5504
|
this.firstCoordinates = { row, column };
|
|
5454
5505
|
// Se ho già un range di selezione ignoro temporanemaente questa selezione in modo da capire bene cosa devo fare dopo (click sulla riga / altra selezione)
|
|
5455
5506
|
// e gestire la grafica in maniera un po' più precisa
|
|
5456
|
-
if (!this.rangeSelected || (event.ctrlKey || !this.Selection))
|
|
5507
|
+
if (!this.rangeSelected || (event.ctrlKey || !this.Selection())) {
|
|
5457
5508
|
this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
|
|
5509
|
+
this.cdr.markForCheck();
|
|
5510
|
+
}
|
|
5458
5511
|
else
|
|
5459
5512
|
this.rangeStartWasIgnored = true;
|
|
5460
5513
|
this.logger.log(`mouse down on ${row}:${column}`);
|
|
5461
5514
|
}
|
|
5462
5515
|
mouseenter(event) {
|
|
5463
|
-
if (!this.RangeSelection)
|
|
5516
|
+
if (!this.RangeSelection())
|
|
5464
5517
|
return;
|
|
5465
5518
|
if (event.buttons == 0)
|
|
5466
5519
|
this.mouseIsDown = false;
|
|
@@ -5478,9 +5531,10 @@ class EsTableComponent {
|
|
|
5478
5531
|
this.logger.log(`mouse move over ${row}:${column}`);
|
|
5479
5532
|
this.rangeSelected = true;
|
|
5480
5533
|
}
|
|
5534
|
+
this.cdr.markForCheck();
|
|
5481
5535
|
}
|
|
5482
5536
|
mouseup(event) {
|
|
5483
|
-
if (!this.RangeSelection)
|
|
5537
|
+
if (!this.RangeSelection())
|
|
5484
5538
|
return;
|
|
5485
5539
|
let id = event.currentTarget.id;
|
|
5486
5540
|
let coords = id.split('_');
|
|
@@ -5488,10 +5542,11 @@ class EsTableComponent {
|
|
|
5488
5542
|
let column = parseInt(coords[coords.length - 1]);
|
|
5489
5543
|
// Se il mouseup viene effettuato sulla stessa cella del primo mousedown e siamo in modalità di selezione deseleziono la cella perché è un semplice click
|
|
5490
5544
|
if (this.mouseIsDown && this.firstCoordinates) {
|
|
5491
|
-
if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection)
|
|
5545
|
+
if (this.firstCoordinates.row == row && this.firstCoordinates.column == column && !event.ctrlKey && !this.rangeStartWasIgnored && this.Selection())
|
|
5492
5546
|
this.selection_H.singleCellSelection({ view: event.view, range: false }, row, column);
|
|
5493
|
-
else if (event.ctrlKey || !this.Selection)
|
|
5547
|
+
else if (event.ctrlKey || !this.Selection())
|
|
5494
5548
|
this.rangeSelected = true;
|
|
5549
|
+
this.cdr.markForCheck();
|
|
5495
5550
|
}
|
|
5496
5551
|
this.mouseIsDown = false;
|
|
5497
5552
|
this.logger.log(`mouse lifted up`);
|
|
@@ -5504,8 +5559,13 @@ class EsTableComponent {
|
|
|
5504
5559
|
let toRet = this.EsTdsCache[`${prop}_${hash}`];
|
|
5505
5560
|
return toRet;
|
|
5506
5561
|
}
|
|
5507
|
-
registerCell(event) {
|
|
5562
|
+
registerCell(event, rowItem, _, cellRef) {
|
|
5508
5563
|
this.EsTdsCache[`${event.id}_${event.hash}`] = event.self;
|
|
5564
|
+
this._zone.runOutsideAngular(() => {
|
|
5565
|
+
fromEvent(cellRef.nativeElement, 'mousedown').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mousedown(e, rowItem, _); });
|
|
5566
|
+
fromEvent(cellRef.nativeElement, 'mouseenter').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseenter(e); });
|
|
5567
|
+
fromEvent(cellRef.nativeElement, 'mouseup').pipe(takeUntil(this._destroyed$)).subscribe((e) => { this.mouseup(e); });
|
|
5568
|
+
});
|
|
5509
5569
|
}
|
|
5510
5570
|
//* Piango ancora
|
|
5511
5571
|
//* Gestione Embedding
|
|
@@ -5538,13 +5598,13 @@ class EsTableComponent {
|
|
|
5538
5598
|
return;
|
|
5539
5599
|
this.emb.MainWindow.postMessage({ type: "modal-close" }, "*");
|
|
5540
5600
|
}
|
|
5541
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, deps: [{ token: i1.NgControl, optional: true, self: true }, { token: i2$1.PreferencesService, optional: true }, { token: EST_DEFAULTS, optional: true }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: UtilitiesHandler }, { token: i5.UtilityService }, { token: i5.ExportService }, { token: i5.DateService }, { token: i5.MessageService }, { token: CopyPasteDetector }, { token: i5.ClipboardService }, { token: Logger }, { token: i5.AppEmbeddingExtensions }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5542
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "19.2.14", type: EsTableComponent, isStandalone: false, selector: "es-table", inputs: { EsThTdProvider: "EsThTdProvider", CornerMenuOptions: "CornerMenuOptions", ColumnsResizable: "ColumnsResizable", ColumnsPinnable: "ColumnsPinnable", AutoUpdate: "AutoUpdate", Height: "Height", EmptySpaceBackgroundColor: "EmptySpaceBackgroundColor", EsTableHandledSearch: "EsTableHandledSearch", MaxHeight: "MaxHeight", ContainerClass: "ContainerClass", XLSXExport: "XLSXExport", CSVExport: "CSVExport", AllSearch: "AllSearch", HighCellDensity: "HighCellDensity", Selection: "Selection", ShowLoadingOnBootstrap: "ShowLoadingOnBootstrap", Removal: "Removal", RemovalCondition: "RemovalCondition", Export: "Export", ShiftClick: "ShiftClick", CountLabel: "CountLabel", HidePaging: "HidePaging", HidePagingCount: "HidePagingCount", HidePagingButtons: "HidePagingButtons", ContextMenu: "ContextMenu", ExportFileName: "ExportFileName", TableClass: "TableClass", ExportFunction: "ExportFunction", ExportOnlyVisibleColumns: "ExportOnlyVisibleColumns", HasHeaderGroup: "HasHeaderGroup", HasSecondaryHeaderGroup: "HasSecondaryHeaderGroup", HeaderHidden: "HeaderHidden", BodyHidden: "BodyHidden", SelectionDisabled: "SelectionDisabled", SingleSelection: "SingleSelection", RowClassAssigner: "RowClassAssigner", OrderByColumn: "OrderByColumn", MultipleOrderingDirectives: "MultipleOrderingDirectives", HiddenColumns: "HiddenColumns", ColumnsOrdering: "ColumnsOrdering", SearchView: "SearchView", SelectAll: "SelectAll", UseArrayModePaging: "UseArrayModePaging", DynamicRowColumnsDefinition: "DynamicRowColumnsDefinition", DynamicOperations: "DynamicOperations", Hierarchy: "Hierarchy", ParentKey: "ParentKey", OwnKey: "OwnKey", StartsExpanded: "StartsExpanded", SavePreferences: "SavePreferences", DefaultAlignment: "DefaultAlignment", PagingStyle: "PagingStyle", RowGroupingPagingStyle: "RowGroupingPagingStyle", ItemSourceProperty: "ItemSourceProperty", UseSelectionCache: "UseSelectionCache", ShowItemGroupsColumns: "ShowItemGroupsColumns", Editable: "Editable", RangeSelection: "RangeSelection", SearchThrottle: "SearchThrottle", ArraymodeItemsPerPage: "ArraymodeItemsPerPage" }, outputs: { onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }, { propertyName: "ThTdProvider", predicate: ThTdProvider }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], usesOnChanges: true, ngImport: i0, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <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 }); }
|
|
5601
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, deps: [{ token: i0.NgZone }, { token: i1.NgControl, optional: true, self: true }, { token: i2$1.PreferencesService, optional: true }, { token: EST_DEFAULTS, optional: true }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }, { token: UtilitiesHandler }, { token: i5.UtilityService }, { token: i5.ExportService }, { token: i5.DateService }, { token: i5.MessageService }, { token: CopyPasteDetector }, { token: i5.ClipboardService }, { token: Logger }, { token: i5.AppEmbeddingExtensions }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
5602
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "19.2.14", type: EsTableComponent, isStandalone: false, selector: "es-table", inputs: { globalCheck: { classPropertyName: "globalCheck", publicName: "globalCheck", isSignal: true, isRequired: false, transformFunction: null }, autoUpdate: { classPropertyName: "autoUpdate", publicName: "autoUpdate", isSignal: true, isRequired: false, transformFunction: null }, seconds: { classPropertyName: "seconds", publicName: "seconds", isSignal: true, isRequired: false, transformFunction: null }, researchInProgress: { classPropertyName: "researchInProgress", publicName: "researchInProgress", isSignal: true, isRequired: false, transformFunction: null }, globalColVisCheck: { classPropertyName: "globalColVisCheck", publicName: "globalColVisCheck", isSignal: true, isRequired: false, transformFunction: null }, EsThTdProvider: { classPropertyName: "EsThTdProvider", publicName: "EsThTdProvider", isSignal: false, isRequired: false, transformFunction: null }, CornerMenuOptions: { classPropertyName: "CornerMenuOptions", publicName: "CornerMenuOptions", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsResizable: { classPropertyName: "_ColumnsResizable", publicName: "ColumnsResizable", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsPinnable: { classPropertyName: "_ColumnsPinnable", publicName: "ColumnsPinnable", isSignal: true, isRequired: false, transformFunction: null }, _AutoUpdate: { classPropertyName: "_AutoUpdate", publicName: "AutoUpdate", isSignal: true, isRequired: false, transformFunction: null }, Height: { classPropertyName: "Height", publicName: "Height", isSignal: true, isRequired: false, transformFunction: null }, EmptySpaceBackgroundColor: { classPropertyName: "EmptySpaceBackgroundColor", publicName: "EmptySpaceBackgroundColor", isSignal: true, isRequired: false, transformFunction: null }, EsTableHandledSearch: { classPropertyName: "EsTableHandledSearch", publicName: "EsTableHandledSearch", isSignal: true, isRequired: false, transformFunction: null }, MaxHeight: { classPropertyName: "MaxHeight", publicName: "MaxHeight", isSignal: true, isRequired: false, transformFunction: null }, _ContainerClass: { classPropertyName: "_ContainerClass", publicName: "ContainerClass", isSignal: true, isRequired: false, transformFunction: null }, XLSXExport: { classPropertyName: "XLSXExport", publicName: "XLSXExport", isSignal: true, isRequired: false, transformFunction: null }, CSVExport: { classPropertyName: "CSVExport", publicName: "CSVExport", isSignal: true, isRequired: false, transformFunction: null }, _AllSearch: { classPropertyName: "_AllSearch", publicName: "AllSearch", isSignal: true, isRequired: false, transformFunction: null }, HighCellDensity: { classPropertyName: "HighCellDensity", publicName: "HighCellDensity", isSignal: true, isRequired: false, transformFunction: null }, _Selection: { classPropertyName: "_Selection", publicName: "Selection", isSignal: true, isRequired: false, transformFunction: null }, ShowLoadingOnBootstrap: { classPropertyName: "ShowLoadingOnBootstrap", publicName: "ShowLoadingOnBootstrap", isSignal: true, isRequired: false, transformFunction: null }, Removal: { classPropertyName: "Removal", publicName: "Removal", isSignal: true, isRequired: false, transformFunction: null }, RemovalCondition: { classPropertyName: "RemovalCondition", publicName: "RemovalCondition", isSignal: true, isRequired: false, transformFunction: null }, _Export: { classPropertyName: "_Export", publicName: "Export", isSignal: true, isRequired: false, transformFunction: null }, _ShiftClick: { classPropertyName: "_ShiftClick", publicName: "ShiftClick", isSignal: true, isRequired: false, transformFunction: null }, CountLabel: { classPropertyName: "CountLabel", publicName: "CountLabel", isSignal: true, isRequired: false, transformFunction: null }, _HidePaging: { classPropertyName: "_HidePaging", publicName: "HidePaging", isSignal: true, isRequired: false, transformFunction: null }, _HidePagingCount: { classPropertyName: "_HidePagingCount", publicName: "HidePagingCount", isSignal: true, isRequired: false, transformFunction: null }, _HidePagingButtons: { classPropertyName: "_HidePagingButtons", publicName: "HidePagingButtons", isSignal: true, isRequired: false, transformFunction: null }, ContextMenu: { classPropertyName: "ContextMenu", publicName: "ContextMenu", isSignal: false, isRequired: false, transformFunction: null }, ExportFileName: { classPropertyName: "ExportFileName", publicName: "ExportFileName", isSignal: true, isRequired: false, transformFunction: null }, _TableClass: { classPropertyName: "_TableClass", publicName: "TableClass", isSignal: true, isRequired: false, transformFunction: null }, ExportFunction: { classPropertyName: "ExportFunction", publicName: "ExportFunction", isSignal: false, isRequired: false, transformFunction: null }, ExportOnlyVisibleColumns: { classPropertyName: "ExportOnlyVisibleColumns", publicName: "ExportOnlyVisibleColumns", isSignal: true, isRequired: false, transformFunction: null }, HasHeaderGroup: { classPropertyName: "HasHeaderGroup", publicName: "HasHeaderGroup", isSignal: true, isRequired: false, transformFunction: null }, HasSecondaryHeaderGroup: { classPropertyName: "HasSecondaryHeaderGroup", publicName: "HasSecondaryHeaderGroup", isSignal: true, isRequired: false, transformFunction: null }, HeaderHidden: { classPropertyName: "HeaderHidden", publicName: "HeaderHidden", isSignal: true, isRequired: false, transformFunction: null }, BodyHidden: { classPropertyName: "BodyHidden", publicName: "BodyHidden", isSignal: true, isRequired: false, transformFunction: null }, SelectionDisabled: { classPropertyName: "SelectionDisabled", publicName: "SelectionDisabled", isSignal: true, isRequired: false, transformFunction: null }, SingleSelection: { classPropertyName: "SingleSelection", publicName: "SingleSelection", isSignal: true, isRequired: false, transformFunction: null }, RowClassAssigner: { classPropertyName: "RowClassAssigner", publicName: "RowClassAssigner", isSignal: false, isRequired: false, transformFunction: null }, _OrderByColumn: { classPropertyName: "_OrderByColumn", publicName: "OrderByColumn", isSignal: true, isRequired: false, transformFunction: null }, MultipleOrderingDirectives: { classPropertyName: "MultipleOrderingDirectives", publicName: "MultipleOrderingDirectives", isSignal: true, isRequired: false, transformFunction: null }, _HiddenColumns: { classPropertyName: "_HiddenColumns", publicName: "HiddenColumns", isSignal: true, isRequired: false, transformFunction: null }, _ColumnsOrdering: { classPropertyName: "_ColumnsOrdering", publicName: "ColumnsOrdering", isSignal: true, isRequired: false, transformFunction: null }, SearchView: { classPropertyName: "SearchView", publicName: "SearchView", isSignal: true, isRequired: false, transformFunction: null }, _SelectAll: { classPropertyName: "_SelectAll", publicName: "SelectAll", isSignal: true, isRequired: false, transformFunction: null }, _UseArrayModePaging: { classPropertyName: "_UseArrayModePaging", publicName: "UseArrayModePaging", isSignal: true, isRequired: false, transformFunction: null }, _DynamicRowColumnsDefinition: { classPropertyName: "_DynamicRowColumnsDefinition", publicName: "DynamicRowColumnsDefinition", isSignal: true, isRequired: false, transformFunction: null }, DynamicOperations: { classPropertyName: "DynamicOperations", publicName: "DynamicOperations", isSignal: true, isRequired: false, transformFunction: null }, Hierarchy: { classPropertyName: "Hierarchy", publicName: "Hierarchy", isSignal: true, isRequired: false, transformFunction: null }, _ParentKey: { classPropertyName: "_ParentKey", publicName: "ParentKey", isSignal: true, isRequired: false, transformFunction: null }, _OwnKey: { classPropertyName: "_OwnKey", publicName: "OwnKey", isSignal: true, isRequired: false, transformFunction: null }, StartsExpanded: { classPropertyName: "StartsExpanded", publicName: "StartsExpanded", isSignal: true, isRequired: false, transformFunction: null }, _SavePreferences: { classPropertyName: "_SavePreferences", publicName: "SavePreferences", isSignal: true, isRequired: false, transformFunction: null }, _DefaultAlignment: { classPropertyName: "_DefaultAlignment", publicName: "DefaultAlignment", isSignal: true, isRequired: false, transformFunction: null }, _PagingStyle: { classPropertyName: "_PagingStyle", publicName: "PagingStyle", isSignal: true, isRequired: false, transformFunction: null }, _RowGroupingPagingStyle: { classPropertyName: "_RowGroupingPagingStyle", publicName: "RowGroupingPagingStyle", isSignal: true, isRequired: false, transformFunction: null }, ItemSourceProperty: { classPropertyName: "ItemSourceProperty", publicName: "ItemSourceProperty", isSignal: true, isRequired: false, transformFunction: null }, _UseSelectionCache: { classPropertyName: "_UseSelectionCache", publicName: "UseSelectionCache", isSignal: true, isRequired: false, transformFunction: null }, _ShowItemGroupsColumns: { classPropertyName: "_ShowItemGroupsColumns", publicName: "ShowItemGroupsColumns", isSignal: true, isRequired: false, transformFunction: null }, Editable: { classPropertyName: "Editable", publicName: "Editable", isSignal: true, isRequired: false, transformFunction: null }, RangeSelection: { classPropertyName: "RangeSelection", publicName: "RangeSelection", isSignal: true, isRequired: false, transformFunction: null }, SearchThrottle: { classPropertyName: "SearchThrottle", publicName: "SearchThrottle", isSignal: true, isRequired: false, transformFunction: null }, _ArraymodeItemsPerPage: { classPropertyName: "_ArraymodeItemsPerPage", publicName: "ArraymodeItemsPerPage", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { globalCheck: "globalCheckChange", autoUpdate: "autoUpdateChange", seconds: "secondsChange", researchInProgress: "researchInProgressChange", globalColVisCheck: "globalColVisCheckChange", onOrderChanged: "onOrderChanged", onSearchRequest: "onSearchRequest", onSelectionChanged: "onSelectionChanged", onRemoval: "onRemoval", onAbortRemoval: "onAbortRemoval", onModelChange: "onModelChange", onOpenContextMenu: "onOpenContextMenu", onCornerAction: "onCornerAction", onDynamicOperation: "onDynamicOperation" }, queries: [{ propertyName: "bodyRef", first: true, predicate: ["body"], descendants: true }, { propertyName: "headerRef", first: true, predicate: ["header"], descendants: true }, { propertyName: "headerGroupRef", first: true, predicate: ["headerGroup"], descendants: true }, { propertyName: "secondaryHeaderGroupRef", first: true, predicate: ["secondaryHeaderGroup"], descendants: true }, { propertyName: "EsTdEditorDirectives", predicate: EsTdEditorDirective }, { propertyName: "EsTdsDirective", predicate: EsTdDirective }, { propertyName: "EsThsDirective", predicate: EsThDirective }, { propertyName: "ThTdProvider", predicate: ThTdProvider }], viewQueries: [{ propertyName: "inputField", first: true, predicate: ["input"], descendants: true }, { propertyName: "exportDownloader", first: true, predicate: ["exportDownloader"], descendants: true }, { propertyName: "tableEmptyMenu", first: true, predicate: ["emptyMenu"], descendants: true, static: true }], ngImport: i0, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate()\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <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
5603
|
}
|
|
5544
5604
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImport: i0, type: EsTableComponent, decorators: [{
|
|
5545
5605
|
type: Component,
|
|
5546
|
-
args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: false, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <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: [{
|
|
5606
|
+
args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: false, template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate()\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <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"] }]
|
|
5607
|
+
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgControl, decorators: [{
|
|
5548
5608
|
type: Self
|
|
5549
5609
|
}, {
|
|
5550
5610
|
type: Optional
|
|
@@ -5584,122 +5644,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
5584
5644
|
}], inputField: [{
|
|
5585
5645
|
type: ViewChild,
|
|
5586
5646
|
args: ['input', { static: false }]
|
|
5587
|
-
}], CornerMenuOptions: [{
|
|
5588
|
-
type: Input
|
|
5589
|
-
}], ColumnsResizable: [{
|
|
5590
|
-
type: Input
|
|
5591
|
-
}], ColumnsPinnable: [{
|
|
5592
|
-
type: Input
|
|
5593
|
-
}], AutoUpdate: [{
|
|
5594
|
-
type: Input
|
|
5595
|
-
}], Height: [{
|
|
5596
|
-
type: Input
|
|
5597
|
-
}], EmptySpaceBackgroundColor: [{
|
|
5598
|
-
type: Input
|
|
5599
|
-
}], EsTableHandledSearch: [{
|
|
5600
|
-
type: Input
|
|
5601
|
-
}], MaxHeight: [{
|
|
5602
|
-
type: Input
|
|
5603
|
-
}], ContainerClass: [{
|
|
5604
|
-
type: Input
|
|
5605
|
-
}], XLSXExport: [{
|
|
5606
|
-
type: Input
|
|
5607
|
-
}], CSVExport: [{
|
|
5608
|
-
type: Input
|
|
5609
|
-
}], AllSearch: [{
|
|
5610
|
-
type: Input
|
|
5611
|
-
}], HighCellDensity: [{
|
|
5612
|
-
type: Input
|
|
5613
|
-
}], Selection: [{
|
|
5614
|
-
type: Input
|
|
5615
|
-
}], ShowLoadingOnBootstrap: [{
|
|
5616
|
-
type: Input
|
|
5617
|
-
}], Removal: [{
|
|
5618
|
-
type: Input
|
|
5619
|
-
}], RemovalCondition: [{
|
|
5620
|
-
type: Input
|
|
5621
|
-
}], Export: [{
|
|
5622
|
-
type: Input
|
|
5623
|
-
}], ShiftClick: [{
|
|
5624
|
-
type: Input
|
|
5625
|
-
}], CountLabel: [{
|
|
5626
|
-
type: Input
|
|
5627
|
-
}], HidePaging: [{
|
|
5628
|
-
type: Input
|
|
5629
|
-
}], HidePagingCount: [{
|
|
5630
|
-
type: Input
|
|
5631
|
-
}], HidePagingButtons: [{
|
|
5632
|
-
type: Input
|
|
5633
5647
|
}], ContextMenu: [{
|
|
5634
5648
|
type: Input
|
|
5635
|
-
}], ExportFileName: [{
|
|
5636
|
-
type: Input
|
|
5637
|
-
}], TableClass: [{
|
|
5638
|
-
type: Input
|
|
5639
5649
|
}], ExportFunction: [{
|
|
5640
5650
|
type: Input
|
|
5641
|
-
}], ExportOnlyVisibleColumns: [{
|
|
5642
|
-
type: Input
|
|
5643
|
-
}], HasHeaderGroup: [{
|
|
5644
|
-
type: Input
|
|
5645
|
-
}], HasSecondaryHeaderGroup: [{
|
|
5646
|
-
type: Input
|
|
5647
|
-
}], HeaderHidden: [{
|
|
5648
|
-
type: Input
|
|
5649
|
-
}], BodyHidden: [{
|
|
5650
|
-
type: Input
|
|
5651
|
-
}], SelectionDisabled: [{
|
|
5652
|
-
type: Input
|
|
5653
|
-
}], SingleSelection: [{
|
|
5654
|
-
type: Input
|
|
5655
5651
|
}], RowClassAssigner: [{
|
|
5656
5652
|
type: Input
|
|
5657
|
-
}], OrderByColumn: [{
|
|
5658
|
-
type: Input
|
|
5659
|
-
}], MultipleOrderingDirectives: [{
|
|
5660
|
-
type: Input
|
|
5661
|
-
}], HiddenColumns: [{
|
|
5662
|
-
type: Input
|
|
5663
|
-
}], ColumnsOrdering: [{
|
|
5664
|
-
type: Input
|
|
5665
|
-
}], SearchView: [{
|
|
5666
|
-
type: Input
|
|
5667
|
-
}], SelectAll: [{
|
|
5668
|
-
type: Input
|
|
5669
|
-
}], UseArrayModePaging: [{
|
|
5670
|
-
type: Input
|
|
5671
|
-
}], DynamicRowColumnsDefinition: [{
|
|
5672
|
-
type: Input
|
|
5673
|
-
}], DynamicOperations: [{
|
|
5674
|
-
type: Input
|
|
5675
|
-
}], Hierarchy: [{
|
|
5676
|
-
type: Input
|
|
5677
|
-
}], ParentKey: [{
|
|
5678
|
-
type: Input
|
|
5679
|
-
}], OwnKey: [{
|
|
5680
|
-
type: Input
|
|
5681
|
-
}], StartsExpanded: [{
|
|
5682
|
-
type: Input
|
|
5683
|
-
}], SavePreferences: [{
|
|
5684
|
-
type: Input
|
|
5685
|
-
}], DefaultAlignment: [{
|
|
5686
|
-
type: Input
|
|
5687
|
-
}], PagingStyle: [{
|
|
5688
|
-
type: Input
|
|
5689
|
-
}], RowGroupingPagingStyle: [{
|
|
5690
|
-
type: Input
|
|
5691
|
-
}], ItemSourceProperty: [{
|
|
5692
|
-
type: Input
|
|
5693
|
-
}], UseSelectionCache: [{
|
|
5694
|
-
type: Input
|
|
5695
|
-
}], ShowItemGroupsColumns: [{
|
|
5696
|
-
type: Input
|
|
5697
|
-
}], Editable: [{
|
|
5698
|
-
type: Input
|
|
5699
|
-
}], RangeSelection: [{
|
|
5700
|
-
type: Input
|
|
5701
|
-
}], SearchThrottle: [{
|
|
5702
|
-
type: Input
|
|
5703
5653
|
}], onOrderChanged: [{
|
|
5704
5654
|
type: Output
|
|
5705
5655
|
}], onSearchRequest: [{
|
|
@@ -5724,8 +5674,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.2.14", ngImpo
|
|
|
5724
5674
|
}], tableEmptyMenu: [{
|
|
5725
5675
|
type: ViewChild,
|
|
5726
5676
|
args: ['emptyMenu', { static: true }]
|
|
5727
|
-
}], ArraymodeItemsPerPage: [{
|
|
5728
|
-
type: Input
|
|
5729
5677
|
}] } });
|
|
5730
5678
|
class EsTdReference {
|
|
5731
5679
|
}
|