@esfaenza/es-table 20.3.7 → 20.3.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,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, ViewChild, Pipe, model, ContentChild, NgModule } from '@angular/core';
2
+ import { Injectable, input, EventEmitter, signal, computed, effect, Output, ChangeDetectionStrategy, ViewEncapsulation, Component, Input, Self, Directive, Optional, ContentChildren, InjectionToken, Inject, HostListener, 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 i5$1 from 'primeng/select';
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.1.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: "<div *ngIf=\"!Hidden()\" [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\r\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}:&nbsp;</span>\r\n <ng-container *ngIf=\"ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)\">\r\n\r\n <p-select \r\n style=\"width: 95px\"\r\n size=\"small\"\r\n name=\"input\"\r\n appendTo=\"body\"\r\n [options]=\"PagingOptionsForSelect()\"\r\n optionLabel=\"description\"\r\n optionValue=\"id\"\r\n [ngModel]=\"Model()\"\r\n (ngModelChange)=\"choice($event)\"\r\n />\r\n\r\n <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">&nbsp;/&nbsp;</span>\r\n </ng-container>\r\n <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\r\n</div>", 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: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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: i5$1.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 }); }
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)}}:&nbsp;</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\">&nbsp;/&nbsp;</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: "<div *ngIf=\"!Hidden()\" [class.est-mt-4]=\"ShowCount() && PagerCount() != -1 && !(ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1))\">\r\n <span class=\"est-fs-14\"> {{CountLabel() && !GroupMode() ? CountLabel() : ((GroupMode() ? 'Shown Groups' : 'Shown Elements') | localize : lc)}}:&nbsp;</span>\r\n <ng-container *ngIf=\"ShowPaging() && (Model() == DefaultAll() || PagerCount() >= Model() || PagerCount() == -1)\">\r\n\r\n <p-select \r\n style=\"width: 95px\"\r\n size=\"small\"\r\n name=\"input\"\r\n appendTo=\"body\"\r\n [options]=\"PagingOptionsForSelect()\"\r\n optionLabel=\"description\"\r\n optionValue=\"id\"\r\n [ngModel]=\"Model()\"\r\n (ngModelChange)=\"choice($event)\"\r\n />\r\n\r\n <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">&nbsp;/&nbsp;</span>\r\n </ng-container>\r\n <span class=\"est-fs-14 est-ipp-bold\" *ngIf=\"ShowCount() && PagerCount() != -1\">{{PagerCount() | number : '0.0-0' : lc.Locale}}</span>\r\n</div>", 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"] }]
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)}}:&nbsp;</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\">&nbsp;/&nbsp;</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.columns;
731
- let columnsOrderings = arrMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
732
- let columnOrders = arrMode ? [] : castedView.orders;
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 = null;
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 : null, Borders: !!currentParent });
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 : null, Borders: !!currentParent });
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.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
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, null, true);
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, null, true);
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, null, true).every(t => t._selected))
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.count > 0 && this.est.SelectAll() && !this.est.SingleSelection());
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 {{ value: string, type: InputType }} valType Oggetto Valore - Tipo da cui estrapolare la rappresentazione del dato in stringa
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 = null;
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.bind(this, "Order") }] : [{ alias: 'Order', transform: this.setUnderlyingSignal.bind(this, "Order") }]));
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.1.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 }, Template: { classPropertyName: "Template", publicName: "Template", isSignal: false, isRequired: false, transformFunction: null }, Visible: { classPropertyName: "Visible", publicName: "Visible", isSignal: false, isRequired: false, transformFunction: null } }, outputs: { onOrderChange: "onOrderChange", onUnpinning: "onUnpinning" }, host: { listeners: { "window:mouseup.out-zone": "onMouseUp()", "window:mousemove.out-zone": "onMouseMove($event)" } }, viewQueries: [{ propertyName: "content", first: true, predicate: ["content"], descendants: true }], ngImport: i0, template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID() && Orderable()\" [class.app-pointer]=\"!!ID() && Orderable()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>", dependencies: [{ kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
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>&nbsp;\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()\">\r\n <span #content>\r\n <ng-container *ngIf=\"!!Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span>&nbsp;\r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order() == 'DESC'\" [class.fa-chevron-up]=\"Order() == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned() && !Fixed()\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable() || Fixed() || Pinned()\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>" }]
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 }] }], Template: [{
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>&nbsp;\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(null, ...(ngDevMode ? [{ debugName: "arrayPulsanti" }] : []));
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 = null;
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 = null;
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 = null;
4010
+ this.TMPRowTHs = [];
4016
4011
  /** Modello rappresentante un singolo th della tabella, generato in base alle configurazioni e agli oggetti ricevuti */
4017
- this.RowTHs = null;
4012
+ this.RowTHs = [];
4018
4013
  /** Modello di appoggio temporaneo per i **RowThGroups** */
4019
- this.TMPRowThGroups = null;
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 = null;
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(null, ...(ngDevMode ? [{ debugName: "CornerMenuOptions" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "Height" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "EmptySpaceBackgroundColor" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "MaxHeight" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "XLSXExport" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "HighCellDensity" }] : []));
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.bind(this, "Selection") }] : [{ alias: "Selection", transform: this.setUnderlyingSignal.bind(this, "Selection") }]));
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(null, ...(ngDevMode ? [{ debugName: "ShowLoadingOnBootstrap" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "Removal" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "CountLabel" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "HasHeaderGroup" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "HasSecondaryHeaderGroup" }] : []));
4125
+ this.HasSecondaryHeaderGroup = input(false, ...(ngDevMode ? [{ debugName: "HasSecondaryHeaderGroup" }] : []));
4133
4126
  /** Indica se nascondere gli Header della tabella */
4134
- this.HeaderHidden = input(null, ...(ngDevMode ? [{ debugName: "HeaderHidden" }] : []));
4127
+ this.HeaderHidden = input(false, ...(ngDevMode ? [{ debugName: "HeaderHidden" }] : []));
4135
4128
  /** Indica se nascondere il Body della tabella */
4136
- this.BodyHidden = input(null, ...(ngDevMode ? [{ debugName: "BodyHidden" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "SelectionDisabled" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "SingleSelection" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "Hierarchy" }] : []));
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(null, ...(ngDevMode ? [{ debugName: "HasPinnedColumns" }] : []));
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
- if (this.SearchView())
4330
- this.arrayPulsanti.set(this.utilities_H.getPagesArray(6, this.SearchView().page, this.SearchView().pages || 1, this.SearchView().objectcount || this.SearchView().items.length, this.SearchView().itemsperpageoverride));
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
- this.ctxMenuSubscription = (this.ContextMenu || this.tableEmptyMenu).open.subscribe(t => {
4364
- // Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...
4365
- if (t.item._sep)
4366
- return;
4367
- let shouldEmit = !t.item._selected;
4368
- t.item._selected = true;
4369
- this.selection_H.clearSelectionStatusExcluding(null);
4370
- var itemSelection = this.selection_H.handleItemsSelection([t.item]);
4371
- this.changed();
4372
- if (shouldEmit)
4373
- this.onSelectionChanged.emit(itemSelection);
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.toArray();
4411
- this.EsThs = this.EsThsDirective.toArray();
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(fn) { }
4477
+ registerOnTouched(_) { }
4457
4478
  /** @ignore */
4458
4479
  changed(clearItems = false) {
4459
4480
  if (clearItems && this.viewMode()) {
4460
- if (!this.ItemSourceProperty)
4481
+ let isprops = this.ItemSourceProperty();
4482
+ if (!isprops)
4461
4483
  this.View.items = [];
4462
4484
  else
4463
- this.View[this.ItemSourceProperty()] = [];
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 && !this.SearchView()) {
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 (this.SearchView() && typeof this.SearchView().itemsperpageoverride != 'undefined' && !(this.SearchView() instanceof AppSearch))
4495
- this.SearchView().__proto__ = new AppSearch();
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.some(t => t.thGroup));
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.items) || []), ...(view.groups || [])] : View;
4720
- let si = viewMode ? view.selection : this.arraymodeSelection;
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.report_columns) {
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(null);
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
- this.selection_H.clearSelectionStatusExcluding(null);
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(), null) * 1000;
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.toArray();
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(null);
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
- if (selection)
5521
- this.selection_H.clearSelectionStatusExcluding(null);
5522
- if (selection && !item.locked && !item._sep && !item._group)
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
- else if (item._group)
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
- this.cdr.markForCheck();
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(null);
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.nativeElement;
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.nativeElement.getElementsByClassName("modal-body")[0];
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}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" 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>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll() || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\r\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\r\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection()}}\r\n HasPinnedColumns: {{HasPinnedColumns()}}\r\n arrayMode: {{arrayMode()}}\r\n viewMode: {{viewMode()}}\r\n UseCustomCells: {{UseCustomCells()}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection() && !HasPinnedColumns()\">\r\n <input *ngIf=\"!SingleSelection()\" class=\"est-pointer\" type=\"checkbox\" 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 &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal() && !RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal() && RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export() || HiddenColumns() || CornerMenuOptions()\" class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns()\">\r\n <input class=\"est-pointer\" type=\"checkbox\" 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 (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased() && ColumnsPinnable()\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"], dependencies: [{ kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i9.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i10.ModalDirective, selector: "[bsModal]", inputs: ["config", "closeInterceptor"], outputs: ["onShow", "onShown", "onHide", "onHidden"], exportAs: ["bs-modal"] }, { kind: "directive", type: i11.BsDropdownMenuDirective, selector: "[bsDropdownMenu],[dropdownMenu]", exportAs: ["bs-dropdown-menu"] }, { kind: "directive", type: i11.BsDropdownToggleDirective, selector: "[bsDropdownToggle],[dropdownToggle]", exportAs: ["bs-dropdown-toggle"] }, { kind: "directive", type: i11.BsDropdownDirective, selector: "[bsDropdown], [dropdown]", inputs: ["placement", "triggers", "container", "dropup", "autoClose", "isAnimated", "insideClick", "isDisabled", "isOpen"], outputs: ["isOpenChange", "onShown", "onHidden"], exportAs: ["bs-dropdown"] }, { kind: "directive", type: i12.ContextMenuAttachDirective, selector: "[contextMenu]", inputs: ["contextMenuSubject", "contextMenu"] }, { kind: "component", type: i12.ContextMenuComponent, selector: "context-menu", inputs: ["menuClass", "autoFocus", "useBootstrap4", "disabled"], outputs: ["close", "open"] }, { kind: "directive", type: i12.ContextMenuItemDirective, selector: "[contextMenuItem]", inputs: ["subMenu", "divider", "enabled", "passive", "visible"], outputs: ["execute"] }, { kind: "directive", type: i13.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "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}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'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>&nbsp;{{'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>&nbsp;\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 &nbsp;\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\">&times;</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 (&nbsp;\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>&nbsp;-&nbsp;</span>\n }\n }\n &nbsp;)\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}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" 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>&nbsp;{{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle() == 'both' || PagingStyle() == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll() || (View?.selection || arraymodeSelection)?.all\">\r\n <span>{{ (selectedObjects() == -1 ? ('All the' | localize : lc) : ((selectedObjects() || 0) | number : '0.0-0' : lc.Locale)) + ' ' + ((selectedObjects() == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span>&nbsp;\r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection)?.all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable est-full-height {{ContainerClass()}}\" [style.max-height.px]=\"MaxHeight()\">\r\n <table class=\"{{ TableClass() }} est-margin-bottom-10 est\" style=\"background-color: white;\" [class.est-high-density]=\"HighCellDensity()\">\r\n <thead [hidden]=\"HeaderHidden() || FirstBind()\">\r\n <!-- Aggiungo il pezzo che gestisce la selezione di tutto se attivo da config -->\r\n <tr *ngIf=\"(SelectAll() && !SingleSelection()) || PagingStyle() != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns().Global\" [class.est-hidden-view]=\"!canSelectAll() && !(View?.selection || arraymodeSelection)?.all && PagingStyle() == 'bottom'\">\r\n <p class=\"est-hidden-view app-margin-bottom-0\">\u00A7</p>\r\n </th>\r\n </tr>\r\n\r\n <!-- Blocco header group -->\r\n <ng-container *ngIf=\"RowThGroups\">\r\n <tr *ngFor=\"let level of RowThGroups; trackBy: IDTrackBy\">\r\n <th *ngFor=\"let cell of level; trackBy: IDTrackBy\" [attr.colspan]=\"cell.Span\"\r\n [class.est-pinned-header]=\"cell.Pinned\" [class.est-col-min]=\"cell.Pinned\"\r\n [class.est-ltab-border]=\"cell.Borders\" [class.est-rtab-border]=\"cell.Borders\"\r\n class=\"est-text-center\">\r\n <ng-container *ngIf=\"cell.Pinned;\">\r\n <div [style.width.px]=\"PinnedContainerWidth()\" class=\"est-pinned-border est-cell-group-padding\"></div>\r\n </ng-container>\r\n <ng-container *ngIf=\"!cell.Pinned && cell.Content; Else: cell.Template\">\r\n {{cell.Content}}\r\n </ng-container>\r\n </th>\r\n </tr>\r\n </ng-container>\r\n\r\n <ng-container *ngIf=\"!RowThGroups\">\r\n <tr *ngIf=\"HasHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"headerGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n\r\n <!-- Blocco header group secondario -->\r\n <tr *ngIf=\"HasSecondaryHeaderGroup()\">\r\n <ng-container *ngTemplateOutlet=\"secondaryHeaderGroupRef\"></ng-container>\r\n <th *ngIf=\"Export()\"></th>\r\n </tr>\r\n </ng-container>\r\n\r\n <!-- Blocco effettivo degli header -->\r\n <tr>\r\n <div id=\"thead->tr->debug_block\" style=\"display: none; white-space: pre-wrap;\">\r\n Selection: {{Selection()}}\r\n HasPinnedColumns: {{HasPinnedColumns()}}\r\n arrayMode: {{arrayMode()}}\r\n viewMode: {{viewMode()}}\r\n UseCustomCells: {{UseCustomCells()}}\r\n RowTHs: {{!!RowTHs}}\r\n RowTHs.length: {{RowTHs?.length}}\r\n DynamicRowColumnsDefinition: {{!!DynamicRowColumnsDefinition()}}\r\n </div>\r\n\r\n <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection() && !HasPinnedColumns()\">\r\n <input *ngIf=\"!SingleSelection()\" class=\"est-pointer\" type=\"checkbox\" 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 &nbsp;\r\n</ng-template>\r\n\r\n<!-- Pulsanti di eliminazione/undo eliminazione ed esportazione che vanno in fondo ad un record edlla tabella -->\r\n<ng-template #bodyDeleteAndExport let-options>\r\n <ng-container *ngIf=\"Removal() && !RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted)\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted)\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"Removal() && RemovalCondition()\">\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-pointer text-danger\" [hidden]=\"options.item.removable != undefined && !options.item.removable\" (click)=\"onRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"(options.item.removed || options.item.deleted) && options.item[RemovalCondition()]\"><span class=\"fa fa-undo text-warning est-pointer\" (click)=\"onAbortRemoval.emit(options.item)\"></span></td>\r\n <td class=\"est-sticky-last-column{{options.even? '-alt' : ''}} {{Export() || HiddenColumns() || CornerMenuOptions() ? 'est-right-9' : ''}}\" *ngIf=\"!options.item[RemovalCondition()]\"><span class=\"fa fa-remove est-hidden-view\"></span></td>\r\n </ng-container>\r\n <td *ngIf=\"Export() || HiddenColumns() || CornerMenuOptions()\" class=\"est-sticky-last-column{{options.even && !Hierarchy() ? '-alt' : ''}}\"></td>\r\n</ng-template>\r\n\r\n<!-- Context menu vuoto default per tutte le tabella che non ce l'hanno, in modo che al click destro appaia \"nessuna op disponibile\" -->\r\n<context-menu #emptyMenu>\r\n <ng-template contextMenuItem><span><em>{{'No operations available' | localize : lc}}...</em></span></ng-template>\r\n</context-menu>\r\n\r\n<!-- Modal per cambiare posizione e visibilit\u00E0 delle colonne dell'es-table -->\r\n<div bsModal #changeColumnVisibilityModal=\"bs-modal\" #columnsDialog class=\"modal fade\" role=\"dialog\" aria-hidden=\"true\">\r\n <div class=\"modal-dialog modal-lg\" cdkDrag>\r\n <div class=\"modal-content\">\r\n <div class=\"modal-header est-pointer\" cdkDragHandle>\r\n <h5 class=\"modal-title pull-left\">\r\n <ng-container *ngIf=\"!HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && !ColumnsOrdering()\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns() && ColumnsOrdering()\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </h5>\r\n <button type=\"button\" class=\"close pull-right\" (click)=\"hideDialog(changeColumnVisibilityModal);\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">&times;</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns()\">\r\n <input class=\"est-pointer\" type=\"checkbox\" 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 (&nbsp;\r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last; trackBy: idTrackBy\">\r\n <ng-container *ngIf=\"parent.tmpl\"><ng-container *ngTemplateOutlet=\"parent.tmpl\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"parent.content\">{{parent.content}}</ng-container>\r\n <span *ngIf=\"!last\">&nbsp;-&nbsp;</span>\r\n </ng-container>\r\n &nbsp;)\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template; context: { $implicit: item.multi ? item.multiContent : null }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"!item.template\">{{item.description}}</ng-container>\r\n </td>\r\n <!--Filler-->\r\n <td (click)=\"columnMetadata_H.columnClicked(item);\"></td>\r\n <!-- Pinner -->\r\n <td *ngIf=\"DirectivesBased() && ColumnsPinnable()\"><span *ngIf=\"!item.fixed && item.pinnable\" class=\"fa fa-thumb-tack\" [class.text-success]=\"item.pinned\" (click)=\"columnMetadata_H.pinOrUnpinColumn(item)\"></span></td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n <div class=\"modal-footer\">\r\n <button type=\"button\" class=\"btn btn-secondary est-margin-right-10\" (click)=\"lastSelectedItemID = null; hideDialog(changeColumnVisibilityModal);\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && hideDialog(changeColumnVisibilityModal)\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: ["@charset \"UTF-8\";.est-loading-box{height:200px;text-align:center;position:relative;background:#ccc}.est-loading-content{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);font-size:35px}.est-scrollable{max-height:600px;overflow:auto}.est-head-resizer{top:0;right:0;bottom:0;width:7px;position:absolute;cursor:col-resize}.est-head-resizer-internal{inset:0 0 0 6px;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density th,.est-high-density td{padding:0;padding-left:.2rem;padding-right:.2rem}.est-default-row-height{height:31px}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.est-edit-hidden{visibility:hidden;height:1px!important}.est-hidden-view{visibility:hidden}.est-no-border{border:none!important}.est-nowrap{white-space:nowrap}.est-mt-min-5{margin-top:-5px}.est-white-selected{background-color:#ddd!important}.est-line-through{text-decoration:line-through}.est-no-side-padding{padding-left:0;padding-right:0}.est-no-left-padding,.est-no-right-padding{padding-left:0}.est-col-min{width:1px}.est-margin-bottom-0{margin-bottom:0!important}.est-margin-right-10{margin-right:10px!important}.est-right-9{right:9px!important}.est-table-dotted-menu{padding:0 0 2px!important;color:#999}.est-fs-18{font-size:18px}.est-fs-14,.est-fs-13{font-size:14px}.est-fw-bold{font-weight:700}.est-padding-3{padding:3px!important}.est-page-container{position:relative}.est-bring-to-front-strong{z-index:99999999!important}.est-switch{position:relative;display:inline-block;width:30px;height:17px;margin-bottom:0;margin-right:5px;margin-left:5px}.est-switch input{display:none}.est-slider{position:absolute;cursor:pointer;inset:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.est-slider:before{position:absolute;content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff;-webkit-transition:.4s;transition:.4s}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{-webkit-transform:translateX(11px);-ms-transform:translateX(11px);transform:translate(11px)}.est-slider.round{border-radius:10px}.est-slider.round:before{border-radius:50%}.est-custom-input{width:30px;display:inline;padding:1px;height:20px}.est-row-lvl-1 td:first-child{padding-left:5px}.est-row-lvl-2 td:first-child{padding-left:20px}.est-row-lvl-3 td:first-child{padding-left:35px}.est-row-lvl-4 td:first-child{padding-left:50px}.est-row-lvl-5 td:first-child{padding-left:65px}.est-row-lvl-6 td:first-child{padding-left:80px}.est-row-lvl-7 td:first-child{padding-left:95px}.est-row-lvl-8 td:first-child{padding-left:110px}.est-row-lvl-9 td:first-child{padding-left:125px}.est-row-lvl-10 td:first-child{padding-left:140px}.est-row-lvl-11 td:first-child{padding-left:155px}.est-row-lvl-12 td:first-child{padding-left:170px}.est-row-lvl-13 td:first-child{padding-left:185px}.est-row-lvl-14 td:first-child{padding-left:200px}.est-row-lvl-15 td:first-child{padding-left:215px}.est-row-lvl-16 td:first-child{padding-left:230px}.est-row-lvl-17 td:first-child{padding-left:245px}.est-row-lvl-18 td:first-child{padding-left:260px}.est-row-lvl-19 td:first-child{padding-left:275px}.est-row-lvl-20 td:first-child{padding-left:290px}.est-row-lvl-21 td:first-child{padding-left:305px}.est-row-lvl-22 td:first-child{padding-left:320px}.est-row-lvl-23 td:first-child{padding-left:335px}.est-row-lvl-24 td:first-child{padding-left:350px}.est-row-lvl-25 td:first-child{padding-left:365px}.est-row-lvl-26 td:first-child{padding-left:380px}.est-row-lvl-27 td:first-child{padding-left:395px}.est-row-lvl-28 td:first-child{padding-left:410px}.est-row-lvl-29 td:first-child{padding-left:425px}.est-row-lvl-30 td:first-child{padding-left:440px}.est-row-lvl-31 td:first-child{padding-left:455px}.est-row-lvl-32 td:first-child{padding-left:470px}.est-row-lvl-33 td:first-child{padding-left:485px}.est-row-lvl-34 td:first-child{padding-left:500px}.est-row-lvl-35 td:first-child{padding-left:515px}.est-row-lvl-36 td:first-child{padding-left:530px}.est-row-lvl-37 td:first-child{padding-left:545px}.est-row-lvl-38 td:first-child{padding-left:560px}.est-row-lvl-39 td:first-child{padding-left:575px}.est-row-lvl-40 td:first-child{padding-left:590px}.est-row-lvl-41 td:first-child{padding-left:605px}.est-row-lvl-42 td:first-child{padding-left:620px}.est-row-lvl-43 td:first-child{padding-left:635px}.est-row-lvl-44 td:first-child{padding-left:650px}.est-row-lvl-45 td:first-child{padding-left:665px}.est-row-lvl-46 td:first-child{padding-left:680px}.est-row-lvl-47 td:first-child{padding-left:695px}.est-row-lvl-48 td:first-child{padding-left:710px}.est-row-lvl-49 td:first-child{padding-left:725px}.est-row-lvl-50 td:first-child{padding-left:740px}.est-row-lvl-51 td:first-child{padding-left:755px}.est-row-lvl-52 td:first-child{padding-left:770px}.est-row-lvl-53 td:first-child{padding-left:785px}.est-row-lvl-54 td:first-child{padding-left:800px}.est-row-lvl-55 td:first-child{padding-left:815px}.est-row-lvl-56 td:first-child{padding-left:830px}.est-row-lvl-57 td:first-child{padding-left:845px}.est-row-lvl-58 td:first-child{padding-left:860px}.est-row-lvl-59 td:first-child{padding-left:875px}.est-row-lvl-60 td:first-child{padding-left:890px}.est-row-lvl-61 td:first-child{padding-left:905px}.est-row-lvl-62 td:first-child{padding-left:920px}.est-row-lvl-63 td:first-child{padding-left:935px}.est-row-lvl-64 td:first-child{padding-left:950px}.est-row-lvl-65 td:first-child{padding-left:965px}.est-row-lvl-66 td:first-child{padding-left:980px}.est-row-lvl-67 td:first-child{padding-left:995px}.est-row-lvl-68 td:first-child{padding-left:1010px}.est-row-lvl-69 td:first-child{padding-left:1025px}.est-row-lvl-70 td:first-child{padding-left:1040px}.est-row-lvl-71 td:first-child{padding-left:1055px}.est-row-lvl-72 td:first-child{padding-left:1070px}.est-row-lvl-73 td:first-child{padding-left:1085px}.est-row-lvl-74 td:first-child{padding-left:1100px}.est-row-lvl-75 td:first-child{padding-left:1115px}.est-row-lvl-76 td:first-child{padding-left:1130px}.est-row-lvl-77 td:first-child{padding-left:1145px}.est-row-lvl-78 td:first-child{padding-left:1160px}.est-row-lvl-79 td:first-child{padding-left:1175px}.est-row-lvl-80 td:first-child{padding-left:1190px}.est-row-lvl-81 td:first-child{padding-left:1205px}.est-row-lvl-82 td:first-child{padding-left:1220px}.est-row-lvl-83 td:first-child{padding-left:1235px}.est-row-lvl-84 td:first-child{padding-left:1250px}.est-row-lvl-85 td:first-child{padding-left:1265px}.est-row-lvl-86 td:first-child{padding-left:1280px}.est-row-lvl-87 td:first-child{padding-left:1295px}.est-row-lvl-88 td:first-child{padding-left:1310px}.est-row-lvl-89 td:first-child{padding-left:1325px}.est-row-lvl-90 td:first-child{padding-left:1340px}.est-row-lvl-91 td:first-child{padding-left:1355px}.est-row-lvl-92 td:first-child{padding-left:1370px}.est-row-lvl-93 td:first-child{padding-left:1385px}.est-row-lvl-94 td:first-child{padding-left:1400px}.est-row-lvl-95 td:first-child{padding-left:1415px}.est-row-lvl-96 td:first-child{padding-left:1430px}.est-row-lvl-97 td:first-child{padding-left:1445px}.est-row-lvl-98 td:first-child{padding-left:1460px}.est-row-lvl-99 td:first-child{padding-left:1475px}.est-relative{position:relative}.est-top-pager{position:absolute;right:0;top:5px}.est-top-allselect{position:absolute;left:0;top:5px;font-weight:700}.est-padding-10{padding:10px!important}.est-margin-right-50{margin-right:50px}.est-margin-left-50{margin-left:50px}.est-quick-unpin{color:#000;margin-left:8px;font-size:14px;transform:rotate(45deg)}.est-full-height{height:100%}.est-page-sel{margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-sel:not(.app-white-text){color:#000!important}.est-page-prev,.est-page-next{color:#000;padding:2px 0 0;font-size:inherit}.est-pinned-header{background-color:#fff;left:0;top:0;position:sticky;z-index:1;border-bottom:1px solid #dee2e6!important;padding:0!important}.est-simple-border-bottom{border-bottom:1px solid #dee2e6}.est-pinned-internal-header{border-top:0;border-bottom:0px solid #dee2e6}.est-pinned-border{border-right:2px solid #dee2e6!important}.est-cell-padding{padding:.3rem}.est-pinned-body{background-color:#fff;left:0;position:sticky;z-index:1;border-top:1px solid #dee2e6!important;padding:0!important}.est-inline{display:inline!important}.est-inline-block{display:inline-block!important}.est-link{color:#0275d8!important;cursor:pointer;text-decoration:none;display:block}.est-link:hover{color:#23527c!important;cursor:pointer;text-decoration:underline!important}.est-sticky-last-column{right:-1px;position:sticky;z-index:0;background-color:#fff}.est-sticky-last-column-alt{right:-1px;position:sticky;z-index:0;background-color:#f2f2f2}.est-ltab-border{border-left:1px solid #bbb!important}.est-rtab-border{border-right:1px solid #bbb!important}.est-no-border-bottom{border-bottom:none!important}.est-no-border-top{border-top:none!important}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.est-selected-cell{background-color:#2196f333!important}.est-cell-lborder{border-left:1.02px solid rgb(33,150,243)!important}.est-cell-tborder{border-top:1.02px solid rgb(33,150,243)!important}.est-cell-rborder{border-right:1.02px solid rgb(33,150,243)!important}.est-cell-bborder{border-bottom:1.02px solid rgb(33,150,243)!important}.est-cell-lborder-tmp{border-left:1.02px solid transparent!important}.est-cell-tborder-tmp{border-top:1.02px solid transparent!important}.est-cell-rborder-tmp{border-right:1.02px solid transparent!important}.est-cell-bborder-tmp{border-bottom:1.02px solid transparent!important}.est-margin-bottom-10{margin-bottom:10px}.est-text-center{text-align:center}.est-flex{display:flex}.est-rg-sep-flex-right{display:flex;flex-direction:row-reverse;width:100%;margin:-5px}.est-rg-sep-flex-left{display:flex;flex-direction:row;width:100%;margin:-5px}.est-rg-hdr{font-weight:700}.est-rg-agg{font-style:italic}.est-rg{background-color:#7777!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:#bbbb!important}.est-rg-ipp{text-align:left;display:inline-flex;margin-right:25px}.est-rg-page{text-align:right;display:inline-flex;font-size:inherit;padding-top:5px}.est-droplist.cdk-drag-placeholder{opacity:0}.est-droplist.cdk-drag-preview{z-index:999999999!important;opacity:1;box-sizing:border-box;border-radius:4px;background-color:#fff;box-shadow:0 5px 5px -3px #0003,0 8px 10px 1px #00000024,0 3px 14px 2px #0000001f}.est-droplist.cdk-drag-preview td:not(.drag-visible){visibility:hidden}.est-droplist.cdk-drag-preview td.drag-visible{padding-top:3px}.est-droplist.cdk-drag-animating{transition:transform .25s cubic-bezier(0,0,.2,1)}.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}.est-pre{white-space:pre}.est val-datetime .mat-form-field-appearance-outline .mat-form-field-infix input{margin-bottom:3px!important;min-width:130px!important}.est .mat-form-field-flex{height:29px!important;padding:0!important}.est .mat-form-field-flex .mat-form-field-outline{color:#00f}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-start{border-left:none;border-top:none;border-radius:0}.est .mat-form-field-flex .mat-form-field-outline .mat-form-field-outline-end{border-top:none;border-radius:0;border-right:none}.est .mat-form-field-wrapper{height:20px;min-height:20px!important;margin-top:0!important}.est .mat-form-field-infix{width:100%!important;min-width:50px!important}.est .mat-form-field-infix select.mat-input-element{margin-top:-5px!important}.est .mat-datepicker-input{margin-bottom:3px!important}.est input{height:20px;padding-top:0!important}\n"] }]
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}}&nbsp;<input [readonly]=\"autoUpdate()\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" [ngModelOptions]=\"{'standalone': true}\" />&nbsp;{{'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>&nbsp;{{'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>&nbsp;\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 &nbsp;\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\">&times;</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 (&nbsp;\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>&nbsp;-&nbsp;</span>\n }\n }\n &nbsp;)\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, EsTdReference, EsThDirective, GenericItem, Group, GroupAggregation, GroupFilter, GroupOrAggregation, ItemPropEditableReference, ItemsSelection, ReportColumn, ReportParam, ReportRow, ThTdProvider };
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