@esfaenza/es-table 11.2.37-beta2 → 11.2.37
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/esfaenza-es-table.umd.js +582 -329
- package/bundles/esfaenza-es-table.umd.js.map +1 -1
- package/bundles/esfaenza-es-table.umd.min.js +1 -1
- package/bundles/esfaenza-es-table.umd.min.js.map +1 -1
- package/esfaenza-es-table.d.ts +2 -2
- package/esfaenza-es-table.metadata.json +1 -1
- package/esm2015/esfaenza-es-table.js +3 -3
- package/esm2015/lib/components/es-table/es_table.component.js +173 -40
- package/esm2015/lib/components/es-td/es_td.component.js +35 -1
- package/esm2015/lib/core/handlers/classes/ColumnMetadataHandler.js +95 -43
- package/esm2015/lib/core/handlers/classes/ItemsHandler.js +19 -1
- package/esm2015/lib/core/handlers/classes/RowGroupingHandler.js +4 -2
- package/esm2015/lib/core/handlers/classes/UtilitiesHandler.js +15 -1
- package/esm2015/lib/domain/internals/index.js +1 -2
- package/esm2015/lib/es-table.module.js +2 -2
- package/esm2015/public-api.js +3 -3
- package/fesm2015/esfaenza-es-table.js +565 -314
- package/fesm2015/esfaenza-es-table.js.map +1 -1
- package/lib/components/es-table/es_table.component.d.ts +64 -8
- package/lib/components/es-td/es_td.component.d.ts +2 -0
- package/lib/core/handlers/classes/ColumnMetadataHandler.d.ts +16 -15
- package/lib/core/handlers/classes/ItemsHandler.d.ts +6 -0
- package/lib/core/handlers/classes/RowGroupingHandler.d.ts +3 -2
- package/lib/core/handlers/classes/UtilitiesHandler.d.ts +16 -0
- package/lib/domain/internals/index.d.ts +0 -1
- package/package.json +1 -1
- package/public-api.d.ts +2 -2
- package/esm2015/lib/domain/internals/classes/TdElement.js +0 -2
- package/lib/domain/internals/classes/TdElement.d.ts +0 -19
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
(function (global, factory) {
|
|
2
|
-
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('@esfaenza/extensions'), require('@esfaenza/localizations'), require('@esfaenza/preferences'), require('@angular/cdk/drag-drop'), require('@angular/common'), require('@angular/router'), require('@angular/material/select'), require('@angular/material/input'), require('
|
|
3
|
-
typeof define === 'function' && define.amd ? define('@esfaenza/es-table', ['exports', '@angular/core', '@angular/forms', '@esfaenza/extensions', '@esfaenza/localizations', '@esfaenza/preferences', '@angular/cdk/drag-drop', '@angular/common', '@angular/router', '@angular/material/select', '@angular/material/input', '
|
|
4
|
-
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.esfaenza = global.esfaenza || {}, global.esfaenza['es-table'] = {}), global.ng.core, global.ng.forms, global.i1, global.localizations, global.preferences, global.ng.cdk.dragDrop, global.ng.common, global.ng.router, global.ng.material.select, global.ng.material.input, global.
|
|
5
|
-
}(this, (function (exports, i0, forms, i1, localizations, preferences, dragDrop, common, router, select, input,
|
|
2
|
+
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@angular/core'), require('@angular/forms'), require('@esfaenza/extensions'), require('@esfaenza/localizations'), require('@esfaenza/preferences'), require('@angular/platform-browser'), require('@angular/cdk/drag-drop'), require('@angular/common'), require('@angular/router'), require('@angular/material/select'), require('@angular/material/input'), require('ngx-bootstrap/modal'), require('ngx-bootstrap/dropdown'), require('@ctrl/ngx-csv'), require('@esfaenza/ngx-contextmenu')) :
|
|
3
|
+
typeof define === 'function' && define.amd ? define('@esfaenza/es-table', ['exports', '@angular/core', '@angular/forms', '@esfaenza/extensions', '@esfaenza/localizations', '@esfaenza/preferences', '@angular/platform-browser', '@angular/cdk/drag-drop', '@angular/common', '@angular/router', '@angular/material/select', '@angular/material/input', 'ngx-bootstrap/modal', 'ngx-bootstrap/dropdown', '@ctrl/ngx-csv', '@esfaenza/ngx-contextmenu'], factory) :
|
|
4
|
+
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory((global.esfaenza = global.esfaenza || {}, global.esfaenza['es-table'] = {}), global.ng.core, global.ng.forms, global.i1, global.localizations, global.preferences, global.ng.platformBrowser, global.ng.cdk.dragDrop, global.ng.common, global.ng.router, global.ng.material.select, global.ng.material.input, global.modal, global.dropdown, global.ngxCsv, global.ngxContextmenu));
|
|
5
|
+
}(this, (function (exports, i0, forms, i1, localizations, preferences, platformBrowser, dragDrop, common, router, select, input, modal, dropdown, ngxCsv, ngxContextmenu) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopNamespace(e) {
|
|
8
8
|
if (e && e.__esModule) return e;
|
|
@@ -705,6 +705,279 @@
|
|
|
705
705
|
return ThAggregation;
|
|
706
706
|
}());
|
|
707
707
|
|
|
708
|
+
//Angular
|
|
709
|
+
/** Componente rappresentante una singola cella del body della tabella */
|
|
710
|
+
var EsTd = /** @class */ (function () {
|
|
711
|
+
/** @ignore */
|
|
712
|
+
function EsTd(myself, renderer, _viewContainer, sanitizer) {
|
|
713
|
+
this.myself = myself;
|
|
714
|
+
this.renderer = renderer;
|
|
715
|
+
this._viewContainer = _viewContainer;
|
|
716
|
+
this.sanitizer = sanitizer;
|
|
717
|
+
/** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */
|
|
718
|
+
this.ID = "";
|
|
719
|
+
/** Valore da mostrare all'interno della cella. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
720
|
+
this.Display = null;
|
|
721
|
+
/** Template Angular da istanziare per questo TD */
|
|
722
|
+
this.Template = null;
|
|
723
|
+
}
|
|
724
|
+
Object.defineProperty(EsTd.prototype, "Visible", {
|
|
725
|
+
/**
|
|
726
|
+
* Restituisce lo stato di Visibilità della cella in oggetto
|
|
727
|
+
*
|
|
728
|
+
* @returns {boolean} **true** se visibile, **false** altrimenti
|
|
729
|
+
*/
|
|
730
|
+
get: function () {
|
|
731
|
+
if (this._Visible == undefined)
|
|
732
|
+
this._Visible = true;
|
|
733
|
+
return this._Visible;
|
|
734
|
+
},
|
|
735
|
+
/**
|
|
736
|
+
* Imposta la visibilità o meno della cella, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
737
|
+
*
|
|
738
|
+
* @param {boolean} expression Indicazione della visibilità
|
|
739
|
+
*/
|
|
740
|
+
set: function (expression) {
|
|
741
|
+
this._Visible = expression;
|
|
742
|
+
if (expression)
|
|
743
|
+
this.renderer.removeClass(this.myself.nativeElement, "app-display-none");
|
|
744
|
+
else
|
|
745
|
+
this.renderer.addClass(this.myself.nativeElement, "app-display-none");
|
|
746
|
+
},
|
|
747
|
+
enumerable: false,
|
|
748
|
+
configurable: true
|
|
749
|
+
});
|
|
750
|
+
/** @ignore */
|
|
751
|
+
EsTd.prototype.ngAfterViewInit = function () {
|
|
752
|
+
// Se è Internal significa che è gestita internamente da ES-TABLE quindi evito di fare sti due passaggi di lettura del DOM
|
|
753
|
+
if (this.Internal)
|
|
754
|
+
return;
|
|
755
|
+
// L'hash è calcolato dalla ES-table in fase di binding
|
|
756
|
+
this.Context = this.Context || this.getTemplateContext()._hash;
|
|
757
|
+
this.Content = this.Display === null || this.Display === "" ? this.sanitizer.bypassSecurityTrustHtml(this.myself.nativeElement.innerHTML) : this.sanitizer.bypassSecurityTrustHtml(this.Display);
|
|
758
|
+
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
759
|
+
};
|
|
760
|
+
/** Ottiene il contesto della view su cui è istanziato il componente */
|
|
761
|
+
EsTd.prototype.getTemplateContext = function () {
|
|
762
|
+
// NGBUG: (<any>this._viewContainer)._view non esiste più in IVY: https://stackoverflow.com/questions/60398827/getting-the-context-of-the-template-inside-of-which-my-component-has-been-render
|
|
763
|
+
var vc = this._viewContainer;
|
|
764
|
+
var context;
|
|
765
|
+
// Primo giro di recupero del contesto, supponendo di non avere a che fare col compilatore IVY
|
|
766
|
+
if (vc._view == null)
|
|
767
|
+
context = null;
|
|
768
|
+
else if (vc._view.parent && !vc._view.context.$implicit && vc._view.parent.context && vc._view.parent.context.$implicit)
|
|
769
|
+
context = vc._view.parent.context.$implicit;
|
|
770
|
+
else if (vc._view.context && vc._view.context.ngIf)
|
|
771
|
+
context = vc._view.viewContainerParent.context.$implicit;
|
|
772
|
+
else
|
|
773
|
+
context = vc._view.context.$implicit;
|
|
774
|
+
if (context)
|
|
775
|
+
return context;
|
|
776
|
+
// Se non ho ancora trovato il contesto probabilmente sono in IVY e devo fare dei lookup un po' incasinati per beccarlo
|
|
777
|
+
var array = this._viewContainer._hostLView;
|
|
778
|
+
for (var i = 0; i < array.length; i++) {
|
|
779
|
+
var item = array[i];
|
|
780
|
+
if (item && item.$implicit && !item.ngIf)
|
|
781
|
+
return item.$implicit;
|
|
782
|
+
// Second level search for the real context in case the first one we find is an ngIf
|
|
783
|
+
if (item && item.length && item.length > 0) {
|
|
784
|
+
for (var ii = 0; ii < item.length; ii++) {
|
|
785
|
+
var iitem = item[ii];
|
|
786
|
+
if (iitem && iitem.$implicit && !iitem.ngIf)
|
|
787
|
+
return iitem.$implicit;
|
|
788
|
+
}
|
|
789
|
+
}
|
|
790
|
+
}
|
|
791
|
+
};
|
|
792
|
+
return EsTd;
|
|
793
|
+
}());
|
|
794
|
+
EsTd.decorators = [
|
|
795
|
+
{ type: i0.Component, args: [{
|
|
796
|
+
selector: "[es-td]",
|
|
797
|
+
template: "<span>\r\n <ng-content></ng-content>\r\n</span>",
|
|
798
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
799
|
+
},] }
|
|
800
|
+
];
|
|
801
|
+
EsTd.ctorParameters = function () { return [
|
|
802
|
+
{ type: i0.ElementRef },
|
|
803
|
+
{ type: i0.Renderer2 },
|
|
804
|
+
{ type: i0.ViewContainerRef },
|
|
805
|
+
{ type: platformBrowser.DomSanitizer }
|
|
806
|
+
]; };
|
|
807
|
+
EsTd.propDecorators = {
|
|
808
|
+
ID: [{ type: i0.Input, args: ['es-td',] }],
|
|
809
|
+
Internal: [{ type: i0.Input }],
|
|
810
|
+
RouterLink: [{ type: i0.Input }],
|
|
811
|
+
Display: [{ type: i0.Input }],
|
|
812
|
+
Template: [{ type: i0.Input }],
|
|
813
|
+
Context: [{ type: i0.Input }],
|
|
814
|
+
Visible: [{ type: i0.Input }]
|
|
815
|
+
};
|
|
816
|
+
|
|
817
|
+
//Angular
|
|
818
|
+
/** Componente rappresentante una Colonna della tabella */
|
|
819
|
+
var EsTh = /** @class */ (function () {
|
|
820
|
+
/** @ignore */
|
|
821
|
+
function EsTh(myself, renderer) {
|
|
822
|
+
this.myself = myself;
|
|
823
|
+
this.renderer = renderer;
|
|
824
|
+
/** Dizionario di mappatura con ordinamento attuale e ordinamento successivo per gestire i passaggi di stato */
|
|
825
|
+
this.orderNext = { "NONE": "DESC", "DESC": "ASC", "ASC": null };
|
|
826
|
+
/** Indica se si sta effettuando un'operazione di resize su questa colonna */
|
|
827
|
+
this.resizingThis = false;
|
|
828
|
+
/**
|
|
829
|
+
* Storicizza l'offset di partenza del resize dell'elemento HTML per poter calcolare la nuova dimensione richiesta durente il resize
|
|
830
|
+
*
|
|
831
|
+
* nuova width = startOffset + posizione X del mouse
|
|
832
|
+
*/
|
|
833
|
+
this.startOffset = null;
|
|
834
|
+
/** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
|
|
835
|
+
this.ID = "";
|
|
836
|
+
/** Indica se questa colonna è ordinabile o meno */
|
|
837
|
+
this.Orderable = true;
|
|
838
|
+
/** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
839
|
+
this.Display = "";
|
|
840
|
+
/** Indica se le dimnsioni di questa colonna sono modificabili o meno */
|
|
841
|
+
this.Resizable = false;
|
|
842
|
+
/** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */
|
|
843
|
+
this.Pinned = false;
|
|
844
|
+
/**
|
|
845
|
+
* Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio
|
|
846
|
+
* come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi
|
|
847
|
+
*/
|
|
848
|
+
this.SearchInProgress = false;
|
|
849
|
+
/** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
|
|
850
|
+
this.Wrap = false;
|
|
851
|
+
/** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
|
|
852
|
+
this.Fixed = false;
|
|
853
|
+
/** Template Angular da istanziare per questo TH */
|
|
854
|
+
this.Template = null;
|
|
855
|
+
/** Evento emesso al cambio di ordinamento effettuato su questa colonna */
|
|
856
|
+
this.onOrderChange = new i0.EventEmitter();
|
|
857
|
+
/** Evento emesso all'unpinning della colonna */
|
|
858
|
+
this.onUnpinning = new i0.EventEmitter();
|
|
859
|
+
/** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
860
|
+
this._referenced = false;
|
|
861
|
+
}
|
|
862
|
+
Object.defineProperty(EsTh.prototype, "Visible", {
|
|
863
|
+
/**
|
|
864
|
+
* Restituisce lo stato di Visibilità della colonna in oggetto
|
|
865
|
+
*
|
|
866
|
+
* @returns {boolean} **true** se visibile, **false** altrimenti
|
|
867
|
+
*/
|
|
868
|
+
get: function () {
|
|
869
|
+
if (this._Visible == undefined)
|
|
870
|
+
this._Visible = true;
|
|
871
|
+
return this._Visible;
|
|
872
|
+
},
|
|
873
|
+
/**
|
|
874
|
+
* Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
875
|
+
*
|
|
876
|
+
* @param {boolean} expression Indicazione della visibilità
|
|
877
|
+
*/
|
|
878
|
+
set: function (expression) {
|
|
879
|
+
this._Visible = expression;
|
|
880
|
+
if (expression)
|
|
881
|
+
this.renderer.removeClass(this.myself.nativeElement, "app-display-none");
|
|
882
|
+
else
|
|
883
|
+
this.renderer.addClass(this.myself.nativeElement, "app-display-none");
|
|
884
|
+
},
|
|
885
|
+
enumerable: false,
|
|
886
|
+
configurable: true
|
|
887
|
+
});
|
|
888
|
+
/** @ignore */
|
|
889
|
+
EsTh.prototype.ngAfterViewInit = function () {
|
|
890
|
+
//Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
|
|
891
|
+
this.Description = this.Display === null || this.Display === "" ? this.content.nativeElement.innerText : this.Display;
|
|
892
|
+
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
893
|
+
//Resize
|
|
894
|
+
if (this.Resizable)
|
|
895
|
+
this.renderer.addClass(this.myself.nativeElement, "app-relative");
|
|
896
|
+
};
|
|
897
|
+
/** Emette l'evento di unpinning */
|
|
898
|
+
EsTh.prototype.unpin = function () {
|
|
899
|
+
this.onUnpinning.emit(this.ID);
|
|
900
|
+
};
|
|
901
|
+
/** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */
|
|
902
|
+
EsTh.prototype.setupNextOrderAndNotify = function () {
|
|
903
|
+
if (!this.ID) {
|
|
904
|
+
console.log("Attempt to order a column without ID. Operation ignored");
|
|
905
|
+
return;
|
|
906
|
+
}
|
|
907
|
+
if (this.SearchInProgress) {
|
|
908
|
+
console.log("Attempt to order a column during a search. Operation ignored");
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
if (!this.OrderBy || !this.Orderable)
|
|
912
|
+
return;
|
|
913
|
+
var nextOrder = this.orderNext[this.Order || "NONE"];
|
|
914
|
+
this.Order = nextOrder;
|
|
915
|
+
this.onOrderChange.emit(this.Order);
|
|
916
|
+
};
|
|
917
|
+
/**
|
|
918
|
+
* Evento di inizio resize della colonna
|
|
919
|
+
*
|
|
920
|
+
* @param {any} ev Evento MouseDown
|
|
921
|
+
*/
|
|
922
|
+
EsTh.prototype.onResizeStart = function (ev) {
|
|
923
|
+
if (!this.Resizable)
|
|
924
|
+
return;
|
|
925
|
+
this.resizingThis = true;
|
|
926
|
+
this.startOffset = this.myself.nativeElement.offsetWidth - ev.pageX;
|
|
927
|
+
};
|
|
928
|
+
/** Listener per la fine dell'operazione di resize */
|
|
929
|
+
EsTh.prototype.onMouseUp = function () {
|
|
930
|
+
if (!this.Resizable)
|
|
931
|
+
return;
|
|
932
|
+
this.resizingThis = false;
|
|
933
|
+
};
|
|
934
|
+
/**
|
|
935
|
+
* Listener per gestire il movimento del mouse qualora un'operazione di resize fosse in esecuzione
|
|
936
|
+
*
|
|
937
|
+
* @param {$event} ev Evento MouseMove
|
|
938
|
+
*/
|
|
939
|
+
EsTh.prototype.onMouseMove = function ($event) {
|
|
940
|
+
if (!this.Resizable || !this.resizingThis)
|
|
941
|
+
return;
|
|
942
|
+
//Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo
|
|
943
|
+
//(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)
|
|
944
|
+
this.myself.nativeElement.style.width = (this.startOffset + $event.pageX) + "px";
|
|
945
|
+
//Fermo il bubbling per non fare cose strane
|
|
946
|
+
$event.preventDefault();
|
|
947
|
+
};
|
|
948
|
+
return EsTh;
|
|
949
|
+
}());
|
|
950
|
+
EsTh.decorators = [
|
|
951
|
+
{ type: i0.Component, args: [{
|
|
952
|
+
selector: "[es-th]",
|
|
953
|
+
template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID && Orderable\" [class.app-pointer]=\"!!ID && Orderable\">\r\n <span #content>\r\n <ng-container *ngIf=\"Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span> \r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order == 'DESC'\" [class.fa-chevron-up]=\"Order == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned && !Fixed\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable || Fixed || Pinned\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>",
|
|
954
|
+
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
955
|
+
},] }
|
|
956
|
+
];
|
|
957
|
+
EsTh.ctorParameters = function () { return [
|
|
958
|
+
{ type: i0.ElementRef },
|
|
959
|
+
{ type: i0.Renderer2 }
|
|
960
|
+
]; };
|
|
961
|
+
EsTh.propDecorators = {
|
|
962
|
+
ID: [{ type: i0.Input, args: ['es-th',] }],
|
|
963
|
+
Order: [{ type: i0.Input }],
|
|
964
|
+
Orderable: [{ type: i0.Input }],
|
|
965
|
+
Display: [{ type: i0.Input }],
|
|
966
|
+
Resizable: [{ type: i0.Input }],
|
|
967
|
+
Pinned: [{ type: i0.Input }],
|
|
968
|
+
SearchInProgress: [{ type: i0.Input }],
|
|
969
|
+
OrderBy: [{ type: i0.Input }],
|
|
970
|
+
Wrap: [{ type: i0.Input }],
|
|
971
|
+
Fixed: [{ type: i0.Input }],
|
|
972
|
+
Template: [{ type: i0.Input }],
|
|
973
|
+
onOrderChange: [{ type: i0.Output }],
|
|
974
|
+
onUnpinning: [{ type: i0.Output }],
|
|
975
|
+
content: [{ type: i0.ViewChild, args: ["content", { static: false },] }],
|
|
976
|
+
Visible: [{ type: i0.Input }],
|
|
977
|
+
onMouseUp: [{ type: i0.HostListener, args: ['window:mouseup.out-zone',] }],
|
|
978
|
+
onMouseMove: [{ type: i0.HostListener, args: ['window:mousemove.out-zone', ['$event'],] }]
|
|
979
|
+
};
|
|
980
|
+
|
|
708
981
|
/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */
|
|
709
982
|
var EsTdDirective = /** @class */ (function () {
|
|
710
983
|
/**
|
|
@@ -918,7 +1191,7 @@
|
|
|
918
1191
|
*
|
|
919
1192
|
* Costo: 1 scan EsThs
|
|
920
1193
|
*
|
|
921
|
-
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1194
|
+
* @param {EsTh[] | EsThDirective[]} ths Colonne della tabella
|
|
922
1195
|
*/
|
|
923
1196
|
ColumnMetadataHandler.prototype.reviewColumnsList = function (ths) {
|
|
924
1197
|
var _this = this;
|
|
@@ -927,18 +1200,30 @@
|
|
|
927
1200
|
return;
|
|
928
1201
|
var _loop_1 = function (i) {
|
|
929
1202
|
var th = ths[i];
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
1203
|
+
if (this_1.utilities.isEsTh(th)) {
|
|
1204
|
+
// Se non ho un id il th è considerato inerte
|
|
1205
|
+
if (!th.ID)
|
|
1206
|
+
return "continue";
|
|
1207
|
+
th.OrderBy = this_1.est.OrderByColumn;
|
|
1208
|
+
// Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
|
|
1209
|
+
// Di default la visibilità è quella impostata nel componente
|
|
1210
|
+
if (this_1.est.HiddenColumns || th.Visible)
|
|
1211
|
+
this_1.est.TMPColumnsList.push(new EsTableColumn(th.ID, th.Description, th.Visible, th.Fixed));
|
|
1212
|
+
}
|
|
1213
|
+
else {
|
|
1214
|
+
var column_1 = th.th;
|
|
1215
|
+
// Se non ho un id il th è considerato inerte
|
|
1216
|
+
if (!column_1)
|
|
1217
|
+
return "continue";
|
|
1218
|
+
// Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
|
|
1219
|
+
// Di default la visibilità è quella impostata nel componente
|
|
1220
|
+
if ((this_1.est.HiddenColumns || th.thVisible) && th.thIf) {
|
|
1221
|
+
var previouslyPinned = !this_1.est.ColumnsList || this_1.est.ColumnsList.length == 0 ? null : this_1.est.ColumnsList.find(function (t) { return t.id == column_1; }) || null;
|
|
1222
|
+
var toAdd = new EsTableColumn(column_1, null, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnedWidth, th.Template, th._thParents);
|
|
1223
|
+
if (previouslyPinned)
|
|
1224
|
+
toAdd.prev_index = previouslyPinned.prev_index;
|
|
1225
|
+
this_1.est.TMPColumnsList.push(toAdd);
|
|
1226
|
+
}
|
|
942
1227
|
}
|
|
943
1228
|
};
|
|
944
1229
|
var this_1 = this;
|
|
@@ -978,21 +1263,33 @@
|
|
|
978
1263
|
// Sposto tutti gli header fixed o pinned all'inizio
|
|
979
1264
|
for (var i = 0; i < ths.length; i++) {
|
|
980
1265
|
var th = ths[i];
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
|
|
984
|
-
|
|
985
|
-
|
|
986
|
-
|
|
987
|
-
|
|
1266
|
+
if (this.utilities.isEsTh(th)) {
|
|
1267
|
+
thsCache[th.ID] = th;
|
|
1268
|
+
if (th.Fixed) {
|
|
1269
|
+
if (i != pinneds + fixeds)
|
|
1270
|
+
this.utilities.arrayMove(ths, i, pinneds + fixeds);
|
|
1271
|
+
fixeds++;
|
|
1272
|
+
}
|
|
988
1273
|
}
|
|
989
|
-
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
|
|
993
|
-
|
|
1274
|
+
else {
|
|
1275
|
+
thsCache[th.th] = th;
|
|
1276
|
+
// Riassegno sempre per ripulire valori di partenza o per aggiornarli in caso di modifiche utente
|
|
1277
|
+
th.thPinned = (!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned);
|
|
1278
|
+
if (th.thPinned) {
|
|
1279
|
+
if (i != pinneds)
|
|
1280
|
+
this.utilities.arrayMove(ths, i, pinneds);
|
|
1281
|
+
pinneds++;
|
|
1282
|
+
}
|
|
1283
|
+
//In questo caso sono informazioni statiche invece, non modificabili dall'utente, quindi non mi dò preoccupazioni
|
|
1284
|
+
if ((th.thFixed || th.thGroup) && !th.thPinned) {
|
|
1285
|
+
if (i != pinneds + fixeds)
|
|
1286
|
+
this.utilities.arrayMove(ths, i, pinneds + fixeds);
|
|
1287
|
+
fixeds++;
|
|
1288
|
+
}
|
|
994
1289
|
}
|
|
995
1290
|
}
|
|
1291
|
+
if (this.utilities.isEsTh(ths[0]) || this.utilities.isEsTd(tds[0]))
|
|
1292
|
+
return;
|
|
996
1293
|
// Cache degli indici per riposizionare i td come i th
|
|
997
1294
|
for (var i = 0; i < ths.length; i++)
|
|
998
1295
|
columnsIndexCache[ths[i].th] = i;
|
|
@@ -1079,8 +1376,8 @@
|
|
|
1079
1376
|
*
|
|
1080
1377
|
* Costo: 1 scan ColumnsList, 1 scan EsThs, 1 scan EsTds
|
|
1081
1378
|
*
|
|
1082
|
-
* @param {EsThDirective[]} ths Header della tabella
|
|
1083
|
-
* @param {EsTdDirective[]} tds Celle della tabella
|
|
1379
|
+
* @param {EsTh[] | EsThDirective[]} ths Header della tabella
|
|
1380
|
+
* @param {EsTd[] | EsTdDirective[]} tds Celle della tabella
|
|
1084
1381
|
* @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
|
|
1085
1382
|
*/
|
|
1086
1383
|
ColumnMetadataHandler.prototype.refreshColumnsVisibility = function (ths, tds, view) {
|
|
@@ -1102,16 +1399,26 @@
|
|
|
1102
1399
|
// Definisco se la colonna è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1103
1400
|
for (var i = 0; i < ths.length; i++) {
|
|
1104
1401
|
var th = ths[i];
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1402
|
+
if (this.utilities.isEsTh(th)) {
|
|
1403
|
+
th.Visible = th.Fixed || (columnsCache[th.ID] ? columnsCache[th.ID].visible : th.Visible);
|
|
1404
|
+
if (th.Fixed)
|
|
1405
|
+
fixedThs[th.ID] = true;
|
|
1406
|
+
}
|
|
1407
|
+
else {
|
|
1408
|
+
th.thVisible = th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible);
|
|
1409
|
+
if (th.thFixed || th.thGroup)
|
|
1410
|
+
fixedThs[th.th] = true;
|
|
1411
|
+
}
|
|
1108
1412
|
}
|
|
1109
1413
|
}
|
|
1110
1414
|
if (tds) {
|
|
1111
1415
|
// Definisco se la cella è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1112
1416
|
for (var i = 0; i < tds.length; i++) {
|
|
1113
1417
|
var td = tds[i];
|
|
1114
|
-
|
|
1418
|
+
if (this.utilities.isEsTd(td))
|
|
1419
|
+
td.Visible = fixedThs[td.ID] || (columnsCache[td.ID] ? columnsCache[td.ID].visible : td.Visible);
|
|
1420
|
+
else
|
|
1421
|
+
td.tdVisible = fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible);
|
|
1115
1422
|
}
|
|
1116
1423
|
}
|
|
1117
1424
|
this.est.changed();
|
|
@@ -1120,26 +1427,38 @@
|
|
|
1120
1427
|
* Allinea gli ordinamenti dati fra le **EsThs** e le informazioni all'interno della View bindata
|
|
1121
1428
|
*
|
|
1122
1429
|
* @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
|
|
1123
|
-
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1430
|
+
* @param {EsTh[] | EsThDirective[]} ths Colonne della tabella
|
|
1124
1431
|
*/
|
|
1125
1432
|
ColumnMetadataHandler.prototype.alignHeadersOrdering = function (ths, view) {
|
|
1126
1433
|
var orders = view ? view.orders : this.est.arrayOrders;
|
|
1127
1434
|
for (var i = 0; i < ths.length; i++) {
|
|
1128
1435
|
var th = ths[i];
|
|
1129
|
-
th
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1436
|
+
if (this.utilities.isEsTh(th)) {
|
|
1437
|
+
th.Order = null;
|
|
1438
|
+
// Assegno tutti gli ordinamenti che mi vengono da AppSearch. Sono i più importanti. Non faccio cache o cose strano perché tanto questa
|
|
1439
|
+
// variabile sarà sempre massimo 3 elementi
|
|
1440
|
+
for (var i_1 = 0; i_1 < orders.length; i_1++) {
|
|
1441
|
+
var or = orders[i_1];
|
|
1442
|
+
if (or.id == th.ID)
|
|
1443
|
+
th.Order = or.order;
|
|
1444
|
+
}
|
|
1445
|
+
}
|
|
1446
|
+
else {
|
|
1447
|
+
th.thOrder = null;
|
|
1448
|
+
for (var i_2 = 0; i_2 < orders.length; i_2++) {
|
|
1449
|
+
var or = orders[i_2];
|
|
1450
|
+
if (or.id == th.th)
|
|
1451
|
+
th.thOrder = or.order;
|
|
1452
|
+
}
|
|
1134
1453
|
}
|
|
1135
1454
|
}
|
|
1136
1455
|
};
|
|
1137
1456
|
/**
|
|
1138
1457
|
* Genera tutte le informazioni che servono per gestire il raggruppamento degli header
|
|
1139
1458
|
*
|
|
1140
|
-
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1459
|
+
* @param {EsTh[] | EsThDirective[]} ths Colonne della tabella
|
|
1141
1460
|
*
|
|
1142
|
-
* @returns {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} Oggetto contenente la lista delle foglie (header base), il livello
|
|
1461
|
+
* @returns {{ leafs: EsTh[] | EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} Oggetto contenente la lista delle foglie (header base), il livello
|
|
1143
1462
|
* massimo di raggruppamento raggiunto, una cache in cui vengono indicati tutti i gruppi che sono "parent" (quindi che raggruppano almeno 1 header) e la cache degli header
|
|
1144
1463
|
*/
|
|
1145
1464
|
ColumnMetadataHandler.prototype.evaluateHeadersGroupingInfos = function (ths) {
|
|
@@ -1148,6 +1467,8 @@
|
|
|
1148
1467
|
var thsCache = {};
|
|
1149
1468
|
for (var i = 0; i < ths.length; i++) {
|
|
1150
1469
|
var th = ths[i];
|
|
1470
|
+
if (this.utilities.isEsTh(th))
|
|
1471
|
+
continue;
|
|
1151
1472
|
thsCache[th.th] = th;
|
|
1152
1473
|
if (th.thParent && !parentsCache[th.thParent])
|
|
1153
1474
|
parentsCache[th.thParent] = true;
|
|
@@ -1157,6 +1478,10 @@
|
|
|
1157
1478
|
var leafs = [];
|
|
1158
1479
|
for (var i = 0; i < ths.length; i++) {
|
|
1159
1480
|
var th = ths[i];
|
|
1481
|
+
if (this.utilities.isEsTh(th)) {
|
|
1482
|
+
leafs.push(th);
|
|
1483
|
+
continue;
|
|
1484
|
+
}
|
|
1160
1485
|
// Se sono una foglia vedo quanti livelli ci sono sopra
|
|
1161
1486
|
if (!parentsCache[th.th]) {
|
|
1162
1487
|
leafs.push(th);
|
|
@@ -1169,7 +1494,7 @@
|
|
|
1169
1494
|
/**
|
|
1170
1495
|
* Genera gli header groups da una lista di info sui th all'interno della variabile **TMPRowThGroups**
|
|
1171
1496
|
*
|
|
1172
|
-
* @param {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} infos Informazioni di raggruppamento valutate precedentemente
|
|
1497
|
+
* @param {{ leafs: EsTh[] | EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} infos Informazioni di raggruppamento valutate precedentemente
|
|
1173
1498
|
*/
|
|
1174
1499
|
ColumnMetadataHandler.prototype.evaluateHeaderGroups = function (infos) {
|
|
1175
1500
|
if (infos.groupingLevel == 0)
|
|
@@ -1276,7 +1601,7 @@
|
|
|
1276
1601
|
if (!orderings || orderings.length == 0) {
|
|
1277
1602
|
for (var i = 0; i < ths.length; i++) {
|
|
1278
1603
|
var th = ths[i];
|
|
1279
|
-
var order = th.th;
|
|
1604
|
+
var order = this.utilities.isEsTh(th) ? th.ID : th.th;
|
|
1280
1605
|
this.est.OrderDirectives.push(order);
|
|
1281
1606
|
}
|
|
1282
1607
|
}
|
|
@@ -1284,7 +1609,7 @@
|
|
|
1284
1609
|
this.est.OrderDirectives = orderings;
|
|
1285
1610
|
var _loop_2 = function (i) {
|
|
1286
1611
|
var th = ths[i];
|
|
1287
|
-
var thId = th.th;
|
|
1612
|
+
var thId = this_2.utilities.isEsTh(th) ? th.ID : th.th;
|
|
1288
1613
|
if (!this_2.est.OrderDirectives.find(function (o) { return o == thId; }))
|
|
1289
1614
|
this_2.est.OrderDirectives.push(thId);
|
|
1290
1615
|
};
|
|
@@ -1978,6 +2303,24 @@
|
|
|
1978
2303
|
}
|
|
1979
2304
|
return tmpItems;
|
|
1980
2305
|
};
|
|
2306
|
+
/**
|
|
2307
|
+
* Metodo che prende tutti gli oggetti di cui dispone divisi in bucket da 100 elementi
|
|
2308
|
+
*
|
|
2309
|
+
* @returns {any[][]} Matrice di array Nx100
|
|
2310
|
+
*/
|
|
2311
|
+
ItemsHandler.prototype.getItemSlices = function () {
|
|
2312
|
+
// Se sono qui di sicuro non ho rowgrouping
|
|
2313
|
+
var items = this.getItemsByMode();
|
|
2314
|
+
if (!items)
|
|
2315
|
+
return [];
|
|
2316
|
+
var arrayBy100 = [];
|
|
2317
|
+
var slices = Math.ceil(items.length / this.est.SliceSize);
|
|
2318
|
+
for (var i = 0; i < slices; i++) {
|
|
2319
|
+
var arraySlice = items.slice(i * this.est.SliceSize, i * this.est.SliceSize + this.est.SliceSize);
|
|
2320
|
+
arrayBy100.push(arraySlice);
|
|
2321
|
+
}
|
|
2322
|
+
return arrayBy100;
|
|
2323
|
+
};
|
|
1981
2324
|
/** Se in modalità array applica gli ordinamenti ASC-DESC delle colonne */
|
|
1982
2325
|
ItemsHandler.prototype.arrayModeReviewOrderings = function () {
|
|
1983
2326
|
var _this = this;
|
|
@@ -2243,11 +2586,13 @@
|
|
|
2243
2586
|
/**
|
|
2244
2587
|
* Se in modalità array applica i raggruppamenti definiti lato row-grouping
|
|
2245
2588
|
*
|
|
2246
|
-
* @param {ths: EsThDirective[]} ths Header
|
|
2589
|
+
* @param {ths: EsTh[] | EsThDirective[]} ths Header
|
|
2247
2590
|
*/
|
|
2248
2591
|
RowGroupingHandler.prototype.arrayModeReviewGroupings = function (ths) {
|
|
2249
2592
|
if (ths.length == 0)
|
|
2250
2593
|
return;
|
|
2594
|
+
if (this.utilities.isEsTh(ths[0]))
|
|
2595
|
+
return;
|
|
2251
2596
|
var headerGroups = [];
|
|
2252
2597
|
var headerAggregations = [];
|
|
2253
2598
|
for (var i = 0; i < ths.length; i++) {
|
|
@@ -3180,6 +3525,20 @@
|
|
|
3180
3525
|
throw "Gli indici passati non fanno riferimento a una posizione dell'array. Length: " + array.length + " Old:" + oldI + " New: " + newI;
|
|
3181
3526
|
array.splice(newI, 0, array.splice(oldI, 1)[0]);
|
|
3182
3527
|
};
|
|
3528
|
+
/**
|
|
3529
|
+
* Helper che identifica se il td attuale è di tipo **EsTd**. In caso contrario è da considerarsi **EsTdDirective**
|
|
3530
|
+
*
|
|
3531
|
+
* @param {any} td Cella da valutare
|
|
3532
|
+
* @returns {boolean} Restituisce **true** se il **td** è di tipo **EsTd**, **false** se è di tipo **EsTdDirective**
|
|
3533
|
+
*/
|
|
3534
|
+
UtilitiesHandler.prototype.isEsTd = function (td) { return !td._directive; };
|
|
3535
|
+
/**
|
|
3536
|
+
* Helper che identifica se il th attuale è di tipo **EsTh**. In caso contrario è da considerarsi **EsThDirective**
|
|
3537
|
+
*
|
|
3538
|
+
* @param {any} td Header da valutare
|
|
3539
|
+
* @returns {boolean} Restituisce **true** se il **th** è di tipo **EsTh**, **false** se è di tipo **EsThDirective**
|
|
3540
|
+
*/
|
|
3541
|
+
UtilitiesHandler.prototype.isEsTh = function (th) { return !th._directive; };
|
|
3183
3542
|
/**
|
|
3184
3543
|
* Date le informazioni di paginazione ottiene l'array dei pulsanti
|
|
3185
3544
|
*
|
|
@@ -3378,6 +3737,26 @@
|
|
|
3378
3737
|
this.ColumnsResizable = null;
|
|
3379
3738
|
/** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
|
|
3380
3739
|
this.AutoUpdate = null;
|
|
3740
|
+
/** Indica se la tabella (configurata con **UseCustomCells**) deve mettersi in ascolto per i click sulle celle desiderate
|
|
3741
|
+
*
|
|
3742
|
+
* @deprecated Utilizzare l'Input **Template** delle es-td e assegnare un template con tutti i binding che si vuole ai click
|
|
3743
|
+
*/
|
|
3744
|
+
this.UseCustomCellActions = null;
|
|
3745
|
+
/**
|
|
3746
|
+
* Indica le celle desiderate su cui intercettare i click. Attiva solo quando **UseCustomCellActions** è true.
|
|
3747
|
+
* Ogni cella dev'essere separata dalla successiva dal carattere del Simoleon:
|
|
3748
|
+
*
|
|
3749
|
+
* Es, "MiaCella1§MiaCella2"
|
|
3750
|
+
*
|
|
3751
|
+
* @deprecated Utilizzare l'Input **Template** delle es-td e assegnare un template con tutti i binding che si vuole ai click
|
|
3752
|
+
*/
|
|
3753
|
+
this.CustomCellActionsOn = '';
|
|
3754
|
+
/**
|
|
3755
|
+
* Serve per decidere di lanciare o meno il **event.stopPropagation()** al termine della gestione dell'evento
|
|
3756
|
+
*
|
|
3757
|
+
* @deprecated Utilizzare l'Input **Template** delle es-td e assegnare un template con tutti i binding che si vuole ai click
|
|
3758
|
+
*/
|
|
3759
|
+
this.CellActionPropagates = true;
|
|
3381
3760
|
/**
|
|
3382
3761
|
* Decide se utilizzare o meno le CustomCells. Impostandolo a **true** l'es-table diventa in grado di gestire nativamente:
|
|
3383
3762
|
*
|
|
@@ -3436,6 +3815,12 @@
|
|
|
3436
3815
|
this.HasHeaderGroup = null;
|
|
3437
3816
|
/** Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
|
|
3438
3817
|
this.HasSecondaryHeaderGroup = null;
|
|
3818
|
+
/** Utilizzato per dividere la sorgente in modalità EndlessScroll */
|
|
3819
|
+
this.SliceSize = 100;
|
|
3820
|
+
/** Decide se utilizzare la modalità di EndlessScroll */
|
|
3821
|
+
this.EndlessScroll = null;
|
|
3822
|
+
/** Qualora **EndlessScroll** fosse true, indica se utilizzare questa modalità solo quando si cerca per "Tutti" o in generale */
|
|
3823
|
+
this.EndlessScrollOnlyForAll = true;
|
|
3439
3824
|
/** Indica se nascondere gli Header della tabella */
|
|
3440
3825
|
this.HeaderHidden = null;
|
|
3441
3826
|
/** Indica se nascondere il Body della tabella */
|
|
@@ -3518,6 +3903,11 @@
|
|
|
3518
3903
|
this.onRemoval = new i0.EventEmitter();
|
|
3519
3904
|
/** Evento richiamato all'annullamento di un'eliminazione */
|
|
3520
3905
|
this.onAbortRemoval = new i0.EventEmitter();
|
|
3906
|
+
/** Evento richiamato al click su una cella quando **UseCustomCellActions** è attivo
|
|
3907
|
+
*
|
|
3908
|
+
* @deprecated Utilizzare l'Input **Template** delle es-td e assegnare un template con tutti i binding che si vuole ai click
|
|
3909
|
+
*/
|
|
3910
|
+
this.onCellClick = new i0.EventEmitter();
|
|
3521
3911
|
/** Evento richiamato quando si clicca su un opzione definita nelle **CornerMenuOptions** */
|
|
3522
3912
|
this.onCornerAction = new i0.EventEmitter();
|
|
3523
3913
|
/** Evento richiamato quando si clicca su un opzione definita nelle **DynamicOperations** */
|
|
@@ -3605,6 +3995,10 @@
|
|
|
3605
3995
|
/** @ignore */
|
|
3606
3996
|
EsTableComponent.prototype.ngOnInit = function () {
|
|
3607
3997
|
var _this = this;
|
|
3998
|
+
//Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,
|
|
3999
|
+
//che con solo la proiezione (senza celle cusotm) non è disponibile
|
|
4000
|
+
if (this.Hierarchy && !this.UseCustomCells)
|
|
4001
|
+
throw "Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\"true\" è richiesto anche [UseCustomCells]=\"true\"";
|
|
3608
4002
|
// click destro su una riga con selezione attiva: Tiro fuori il context menu e selezione l'elemento corrente
|
|
3609
4003
|
this.ctxMenuSubscription = (this.ContextMenu || this.tableEmptyMenu).open.subscribe(function (t) {
|
|
3610
4004
|
// Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...
|
|
@@ -3637,10 +4031,6 @@
|
|
|
3637
4031
|
this.ShiftClick = true;
|
|
3638
4032
|
this.DirectivesBased = true;
|
|
3639
4033
|
}
|
|
3640
|
-
//Per poter cambiare il layout in base al livello gerarchico il componente deva avere il pieno controllo di ogni cella,
|
|
3641
|
-
//che con solo la proiezione (senza celle cusotm) non è disponibile
|
|
3642
|
-
if (this.Hierarchy && !this.UseCustomCells)
|
|
3643
|
-
throw "Es-table error: Per poter utilizzare l'es-table con [Hierarchy]=\"true\" è richiesto anche [UseCustomCells]=\"true\"";
|
|
3644
4034
|
};
|
|
3645
4035
|
/** @ignore */
|
|
3646
4036
|
EsTableComponent.prototype.ngOnDestroy = function () {
|
|
@@ -3771,12 +4161,30 @@
|
|
|
3771
4161
|
*/
|
|
3772
4162
|
EsTableComponent.prototype.finalizeContext = function () {
|
|
3773
4163
|
var viewCasted = this.View;
|
|
4164
|
+
/*
|
|
4165
|
+
*Uso la tecnica di EndlessScroll se la variabile relativa è attiva e se
|
|
4166
|
+
* 1) Ho un Array, oppure
|
|
4167
|
+
* 2) Ho un AppSearch che sta cercando con paginazione "Tutto", oppure
|
|
4168
|
+
* 3) Ho un AppSearch che sta cercando con paginazione diversa da "Tutto" ma con la variabile EndlessScrollOnlyForAll a false
|
|
4169
|
+
*/
|
|
4170
|
+
var isAppSearchWithIppMax = this.viewMode && viewCasted.itemsperpageoverride == this.defaultAllPageOverride;
|
|
4171
|
+
var isAppSearchNoMaxIpp = this.viewMode && viewCasted.itemsperpageoverride != this.defaultAllPageOverride;
|
|
4172
|
+
this.UseEndlessscroll = this.EndlessScroll && (this.arrayMode || isAppSearchWithIppMax || (isAppSearchNoMaxIpp && !this.EndlessScrollOnlyForAll));
|
|
3774
4173
|
var hasRowGroups = (viewCasted.groupings && viewCasted.groupings.filter(function (t) { return !t.aggregation; }).length > 0) || (this.arrayMode && this.EsThsDirective.some(function (t) { return t.thGroup; }));
|
|
3775
4174
|
// Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
|
|
3776
4175
|
if (this.arrayMode && hasRowGroups)
|
|
3777
4176
|
this.UseArrayModePaging = false;
|
|
3778
4177
|
// Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia
|
|
3779
|
-
this.
|
|
4178
|
+
if (this.UseEndlessscroll && !hasRowGroups) {
|
|
4179
|
+
this.addedSlices = [];
|
|
4180
|
+
this.boundSubSources = this.items_H.getItemSlices();
|
|
4181
|
+
var firstSub = this.boundSubSources[0];
|
|
4182
|
+
this.TMPBoundSource = firstSub ? firstSub : [];
|
|
4183
|
+
if (firstSub)
|
|
4184
|
+
this.addedSlices.push(0);
|
|
4185
|
+
}
|
|
4186
|
+
else
|
|
4187
|
+
this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);
|
|
3780
4188
|
// Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource
|
|
3781
4189
|
if (this.Hierarchy && !hasRowGroups)
|
|
3782
4190
|
this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);
|
|
@@ -3836,22 +4244,51 @@
|
|
|
3836
4244
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
3837
4245
|
}
|
|
3838
4246
|
};
|
|
4247
|
+
/**
|
|
4248
|
+
* Metodo che gestisce l'endless scroll e in base a quanto la tabella è stata scrollata aggiunge degli elementi extra a **TMPBoundSource**
|
|
4249
|
+
*
|
|
4250
|
+
* @param {any} e Evento di scroll del browser
|
|
4251
|
+
*/
|
|
4252
|
+
EsTableComponent.prototype.onScroll = function (e) {
|
|
4253
|
+
var _this = this;
|
|
4254
|
+
var tableViewHeight = e.target.offsetHeight;
|
|
4255
|
+
var tableScrollHeight = e.target.scrollHeight;
|
|
4256
|
+
var scrollLocation = e.target.scrollTop;
|
|
4257
|
+
var buffer = 200;
|
|
4258
|
+
var limit = tableScrollHeight - tableViewHeight - buffer;
|
|
4259
|
+
if (scrollLocation > limit) {
|
|
4260
|
+
var indexToAdd = Math.floor(this.TMPBoundSource.length / 100);
|
|
4261
|
+
if (this.boundSubSources[indexToAdd] && this.addedSlices.indexOf(indexToAdd) == -1) {
|
|
4262
|
+
// Devo ricordarmi di fare l'hash del nuovo pezzo
|
|
4263
|
+
this.utilities_H.calculateHash(this.boundSubSources[indexToAdd]);
|
|
4264
|
+
this.TMPBoundSource = this.TMPBoundSource.concat(this.boundSubSources[indexToAdd]);
|
|
4265
|
+
this.addedSlices.push(indexToAdd);
|
|
4266
|
+
setTimeout(function () { _this.postBoundSourceCalculation(); });
|
|
4267
|
+
}
|
|
4268
|
+
}
|
|
4269
|
+
};
|
|
3839
4270
|
/**
|
|
3840
4271
|
* Metodo lanciato dopo che la sorgente dati è stata correttamente bindata, si occupa di ricalcolare tutto ciò che serve
|
|
3841
4272
|
* all'es-table per renderizzare i valori da mostrare
|
|
3842
4273
|
*/
|
|
3843
4274
|
EsTableComponent.prototype.postBoundSourceCalculation = function () {
|
|
4275
|
+
var _this = this;
|
|
3844
4276
|
// Resetto tutto tranne RowTDs e RowTHs per evitare flickering. RowTDs e RowTHs saranno modificate all'interno del prossimo ciclo di CD
|
|
3845
4277
|
this.RowContexts = [];
|
|
3846
4278
|
this.OrderDirectives = [];
|
|
3847
4279
|
this.lastSelectedItemID = null;
|
|
3848
|
-
this.
|
|
4280
|
+
if (this.EsThsDirective && this.EsThsDirective.length > 0 && this.EsTdsDirective && this.EsTdsDirective.length > 0)
|
|
4281
|
+
this.internalPostBoundSource();
|
|
4282
|
+
else {
|
|
4283
|
+
this.cdr.detectChanges();
|
|
4284
|
+
setTimeout(function () { _this.internalPostBoundSource(); });
|
|
4285
|
+
}
|
|
3849
4286
|
};
|
|
3850
4287
|
/** Per poter distinguere le chiamate a questo metodo: Dopo il setTimeout se uso gli EsTd/EsTh vecchi, senza il setTimeout se uso le nuove direttive */
|
|
3851
4288
|
EsTableComponent.prototype.internalPostBoundSource = function () {
|
|
3852
4289
|
var View = this.View;
|
|
3853
|
-
var ths = this.EsThsDirective && this.EsThsDirective.length > 0 ? this.EsThsDirective.toArray() : [];
|
|
3854
|
-
var tds = this.EsTdsDirective && this.EsTdsDirective.length > 0 ? this.EsTdsDirective.toArray() : [];
|
|
4290
|
+
var ths = this.EsThs && this.EsThs.length > 0 ? this.EsThs.toArray() : this.EsThsDirective && this.EsThsDirective.length > 0 ? this.EsThsDirective.toArray() : [];
|
|
4291
|
+
var tds = this.EsTds && this.EsTds.length > 0 ? this.EsTds.toArray() : this.EsTdsDirective && this.EsTdsDirective.length > 0 ? this.EsTdsDirective.toArray() : [];
|
|
3855
4292
|
// Se non ho colonne dinamiche ma sono in modalità dinamica (lo capisco perché c'è una view piena di genericitem) metto il default delle colonne
|
|
3856
4293
|
this.dynamicMode_H.eventuallyReviewDynamicColumns();
|
|
3857
4294
|
this.bindDisplayToLoadedItemsOrGroups(View);
|
|
@@ -3908,20 +4345,20 @@
|
|
|
3908
4345
|
*/
|
|
3909
4346
|
EsTableComponent.prototype.bindDisplayToLoadedItemsOrGroups = function (view) {
|
|
3910
4347
|
var _a, _b;
|
|
3911
|
-
if (this.TMPBoundSource.length == 0) {
|
|
4348
|
+
if (!this.TMPBoundSource || this.TMPBoundSource.length == 0) {
|
|
3912
4349
|
this.BaseItemsCount = 0;
|
|
3913
|
-
this.boundSource =
|
|
4350
|
+
this.boundSource = [];
|
|
3914
4351
|
return;
|
|
3915
4352
|
}
|
|
3916
4353
|
if (this.arrayMode || !this.UseCustomCells) {
|
|
3917
4354
|
this.boundSource = this.TMPBoundSource;
|
|
3918
|
-
this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || view.length;
|
|
4355
|
+
this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || (view === null || view === void 0 ? void 0 : view.length) || 0;
|
|
3919
4356
|
return;
|
|
3920
4357
|
}
|
|
3921
|
-
var groupingKeys = ((_b = (_a = view.groupings) === null || _a === void 0 ? void 0 : _a.filter(function (t) { return !t.aggregation; })) === null || _b === void 0 ? void 0 : _b.length) || 0;
|
|
4358
|
+
var groupingKeys = ((_b = (_a = view === null || view === void 0 ? void 0 : view.groupings) === null || _a === void 0 ? void 0 : _a.filter(function (t) { return !t.aggregation; })) === null || _b === void 0 ? void 0 : _b.length) || 0;
|
|
3922
4359
|
if (groupingKeys == 0) {
|
|
3923
4360
|
this.boundSource = this.TMPBoundSource;
|
|
3924
|
-
this.BaseItemsCount = view.objectcount;
|
|
4361
|
+
this.BaseItemsCount = (view === null || view === void 0 ? void 0 : view.objectcount) || 0;
|
|
3925
4362
|
return;
|
|
3926
4363
|
}
|
|
3927
4364
|
this.rowGrouping_H.handleNewDataOnRowGrouping(view, groupingKeys);
|
|
@@ -3986,8 +4423,8 @@
|
|
|
3986
4423
|
*
|
|
3987
4424
|
* Costo: 2 scan EsThs, 1 scan EsTds
|
|
3988
4425
|
*
|
|
3989
|
-
* @param {EsThDirective[]} ths Colonne della tabella
|
|
3990
|
-
* @param {EsTdDirective[]} tds Celle della tabella
|
|
4426
|
+
* @param {EsTh[] | EsThDirective[]} ths Colonne della tabella
|
|
4427
|
+
* @param {EsTd[] | EsTdDirective[]} tds Celle della tabella
|
|
3991
4428
|
*/
|
|
3992
4429
|
EsTableComponent.prototype.evaluateRowTds = function (ths, tds) {
|
|
3993
4430
|
if (tds.length == 0)
|
|
@@ -4000,35 +4437,58 @@
|
|
|
4000
4437
|
}
|
|
4001
4438
|
for (var i = 0; i < ths.length; i++) {
|
|
4002
4439
|
var th = ths[i];
|
|
4003
|
-
thsCache[th.th] = th;
|
|
4440
|
+
thsCache[this.utilities_H.isEsTh(th) ? th.ID : th.th] = th;
|
|
4004
4441
|
}
|
|
4005
4442
|
this.TMPRowTDs = {};
|
|
4006
4443
|
// Variabile d'appoggio per permettermi di inserire tutte le colonne "Fixed" davanti
|
|
4007
4444
|
var contextFixeds = {};
|
|
4008
4445
|
for (var i = 0; i < tds.length; i++) {
|
|
4009
4446
|
var td = tds[i];
|
|
4010
|
-
|
|
4011
|
-
var
|
|
4012
|
-
var ctx = item._hash;
|
|
4013
|
-
var key = td.td;
|
|
4014
|
-
var th = thsCache[td.td];
|
|
4447
|
+
if (this.utilities_H.isEsTd(td)) {
|
|
4448
|
+
var th = thsCache[td.ID];
|
|
4015
4449
|
if (!!th)
|
|
4016
4450
|
th._referenced = true;
|
|
4017
4451
|
else
|
|
4018
|
-
throw "ID dell'oggeto EsTd non compatibile con gli ID dicharati negli EsTh: " + td.
|
|
4019
|
-
|
|
4020
|
-
|
|
4021
|
-
|
|
4022
|
-
|
|
4023
|
-
|
|
4024
|
-
|
|
4025
|
-
|
|
4452
|
+
throw "ID dell'oggeto EsTd non compatibile con gli ID dicharati negli EsTh: " + td.ID;
|
|
4453
|
+
var isFixed = (this.utilities_H.isEsTh(th) && th.Fixed) || (!this.utilities_H.isEsTh(th) && (th.thFixed || th.thGroup));
|
|
4454
|
+
var itemToAdd = { GroupAggregation: false, GroupHeader: false, Wraps: true, ID: td.ID, Visible: td.Visible, Class: td.Class, Content: td.Content, RouterLink: td.RouterLink, Template: td.Template };
|
|
4455
|
+
var ctx = td.Context;
|
|
4456
|
+
if (this.TMPRowTDs[ctx]) {
|
|
4457
|
+
if (isFixed)
|
|
4458
|
+
this.TMPRowTDs[ctx].splice(0 + (contextFixeds[ctx]++), 0, itemToAdd);
|
|
4459
|
+
else
|
|
4026
4460
|
this.TMPRowTDs[ctx].push(itemToAdd);
|
|
4027
|
-
|
|
4028
|
-
|
|
4029
|
-
|
|
4030
|
-
|
|
4031
|
-
|
|
4461
|
+
}
|
|
4462
|
+
else {
|
|
4463
|
+
this.RowContexts.push(ctx);
|
|
4464
|
+
this.TMPRowTDs[ctx] = [itemToAdd];
|
|
4465
|
+
contextFixeds[ctx] = isFixed ? 1 : 0;
|
|
4466
|
+
}
|
|
4467
|
+
}
|
|
4468
|
+
else {
|
|
4469
|
+
for (var i_1 = 0; i_1 < this.boundSource.length; i_1++) {
|
|
4470
|
+
var item = this.boundSource[i_1];
|
|
4471
|
+
var ctx = item._hash;
|
|
4472
|
+
var key = td.td;
|
|
4473
|
+
var th = thsCache[td.td];
|
|
4474
|
+
if (!!th)
|
|
4475
|
+
th._referenced = true;
|
|
4476
|
+
else
|
|
4477
|
+
throw "ID dell'oggeto EsTd non compatibile con gli ID dicharati negli EsTh: " + td.td;
|
|
4478
|
+
if (td.tdIf || (!this.utilities_H.isEsTh(th) && th.thGroup)) {
|
|
4479
|
+
var thCasted = th;
|
|
4480
|
+
var isFixed = (this.utilities_H.isEsTh(th) && th.Fixed) || (!this.utilities_H.isEsTh(th) && (th.thFixed || th.thGroup || th.thPinned));
|
|
4481
|
+
var itemToAdd = item._item ?
|
|
4482
|
+
{ LeftBorder: thCasted._lbord, RightBorder: thCasted._rbord, ID: key, Pinned: columnsCache[td.td].pinned, PinnedWidth: thCasted.thPinnedWidth, GroupHeader: false, GroupAggregation: false, Visible: columnsCache[td.td].visible, Wraps: false, Class: td.tdClass, Template: thCasted.thGroup && !this.ShowItemGroupsColumns ? null : td.Template } :
|
|
4483
|
+
{ LeftBorder: thCasted._lbord, RightBorder: thCasted._rbord, ID: key, Pinned: columnsCache[td.td].pinned, PinnedWidth: thCasted.thPinnedWidth, GroupHeader: thCasted.thGroup, GroupAggregation: !!thCasted.thAggregation, Visible: columnsCache[td.td].visible, Wraps: false, Class: thCasted.thGroupClass || '', Content: this.rowGrouping_H.getGroupCellDisplay(item, key, th) };
|
|
4484
|
+
if (this.TMPRowTDs[ctx]) {
|
|
4485
|
+
this.TMPRowTDs[ctx].push(itemToAdd);
|
|
4486
|
+
}
|
|
4487
|
+
else {
|
|
4488
|
+
this.RowContexts.push(ctx);
|
|
4489
|
+
this.TMPRowTDs[ctx] = [itemToAdd];
|
|
4490
|
+
contextFixeds[ctx] = isFixed ? 1 : 0;
|
|
4491
|
+
}
|
|
4032
4492
|
}
|
|
4033
4493
|
}
|
|
4034
4494
|
}
|
|
@@ -4040,7 +4500,7 @@
|
|
|
4040
4500
|
for (var i = 0; i < ths.length; i++) {
|
|
4041
4501
|
var th = ths[i];
|
|
4042
4502
|
if (!th._referenced)
|
|
4043
|
-
errs.push(th.th);
|
|
4503
|
+
errs.push(this.utilities_H.isEsTh(th) ? th.ID : th.th);
|
|
4044
4504
|
}
|
|
4045
4505
|
if (errs.length > 0) {
|
|
4046
4506
|
var errIds = errs.join(', ');
|
|
@@ -4054,7 +4514,7 @@
|
|
|
4054
4514
|
*
|
|
4055
4515
|
* Costo: 1 scan EsThs
|
|
4056
4516
|
*
|
|
4057
|
-
* @param {EsThDirective[]} ths Colonne della tabella
|
|
4517
|
+
* @param {EsTh[] | EsThDirective[]} ths Colonne della tabella
|
|
4058
4518
|
*/
|
|
4059
4519
|
EsTableComponent.prototype.evaluateRowThs = function (ths) {
|
|
4060
4520
|
var _s;
|
|
@@ -4068,10 +4528,18 @@
|
|
|
4068
4528
|
columnsListCache[itm.id] = itm;
|
|
4069
4529
|
}
|
|
4070
4530
|
this.TMPRowTHs = [];
|
|
4531
|
+
var fixed = 0;
|
|
4071
4532
|
for (var i = 0; i < ths.length; i++) {
|
|
4072
4533
|
var th = ths[i];
|
|
4073
4534
|
var toAdd = void 0;
|
|
4074
|
-
if (
|
|
4535
|
+
if (this.utilities_H.isEsTh(th)) {
|
|
4536
|
+
toAdd = { Pinned: false, ID: th.ID, Visible: th.Visible, Class: th.Class, Order: th.Order, Orderable: th.Orderable, Template: null, Content: th.Description, Wrap: th.Wrap };
|
|
4537
|
+
if (th.Fixed)
|
|
4538
|
+
this.TMPRowTHs.splice(0 + (fixed++), 0, toAdd);
|
|
4539
|
+
else
|
|
4540
|
+
this.TMPRowTHs.push(toAdd);
|
|
4541
|
+
}
|
|
4542
|
+
else if (th.thIf || th.thGroup) {
|
|
4075
4543
|
var thClass = (th.thClass || '') + (th.thGroup ? " est-col-min" : "");
|
|
4076
4544
|
toAdd = { Pinned: columnsListCache[th.th].pinned, Fixed: th.thFixed, PinnedWidth: th.thPinnedWidth, ID: th.th, Visible: th.thVisible, Class: thClass, Order: th.thOrder, Orderable: th.thOrderable, Template: th.Template, Content: null, Wrap: th.thWrap, LeftBorder: th._lbord, RightBorder: th._rbord };
|
|
4077
4545
|
this.TMPRowTHs.push(toAdd);
|
|
@@ -4325,6 +4793,21 @@
|
|
|
4325
4793
|
// Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca
|
|
4326
4794
|
this.internalWriteValue();
|
|
4327
4795
|
};
|
|
4796
|
+
/**
|
|
4797
|
+
* Gestore dei click sulle celle per le quali era impostata una azione custom da **CustomCellActionsOn**
|
|
4798
|
+
*
|
|
4799
|
+
* @param {string} name Nome della cella su cui si è fatto click
|
|
4800
|
+
* @param {any} model Modello relativo alla cella cliccata
|
|
4801
|
+
*
|
|
4802
|
+
* @returns {boolean} **true** se il click è stato fatto su una cella cliccabile, **false** altrimenti
|
|
4803
|
+
*/
|
|
4804
|
+
EsTableComponent.prototype.cellClicked = function (name, model) {
|
|
4805
|
+
if (this.UseCustomCellActions && this.CustomCellActionsOn.split('$').indexOf(name) != -1) {
|
|
4806
|
+
this.onCellClick.emit({ column: name, model: model });
|
|
4807
|
+
return true;
|
|
4808
|
+
}
|
|
4809
|
+
return false;
|
|
4810
|
+
};
|
|
4328
4811
|
/**
|
|
4329
4812
|
* Gestione dei click sulle opzioni del menù contestuale in alto a destra generato dall'Input **CornerMenuOptions**
|
|
4330
4813
|
*
|
|
@@ -4383,7 +4866,7 @@
|
|
|
4383
4866
|
viewProviders: [{ provide: localizations.LocalizationService, useClass: EsTableLoc }],
|
|
4384
4867
|
changeDetection: i0.ChangeDetectionStrategy.OnPush,
|
|
4385
4868
|
encapsulation: i0.ViewEncapsulation.None,
|
|
4386
|
-
template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" /> {{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (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\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span> {{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (!reportMode && (View?.selection || arraymodeSelection).all)\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span> \r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection).all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable {{ContainerClass}}\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10\" [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 || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && (reportMode || !(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\">\r\n <th *ngFor=\"let cell of level\" [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; Else: cell.Template\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\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 <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"(viewMode || arrayMode)\">\r\n\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && !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) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.visible\">\r\n <th *ngIf=\"OrderByColumn\" 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\" 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\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" 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\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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 <!--Casistica in cui ho il setup proveniente da un report. Gli header sono definiti da come \u00E8 fatto il report-->\r\n <ng-container *ngIf=\"reportMode\">\r\n <th [style.color]=\"clm.color\" *ngFor=\"let clm of ReportValues.columns\" class=\"est-no-selection est-pointer est-nowrap\" (click)=\"reportMode_H.setupNextOrderAndSearch(clm)\">\r\n {{clm.description}}<span class=\"fa\" [class.fa-chevron-down]=\"clm.order == 'DESC'\" [class.fa-chevron-up]=\"clm.order == 'ASC'\"></span>\r\n </th>\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 <!-- Link nascosto che serve a scaricare il file -->\r\n <a *ngIf=\"headers\" hidden #exportDownloader csvLink [data]=\"data\" [headers]=\"headers\" [delimiter]=\"';'\" [filename]=\"ExportFileName.endsWith('.xlsx') ? ExportFileName.replace('.xlsx', '.csv') : ExportFileName.endsWith('.csv') ? ExportFileName : ExportFileName + '.csv'\"></a>\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(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions\" (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 <!-- Valido per modalit\u00E0 View o Array. Se sono in report mode il body \u00E8 creato in altro modo -->\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" *ngIf=\"(arrayMode || viewMode)\">\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\r\n <!-- Per la modalit\u00E0 a report c'\u00E8 un body particolare semi-dinamico -->\r\n <tbody [hidden]=\"BodyHidden\" *ngIf=\"reportMode\">\r\n <tr *ngFor=\"let row of ReportValues.rows; let even = even;\">\r\n <td class=\"est-nowrap\" *ngFor=\"let val of row.values\">{{val}}</td>\r\n <td class=\"est-sticky-last-column{{even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n </tr>\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=\"(!reportMode || View?.pagingavailable) && (!arrayMode || SearchView)\">\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 <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-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);\"></app-paging>\r\n </div>\r\n <div *ngIf=\"reportMode && !PagerOptions.ShowPaging\"><em>{{'Paging options are not available for this report' | localize: lc}}</em></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\" 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)=\"(!item.locked && !item._sep && !item._group && handleClick($event, item)) || item._group && handleGroupClick(item)\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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 even = even;\">\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)=\"item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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\"><div class=\"est-pinned-border est-cell-group-padding\"></div></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\"><app-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);\"></app-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\"><app-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);\"></app-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>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowItem.routePath && rowItem.visible\">\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.routePath, rowItem.routeParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.propertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem.routePath && rowItem.visible\">\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.propertyName) || defaultEsTd; context: { $implicit: item.properties[rowItem.propertyName], rowItem : rowItem, item : item }\"> </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-value let-rowItem='rowItem' let-item='item'>\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n {{value}}\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && RowTDs\">\r\n\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-ltab-border]=\"rowItem.LeftBorder\" [class.est-rtab-border]=\"rowItem.RightBorder\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <a [routerLink]='rowItem.RouterLink' class=\"est-link\" [innerHTML]=\"rowItem.Content\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (NON RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"!rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\">\r\n <ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!rowItem.Template\" [innerHTML]=\"rowItem.Content\"></span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n \r\n</ng-template>\r\n\r\n<!-- Questo template contiene i 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>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </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\" 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)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <!-- <td class=\"est-nowrap\" *ngIf=\"ColumnsOrdering\">\r\n <span class=\"fa fa-arrow-up\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; i != 0 && !item.fixed && columnMetadata_H.sendUp(item); $event.stopPropagation();\"></span>\r\n <span class=\"fa fa-arrow-down\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; !last && !item.fixed && columnMetadata_H.sendDown(item); $event.stopPropagation();\"></span>\r\n </td> -->\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n ( \r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last\">\r\n <ng-container *ngTemplateOutlet=\"parent\"></ng-container>\r\n <span *ngIf=\"!last\"> - </span>\r\n </ng-container>\r\n )\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template\"></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\"><span *ngIf=\"!item.fixed\" 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; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
|
|
4869
|
+
template: "<!-- Patacchino di autoaggiornamento -->\r\n<div class=\"w-100\" *ngIf=\"AutoUpdate\">\r\n <div class=\"pull-right\">\r\n {{'Update every' | localize : lc}} <input [readonly]=\"autoUpdate\" maxlength=\"3\" class=\"form-control est-custom-input\" type=\"text\" [(ngModel)]=\"seconds\" /> {{'second/s' | localize : lc}}\r\n </div>\r\n <div class=\"pull-right m-t-2\">\r\n <label class=\"est-switch\">\r\n <input type=\"checkbox\" [(ngModel)]=\"autoUpdate\" (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<!--\r\nI TH sono contenuto statico, questo significa che senza condizione per RowTHs arriverebbero sia qui sia nell ng-container dell'header in fase non inizializzata, duplicando fisicamente le colonne.\r\nPer ovviare al problema, questo pezzo lo faccio apparire solo se ci sono gi\u00E0 dei RowTHs, quindi su valorizzazione della View succeder\u00E0:\r\n1) appaiono i th nell' ng-container dell'header, e NON qui\r\n2) i TH vengono presi, elaborati e trasformati in RowTHs\r\n3) l'ng-container dell'header sparisce (per la condizione !UseCustomCells || !RowTHs) e qui appaiono i nuovi TH (che poi sono gli stessi di prima che girano)\r\n4) Vengono presi i nuovi TH da qui e trasformati a loro volta in RowTHs\r\n-->\r\n<div hidden *ngIf=\"UseCustomCells && RowTHs\">\r\n <ng-container *ngIf=\"View\">\r\n <!--Qui invece ci sono tutti i TH-->\r\n <ng-container *ngTemplateOutlet=\"headerRef\"></ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<!--\r\nQuesta parte \u00E8 un po' pi\u00F9 semplice del sopra. Infatti i TD vengono s\u00EC bindati in entrambi i punti (qui e nell'ng-container del body), ma avr\u00F2 le TD statiche prima di generare la TMPBoundSource.\r\nQuesto significa che il workflow di binding sar\u00E0:\r\n1) Appaiono i TD statici nel body e NON qui, perch\u00E9 i TMPBoundSource non sono ancora stati emessi\r\n2) Contemporaneamente all'emissione dei TMPBoundSource vengono anche emessi i RowTds\r\n3) Considerando il punto 2, al giro dopo appariranno i TD qui, perch\u00E9 \u00E8 stata generata la TMPBoundSource, e spariranno contemporaneamente dall'ng-container del body (per la condizione !UseCustomCells || !RowTDs)\r\n-->\r\n<div hidden *ngIf=\"UseCustomCells && bodyRef\">\r\n <ng-container *ngIf=\"View\">\r\n <!--Tutti i TD che dopo verranno presi ed elaborati internamente-->\r\n <ng-container *ngFor=\"let item of TMPBoundSource\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</div>\r\n\r\n<div *ngIf=\"View\" class=\"est-relative\">\r\n <div *ngIf=\"FirstBind && ShowLoadingOnBootstrap\" class=\"est-loading-box\">\r\n <div class=\"est-loading-content\">\r\n <span class=\"fa fa-spinner fa-spin\"></span> {{'Performing Table bootstrap' | localize: lc}}...\r\n </div>\r\n </div>\r\n\r\n <div class=\"est-top-pager\" *ngIf=\"PagingStyle == 'both' || PagingStyle == 'top'\">\r\n <ng-container *ngTemplateOutlet=\"pagingElement\"></ng-container>\r\n </div>\r\n\r\n <div class=\"est-top-allselect\" *ngIf=\"canSelectAll || (!reportMode && (View?.selection || arraymodeSelection).all)\">\r\n <span>{{ (selectedObjects == -1 ? ('All the' | localize : lc) : ((selectedObjects || 0) | number : '0.0-0' : locale)) + ' ' + ((selectedObjects == 1 ? 'Object Selected' : 'Objects Selected') | localize : lc) }}</span> \r\n <span class=\"est-link est-inline\" (click)=\"selection_H.selectAllOrResetSelection()\">{{ (View?.selection || arraymodeSelection).all ? ('Reset Selection' | localize : lc) : ('Select Everything' | localize : lc)}}</span>\r\n </div>\r\n\r\n <div class=\"table-responsive datatable {{ContainerClass}}\" [class.est-scrollable]=\"UseEndlessscroll\" (scroll)=\"UseEndlessscroll && onScroll($event)\" [style.max-height.px]=\"MaxHeight\">\r\n <table class=\"{{ TableClass }} est-margin-bottom-10\" [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 || PagingStyle != 'bottom'\">\r\n <th class=\"est-no-selection\" [attr.colspan]=\"Columns.Global\" [class.est-hidden-view]=\"!canSelectAll && (reportMode || !(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\">\r\n <th *ngFor=\"let cell of level\" [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; Else: cell.Template\">\r\n <div class=\"est-pinned-border est-cell-group-padding\"></div>\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 <!-- Aggiungo una checkbox se la selezione \u00E8 attiva -->\r\n <th class=\"est-col-min\" *ngIf=\"Selection && !HasPinnedColumns\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n\r\n <!-- Header che valgono per view mode e array mode -->\r\n <ng-container *ngIf=\"(viewMode || arrayMode)\">\r\n\r\n <!-- In una tabella base prendo semplicemente i th scritti dall'utente nell'HTML -->\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTHs) && !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) && DynamicRowColumnsDefinition\">\r\n <th *ngFor=\"let operation of DynamicOperations\" class=\"est-col-min est-no-side-padding\"></th>\r\n \r\n <ng-container *ngFor=\"let rowHeader of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowHeader.visible\">\r\n <th *ngIf=\"OrderByColumn\" 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\" 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\">\r\n <th *ngIf=\"HasPinnedColumns\" class=\"est-pinned-header est-col-min\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border est-simple-border-bottom\">\r\n <th class=\"est-col-min est-no-border\" *ngIf=\"Selection\" [style.width.px]=\"20\">\r\n <input *ngIf=\"!SingleSelection\" class=\"est-pointer\" type=\"checkbox\" [disabled]=\"SelectionDisabled\" [(ngModel)]=\"globalCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"globalCheckChanged();\">\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && rowHeader.Pinned\" [style.width.px]=\"rowHeader.PinnedWidth\" 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\" [Fixed]=\"rowHeader.Fixed\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onUnpinning)=\"columnMetadata_H.unpinColumn($event)\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowHeader.Template\">{{rowHeader.Content}}</span>\r\n </th>\r\n </ng-container>\r\n </div>\r\n </th>\r\n <ng-container *ngFor=\"let rowHeader of RowTHs\">\r\n <th *ngIf=\"rowHeader && rowHeader.Visible && !rowHeader.Pinned\" es-th=\"{{rowHeader.ID}}\" class=\"{{rowHeader.Class || ''}}\" [class.est-ltab-border]=\"rowHeader.LeftBorder\" [class.est-rtab-border]=\"rowHeader.RightBorder\" [class.est-nowrap]=\"!rowHeader.Wrap\" [Order]=\"rowHeader.Order\" [Resizable]=\"ColumnsResizable\" [Orderable]=\"rowHeader.Orderable\" [OrderBy]=\"OrderByColumn\" [SearchInProgress]=\"!!researchInProgress\" (onOrderChange)=\"OrderByColumn && thOrderChanged(rowHeader.ID, $event)\">\r\n <ng-container *ngIf=\"rowHeader.Template\"><ng-container *ngTemplateOutlet=\"rowHeader.Template;\"></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 <!--Casistica in cui ho il setup proveniente da un report. Gli header sono definiti da come \u00E8 fatto il report-->\r\n <ng-container *ngIf=\"reportMode\">\r\n <th [style.color]=\"clm.color\" *ngFor=\"let clm of ReportValues.columns\" class=\"est-no-selection est-pointer est-nowrap\" (click)=\"reportMode_H.setupNextOrderAndSearch(clm)\">\r\n {{clm.description}}<span class=\"fa\" [class.fa-chevron-down]=\"clm.order == 'DESC'\" [class.fa-chevron-up]=\"clm.order == 'ASC'\"></span>\r\n </th>\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 <!-- Link nascosto che serve a scaricare il file -->\r\n <a *ngIf=\"headers\" hidden #exportDownloader csvLink [data]=\"data\" [headers]=\"headers\" [delimiter]=\"';'\" [filename]=\"ExportFileName.endsWith('.xlsx') ? ExportFileName.replace('.xlsx', '.csv') : ExportFileName.endsWith('.csv') ? ExportFileName : ExportFileName + '.csv'\"></a>\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(); changeColumnVisibilityModal.show();\">\r\n <ng-container *ngIf=\"!HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Order' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && !ColumnsOrdering\">\r\n {{'Columns Visibility' | localize : lc}}\r\n </ng-container>\r\n <ng-container *ngIf=\"HiddenColumns && ColumnsOrdering\">\r\n {{'Columns Visibility and Order' | localize : lc}}\r\n </ng-container>\r\n </a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && CSVExport\" (click)=\"export_H.tryExport('CSV')\">{{'Export View' | localize : lc}} (CSV)</a>\r\n <a class=\"dropdown-item\" *ngIf=\"Export && XLSXExport\" (click)=\"export_H.tryExport('XLSX')\">{{'Export View' | localize : lc}} (XLSX)</a>\r\n <a class=\"dropdown-item\" *ngFor=\"let option of CornerMenuOptions\" (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 <!-- Valido per modalit\u00E0 View o Array. Se sono in report mode il body \u00E8 creato in altro modo -->\r\n <tbody [hidden]=\"BodyHidden || FirstBind\" *ngIf=\"(arrayMode || viewMode)\">\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\r\n <!-- Per la modalit\u00E0 a report c'\u00E8 un body particolare semi-dinamico -->\r\n <tbody [hidden]=\"BodyHidden\" *ngIf=\"reportMode\">\r\n <tr *ngFor=\"let row of ReportValues.rows; let even = even;\">\r\n <td class=\"est-nowrap\" *ngFor=\"let val of row.values\">{{val}}</td>\r\n <td class=\"est-sticky-last-column{{even && !Hierarchy ? '-alt' : ''}}\"></td>\r\n </tr>\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=\"(!reportMode || View?.pagingavailable) && (!arrayMode || SearchView)\">\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 <app-paging *ngIf=\"!PagerOptions.UsesView\" [CountLabel]=\"CountLabel\" [ShowPaging]=\"PagerOptions.ShowPagingOptions\" [ShowCount]=\"PagerOptions.ShowCount\" [PagerCount]=\"PagerOptions.PagerCount\" [WarnOnAll]=\"false\" [CurrentPageSize]=\"ArraymodeItemsPerPage\" (pagingSelected)=\"items_H.refreshPaging($event)\"></app-paging>\r\n <app-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);\"></app-paging>\r\n </div>\r\n <div *ngIf=\"reportMode && !PagerOptions.ShowPaging\"><em>{{'Paging options are not available for this report' | localize: lc}}</em></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\" 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)=\"(!item.locked && !item._sep && !item._group && handleClick($event, item)) || item._group && handleGroupClick(item)\">\r\n\r\n <td *ngIf=\"!item.locked && !item._sep && !HasPinnedColumns\">\r\n <input type=\"checkbox\" \r\n [disabled]=\"templateOptions.selDisabled\" \r\n [class.est-pointer]=\"!item.locked\"\r\n [(ngModel)]=\"item._selected\" name=\"check{{i}}\" \r\n (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td *ngIf=\"(item.locked || item._sep) && !HasPinnedColumns\"></td>\r\n\r\n <ng-container *ngIf=\"item._sep\"><ng-container *ngTemplateOutlet=\"groupPager; context: { $implicit: item }\"></ng-container> </ng-container>\r\n\r\n <ng-container *ngIf=\"!item._sep\">\r\n <ng-container *ngTemplateOutlet=\"basicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item, templateOptions: templateOptions }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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 even = even;\">\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)=\"item._group && handleGroupClick(item)\">\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 }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"dynamicColumns; context: { $implicit: item }\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customCells; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngTemplateOutlet=\"bodyDeleteAndExport; context: { $implicit: { even: even, item: item }}\"></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\"><div class=\"est-pinned-border est-cell-group-padding\"></div></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\"><app-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);\"></app-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\"><app-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);\"></app-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>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && !DynamicRowColumnsDefinition\">\r\n <ng-container *ngTemplateOutlet=\"bodyRef; context : {$implicit: item}\"></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale su tabelle definite in maniera dinamica dal modello -->\r\n<ng-template #dynamicColumns let-item>\r\n <ng-container *ngIf=\"(!UseCustomCells || !RowTDs) && DynamicRowColumnsDefinition\">\r\n <ng-container *ngFor=\"let operation of DynamicOperations; let first = first; let last = last;\">\r\n <ng-container *ngIf=\"!operation.conditionField || (item.properties[operation.conditionField] == operation.conditionValue)\">\r\n <td [class.est-no-right-padding]=\"last\" [class.est-no-left-padding]=\"!first\" class=\"est-col-min\"><span title=\"{{operation.title}}\" class=\"{{operation.iconClass}} est-pointer\" (click)=\"dynamicOperation(item, operation.id)\">{{operation.text}}</span></td>\r\n </ng-container>\r\n <ng-container *ngIf=\"operation.conditionField && (item.properties[operation.conditionField] != operation.conditionValue)\">\r\n <td class=\"est-col-min est-no-side-padding\"></td>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngFor=\"let rowItem of DynamicRowColumnsDefinition\">\r\n <ng-container *ngIf=\"rowItem.routePath && rowItem.visible\">\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\" [Internal]=\"false\" [Context]=\"item._hash\">\r\n <a [routerLink]=\"dynamicMode_H.generateRouterLink(rowItem.routePath, rowItem.routeParameterProperties, item)\" class=\"est-link\" [innerHTML]=\"item.properties[rowItem.propertyName]\"></a>\r\n </td>\r\n </ng-container>\r\n <ng-container *ngIf=\"!rowItem.routePath && rowItem.visible\">\r\n <ng-container *ngTemplateOutlet=\"findEsTd(rowItem.propertyName) || defaultEsTd; context: { $implicit: item.properties[rowItem.propertyName], rowItem : rowItem, item : item }\"> </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #defaultEsTd let-value let-rowItem='rowItem' let-item='item'>\r\n <td es-td=\"{{rowItem.propertyName}}\" class=\"{{UserDefinedDynamicCols ? rowItem.clss : 'est-nowrap'}}\"\r\n [class.est-pointer]=\"UseCustomCellActions && CustomCellActionsOn.indexOf('$' + rowItem.propertyName + '$') != -1\"\r\n (click)=\"cellClicked(rowItem.propertyName, item) && !CellActionPropagates && $event.stopPropagation()\"\r\n [Internal]=\"false\" [Context]=\"item._hash\">\r\n {{value}}\r\n </td>\r\n</ng-template>\r\n\r\n<!-- Questo template contiene la print condizionale delle celle custom se configurate -->\r\n<ng-template #customCells let-item let-opt=\"templateOptions\">\r\n <ng-container *ngIf=\"UseCustomCells && RowTDs\">\r\n\r\n <td *ngIf=\"HasPinnedColumns\" class=\"est-pinned-body est-col-min\" [class.est-white-selected]=\"item._selected\">\r\n <div [style.width.px]=\"PinnedContainerWidth\" class=\"est-pinned-border\">\r\n <td *ngIf=\"!item.locked && !item._sep && Selection\" class=\"est-no-border est-col-min\" [style.width.px]=\"20\">\r\n <input type=\"checkbox\" [disabled]=\"opt.selDisabled\" [class.est-pointer]=\"!item.locked\" [(ngModel)]=\"item._selected\" name=\"check{{item._hash}}\" (click)=\"$event.stopPropagation(); handleClick($event, item);\">\r\n </td>\r\n <td class=\"est-no-border est-col-min\" *ngIf=\"(item.locked || item._sep) && Selection\" [style.width.px]=\"20\"></td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <td *ngIf=\"rowItem && rowItem.Pinned\" [style.width.px]=\"rowItem.PinnedWidth\" es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-no-border]=\"true\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n </div>\r\n </td>\r\n\r\n <ng-container *ngFor=\"let rowItem of RowTDs[item._hash]; let i = index\">\r\n <ng-container *ngIf=\"rowItem && !rowItem.Pinned\">\r\n\r\n <!-- Casistica senza bodyRef, quindi con direttive per i td -->\r\n <ng-container *ngIf=\"!bodyRef && rowItem.Visible\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-ltab-border]=\"rowItem.LeftBorder\" [class.est-rtab-border]=\"rowItem.RightBorder\" [class.est-rg-hdr]=\"rowItem.GroupHeader\" [class.est-rg-agg]=\"rowItem.GroupAggregation\" \r\n [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\"><ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container></ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\"><ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container></ng-container>\r\n <span *ngIf=\"!rowItem.Template\">{{rowItem.Content}}</span>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <a [routerLink]='rowItem.RouterLink' class=\"est-link\" [innerHTML]=\"rowItem.Content\"></a>\r\n </td>\r\n </ng-container>\r\n\r\n <!-- Casistica bodyRef, quindi con componenti per i td (NON RouterLink) DEPRECATO -->\r\n <ng-container *ngIf=\"!rowItem.RouterLink && rowItem.Visible && bodyRef\">\r\n <td es-td=\"{{rowItem.ID}}\" class=\"{{rowItem.Class}}\" [class.est-nowrap]=\"Hierarchy || !rowItem.Wraps\" [class.est-pointer]=\"UseCustomCellActions && CustomCellActionsOn.indexOf('$' + $any(rowItem).ID + '$') != -1\" (click)=\"cellClicked(rowItem.ID, item) && !CellActionPropagates && $event.stopPropagation()\" [Internal]=\"true\">\r\n <ng-container *ngIf=\"Hierarchy && i == 0\">\r\n <ng-container *ngTemplateOutlet=\"HierarchyNavigator; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"rowItem.Template\">\r\n <ng-container *ngTemplateOutlet=\"rowItem.Template; context: { $implicit: item }\"></ng-container>\r\n </ng-container>\r\n <span *ngIf=\"!rowItem.Template\" [innerHTML]=\"rowItem.Content\"></span>\r\n </td>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n </ng-container>\r\n</ng-template>\r\n\r\n<ng-template #HierarchyNavigator let-item>\r\n <span *ngIf=\"!item.parent\" class=\"fa fa-chevron-down\" style=\"visibility:hidden\"></span>\r\n <span *ngIf=\"item.parent && item._expanded\" class=\"fa fa-chevron-down est-pointer est-no-selection\" (click)=\"hierarchyMode_H.collapseParent(item[this.OwnKey])\"></span>\r\n <span *ngIf=\"item.parent && !item._expanded\" class=\"fa fa-chevron-up est-pointer est-no-selection\" (click)=\"hierarchyMode_H.expandParent(item[this.OwnKey])\"></span>\r\n \r\n</ng-template>\r\n\r\n<!-- Questo template contiene i 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>\r\n <span>\r\n <em>{{'No operations available' | localize : lc}}...</em>\r\n </span>\r\n </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\" 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)=\"changeColumnVisibilityModal.hide();\" aria-label=\"Close\">\r\n <span aria-hidden=\"true\">×</span>\r\n </button>\r\n </div>\r\n <div class=\"modal-body\">\r\n <div *ngIf=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"card card-info est-padding-10 est-margin-bottom-0\">\r\n {{'There are no columns configured to be hidden/shown in this view' | localize : lc}}\r\n </div>\r\n <div *ngIf=\"TMPColumnsList && TMPColumnsList.length > 0\" style=\"max-height:500px; overflow-y:auto\">\r\n <!--Aaaaaaah la tristezza... qui mi servirebbe l'es-table per facilitare la selezione multipla ecc... peccato che se la linko qui entro in un loop impressionante-->\r\n <table class=\"table table-striped table-sm est-margin-bottom-0\">\r\n <thead>\r\n <tr>\r\n <th class=\"est-col-min\" *ngIf=\"HiddenColumns\">\r\n <input class=\"est-pointer\" type=\"checkbox\" [(ngModel)]=\"globalColVisCheck\" [ngModelOptions]=\"{'standalone': true}\" (ngModelChange)=\"columnMetadata_H.globalColVisCheckChanged();\">\r\n </th>\r\n <!-- <th class=\"est-col-min\" *ngIf=\"ColumnsOrdering\"></th> -->\r\n <th class=\"est-col-min est-nowrap\">{{'Column Name' | localize : lc}}</th>\r\n <!--Filler-->\r\n <th></th>\r\n <!-- Pinner -->\r\n <th *ngIf=\"DirectivesBased\" class=\"est-col-min\"></th>\r\n </tr>\r\n </thead>\r\n <tbody \r\n cdkDropList \r\n [cdkDropListData]=\"TMPColumnsList\" \r\n (cdkDropListDropped)=\"columnMetadata_H.columnReordered($event)\" \r\n [cdkDropListSortPredicate]=\"columnMetadata_H.sortPredicate.bind(this.columnMetadata_H)\"\r\n class=\"est-dropbox\">\r\n\r\n <tr *ngFor=\"let item of TMPColumnsList; let i = index; let last = last\" \r\n class=\"est-pointer est-droplist\" \r\n [class.est-white-selected]=\"lastSelectedItemID == item.id\" \r\n [class.est-no-selection]=\"!item.visible\"\r\n cdkDrag\r\n [cdkDragData]=\"item\"\r\n [cdkDragDisabled]=\"!ColumnsOrdering || item.fixed || item.pinned\">\r\n\r\n <td *ngIf=\"HiddenColumns\">\r\n <input type=\"checkbox\" [class.est-hidden-view]=\"item.fixed\" class=\"est-pointer\" [(ngModel)]=\"item.visible\" name=\"visible{{i}}\" (ngModelChange)=\"columnMetadata_H.updateGlobalColVisCheck();\" />\r\n </td>\r\n <!-- <td class=\"est-nowrap\" *ngIf=\"ColumnsOrdering\">\r\n <span class=\"fa fa-arrow-up\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; i != 0 && !item.fixed && columnMetadata_H.sendUp(item); $event.stopPropagation();\"></span>\r\n <span class=\"fa fa-arrow-down\" [class.est-hidden-view]=\"item.fixed || item.pinned\" (click)=\"lastSelectedItemID = item.id; !last && !item.fixed && columnMetadata_H.sendDown(item); $event.stopPropagation();\"></span>\r\n </td> -->\r\n <td class=\"est-nowrap drag-visible\" (click)=\"columnMetadata_H.columnClicked(item);\">\r\n <ng-container *ngIf=\"item.template\">\r\n <!-- Padri -->\r\n <span *ngIf=\"item.parentTemplates && item.parentTemplates.length > 0\" class=\"est-fw-bold est-fs-13\">\r\n ( \r\n <ng-container *ngFor=\"let parent of item.parentTemplates; let last=last\">\r\n <ng-container *ngTemplateOutlet=\"parent\"></ng-container>\r\n <span *ngIf=\"!last\"> - </span>\r\n </ng-container>\r\n )\r\n </span>\r\n <!-- Template header originale -->\r\n <ng-container *ngTemplateOutlet=\"item.template\"></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\"><span *ngIf=\"!item.fixed\" 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; changeColumnVisibilityModal.hide();\">{{'Close' | localize : lc}}</button>\r\n <button type=\"button\" [disabled]=\"!TMPColumnsList || TMPColumnsList.length == 0\" class=\"btn btn-primary\" (click)=\"columnMetadata_H.confirmColumnVisibilitySelection() && changeColumnVisibilityModal.hide()\">{{'Confirm' | localize : lc}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>",
|
|
4387
4870
|
styles: [".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{top:0;right:0;left:6px;bottom:0;width:1px;position:absolute;background-color:#ccc;height:100%}.est-pointer{cursor:pointer}.est-high-density td,.est-high-density th{padding:0 .2rem}.est-no-selection{-webkit-user-select:none;-moz-user-select:none;-khtml-user-select:none;-ms-user-select:none}.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-13,.est-fs-14{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{cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc}.est-slider,.est-slider:before{position:absolute;transition:.4s}.est-slider:before{content:\"\";height:13px;width:13px;left:3px;bottom:2px;background-color:#fff}input:checked+.est-slider{background-color:#2196f3}input:focus+.est-slider{box-shadow:0 0 1px #2196f3}input:checked+.est-slider:before{transform:translateX(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-page-sel{color:#000;margin-left:3px;margin-right:3px;padding:0 5px;font-size:inherit;border:none;border-radius:15px}.est-page-next,.est-page-prev{color:#000;font-size:inherit;padding:2px 0 0}.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:0 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:2px solid #bbb}.est-rtab-border{border-right:2px solid #bbb}.est-cell-group-padding{padding:calc(.3rem + 1px);position:absolute;top:0;left:0;height:100%;width:100%}.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:hsla(0,0%,46.7%,.4666666666666667)!important}.est-rg-sep{font-size:12px;padding-right:20px!important;background-color:hsla(0,0%,73.3%,.7333333333333333)!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 rgba(0,0,0,.2),0 8px 10px 1px rgba(0,0,0,.14),0 3px 14px 2px rgba(0,0,0,.12)}.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,.est-droplist.cdk-drop-list-dragging .est-dropbox:not(.cdk-drag-placeholder){transition:transform .25s cubic-bezier(0,0,.2,1)}"]
|
|
4388
4871
|
},] }
|
|
4389
4872
|
];
|
|
@@ -4403,6 +4886,8 @@
|
|
|
4403
4886
|
EsTableComponent.propDecorators = {
|
|
4404
4887
|
EsTdsDirective: [{ type: i0.ContentChildren, args: [EsTdDirective,] }],
|
|
4405
4888
|
EsThsDirective: [{ type: i0.ContentChildren, args: [EsThDirective,] }],
|
|
4889
|
+
EsThs: [{ type: i0.ContentChildren, args: [i0.forwardRef(function () { return EsTh; }),] }],
|
|
4890
|
+
EsTds: [{ type: i0.ContentChildren, args: [i0.forwardRef(function () { return EsTd; }),] }],
|
|
4406
4891
|
bodyRef: [{ type: i0.ContentChild, args: ['body', { static: false },] }],
|
|
4407
4892
|
headerRef: [{ type: i0.ContentChild, args: ['header', { static: false },] }],
|
|
4408
4893
|
headerGroupRef: [{ type: i0.ContentChild, args: ['headerGroup', { static: false },] }],
|
|
@@ -4410,6 +4895,9 @@
|
|
|
4410
4895
|
CornerMenuOptions: [{ type: i0.Input }],
|
|
4411
4896
|
ColumnsResizable: [{ type: i0.Input }],
|
|
4412
4897
|
AutoUpdate: [{ type: i0.Input }],
|
|
4898
|
+
UseCustomCellActions: [{ type: i0.Input }],
|
|
4899
|
+
CustomCellActionsOn: [{ type: i0.Input }],
|
|
4900
|
+
CellActionPropagates: [{ type: i0.Input }],
|
|
4413
4901
|
UseCustomCells: [{ type: i0.Input }],
|
|
4414
4902
|
MaxHeight: [{ type: i0.Input }],
|
|
4415
4903
|
ContainerClass: [{ type: i0.Input }],
|
|
@@ -4433,6 +4921,9 @@
|
|
|
4433
4921
|
ExportFunction: [{ type: i0.Input }],
|
|
4434
4922
|
HasHeaderGroup: [{ type: i0.Input }],
|
|
4435
4923
|
HasSecondaryHeaderGroup: [{ type: i0.Input }],
|
|
4924
|
+
SliceSize: [{ type: i0.Input }],
|
|
4925
|
+
EndlessScroll: [{ type: i0.Input }],
|
|
4926
|
+
EndlessScrollOnlyForAll: [{ type: i0.Input }],
|
|
4436
4927
|
HeaderHidden: [{ type: i0.Input }],
|
|
4437
4928
|
BodyHidden: [{ type: i0.Input }],
|
|
4438
4929
|
SelectionDisabled: [{ type: i0.Input }],
|
|
@@ -4463,6 +4954,7 @@
|
|
|
4463
4954
|
onSelectionChanged: [{ type: i0.Output }],
|
|
4464
4955
|
onRemoval: [{ type: i0.Output }],
|
|
4465
4956
|
onAbortRemoval: [{ type: i0.Output }],
|
|
4957
|
+
onCellClick: [{ type: i0.Output }],
|
|
4466
4958
|
onCornerAction: [{ type: i0.Output }],
|
|
4467
4959
|
onDynamicOperation: [{ type: i0.Output }],
|
|
4468
4960
|
exportDownloader: [{ type: i0.ViewChild, args: ['exportDownloader', { static: false },] }],
|
|
@@ -4600,245 +5092,6 @@
|
|
|
4600
5092
|
pagingSelected: [{ type: i0.Output }]
|
|
4601
5093
|
};
|
|
4602
5094
|
|
|
4603
|
-
//Angular
|
|
4604
|
-
/** Componente rappresentante una Colonna della tabella */
|
|
4605
|
-
var EsTh = /** @class */ (function () {
|
|
4606
|
-
/** @ignore */
|
|
4607
|
-
function EsTh(myself, renderer) {
|
|
4608
|
-
this.myself = myself;
|
|
4609
|
-
this.renderer = renderer;
|
|
4610
|
-
/** Dizionario di mappatura con ordinamento attuale e ordinamento successivo per gestire i passaggi di stato */
|
|
4611
|
-
this.orderNext = { "NONE": "DESC", "DESC": "ASC", "ASC": null };
|
|
4612
|
-
/** Indica se si sta effettuando un'operazione di resize su questa colonna */
|
|
4613
|
-
this.resizingThis = false;
|
|
4614
|
-
/**
|
|
4615
|
-
* Storicizza l'offset di partenza del resize dell'elemento HTML per poter calcolare la nuova dimensione richiesta durente il resize
|
|
4616
|
-
*
|
|
4617
|
-
* nuova width = startOffset + posizione X del mouse
|
|
4618
|
-
*/
|
|
4619
|
-
this.startOffset = null;
|
|
4620
|
-
/** Id della colonna, dev'essere lo stesso per tutti gli **EsTd** relativi */
|
|
4621
|
-
this.ID = "";
|
|
4622
|
-
/** Indica se questa colonna è ordinabile o meno */
|
|
4623
|
-
this.Orderable = true;
|
|
4624
|
-
/** Valore da mostrare all'interno della colonna. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
4625
|
-
this.Display = "";
|
|
4626
|
-
/** Indica se le dimnsioni di questa colonna sono modificabili o meno */
|
|
4627
|
-
this.Resizable = false;
|
|
4628
|
-
/** Indica se questo header è pinnato. In caso lo fosse presenta il tastino per effettuare lo spinning */
|
|
4629
|
-
this.Pinned = false;
|
|
4630
|
-
/**
|
|
4631
|
-
* Indica se sta venendo eseguita una operazione di ricerca o meno, serve per evitare l'esecuzione di eventuale codice che potrebbe dare fastidio
|
|
4632
|
-
* come ad esempio l'escuzione di un ordinamento durante il caricamento di dati nuovi
|
|
4633
|
-
*/
|
|
4634
|
-
this.SearchInProgress = false;
|
|
4635
|
-
/** Indica se il testo presente in questo Header può andare a capo o meno, di default non può */
|
|
4636
|
-
this.Wrap = false;
|
|
4637
|
-
/** Indica se la colonna è fixed, cioè se non può né essere nascosta, né riposizionata. Solo le prime colonne possono essere Fixed */
|
|
4638
|
-
this.Fixed = false;
|
|
4639
|
-
/** Template Angular da istanziare per questo TH */
|
|
4640
|
-
this.Template = null;
|
|
4641
|
-
/** Evento emesso al cambio di ordinamento effettuato su questa colonna */
|
|
4642
|
-
this.onOrderChange = new i0.EventEmitter();
|
|
4643
|
-
/** Evento emesso all'unpinning della colonna */
|
|
4644
|
-
this.onUnpinning = new i0.EventEmitter();
|
|
4645
|
-
/** Impostato dall'**EsTable**, per controllare che ci sia almeno un TD che utilizzi quest'header */
|
|
4646
|
-
this._referenced = false;
|
|
4647
|
-
}
|
|
4648
|
-
Object.defineProperty(EsTh.prototype, "Visible", {
|
|
4649
|
-
/**
|
|
4650
|
-
* Restituisce lo stato di Visibilità della colonna in oggetto
|
|
4651
|
-
*
|
|
4652
|
-
* @returns {boolean} **true** se visibile, **false** altrimenti
|
|
4653
|
-
*/
|
|
4654
|
-
get: function () {
|
|
4655
|
-
if (this._Visible == undefined)
|
|
4656
|
-
this._Visible = true;
|
|
4657
|
-
return this._Visible;
|
|
4658
|
-
},
|
|
4659
|
-
/**
|
|
4660
|
-
* Imposta la visibilità o meno della colonna, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
4661
|
-
*
|
|
4662
|
-
* @param {boolean} expression Indicazione della visibilità
|
|
4663
|
-
*/
|
|
4664
|
-
set: function (expression) {
|
|
4665
|
-
this._Visible = expression;
|
|
4666
|
-
if (expression)
|
|
4667
|
-
this.renderer.removeClass(this.myself.nativeElement, "app-display-none");
|
|
4668
|
-
else
|
|
4669
|
-
this.renderer.addClass(this.myself.nativeElement, "app-display-none");
|
|
4670
|
-
},
|
|
4671
|
-
enumerable: false,
|
|
4672
|
-
configurable: true
|
|
4673
|
-
});
|
|
4674
|
-
/** @ignore */
|
|
4675
|
-
EsTh.prototype.ngAfterViewInit = function () {
|
|
4676
|
-
//Assegnare direttamente il content è più veloce che passare dal native element per qualche motivo
|
|
4677
|
-
this.Description = this.Display === null || this.Display === "" ? this.content.nativeElement.innerText : this.Display;
|
|
4678
|
-
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
4679
|
-
//Resize
|
|
4680
|
-
if (this.Resizable)
|
|
4681
|
-
this.renderer.addClass(this.myself.nativeElement, "app-relative");
|
|
4682
|
-
};
|
|
4683
|
-
/** Emette l'evento di unpinning */
|
|
4684
|
-
EsTh.prototype.unpin = function () {
|
|
4685
|
-
this.onUnpinning.emit(this.ID);
|
|
4686
|
-
};
|
|
4687
|
-
/** Gestisce la modifica dell'ordinamento qualora venisse cliccato su questa colonna */
|
|
4688
|
-
EsTh.prototype.setupNextOrderAndNotify = function () {
|
|
4689
|
-
if (!this.ID) {
|
|
4690
|
-
console.log("Attempt to order a column without ID. Operation ignored");
|
|
4691
|
-
return;
|
|
4692
|
-
}
|
|
4693
|
-
if (this.SearchInProgress) {
|
|
4694
|
-
console.log("Attempt to order a column during a search. Operation ignored");
|
|
4695
|
-
return;
|
|
4696
|
-
}
|
|
4697
|
-
if (!this.OrderBy || !this.Orderable)
|
|
4698
|
-
return;
|
|
4699
|
-
var nextOrder = this.orderNext[this.Order || "NONE"];
|
|
4700
|
-
this.Order = nextOrder;
|
|
4701
|
-
this.onOrderChange.emit(this.Order);
|
|
4702
|
-
};
|
|
4703
|
-
/**
|
|
4704
|
-
* Evento di inizio resize della colonna
|
|
4705
|
-
*
|
|
4706
|
-
* @param {any} ev Evento MouseDown
|
|
4707
|
-
*/
|
|
4708
|
-
EsTh.prototype.onResizeStart = function (ev) {
|
|
4709
|
-
if (!this.Resizable)
|
|
4710
|
-
return;
|
|
4711
|
-
this.resizingThis = true;
|
|
4712
|
-
this.startOffset = this.myself.nativeElement.offsetWidth - ev.pageX;
|
|
4713
|
-
};
|
|
4714
|
-
/** Listener per la fine dell'operazione di resize */
|
|
4715
|
-
EsTh.prototype.onMouseUp = function () {
|
|
4716
|
-
if (!this.Resizable)
|
|
4717
|
-
return;
|
|
4718
|
-
this.resizingThis = false;
|
|
4719
|
-
};
|
|
4720
|
-
/**
|
|
4721
|
-
* Listener per gestire il movimento del mouse qualora un'operazione di resize fosse in esecuzione
|
|
4722
|
-
*
|
|
4723
|
-
* @param {$event} ev Evento MouseMove
|
|
4724
|
-
*/
|
|
4725
|
-
EsTh.prototype.onMouseMove = function ($event) {
|
|
4726
|
-
if (!this.Resizable || !this.resizingThis)
|
|
4727
|
-
return;
|
|
4728
|
-
//Uso jquery per non dover far partire un intero ciclo di change detection solo per fare un resize del cazzo
|
|
4729
|
-
//(anche perché viene lanciato ogni 0.1 secondo quindi not a good idea)
|
|
4730
|
-
this.myself.nativeElement.style.width = (this.startOffset + $event.pageX) + "px";
|
|
4731
|
-
//Fermo il bubbling per non fare cose strane
|
|
4732
|
-
$event.preventDefault();
|
|
4733
|
-
};
|
|
4734
|
-
return EsTh;
|
|
4735
|
-
}());
|
|
4736
|
-
EsTh.decorators = [
|
|
4737
|
-
{ type: i0.Component, args: [{
|
|
4738
|
-
selector: "[es-th]",
|
|
4739
|
-
template: "<span (click)=\"setupNextOrderAndNotify()\" [class.app-no-selection]=\"!!ID && Orderable\" [class.app-pointer]=\"!!ID && Orderable\">\r\n <span #content>\r\n <ng-container *ngIf=\"Template\">\r\n <ng-container *ngTemplateOutlet=\"Template\"></ng-container>\r\n </ng-container>\r\n <ng-content *ngIf=\"!Template\"></ng-content>\r\n </span> \r\n <span class=\"fa\" [class.fa-chevron-down]=\"Order == 'DESC'\" [class.fa-chevron-up]=\"Order == 'ASC'\"></span>\r\n</span>\r\n<span *ngIf=\"Pinned && !Fixed\" class=\"app-pointer fa fa-thumb-tack est-quick-unpin\" (click)=\"unpin()\"></span>\r\n<div [hidden]=\"!Resizable || Fixed || Pinned\" class=\"est-head-resizer\" (mousedown)=\"onResizeStart($event)\">\r\n <div class=\"est-head-resizer-internal\"></div>\r\n</div>",
|
|
4740
|
-
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
4741
|
-
},] }
|
|
4742
|
-
];
|
|
4743
|
-
EsTh.ctorParameters = function () { return [
|
|
4744
|
-
{ type: i0.ElementRef },
|
|
4745
|
-
{ type: i0.Renderer2 }
|
|
4746
|
-
]; };
|
|
4747
|
-
EsTh.propDecorators = {
|
|
4748
|
-
ID: [{ type: i0.Input, args: ['es-th',] }],
|
|
4749
|
-
Order: [{ type: i0.Input }],
|
|
4750
|
-
Orderable: [{ type: i0.Input }],
|
|
4751
|
-
Display: [{ type: i0.Input }],
|
|
4752
|
-
Resizable: [{ type: i0.Input }],
|
|
4753
|
-
Pinned: [{ type: i0.Input }],
|
|
4754
|
-
SearchInProgress: [{ type: i0.Input }],
|
|
4755
|
-
OrderBy: [{ type: i0.Input }],
|
|
4756
|
-
Wrap: [{ type: i0.Input }],
|
|
4757
|
-
Fixed: [{ type: i0.Input }],
|
|
4758
|
-
Template: [{ type: i0.Input }],
|
|
4759
|
-
onOrderChange: [{ type: i0.Output }],
|
|
4760
|
-
onUnpinning: [{ type: i0.Output }],
|
|
4761
|
-
content: [{ type: i0.ViewChild, args: ["content", { static: false },] }],
|
|
4762
|
-
Visible: [{ type: i0.Input }],
|
|
4763
|
-
onMouseUp: [{ type: i0.HostListener, args: ['window:mouseup.out-zone',] }],
|
|
4764
|
-
onMouseMove: [{ type: i0.HostListener, args: ['window:mousemove.out-zone', ['$event'],] }]
|
|
4765
|
-
};
|
|
4766
|
-
|
|
4767
|
-
//Angular
|
|
4768
|
-
/** Componente rappresentante una singola cella del body della tabella */
|
|
4769
|
-
var EsTd = /** @class */ (function () {
|
|
4770
|
-
/** @ignore */
|
|
4771
|
-
function EsTd(myself, renderer, _viewContainer, sanitizer) {
|
|
4772
|
-
this.myself = myself;
|
|
4773
|
-
this.renderer = renderer;
|
|
4774
|
-
this._viewContainer = _viewContainer;
|
|
4775
|
-
this.sanitizer = sanitizer;
|
|
4776
|
-
/** Id della cella, dev'essere lo stesso della colonna **EsTh** relativa */
|
|
4777
|
-
this.ID = "";
|
|
4778
|
-
/** Valore da mostrare all'interno della cella. Se omesso verrà proiettato il contenuto dal template in cui è stata usata */
|
|
4779
|
-
this.Display = null;
|
|
4780
|
-
/** Template Angular da istanziare per questo TD */
|
|
4781
|
-
this.Template = null;
|
|
4782
|
-
}
|
|
4783
|
-
Object.defineProperty(EsTd.prototype, "Visible", {
|
|
4784
|
-
/**
|
|
4785
|
-
* Restituisce lo stato di Visibilità della cella in oggetto
|
|
4786
|
-
*
|
|
4787
|
-
* @returns {boolean} **true** se visibile, **false** altrimenti
|
|
4788
|
-
*/
|
|
4789
|
-
get: function () {
|
|
4790
|
-
if (this._Visible == undefined)
|
|
4791
|
-
this._Visible = true;
|
|
4792
|
-
return this._Visible;
|
|
4793
|
-
},
|
|
4794
|
-
/**
|
|
4795
|
-
* Imposta la visibilità o meno della cella, si traduce nell'applicazione o rimozione della classe **app-display-none**
|
|
4796
|
-
*
|
|
4797
|
-
* @param {boolean} expression Indicazione della visibilità
|
|
4798
|
-
*/
|
|
4799
|
-
set: function (expression) {
|
|
4800
|
-
this._Visible = expression;
|
|
4801
|
-
if (expression)
|
|
4802
|
-
this.renderer.removeClass(this.myself.nativeElement, "app-display-none");
|
|
4803
|
-
else
|
|
4804
|
-
this.renderer.addClass(this.myself.nativeElement, "app-display-none");
|
|
4805
|
-
},
|
|
4806
|
-
enumerable: false,
|
|
4807
|
-
configurable: true
|
|
4808
|
-
});
|
|
4809
|
-
/** @ignore */
|
|
4810
|
-
EsTd.prototype.ngAfterViewInit = function () {
|
|
4811
|
-
// Se è Internal significa che è gestita internamente da ES-TABLE quindi evito di fare sti due passaggi di lettura del DOM
|
|
4812
|
-
if (this.Internal)
|
|
4813
|
-
return;
|
|
4814
|
-
this.Content = this.Display === null || this.Display === "" ? this.sanitizer.bypassSecurityTrustHtml(this.myself.nativeElement.innerHTML) : this.sanitizer.bypassSecurityTrustHtml(this.Display);
|
|
4815
|
-
this.Class = this.myself.nativeElement.className.replace("app-display-none", "");
|
|
4816
|
-
};
|
|
4817
|
-
return EsTd;
|
|
4818
|
-
}());
|
|
4819
|
-
EsTd.decorators = [
|
|
4820
|
-
{ type: i0.Component, args: [{
|
|
4821
|
-
selector: "[es-td]",
|
|
4822
|
-
template: "<span>\r\n <ng-content></ng-content>\r\n</span>",
|
|
4823
|
-
changeDetection: i0.ChangeDetectionStrategy.OnPush
|
|
4824
|
-
},] }
|
|
4825
|
-
];
|
|
4826
|
-
EsTd.ctorParameters = function () { return [
|
|
4827
|
-
{ type: i0.ElementRef },
|
|
4828
|
-
{ type: i0.Renderer2 },
|
|
4829
|
-
{ type: i0.ViewContainerRef },
|
|
4830
|
-
{ type: platformBrowser.DomSanitizer }
|
|
4831
|
-
]; };
|
|
4832
|
-
EsTd.propDecorators = {
|
|
4833
|
-
ID: [{ type: i0.Input, args: ['es-td',] }],
|
|
4834
|
-
Internal: [{ type: i0.Input }],
|
|
4835
|
-
RouterLink: [{ type: i0.Input }],
|
|
4836
|
-
Display: [{ type: i0.Input }],
|
|
4837
|
-
Template: [{ type: i0.Input }],
|
|
4838
|
-
Context: [{ type: i0.Input }],
|
|
4839
|
-
Visible: [{ type: i0.Input }]
|
|
4840
|
-
};
|
|
4841
|
-
|
|
4842
5095
|
var EsTableModule = /** @class */ (function () {
|
|
4843
5096
|
function EsTableModule() {
|
|
4844
5097
|
}
|
|
@@ -4870,7 +5123,7 @@
|
|
|
4870
5123
|
],
|
|
4871
5124
|
declarations: [EsTh, EsTd, EsTableComponent, EsTdDirective, EsThDirective, TablePagerComponent],
|
|
4872
5125
|
providers: [i1.UtilityService, i1.ExportService, i1.HashingService, i1.MessageService],
|
|
4873
|
-
exports: [EsTableComponent, EsTdDirective, EsThDirective, TablePagerComponent]
|
|
5126
|
+
exports: [EsTh, EsTd, EsTableComponent, EsTdDirective, EsThDirective, TablePagerComponent]
|
|
4874
5127
|
},] }
|
|
4875
5128
|
];
|
|
4876
5129
|
|
|
@@ -4891,8 +5144,8 @@
|
|
|
4891
5144
|
exports.EsTableModule = EsTableModule;
|
|
4892
5145
|
exports.EsTableModuleConfig = EsTableModuleConfig;
|
|
4893
5146
|
exports.EsTableOperationDefinition = EsTableOperationDefinition;
|
|
4894
|
-
exports.
|
|
4895
|
-
exports.
|
|
5147
|
+
exports.EsTd = EsTd;
|
|
5148
|
+
exports.EsTh = EsTh;
|
|
4896
5149
|
exports.GenericItem = GenericItem;
|
|
4897
5150
|
exports.Group = Group;
|
|
4898
5151
|
exports.GroupAggregation = GroupAggregation;
|
|
@@ -4910,8 +5163,8 @@
|
|
|
4910
5163
|
exports.ɵc = EST_DEBUG;
|
|
4911
5164
|
exports.ɵd = EST_DEFAULTS;
|
|
4912
5165
|
exports.ɵe = UtilitiesHandler;
|
|
4913
|
-
exports.ɵf =
|
|
4914
|
-
exports.ɵg =
|
|
5166
|
+
exports.ɵf = EsTdDirective;
|
|
5167
|
+
exports.ɵg = EsThDirective;
|
|
4915
5168
|
exports.ɵh = TablePagerComponent;
|
|
4916
5169
|
exports.ɵi = TablePagerLoc;
|
|
4917
5170
|
|