@esfaenza/es-table 11.2.34 → 11.2.37-beta2
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 +333 -586
- 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 +37 -170
- package/esm2015/lib/components/es-td/es_td.component.js +1 -35
- package/esm2015/lib/core/handlers/classes/ColumnMetadataHandler.js +44 -96
- package/esm2015/lib/core/handlers/classes/ItemsHandler.js +1 -19
- package/esm2015/lib/core/handlers/classes/RowGroupingHandler.js +2 -4
- package/esm2015/lib/core/handlers/classes/UtilitiesHandler.js +1 -15
- package/esm2015/lib/domain/internals/classes/TdElement.js +2 -0
- package/esm2015/lib/domain/internals/index.js +2 -1
- package/esm2015/lib/es-table.module.js +2 -2
- package/esm2015/public-api.js +3 -3
- package/fesm2015/esfaenza-es-table.js +315 -566
- package/fesm2015/esfaenza-es-table.js.map +1 -1
- package/lib/components/es-table/es_table.component.d.ts +8 -64
- package/lib/components/es-td/es_td.component.d.ts +0 -2
- package/lib/core/handlers/classes/ColumnMetadataHandler.d.ts +15 -16
- package/lib/core/handlers/classes/ItemsHandler.d.ts +0 -6
- package/lib/core/handlers/classes/RowGroupingHandler.d.ts +2 -3
- package/lib/core/handlers/classes/UtilitiesHandler.d.ts +0 -16
- package/lib/domain/internals/classes/TdElement.d.ts +19 -0
- package/lib/domain/internals/index.d.ts +1 -0
- package/package.json +2 -2
- package/public-api.d.ts +2 -2
|
@@ -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/
|
|
3
|
-
typeof define === 'function' && define.amd ? define('@esfaenza/es-table', ['exports', '@angular/core', '@angular/forms', '@esfaenza/extensions', '@esfaenza/localizations', '@esfaenza/preferences', '@angular/
|
|
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.
|
|
5
|
-
}(this, (function (exports, i0, forms, i1, localizations, preferences,
|
|
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('@angular/platform-browser'), 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/cdk/drag-drop', '@angular/common', '@angular/router', '@angular/material/select', '@angular/material/input', '@angular/platform-browser', '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.cdk.dragDrop, global.ng.common, global.ng.router, global.ng.material.select, global.ng.material.input, global.ng.platformBrowser, global.modal, global.dropdown, global.ngxCsv, global.ngxContextmenu));
|
|
5
|
+
}(this, (function (exports, i0, forms, i1, localizations, preferences, dragDrop, common, router, select, input, platformBrowser, modal, dropdown, ngxCsv, ngxContextmenu) { 'use strict';
|
|
6
6
|
|
|
7
7
|
function _interopNamespace(e) {
|
|
8
8
|
if (e && e.__esModule) return e;
|
|
@@ -705,279 +705,6 @@
|
|
|
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
|
-
|
|
981
708
|
/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */
|
|
982
709
|
var EsTdDirective = /** @class */ (function () {
|
|
983
710
|
/**
|
|
@@ -1191,7 +918,7 @@
|
|
|
1191
918
|
*
|
|
1192
919
|
* Costo: 1 scan EsThs
|
|
1193
920
|
*
|
|
1194
|
-
* @param {
|
|
921
|
+
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1195
922
|
*/
|
|
1196
923
|
ColumnMetadataHandler.prototype.reviewColumnsList = function (ths) {
|
|
1197
924
|
var _this = this;
|
|
@@ -1200,30 +927,18 @@
|
|
|
1200
927
|
return;
|
|
1201
928
|
var _loop_1 = function (i) {
|
|
1202
929
|
var th = ths[i];
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
|
|
1208
|
-
|
|
1209
|
-
|
|
1210
|
-
|
|
1211
|
-
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
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
|
-
}
|
|
930
|
+
var column = th.th;
|
|
931
|
+
// Se non ho un id il th è considerato inerte
|
|
932
|
+
if (!column)
|
|
933
|
+
return "continue";
|
|
934
|
+
// Salvo le informazioni dell'header per far parte della lista da cui scegliere quali colonne visualizzare/nascondere
|
|
935
|
+
// Di default la visibilità è quella impostata nel componente
|
|
936
|
+
if ((this_1.est.HiddenColumns || th.thVisible) && th.thIf) {
|
|
937
|
+
var previouslyPinned = !this_1.est.ColumnsList || this_1.est.ColumnsList.length == 0 ? null : this_1.est.ColumnsList.find(function (t) { return t.id == column; }) || null;
|
|
938
|
+
var toAdd = new EsTableColumn(column, null, th.thVisible, (th.thFixed || th.thGroup), previouslyPinned == null ? th.thPinned : previouslyPinned.pinned, th.thPinnedWidth, th.Template, th._thParents);
|
|
939
|
+
if (previouslyPinned)
|
|
940
|
+
toAdd.prev_index = previouslyPinned.prev_index;
|
|
941
|
+
this_1.est.TMPColumnsList.push(toAdd);
|
|
1227
942
|
}
|
|
1228
943
|
};
|
|
1229
944
|
var this_1 = this;
|
|
@@ -1263,33 +978,21 @@
|
|
|
1263
978
|
// Sposto tutti gli header fixed o pinned all'inizio
|
|
1264
979
|
for (var i = 0; i < ths.length; i++) {
|
|
1265
980
|
var th = ths[i];
|
|
1266
|
-
|
|
1267
|
-
|
|
1268
|
-
|
|
1269
|
-
|
|
1270
|
-
|
|
1271
|
-
|
|
1272
|
-
|
|
981
|
+
thsCache[th.th] = th;
|
|
982
|
+
// Riassegno sempre per ripulire valori di partenza o per aggiornarli in caso di modifiche utente
|
|
983
|
+
th.thPinned = (!columnsCache[th.th] && th.thPinned) || (columnsCache[th.th] && columnsCache[th.th].pinned);
|
|
984
|
+
if (th.thPinned) {
|
|
985
|
+
if (i != pinneds)
|
|
986
|
+
this.utilities.arrayMove(ths, i, pinneds);
|
|
987
|
+
pinneds++;
|
|
1273
988
|
}
|
|
1274
|
-
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
|
|
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
|
-
}
|
|
989
|
+
//In questo caso sono informazioni statiche invece, non modificabili dall'utente, quindi non mi dò preoccupazioni
|
|
990
|
+
if ((th.thFixed || th.thGroup) && !th.thPinned) {
|
|
991
|
+
if (i != pinneds + fixeds)
|
|
992
|
+
this.utilities.arrayMove(ths, i, pinneds + fixeds);
|
|
993
|
+
fixeds++;
|
|
1289
994
|
}
|
|
1290
995
|
}
|
|
1291
|
-
if (this.utilities.isEsTh(ths[0]) || this.utilities.isEsTd(tds[0]))
|
|
1292
|
-
return;
|
|
1293
996
|
// Cache degli indici per riposizionare i td come i th
|
|
1294
997
|
for (var i = 0; i < ths.length; i++)
|
|
1295
998
|
columnsIndexCache[ths[i].th] = i;
|
|
@@ -1376,8 +1079,8 @@
|
|
|
1376
1079
|
*
|
|
1377
1080
|
* Costo: 1 scan ColumnsList, 1 scan EsThs, 1 scan EsTds
|
|
1378
1081
|
*
|
|
1379
|
-
* @param {
|
|
1380
|
-
* @param {
|
|
1082
|
+
* @param {EsThDirective[]} ths Header della tabella
|
|
1083
|
+
* @param {EsTdDirective[]} tds Celle della tabella
|
|
1381
1084
|
* @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
|
|
1382
1085
|
*/
|
|
1383
1086
|
ColumnMetadataHandler.prototype.refreshColumnsVisibility = function (ths, tds, view) {
|
|
@@ -1399,26 +1102,16 @@
|
|
|
1399
1102
|
// Definisco se la colonna è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1400
1103
|
for (var i = 0; i < ths.length; i++) {
|
|
1401
1104
|
var th = ths[i];
|
|
1402
|
-
|
|
1403
|
-
|
|
1404
|
-
|
|
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
|
-
}
|
|
1105
|
+
th.thVisible = th.thFixed || (columnsCache[th.th] ? columnsCache[th.th].visible : th.thVisible);
|
|
1106
|
+
if (th.thFixed || th.thGroup)
|
|
1107
|
+
fixedThs[th.th] = true;
|
|
1412
1108
|
}
|
|
1413
1109
|
}
|
|
1414
1110
|
if (tds) {
|
|
1415
1111
|
// Definisco se la cella è visibile in base alla sua rappresentazione locale in ColumnsList
|
|
1416
1112
|
for (var i = 0; i < tds.length; i++) {
|
|
1417
1113
|
var td = tds[i];
|
|
1418
|
-
|
|
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);
|
|
1114
|
+
td.tdVisible = fixedThs[td.td] || (columnsCache[td.td] ? columnsCache[td.td].visible : td.tdVisible);
|
|
1422
1115
|
}
|
|
1423
1116
|
}
|
|
1424
1117
|
this.est.changed();
|
|
@@ -1427,38 +1120,26 @@
|
|
|
1427
1120
|
* Allinea gli ordinamenti dati fra le **EsThs** e le informazioni all'interno della View bindata
|
|
1428
1121
|
*
|
|
1429
1122
|
* @param {AppSearch<any>} view AppSearch da utilizzare per questa operazione
|
|
1430
|
-
* @param {
|
|
1123
|
+
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1431
1124
|
*/
|
|
1432
1125
|
ColumnMetadataHandler.prototype.alignHeadersOrdering = function (ths, view) {
|
|
1433
1126
|
var orders = view ? view.orders : this.est.arrayOrders;
|
|
1434
1127
|
for (var i = 0; i < ths.length; i++) {
|
|
1435
1128
|
var th = ths[i];
|
|
1436
|
-
|
|
1437
|
-
|
|
1438
|
-
|
|
1439
|
-
|
|
1440
|
-
|
|
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
|
-
}
|
|
1129
|
+
th.thOrder = null;
|
|
1130
|
+
for (var i_1 = 0; i_1 < orders.length; i_1++) {
|
|
1131
|
+
var or = orders[i_1];
|
|
1132
|
+
if (or.id == th.th)
|
|
1133
|
+
th.thOrder = or.order;
|
|
1453
1134
|
}
|
|
1454
1135
|
}
|
|
1455
1136
|
};
|
|
1456
1137
|
/**
|
|
1457
1138
|
* Genera tutte le informazioni che servono per gestire il raggruppamento degli header
|
|
1458
1139
|
*
|
|
1459
|
-
* @param {
|
|
1140
|
+
* @param {EsThDirective[]} ths Colonne della tabella
|
|
1460
1141
|
*
|
|
1461
|
-
* @returns {{ leafs:
|
|
1142
|
+
* @returns {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} Oggetto contenente la lista delle foglie (header base), il livello
|
|
1462
1143
|
* 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
|
|
1463
1144
|
*/
|
|
1464
1145
|
ColumnMetadataHandler.prototype.evaluateHeadersGroupingInfos = function (ths) {
|
|
@@ -1467,8 +1148,6 @@
|
|
|
1467
1148
|
var thsCache = {};
|
|
1468
1149
|
for (var i = 0; i < ths.length; i++) {
|
|
1469
1150
|
var th = ths[i];
|
|
1470
|
-
if (this.utilities.isEsTh(th))
|
|
1471
|
-
continue;
|
|
1472
1151
|
thsCache[th.th] = th;
|
|
1473
1152
|
if (th.thParent && !parentsCache[th.thParent])
|
|
1474
1153
|
parentsCache[th.thParent] = true;
|
|
@@ -1478,10 +1157,6 @@
|
|
|
1478
1157
|
var leafs = [];
|
|
1479
1158
|
for (var i = 0; i < ths.length; i++) {
|
|
1480
1159
|
var th = ths[i];
|
|
1481
|
-
if (this.utilities.isEsTh(th)) {
|
|
1482
|
-
leafs.push(th);
|
|
1483
|
-
continue;
|
|
1484
|
-
}
|
|
1485
1160
|
// Se sono una foglia vedo quanti livelli ci sono sopra
|
|
1486
1161
|
if (!parentsCache[th.th]) {
|
|
1487
1162
|
leafs.push(th);
|
|
@@ -1494,7 +1169,7 @@
|
|
|
1494
1169
|
/**
|
|
1495
1170
|
* Genera gli header groups da una lista di info sui th all'interno della variabile **TMPRowThGroups**
|
|
1496
1171
|
*
|
|
1497
|
-
* @param {{ leafs:
|
|
1172
|
+
* @param {{ leafs: EsThDirective[], groupingLevel: number, parentsCache: any, thsCache: any }} infos Informazioni di raggruppamento valutate precedentemente
|
|
1498
1173
|
*/
|
|
1499
1174
|
ColumnMetadataHandler.prototype.evaluateHeaderGroups = function (infos) {
|
|
1500
1175
|
if (infos.groupingLevel == 0)
|
|
@@ -1601,7 +1276,7 @@
|
|
|
1601
1276
|
if (!orderings || orderings.length == 0) {
|
|
1602
1277
|
for (var i = 0; i < ths.length; i++) {
|
|
1603
1278
|
var th = ths[i];
|
|
1604
|
-
var order =
|
|
1279
|
+
var order = th.th;
|
|
1605
1280
|
this.est.OrderDirectives.push(order);
|
|
1606
1281
|
}
|
|
1607
1282
|
}
|
|
@@ -1609,7 +1284,7 @@
|
|
|
1609
1284
|
this.est.OrderDirectives = orderings;
|
|
1610
1285
|
var _loop_2 = function (i) {
|
|
1611
1286
|
var th = ths[i];
|
|
1612
|
-
var thId =
|
|
1287
|
+
var thId = th.th;
|
|
1613
1288
|
if (!this_2.est.OrderDirectives.find(function (o) { return o == thId; }))
|
|
1614
1289
|
this_2.est.OrderDirectives.push(thId);
|
|
1615
1290
|
};
|
|
@@ -1817,7 +1492,7 @@
|
|
|
1817
1492
|
var columns = this.est.arrayMode ? this.est.arrayColumns : castedView.columns;
|
|
1818
1493
|
var columnsOrderings = this.est.arrayMode ? this.est.arrayColumnOrdering : castedView.column_ordering;
|
|
1819
1494
|
var toStore = { columns: JSON.parse(JSON.stringify(columns)), column_ordering: JSON.parse(JSON.stringify(columnsOrderings)) };
|
|
1820
|
-
this.prefService.
|
|
1495
|
+
this.prefService.setItem(this.est.ngControl.name, toStore, 'preference').subscribe();
|
|
1821
1496
|
}
|
|
1822
1497
|
// Rieseguo l'ultima ricerca bindata alla tabella
|
|
1823
1498
|
// Mi assicuro di farlo dopo l'espansione del changed o rischio che la ricerca mi ridia colonne che in realtà non esistono
|
|
@@ -2303,24 +1978,6 @@
|
|
|
2303
1978
|
}
|
|
2304
1979
|
return tmpItems;
|
|
2305
1980
|
};
|
|
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
|
-
};
|
|
2324
1981
|
/** Se in modalità array applica gli ordinamenti ASC-DESC delle colonne */
|
|
2325
1982
|
ItemsHandler.prototype.arrayModeReviewOrderings = function () {
|
|
2326
1983
|
var _this = this;
|
|
@@ -2586,13 +2243,11 @@
|
|
|
2586
2243
|
/**
|
|
2587
2244
|
* Se in modalità array applica i raggruppamenti definiti lato row-grouping
|
|
2588
2245
|
*
|
|
2589
|
-
* @param {ths:
|
|
2246
|
+
* @param {ths: EsThDirective[]} ths Header
|
|
2590
2247
|
*/
|
|
2591
2248
|
RowGroupingHandler.prototype.arrayModeReviewGroupings = function (ths) {
|
|
2592
2249
|
if (ths.length == 0)
|
|
2593
2250
|
return;
|
|
2594
|
-
if (this.utilities.isEsTh(ths[0]))
|
|
2595
|
-
return;
|
|
2596
2251
|
var headerGroups = [];
|
|
2597
2252
|
var headerAggregations = [];
|
|
2598
2253
|
for (var i = 0; i < ths.length; i++) {
|
|
@@ -3525,20 +3180,6 @@
|
|
|
3525
3180
|
throw "Gli indici passati non fanno riferimento a una posizione dell'array. Length: " + array.length + " Old:" + oldI + " New: " + newI;
|
|
3526
3181
|
array.splice(newI, 0, array.splice(oldI, 1)[0]);
|
|
3527
3182
|
};
|
|
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; };
|
|
3542
3183
|
/**
|
|
3543
3184
|
* Date le informazioni di paginazione ottiene l'array dei pulsanti
|
|
3544
3185
|
*
|
|
@@ -3737,26 +3378,6 @@
|
|
|
3737
3378
|
this.ColumnsResizable = null;
|
|
3738
3379
|
/** Indica se dev'essere disponibile il sistema di aggiornamento automatico */
|
|
3739
3380
|
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;
|
|
3760
3381
|
/**
|
|
3761
3382
|
* Decide se utilizzare o meno le CustomCells. Impostandolo a **true** l'es-table diventa in grado di gestire nativamente:
|
|
3762
3383
|
*
|
|
@@ -3815,12 +3436,6 @@
|
|
|
3815
3436
|
this.HasHeaderGroup = null;
|
|
3816
3437
|
/** Indica la presenza di raggruppamenti a livello del raggruppamento precedentemente esistente, chiaramente è insensata senza **HasHeaderGroup** */
|
|
3817
3438
|
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;
|
|
3824
3439
|
/** Indica se nascondere gli Header della tabella */
|
|
3825
3440
|
this.HeaderHidden = null;
|
|
3826
3441
|
/** Indica se nascondere il Body della tabella */
|
|
@@ -3903,11 +3518,6 @@
|
|
|
3903
3518
|
this.onRemoval = new i0.EventEmitter();
|
|
3904
3519
|
/** Evento richiamato all'annullamento di un'eliminazione */
|
|
3905
3520
|
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();
|
|
3911
3521
|
/** Evento richiamato quando si clicca su un opzione definita nelle **CornerMenuOptions** */
|
|
3912
3522
|
this.onCornerAction = new i0.EventEmitter();
|
|
3913
3523
|
/** Evento richiamato quando si clicca su un opzione definita nelle **DynamicOperations** */
|
|
@@ -3995,10 +3605,6 @@
|
|
|
3995
3605
|
/** @ignore */
|
|
3996
3606
|
EsTableComponent.prototype.ngOnInit = function () {
|
|
3997
3607
|
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\"";
|
|
4002
3608
|
// click destro su una riga con selezione attiva: Tiro fuori il context menu e selezione l'elemento corrente
|
|
4003
3609
|
this.ctxMenuSubscription = (this.ContextMenu || this.tableEmptyMenu).open.subscribe(function (t) {
|
|
4004
3610
|
// Gruppi va bene, oggetti pure, ma separatori fra gruppi proprio no...
|
|
@@ -4031,6 +3637,10 @@
|
|
|
4031
3637
|
this.ShiftClick = true;
|
|
4032
3638
|
this.DirectivesBased = true;
|
|
4033
3639
|
}
|
|
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\"";
|
|
4034
3644
|
};
|
|
4035
3645
|
/** @ignore */
|
|
4036
3646
|
EsTableComponent.prototype.ngOnDestroy = function () {
|
|
@@ -4109,7 +3719,7 @@
|
|
|
4109
3719
|
if (!!this.prefService) return [3 /*break*/, 3];
|
|
4110
3720
|
console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
|
|
4111
3721
|
return [3 /*break*/, 5];
|
|
4112
|
-
case 3: return [4 /*yield*/, this.prefService.
|
|
3722
|
+
case 3: return [4 /*yield*/, this.prefService.getItem(this.ngControl.name).toPromise()];
|
|
4113
3723
|
case 4:
|
|
4114
3724
|
prefs = _s.sent();
|
|
4115
3725
|
this.View.columns = (prefs === null || prefs === void 0 ? void 0 : prefs.columns) || [];
|
|
@@ -4136,7 +3746,7 @@
|
|
|
4136
3746
|
if (!!this.prefService) return [3 /*break*/, 8];
|
|
4137
3747
|
console.error("Non posso utilizzare le preference senza che il pacchetto @esfaenza/preferences sia installato");
|
|
4138
3748
|
return [3 /*break*/, 10];
|
|
4139
|
-
case 8: return [4 /*yield*/, this.prefService.
|
|
3749
|
+
case 8: return [4 /*yield*/, this.prefService.getItem(this.ngControl.name).toPromise()];
|
|
4140
3750
|
case 9:
|
|
4141
3751
|
prefs = _s.sent();
|
|
4142
3752
|
this.arrayColumns = (prefs === null || prefs === void 0 ? void 0 : prefs.columns) || [];
|
|
@@ -4161,30 +3771,12 @@
|
|
|
4161
3771
|
*/
|
|
4162
3772
|
EsTableComponent.prototype.finalizeContext = function () {
|
|
4163
3773
|
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));
|
|
4173
3774
|
var hasRowGroups = (viewCasted.groupings && viewCasted.groupings.filter(function (t) { return !t.aggregation; }).length > 0) || (this.arrayMode && this.EsThsDirective.some(function (t) { return t.thGroup; }));
|
|
4174
3775
|
// Se ho dei gruppi in modalità array devo sistemare un po' di variabili che diventano insensate
|
|
4175
3776
|
if (this.arrayMode && hasRowGroups)
|
|
4176
3777
|
this.UseArrayModePaging = false;
|
|
4177
3778
|
// Riempimento della TMPBoundSource con gli oggetti che verranno poi mostrati ad interfaccia
|
|
4178
|
-
|
|
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);
|
|
3779
|
+
this.TMPBoundSource = this.items_H.getItemsByMode(false, !this.internalWriteCall);
|
|
4188
3780
|
// Se ho una gerarchia, assegno i livelli gerarchici alla TMPBoundSource
|
|
4189
3781
|
if (this.Hierarchy && !hasRowGroups)
|
|
4190
3782
|
this.hierarchyMode_H.assignHierarchyLevels(this.TMPBoundSource);
|
|
@@ -4244,51 +3836,22 @@
|
|
|
4244
3836
|
this.PagerOptions.ShowPagingOptions = this.PagerOptions.ShowButtons;
|
|
4245
3837
|
}
|
|
4246
3838
|
};
|
|
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
|
-
};
|
|
4270
3839
|
/**
|
|
4271
3840
|
* Metodo lanciato dopo che la sorgente dati è stata correttamente bindata, si occupa di ricalcolare tutto ciò che serve
|
|
4272
3841
|
* all'es-table per renderizzare i valori da mostrare
|
|
4273
3842
|
*/
|
|
4274
3843
|
EsTableComponent.prototype.postBoundSourceCalculation = function () {
|
|
4275
|
-
var _this = this;
|
|
4276
3844
|
// Resetto tutto tranne RowTDs e RowTHs per evitare flickering. RowTDs e RowTHs saranno modificate all'interno del prossimo ciclo di CD
|
|
4277
3845
|
this.RowContexts = [];
|
|
4278
3846
|
this.OrderDirectives = [];
|
|
4279
3847
|
this.lastSelectedItemID = null;
|
|
4280
|
-
|
|
4281
|
-
this.internalPostBoundSource();
|
|
4282
|
-
else {
|
|
4283
|
-
this.cdr.detectChanges();
|
|
4284
|
-
setTimeout(function () { _this.internalPostBoundSource(); });
|
|
4285
|
-
}
|
|
3848
|
+
this.internalPostBoundSource();
|
|
4286
3849
|
};
|
|
4287
3850
|
/** 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 */
|
|
4288
3851
|
EsTableComponent.prototype.internalPostBoundSource = function () {
|
|
4289
3852
|
var View = this.View;
|
|
4290
|
-
var ths = this.
|
|
4291
|
-
var tds = this.
|
|
3853
|
+
var ths = this.EsThsDirective && this.EsThsDirective.length > 0 ? this.EsThsDirective.toArray() : [];
|
|
3854
|
+
var tds = this.EsTdsDirective && this.EsTdsDirective.length > 0 ? this.EsTdsDirective.toArray() : [];
|
|
4292
3855
|
// Se non ho colonne dinamiche ma sono in modalità dinamica (lo capisco perché c'è una view piena di genericitem) metto il default delle colonne
|
|
4293
3856
|
this.dynamicMode_H.eventuallyReviewDynamicColumns();
|
|
4294
3857
|
this.bindDisplayToLoadedItemsOrGroups(View);
|
|
@@ -4423,8 +3986,8 @@
|
|
|
4423
3986
|
*
|
|
4424
3987
|
* Costo: 2 scan EsThs, 1 scan EsTds
|
|
4425
3988
|
*
|
|
4426
|
-
* @param {
|
|
4427
|
-
* @param {
|
|
3989
|
+
* @param {EsThDirective[]} ths Colonne della tabella
|
|
3990
|
+
* @param {EsTdDirective[]} tds Celle della tabella
|
|
4428
3991
|
*/
|
|
4429
3992
|
EsTableComponent.prototype.evaluateRowTds = function (ths, tds) {
|
|
4430
3993
|
if (tds.length == 0)
|
|
@@ -4437,58 +4000,35 @@
|
|
|
4437
4000
|
}
|
|
4438
4001
|
for (var i = 0; i < ths.length; i++) {
|
|
4439
4002
|
var th = ths[i];
|
|
4440
|
-
thsCache[
|
|
4003
|
+
thsCache[th.th] = th;
|
|
4441
4004
|
}
|
|
4442
4005
|
this.TMPRowTDs = {};
|
|
4443
4006
|
// Variabile d'appoggio per permettermi di inserire tutte le colonne "Fixed" davanti
|
|
4444
4007
|
var contextFixeds = {};
|
|
4445
|
-
for (var i = 0; i < tds.length; i++) {
|
|
4446
|
-
var td = tds[i];
|
|
4447
|
-
|
|
4448
|
-
var
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
if (
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
4467
|
-
|
|
4468
|
-
|
|
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
|
-
}
|
|
4008
|
+
for (var i = 0; i < tds.length; i++) {
|
|
4009
|
+
var td = tds[i];
|
|
4010
|
+
for (var i_1 = 0; i_1 < this.boundSource.length; i_1++) {
|
|
4011
|
+
var item = this.boundSource[i_1];
|
|
4012
|
+
var ctx = item._hash;
|
|
4013
|
+
var key = td.td;
|
|
4014
|
+
var th = thsCache[td.td];
|
|
4015
|
+
if (!!th)
|
|
4016
|
+
th._referenced = true;
|
|
4017
|
+
else
|
|
4018
|
+
throw "ID dell'oggeto EsTd non compatibile con gli ID dicharati negli EsTh: " + td.td;
|
|
4019
|
+
if (td.tdIf || th.thGroup) {
|
|
4020
|
+
var thCasted = th;
|
|
4021
|
+
var isFixed = th.thFixed || th.thGroup || th.thPinned;
|
|
4022
|
+
var itemToAdd = item._item ?
|
|
4023
|
+
{ 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 } :
|
|
4024
|
+
{ 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) };
|
|
4025
|
+
if (this.TMPRowTDs[ctx]) {
|
|
4026
|
+
this.TMPRowTDs[ctx].push(itemToAdd);
|
|
4027
|
+
}
|
|
4028
|
+
else {
|
|
4029
|
+
this.RowContexts.push(ctx);
|
|
4030
|
+
this.TMPRowTDs[ctx] = [itemToAdd];
|
|
4031
|
+
contextFixeds[ctx] = isFixed ? 1 : 0;
|
|
4492
4032
|
}
|
|
4493
4033
|
}
|
|
4494
4034
|
}
|
|
@@ -4500,7 +4040,7 @@
|
|
|
4500
4040
|
for (var i = 0; i < ths.length; i++) {
|
|
4501
4041
|
var th = ths[i];
|
|
4502
4042
|
if (!th._referenced)
|
|
4503
|
-
errs.push(
|
|
4043
|
+
errs.push(th.th);
|
|
4504
4044
|
}
|
|
4505
4045
|
if (errs.length > 0) {
|
|
4506
4046
|
var errIds = errs.join(', ');
|
|
@@ -4514,7 +4054,7 @@
|
|
|
4514
4054
|
*
|
|
4515
4055
|
* Costo: 1 scan EsThs
|
|
4516
4056
|
*
|
|
4517
|
-
* @param {
|
|
4057
|
+
* @param {EsThDirective[]} ths Colonne della tabella
|
|
4518
4058
|
*/
|
|
4519
4059
|
EsTableComponent.prototype.evaluateRowThs = function (ths) {
|
|
4520
4060
|
var _s;
|
|
@@ -4528,18 +4068,10 @@
|
|
|
4528
4068
|
columnsListCache[itm.id] = itm;
|
|
4529
4069
|
}
|
|
4530
4070
|
this.TMPRowTHs = [];
|
|
4531
|
-
var fixed = 0;
|
|
4532
4071
|
for (var i = 0; i < ths.length; i++) {
|
|
4533
4072
|
var th = ths[i];
|
|
4534
4073
|
var toAdd = void 0;
|
|
4535
|
-
if (
|
|
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) {
|
|
4074
|
+
if (th.thIf || th.thGroup) {
|
|
4543
4075
|
var thClass = (th.thClass || '') + (th.thGroup ? " est-col-min" : "");
|
|
4544
4076
|
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 };
|
|
4545
4077
|
this.TMPRowTHs.push(toAdd);
|
|
@@ -4793,21 +4325,6 @@
|
|
|
4793
4325
|
// Riforzo il writevalue in modo che il codice passi dalla gestione come se fosse fatta ripartire una ricerca
|
|
4794
4326
|
this.internalWriteValue();
|
|
4795
4327
|
};
|
|
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
|
-
};
|
|
4811
4328
|
/**
|
|
4812
4329
|
* Gestione dei click sulle opzioni del menù contestuale in alto a destra generato dall'Input **CornerMenuOptions**
|
|
4813
4330
|
*
|
|
@@ -4866,7 +4383,7 @@
|
|
|
4866
4383
|
viewProviders: [{ provide: localizations.LocalizationService, useClass: EsTableLoc }],
|
|
4867
4384
|
changeDetection: i0.ChangeDetectionStrategy.OnPush,
|
|
4868
4385
|
encapsulation: i0.ViewEncapsulation.None,
|
|
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>",
|
|
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>",
|
|
4870
4387
|
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)}"]
|
|
4871
4388
|
},] }
|
|
4872
4389
|
];
|
|
@@ -4886,8 +4403,6 @@
|
|
|
4886
4403
|
EsTableComponent.propDecorators = {
|
|
4887
4404
|
EsTdsDirective: [{ type: i0.ContentChildren, args: [EsTdDirective,] }],
|
|
4888
4405
|
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; }),] }],
|
|
4891
4406
|
bodyRef: [{ type: i0.ContentChild, args: ['body', { static: false },] }],
|
|
4892
4407
|
headerRef: [{ type: i0.ContentChild, args: ['header', { static: false },] }],
|
|
4893
4408
|
headerGroupRef: [{ type: i0.ContentChild, args: ['headerGroup', { static: false },] }],
|
|
@@ -4895,9 +4410,6 @@
|
|
|
4895
4410
|
CornerMenuOptions: [{ type: i0.Input }],
|
|
4896
4411
|
ColumnsResizable: [{ type: i0.Input }],
|
|
4897
4412
|
AutoUpdate: [{ type: i0.Input }],
|
|
4898
|
-
UseCustomCellActions: [{ type: i0.Input }],
|
|
4899
|
-
CustomCellActionsOn: [{ type: i0.Input }],
|
|
4900
|
-
CellActionPropagates: [{ type: i0.Input }],
|
|
4901
4413
|
UseCustomCells: [{ type: i0.Input }],
|
|
4902
4414
|
MaxHeight: [{ type: i0.Input }],
|
|
4903
4415
|
ContainerClass: [{ type: i0.Input }],
|
|
@@ -4921,9 +4433,6 @@
|
|
|
4921
4433
|
ExportFunction: [{ type: i0.Input }],
|
|
4922
4434
|
HasHeaderGroup: [{ type: i0.Input }],
|
|
4923
4435
|
HasSecondaryHeaderGroup: [{ type: i0.Input }],
|
|
4924
|
-
SliceSize: [{ type: i0.Input }],
|
|
4925
|
-
EndlessScroll: [{ type: i0.Input }],
|
|
4926
|
-
EndlessScrollOnlyForAll: [{ type: i0.Input }],
|
|
4927
4436
|
HeaderHidden: [{ type: i0.Input }],
|
|
4928
4437
|
BodyHidden: [{ type: i0.Input }],
|
|
4929
4438
|
SelectionDisabled: [{ type: i0.Input }],
|
|
@@ -4954,7 +4463,6 @@
|
|
|
4954
4463
|
onSelectionChanged: [{ type: i0.Output }],
|
|
4955
4464
|
onRemoval: [{ type: i0.Output }],
|
|
4956
4465
|
onAbortRemoval: [{ type: i0.Output }],
|
|
4957
|
-
onCellClick: [{ type: i0.Output }],
|
|
4958
4466
|
onCornerAction: [{ type: i0.Output }],
|
|
4959
4467
|
onDynamicOperation: [{ type: i0.Output }],
|
|
4960
4468
|
exportDownloader: [{ type: i0.ViewChild, args: ['exportDownloader', { static: false },] }],
|
|
@@ -5092,6 +4600,245 @@
|
|
|
5092
4600
|
pagingSelected: [{ type: i0.Output }]
|
|
5093
4601
|
};
|
|
5094
4602
|
|
|
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
|
+
|
|
5095
4842
|
var EsTableModule = /** @class */ (function () {
|
|
5096
4843
|
function EsTableModule() {
|
|
5097
4844
|
}
|
|
@@ -5123,7 +4870,7 @@
|
|
|
5123
4870
|
],
|
|
5124
4871
|
declarations: [EsTh, EsTd, EsTableComponent, EsTdDirective, EsThDirective, TablePagerComponent],
|
|
5125
4872
|
providers: [i1.UtilityService, i1.ExportService, i1.HashingService, i1.MessageService],
|
|
5126
|
-
exports: [
|
|
4873
|
+
exports: [EsTableComponent, EsTdDirective, EsThDirective, TablePagerComponent]
|
|
5127
4874
|
},] }
|
|
5128
4875
|
];
|
|
5129
4876
|
|
|
@@ -5144,8 +4891,8 @@
|
|
|
5144
4891
|
exports.EsTableModule = EsTableModule;
|
|
5145
4892
|
exports.EsTableModuleConfig = EsTableModuleConfig;
|
|
5146
4893
|
exports.EsTableOperationDefinition = EsTableOperationDefinition;
|
|
5147
|
-
exports.
|
|
5148
|
-
exports.
|
|
4894
|
+
exports.EsTdDirective = EsTdDirective;
|
|
4895
|
+
exports.EsThDirective = EsThDirective;
|
|
5149
4896
|
exports.GenericItem = GenericItem;
|
|
5150
4897
|
exports.Group = Group;
|
|
5151
4898
|
exports.GroupAggregation = GroupAggregation;
|
|
@@ -5163,8 +4910,8 @@
|
|
|
5163
4910
|
exports.ɵc = EST_DEBUG;
|
|
5164
4911
|
exports.ɵd = EST_DEFAULTS;
|
|
5165
4912
|
exports.ɵe = UtilitiesHandler;
|
|
5166
|
-
exports.ɵf =
|
|
5167
|
-
exports.ɵg =
|
|
4913
|
+
exports.ɵf = EsTh;
|
|
4914
|
+
exports.ɵg = EsTd;
|
|
5168
4915
|
exports.ɵh = TablePagerComponent;
|
|
5169
4916
|
exports.ɵi = TablePagerLoc;
|
|
5170
4917
|
|