@esfaenza/es-table 20.3.7 → 20.3.8
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 +191 -209
- package/fesm2022/esfaenza-es-table.mjs.map +1 -1
- package/index.d.ts +106 -125
- package/package.json +1 -1
|
@@ -1,15 +1,15 @@
|
|
|
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,
|
|
2
|
+
import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, Pipe, model, ViewChild, 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';
|
|
6
6
|
import { ExtensionsModule } from '@esfaenza/extensions';
|
|
7
|
-
import * as i8 from '@angular/common';
|
|
8
|
-
import { CommonModule } from '@angular/common';
|
|
9
7
|
import * as i1 from '@angular/forms';
|
|
10
8
|
import { FormsModule } from '@angular/forms';
|
|
11
|
-
import * as
|
|
9
|
+
import * as i4 from 'primeng/select';
|
|
12
10
|
import { SelectModule } from 'primeng/select';
|
|
11
|
+
import * as i8 from '@angular/common';
|
|
12
|
+
import { CommonModule } from '@angular/common';
|
|
13
13
|
import { ReplaySubject, Subject, forkJoin, fromEvent, takeUntil } from 'rxjs';
|
|
14
14
|
import * as i13 from '@angular/cdk/drag-drop';
|
|
15
15
|
import { moveItemInArray, DragDropModule } from '@angular/cdk/drag-drop';
|
|
@@ -87,7 +87,7 @@ class EsTablePagerComponent {
|
|
|
87
87
|
this._pagingOptions = [10, 15, 30, 45, 100];
|
|
88
88
|
this.PagingOptionsForSelect = computed(() => {
|
|
89
89
|
let defAllValue = this.DefaultAll();
|
|
90
|
-
let availableOptions = this._pagingOptions.filter(pOpt => pOpt == defAllValue || this.PagerCount() >= pOpt || this.PagerCount() == -1);
|
|
90
|
+
let availableOptions = this._pagingOptions.filter(pOpt => pOpt == defAllValue || (this.PagerCount() || 0) >= pOpt || this.PagerCount() == -1);
|
|
91
91
|
if (this.AllSearch())
|
|
92
92
|
availableOptions.push(defAllValue);
|
|
93
93
|
return availableOptions.map(p => { return { description: p == defAllValue ? this.lc.loc("All") : p.toString(), id: p }; });
|
|
@@ -107,7 +107,7 @@ class EsTablePagerComponent {
|
|
|
107
107
|
*/
|
|
108
108
|
choice(pageSize) {
|
|
109
109
|
let prevModel = this.Model();
|
|
110
|
-
if (pageSize == this.DefaultAll() && this.WarnOnAll) {
|
|
110
|
+
if (pageSize == this.DefaultAll() && this.WarnOnAll()) {
|
|
111
111
|
this.msgExts.simpleWarningWithChoice(this.lc.loc("Are you sure you want to retrieve all results?"), this.lc.loc("This might slow down the page and possibly crash the entire application"), () => {
|
|
112
112
|
this.pagingSelected.emit(pageSize);
|
|
113
113
|
this.Model.set(pageSize);
|
|
@@ -125,11 +125,11 @@ class EsTablePagerComponent {
|
|
|
125
125
|
}
|
|
126
126
|
}
|
|
127
127
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: EsTablePagerComponent, deps: [{ token: i5.MessageService }, { token: i2.LocalizationService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
128
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
128
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", type: EsTablePagerComponent, isStandalone: false, selector: "es-paging", inputs: { CurrentPageSize: { classPropertyName: "CurrentPageSize", publicName: "CurrentPageSize", isSignal: true, isRequired: false, transformFunction: null }, View: { classPropertyName: "View", publicName: "View", isSignal: true, isRequired: false, transformFunction: null }, WarnOnAll: { classPropertyName: "WarnOnAll", publicName: "WarnOnAll", isSignal: true, isRequired: false, transformFunction: null }, AllSearch: { classPropertyName: "AllSearch", publicName: "AllSearch", isSignal: true, isRequired: false, transformFunction: null }, DefaultAll: { classPropertyName: "DefaultAll", publicName: "DefaultAll", isSignal: true, isRequired: false, transformFunction: null }, GroupMode: { classPropertyName: "GroupMode", publicName: "GroupMode", isSignal: true, isRequired: false, transformFunction: null }, GroupCount: { classPropertyName: "GroupCount", publicName: "GroupCount", isSignal: true, isRequired: false, transformFunction: null }, CountLabel: { classPropertyName: "CountLabel", publicName: "CountLabel", isSignal: true, isRequired: false, transformFunction: null }, ShowCount: { classPropertyName: "ShowCount", publicName: "ShowCount", isSignal: true, isRequired: false, transformFunction: null }, ShowPaging: { classPropertyName: "ShowPaging", publicName: "ShowPaging", isSignal: true, isRequired: false, transformFunction: null }, PagerCount: { classPropertyName: "PagerCount", publicName: "PagerCount", isSignal: true, isRequired: false, transformFunction: null }, Hidden: { classPropertyName: "Hidden", publicName: "Hidden", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { pagingSelected: "pagingSelected" }, ngImport: i0, template: "@if (!Hidden()) {\n <div [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}: </span>\n @if (ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)) {\n <p-select\n style=\"width: 95px\"\n size=\"small\"\n name=\"input\"\n appendTo=\"body\"\n [options]=\"PagingOptionsForSelect()\"\n optionLabel=\"description\"\n optionValue=\"id\"\n [ngModel]=\"Model()\"\n (ngModelChange)=\"choice($event)\"\n />\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\"> / </span>\n }\n }\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\n }\n </div>\n }", styles: [".est-rg-ipp-sel-all,.est-rg-ipp-sel,.est-ipp-sel-all,.est-ipp-sel{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block;display:inline}.est-ipp-bold{font-weight:700}.mat-paginator-page-size-select{margin:6px 4px 0;width:50px}.mat-paginator-page-size-select .mat-form-field-wrapper{height:52px!important;margin-top:-15px!important;padding:0!important}.mat-form-field-type-mat-native-select .mat-form-field-infix:after{margin-top:-5.5px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i4.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "pipe", type: i8.DecimalPipe, name: "number" }, { kind: "pipe", type: i2.LocalizePipe, name: "localize" }], viewProviders: [{ provide: LocalizationService, useClass: TablePagerLoc }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); }
|
|
129
129
|
}
|
|
130
130
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: EsTablePagerComponent, decorators: [{
|
|
131
131
|
type: Component,
|
|
132
|
-
args: [{ selector: "es-paging", viewProviders: [{ provide: LocalizationService, useClass: TablePagerLoc }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "
|
|
132
|
+
args: [{ selector: "es-paging", viewProviders: [{ provide: LocalizationService, useClass: TablePagerLoc }], encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "@if (!Hidden()) {\n <div [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}: </span>\n @if (ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)) {\n <p-select\n style=\"width: 95px\"\n size=\"small\"\n name=\"input\"\n appendTo=\"body\"\n [options]=\"PagingOptionsForSelect()\"\n optionLabel=\"description\"\n optionValue=\"id\"\n [ngModel]=\"Model()\"\n (ngModelChange)=\"choice($event)\"\n />\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\"> / </span>\n }\n }\n @if (ShowCount() && PagerCount() != -1) {\n <span class=\"est-fs-14 est-ipp-bold\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\n }\n </div>\n }", styles: [".est-rg-ipp-sel-all,.est-rg-ipp-sel,.est-ipp-sel-all,.est-ipp-sel{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block;display:inline}.est-ipp-bold{font-weight:700}.mat-paginator-page-size-select{margin:6px 4px 0;width:50px}.mat-paginator-page-size-select .mat-form-field-wrapper{height:52px!important;margin-top:-15px!important;padding:0!important}.mat-form-field-type-mat-native-select .mat-form-field-infix:after{margin-top:-5.5px!important}\n"] }]
|
|
133
133
|
}], ctorParameters: () => [{ type: i5.MessageService }, { type: i2.LocalizationService }, { type: i0.ChangeDetectorRef }], propDecorators: { CurrentPageSize: [{ type: i0.Input, args: [{ isSignal: true, alias: "CurrentPageSize", required: false }] }], View: [{ type: i0.Input, args: [{ isSignal: true, alias: "View", required: false }] }], WarnOnAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "WarnOnAll", required: false }] }], AllSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "AllSearch", required: false }] }], DefaultAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "DefaultAll", required: false }] }], GroupMode: [{ type: i0.Input, args: [{ isSignal: true, alias: "GroupMode", required: false }] }], GroupCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "GroupCount", required: false }] }], CountLabel: [{ type: i0.Input, args: [{ isSignal: true, alias: "CountLabel", required: false }] }], ShowCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "ShowCount", required: false }] }], ShowPaging: [{ type: i0.Input, args: [{ isSignal: true, alias: "ShowPaging", required: false }] }], PagerCount: [{ type: i0.Input, args: [{ isSignal: true, alias: "PagerCount", required: false }] }], Hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "Hidden", required: false }] }], pagingSelected: [{
|
|
134
134
|
type: Output
|
|
135
135
|
}] } });
|
|
@@ -331,10 +331,6 @@ class EsThDirective {
|
|
|
331
331
|
/** @ignore */
|
|
332
332
|
constructor(Template) {
|
|
333
333
|
this.Template = Template;
|
|
334
|
-
/** Variabile interna all'interno della quale viene raccolta la cache delle aggregazioni specificate in thAggregation */
|
|
335
|
-
this._thAggregations = null;
|
|
336
|
-
/** Variabile interna contenente in maniera ordinata i template dei padri */
|
|
337
|
-
this._thParents = null;
|
|
338
334
|
/** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsThComponent */
|
|
339
335
|
this._directive = true;
|
|
340
336
|
/** Variabile interna impostata dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
@@ -356,7 +352,7 @@ class EsThDirective {
|
|
|
356
352
|
/** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
|
|
357
353
|
this.thFixed = false;
|
|
358
354
|
/** Indica che la colonna è sotto ad un raggruppamento padre, con questo nome nel **th** */
|
|
359
|
-
this.thParent =
|
|
355
|
+
this.thParent = null;
|
|
360
356
|
/** Indica se questa colonna è ordinabile o meno */
|
|
361
357
|
this.thOrderable = true;
|
|
362
358
|
/** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
|
|
@@ -709,7 +705,7 @@ class ColumnMetadataHandler {
|
|
|
709
705
|
else
|
|
710
706
|
this.est.emitSearchRequest(false);
|
|
711
707
|
}
|
|
712
|
-
else if (this.est.arrayMode)
|
|
708
|
+
else if (this.est.arrayMode())
|
|
713
709
|
this.est.internalWriteValue();
|
|
714
710
|
}
|
|
715
711
|
/**
|
|
@@ -727,9 +723,9 @@ class ColumnMetadataHandler {
|
|
|
727
723
|
return false;
|
|
728
724
|
}
|
|
729
725
|
let arrMode = this.est.arrayMode();
|
|
730
|
-
let columns = arrMode ? this.est.arrayColumns : castedView
|
|
731
|
-
let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : castedView
|
|
732
|
-
let columnOrders = arrMode ? [] : castedView
|
|
726
|
+
let columns = arrMode ? this.est.arrayColumns : (castedView?.columns || []);
|
|
727
|
+
let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : (castedView?.column_ordering || []);
|
|
728
|
+
let columnOrders = arrMode ? [] : (castedView?.orders || []);
|
|
733
729
|
var toStore = {
|
|
734
730
|
columns: this.utiExts.deepClone(columns),
|
|
735
731
|
column_ordering: this.utiExts.deepClone(columnsOrderings),
|
|
@@ -903,7 +899,7 @@ class ColumnMetadataHandler {
|
|
|
903
899
|
for (let i = 0; i < ths.length; i++) {
|
|
904
900
|
let th = ths[i];
|
|
905
901
|
// Riassegno sempre per ripulire valori di partenza o per aggiornarli in caso di modifiche utente
|
|
906
|
-
th.thPinned = (!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned);
|
|
902
|
+
th.thPinned = !!((!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned));
|
|
907
903
|
if (th.thPinned) {
|
|
908
904
|
if (i != pinneds)
|
|
909
905
|
this.utilities.arrayMove(ths, i, pinneds);
|
|
@@ -935,7 +931,7 @@ class ColumnMetadataHandler {
|
|
|
935
931
|
for (let i = 0; i < this.est.ColumnsList.length; i++) {
|
|
936
932
|
let col = this.est.ColumnsList[i];
|
|
937
933
|
if (col.pinned && col.visible)
|
|
938
|
-
pcw += col.pinnedWidth;
|
|
934
|
+
pcw += col.pinnedWidth || 0;
|
|
939
935
|
}
|
|
940
936
|
pcw += this.est.Selection() ? 25 : 0;
|
|
941
937
|
this.est.PinnedContainerWidth.set(pcw);
|
|
@@ -998,7 +994,7 @@ class ColumnMetadataHandler {
|
|
|
998
994
|
});
|
|
999
995
|
// Recupero anche campi nuovi che nell'iterazione vecchia non c'erano (serve durante lo sviluppo in modo da non perdersi fra un EDIT + F5 e l'altro)
|
|
1000
996
|
this.est.ColumnsList.forEach(c => {
|
|
1001
|
-
if (!newColList.find(t => t == c.id))
|
|
997
|
+
if (!newColList.find(t => t.id == c.id))
|
|
1002
998
|
newColList.push(c);
|
|
1003
999
|
});
|
|
1004
1000
|
this.est.ColumnsList = newColList;
|
|
@@ -1040,7 +1036,7 @@ class ColumnMetadataHandler {
|
|
|
1040
1036
|
// Definisco se la colonna è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1041
1037
|
for (let i = 0; i < ths.length; i++) {
|
|
1042
1038
|
let th = ths[i];
|
|
1043
|
-
th.thVisible = th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible);
|
|
1039
|
+
th.thVisible = !!(th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible));
|
|
1044
1040
|
if (th.thFixed || th.thGroup)
|
|
1045
1041
|
fixedThs[th.th] = true;
|
|
1046
1042
|
}
|
|
@@ -1049,7 +1045,7 @@ class ColumnMetadataHandler {
|
|
|
1049
1045
|
// Definisco se la cella è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1050
1046
|
for (let i = 0; i < tds.length; i++) {
|
|
1051
1047
|
let td = tds[i];
|
|
1052
|
-
td.tdVisible = fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible);
|
|
1048
|
+
td.tdVisible = !!(fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible));
|
|
1053
1049
|
}
|
|
1054
1050
|
}
|
|
1055
1051
|
this.est.changed();
|
|
@@ -1064,7 +1060,7 @@ class ColumnMetadataHandler {
|
|
|
1064
1060
|
let orders = view ? view.orders : this.est.arrayOrders;
|
|
1065
1061
|
for (let i = 0; i < ths.length; i++) {
|
|
1066
1062
|
let th = ths[i];
|
|
1067
|
-
th.thOrder =
|
|
1063
|
+
th.thOrder = undefined;
|
|
1068
1064
|
for (let i = 0; i < orders.length; i++) {
|
|
1069
1065
|
let or = orders[i];
|
|
1070
1066
|
if (or.id == th.th)
|
|
@@ -1164,13 +1160,13 @@ class ColumnMetadataHandler {
|
|
|
1164
1160
|
currentSpan++;
|
|
1165
1161
|
else {
|
|
1166
1162
|
if (currentSpan > 0)
|
|
1167
|
-
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 :
|
|
1163
|
+
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 : undefined, Borders: !!currentParent });
|
|
1168
1164
|
currentSpan = 1;
|
|
1169
1165
|
currentParent = item;
|
|
1170
1166
|
}
|
|
1171
1167
|
}
|
|
1172
1168
|
// Ultima aggiunta che altrimenti mi rimarrebbe in cache
|
|
1173
|
-
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 :
|
|
1169
|
+
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 : undefined, Borders: !!currentParent });
|
|
1174
1170
|
// Aggiungo i pezzettini per la rimozione e gli export, se presenti
|
|
1175
1171
|
if (this.est.Removal())
|
|
1176
1172
|
levelArray.push({ ID: "_base_removal", Span: 1, Template: null });
|
|
@@ -1286,7 +1282,7 @@ class ColumnMetadataHandler {
|
|
|
1286
1282
|
this.est.TMPRowTDs[this.est.RowContexts[i]] = newContext;
|
|
1287
1283
|
}
|
|
1288
1284
|
}
|
|
1289
|
-
if (this.est.viewMode())
|
|
1285
|
+
if (this.est.viewMode() && view)
|
|
1290
1286
|
view.column_ordering = this.est.OrderDirectives;
|
|
1291
1287
|
else
|
|
1292
1288
|
this.est.arrayColumnOrdering = this.est.OrderDirectives;
|
|
@@ -1326,6 +1322,8 @@ class ColumnMetadataHandler {
|
|
|
1326
1322
|
* @param {EsTableColumn} columnItem Colonna da spostare
|
|
1327
1323
|
*/
|
|
1328
1324
|
pinOrUnpinColumn(columnItem) {
|
|
1325
|
+
if (!columnItem)
|
|
1326
|
+
return;
|
|
1329
1327
|
let itemIndex = this.est.TMPColumnsList.indexOf(columnItem);
|
|
1330
1328
|
if (!columnItem.pinned) {
|
|
1331
1329
|
columnItem.prev_index = itemIndex;
|
|
@@ -1372,7 +1370,7 @@ class ColumnMetadataHandler {
|
|
|
1372
1370
|
this.est.TMPColumnsList = [];
|
|
1373
1371
|
this.est.ColumnsList.forEach(c => { this.est.TMPColumnsList.push(Object.assign({}, c)); });
|
|
1374
1372
|
let reorderedColList = [];
|
|
1375
|
-
if (this.est.ColumnsOrdering) {
|
|
1373
|
+
if (this.est.ColumnsOrdering()) {
|
|
1376
1374
|
this.est.OrderDirectives.forEach(o => {
|
|
1377
1375
|
let column = this.est.TMPColumnsList.filter(t => t.id == o)[0];
|
|
1378
1376
|
// Potrei non averne nel caso ci sia il flag HiddenColumns a false, evito di inserire degli undefined
|
|
@@ -2688,7 +2686,6 @@ class SelectionHandler {
|
|
|
2688
2686
|
// Funzione assegnata dopo in modo da poterle fare anche aggiornare il valore del riferimento all'oggetto di selezione
|
|
2689
2687
|
iper.val_setter = (value) => {
|
|
2690
2688
|
if (!th.thProperty) {
|
|
2691
|
-
item[th.thProperty] = value;
|
|
2692
2689
|
iper.value = value;
|
|
2693
2690
|
return value;
|
|
2694
2691
|
}
|
|
@@ -2758,7 +2755,7 @@ class SelectionHandler {
|
|
|
2758
2755
|
// Se tutti gli oggetti di questa pagina sono solezionati allora posso mettere il global check a true
|
|
2759
2756
|
// Se sono in situazione di all-select anche metto la global checkbox, nonostante ci possano essere delle esclusioni
|
|
2760
2757
|
this.est.globalCheck.set(this.est.boundSource().length > 0 && this.est.boundSource().filter(t => t._group || t._item).every(t => t._selected));
|
|
2761
|
-
this.est.canSelectAll.set(selectionItem
|
|
2758
|
+
this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());
|
|
2762
2759
|
// Potrebbe cambiare qualora qualcuno inserisse dati a manazza in modalità Array e desse il refresh manuale alla tabella
|
|
2763
2760
|
// Comunque costa 0 quindi mi permetto di refreshare
|
|
2764
2761
|
if (this.est.arrayMode()) {
|
|
@@ -2845,10 +2842,10 @@ class SelectionHandler {
|
|
|
2845
2842
|
let pts = this.parentTreeStatus(item);
|
|
2846
2843
|
parentGroupSelected = pts == 'included';
|
|
2847
2844
|
parentGroupUnselected = pts == 'excluded';
|
|
2848
|
-
allItems = this.getGroupItems(si, item,
|
|
2845
|
+
allItems = this.getGroupItems(si, item, undefined, true);
|
|
2849
2846
|
selectedItems = this.getGroupItems(si, item, 'selected', true, allItems);
|
|
2850
2847
|
unselectedItems = this.getGroupItems(si, item, 'unselected', true, allItems);
|
|
2851
|
-
allGroups = this.getGroupChildGroups(si, item,
|
|
2848
|
+
allGroups = this.getGroupChildGroups(si, item, undefined, true);
|
|
2852
2849
|
selectedGroups = this.getGroupChildGroups(si, item, 'selected', true, allGroups);
|
|
2853
2850
|
unselectedGroups = this.getGroupChildGroups(si, item, 'unselected', true, allGroups);
|
|
2854
2851
|
}
|
|
@@ -2876,7 +2873,7 @@ class SelectionHandler {
|
|
|
2876
2873
|
*/
|
|
2877
2874
|
performSimpleSelectionOperations(base, item, group, sel, itm_group, sel_itm, desel_itm, all_itms, all_grps) {
|
|
2878
2875
|
let tripticItem = this.getTriptic('item', base);
|
|
2879
|
-
if (group) {
|
|
2876
|
+
if (group && all_grps) {
|
|
2880
2877
|
if (sel) {
|
|
2881
2878
|
all_grps.forEach(gr => { gr._selected = true; });
|
|
2882
2879
|
if (desel_itm)
|
|
@@ -2909,7 +2906,7 @@ class SelectionHandler {
|
|
|
2909
2906
|
selectGroup(group) {
|
|
2910
2907
|
group._selected = true;
|
|
2911
2908
|
let parent = this.getGroupParent(group);
|
|
2912
|
-
if (parent && this.getGroupChildGroups(null, parent,
|
|
2909
|
+
if (parent && this.getGroupChildGroups(null, parent, undefined, true).every(t => t._selected))
|
|
2913
2910
|
this.selectGroup(parent);
|
|
2914
2911
|
}
|
|
2915
2912
|
/**
|
|
@@ -2970,6 +2967,8 @@ class SelectionHandler {
|
|
|
2970
2967
|
}
|
|
2971
2968
|
/** Helper per evitare di riscrivere ogni santa volta array.splice(array.indexof(item), 1); */
|
|
2972
2969
|
removeItem(item, triptic) {
|
|
2970
|
+
if (!triptic)
|
|
2971
|
+
return false;
|
|
2973
2972
|
let index = triptic.index_cache.get(item._hash);
|
|
2974
2973
|
if (index != null) {
|
|
2975
2974
|
triptic.cache.delete(item._hash);
|
|
@@ -2980,6 +2979,8 @@ class SelectionHandler {
|
|
|
2980
2979
|
}
|
|
2981
2980
|
/** Helper per evitare di riscrivere ogni santa volta array.push(item); e la gestione della */
|
|
2982
2981
|
addItem(item, triptic) {
|
|
2982
|
+
if (!triptic)
|
|
2983
|
+
return false;
|
|
2983
2984
|
if (triptic.index_cache.get(item._hash) == null) {
|
|
2984
2985
|
let i = triptic.array.push(item) - 1;
|
|
2985
2986
|
triptic.cache.set(item._hash, item);
|
|
@@ -3163,7 +3164,7 @@ class SelectionHandler {
|
|
|
3163
3164
|
this.clearSelectionCaches();
|
|
3164
3165
|
}
|
|
3165
3166
|
// Se la possibilità di fare "Seleziona tutto" è abilitata allora la considero appena mi viene selezionato qualcosa
|
|
3166
|
-
this.est.canSelectAll.set(selectionItem
|
|
3167
|
+
this.est.canSelectAll.set(selectionItem?.count > 0 && !!this.est.SelectAll() && !this.est.SingleSelection());
|
|
3167
3168
|
}
|
|
3168
3169
|
/** Compatta una cache di indici */
|
|
3169
3170
|
compactIndexMap(map) {
|
|
@@ -3182,7 +3183,7 @@ class SelectionHandler {
|
|
|
3182
3183
|
let si = this.est.View?.selection || this.est.arraymodeSelection;
|
|
3183
3184
|
let excByGroup = si.group_exclusions.reduce((prev, curr) => prev + curr.count, 0);
|
|
3184
3185
|
let incByGroup = si.groups.reduce((prev, curr) => prev + curr.count, 0);
|
|
3185
|
-
let count = (si.all ? this.est.BaseItemsCount : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
|
|
3186
|
+
let count = (si.all ? (this.est.BaseItemsCount || 0) : incByGroup) - excByGroup + si.items.length - si.exclusions.length;
|
|
3186
3187
|
this.est.selectedObjects.set(count);
|
|
3187
3188
|
return count;
|
|
3188
3189
|
}
|
|
@@ -3320,7 +3321,7 @@ class SelectionHandler {
|
|
|
3320
3321
|
/**
|
|
3321
3322
|
* Ottiene la rappresentazione stringa di un valore dato un tipo
|
|
3322
3323
|
*
|
|
3323
|
-
* @param {
|
|
3324
|
+
* @param {ItemPropEditableReference} valType Oggetto Valore - Tipo da cui estrapolare la rappresentazione del dato in stringa
|
|
3324
3325
|
*
|
|
3325
3326
|
* @returns {string} Valore convertito in stringa in base al tipo
|
|
3326
3327
|
*/
|
|
@@ -3333,16 +3334,18 @@ class SelectionHandler {
|
|
|
3333
3334
|
case 'boolean':
|
|
3334
3335
|
case 'enum':
|
|
3335
3336
|
case 'autocomplete':
|
|
3336
|
-
return valType.value;
|
|
3337
|
+
return valType.value || "";
|
|
3337
3338
|
case 'float':
|
|
3338
3339
|
case 'currency':
|
|
3339
|
-
return parseFloat(valType.value).toLocaleString(this.est.lc.Locale);
|
|
3340
|
+
return parseFloat(valType.value || "").toLocaleString(this.est.lc.Locale);
|
|
3340
3341
|
case 'date':
|
|
3341
3342
|
return dayjs(valType.value).format(this.est.lc.token("getSmallDateDisplayFormat"));
|
|
3342
3343
|
case 'datetime':
|
|
3343
3344
|
return dayjs(valType.value).format(this.est.lc.token("getFullDateDisplayFormat"));
|
|
3344
3345
|
case 'time':
|
|
3345
3346
|
return dayjs(valType.value).format("HH:mm:ss");
|
|
3347
|
+
default:
|
|
3348
|
+
return valType.value || "";
|
|
3346
3349
|
}
|
|
3347
3350
|
}
|
|
3348
3351
|
}
|
|
@@ -3548,6 +3551,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
3548
3551
|
class EsTh {
|
|
3549
3552
|
setUnderlyingSignal(signalName, value) {
|
|
3550
3553
|
this[signalName].set(value);
|
|
3554
|
+
return value;
|
|
3551
3555
|
}
|
|
3552
3556
|
/** @ignore */
|
|
3553
3557
|
constructor(myself, renderer) {
|
|
@@ -3562,11 +3566,11 @@ class EsTh {
|
|
|
3562
3566
|
*
|
|
3563
3567
|
* nuova width = startOffset + posizione X del mouse
|
|
3564
3568
|
*/
|
|
3565
|
-
this.startOffset =
|
|
3569
|
+
this.startOffset = 0;
|
|
3566
3570
|
/** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
|
|
3567
3571
|
this.ID = input("", ...(ngDevMode ? [{ debugName: "ID", alias: "es-th" }] : [{ alias: "es-th" }]));
|
|
3568
3572
|
/** Ordinamento attuale della colonna */
|
|
3569
|
-
this._Order = input(null, ...(ngDevMode ? [{ debugName: "_Order", alias: 'Order', transform: this.setUnderlyingSignal
|
|
3573
|
+
this._Order = input(null, ...(ngDevMode ? [{ debugName: "_Order", alias: 'Order', transform: (value) => this.setUnderlyingSignal("Order", value) }] : [{ alias: 'Order', transform: (value) => this.setUnderlyingSignal("Order", value) }]));
|
|
3570
3574
|
this.Order = signal(null, ...(ngDevMode ? [{ debugName: "Order" }] : []));
|
|
3571
3575
|
/** Indica se questa colonna è ordinabile o meno */
|
|
3572
3576
|
this.Orderable = input(true, ...(ngDevMode ? [{ debugName: "Orderable" }] : []));
|
|
@@ -3587,8 +3591,6 @@ class EsTh {
|
|
|
3587
3591
|
this.Wrap = input(false, ...(ngDevMode ? [{ debugName: "Wrap" }] : []));
|
|
3588
3592
|
/** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
|
|
3589
3593
|
this.Fixed = input(false, ...(ngDevMode ? [{ debugName: "Fixed" }] : []));
|
|
3590
|
-
/** Template Angular da istanziare per questo TH */
|
|
3591
|
-
this.Template = null;
|
|
3592
3594
|
/** Evento emesso al cambio di ordinamento effettuato su questa colonna */
|
|
3593
3595
|
this.onOrderChange = new EventEmitter();
|
|
3594
3596
|
/** Evento emesso all'unpinning della colonna */
|
|
@@ -3597,10 +3599,6 @@ class EsTh {
|
|
|
3597
3599
|
this.Class = signal("", ...(ngDevMode ? [{ debugName: "Class" }] : []));
|
|
3598
3600
|
/** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
3599
3601
|
this._referenced = signal(false, ...(ngDevMode ? [{ debugName: "_referenced" }] : []));
|
|
3600
|
-
/** Variabile finale su cui è bindato il contenuto della cella. Sarà valorizzato a **Display** se specificato, all'**innerHTML** dell'elemento proiettato altrimenti */
|
|
3601
|
-
this.Description = computed(() => {
|
|
3602
|
-
return this.Display() === null || this.Display() === "" ? this.content.nativeElement.innerText : this.Display();
|
|
3603
|
-
}, ...(ngDevMode ? [{ debugName: "Description" }] : []));
|
|
3604
3602
|
}
|
|
3605
3603
|
/**
|
|
3606
3604
|
* Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
@@ -3626,7 +3624,6 @@ class EsTh {
|
|
|
3626
3624
|
}
|
|
3627
3625
|
/** @ignore */
|
|
3628
3626
|
ngAfterViewInit() {
|
|
3629
|
-
//Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
|
|
3630
3627
|
this.Class.set(this.myself.nativeElement.className.replace("app-display-none", ""));
|
|
3631
3628
|
//Resize
|
|
3632
3629
|
if (this.Resizable())
|
|
@@ -3684,20 +3681,15 @@ class EsTh {
|
|
|
3684
3681
|
$event.preventDefault();
|
|
3685
3682
|
}
|
|
3686
3683
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: EsTh, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
3687
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
3684
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", 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 }, 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)" } }, ngImport: i0, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\n <ng-content></ng-content> \n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\n</span>\n@if (Pinned() && !Fixed()) {\n<span class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\n}\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\n <div class=\"est-head-resizer-internal\"></div>\n</div>", changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
3688
3685
|
}
|
|
3689
3686
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: EsTh, decorators: [{
|
|
3690
3687
|
type: Component,
|
|
3691
|
-
args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\
|
|
3692
|
-
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { ID: [{ type: i0.Input, args: [{ isSignal: true, alias: "es-th", required: false }] }], _Order: [{ type: i0.Input, args: [{ isSignal: true, alias: "Order", required: false }] }], Orderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "Orderable", required: false }] }], Display: [{ type: i0.Input, args: [{ isSignal: true, alias: "Display", required: false }] }], Resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "Resizable", required: false }] }], Pinned: [{ type: i0.Input, args: [{ isSignal: true, alias: "Pinned", required: false }] }], SearchInProgress: [{ type: i0.Input, args: [{ isSignal: true, alias: "SearchInProgress", required: false }] }], OrderBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "OrderBy", required: false }] }], Wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "Wrap", required: false }] }], Fixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "Fixed", required: false }] }],
|
|
3693
|
-
type: Input
|
|
3694
|
-
}], onOrderChange: [{
|
|
3688
|
+
args: [{ selector: "[es-th]", changeDetection: ChangeDetectionStrategy.OnPush, standalone: false, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\n <ng-content></ng-content> \n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\n</span>\n@if (Pinned() && !Fixed()) {\n<span class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\n}\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\n <div class=\"est-head-resizer-internal\"></div>\n</div>" }]
|
|
3689
|
+
}], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }], propDecorators: { ID: [{ type: i0.Input, args: [{ isSignal: true, alias: "es-th", required: false }] }], _Order: [{ type: i0.Input, args: [{ isSignal: true, alias: "Order", required: false }] }], Orderable: [{ type: i0.Input, args: [{ isSignal: true, alias: "Orderable", required: false }] }], Display: [{ type: i0.Input, args: [{ isSignal: true, alias: "Display", required: false }] }], Resizable: [{ type: i0.Input, args: [{ isSignal: true, alias: "Resizable", required: false }] }], Pinned: [{ type: i0.Input, args: [{ isSignal: true, alias: "Pinned", required: false }] }], SearchInProgress: [{ type: i0.Input, args: [{ isSignal: true, alias: "SearchInProgress", required: false }] }], OrderBy: [{ type: i0.Input, args: [{ isSignal: true, alias: "OrderBy", required: false }] }], Wrap: [{ type: i0.Input, args: [{ isSignal: true, alias: "Wrap", required: false }] }], Fixed: [{ type: i0.Input, args: [{ isSignal: true, alias: "Fixed", required: false }] }], onOrderChange: [{
|
|
3695
3690
|
type: Output
|
|
3696
3691
|
}], onUnpinning: [{
|
|
3697
3692
|
type: Output
|
|
3698
|
-
}], content: [{
|
|
3699
|
-
type: ViewChild,
|
|
3700
|
-
args: ["content", { static: false }]
|
|
3701
3693
|
}], Visible: [{
|
|
3702
3694
|
type: Input
|
|
3703
3695
|
}], onMouseUp: [{
|
|
@@ -3853,12 +3845,13 @@ class EstRendererPipe {
|
|
|
3853
3845
|
this.logger = logger;
|
|
3854
3846
|
}
|
|
3855
3847
|
transform(propName, params) {
|
|
3848
|
+
if (!params.src)
|
|
3849
|
+
return params.fallback;
|
|
3856
3850
|
var EsTd = null;
|
|
3857
3851
|
// Perf. Version di `params.src.find((item) => params.name ? item.td === params.name : item.tdForProperty === propName);`
|
|
3858
3852
|
for (let i = 0; i < params.src.length; i++) {
|
|
3859
3853
|
let item = params.src.get(i);
|
|
3860
|
-
if (params.name && item.td === params.name ||
|
|
3861
|
-
!params.name && item.tdForProperty === propName) {
|
|
3854
|
+
if (params.name && item.td === params.name || !params.name && item.tdForProperty === propName) {
|
|
3862
3855
|
EsTd = item;
|
|
3863
3856
|
break;
|
|
3864
3857
|
}
|
|
@@ -3889,12 +3882,13 @@ class EstEditorPipe {
|
|
|
3889
3882
|
this.logger = logger;
|
|
3890
3883
|
}
|
|
3891
3884
|
transform(propName, params) {
|
|
3885
|
+
if (!params.src)
|
|
3886
|
+
return params.fallback;
|
|
3892
3887
|
var Editor = null;
|
|
3893
3888
|
// Perf. Version di `params.src.find((item) => params.name ? item.editor === params.name : item.editorForProperty === propName);`
|
|
3894
3889
|
for (let i = 0; i < params.src.length; i++) {
|
|
3895
3890
|
let item = params.src.get(i);
|
|
3896
|
-
if (params.name && item.editor === params.name ||
|
|
3897
|
-
!params.name && item.editorForProperty === propName) {
|
|
3891
|
+
if (params.name && item.editor === params.name || !params.name && item.editorForProperty === propName) {
|
|
3898
3892
|
Editor = item;
|
|
3899
3893
|
break;
|
|
3900
3894
|
}
|
|
@@ -3947,11 +3941,12 @@ class EsTableDefaultable {
|
|
|
3947
3941
|
/** Componente che permette di rappresentare una griglia di valori */
|
|
3948
3942
|
class EsTableComponent {
|
|
3949
3943
|
/** @ignore */
|
|
3950
|
-
constructor(_zone, ngControl, prefService, deafults, exportGlobalAcl, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3944
|
+
constructor(_zone, ngControl, prefService, deafults, debugMode, exportGlobalAcl, lc, cdr, utilities_H, utiExts, expExts, dateExts, msgExts, copyPasteDetector, clipboardService, logger, emb, rendererRef) {
|
|
3951
3945
|
this._zone = _zone;
|
|
3952
3946
|
this.ngControl = ngControl;
|
|
3953
3947
|
this.prefService = prefService;
|
|
3954
3948
|
this.deafults = deafults;
|
|
3949
|
+
this.debugMode = debugMode;
|
|
3955
3950
|
this.exportGlobalAcl = exportGlobalAcl;
|
|
3956
3951
|
this.lc = lc;
|
|
3957
3952
|
this.cdr = cdr;
|
|
@@ -3975,7 +3970,7 @@ class EsTableComponent {
|
|
|
3975
3970
|
/** View finale su cui bindarsi lato Frontend, il tipo può essere IAppSearch<any> (per la **viewMode**), any[] (per l'**arrayMode**) */
|
|
3976
3971
|
this.View = null; // TODO: signal
|
|
3977
3972
|
/** Modello da cui l'es-table mostra i pulsanti di paginazione in basso a destra */
|
|
3978
|
-
this.arrayPulsanti = signal(
|
|
3973
|
+
this.arrayPulsanti = signal([], ...(ngDevMode ? [{ debugName: "arrayPulsanti" }] : []));
|
|
3979
3974
|
/** Indica se l'es-table deve mostrare il check globale nell'header per fare il "seleziona tutto" */
|
|
3980
3975
|
this.globalCheck = model(false, ...(ngDevMode ? [{ debugName: "globalCheck" }] : []));
|
|
3981
3976
|
/** Conteggio interno per il numero di elementi selezionati */
|
|
@@ -4006,19 +4001,19 @@ class EsTableComponent {
|
|
|
4006
4001
|
/** Impostata a true ogni volta che viene avviata una ricerca, e a false ogni volta che un nuovo valore viene ricevuto */
|
|
4007
4002
|
this.researchInProgress = model(false, ...(ngDevMode ? [{ debugName: "researchInProgress" }] : []));
|
|
4008
4003
|
/** Modello di appoggio temporaneo per i **RowTDs** */
|
|
4009
|
-
this.TMPRowTDs =
|
|
4004
|
+
this.TMPRowTDs = {};
|
|
4010
4005
|
/** Modello rappresentante un dizionario di righe della tabella, con chiave l'hash e valore la lista di celle */
|
|
4011
|
-
this.RowTDs =
|
|
4006
|
+
this.RowTDs = {};
|
|
4012
4007
|
/** Indica se **RowTDs** è un oggetto vuoto o meno */
|
|
4013
4008
|
this.EmptyRowTds = signal(true, ...(ngDevMode ? [{ debugName: "EmptyRowTds" }] : []));
|
|
4014
4009
|
/** Modello di appoggio temporaneo per i **RowTHs** */
|
|
4015
|
-
this.TMPRowTHs =
|
|
4010
|
+
this.TMPRowTHs = [];
|
|
4016
4011
|
/** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */
|
|
4017
|
-
this.RowTHs =
|
|
4012
|
+
this.RowTHs = [];
|
|
4018
4013
|
/** Modello di appoggio temporaneo per i **RowThGroups** */
|
|
4019
|
-
this.TMPRowThGroups =
|
|
4014
|
+
this.TMPRowThGroups = [];
|
|
4020
4015
|
/** Modello rappresentante un singolo header group della tabella. Questa lista è già ordinata e pronta per essere utilizzata in ngFor */
|
|
4021
|
-
this.RowThGroups =
|
|
4016
|
+
this.RowThGroups = [];
|
|
4022
4017
|
/**
|
|
4023
4018
|
* Lista dei contesti. Un contesto non è altro che un hash particolare calcolato su un oggetto che identifica univocamente tale oggetto.
|
|
4024
4019
|
*
|
|
@@ -4057,7 +4052,7 @@ class EsTableComponent {
|
|
|
4057
4052
|
/** Valore del check globale di visibilità valido per tutte le colonne in **ColumnsList** */
|
|
4058
4053
|
this.globalColVisCheck = model(false, ...(ngDevMode ? [{ debugName: "globalColVisCheck" }] : []));
|
|
4059
4054
|
/** Opzioni extra che devono apparire nel Menù contestuale in alto a destra, richiamato dai 3 pallini verticali */
|
|
4060
|
-
this.CornerMenuOptions = input(
|
|
4055
|
+
this.CornerMenuOptions = input([], ...(ngDevMode ? [{ debugName: "CornerMenuOptions" }] : []));
|
|
4061
4056
|
/** Indica se dev'essere possibile effettuare il resize delle colonne */
|
|
4062
4057
|
this._ColumnsResizable = input(null, ...(ngDevMode ? [{ debugName: "_ColumnsResizable", alias: "ColumnsResizable" }] : [{ alias: "ColumnsResizable" }]));
|
|
4063
4058
|
this.ColumnsResizable = signal(null, ...(ngDevMode ? [{ debugName: "ColumnsResizable" }] : []));
|
|
@@ -4068,32 +4063,32 @@ class EsTableComponent {
|
|
|
4068
4063
|
this._AutoUpdate = input(null, ...(ngDevMode ? [{ debugName: "_AutoUpdate", alias: "AutoUpdate" }] : [{ alias: "AutoUpdate" }]));
|
|
4069
4064
|
this.AutoUpdate = signal(null, ...(ngDevMode ? [{ debugName: "AutoUpdate" }] : []));
|
|
4070
4065
|
/** Indica l'altezza cablata che deve assumere la tabella. Es: "100px" | "100%" ... */
|
|
4071
|
-
this.Height = input(
|
|
4066
|
+
this.Height = input(undefined, ...(ngDevMode ? [{ debugName: "Height" }] : []));
|
|
4072
4067
|
/** Indica il colore di sfondo dello spazio vuoto (non ricoperto da dati). Particolarmente utile da impostare in caso di **Height** diverso da null */
|
|
4073
|
-
this.EmptySpaceBackgroundColor = input(
|
|
4068
|
+
this.EmptySpaceBackgroundColor = input("", ...(ngDevMode ? [{ debugName: "EmptySpaceBackgroundColor" }] : []));
|
|
4074
4069
|
/** Indica se dev'essere l'estable a gestire la ricerca, anche la prima. **/
|
|
4075
4070
|
this.EsTableHandledSearch = input(false, ...(ngDevMode ? [{ debugName: "EsTableHandledSearch" }] : []));
|
|
4076
4071
|
/** Permette di impostare l'altezza massima della tabella. Se null la dimensione si adatta al numero di elementi attualmente in visualizzazione */
|
|
4077
|
-
this.MaxHeight = input(
|
|
4072
|
+
this.MaxHeight = input(undefined, ...(ngDevMode ? [{ debugName: "MaxHeight" }] : []));
|
|
4078
4073
|
/** Classi da applicare al contenitore della tabella */
|
|
4079
4074
|
this._ContainerClass = input(null, ...(ngDevMode ? [{ debugName: "_ContainerClass", alias: "ContainerClass" }] : [{ alias: "ContainerClass" }]));
|
|
4080
4075
|
this.ContainerClass = signal(null, ...(ngDevMode ? [{ debugName: "ContainerClass" }] : []));
|
|
4081
4076
|
/** Permette o meno l'export in formato XLSX */
|
|
4082
|
-
this.XLSXExport = input(
|
|
4077
|
+
this.XLSXExport = input(false, ...(ngDevMode ? [{ debugName: "XLSXExport" }] : []));
|
|
4083
4078
|
/** Permette o meno l'export in formato CSV */
|
|
4084
4079
|
this.CSVExport = input(true, ...(ngDevMode ? [{ debugName: "CSVExport" }] : []));
|
|
4085
4080
|
/** Permette di visualizzare o meno l'opzione di paginazione "Tutti" */
|
|
4086
4081
|
this._AllSearch = input(null, ...(ngDevMode ? [{ debugName: "_AllSearch", alias: "AllSearch" }] : [{ alias: "AllSearch" }]));
|
|
4087
4082
|
this.AllSearch = signal(null, ...(ngDevMode ? [{ debugName: "AllSearch" }] : []));
|
|
4088
4083
|
/** 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 */
|
|
4089
|
-
this.HighCellDensity = input(
|
|
4084
|
+
this.HighCellDensity = input(false, ...(ngDevMode ? [{ debugName: "HighCellDensity" }] : []));
|
|
4090
4085
|
/** Abilita o meno la possibilità di selezionare oggetti */
|
|
4091
|
-
this._Selection = input(null, ...(ngDevMode ? [{ debugName: "_Selection", alias: "Selection", transform: this.setUnderlyingSignal
|
|
4086
|
+
this._Selection = input(null, ...(ngDevMode ? [{ debugName: "_Selection", alias: "Selection", transform: (value) => this.setUnderlyingSignal("Selection", value) }] : [{ alias: "Selection", transform: (value) => this.setUnderlyingSignal("Selection", value) }]));
|
|
4092
4087
|
this.Selection = signal(null, ...(ngDevMode ? [{ debugName: "Selection" }] : []));
|
|
4093
4088
|
/** Mostra o meno un messaggio di Loading al primo caricamento della tabella */
|
|
4094
|
-
this.ShowLoadingOnBootstrap = input(
|
|
4089
|
+
this.ShowLoadingOnBootstrap = input(false, ...(ngDevMode ? [{ debugName: "ShowLoadingOnBootstrap" }] : []));
|
|
4095
4090
|
/** Se impostato a **true** aggiunge una colonna con pulsante di eliminazione per effettuare l'elimina dell'oggetto relativo */
|
|
4096
|
-
this.Removal = input(
|
|
4091
|
+
this.Removal = input(false, ...(ngDevMode ? [{ debugName: "Removal" }] : []));
|
|
4097
4092
|
/**
|
|
4098
4093
|
* Condizione che nasconde l'icona di eliminazione inserita impostando **Removal** a true qualora la condizione non venisse rispettata
|
|
4099
4094
|
*
|
|
@@ -4107,7 +4102,7 @@ class EsTableComponent {
|
|
|
4107
4102
|
this._ShiftClick = input(null, ...(ngDevMode ? [{ debugName: "_ShiftClick", alias: "ShiftClick" }] : [{ alias: "ShiftClick" }]));
|
|
4108
4103
|
this.ShiftClick = signal(null, ...(ngDevMode ? [{ debugName: "ShiftClick" }] : []));
|
|
4109
4104
|
/** Indica il testo che va a sostituire "Oggetti Visualizzati" in caso si stia facendo qualcosa di custom */
|
|
4110
|
-
this.CountLabel = input(
|
|
4105
|
+
this.CountLabel = input("", ...(ngDevMode ? [{ debugName: "CountLabel" }] : []));
|
|
4111
4106
|
/** Indica se nascondere o mostrare il componente di paginazione */
|
|
4112
4107
|
this._HidePaging = input(null, ...(ngDevMode ? [{ debugName: "_HidePaging", alias: "HidePaging" }] : [{ alias: "HidePaging" }]));
|
|
4113
4108
|
this.HidePaging = signal(null, ...(ngDevMode ? [{ debugName: "HidePaging" }] : []));
|
|
@@ -4117,8 +4112,6 @@ class EsTableComponent {
|
|
|
4117
4112
|
/** Indica se nascondere o mostrare i pulsanti di paginazione */
|
|
4118
4113
|
this._HidePagingButtons = input(null, ...(ngDevMode ? [{ debugName: "_HidePagingButtons", alias: "HidePagingButtons" }] : [{ alias: "HidePagingButtons" }]));
|
|
4119
4114
|
this.HidePagingButtons = signal(null, ...(ngDevMode ? [{ debugName: "HidePagingButtons" }] : []));
|
|
4120
|
-
/** Riferimento al ContextMenu (ngx-contextmenu) associato al click destro di uno o più elementi selezionati nella tabella */
|
|
4121
|
-
this.ContextMenu = null;
|
|
4122
4115
|
/** Nome dell'esportazione generata da questa tabella */
|
|
4123
4116
|
this.ExportFileName = input("Export.csv", ...(ngDevMode ? [{ debugName: "ExportFileName" }] : []));
|
|
4124
4117
|
/** Classe (HTML) di default della tabella */
|
|
@@ -4127,25 +4120,23 @@ class EsTableComponent {
|
|
|
4127
4120
|
/** Indica di esportare solo le colonne attualmente visibili della view */
|
|
4128
4121
|
this.ExportOnlyVisibleColumns = input(false, ...(ngDevMode ? [{ debugName: "ExportOnlyVisibleColumns" }] : []));
|
|
4129
4122
|
/** @deprecated Indica la presenza di raggruppamenti a livello di header */
|
|
4130
|
-
this.HasHeaderGroup = input(
|
|
4123
|
+
this.HasHeaderGroup = input(false, ...(ngDevMode ? [{ debugName: "HasHeaderGroup" }] : []));
|
|
4131
4124
|
/** @deprecated Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
|
|
4132
|
-
this.HasSecondaryHeaderGroup = input(
|
|
4125
|
+
this.HasSecondaryHeaderGroup = input(false, ...(ngDevMode ? [{ debugName: "HasSecondaryHeaderGroup" }] : []));
|
|
4133
4126
|
/** Indica se nascondere gli Header della tabella */
|
|
4134
|
-
this.HeaderHidden = input(
|
|
4127
|
+
this.HeaderHidden = input(false, ...(ngDevMode ? [{ debugName: "HeaderHidden" }] : []));
|
|
4135
4128
|
/** Indica se nascondere il Body della tabella */
|
|
4136
|
-
this.BodyHidden = input(
|
|
4129
|
+
this.BodyHidden = input(false, ...(ngDevMode ? [{ debugName: "BodyHidden" }] : []));
|
|
4137
4130
|
/**
|
|
4138
4131
|
* Indica se la selezione è temporaneamente disabilitata. Rispetto all'Input **Selection** che visivamente gestisce se ci sono o no gli input di selezione,
|
|
4139
4132
|
* questo Input gestisce se questi input sono abilitati o meno
|
|
4140
4133
|
*/
|
|
4141
|
-
this.SelectionDisabled = input(
|
|
4134
|
+
this.SelectionDisabled = input(false, ...(ngDevMode ? [{ debugName: "SelectionDisabled" }] : []));
|
|
4142
4135
|
/**
|
|
4143
4136
|
* Indica se forzare il sistema di selezione a gestire un elemento per volta.
|
|
4144
4137
|
* Selezionare un'altra riga con una già selezionata applicherà la selezione alla nuova riga, rimuovendola dall'attuale
|
|
4145
4138
|
*/
|
|
4146
|
-
this.SingleSelection = input(
|
|
4147
|
-
/** Callback che dato un oggetto resituisce l'eventuale classe da applicare alla riga collegata all'oggetto */
|
|
4148
|
-
this.RowClassAssigner = null;
|
|
4139
|
+
this.SingleSelection = input(false, ...(ngDevMode ? [{ debugName: "SingleSelection" }] : []));
|
|
4149
4140
|
/** Permette di ordinare i dati in maniera discendente o ascendente */
|
|
4150
4141
|
this._OrderByColumn = input(null, ...(ngDevMode ? [{ debugName: "_OrderByColumn", alias: "OrderByColumn" }] : [{ alias: "OrderByColumn" }]));
|
|
4151
4142
|
this.OrderByColumn = signal(null, ...(ngDevMode ? [{ debugName: "OrderByColumn" }] : []));
|
|
@@ -4171,7 +4162,7 @@ class EsTableComponent {
|
|
|
4171
4162
|
/** Indica operazioni dinamiche generiche che possono essere effettuate per riga. Appaiono come colonne extra sul lato sinistro della tabella */
|
|
4172
4163
|
this.DynamicOperations = input([], ...(ngDevMode ? [{ debugName: "DynamicOperations" }] : []));
|
|
4173
4164
|
/** Indica se visualizzare i dati in maniera gerarchica */
|
|
4174
|
-
this.Hierarchy = input(
|
|
4165
|
+
this.Hierarchy = input(false, ...(ngDevMode ? [{ debugName: "Hierarchy" }] : []));
|
|
4175
4166
|
/** Nome della proprietà che contiene l'ID del padre. Da utilizzare se **Hierarchy** è impostato */
|
|
4176
4167
|
this._ParentKey = input('', ...(ngDevMode ? [{ debugName: "_ParentKey", alias: "ParentKey" }] : [{ alias: "ParentKey" }]));
|
|
4177
4168
|
this.ParentKey = signal('', ...(ngDevMode ? [{ debugName: "ParentKey" }] : []));
|
|
@@ -4274,12 +4265,10 @@ class EsTableComponent {
|
|
|
4274
4265
|
this.ResearchNeeded = false;
|
|
4275
4266
|
/** Colonne visibili della vista attuale. Valorizzato di default al numero massimo di colonne supportate dalla tabella per le casistiche in assenza di custom cells */
|
|
4276
4267
|
this.Columns = signal({ Visibile: 100, VisibleUnpinned: 100, Global: 100 }, ...(ngDevMode ? [{ debugName: "Columns" }] : []));
|
|
4277
|
-
/** In caso di Row Grouping qui viene salvata la vista principale dei gruppi base */
|
|
4278
|
-
this.MainGroupView = null;
|
|
4279
4268
|
/** 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" */
|
|
4280
4269
|
this.BaseItemsCount = null;
|
|
4281
4270
|
/** Indica se ci sono delle colonne pinnate e visibili. Serve per poter settare tutte le colonne prima che arrivino dati a pinned*/
|
|
4282
|
-
this.HasPinnedColumns = signal(
|
|
4271
|
+
this.HasPinnedColumns = signal(false, ...(ngDevMode ? [{ debugName: "HasPinnedColumns" }] : []));
|
|
4283
4272
|
/** Larghezza calcolata del container delle colonne pinnate */
|
|
4284
4273
|
this.PinnedContainerWidth = signal(null, ...(ngDevMode ? [{ debugName: "PinnedContainerWidth" }] : []));
|
|
4285
4274
|
/** 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 */
|
|
@@ -4313,10 +4302,38 @@ class EsTableComponent {
|
|
|
4313
4302
|
this.PropertyNameTrackBy = (_, item) => item.PropertyName;
|
|
4314
4303
|
/** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */
|
|
4315
4304
|
this.IDTrackBy = (_, item) => item.ID;
|
|
4305
|
+
this.IDTrackByOfSignal = (_, item) => item().ID;
|
|
4316
4306
|
/** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID e Order significativi */
|
|
4317
4307
|
this.IDAndOrderTrackBy = (_, item) => `${item.ID}|${item.Order}`;
|
|
4318
4308
|
/** Funzione di trackby generica per tutti gli oggetti che hanno il campo ID */
|
|
4319
4309
|
this.valTrackBy = (_, item) => item.val;
|
|
4310
|
+
/**
|
|
4311
|
+
* 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
|
|
4312
|
+
*
|
|
4313
|
+
* Dichiarata così per evitare spam di .bind
|
|
4314
|
+
*
|
|
4315
|
+
* @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica
|
|
4316
|
+
* @param {any} item Oggetto sopra il quale è stata attivata la modifica
|
|
4317
|
+
* @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
|
|
4318
|
+
*/
|
|
4319
|
+
this.finalizeUserEdit = (rowItem, item, columnIndex) => {
|
|
4320
|
+
this.logger.log("Function called 'finalizeUserEdit'");
|
|
4321
|
+
// Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo
|
|
4322
|
+
requestAnimationFrame(() => {
|
|
4323
|
+
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
4324
|
+
let newValues = { _editing: false };
|
|
4325
|
+
let newRowItem = Object.assign(rowItem(), newValues);
|
|
4326
|
+
rowItem.set(newRowItem);
|
|
4327
|
+
let old = newRowItem.old_value;
|
|
4328
|
+
let niu = dynMode ? item.properties[newRowItem.PropertyName] : item[newRowItem.PropertyName];
|
|
4329
|
+
let olddate = this.dateExts.getDateConvertion(old);
|
|
4330
|
+
let niudate = this.dateExts.getDateConvertion(niu);
|
|
4331
|
+
if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
|
|
4332
|
+
return;
|
|
4333
|
+
this.onModelChange.emit([new EsTableModelChange(item, newRowItem.ID, newRowItem.PropertyName, old, niu)]);
|
|
4334
|
+
this.selectionStatus[item._ordinal]?.[columnIndex]?.val_setter?.(niu);
|
|
4335
|
+
});
|
|
4336
|
+
};
|
|
4320
4337
|
// Range selection Experimentals
|
|
4321
4338
|
this.mouseIsDown = false;
|
|
4322
4339
|
this.rangeSelected = false;
|
|
@@ -4326,8 +4343,9 @@ class EsTableComponent {
|
|
|
4326
4343
|
this.EsTdsCache = {};
|
|
4327
4344
|
this.retries = 0;
|
|
4328
4345
|
effect(() => {
|
|
4329
|
-
|
|
4330
|
-
|
|
4346
|
+
let sv = this.SearchView();
|
|
4347
|
+
if (sv)
|
|
4348
|
+
this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, sv.page, sv.pages || 1, sv.objectcount || sv.items.length, sv.itemsperpageoverride));
|
|
4331
4349
|
});
|
|
4332
4350
|
// Sarebbe bello... per quando View diventa signal
|
|
4333
4351
|
/*effect(() => {
|
|
@@ -4356,22 +4374,25 @@ class EsTableComponent {
|
|
|
4356
4374
|
}
|
|
4357
4375
|
setUnderlyingSignal(signalName, value) {
|
|
4358
4376
|
this[signalName].set(value);
|
|
4377
|
+
return value;
|
|
4359
4378
|
}
|
|
4360
4379
|
/** @ignore */
|
|
4361
4380
|
ngOnInit() {
|
|
4362
4381
|
// click destro su una riga con selezione attiva: Tiro fuori il context menu e selezione l'elemento corrente
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
|
|
4367
|
-
|
|
4368
|
-
|
|
4369
|
-
|
|
4370
|
-
|
|
4371
|
-
|
|
4372
|
-
|
|
4373
|
-
this.
|
|
4374
|
-
|
|
4382
|
+
let menu = (this.ContextMenu || this.tableEmptyMenu);
|
|
4383
|
+
if (menu)
|
|
4384
|
+
this.ctxMenuSubscription = menu.open.subscribe(t => {
|
|
4385
|
+
// Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...
|
|
4386
|
+
if (t.item._sep)
|
|
4387
|
+
return;
|
|
4388
|
+
let shouldEmit = !t.item._selected;
|
|
4389
|
+
t.item._selected = true;
|
|
4390
|
+
this.selection_H.clearSelectionStatusExcluding(undefined);
|
|
4391
|
+
var itemSelection = this.selection_H.handleItemsSelection([t.item]);
|
|
4392
|
+
this.changed();
|
|
4393
|
+
if (shouldEmit)
|
|
4394
|
+
this.onSelectionChanged.emit(itemSelection);
|
|
4395
|
+
});
|
|
4375
4396
|
// Assegnazione per tutti gli Input di default
|
|
4376
4397
|
this.ColumnsResizable.set(this.utilities_H.InputOrDefault(this._ColumnsResizable(), this.deafults?.ColumnsResizable));
|
|
4377
4398
|
this.AutoUpdate.set(this.utilities_H.InputOrDefault(this._AutoUpdate(), this.deafults?.AutoUpdate));
|
|
@@ -4407,9 +4428,9 @@ class EsTableComponent {
|
|
|
4407
4428
|
async ngAfterViewInit() {
|
|
4408
4429
|
// Se utilizzo la new spicy mode deduco tutti i parametri di lavoro possibili al caricamento della tabella
|
|
4409
4430
|
// Vengono sovrascritte solo le proprietà non impostate dall'utente
|
|
4410
|
-
this.EsTds = this.EsTdsDirective
|
|
4411
|
-
this.EsThs = this.EsThsDirective
|
|
4412
|
-
let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...this.ThTdProvider];
|
|
4431
|
+
this.EsTds = (this.EsTdsDirective?.toArray() || []);
|
|
4432
|
+
this.EsThs = (this.EsThsDirective?.toArray() || []);
|
|
4433
|
+
let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];
|
|
4413
4434
|
if (thsTdsProviders?.length > 0) {
|
|
4414
4435
|
await forkJoin(thsTdsProviders.map(t => t.LoadedSignal)).toPromise();
|
|
4415
4436
|
this.EsTds = [...this.EsTds, ...thsTdsProviders.map(t => t.EsTdsDirective.toArray()).flat()];
|
|
@@ -4453,20 +4474,22 @@ class EsTableComponent {
|
|
|
4453
4474
|
/** @ignore */
|
|
4454
4475
|
registerOnChange(fn) { this.propagateChange = fn; }
|
|
4455
4476
|
/** @ignore */
|
|
4456
|
-
registerOnTouched(
|
|
4477
|
+
registerOnTouched(_) { }
|
|
4457
4478
|
/** @ignore */
|
|
4458
4479
|
changed(clearItems = false) {
|
|
4459
4480
|
if (clearItems && this.viewMode()) {
|
|
4460
|
-
|
|
4481
|
+
let isprops = this.ItemSourceProperty();
|
|
4482
|
+
if (!isprops)
|
|
4461
4483
|
this.View.items = [];
|
|
4462
4484
|
else
|
|
4463
|
-
this.View[
|
|
4485
|
+
this.View[isprops] = [];
|
|
4464
4486
|
}
|
|
4465
4487
|
this.propagateChange(this.View);
|
|
4466
4488
|
}
|
|
4467
4489
|
/** @ignore */
|
|
4468
4490
|
async writeValue(obj, throttle = true) {
|
|
4469
4491
|
this.View = obj ? obj : null;
|
|
4492
|
+
let sv = this.SearchView();
|
|
4470
4493
|
// Qui il concetto è "devo aspettare che l'afterViewInit venga eseguito prima di eseguire questo"
|
|
4471
4494
|
// E dato che entrambi aspettano sui provider li faccio così
|
|
4472
4495
|
let thsTdsProviders = [...(this.EsThTdProvider ? [this.EsThTdProvider] : []), ...(this.ThTdProvider || [])];
|
|
@@ -4480,7 +4503,7 @@ class EsTableComponent {
|
|
|
4480
4503
|
}
|
|
4481
4504
|
// Mi è arrivata l'AppSearch quindi di sicuro non ho una ricerca in progress
|
|
4482
4505
|
this.researchInProgress.set(false);
|
|
4483
|
-
if (!this.View && !
|
|
4506
|
+
if (!this.View && !sv) {
|
|
4484
4507
|
// Su view nulla evito di fare pressoché qualsiasi cosa. Se arriva un null devo anche assicurarmi di non mostrare nulla
|
|
4485
4508
|
this.boundSource.set(this.TMPBoundSource || []);
|
|
4486
4509
|
// Per essere sicuro che dopo un bind di oggetti la es-table aggiorni la grafica
|
|
@@ -4491,8 +4514,8 @@ class EsTableComponent {
|
|
|
4491
4514
|
// lo correggo--------------------------------------------------------------------------------------------------------------
|
|
4492
4515
|
if (this.View && typeof this.View.itemsperpageoverride != 'undefined' && !(this.View instanceof AppSearch))
|
|
4493
4516
|
this.View.__proto__ = new AppSearch();
|
|
4494
|
-
else if (
|
|
4495
|
-
|
|
4517
|
+
else if (sv && typeof sv.itemsperpageoverride != 'undefined' && !(sv instanceof AppSearch))
|
|
4518
|
+
sv.__proto__ = new AppSearch();
|
|
4496
4519
|
// -------------------------------------------------------------------------------------------------------------------------
|
|
4497
4520
|
let isp = this.ItemSourceProperty();
|
|
4498
4521
|
if (this.View && this.View instanceof AppSearch) {
|
|
@@ -4541,7 +4564,7 @@ class EsTableComponent {
|
|
|
4541
4564
|
}
|
|
4542
4565
|
// Se mi baso su direttive ma nelle preference è presente anche solo una colonna non presente nelle direttive
|
|
4543
4566
|
// vuol dire che l'es-table è cambiata quindi non imposto preference
|
|
4544
|
-
if (this.EsThsDirective?.length > 0) {
|
|
4567
|
+
if ((this.EsThsDirective?.length || 0) > 0) {
|
|
4545
4568
|
for (let i = 0; i < repository.length; i++) {
|
|
4546
4569
|
if (this.thsCacheSet && !this.thsCache[repository[i]]) {
|
|
4547
4570
|
updatedPrefs = false;
|
|
@@ -4579,7 +4602,7 @@ class EsTableComponent {
|
|
|
4579
4602
|
let repository;
|
|
4580
4603
|
let source;
|
|
4581
4604
|
if (this.View.report_columns) {
|
|
4582
|
-
repository = this.View.report_columns.map(t => t.id);
|
|
4605
|
+
repository = this.View.report_columns.map((t) => t.id);
|
|
4583
4606
|
source = cols;
|
|
4584
4607
|
}
|
|
4585
4608
|
else {
|
|
@@ -4628,7 +4651,7 @@ class EsTableComponent {
|
|
|
4628
4651
|
*/
|
|
4629
4652
|
finalizeContext() {
|
|
4630
4653
|
let viewCasted = this.View;
|
|
4631
|
-
let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective
|
|
4654
|
+
let hasRowGroups = viewCasted && (viewCasted.groupings && viewCasted.groupings.filter(t => !t.aggregation).length > 0) || (this.arrayMode() && this.EsThsDirective?.some(t => t.thGroup));
|
|
4632
4655
|
// Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
|
|
4633
4656
|
if (this.arrayMode() && hasRowGroups)
|
|
4634
4657
|
this.UseArrayModePaging.set(false);
|
|
@@ -4716,8 +4739,8 @@ class EsTableComponent {
|
|
|
4716
4739
|
// Molte cose sono ovviamente disponibili solo in modalità View
|
|
4717
4740
|
if ((viewMode || arrayMode) && customCells) {
|
|
4718
4741
|
let view = viewMode ? View : null;
|
|
4719
|
-
let itemsAndGroups = viewMode ? [...((isp ? view[isp] : view
|
|
4720
|
-
let si = viewMode ? view
|
|
4742
|
+
let itemsAndGroups = viewMode ? [...((isp ? view[isp] : view?.items) || []), ...(view?.groups || [])] : View;
|
|
4743
|
+
let si = viewMode ? view?.selection : this.arraymodeSelection;
|
|
4721
4744
|
// N.B: Rispettare l'ordine di queste 3 macrocategorie è VITALE
|
|
4722
4745
|
// ************************************* Sistemazioni di TH, TD, e visibilità varie *************************************
|
|
4723
4746
|
// 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
|
|
@@ -4728,14 +4751,14 @@ class EsTableComponent {
|
|
|
4728
4751
|
this.EsTds = ret.tds;
|
|
4729
4752
|
}
|
|
4730
4753
|
// Gestione delle view in modalità report, i th e i td vengono rigenerati dalle configurazioni della view
|
|
4731
|
-
if (!this.arrayMode() && view
|
|
4754
|
+
if (!this.arrayMode() && view?.report_columns) {
|
|
4732
4755
|
this.logger.log("Generating ths and tds from report results");
|
|
4733
4756
|
let ret = this.reportMode_H.generateThsAndTdsFromView(view);
|
|
4734
4757
|
this.EsThs = ret.ths;
|
|
4735
4758
|
this.EsTds = ret.tds;
|
|
4736
4759
|
}
|
|
4737
4760
|
// Espando i th e i td multipli duplicandoli
|
|
4738
|
-
let ret = this.columnMetadata_H.expandMultiThsAndTds(this.EsThs, this.EsTds, itemsAndGroups);
|
|
4761
|
+
let ret = this.columnMetadata_H.expandMultiThsAndTds(this.EsThs || [], this.EsTds || [], itemsAndGroups);
|
|
4739
4762
|
this.EsThs = ret.expThs;
|
|
4740
4763
|
this.EsTds = ret.expTds;
|
|
4741
4764
|
// Genero la cache dei th da usare da qui in poi, dopo avergli lasciato fare le sue cose in caso ci siano dei multi o dei report
|
|
@@ -4747,7 +4770,7 @@ class EsTableComponent {
|
|
|
4747
4770
|
// Prepassaggio per tirare fuori tutte le info utili sugli headers in modo da non ricacolarseli sempre dopo
|
|
4748
4771
|
let hI = this.columnMetadata_H.evaluateHeadersGroupingInfos(this.EsThs);
|
|
4749
4772
|
// Valuta lo stato iniziale di selezione a range
|
|
4750
|
-
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, dynColDefs);
|
|
4773
|
+
this.selection_H.evaluateSingleCellSelection(itemsAndGroups, hI.leafs, dynColDefs || []);
|
|
4751
4774
|
if (this.arrayMode()) // In modalità array non ho un backend...
|
|
4752
4775
|
this.rowGrouping_H.arrayModeReviewGroupings(hI.leafs); // ... i raggruppamenti li devo fare lato client
|
|
4753
4776
|
this.columnMetadata_H.reviewColumnsList(hI.leafs); // Aggiorna la lista delle colonne da mostrare nella dialog per ordinamento ecc
|
|
@@ -4797,7 +4820,7 @@ class EsTableComponent {
|
|
|
4797
4820
|
this.BaseItemsCount = view?.objectcount || view?.length || 0;
|
|
4798
4821
|
return;
|
|
4799
4822
|
}
|
|
4800
|
-
let groupingKeys = view?.groupings?.filter(t => !t.aggregation)?.length || 0;
|
|
4823
|
+
let groupingKeys = view?.groupings?.filter((t) => !t.aggregation)?.length || 0;
|
|
4801
4824
|
if (groupingKeys == 0) {
|
|
4802
4825
|
this.boundSource.set(this.TMPBoundSource);
|
|
4803
4826
|
this.BaseItemsCount = view?.objectcount || 0;
|
|
@@ -4882,7 +4905,7 @@ class EsTableComponent {
|
|
|
4882
4905
|
}
|
|
4883
4906
|
if (!this.OrderByColumn())
|
|
4884
4907
|
return;
|
|
4885
|
-
this.columnMetadata_H.handleTHOrderChange(id, order);
|
|
4908
|
+
this.columnMetadata_H.handleTHOrderChange(id, order ? order : undefined);
|
|
4886
4909
|
}
|
|
4887
4910
|
/**
|
|
4888
4911
|
* Metodo da chiamare ogni volta che si vuole dare evidenza all'esterno del bisogno di rieffettuare la ricerca
|
|
@@ -5040,16 +5063,16 @@ class EsTableComponent {
|
|
|
5040
5063
|
if (th.thIf || th.thGroup) {
|
|
5041
5064
|
let thClass = (th.thClass || "") + (th.thShrink ? " app-col-min" : "") + (th.thGroup ? " est-col-min" : "");
|
|
5042
5065
|
toAdd = {
|
|
5043
|
-
Pinned: columnsListCache[th.th].pinned,
|
|
5066
|
+
Pinned: !!columnsListCache[th.th].pinned,
|
|
5044
5067
|
Fixed: th.thFixed,
|
|
5045
5068
|
PinnedWidth: th.thPinnedWidth,
|
|
5046
5069
|
ID: th.th,
|
|
5047
5070
|
Visible: th.thVisible,
|
|
5048
5071
|
Class: thClass,
|
|
5049
|
-
Order: th.thOrder,
|
|
5072
|
+
Order: th.thOrder || null,
|
|
5050
5073
|
Orderable: th.thOrderable,
|
|
5051
5074
|
Template: th.Template,
|
|
5052
|
-
Alignment: (th.thAlignment || this.DefaultAlignment()).toLowerCase(),
|
|
5075
|
+
Alignment: (th.thAlignment || this.DefaultAlignment() || "Left").toLowerCase(),
|
|
5053
5076
|
// Se non è nessun contenuto né nessun template mostro semplicemente l'ID dell'header
|
|
5054
5077
|
Content: th.thStaticContent != null ? th.thStaticContent : th.Template ? '' : th.th,
|
|
5055
5078
|
Wrap: th.thWrap,
|
|
@@ -5115,7 +5138,7 @@ class EsTableComponent {
|
|
|
5115
5138
|
(t._item && ((anyG._expanded && t._thisKey == anyG._thisKey) || (!anyG._expanded && t._thisKey.startsWith(anyG._thisKey)))));
|
|
5116
5139
|
allRelatives.forEach(t => { t._visible = anyG._expanded; if (t._group)
|
|
5117
5140
|
t._expanded = false; });
|
|
5118
|
-
return;
|
|
5141
|
+
return true;
|
|
5119
5142
|
}
|
|
5120
5143
|
if (anyG._expanded) {
|
|
5121
5144
|
// Resetto ipp
|
|
@@ -5154,7 +5177,7 @@ class EsTableComponent {
|
|
|
5154
5177
|
* @param {boolean} forcedVal Valore forzato di check da assegnare agli oggetti
|
|
5155
5178
|
*/
|
|
5156
5179
|
globalCheckChanged(forcedVal = null) {
|
|
5157
|
-
this.selection_H.clearSelectionStatusExcluding(
|
|
5180
|
+
this.selection_H.clearSelectionStatusExcluding(undefined);
|
|
5158
5181
|
let bs = this.boundSource();
|
|
5159
5182
|
// 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
|
|
5160
5183
|
let items = bs.find(t => t._group) ? bs.filter(t => t._group && !t._parent) : bs;
|
|
@@ -5173,7 +5196,8 @@ class EsTableComponent {
|
|
|
5173
5196
|
* @returns {boolean} **true** se l'operaizone è andata a buon fine, **false** altrimenti
|
|
5174
5197
|
*/
|
|
5175
5198
|
handleClick(event, item) {
|
|
5176
|
-
|
|
5199
|
+
debugger;
|
|
5200
|
+
this.selection_H.clearSelectionStatusExcluding(undefined);
|
|
5177
5201
|
let selecteditems = [];
|
|
5178
5202
|
if (event.shiftKey && this.ShiftClick() && !this.SingleSelection()) {
|
|
5179
5203
|
this.utiExts.clearTextSelection();
|
|
@@ -5258,8 +5282,8 @@ class EsTableComponent {
|
|
|
5258
5282
|
autoUpdateChanged() {
|
|
5259
5283
|
if (!/^[1-9]\d*$/.test(this.seconds()))
|
|
5260
5284
|
this.seconds.set('10');
|
|
5261
|
-
let secondsInMs = parseInt(this.seconds()
|
|
5262
|
-
if (this.autoUpdate)
|
|
5285
|
+
let secondsInMs = parseInt(this.seconds()) * 1000;
|
|
5286
|
+
if (this.autoUpdate())
|
|
5263
5287
|
this.updateTimer = setInterval(() => { this.emitSearchRequest(false); }, secondsInMs);
|
|
5264
5288
|
else
|
|
5265
5289
|
clearInterval(this.updateTimer);
|
|
@@ -5273,36 +5297,6 @@ class EsTableComponent {
|
|
|
5273
5297
|
dynamicOperation(item, opid) {
|
|
5274
5298
|
this.onDynamicOperation.emit({ id: opid, item: item });
|
|
5275
5299
|
}
|
|
5276
|
-
/**
|
|
5277
|
-
* Ottiene il contenuto dell'EsTd da utilizzare per la colonna specificata
|
|
5278
|
-
*
|
|
5279
|
-
* @param {string} column Colonna per cui cercare la cella
|
|
5280
|
-
* @param {string} name Nome diretto per cercare il TD con l'ID. Questa variabile ha priorità rispetto a **column**
|
|
5281
|
-
*
|
|
5282
|
-
* @returns {TemplateRef<any>} Template da usare per la colonna
|
|
5283
|
-
*/
|
|
5284
|
-
findEsTd(column, name = null) {
|
|
5285
|
-
var EsTd = this.EsTdsDirective.find((item) => name ? item.td === name : item.tdForProperty === column);
|
|
5286
|
-
// Name non trovato, fallback al nome della colonna
|
|
5287
|
-
if (name && column && !EsTd)
|
|
5288
|
-
EsTd = this.EsTdsDirective.find((item) => item.tdForProperty === column);
|
|
5289
|
-
return EsTd ? EsTd.Template : null;
|
|
5290
|
-
}
|
|
5291
|
-
/**
|
|
5292
|
-
* Ottiene il contenuto dell'editor EsTd da utilizzare per la colonna specificata
|
|
5293
|
-
*
|
|
5294
|
-
* @param {string} column Colonna per cui cercare l'editor
|
|
5295
|
-
* @param {string} name Nome diretto per cercare l'Editor con l'ID. Questa variabile ha priorità rispetto a **column**
|
|
5296
|
-
*
|
|
5297
|
-
* @returns {TemplateRef<any>} Template da usare per la colonna
|
|
5298
|
-
*/
|
|
5299
|
-
findEditor(column, name = null) {
|
|
5300
|
-
var Editor = this.EsTdEditorDirectives.find((item) => name ? item.editor === name : item.editorForProperty === column);
|
|
5301
|
-
// Name non trovato, fallback al nome della colonna
|
|
5302
|
-
if (name && column && !Editor)
|
|
5303
|
-
Editor = this.EsTdEditorDirectives.find((item) => item.editorForProperty === column);
|
|
5304
|
-
return Editor ? Editor.Template : null;
|
|
5305
|
-
}
|
|
5306
5300
|
/**
|
|
5307
5301
|
* Equivalente del metodo **addToPage** riadattato per la modalità array
|
|
5308
5302
|
*
|
|
@@ -5352,8 +5346,8 @@ class EsTableComponent {
|
|
|
5352
5346
|
/** Metodo eventualmente richiamabile anche dal componente esterno che permette di forzare un refresh della tabella */
|
|
5353
5347
|
forceRefresh(relaunchSearch = true) {
|
|
5354
5348
|
// 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
|
|
5355
|
-
let arrayPage;
|
|
5356
|
-
let arrayIpp;
|
|
5349
|
+
let arrayPage = null;
|
|
5350
|
+
let arrayIpp = null;
|
|
5357
5351
|
if (this.arrayMode()) {
|
|
5358
5352
|
arrayPage = this.arraymodePage;
|
|
5359
5353
|
arrayIpp = this.ArraymodeItemsPerPage();
|
|
@@ -5363,8 +5357,8 @@ class EsTableComponent {
|
|
|
5363
5357
|
this.writeValue(this.View);
|
|
5364
5358
|
this.cdr.detectChanges();
|
|
5365
5359
|
if (this.arrayMode()) {
|
|
5366
|
-
this.ArraymodeItemsPerPage.set(arrayIpp);
|
|
5367
|
-
this.arrayGoToPage(arrayPage);
|
|
5360
|
+
this.ArraymodeItemsPerPage.set(arrayIpp || 15);
|
|
5361
|
+
this.arrayGoToPage(arrayPage || 1);
|
|
5368
5362
|
}
|
|
5369
5363
|
}
|
|
5370
5364
|
/**
|
|
@@ -5378,7 +5372,7 @@ class EsTableComponent {
|
|
|
5378
5372
|
if (!groupOrHead)
|
|
5379
5373
|
return;
|
|
5380
5374
|
groupOrHead.thVisible = visibility;
|
|
5381
|
-
let thsArr = this.EsThsDirective
|
|
5375
|
+
let thsArr = this.EsThsDirective?.toArray() || [];
|
|
5382
5376
|
for (let i = 0; i < thsArr.length; i++) {
|
|
5383
5377
|
let th = thsArr[i];
|
|
5384
5378
|
if (th.thParent == groupOrHeader)
|
|
@@ -5398,11 +5392,11 @@ class EsTableComponent {
|
|
|
5398
5392
|
*/
|
|
5399
5393
|
dbClickEditOrSingleClickRowSelection($event, rowItem, item) {
|
|
5400
5394
|
let rowItm = rowItem();
|
|
5401
|
-
let selection = this.Selection();
|
|
5395
|
+
let selection = this.Selection() || false;
|
|
5402
5396
|
// Prima cosa da fare è controllare se ci sono dei range lasciati da operazioni precedenti (se applicabile) e ripulirli
|
|
5403
5397
|
if (this.rangeSelected && !$event.ctrlKey && selection) {
|
|
5404
5398
|
this.logger.log("clearing previously selected range");
|
|
5405
|
-
this.selection_H.clearSelectionStatusExcluding(
|
|
5399
|
+
this.selection_H.clearSelectionStatusExcluding();
|
|
5406
5400
|
this.rangeSelected = false;
|
|
5407
5401
|
return;
|
|
5408
5402
|
}
|
|
@@ -5484,7 +5478,7 @@ class EsTableComponent {
|
|
|
5484
5478
|
// Se ho un singolo valore lo applico a tutta la selezione
|
|
5485
5479
|
let value = values.length == 1 && values[0].length == 1 ? values[0][0] : values[r][c];
|
|
5486
5480
|
let old = cell.value;
|
|
5487
|
-
let niu = cell.val_setter(value);
|
|
5481
|
+
let niu = cell.val_setter?.(value);
|
|
5488
5482
|
let olddate = this.dateExts.getDateConvertion(old);
|
|
5489
5483
|
let niudate = this.dateExts.getDateConvertion(niu);
|
|
5490
5484
|
if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
|
|
@@ -5517,14 +5511,22 @@ class EsTableComponent {
|
|
|
5517
5511
|
// Stessa cosa se ho custom cell dato che la gestione dei click viene affidata ai singoli TD
|
|
5518
5512
|
if ($event.ctrlKey || (this.UseCustomCells() && !internalCall))
|
|
5519
5513
|
return true;
|
|
5520
|
-
|
|
5521
|
-
|
|
5522
|
-
|
|
5514
|
+
let mfc = false;
|
|
5515
|
+
if (selection) {
|
|
5516
|
+
mfc = true;
|
|
5517
|
+
this.selection_H.clearSelectionStatusExcluding();
|
|
5518
|
+
}
|
|
5519
|
+
if (selection && !item.locked && !item._sep && !item._group) {
|
|
5520
|
+
mfc = true;
|
|
5523
5521
|
this.handleClick($event, item);
|
|
5524
|
-
|
|
5522
|
+
}
|
|
5523
|
+
else if (item._group) {
|
|
5524
|
+
mfc = true;
|
|
5525
5525
|
this.handleGroupClick(item);
|
|
5526
|
+
}
|
|
5526
5527
|
// Ora che non è attaccato direttamente all'html devo fare un markforcheck finite le operazioni sui grouping
|
|
5527
|
-
|
|
5528
|
+
if (mfc)
|
|
5529
|
+
this.cdr.markForCheck();
|
|
5528
5530
|
}
|
|
5529
5531
|
/**
|
|
5530
5532
|
* Gestione del click destro sull'es-table
|
|
@@ -5542,7 +5544,7 @@ class EsTableComponent {
|
|
|
5542
5544
|
* @param {any} item Oggetto sopra il quale è stata attivata la modifica
|
|
5543
5545
|
*/
|
|
5544
5546
|
setupUserEdit(rowItem, item) {
|
|
5545
|
-
this.selection_H.clearSelectionStatusExcluding(
|
|
5547
|
+
this.selection_H.clearSelectionStatusExcluding();
|
|
5546
5548
|
let rowItm = rowItem();
|
|
5547
5549
|
if (this.Editable() && rowItm.PropertyName) {
|
|
5548
5550
|
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
@@ -5552,30 +5554,6 @@ class EsTableComponent {
|
|
|
5552
5554
|
this.cdr.detectChanges();
|
|
5553
5555
|
requestAnimationFrame(() => { this.FocusSubject.next(); });
|
|
5554
5556
|
}
|
|
5555
|
-
/**
|
|
5556
|
-
* 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
|
|
5557
|
-
*
|
|
5558
|
-
* @param {TdElement} rowItem Elemento di riga su cui è stata attivata la modifica
|
|
5559
|
-
* @param {any} item Oggetto sopra il quale è stata attivata la modifica
|
|
5560
|
-
* @param {number} columnIndex Indice della colonna su cui è avvenuta la modifica
|
|
5561
|
-
*/
|
|
5562
|
-
finalizeUserEdit(rowItem, item, columnIndex) {
|
|
5563
|
-
// Qualche componente di ngprime qui ha bisogno di un po' di tempo per appiccicare il valore nuovo
|
|
5564
|
-
requestAnimationFrame(() => {
|
|
5565
|
-
let dynMode = (this.DynamicRowColumnsDefinition()?.length || 0) > 0;
|
|
5566
|
-
let newValues = { _editing: false };
|
|
5567
|
-
let newRowItem = Object.assign(rowItem(), newValues);
|
|
5568
|
-
rowItem.set(newRowItem);
|
|
5569
|
-
let old = newRowItem.old_value;
|
|
5570
|
-
let niu = dynMode ? item.properties[newRowItem.PropertyName] : item[newRowItem.PropertyName];
|
|
5571
|
-
let olddate = this.dateExts.getDateConvertion(old);
|
|
5572
|
-
let niudate = this.dateExts.getDateConvertion(niu);
|
|
5573
|
-
if ((olddate && niudate && olddate.isSame && olddate.isSame(niudate)) || old === niu)
|
|
5574
|
-
return;
|
|
5575
|
-
this.onModelChange.emit([new EsTableModelChange(item, newRowItem.ID, newRowItem.PropertyName, old, niu)]);
|
|
5576
|
-
this.selectionStatus[item._ordinal][columnIndex].val_setter(niu);
|
|
5577
|
-
});
|
|
5578
|
-
}
|
|
5579
5557
|
mousedown(event, rowItem, _) {
|
|
5580
5558
|
// Tasto diverso dal click sinistro -> ciao è stato bello e intenso
|
|
5581
5559
|
if (event.buttons != 1 || !this.RangeSelection())
|
|
@@ -5618,8 +5596,8 @@ class EsTableComponent {
|
|
|
5618
5596
|
this.selection_H.singleCellSelection({ view: event.view, range: true }, row, column, this.firstCoordinates);
|
|
5619
5597
|
this.logger.log(`mouse move over ${row}:${column}`);
|
|
5620
5598
|
this.rangeSelected = true;
|
|
5599
|
+
this.cdr.markForCheck();
|
|
5621
5600
|
}
|
|
5622
|
-
this.cdr.markForCheck();
|
|
5623
5601
|
}
|
|
5624
5602
|
mouseup(event) {
|
|
5625
5603
|
if (!this.RangeSelection())
|
|
@@ -5658,6 +5636,7 @@ class EsTableComponent {
|
|
|
5658
5636
|
//* Piango ancora
|
|
5659
5637
|
// Gestione Embedding
|
|
5660
5638
|
showDialog(dlg, elementRef) {
|
|
5639
|
+
debugger;
|
|
5661
5640
|
dlg.show();
|
|
5662
5641
|
this.retries = 0;
|
|
5663
5642
|
if (this.emb.Embedded)
|
|
@@ -5665,7 +5644,7 @@ class EsTableComponent {
|
|
|
5665
5644
|
}
|
|
5666
5645
|
doFixDialog(dlg, elementRef) {
|
|
5667
5646
|
this.retries++;
|
|
5668
|
-
let element = elementRef
|
|
5647
|
+
let element = elementRef;
|
|
5669
5648
|
if (!element) {
|
|
5670
5649
|
if (this.retries > 10)
|
|
5671
5650
|
return;
|
|
@@ -5681,7 +5660,7 @@ class EsTableComponent {
|
|
|
5681
5660
|
this.emb.MainWindow.postMessage({ type: "modal-open", backdropHeight: backdropHeight }, "*");
|
|
5682
5661
|
}
|
|
5683
5662
|
doFixBody(elementRef) {
|
|
5684
|
-
let body = elementRef.
|
|
5663
|
+
let body = elementRef.getElementsByClassName("modal-body")[0];
|
|
5685
5664
|
// Ci prova finch� non trova il body dato che potrebbe essere creato in qualsiasi momento
|
|
5686
5665
|
if (!body) {
|
|
5687
5666
|
setTimeout(() => this.doFixBody(elementRef), 250);
|
|
@@ -5697,12 +5676,12 @@ class EsTableComponent {
|
|
|
5697
5676
|
return;
|
|
5698
5677
|
this.emb.MainWindow.postMessage({ type: "modal-close" }, "*");
|
|
5699
5678
|
}
|
|
5700
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", 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: EST_EXPORT_GLOBAL_ACL, 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 }); }
|
|
5701
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", 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 }, _AutoSortHierarchy: { classPropertyName: "_AutoSortHierarchy", publicName: "AutoSortHierarchy", 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\" style=\"width: 15px\" [(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\" style=\"width: 15px\" [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\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDAndOrderTrackBy\">\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}}|{{rowHeader.Order}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDAndOrderTrackBy\">\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 rowHeader.Order: {{rowHeader.Order}}\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 \r\n <ng-container *ac=\"exportGlobalAcl\">\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 </ng-container>\r\n\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 style=\"width: 15px\"\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 @switch(ctx.type){\r\n @case(\"date\"){\r\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\r\n }\r\n @case(\"datetime\"){\r\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\r\n }\r\n @default {\r\n {{ctx.value}}\r\n }\r\n }\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\" style=\"width: 15px\" [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\" style=\"width: 15px\" [(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\" style=\"width: 15px\" [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", "cdkDropListHasAnchor"], 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: "directive", type: i15.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }, { 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: i5.LocDatePipe, name: "loc_date" }, { 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 }); }
|
|
5679
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.25", 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: EST_DEBUG, optional: true }, { token: EST_EXPORT_GLOBAL_ACL, 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 }); }
|
|
5680
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.25", 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 }, _AutoSortHierarchy: { classPropertyName: "_AutoSortHierarchy", publicName: "AutoSortHierarchy", 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 -->\n@if (AutoUpdate()) {\n <div class=\"w-100\">\n <div class=\"pull-right\">\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}}\n </div>\n <div class=\"pull-right m-t-2\">\n <label class=\"est-switch\">\n <input type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"est-slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n}\n\n@if (View) {\n <div class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\n @if (FirstBind() && ShowLoadingOnBootstrap()) {\n <div class=\"est-loading-box\">\n <div class=\"est-loading-content\">\n <span class=\"fa fa-spinner fa-spin\"></span> {{'Performing Table bootstrap' | localize: lc}}...\n </div>\n </div>\n }\n @if (PagingStyle() == 'both' || PagingStyle() == 'top') {\n <div class=\"est-top-pager\">\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n @if (canSelectAll() || (View?.selection || arraymodeSelection)?.all) {\n <div class=\"est-top-allselect\">\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> \n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\n </div>\n }\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\n @if ((SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom') {\n <tr>\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\n </th>\n </tr>\n }\n <!-- Blocco header group -->\n @if (RowThGroups) {\n\n @for (level of RowThGroups; track $index) {\n <tr>\n @for (cell of level; track IDTrackBy($index, cell)) {\n <th [attr.colspan]=\"cell.Span\"\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\n class=\"est-text-center\">\n @if (cell.Pinned) {\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\">\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n </div>\n }\n @else {\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n }\n </th>\n }\n </tr>\n }\n }\n @if (!RowThGroups) {\n @if (HasHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n <!-- Blocco header group secondario -->\n @if (HasSecondaryHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n }\n <!-- Blocco effettivo degli header -->\n <tr>\n <!-- <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n Selection: {{Selection()}}\n HasPinnedColumns: {{HasPinnedColumns()}}\n arrayMode: {{arrayMode()}}\n viewMode: {{viewMode()}}\n UseCustomCells: {{UseCustomCells()}}\n RowTHs: {{!!RowTHs}}\n RowTHs.length: {{RowTHs?.length}}\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\n </div> -->\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\n @if (Selection() && !HasPinnedColumns()) {\n <th class=\"est-col-min\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n <!-- Header che valgono per view mode e array mode -->\n @if (arrayMode() || viewMode()) {\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()) {\n @for (operation of DynamicOperations(); track idTrackBy($index, operation)) {\n <th class=\"est-col-min est-no-side-padding\"></th>\n }\n @for (rowHeader of DynamicRowColumnsDefinition(); track PropertyNameTrackBy($index, rowHeader)) {\n @if (rowHeader.Visible) {\n @if (OrderByColumn()) {\n <th 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>\n }\n @else {\n <th 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>\n }\n }\n }\n }\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\n @if (UseCustomCells() && RowTHs?.length > 0) {\n @if (HasPinnedColumns()) {\n <th class=\"est-pinned-header est-col-min\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\n @if (Selection()) {\n <th class=\"est-col-min est-no-border\" [style.width.px]=\"20\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n @if (rowHeader && rowHeader.Visible && rowHeader.Pinned) {\n <th\n [style.width.px]=\"rowHeader.PinnedWidth\"\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [class.est-pinned-internal-header]=\"true\"\n [class.est-no-border]=\"true\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Pinned]=\"true\"\n [Fixed]=\"rowHeader.Fixed\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}|{{rowHeader.Order}}</span>\n }\n </th>\n }\n }\n </div>\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n <!-- <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n rowHeader: {{!!rowHeader}}\n rowHeader.Visible: {{rowHeader?.Visible}}\n rowHeader.Pinned: {{rowHeader?.Pinned}}\n rowHeader.Template: {{!!rowHeader.Template}}\n rowHeader.Order: {{rowHeader.Order}}\n </div> -->\n @if (rowHeader && rowHeader.Visible && !rowHeader.Pinned) {\n <th\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [style.text-align]=\" rowHeader.Alignment || null\"\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}</span>\n }\n </th>\n }\n }\n }\n }\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\n @if (Removal()) {\n <th [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\n }\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\n @if (Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()) {\n <th class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\n <div class=\"est-pointer\">\n @if (HiddenColumns() || ColumnsOrdering()) {\n <a class=\"dropdown-item\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\n @if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n @else {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n </a>\n }\n <ng-container *ac=\"exportGlobalAcl\">\n @if (Export() && CSVExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\n }\n @if (Export() && XLSXExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\n }\n </ng-container>\n @for (option of CornerMenuOptions(); track idTrackBy($index, option)) {\n <a class=\"dropdown-item\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\n }\n </div>\n </div>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\n @if (Selection()) {\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\n }\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\n @else {\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\n }\n </tbody>\n </table>\n </div>\n @if (PagingStyle() == 'both' || PagingStyle() == 'bottom') {\n <div>\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n </div>\n}\n\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\n<ng-template #pagingElement>\n @if (!FirstBind()) {\n <!-- Pulsanti avanti-indietro di paginazione -->\n @if (PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)) {\n <div class=\"pull-right btn-toolbar\">\n @if (PagerOptions.View?.pagingavailable || viewMode()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n @if (arrayMode() && UseArrayModePaging() && !SearchView()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n </div>\n }\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\n @if (PagerOptions.ShowCount || PagerOptions.ShowPagingOptions) {\n <div class=\"pull-right\">\n @if (PagerOptions.ShowPaging) {\n <div class=\"est-mt-min-5\">\n @if (!PagerOptions.UsesView) {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\n }\n @else {\n <es-paging [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>\n }\n </div>\n }\n </div>\n }\n <div class=\"clearfix\"></div>\n }\n</ng-template>\n\n<!-- Template che contiene i pulsanti per cambiare pagina -->\n<ng-template #pagingButtons let-options>\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\n @if (options.Array) {\n <div class=\"est-inline\">@for (p of options.Array; track valTrackBy($index, p)) {\n <a class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a>\n }</div>\n }\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\n </div>\n</ng-template>\n\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\n<ng-template #TBodySelection let-templateOptions>\n @for (item of boundSource(); track bodyTrackBy(i, item); let even = $even; let i = $index) {\n @if (item._visible || (!Hierarchy() && !ArrayGrouping())) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-pointer]=\"!item.locked\"\n [class.est-white-selected]=\"item._selected && !item.locked\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\n (click)=\"!RangeSelection() && handleRowClick($event, item, true)\"\n (contextmenu)=\"onRightClick();\">\n @if (!item.locked && !item._sep && !HasPinnedColumns()) {\n <td>\n <input type=\"checkbox\"\n style=\"width: 15px\"\n [disabled]=\"templateOptions.selDisabled\"\n [class.est-pointer]=\"!item.locked\"\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && !HasPinnedColumns()) {\n <td></td>\n }\n\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #TBody>\n @for (item of boundSource(); track bodyTrackBy(i, item); let i = $index; let even = $even) {\n @if (item._visible || !Hierarchy()) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n (click)=\"handleRowClick($event, item, false)\">\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #groupPager let-item>\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body \">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\n </td>\n }\n @if (item._grouplevel > 1) {\n <td [attr.colspan]=\"item._grouplevel-1\"></td>\n }\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\n @if (RowGroupingPagingStyle() == 'right') {\n <div class=\"est-rg-sep-flex-right\">\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>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-ipp\"><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>\n }\n </div>\n }\n\n @if (RowGroupingPagingStyle() == 'left') {\n <div class=\"est-rg-sep-flex-left\">\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>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\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>\n }\n </div>\n }\n </td>\n </ng-template>\n\n <!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\n <ng-template #basicColumns let-item let-index=\"index\">\n @if ((!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\n }\n </ng-template>\n\n <ng-template #defaultEditor let-ctx>\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\n @if (ctx.item.properties) {\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(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n @else {\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(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n </ng-template>\n\n <ng-template #defaultEsTd let-ctx>\n <!-- TODO: Formattare il valore in base a valType.type -->\n @if (ctx.type == 'enum') {\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\n }\n @else {\n @switch(ctx.type){\n @case(\"date\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\n }\n @case(\"datetime\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\n }\n @default {\n {{ctx.value}}\n }\n }\n }\n </ng-template>\n\n <ng-template #customCells let-item let-opt=\"templateOptions\">\n @if (UseCustomCells() && !EmptyRowTds()) {\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\n @if (!item.locked && !item._sep && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\n <input type=\"checkbox\" style=\"width: 15px\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\"></td>\n }\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (cell().Pinned) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: true, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n </div>\n </td>\n }\n <!-- Body effettivo della riga -->\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (!cell().Pinned;) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: false, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n }\n </ng-template>\n\n <!-- Cella customizzata, elemento grafico base per la tabella -->\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\">\n\n @let c = cell();\n\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\n @if (c.IconClass && c.Visible) {\n @if (!c.ConditionField || (((item.properties || item) | est_propinsensitive : c.ConditionField) == c.ConditionValue)) {\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{c.Title}}\" class=\"{{c.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, c.ID)\">{{c.Content}}</span></td>\n }\n @else {\n <td class=\"est-col-min est-no-side-padding\"></td>\n }\n }\n\n <!-----------------------------------------------------------------------------------------------------------------------\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\n - . Generiche -\n - . Gestione allineamento e colori per la modalit\u00E0 report -\n - . Gestioni grafiche particolari per il Pinned -\n - . Gestione della selezione a singola cella in assenza di pinned -\n - . Gestione click classico e selezione multicella -\n ------------------------------------------------------------------------------------------------------------------------->\n\n @if (!c.IconClass && c.Visible) {\n <td\n es-td=\"{{c.Property || c.ID}}\"\n id=\"estd_{{c.Property || c.ID}}_{{item._ordinal}}_{{index}}\"\n class=\"{{ c.Class }}\"\n [Context]=\"item._hash\"\n [class.est-default-row-height]=\"!HighCellDensity()\"\n [class.est-white-selected]=\"item._selected\"\n [class.est-no-selection]=\"Editable() && c.PropertyName\"\n [class.est-rg-hdr]=\"c.GroupHeader\"\n [class.est-rg-agg]=\"c.GroupAggregation\"\n [class.est-nowrap]=\"Hierarchy() || !c.Wraps\"\n [style.text-align]=\"(!pinned && c.Alignment) ? c.Alignment : null\"\n [style.color]=\"(!pinned && item.forecolors && c.PropAccessor) ? item.forecolors[c.PropAccessor] : null\"\n [style.background-color]=\"(!pinned && item.backcolors && c.PropAccessor) ? item.backcolors[c.PropAccessor] : null\"\n [style.width.px]=\"pinned ? c.PinnedWidth : null\"\n [class.est-no-border]=\"pinned\"\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\n [class.est-ltab-border]=\"c.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\n [class.est-rtab-border]=\"c.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\n [class.est-selected-cell]=\"selStatus?.selected\"\n [class.est-cell-lborder]=\" selStatus?.lborder\"\n [class.est-cell-rborder]=\" selStatus?.rborder\"\n [class.est-cell-tborder]=\" selStatus?.tborder\"\n [class.est-cell-bborder]=\" selStatus?.bborder\"\n [class.est-cell-lborder-tmp]=\"!c.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\n [class.est-cell-rborder-tmp]=\"!c.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\n #cellRef\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\n <!--\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\n (mousedown)=\"mousedown($event, cell, item)\"\n (mouseenter)=\"mouseenter($event)\"\n (mouseup)=\"mouseup($event)\"\n -->\n <div [class.est-edit-hidden]=\"c._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\n <ng-container #DEBUG>\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\n </ng-container>\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\n @if (c.Template) {\n @if (!c.Multi) {\n <ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <span><ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: (item[c.MultiProp] ? item[c.MultiProp][c.MultiIndex] : {}) }\"></ng-container></span>\n }\n }\n <!-- 8%\n Template non disponibile, pu\u00F2 venire da\n RoutePath in caso sia un link di una tabella dinamica\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\n -->\n @if (!c.Template && !c.Multi && !c.Content) {\n @if (c.RoutePath) {\n <a [routerLink]=\"item | est_routerlink : c.RoutePath : c.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[c.PropertyName] : item[c.PropertyName]\"></a>\n }\n @else if (c.PropAccessor) {\n <span>\n {{(item.values? item.values[c.PropAccessor] : item[c.PropAccessor]) | est_format: c.Format }}\n </span>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_renderer: { name: c.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: c, value: item.properties ? item.properties[c.PropertyName] : item[c.PropertyName], type: c.PropertyType} }\"></ng-container>\n }\n }\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\n @if (Hierarchy() && index == 0) {\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\n }\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\n @if (c.Content) {\n {{c.Content}}\n }\n </div>\n @if (c._editing) {\n <div class=\"est-mt-min-5\">\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_editor: { name: c.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: c, signal: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit } }\"></ng-container>\n </div>\n }\n </td>\n }\n </ng-template>\n\n <!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\n <ng-template #HierarchyNavigator let-item>\n @if (!item.parent) {\n <span class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\n }\n @else if (item.parent && item._expanded) {\n <span class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()!])\"></span>\n }\n @else {\n <span class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()!])\"></span>\n }\n \n </ng-template>\n\n <!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\n <ng-template #bodyDeleteAndExport let-options>\n @if (Removal() && !RemovalCondition()) {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @if (Removal() && RemovalCondition()) {\n\n @if(options.item[RemovalCondition()])\n {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\n }\n }\n @if (Export() || HiddenColumns() || CornerMenuOptions()) {\n <td class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\n }\n </ng-template>\n\n <!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\n <context-menu #emptyMenu>\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\n </context-menu>\n\n <!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\n <div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" cdkDrag>\n <div class=\"modal-content\">\n <div class=\"modal-header est-pointer\" cdkDragHandle>\n <h5 class=\"modal-title pull-left\">\n @if (HiddenColumns() && ColumnsOrdering()) {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n @else if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n @if (!TMPColumnsList || TMPColumnsList.length == 0) {\n <div class=\"card card-info est-padding-10 est-margin-bottom-0\">\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\n </div>\n }\n @if (TMPColumnsList && TMPColumnsList.length > 0) {\n <div style=\"max-height:500px; overflow-y:auto\">\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-->\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\n <thead>\n <tr>\n @if (HiddenColumns()) {\n <th class=\"est-col-min\">\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\n </th>\n }\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\n <!--Filler-->\n <th></th>\n <!-- Pinner -->\n @if (DirectivesBased()) {\n <th class=\"est-col-min\"></th>\n }\n </tr>\n </thead>\n <tbody\n cdkDropList\n [cdkDropListData]=\"TMPColumnsList\"\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\n class=\"est-dropbox\">\n @for (item of TMPColumnsList; track idTrackBy(i, item); let i = $index; let last = $last) {\n <tr\n class=\"est-pointer est-droplist\"\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\n [class.est-no-selection]=\"!item.visible\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\n @if (HiddenColumns()) {\n <td>\n <input type=\"checkbox\" style=\"width: 15px\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\n </td>\n }\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\n @if (item.template) {\n <!-- Padri -->\n @if (item.parentTemplates && item.parentTemplates.length > 0) {\n <span class=\"est-fw-bold est-fs-13\">\n ( \n @for (parent of item.parentTemplates; track idTrackBy($index, parent); let last = $last) {\n @if (parent.tmpl) {\n <ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container>\n }\n @if (parent.content) {\n {{parent.content}}\n }\n @if (!last) {\n <span> - </span>\n }\n }\n )\n </span>\n }\n <!-- Template header originale -->\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\n }\n @if (!item.template) {\n {{item.description}}\n }\n </td>\n <!--Filler-->\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\n <!-- Pinner -->\n @if (DirectivesBased() && ColumnsPinnable()) {\n <td>\n @if (!item.fixed && item.pinnable) {\n <span class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\n </div>\n </div>\n </div>\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.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", "cdkDropListHasAnchor"], 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: "directive", type: i15.AccessControlDirective, selector: "[ac]", inputs: ["ac", "acAbsolute"] }, { 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", "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: i5.LocDatePipe, name: "loc_date" }, { 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 }); }
|
|
5702
5681
|
}
|
|
5703
5682
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImport: i0, type: EsTableComponent, decorators: [{
|
|
5704
5683
|
type: Component,
|
|
5705
|
-
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\" style=\"width: 15px\" [(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\" style=\"width: 15px\" [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\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDAndOrderTrackBy\">\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}}|{{rowHeader.Order}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs; trackBy: IDAndOrderTrackBy\">\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 rowHeader.Order: {{rowHeader.Order}}\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 \r\n <ng-container *ac=\"exportGlobalAcl\">\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 </ng-container>\r\n\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 style=\"width: 15px\"\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 @switch(ctx.type){\r\n @case(\"date\"){\r\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\r\n }\r\n @case(\"datetime\"){\r\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\r\n }\r\n @default {\r\n {{ctx.value}}\r\n }\r\n }\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\" style=\"width: 15px\" [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\" style=\"width: 15px\" [(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\" style=\"width: 15px\" [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"] }]
|
|
5684
|
+
args: [{ selector: 'es-table', viewProviders: [{ provide: LocalizationService, useClass: EsTableLoc }], changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, standalone: false, template: "<!-- Patacchino di autoaggiornamento -->\n@if (AutoUpdate()) {\n <div class=\"w-100\">\n <div class=\"pull-right\">\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}}\n </div>\n <div class=\"pull-right m-t-2\">\n <label class=\"est-switch\">\n <input type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"autoUpdate\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"autoUpdateChanged();\" />\n <div class=\"est-slider round\"></div>\n </label>\n </div>\n <div class=\"clearfix\"></div>\n </div>\n}\n\n@if (View) {\n <div class=\"est-relative\" [style.height]=\"Height()\" [style.background-color]=\"EmptySpaceBackgroundColor()\">\n @if (FirstBind() && ShowLoadingOnBootstrap()) {\n <div class=\"est-loading-box\">\n <div class=\"est-loading-content\">\n <span class=\"fa fa-spinner fa-spin\"></span> {{'Performing Table bootstrap' | localize: lc}}...\n </div>\n </div>\n }\n @if (PagingStyle() == 'both' || PagingStyle() == 'top') {\n <div class=\"est-top-pager\">\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n @if (canSelectAll() || (View?.selection || arraymodeSelection)?.all) {\n <div class=\"est-top-allselect\">\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> \n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\n </div>\n }\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\n @if ((SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom') {\n <tr>\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\n </th>\n </tr>\n }\n <!-- Blocco header group -->\n @if (RowThGroups) {\n\n @for (level of RowThGroups; track $index) {\n <tr>\n @for (cell of level; track IDTrackBy($index, cell)) {\n <th [attr.colspan]=\"cell.Span\"\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\n class=\"est-text-center\">\n @if (cell.Pinned) {\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\">\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n </div>\n }\n @else {\n @if (cell.Content) {\n {{cell.Content}}\n }\n @else {\n <ng-container *ngTemplateOutlet=\"cell.Template\"></ng-container>\n }\n }\n </th>\n }\n </tr>\n }\n }\n @if (!RowThGroups) {\n @if (HasHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n <!-- Blocco header group secondario -->\n @if (HasSecondaryHeaderGroup()) {\n <tr>\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\n @if (Export()) {\n <th></th>\n }\n </tr>\n }\n }\n <!-- Blocco effettivo degli header -->\n <tr>\n <!-- <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n Selection: {{Selection()}}\n HasPinnedColumns: {{HasPinnedColumns()}}\n arrayMode: {{arrayMode()}}\n viewMode: {{viewMode()}}\n UseCustomCells: {{UseCustomCells()}}\n RowTHs: {{!!RowTHs}}\n RowTHs.length: {{RowTHs?.length}}\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\n </div> -->\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\n @if (Selection() && !HasPinnedColumns()) {\n <th class=\"est-col-min\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n <!-- Header che valgono per view mode e array mode -->\n @if (arrayMode() || viewMode()) {\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\n }\n <!-- Se ho un modello dinamico dell'oggetto creo le colonne in base alle propriet\u00E0 -->\n @if ((!UseCustomCells() || !RowTHs || RowTHs.length == 0) && DynamicRowColumnsDefinition()) {\n @for (operation of DynamicOperations(); track idTrackBy($index, operation)) {\n <th class=\"est-col-min est-no-side-padding\"></th>\n }\n @for (rowHeader of DynamicRowColumnsDefinition(); track PropertyNameTrackBy($index, rowHeader)) {\n @if (rowHeader.Visible) {\n @if (OrderByColumn()) {\n <th 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>\n }\n @else {\n <th 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>\n }\n }\n }\n }\n <!-- Se non ho un modello dinamico ma invece delle celle custom, genero gli header in base ai row th -->\n @if (UseCustomCells() && RowTHs?.length > 0) {\n @if (HasPinnedColumns()) {\n <th class=\"est-pinned-header est-col-min\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-simple-border-bottom\">\n @if (Selection()) {\n <th class=\"est-col-min est-no-border\" [style.width.px]=\"20\">\n @if (!SingleSelection()) {\n <input class=\"est-pointer\" style=\"width: 15px\" type=\"checkbox\" [disabled]=\"SelectionDisabled()\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\n }\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n @if (rowHeader && rowHeader.Visible && rowHeader.Pinned) {\n <th\n [style.width.px]=\"rowHeader.PinnedWidth\"\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [class.est-pinned-internal-header]=\"true\"\n [class.est-no-border]=\"true\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Pinned]=\"true\"\n [Fixed]=\"rowHeader.Fixed\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null } \"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}|{{rowHeader.Order}}</span>\n }\n </th>\n }\n }\n </div>\n </th>\n }\n @for (rowHeader of RowTHs; track IDAndOrderTrackBy($index, rowHeader)) {\n <!-- <div id=\"thead->tr->th->debug_block\" style=\"display: none; white-space: pre-wrap;\">\n rowHeader: {{!!rowHeader}}\n rowHeader.Visible: {{rowHeader?.Visible}}\n rowHeader.Pinned: {{rowHeader?.Pinned}}\n rowHeader.Template: {{!!rowHeader.Template}}\n rowHeader.Order: {{rowHeader.Order}}\n </div> -->\n @if (rowHeader && rowHeader.Visible && !rowHeader.Pinned) {\n <th\n es-th=\"{{rowHeader.ID}}\"\n class=\"{{rowHeader.Class || ''}}\"\n [style.text-align]=\" rowHeader.Alignment || null\"\n [class.est-ltab-border]=\"rowHeader.LeftBorder\"\n [class.est-rtab-border]=\"rowHeader.RightBorder\"\n [class.est-nowrap]=\"!rowHeader.Wrap\"\n [Order]=\"rowHeader.Order\"\n [Resizable]=\"ColumnsResizable()\"\n [Orderable]=\"rowHeader.Orderable\"\n [OrderBy]=\"OrderByColumn()\"\n [SearchInProgress]=\"researchInProgress()\"\n (onOrderChange)=\"thOrderChanged(rowHeader.ID, $event)\">\n @if (rowHeader.Template) {\n <ng-container *ngTemplateOutlet=\"rowHeader.Template; context: { $implicit: rowHeader.Multi ? rowHeader.MultiContent : null }\"></ng-container>\n }\n @else {\n <span>{{rowHeader.Content}}</span>\n }\n </th>\n }\n }\n }\n }\n <!--Per l'eliminazione mi serve un header aggiuntivo-->\n @if (Removal()) {\n <th [class.est-right-9]=\"Export() || HiddenColumns()\" class=\"est-col-min est-sticky-last-column\"><span class=\"fa fa-trash\"></span></th>\n }\n <!--Per l'esportazione mi serve l'header extra da cui faccio uscire i 3 pallocchi-->\n @if (Export() || HiddenColumns() || ColumnsOrdering() || CornerMenuOptions()) {\n <th class=\"est-table-dotted-menu est-sticky-last-column est-col-min text-sm-center\">\n <!-- Blocco con i 3 pallocchi che tira fuori il context menu delle operazioni -->\n <div class=\"btn-group\" container=\"body\" placement=\"bottom right\" dropdown #dropdown=\"bs-dropdown\" [autoClose]=\"true\">\n <span dropdownToggle class=\"fa fa-ellipsis-v est-fs-18 est-pointer est-padding-3\"></span>\n <div *dropdownMenu class=\"dropdown-menu dropdown-menu-right est-bring-to-front-strong\">\n <div class=\"est-pointer\">\n @if (HiddenColumns() || ColumnsOrdering()) {\n <a class=\"dropdown-item\" (click)=\"columnMetadata_H.resetColumnVisSelection(); showDialog(changeColumnVisibilityModal, columnsDialog)\">\n @if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n @else {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n </a>\n }\n <ng-container *ac=\"exportGlobalAcl\">\n @if (Export() && CSVExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\n }\n @if (Export() && XLSXExport()) {\n <a class=\"dropdown-item\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\n }\n </ng-container>\n @for (option of CornerMenuOptions(); track idTrackBy($index, option)) {\n <a class=\"dropdown-item\" (click)=\"cornerActionClicked(option.id)\">{{option.description}}</a>\n }\n </div>\n </div>\n </div>\n </th>\n }\n </tr>\n </thead>\n <tbody [hidden]=\"BodyHidden() || FirstBind()\" [class.est-no-selection]=\"RangeSelection()\">\n <!--Con selection attiva richiamo il template che gestisce il context menu-->\n @if (Selection()) {\n <ng-container *ngTemplateOutlet=\"TBodySelection; context: { $implicit: { selDisabled: arrayMode() ? false : SelectionDisabled(), sel: Selection() }}\"></ng-container>\n }\n <!--Senza selection richiamo il template che NON gestisce il context menu-->\n @else {\n <ng-container *ngTemplateOutlet=\"TBody\"></ng-container>\n }\n </tbody>\n </table>\n </div>\n @if (PagingStyle() == 'both' || PagingStyle() == 'bottom') {\n <div>\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\n </div>\n }\n </div>\n}\n\n<!-- Template che contiene tutte le info di paginazione in modo da poterlo replicare anche sopra -->\n<ng-template #pagingElement>\n @if (!FirstBind()) {\n <!-- Pulsanti avanti-indietro di paginazione -->\n @if (PagerOptions.ShowPaging && PagerOptions.ShowButtons && (PagerOptions.PagerCount > 10 || PagerOptions.PagerCount == -1)) {\n <div class=\"pull-right btn-toolbar\">\n @if (PagerOptions.View?.pagingavailable || viewMode()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: addToPage.bind(this), GTP: goToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n @if (arrayMode() && UseArrayModePaging() && !SearchView()) {\n <ng-container *ngTemplateOutlet=\"pagingButtons; context: { $implicit: { Margin: true, ATP: arrayAddToPage.bind(this), GTP: arrayGoToPage.bind(this), Array: arrayPulsanti() }}\"></ng-container>\n }\n </div>\n }\n <!-- Paginatore dove appare la count e le opzioni di paginazione -->\n @if (PagerOptions.ShowCount || PagerOptions.ShowPagingOptions) {\n <div class=\"pull-right\">\n @if (PagerOptions.ShowPaging) {\n <div class=\"est-mt-min-5\">\n @if (!PagerOptions.UsesView) {\n <es-paging [CountLabel]=\"CountLabel()\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage()\" (pagingSelected)=\"items_H.refreshPaging($event)\"></es-paging>\n }\n @else {\n <es-paging [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>\n }\n </div>\n }\n </div>\n }\n <div class=\"clearfix\"></div>\n }\n</ng-template>\n\n<!-- Template che contiene i pulsanti per cambiare pagina -->\n<ng-template #pagingButtons let-options>\n <div class=\"est-flex\" [class.est-margin-left-50]=\"options.Margin\">\n <a class=\"btn\" class=\"est-page-prev app-pointer\" (click)=\"options.ATP(-1, options.separator)\"><span class=\"fa fa-chevron-left\"></span></a>\n @if (options.Array) {\n <div class=\"est-inline\">@for (p of options.Array; track valTrackBy($index, p)) {\n <a class=\"btn est-page-sel {{p.cssClass}}\" (click)=\"options.GTP(p.val, options.separator)\">{{p.val}}</a>\n }</div>\n }\n <a class=\"btn\" class=\"est-page-next app-pointer\" (click)=\"options.ATP(1, options.separator)\"><span class=\"fa fa-chevron-right\"></span></a>\n </div>\n</ng-template>\n\n<!-- Questi due template rappresentano effettivamente il body della tabella. essendo il tr l'unica cosa che davvero cambia, il resto \u00E8 templatizzato -->\n<ng-template #TBodySelection let-templateOptions>\n @for (item of boundSource(); track bodyTrackBy(i, item); let even = $even; let i = $index) {\n @if (item._visible || (!Hierarchy() && !ArrayGrouping())) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-pointer]=\"!item.locked\"\n [class.est-white-selected]=\"item._selected && !item.locked\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n [contextMenu]=\"!item.locked ? (ContextMenu || emptyMenu) : emptyMenu\" [contextMenuSubject]=\"item\"\n (click)=\"!RangeSelection() && handleRowClick($event, item, true)\"\n (contextmenu)=\"onRightClick();\">\n @if (!item.locked && !item._sep && !HasPinnedColumns()) {\n <td>\n <input type=\"checkbox\"\n style=\"width: 15px\"\n [disabled]=\"templateOptions.selDisabled\"\n [class.est-pointer]=\"!item.locked\"\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\"\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && !HasPinnedColumns()) {\n <td></td>\n }\n\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i, templateOptions: templateOptions }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #TBody>\n @for (item of boundSource(); track bodyTrackBy(i, item); let i = $index; let even = $even) {\n @if (item._visible || !Hierarchy()) {\n <tr\n [class]=\"item._rowClass ? item._rowClass : ''\"\n [class.est-line-through]=\"item.removed || item.deleted\"\n [class.est-rg]=\"item._group\"\n [class.est-rg-sep]=\"item._sep\"\n (click)=\"handleRowClick($event, item, false)\">\n @if (item._sep) {\n <ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item, index: i }\"></ng-container>\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, index: i }\"></ng-container>\n }\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item, index: i }}\"></ng-container>\n </tr>\n }\n }\n </ng-template>\n\n <ng-template #groupPager let-item>\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body \">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\n </td>\n }\n @if (item._grouplevel > 1) {\n <td [attr.colspan]=\"item._grouplevel-1\"></td>\n }\n <td [attr.colspan]=\"Columns().VisibleUnpinned - (item._grouplevel > 0 ? item._grouplevel - 1 : 0)\">\n @if (RowGroupingPagingStyle() == 'right') {\n <div class=\"est-rg-sep-flex-right\">\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>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\n <div class=\"est-rg-ipp\"><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>\n }\n </div>\n }\n\n @if (RowGroupingPagingStyle() == 'left') {\n <div class=\"est-rg-sep-flex-left\">\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>\n @if ((item.searches == 'groups' ? item.view.groupcount : item.view.objectcount) > 10) {\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>\n }\n </div>\n }\n </td>\n </ng-template>\n\n <!-- Questo template contiene la print condizionale su tabelle semplici, con header e body scritti a manazza -->\n <ng-template #basicColumns let-item let-index=\"index\">\n @if ((!UseCustomCells() || EmptyRowTds()) && !DynamicRowColumnsDefinition()) {\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item, index: index}\"></ng-container>\n }\n </ng-template>\n\n <ng-template #defaultEditor let-ctx>\n <!-- Un po' triste ma questo \u00E8 il metodo pi\u00F9 semplice per gestire il cambio di modello -->\n <!-- Manca da reimplementare il [FocusSubject]=\"FocusSubject\" -->\n @if (ctx.item.properties) {\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(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n @else {\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(ctx.signal, ctx.item, ctx.columnIndex)\"></form-adaptive>\n }\n </ng-template>\n\n <ng-template #defaultEsTd let-ctx>\n <!-- TODO: Formattare il valore in base a valType.type -->\n @if (ctx.type == 'enum') {\n {{ (ctx.value | est_lookup : ctx.definition.PropertySource).description }}\n }\n @else {\n @switch(ctx.type){\n @case(\"date\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY' }}\n }\n @case(\"datetime\"){\n {{ctx.value | loc_date: 'DD/MM/YYYY HH:mm:ss'}}\n }\n @default {\n {{ctx.value}}\n }\n }\n }\n </ng-template>\n\n <ng-template #customCells let-item let-opt=\"templateOptions\">\n @if (UseCustomCells() && !EmptyRowTds()) {\n <!-- Cella che aggrega tutte le colonne che devono essere pinnate -->\n @if (HasPinnedColumns()) {\n <td class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border\">\n @if (!item.locked && !item._sep && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\n <input type=\"checkbox\" style=\"width: 15px\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\n </td>\n }\n @if ((item.locked || item._sep) && Selection()) {\n <td class=\"est-no-border est-col-min\" [style.width.px]=\"20\"></td>\n }\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (cell().Pinned) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: true, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n </div>\n </td>\n }\n <!-- Body effettivo della riga -->\n @for (cell of RowTDs[item._hash]; track IDTrackByOfSignal(index, cell); let index = $index) {\n @if (!cell().Pinned;) {\n <ng-container *ngTemplateOutlet=\"customTd; context: { \n $implicit: item, \n index: index, \n cell: cell, \n pinned: false, \n selectionStatus: selectionStatus[item._ordinal]?.[index],\n selectionStatusUp: selectionStatus[item._ordinal - 1]?.[index],\n selectionStatusDown: selectionStatus[item._ordinal + 1]?.[index],\n selectionStatusLeft: selectionStatus[item._ordinal]?.[index - 1],\n selectionStatusRight: selectionStatus[item._ordinal]?.[index + 1] \n };\"></ng-container>\n }\n }\n }\n </ng-template>\n\n <!-- Cella customizzata, elemento grafico base per la tabella -->\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\">\n\n @let c = cell();\n\n <!-- Customizzazione per celle con icona (sono essenzialmente operazioni semplici e basta) -->\n @if (c.IconClass && c.Visible) {\n @if (!c.ConditionField || (((item.properties || item) | est_propinsensitive : c.ConditionField) == c.ConditionValue)) {\n <td [class.est-no-right-padding]=\"index != DynamicOperations().length -1\" [class.est-no-left-padding]=\"index != 0\" class=\"est-col-min\"><span title=\"{{c.Title}}\" class=\"{{c.IconClass}} est-pointer\" (click)=\"dynamicOperation(item, c.ID)\">{{c.Content}}</span></td>\n }\n @else {\n <td class=\"est-col-min est-no-side-padding\"></td>\n }\n }\n\n <!-----------------------------------------------------------------------------------------------------------------------\n - ATTENZIONE: Gli spazi fra gli Input di questo mega td sono significativi e dividono la dichiarazione in sezioni: -\n - . Generiche -\n - . Gestione allineamento e colori per la modalit\u00E0 report -\n - . Gestioni grafiche particolari per il Pinned -\n - . Gestione della selezione a singola cella in assenza di pinned -\n - . Gestione click classico e selezione multicella -\n ------------------------------------------------------------------------------------------------------------------------->\n\n @if (!c.IconClass && c.Visible) {\n <td\n es-td=\"{{c.Property || c.ID}}\"\n id=\"estd_{{c.Property || c.ID}}_{{item._ordinal}}_{{index}}\"\n class=\"{{ c.Class }}\"\n [Context]=\"item._hash\"\n [class.est-default-row-height]=\"!HighCellDensity()\"\n [class.est-white-selected]=\"item._selected\"\n [class.est-no-selection]=\"Editable() && c.PropertyName\"\n [class.est-rg-hdr]=\"c.GroupHeader\"\n [class.est-rg-agg]=\"c.GroupAggregation\"\n [class.est-nowrap]=\"Hierarchy() || !c.Wraps\"\n [style.text-align]=\"(!pinned && c.Alignment) ? c.Alignment : null\"\n [style.color]=\"(!pinned && item.forecolors && c.PropAccessor) ? item.forecolors[c.PropAccessor] : null\"\n [style.background-color]=\"(!pinned && item.backcolors && c.PropAccessor) ? item.backcolors[c.PropAccessor] : null\"\n [style.width.px]=\"pinned ? c.PinnedWidth : null\"\n [class.est-no-border]=\"pinned\"\n [class.est-no-border-bottom]=\"selStatusDown?.tborder\"\n [class.est-no-border-top]=\"selStatusUp?.bborder\"\n [class.est-ltab-border]=\"c.LeftBorder && !selStatus?.lborder && !selStatusLeft?.rborder\"\n [class.est-rtab-border]=\"c.RightBorder && !selStatus?.rborder && !selStatusRight?.lborder\"\n [class.est-selected-cell]=\"selStatus?.selected\"\n [class.est-cell-lborder]=\" selStatus?.lborder\"\n [class.est-cell-rborder]=\" selStatus?.rborder\"\n [class.est-cell-tborder]=\" selStatus?.tborder\"\n [class.est-cell-bborder]=\" selStatus?.bborder\"\n [class.est-cell-lborder-tmp]=\"!c.LeftBorder && !selStatus?.lborder && !selStatus?.loverlaps\"\n [class.est-cell-rborder-tmp]=\"!c.RightBorder && !selStatus?.rborder && !selStatus?.roverlaps\"\n [class.est-cell-tborder-tmp]=\"!selStatus?.tborder && !selStatus?.toverlaps\"\n [class.est-cell-bborder-tmp]=\"!selStatus?.bborder && !selStatus?.boverlaps\"\n #cellRef\n (click)=\"dbClickEditOrSingleClickRowSelection($event, cell, item)\"\n (onCellGeneration)=\"registerCell($event, cell(), item, cellRef.el)\">\n <!--\n @@@ Queste registrazioni le lascio fare all'interno di registerCell per evitare di attaccare la change detection automatica agli eventi, che rallenta di diosanto\n (mousedown)=\"mousedown($event, cell, item)\"\n (mouseenter)=\"mouseenter($event)\"\n (mouseup)=\"mouseup($event)\"\n -->\n <div [class.est-edit-hidden]=\"c._editing\" [class.est-pre]=\"!(Hierarchy() && index == 0)\">\n <ng-container #DEBUG>\n <!-- Debug box in caso la roba che viene scritta nelle celle non torni. Scirvere qui i propri binding per controllare cose -->\n </ng-container>\n <!-- 90% Template disponibile, quindi derivante da *td, controllo giusto che non sia un field particolare multi -->\n @if (c.Template) {\n @if (!c.Multi) {\n <ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: item }\"></ng-container>\n }\n @else {\n <span><ng-container *ngTemplateOutlet=\"c.Template; context: { $implicit: (item[c.MultiProp] ? item[c.MultiProp][c.MultiIndex] : {}) }\"></ng-container></span>\n }\n }\n <!-- 8%\n Template non disponibile, pu\u00F2 venire da\n RoutePath in caso sia un link di una tabella dinamica\n PropAccessor in caso di ReportRow (quindi oggetti con \"values\" dentro),\n o Renderer se modalit\u00E0 dinamica/standard (in qual caso il renderer \u00E8 il default)\n -->\n @if (!c.Template && !c.Multi && !c.Content) {\n @if (c.RoutePath) {\n <a [routerLink]=\"item | est_routerlink : c.RoutePath : c.RouteParameterProperties\" class=\"est-link\" [innerHTML]=\"item.properties ? item.properties[c.PropertyName] : item[c.PropertyName]\"></a>\n }\n @else if (c.PropAccessor) {\n <span>\n {{(item.values? item.values[c.PropAccessor] : item[c.PropAccessor]) | est_format: c.Format }}\n </span>\n }\n @else {\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_renderer: { name: c.RendererName, src: EsTdsDirective, fallback: defaultEsTd }; context: { $implicit: { definition: c, value: item.properties ? item.properties[c.PropertyName] : item[c.PropertyName], type: c.PropertyType} }\"></ng-container>\n }\n }\n <!-- 1% Se in modalit\u00E0 gerarchica metto il td per navigare la gerarchia -->\n @if (Hierarchy() && index == 0) {\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\n }\n <!-- 1% Content programmatico per le casistiche di Row Grouping ecc... -->\n @if (c.Content) {\n {{c.Content}}\n }\n </div>\n @if (c._editing) {\n <div class=\"est-mt-min-5\">\n <ng-container *ngTemplateOutlet=\"c.PropertyName | est_editor: { name: c.EditorName, src: EsTdEditorDirectives, fallback: defaultEditor}; context: { $implicit: { definition: c, signal: cell, columnIndex: index, item: item, finalizer: finalizeUserEdit } }\"></ng-container>\n </div>\n }\n </td>\n }\n </ng-template>\n\n <!-- Navigatore della gerarchia di una view gerarchica, con tasto per espandere e collassare -->\n <ng-template #HierarchyNavigator let-item>\n @if (!item.parent) {\n <span class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\n }\n @else if (item.parent && item._expanded) {\n <span class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey()!])\"></span>\n }\n @else {\n <span class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey()!])\"></span>\n }\n \n </ng-template>\n\n <!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\n <ng-template #bodyDeleteAndExport let-options>\n @if (Removal() && !RemovalCondition()) {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @if (Removal() && RemovalCondition()) {\n\n @if(options.item[RemovalCondition()])\n {\n @if (options.item.removed || options.item.deleted) {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\n }\n }\n @else {\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\n }\n }\n @if (Export() || HiddenColumns() || CornerMenuOptions()) {\n <td class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\n }\n </ng-template>\n\n <!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\n <context-menu #emptyMenu>\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\n </context-menu>\n\n <!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\n <div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-lg\" cdkDrag>\n <div class=\"modal-content\">\n <div class=\"modal-header est-pointer\" cdkDragHandle>\n <h5 class=\"modal-title pull-left\">\n @if (HiddenColumns() && ColumnsOrdering()) {\n {{'Columns Visibility and Order' | localize : lc}}\n }\n @else if (!HiddenColumns()) {\n {{'Columns Order' | localize : lc}}\n }\n @else if (!ColumnsOrdering()) {\n {{'Columns Visibility' | localize : lc}}\n }\n </h5>\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\n <span aria-hidden=\"true\">×</span>\n </button>\n </div>\n <div class=\"modal-body\">\n @if (!TMPColumnsList || TMPColumnsList.length == 0) {\n <div class=\"card card-info est-padding-10 est-margin-bottom-0\">\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\n </div>\n }\n @if (TMPColumnsList && TMPColumnsList.length > 0) {\n <div style=\"max-height:500px; overflow-y:auto\">\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-->\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\n <thead>\n <tr>\n @if (HiddenColumns()) {\n <th class=\"est-col-min\">\n <input class=\"est-pointer\" type=\"checkbox\" style=\"width: 15px\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\n </th>\n }\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\n <!--Filler-->\n <th></th>\n <!-- Pinner -->\n @if (DirectivesBased()) {\n <th class=\"est-col-min\"></th>\n }\n </tr>\n </thead>\n <tbody\n cdkDropList\n [cdkDropListData]=\"TMPColumnsList\"\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\"\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\n class=\"est-dropbox\">\n @for (item of TMPColumnsList; track idTrackBy(i, item); let i = $index; let last = $last) {\n <tr\n class=\"est-pointer est-droplist\"\n [class.est-white-selected]=\"lastSelectedItemID == item.id\"\n [class.est-no-selection]=\"!item.visible\"\n cdkDrag\n [cdkDragData]=\"item\"\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\n @if (HiddenColumns()) {\n <td>\n <input type=\"checkbox\" style=\"width: 15px\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\n </td>\n }\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\n @if (item.template) {\n <!-- Padri -->\n @if (item.parentTemplates && item.parentTemplates.length > 0) {\n <span class=\"est-fw-bold est-fs-13\">\n ( \n @for (parent of item.parentTemplates; track idTrackBy($index, parent); let last = $last) {\n @if (parent.tmpl) {\n <ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container>\n }\n @if (parent.content) {\n {{parent.content}}\n }\n @if (!last) {\n <span> - </span>\n }\n }\n )\n </span>\n }\n <!-- Template header originale -->\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\n }\n @if (!item.template) {\n {{item.description}}\n }\n </td>\n <!--Filler-->\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\n <!-- Pinner -->\n @if (DirectivesBased() && ColumnsPinnable()) {\n <td>\n @if (!item.fixed && item.pinnable) {\n <span class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span>\n }\n </td>\n }\n </tr>\n }\n </tbody>\n </table>\n </div>\n }\n </div>\n <div class=\"modal-footer\">\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\n </div>\n </div>\n </div>\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"] }]
|
|
5706
5685
|
}], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.NgControl, decorators: [{
|
|
5707
5686
|
type: Self
|
|
5708
5687
|
}, {
|
|
@@ -5716,6 +5695,11 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
5716
5695
|
args: [EST_DEFAULTS]
|
|
5717
5696
|
}] }, { type: undefined, decorators: [{
|
|
5718
5697
|
type: Optional
|
|
5698
|
+
}, {
|
|
5699
|
+
type: Inject,
|
|
5700
|
+
args: [EST_DEBUG]
|
|
5701
|
+
}] }, { type: undefined, decorators: [{
|
|
5702
|
+
type: Optional
|
|
5719
5703
|
}, {
|
|
5720
5704
|
type: Inject,
|
|
5721
5705
|
args: [EST_EXPORT_GLOBAL_ACL]
|
|
@@ -5779,8 +5763,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.25", ngImpo
|
|
|
5779
5763
|
type: ViewChild,
|
|
5780
5764
|
args: ['emptyMenu', { static: true }]
|
|
5781
5765
|
}], _ArraymodeItemsPerPage: [{ type: i0.Input, args: [{ isSignal: true, alias: "ArraymodeItemsPerPage", required: false }] }] } });
|
|
5782
|
-
class EsTdReference {
|
|
5783
|
-
}
|
|
5784
5766
|
|
|
5785
5767
|
/** Modello di configurazione per L'EsTable */
|
|
5786
5768
|
class EsTableModuleConfig {
|
|
@@ -5965,5 +5947,5 @@ class ItemPropEditableReference {
|
|
|
5965
5947
|
* Generated bundle index. Do not edit.
|
|
5966
5948
|
*/
|
|
5967
5949
|
|
|
5968
|
-
export { AppOrdering, AppSearch, CornerMenuOption, EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL, EsTableColumnsDefinition, EsTableComponent, EsTableDefaultable, EsTableModelChange, EsTableModule, EsTableModuleConfig, EsTableMultiValue, EsTableOperationDefinition, EsTablePagerComponent, EsTdDirective, EsTdEditorDirective,
|
|
5950
|
+
export { AppOrdering, AppSearch, CornerMenuOption, EST_DEBUG, EST_DEFAULTS, EST_EXPORT_GLOBAL_ACL, EsTableColumnsDefinition, EsTableComponent, EsTableDefaultable, EsTableModelChange, EsTableModule, EsTableModuleConfig, EsTableMultiValue, EsTableOperationDefinition, EsTablePagerComponent, EsTdDirective, EsTdEditorDirective, EsThDirective, GenericItem, Group, GroupAggregation, GroupFilter, GroupOrAggregation, ItemPropEditableReference, ItemsSelection, ReportColumn, ReportParam, ReportRow, ThTdProvider };
|
|
5969
5951
|
//# sourceMappingURL=esfaenza-es-table.mjs.map
|