@esfaenza/es-table 16.2.29 → 17.3.16
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/esm2022/esfaenza-es-table.mjs +4 -4
- package/esm2022/lib/components/es-table/es_table.component.loc.mjs +38 -38
- package/esm2022/lib/components/es-table/es_table.component.mjs +1891 -1891
- package/esm2022/lib/components/es-td/es_td.component.mjs +40 -40
- package/esm2022/lib/components/es-th/es_th.component.mjs +176 -176
- package/esm2022/lib/components/pager/table_pager.component.loc.mjs +20 -20
- package/esm2022/lib/components/pager/table_pager.component.mjs +111 -111
- package/esm2022/lib/components/pipes/est-format.pipe.mjs +44 -44
- package/esm2022/lib/components/pipes/est-lookup.pipe.mjs +19 -19
- package/esm2022/lib/components/pipes/est-propinsensitive.pipe.mjs +19 -19
- package/esm2022/lib/components/pipes/est-renderer.pipe.mjs +36 -36
- package/esm2022/lib/components/pipes/est-routerlink.pipe.mjs +41 -41
- package/esm2022/lib/components/pipes/est_editor.pipe.mjs +36 -36
- package/esm2022/lib/core/CopyPasteDetector.mjs +27 -27
- package/esm2022/lib/core/Logger.mjs +25 -25
- package/esm2022/lib/core/handlers/ColumnMetadataHandler.mjs +835 -835
- package/esm2022/lib/core/handlers/DynamicModeHandler.mjs +109 -109
- package/esm2022/lib/core/handlers/ExportHandler.mjs +32 -32
- package/esm2022/lib/core/handlers/HierarchyModeHandler.mjs +136 -136
- package/esm2022/lib/core/handlers/ItemsHandler.mjs +119 -119
- package/esm2022/lib/core/handlers/ReportModeHandler.mjs +60 -60
- package/esm2022/lib/core/handlers/RowGroupingHandler.mjs +480 -480
- package/esm2022/lib/core/handlers/SelectionHandler.mjs +778 -778
- package/esm2022/lib/core/handlers/UtilitiesHandler.mjs +151 -151
- package/esm2022/lib/directives/es_td.directive.mjs +54 -54
- package/esm2022/lib/directives/es_td_editor.directive.mjs +24 -24
- package/esm2022/lib/directives/es_th.directive.mjs +130 -130
- package/esm2022/lib/directives/es_th_td_provider.directive.mjs +34 -34
- package/esm2022/lib/domain/configuration/EsTableDefaultable.mjs +3 -3
- package/esm2022/lib/domain/configuration/EsTableModuleConfig.mjs +3 -3
- package/esm2022/lib/domain/externals/CornerMenuOption.mjs +3 -3
- package/esm2022/lib/domain/externals/EsTableColumnsDefinition.mjs +47 -47
- package/esm2022/lib/domain/externals/EsTableModelChange.mjs +18 -18
- package/esm2022/lib/domain/externals/EsTableOperationDefinition.mjs +21 -21
- package/esm2022/lib/domain/externals/ItemPropEditableReference.mjs +3 -3
- package/esm2022/lib/domain/externals/appsearch/AppOrdering.mjs +15 -15
- package/esm2022/lib/domain/externals/appsearch/AppSearch.mjs +65 -65
- package/esm2022/lib/domain/externals/appsearch/EsTableMultiValue.mjs +24 -24
- package/esm2022/lib/domain/externals/appsearch/GenericItem.mjs +10 -10
- package/esm2022/lib/domain/externals/appsearch/Group.mjs +16 -16
- package/esm2022/lib/domain/externals/appsearch/GroupAggregation.mjs +15 -15
- package/esm2022/lib/domain/externals/appsearch/GroupFilter.mjs +13 -13
- package/esm2022/lib/domain/externals/appsearch/GroupOrAggregation.mjs +15 -15
- package/esm2022/lib/domain/externals/appsearch/ItemsSelection.mjs +22 -22
- package/esm2022/lib/domain/externals/report/ReportColumn.mjs +3 -3
- package/esm2022/lib/domain/externals/report/ReportParam.mjs +3 -3
- package/esm2022/lib/domain/externals/report/ReportRow.mjs +3 -3
- package/esm2022/lib/domain/internals/CacheTriptic.mjs +15 -15
- package/esm2022/lib/domain/internals/EsTableColumn.mjs +31 -31
- package/esm2022/lib/domain/internals/GroupPager.mjs +22 -22
- package/esm2022/lib/domain/internals/GroupRouteFragment.mjs +16 -16
- package/esm2022/lib/domain/internals/PagerInfos.mjs +14 -14
- package/esm2022/lib/domain/internals/TdElement.mjs +1 -1
- package/esm2022/lib/domain/internals/ThAggregation.mjs +15 -15
- package/esm2022/lib/domain/internals/ThElement.mjs +1 -1
- package/esm2022/lib/domain/internals/ThGroup.mjs +1 -1
- package/esm2022/lib/domain/types.mjs +1 -1
- package/esm2022/lib/es-table.module.mjs +125 -125
- package/esm2022/lib/tokens.mjs +5 -5
- package/esm2022/public-api.mjs +27 -27
- package/fesm2022/esfaenza-es-table.mjs +5777 -5777
- package/fesm2022/esfaenza-es-table.mjs.map +1 -1
- package/index.d.ts +5 -5
- package/lib/components/es-table/es_table.component.d.ts +738 -738
- package/lib/components/es-table/es_table.component.loc.d.ts +10 -10
- package/lib/components/es-td/es_td.component.d.ts +26 -26
- package/lib/components/es-th/es_th.component.d.ts +92 -92
- package/lib/components/pager/table_pager.component.d.ts +56 -56
- package/lib/components/pager/table_pager.component.loc.d.ts +10 -10
- package/lib/components/pipes/est-format.pipe.d.ts +10 -10
- package/lib/components/pipes/est-lookup.pipe.d.ts +13 -13
- package/lib/components/pipes/est-propinsensitive.pipe.d.ts +7 -7
- package/lib/components/pipes/est-renderer.pipe.d.ts +15 -15
- package/lib/components/pipes/est-routerlink.pipe.d.ts +20 -20
- package/lib/components/pipes/est_editor.pipe.d.ts +15 -15
- package/lib/core/CopyPasteDetector.d.ts +15 -15
- package/lib/core/Logger.d.ts +10 -10
- package/lib/core/handlers/ColumnMetadataHandler.d.ts +189 -189
- package/lib/core/handlers/DynamicModeHandler.d.ts +22 -22
- package/lib/core/handlers/ExportHandler.d.ts +18 -18
- package/lib/core/handlers/HierarchyModeHandler.d.ts +40 -40
- package/lib/core/handlers/ItemsHandler.d.ts +35 -35
- package/lib/core/handlers/ReportModeHandler.d.ts +27 -27
- package/lib/core/handlers/RowGroupingHandler.d.ts +118 -118
- package/lib/core/handlers/SelectionHandler.d.ts +230 -230
- package/lib/core/handlers/UtilitiesHandler.d.ts +57 -57
- package/lib/directives/es_td.directive.d.ts +42 -42
- package/lib/directives/es_td_editor.directive.d.ts +14 -14
- package/lib/directives/es_th.directive.d.ts +107 -107
- package/lib/directives/es_th_td_provider.directive.d.ts +15 -15
- package/lib/domain/configuration/EsTableDefaultable.d.ts +21 -21
- package/lib/domain/configuration/EsTableModuleConfig.d.ts +8 -8
- package/lib/domain/externals/CornerMenuOption.d.ts +7 -7
- package/lib/domain/externals/EsTableColumnsDefinition.d.ts +56 -56
- package/lib/domain/externals/EsTableModelChange.d.ts +17 -17
- package/lib/domain/externals/EsTableOperationDefinition.d.ts +20 -20
- package/lib/domain/externals/ItemPropEditableReference.d.ts +34 -34
- package/lib/domain/externals/appsearch/AppOrdering.d.ts +14 -14
- package/lib/domain/externals/appsearch/AppSearch.d.ts +100 -100
- package/lib/domain/externals/appsearch/EsTableMultiValue.d.ts +22 -22
- package/lib/domain/externals/appsearch/GenericItem.d.ts +13 -13
- package/lib/domain/externals/appsearch/Group.d.ts +17 -17
- package/lib/domain/externals/appsearch/GroupAggregation.d.ts +14 -14
- package/lib/domain/externals/appsearch/GroupFilter.d.ts +12 -12
- package/lib/domain/externals/appsearch/GroupOrAggregation.d.ts +14 -14
- package/lib/domain/externals/appsearch/ItemsSelection.d.ts +22 -22
- package/lib/domain/externals/report/ReportColumn.d.ts +19 -19
- package/lib/domain/externals/report/ReportParam.d.ts +40 -40
- package/lib/domain/externals/report/ReportRow.d.ts +9 -9
- package/lib/domain/internals/CacheTriptic.d.ts +14 -14
- package/lib/domain/internals/EsTableColumn.d.ts +41 -41
- package/lib/domain/internals/GroupPager.d.ts +26 -26
- package/lib/domain/internals/GroupRouteFragment.d.ts +15 -15
- package/lib/domain/internals/PagerInfos.d.ts +13 -13
- package/lib/domain/internals/TdElement.d.ts +57 -57
- package/lib/domain/internals/ThAggregation.d.ts +14 -14
- package/lib/domain/internals/ThElement.d.ts +24 -24
- package/lib/domain/internals/ThGroup.d.ts +10 -10
- package/lib/domain/types.d.ts +2 -2
- package/lib/es-table.module.d.ts +35 -35
- package/lib/tokens.d.ts +6 -6
- package/package.json +14 -14
- package/public-api.d.ts +27 -27
|
@@ -1,151 +1,151 @@
|
|
|
1
|
-
// Angular
|
|
2
|
-
import { Injectable } from "@angular/core";
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "@esfaenza/extensions";
|
|
5
|
-
/** Classe di utilità per le cose comuni */
|
|
6
|
-
export class UtilitiesHandler {
|
|
7
|
-
/** @ignore Costruttore */
|
|
8
|
-
constructor(hashExts) {
|
|
9
|
-
this.hashExts = hashExts;
|
|
10
|
-
}
|
|
11
|
-
/**
|
|
12
|
-
* Data una lista di oggetti effettua dei raggruppamenti in base alla proprietà **field**,
|
|
13
|
-
* restituendo un oggetto del tipo { Gruppo1: oggetti[], Gruppo2: oggetti[], ecc... }
|
|
14
|
-
*
|
|
15
|
-
* @param {any[]} array Lista degli oggetti da raggruppare
|
|
16
|
-
* @param {string} field Campo su cui effettuare i raggruppamenti
|
|
17
|
-
*
|
|
18
|
-
* @returns {{ [id: string]: any[] }} Dizionario dei gruppi
|
|
19
|
-
*/
|
|
20
|
-
groupBy(array, field) {
|
|
21
|
-
let ret = {};
|
|
22
|
-
for (let i = 0; i < array.length; i++) {
|
|
23
|
-
let x = array[i];
|
|
24
|
-
(ret[x[field]] = ret[x[field]] || []).push(x);
|
|
25
|
-
}
|
|
26
|
-
return ret;
|
|
27
|
-
}
|
|
28
|
-
;
|
|
29
|
-
/**
|
|
30
|
-
* Helper per effettuare il caching delle aggregazioni. Le sposta da una lista di **GroupAggregation** a una **<Map<string, Map<string, string>>**
|
|
31
|
-
*
|
|
32
|
-
* @param {any} group Gruppo di cui cachare le aggregazioni
|
|
33
|
-
*/
|
|
34
|
-
cacheAggregations(group) {
|
|
35
|
-
group._aggregationsCache = new Map();
|
|
36
|
-
let castedAgCache = group._aggregationsCache;
|
|
37
|
-
for (let i = 0; i < group.aggregations.length; i++) {
|
|
38
|
-
let agg = group.aggregations[i];
|
|
39
|
-
if (castedAgCache.has(agg.column))
|
|
40
|
-
castedAgCache.get(agg.column).set(agg.aggregation, agg.value);
|
|
41
|
-
else {
|
|
42
|
-
let tmp = new Map();
|
|
43
|
-
tmp.set(agg.aggregation, agg.value);
|
|
44
|
-
castedAgCache.set(agg.column, tmp);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
/** Helper per spostare un oggetto di un array da un indice all'altro, in place */
|
|
49
|
-
arrayMove(array, oldI, newI) {
|
|
50
|
-
if (newI > array.length - 1 || oldI > array.length - 1 || newI < 0 || oldI < 0)
|
|
51
|
-
throw "Gli indici passati non fanno riferimento a una posizione dell'array. Length: " + array.length + " Old:" + oldI + " New: " + newI;
|
|
52
|
-
array.splice(newI, 0, array.splice(oldI, 1)[0]);
|
|
53
|
-
}
|
|
54
|
-
/**
|
|
55
|
-
* Date le informazioni di paginazione ottiene l'array dei pulsanti
|
|
56
|
-
*
|
|
57
|
-
* @param {number} maxBtns Numero massimo di pulsanti da visualizzare
|
|
58
|
-
* @param {number} page Pagina corrente
|
|
59
|
-
* @param {number} lastPage Ultima pagina disponibile
|
|
60
|
-
*
|
|
61
|
-
* @returns {any[]} Pseudo-array di pulsanti a cui ci si può bindare lato HTML
|
|
62
|
-
*/
|
|
63
|
-
getPagesArray(maxBtns, page, lastPage, actualCount = null, ipp = null) {
|
|
64
|
-
let result = [];
|
|
65
|
-
// Se sono in modalità "Numero di pagine ed oggetti sconosciuti" faccio in modo di mostrare la pagina successiva solo se gli items effettivamente pervenuti
|
|
66
|
-
// sono uguali alla paginazione attuale (cioè questa pagina è di sicuro riempita completamente)
|
|
67
|
-
if (lastPage == -1 && ((actualCount == null && ipp == null) || (actualCount == ipp)))
|
|
68
|
-
lastPage = page + 1;
|
|
69
|
-
// Se sono in modalità "Numero di pagine ed oggetti sconosciuti" e mi arrivano 0 oggetti significa che l'ultima pagina è la precedente e non mostro pagine oltre
|
|
70
|
-
if (lastPage == -1 && actualCount == 0)
|
|
71
|
-
lastPage = page;
|
|
72
|
-
let min, max;
|
|
73
|
-
if (lastPage <= maxBtns) {
|
|
74
|
-
min = 1;
|
|
75
|
-
max = lastPage - 1;
|
|
76
|
-
}
|
|
77
|
-
else {
|
|
78
|
-
// tolgo la pagina selected è l'ultima pagina che è quella delle pagine totali
|
|
79
|
-
let rangeOutside = (maxBtns - 2) / 2;
|
|
80
|
-
min = page - rangeOutside;
|
|
81
|
-
max = page + rangeOutside;
|
|
82
|
-
if (min < 1) {
|
|
83
|
-
min = 1;
|
|
84
|
-
max = maxBtns - 1;
|
|
85
|
-
}
|
|
86
|
-
else if (max >= lastPage) {
|
|
87
|
-
min = lastPage - maxBtns + 1;
|
|
88
|
-
max = lastPage - 1;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
result.push({ val: 1, cssClass: (1 === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
92
|
-
if (max >= min) {
|
|
93
|
-
for (let i = min; i <= max; i++)
|
|
94
|
-
if (i !== 1)
|
|
95
|
-
result.push({ val: i, cssClass: (i === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
96
|
-
result.push({ val: lastPage, cssClass: (lastPage === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
97
|
-
}
|
|
98
|
-
return result;
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Calcola l'hash di un oggetto qualsiasi
|
|
102
|
-
*
|
|
103
|
-
* @param {any[]} items Oggetti per cui calcolare l'hash
|
|
104
|
-
*/
|
|
105
|
-
calculateHash(items) {
|
|
106
|
-
if (!items)
|
|
107
|
-
return;
|
|
108
|
-
// Supporto a hash duplicati di oggetti uguali
|
|
109
|
-
let usedHashesCache = {};
|
|
110
|
-
for (let i = 0; i < items.length; i++) {
|
|
111
|
-
let item = items[i];
|
|
112
|
-
// Prima di calcolare l'hash rimuovo le proprietà interne per evitare che mi scompensino i calcoli successivi
|
|
113
|
-
let tmp = Object.assign({}, items[i]);
|
|
114
|
-
delete tmp._selected;
|
|
115
|
-
delete tmp._visible;
|
|
116
|
-
delete tmp._hash;
|
|
117
|
-
delete tmp._ordinal;
|
|
118
|
-
let hash = this.hashExts.hashObject(tmp);
|
|
119
|
-
usedHashesCache[hash] = usedHashesCache[hash] ? usedHashesCache[hash] + 1 : 1;
|
|
120
|
-
item._hash = hash + (usedHashesCache[hash] > 1 ? "_" + usedHashesCache[hash] : "");
|
|
121
|
-
item._ordinal = i;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Se l'Input è null (valore non settato) vede se c'è un default con cui valorizzarlo. Se non c'è utilizza il valore di fallback (qualora fornito)
|
|
126
|
-
*
|
|
127
|
-
* @param {T} inputValue Valore dell'Input
|
|
128
|
-
* @param {T} defaultValue Valore di default impostato da configurazione
|
|
129
|
-
* @param {T} fallbackValue Valore dell'Input per quando non è stato assegnato dal programmatore e non ha un default
|
|
130
|
-
*/
|
|
131
|
-
InputOrDefault(inputValue, defaultValue, fallbackValue) {
|
|
132
|
-
// Input valorizzato dal programmatore
|
|
133
|
-
if (inputValue != null && inputValue != undefined)
|
|
134
|
-
return inputValue;
|
|
135
|
-
// Input valorizzato da configurazione globale
|
|
136
|
-
if (defaultValue != null && defaultValue != undefined)
|
|
137
|
-
return defaultValue;
|
|
138
|
-
//Input non valorizzato da niente e da nessuno
|
|
139
|
-
if (fallbackValue != null && fallbackValue != undefined)
|
|
140
|
-
return fallbackValue;
|
|
141
|
-
// I casi in cui si arriva qui sono i casi di Input che di default va bene che siano nulli e che nessuno si caga
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
145
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
146
|
-
}
|
|
147
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
148
|
-
type: Injectable,
|
|
149
|
-
args: [{ providedIn: 'root' }]
|
|
150
|
-
}], ctorParameters:
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbGl0aWVzSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29yZS9oYW5kbGVycy9VdGlsaXRpZXNIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsMkNBQTJDO0FBRTNDLE1BQU0sT0FBTyxnQkFBZ0I7SUFFekIsMEJBQTBCO0lBQzFCLFlBQW9CLFFBQXdCO1FBQXhCLGFBQVEsR0FBUixRQUFRLENBQWdCO0lBQUksQ0FBQztJQUVqRDs7Ozs7Ozs7T0FRRztJQUNJLE9BQU8sQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUN0QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNuQyxJQUFJLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDakIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqRDtRQUNELE9BQU8sR0FBRyxDQUFDO0lBQ2YsQ0FBQztJQUFBLENBQUM7SUFFRjs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsS0FBVTtRQUN6QixLQUFNLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM1QyxJQUFJLGFBQWEsR0FBNEMsS0FBTSxDQUFDLGtCQUFtQixDQUFDO1FBQ3hGLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsWUFBWSxD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c291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIExpYnJlcmllXHJcbmltcG9ydCB7IEhhc2hpbmdTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vKiogQ2xhc3NlIGRpIHV0aWxpdMOgIHBlciBsZSBjb3NlIGNvbXVuaSAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVXRpbGl0aWVzSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaGFzaEV4dHM6IEhhc2hpbmdTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZWZmZXR0dWEgZGVpIHJhZ2dydXBwYW1lbnRpIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICoqZmllbGQqKiwgXHJcbiAgICAgKiByZXN0aXR1ZW5kbyB1biBvZ2dldHRvIGRlbCB0aXBvIHsgR3J1cHBvMTogb2dnZXR0aVtdLCBHcnVwcG8yOiBvZ2dldHRpW10sIGVjYy4uLiB9XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyYXkgTGlzdGEgZGVnbGkgb2dnZXR0aSBkYSByYWdncnVwcGFyZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIENhbXBvIHN1IGN1aSBlZmZldHR1YXJlIGkgcmFnZ3J1cHBhbWVudGlcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7eyBbaWQ6IHN0cmluZ106IGFueVtdIH19IERpemlvbmFyaW8gZGVpIGdydXBwaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBCeShhcnJheTogYW55W10sIGZpZWxkOiBzdHJpbmcpOiB7IFtpZDogc3RyaW5nXTogYW55W107IH0ge1xyXG4gICAgICAgIGxldCByZXQgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB4ID0gYXJyYXlbaV07XHJcbiAgICAgICAgICAgIChyZXRbeFtmaWVsZF1dID0gcmV0W3hbZmllbGRdXSB8fCBbXSkucHVzaCh4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGVmZmV0dHVhcmUgaWwgY2FjaGluZyBkZWxsZSBhZ2dyZWdhemlvbmkuIExlIHNwb3N0YSBkYSB1bmEgbGlzdGEgZGkgKipHcm91cEFnZ3JlZ2F0aW9uKiogYSB1bmEgKio8TWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gZGkgY3VpIGNhY2hhcmUgbGUgYWdncmVnYXppb25pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWNoZUFnZ3JlZ2F0aW9ucyhncm91cDogYW55KSB7XHJcbiAgICAgICAgKDxhbnk+Z3JvdXApLl9hZ2dyZWdhdGlvbnNDYWNoZSA9IG5ldyBNYXAoKTtcclxuICAgICAgICBsZXQgY2FzdGVkQWdDYWNoZSA9ICg8TWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4+KDxhbnk+Z3JvdXApLl9hZ2dyZWdhdGlvbnNDYWNoZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cC5hZ2dyZWdhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGFnZyA9IGdyb3VwLmFnZ3JlZ2F0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKGNhc3RlZEFnQ2FjaGUuaGFzKGFnZy5jb2x1bW4pKVxyXG4gICAgICAgICAgICAgICAgY2FzdGVkQWdDYWNoZS5nZXQoYWdnLmNvbHVtbikuc2V0KGFnZy5hZ2dyZWdhdGlvbiwgYWdnLnZhbHVlKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdG1wLnNldChhZ2cuYWdncmVnYXRpb24sIGFnZy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjYXN0ZWRBZ0NhY2hlLnNldChhZ2cuY29sdW1uLCB0bXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgcGVyIHNwb3N0YXJlIHVuIG9nZ2V0dG8gZGkgdW4gYXJyYXkgZGEgdW4gaW5kaWNlIGFsbCdhbHRybywgaW4gcGxhY2UgKi9cclxuICAgIHB1YmxpYyBhcnJheU1vdmUoYXJyYXk6IGFueVtdLCBvbGRJOiBudW1iZXIsIG5ld0k6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChuZXdJID4gYXJyYXkubGVuZ3RoIC0gMSB8fCBvbGRJID4gYXJyYXkubGVuZ3RoIC0gMSB8fCBuZXdJIDwgMCB8fCBvbGRJIDwgMClcclxuICAgICAgICAgICAgdGhyb3cgXCJHbGkgaW5kaWNpIHBhc3NhdGkgbm9uIGZhbm5vIHJpZmVyaW1lbnRvIGEgdW5hIHBvc2l6aW9uZSBkZWxsJ2FycmF5LiBMZW5ndGg6IFwiICsgYXJyYXkubGVuZ3RoICsgXCIgT2xkOlwiICsgb2xkSSArIFwiIE5ldzogXCIgKyBuZXdJO1xyXG5cclxuICAgICAgICBhcnJheS5zcGxpY2UobmV3SSwgMCwgYXJyYXkuc3BsaWNlKG9sZEksIDEpWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lIG90dGllbmUgbCdhcnJheSBkZWkgcHVsc2FudGlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4QnRucyBOdW1lcm8gbWFzc2ltbyBkaSBwdWxzYW50aSBkYSB2aXN1YWxpenphcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBjb3JyZW50ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhc3RQYWdlIFVsdGltYSBwYWdpbmEgZGlzcG9uaWJpbGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7YW55W119IFBzZXVkby1hcnJheSBkaSBwdWxzYW50aSBhIGN1aSBjaSBzaSBwdcOyIGJpbmRhcmUgbGF0byBIVE1MXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYWdlc0FycmF5KG1heEJ0bnM6IG51bWJlciwgcGFnZTogbnVtYmVyLCBsYXN0UGFnZTogbnVtYmVyLCBhY3R1YWxDb3VudDogbnVtYmVyID0gbnVsbCwgaXBwOiBudW1iZXIgPSBudWxsKTogeyB2YWw6IG51bWJlciwgY3NzQ2xhc3M6IHN0cmluZyB9W10ge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHsgdmFsOiBudW1iZXIsIGNzc0NsYXNzOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIFNlIHNvbm8gaW4gbW9kYWxpdMOgIFwiTnVtZXJvIGRpIHBhZ2luZSBlZCBvZ2dldHRpIHNjb25vc2NpdXRpXCIgZmFjY2lvIGluIG1vZG8gZGkgbW9zdHJhcmUgbGEgcGFnaW5hIHN1Y2Nlc3NpdmEgc29sbyBzZSBnbGkgaXRlbXMgZWZmZXR0aXZhbWVudGUgcGVydmVudXRpXHJcbiAgICAgICAgLy8gc29ubyB1Z3VhbGkgYWxsYSBwYWdpbmF6aW9uZSBhdHR1YWxlIChjaW/DqCBxdWVzdGEgcGFnaW5hIMOoIGRpIHNpY3VybyByaWVtcGl0YSBjb21wbGV0YW1lbnRlKVxyXG4gICAgICAgIGlmIChsYXN0UGFnZSA9PSAtMSAmJiAoKGFjdHVhbENvdW50ID09IG51bGwgJiYgaXBwID09IG51bGwpIHx8IChhY3R1YWxDb3VudCA9PSBpcHApKSlcclxuICAgICAgICAgICAgbGFzdFBhZ2UgPSBwYWdlICsgMTtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgXCJOdW1lcm8gZGkgcGFnaW5lIGVkIG9nZ2V0dGkgc2Nvbm9zY2l1dGlcIiBlIG1pIGFycml2YW5vIDAgb2dnZXR0aSBzaWduaWZpY2EgY2hlIGwndWx0aW1hIHBhZ2luYSDDqCBsYSBwcmVjZWRlbnRlIGUgbm9uIG1vc3RybyBwYWdpbmUgb2x0cmVcclxuICAgICAgICBpZiAobGFzdFBhZ2UgPT0gLTEgJiYgYWN0dWFsQ291bnQgPT0gMClcclxuICAgICAgICAgICAgbGFzdFBhZ2UgPSBwYWdlO1xyXG5cclxuICAgICAgICBsZXQgbWluOiBudW1iZXIsIG1heDogbnVtYmVyO1xyXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSBtYXhCdG5zKSB7XHJcbiAgICAgICAgICAgIG1pbiA9IDE7XHJcbiAgICAgICAgICAgIG1heCA9IGxhc3RQYWdlIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0b2xnbyBsYSBwYWdpbmEgc2VsZWN0ZWQgw6ggbCd1bHRpbWEgcGFnaW5hIGNoZSDDqCBxdWVsbGEgZGVsbGUgcGFnaW5lIHRvdGFsaVxyXG4gICAgICAgICAgICBsZXQgcmFuZ2VPdXRzaWRlID0gKG1heEJ0bnMgLSAyKSAvIDI7XHJcblxyXG4gICAgICAgICAgICBtaW4gPSBwYWdlIC0gcmFuZ2VPdXRzaWRlO1xyXG4gICAgICAgICAgICBtYXggPSBwYWdlICsgcmFuZ2VPdXRzaWRlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1pbiA8IDEpIHtcclxuICAgICAgICAgICAgICAgIG1pbiA9IDE7XHJcbiAgICAgICAgICAgICAgICBtYXggPSBtYXhCdG5zIC0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXggPj0gbGFzdFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIG1pbiA9IGxhc3RQYWdlIC0gbWF4QnRucyArIDE7XHJcbiAgICAgICAgICAgICAgICBtYXggPSBsYXN0UGFnZSAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiAxLCBjc3NDbGFzczogKDEgPT09IHBhZ2UgPyAnYnRuLW1haW4gYXBwLXdoaXRlLXRleHQnIDogJ2FwcC13aGl0ZS1idXR0b24nKSB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1heCA+PSBtaW4pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1pbjsgaSA8PSBtYXg7IGkrKylcclxuICAgICAgICAgICAgICAgIGlmIChpICE9PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiBpLCBjc3NDbGFzczogKGkgPT09IHBhZ2UgPyAnYnRuLW1haW4gYXBwLXdoaXRlLXRleHQnIDogJ2FwcC13aGl0ZS1idXR0b24nKSB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiBsYXN0UGFnZSwgY3NzQ2xhc3M6IChsYXN0UGFnZSA9PT0gcGFnZSA/ICdidG4tbWFpbiBhcHAtd2hpdGUtdGV4dCcgOiAnYXBwLXdoaXRlLWJ1dHRvbicpIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY29sYSBsJ2hhc2ggZGkgdW4gb2dnZXR0byBxdWFsc2lhc2lcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIHBlciBjdWkgY2FsY29sYXJlIGwnaGFzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlSGFzaChpdGVtczogYW55W10pIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN1cHBvcnRvIGEgaGFzaCBkdXBsaWNhdGkgZGkgb2dnZXR0aSB1Z3VhbGlcclxuICAgICAgICBsZXQgdXNlZEhhc2hlc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyOyB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJpbWEgZGkgY2FsY29sYXJlIGwnaGFzaCByaW11b3ZvIGxlIHByb3ByaWV0w6AgaW50ZXJuZSBwZXIgZXZpdGFyZSBjaGUgbWkgc2NvbXBlbnNpbm8gaSBjYWxjb2xpIHN1Y2Nlc3NpdmlcclxuICAgICAgICAgICAgbGV0IHRtcCA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRtcC5fc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX3Zpc2libGU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX2hhc2g7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX29yZGluYWw7XHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gdGhpcy5oYXNoRXh0cy5oYXNoT2JqZWN0KHRtcCk7XHJcblxyXG4gICAgICAgICAgICB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gPSB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gPyB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gKyAxIDogMTtcclxuICAgICAgICAgICAgaXRlbS5faGFzaCA9IGhhc2ggKyAodXNlZEhhc2hlc0NhY2hlW2hhc2hdID4gMSA/IFwiX1wiICsgdXNlZEhhc2hlc0NhY2hlW2hhc2hdIDogXCJcIik7XHJcbiAgICAgICAgICAgIGl0ZW0uX29yZGluYWwgPSBpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2UgbCdJbnB1dCDDqCBudWxsICh2YWxvcmUgbm9uIHNldHRhdG8pIHZlZGUgc2UgYyfDqCB1biBkZWZhdWx0IGNvbiBjdWkgdmFsb3JpenphcmxvLiBTZSBub24gYyfDqCB1dGlsaXp6YSBpbCB2YWxvcmUgZGkgZmFsbGJhY2sgKHF1YWxvcmEgZm9ybml0bylcclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7VH0gaW5wdXRWYWx1ZSBWYWxvcmUgZGVsbCdJbnB1dFxyXG4gICAgKiBAcGFyYW0ge1R9IGRlZmF1bHRWYWx1ZSBWYWxvcmUgZGkgZGVmYXVsdCBpbXBvc3RhdG8gZGEgY29uZmlndXJhemlvbmVcclxuICAgICogQHBhcmFtIHtUfSBmYWxsYmFja1ZhbHVlIFZhbG9yZSBkZWxsJ0lucHV0IHBlciBxdWFuZG8gbm9uIMOoIHN0YXRvIGFzc2VnbmF0byBkYWwgcHJvZ3JhbW1hdG9yZSBlIG5vbiBoYSB1biBkZWZhdWx0XHJcbiAgICAqL1xyXG4gICAgcHVibGljIElucHV0T3JEZWZhdWx0PFQ+KGlucHV0VmFsdWU6IFQsIGRlZmF1bHRWYWx1ZTogVCwgZmFsbGJhY2tWYWx1ZT86IFQpIHtcclxuXHJcbiAgICAgICAgLy8gSW5wdXQgdmFsb3JpenphdG8gZGFsIHByb2dyYW1tYXRvcmVcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSAhPSBudWxsICYmIGlucHV0VmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8gSW5wdXQgdmFsb3JpenphdG8gZGEgY29uZmlndXJhemlvbmUgZ2xvYmFsZVxyXG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAvL0lucHV0IG5vbiB2YWxvcml6emF0byBkYSBuaWVudGUgZSBkYSBuZXNzdW5vXHJcbiAgICAgICAgaWYgKGZhbGxiYWNrVmFsdWUgIT0gbnVsbCAmJiBmYWxsYmFja1ZhbHVlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XHJcblxyXG4gICAgICAgIC8vIEkgY2FzaSBpbiBjdWkgc2kgYXJyaXZhIHF1aSBzb25vIGkgY2FzaSBkaSBJbnB1dCBjaGUgZGkgZGVmYXVsdCB2YSBiZW5lIGNoZSBzaWFubyBudWxsaSBlIGNoZSBuZXNzdW5vIHNpIGNhZ2FcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
1
|
+
// Angular
|
|
2
|
+
import { Injectable } from "@angular/core";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@esfaenza/extensions";
|
|
5
|
+
/** Classe di utilità per le cose comuni */
|
|
6
|
+
export class UtilitiesHandler {
|
|
7
|
+
/** @ignore Costruttore */
|
|
8
|
+
constructor(hashExts) {
|
|
9
|
+
this.hashExts = hashExts;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Data una lista di oggetti effettua dei raggruppamenti in base alla proprietà **field**,
|
|
13
|
+
* restituendo un oggetto del tipo { Gruppo1: oggetti[], Gruppo2: oggetti[], ecc... }
|
|
14
|
+
*
|
|
15
|
+
* @param {any[]} array Lista degli oggetti da raggruppare
|
|
16
|
+
* @param {string} field Campo su cui effettuare i raggruppamenti
|
|
17
|
+
*
|
|
18
|
+
* @returns {{ [id: string]: any[] }} Dizionario dei gruppi
|
|
19
|
+
*/
|
|
20
|
+
groupBy(array, field) {
|
|
21
|
+
let ret = {};
|
|
22
|
+
for (let i = 0; i < array.length; i++) {
|
|
23
|
+
let x = array[i];
|
|
24
|
+
(ret[x[field]] = ret[x[field]] || []).push(x);
|
|
25
|
+
}
|
|
26
|
+
return ret;
|
|
27
|
+
}
|
|
28
|
+
;
|
|
29
|
+
/**
|
|
30
|
+
* Helper per effettuare il caching delle aggregazioni. Le sposta da una lista di **GroupAggregation** a una **<Map<string, Map<string, string>>**
|
|
31
|
+
*
|
|
32
|
+
* @param {any} group Gruppo di cui cachare le aggregazioni
|
|
33
|
+
*/
|
|
34
|
+
cacheAggregations(group) {
|
|
35
|
+
group._aggregationsCache = new Map();
|
|
36
|
+
let castedAgCache = group._aggregationsCache;
|
|
37
|
+
for (let i = 0; i < group.aggregations.length; i++) {
|
|
38
|
+
let agg = group.aggregations[i];
|
|
39
|
+
if (castedAgCache.has(agg.column))
|
|
40
|
+
castedAgCache.get(agg.column).set(agg.aggregation, agg.value);
|
|
41
|
+
else {
|
|
42
|
+
let tmp = new Map();
|
|
43
|
+
tmp.set(agg.aggregation, agg.value);
|
|
44
|
+
castedAgCache.set(agg.column, tmp);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** Helper per spostare un oggetto di un array da un indice all'altro, in place */
|
|
49
|
+
arrayMove(array, oldI, newI) {
|
|
50
|
+
if (newI > array.length - 1 || oldI > array.length - 1 || newI < 0 || oldI < 0)
|
|
51
|
+
throw "Gli indici passati non fanno riferimento a una posizione dell'array. Length: " + array.length + " Old:" + oldI + " New: " + newI;
|
|
52
|
+
array.splice(newI, 0, array.splice(oldI, 1)[0]);
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Date le informazioni di paginazione ottiene l'array dei pulsanti
|
|
56
|
+
*
|
|
57
|
+
* @param {number} maxBtns Numero massimo di pulsanti da visualizzare
|
|
58
|
+
* @param {number} page Pagina corrente
|
|
59
|
+
* @param {number} lastPage Ultima pagina disponibile
|
|
60
|
+
*
|
|
61
|
+
* @returns {any[]} Pseudo-array di pulsanti a cui ci si può bindare lato HTML
|
|
62
|
+
*/
|
|
63
|
+
getPagesArray(maxBtns, page, lastPage, actualCount = null, ipp = null) {
|
|
64
|
+
let result = [];
|
|
65
|
+
// Se sono in modalità "Numero di pagine ed oggetti sconosciuti" faccio in modo di mostrare la pagina successiva solo se gli items effettivamente pervenuti
|
|
66
|
+
// sono uguali alla paginazione attuale (cioè questa pagina è di sicuro riempita completamente)
|
|
67
|
+
if (lastPage == -1 && ((actualCount == null && ipp == null) || (actualCount == ipp)))
|
|
68
|
+
lastPage = page + 1;
|
|
69
|
+
// Se sono in modalità "Numero di pagine ed oggetti sconosciuti" e mi arrivano 0 oggetti significa che l'ultima pagina è la precedente e non mostro pagine oltre
|
|
70
|
+
if (lastPage == -1 && actualCount == 0)
|
|
71
|
+
lastPage = page;
|
|
72
|
+
let min, max;
|
|
73
|
+
if (lastPage <= maxBtns) {
|
|
74
|
+
min = 1;
|
|
75
|
+
max = lastPage - 1;
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// tolgo la pagina selected è l'ultima pagina che è quella delle pagine totali
|
|
79
|
+
let rangeOutside = (maxBtns - 2) / 2;
|
|
80
|
+
min = page - rangeOutside;
|
|
81
|
+
max = page + rangeOutside;
|
|
82
|
+
if (min < 1) {
|
|
83
|
+
min = 1;
|
|
84
|
+
max = maxBtns - 1;
|
|
85
|
+
}
|
|
86
|
+
else if (max >= lastPage) {
|
|
87
|
+
min = lastPage - maxBtns + 1;
|
|
88
|
+
max = lastPage - 1;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
result.push({ val: 1, cssClass: (1 === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
92
|
+
if (max >= min) {
|
|
93
|
+
for (let i = min; i <= max; i++)
|
|
94
|
+
if (i !== 1)
|
|
95
|
+
result.push({ val: i, cssClass: (i === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
96
|
+
result.push({ val: lastPage, cssClass: (lastPage === page ? 'btn-main app-white-text' : 'app-white-button') });
|
|
97
|
+
}
|
|
98
|
+
return result;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Calcola l'hash di un oggetto qualsiasi
|
|
102
|
+
*
|
|
103
|
+
* @param {any[]} items Oggetti per cui calcolare l'hash
|
|
104
|
+
*/
|
|
105
|
+
calculateHash(items) {
|
|
106
|
+
if (!items)
|
|
107
|
+
return;
|
|
108
|
+
// Supporto a hash duplicati di oggetti uguali
|
|
109
|
+
let usedHashesCache = {};
|
|
110
|
+
for (let i = 0; i < items.length; i++) {
|
|
111
|
+
let item = items[i];
|
|
112
|
+
// Prima di calcolare l'hash rimuovo le proprietà interne per evitare che mi scompensino i calcoli successivi
|
|
113
|
+
let tmp = Object.assign({}, items[i]);
|
|
114
|
+
delete tmp._selected;
|
|
115
|
+
delete tmp._visible;
|
|
116
|
+
delete tmp._hash;
|
|
117
|
+
delete tmp._ordinal;
|
|
118
|
+
let hash = this.hashExts.hashObject(tmp);
|
|
119
|
+
usedHashesCache[hash] = usedHashesCache[hash] ? usedHashesCache[hash] + 1 : 1;
|
|
120
|
+
item._hash = hash + (usedHashesCache[hash] > 1 ? "_" + usedHashesCache[hash] : "");
|
|
121
|
+
item._ordinal = i;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Se l'Input è null (valore non settato) vede se c'è un default con cui valorizzarlo. Se non c'è utilizza il valore di fallback (qualora fornito)
|
|
126
|
+
*
|
|
127
|
+
* @param {T} inputValue Valore dell'Input
|
|
128
|
+
* @param {T} defaultValue Valore di default impostato da configurazione
|
|
129
|
+
* @param {T} fallbackValue Valore dell'Input per quando non è stato assegnato dal programmatore e non ha un default
|
|
130
|
+
*/
|
|
131
|
+
InputOrDefault(inputValue, defaultValue, fallbackValue) {
|
|
132
|
+
// Input valorizzato dal programmatore
|
|
133
|
+
if (inputValue != null && inputValue != undefined)
|
|
134
|
+
return inputValue;
|
|
135
|
+
// Input valorizzato da configurazione globale
|
|
136
|
+
if (defaultValue != null && defaultValue != undefined)
|
|
137
|
+
return defaultValue;
|
|
138
|
+
//Input non valorizzato da niente e da nessuno
|
|
139
|
+
if (fallbackValue != null && fallbackValue != undefined)
|
|
140
|
+
return fallbackValue;
|
|
141
|
+
// I casi in cui si arriva qui sono i casi di Input che di default va bene che siano nulli e che nessuno si caga
|
|
142
|
+
return null;
|
|
143
|
+
}
|
|
144
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilitiesHandler, deps: [{ token: i1.HashingService }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
145
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilitiesHandler, providedIn: 'root' }); }
|
|
146
|
+
}
|
|
147
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: UtilitiesHandler, decorators: [{
|
|
148
|
+
type: Injectable,
|
|
149
|
+
args: [{ providedIn: 'root' }]
|
|
150
|
+
}], ctorParameters: () => [{ type: i1.HashingService }] });
|
|
151
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbGl0aWVzSGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvY29yZS9oYW5kbGVycy9VdGlsaXRpZXNIYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFVBQVU7QUFDVixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFLM0MsMkNBQTJDO0FBRTNDLE1BQU0sT0FBTyxnQkFBZ0I7SUFFekIsMEJBQTBCO0lBQzFCLFlBQW9CLFFBQXdCO1FBQXhCLGFBQVEsR0FBUixRQUFRLENBQWdCO0lBQUksQ0FBQztJQUVqRDs7Ozs7Ozs7T0FRRztJQUNJLE9BQU8sQ0FBQyxLQUFZLEVBQUUsS0FBYTtRQUN0QyxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xELENBQUM7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFBQSxDQUFDO0lBRUY7Ozs7T0FJRztJQUNJLGlCQUFpQixDQUFDLEtBQVU7UUFDekIsS0FBTSxDQUFDLGtCQUFrQixHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDNUMsSUFBSSxhQUFhLEdBQTRDLEtBQU0sQ0FBQyxrQkFBbUIsQ0FBQztRQUN4RixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxD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QkFBZ0I7bUhBQWhCLGdCQUFnQixjQURILE1BQU07OzRGQUNuQixnQkFBZ0I7a0JBRDVCLFVBQVU7bUJBQUMsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhclxyXG5pbXBvcnQgeyBJbmplY3RhYmxlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcclxuXHJcbi8vIExpYnJlcmllXHJcbmltcG9ydCB7IEhhc2hpbmdTZXJ2aWNlIH0gZnJvbSBcIkBlc2ZhZW56YS9leHRlbnNpb25zXCI7XHJcblxyXG4vKiogQ2xhc3NlIGRpIHV0aWxpdMOgIHBlciBsZSBjb3NlIGNvbXVuaSAqL1xyXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46ICdyb290JyB9KVxyXG5leHBvcnQgY2xhc3MgVXRpbGl0aWVzSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgaGFzaEV4dHM6IEhhc2hpbmdTZXJ2aWNlKSB7IH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGEgdW5hIGxpc3RhIGRpIG9nZ2V0dGkgZWZmZXR0dWEgZGVpIHJhZ2dydXBwYW1lbnRpIGluIGJhc2UgYWxsYSBwcm9wcmlldMOgICoqZmllbGQqKiwgXHJcbiAgICAgKiByZXN0aXR1ZW5kbyB1biBvZ2dldHRvIGRlbCB0aXBvIHsgR3J1cHBvMTogb2dnZXR0aVtdLCBHcnVwcG8yOiBvZ2dldHRpW10sIGVjYy4uLiB9XHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gYXJyYXkgTGlzdGEgZGVnbGkgb2dnZXR0aSBkYSByYWdncnVwcGFyZVxyXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGZpZWxkIENhbXBvIHN1IGN1aSBlZmZldHR1YXJlIGkgcmFnZ3J1cHBhbWVudGlcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7eyBbaWQ6IHN0cmluZ106IGFueVtdIH19IERpemlvbmFyaW8gZGVpIGdydXBwaVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZ3JvdXBCeShhcnJheTogYW55W10sIGZpZWxkOiBzdHJpbmcpOiB7IFtpZDogc3RyaW5nXTogYW55W107IH0ge1xyXG4gICAgICAgIGxldCByZXQgPSB7fTtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCB4ID0gYXJyYXlbaV07XHJcbiAgICAgICAgICAgIChyZXRbeFtmaWVsZF1dID0gcmV0W3hbZmllbGRdXSB8fCBbXSkucHVzaCh4KTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHJldDtcclxuICAgIH07XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBIZWxwZXIgcGVyIGVmZmV0dHVhcmUgaWwgY2FjaGluZyBkZWxsZSBhZ2dyZWdhemlvbmkuIExlIHNwb3N0YSBkYSB1bmEgbGlzdGEgZGkgKipHcm91cEFnZ3JlZ2F0aW9uKiogYSB1bmEgKio8TWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4qKlxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55fSBncm91cCBHcnVwcG8gZGkgY3VpIGNhY2hhcmUgbGUgYWdncmVnYXppb25pXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBjYWNoZUFnZ3JlZ2F0aW9ucyhncm91cDogYW55KSB7XHJcbiAgICAgICAgKDxhbnk+Z3JvdXApLl9hZ2dyZWdhdGlvbnNDYWNoZSA9IG5ldyBNYXAoKTtcclxuICAgICAgICBsZXQgY2FzdGVkQWdDYWNoZSA9ICg8TWFwPHN0cmluZywgTWFwPHN0cmluZywgc3RyaW5nPj4+KDxhbnk+Z3JvdXApLl9hZ2dyZWdhdGlvbnNDYWNoZSk7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBncm91cC5hZ2dyZWdhdGlvbnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IGFnZyA9IGdyb3VwLmFnZ3JlZ2F0aW9uc1tpXTtcclxuICAgICAgICAgICAgaWYgKGNhc3RlZEFnQ2FjaGUuaGFzKGFnZy5jb2x1bW4pKVxyXG4gICAgICAgICAgICAgICAgY2FzdGVkQWdDYWNoZS5nZXQoYWdnLmNvbHVtbikuc2V0KGFnZy5hZ2dyZWdhdGlvbiwgYWdnLnZhbHVlKTtcclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICBsZXQgdG1wOiBNYXA8c3RyaW5nLCBzdHJpbmc+ID0gbmV3IE1hcCgpO1xyXG4gICAgICAgICAgICAgICAgdG1wLnNldChhZ2cuYWdncmVnYXRpb24sIGFnZy52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjYXN0ZWRBZ0NhY2hlLnNldChhZ2cuY29sdW1uLCB0bXApO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKiBIZWxwZXIgcGVyIHNwb3N0YXJlIHVuIG9nZ2V0dG8gZGkgdW4gYXJyYXkgZGEgdW4gaW5kaWNlIGFsbCdhbHRybywgaW4gcGxhY2UgKi9cclxuICAgIHB1YmxpYyBhcnJheU1vdmUoYXJyYXk6IGFueVtdLCBvbGRJOiBudW1iZXIsIG5ld0k6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChuZXdJID4gYXJyYXkubGVuZ3RoIC0gMSB8fCBvbGRJID4gYXJyYXkubGVuZ3RoIC0gMSB8fCBuZXdJIDwgMCB8fCBvbGRJIDwgMClcclxuICAgICAgICAgICAgdGhyb3cgXCJHbGkgaW5kaWNpIHBhc3NhdGkgbm9uIGZhbm5vIHJpZmVyaW1lbnRvIGEgdW5hIHBvc2l6aW9uZSBkZWxsJ2FycmF5LiBMZW5ndGg6IFwiICsgYXJyYXkubGVuZ3RoICsgXCIgT2xkOlwiICsgb2xkSSArIFwiIE5ldzogXCIgKyBuZXdJO1xyXG5cclxuICAgICAgICBhcnJheS5zcGxpY2UobmV3SSwgMCwgYXJyYXkuc3BsaWNlKG9sZEksIDEpWzBdKTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERhdGUgbGUgaW5mb3JtYXppb25pIGRpIHBhZ2luYXppb25lIG90dGllbmUgbCdhcnJheSBkZWkgcHVsc2FudGlcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4QnRucyBOdW1lcm8gbWFzc2ltbyBkaSBwdWxzYW50aSBkYSB2aXN1YWxpenphcmVcclxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlIFBhZ2luYSBjb3JyZW50ZVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxhc3RQYWdlIFVsdGltYSBwYWdpbmEgZGlzcG9uaWJpbGVcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7YW55W119IFBzZXVkby1hcnJheSBkaSBwdWxzYW50aSBhIGN1aSBjaSBzaSBwdcOyIGJpbmRhcmUgbGF0byBIVE1MXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBnZXRQYWdlc0FycmF5KG1heEJ0bnM6IG51bWJlciwgcGFnZTogbnVtYmVyLCBsYXN0UGFnZTogbnVtYmVyLCBhY3R1YWxDb3VudDogbnVtYmVyID0gbnVsbCwgaXBwOiBudW1iZXIgPSBudWxsKTogeyB2YWw6IG51bWJlciwgY3NzQ2xhc3M6IHN0cmluZyB9W10ge1xyXG4gICAgICAgIGxldCByZXN1bHQ6IHsgdmFsOiBudW1iZXIsIGNzc0NsYXNzOiBzdHJpbmcgfVtdID0gW107XHJcblxyXG4gICAgICAgIC8vIFNlIHNvbm8gaW4gbW9kYWxpdMOgIFwiTnVtZXJvIGRpIHBhZ2luZSBlZCBvZ2dldHRpIHNjb25vc2NpdXRpXCIgZmFjY2lvIGluIG1vZG8gZGkgbW9zdHJhcmUgbGEgcGFnaW5hIHN1Y2Nlc3NpdmEgc29sbyBzZSBnbGkgaXRlbXMgZWZmZXR0aXZhbWVudGUgcGVydmVudXRpXHJcbiAgICAgICAgLy8gc29ubyB1Z3VhbGkgYWxsYSBwYWdpbmF6aW9uZSBhdHR1YWxlIChjaW/DqCBxdWVzdGEgcGFnaW5hIMOoIGRpIHNpY3VybyByaWVtcGl0YSBjb21wbGV0YW1lbnRlKVxyXG4gICAgICAgIGlmIChsYXN0UGFnZSA9PSAtMSAmJiAoKGFjdHVhbENvdW50ID09IG51bGwgJiYgaXBwID09IG51bGwpIHx8IChhY3R1YWxDb3VudCA9PSBpcHApKSlcclxuICAgICAgICAgICAgbGFzdFBhZ2UgPSBwYWdlICsgMTtcclxuXHJcbiAgICAgICAgLy8gU2Ugc29ubyBpbiBtb2RhbGl0w6AgXCJOdW1lcm8gZGkgcGFnaW5lIGVkIG9nZ2V0dGkgc2Nvbm9zY2l1dGlcIiBlIG1pIGFycml2YW5vIDAgb2dnZXR0aSBzaWduaWZpY2EgY2hlIGwndWx0aW1hIHBhZ2luYSDDqCBsYSBwcmVjZWRlbnRlIGUgbm9uIG1vc3RybyBwYWdpbmUgb2x0cmVcclxuICAgICAgICBpZiAobGFzdFBhZ2UgPT0gLTEgJiYgYWN0dWFsQ291bnQgPT0gMClcclxuICAgICAgICAgICAgbGFzdFBhZ2UgPSBwYWdlO1xyXG5cclxuICAgICAgICBsZXQgbWluOiBudW1iZXIsIG1heDogbnVtYmVyO1xyXG4gICAgICAgIGlmIChsYXN0UGFnZSA8PSBtYXhCdG5zKSB7XHJcbiAgICAgICAgICAgIG1pbiA9IDE7XHJcbiAgICAgICAgICAgIG1heCA9IGxhc3RQYWdlIC0gMTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAvLyB0b2xnbyBsYSBwYWdpbmEgc2VsZWN0ZWQgw6ggbCd1bHRpbWEgcGFnaW5hIGNoZSDDqCBxdWVsbGEgZGVsbGUgcGFnaW5lIHRvdGFsaVxyXG4gICAgICAgICAgICBsZXQgcmFuZ2VPdXRzaWRlID0gKG1heEJ0bnMgLSAyKSAvIDI7XHJcblxyXG4gICAgICAgICAgICBtaW4gPSBwYWdlIC0gcmFuZ2VPdXRzaWRlO1xyXG4gICAgICAgICAgICBtYXggPSBwYWdlICsgcmFuZ2VPdXRzaWRlO1xyXG5cclxuICAgICAgICAgICAgaWYgKG1pbiA8IDEpIHtcclxuICAgICAgICAgICAgICAgIG1pbiA9IDE7XHJcbiAgICAgICAgICAgICAgICBtYXggPSBtYXhCdG5zIC0gMTtcclxuICAgICAgICAgICAgfSBlbHNlIGlmIChtYXggPj0gbGFzdFBhZ2UpIHtcclxuICAgICAgICAgICAgICAgIG1pbiA9IGxhc3RQYWdlIC0gbWF4QnRucyArIDE7XHJcbiAgICAgICAgICAgICAgICBtYXggPSBsYXN0UGFnZSAtIDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiAxLCBjc3NDbGFzczogKDEgPT09IHBhZ2UgPyAnYnRuLW1haW4gYXBwLXdoaXRlLXRleHQnIDogJ2FwcC13aGl0ZS1idXR0b24nKSB9KTtcclxuXHJcbiAgICAgICAgaWYgKG1heCA+PSBtaW4pIHtcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IG1pbjsgaSA8PSBtYXg7IGkrKylcclxuICAgICAgICAgICAgICAgIGlmIChpICE9PSAxKVxyXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiBpLCBjc3NDbGFzczogKGkgPT09IHBhZ2UgPyAnYnRuLW1haW4gYXBwLXdoaXRlLXRleHQnIDogJ2FwcC13aGl0ZS1idXR0b24nKSB9KTtcclxuXHJcbiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsgdmFsOiBsYXN0UGFnZSwgY3NzQ2xhc3M6IChsYXN0UGFnZSA9PT0gcGFnZSA/ICdidG4tbWFpbiBhcHAtd2hpdGUtdGV4dCcgOiAnYXBwLXdoaXRlLWJ1dHRvbicpIH0pO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ2FsY29sYSBsJ2hhc2ggZGkgdW4gb2dnZXR0byBxdWFsc2lhc2lcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge2FueVtdfSBpdGVtcyBPZ2dldHRpIHBlciBjdWkgY2FsY29sYXJlIGwnaGFzaFxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY2FsY3VsYXRlSGFzaChpdGVtczogYW55W10pIHtcclxuICAgICAgICBpZiAoIWl0ZW1zKVxyXG4gICAgICAgICAgICByZXR1cm47XHJcblxyXG4gICAgICAgIC8vIFN1cHBvcnRvIGEgaGFzaCBkdXBsaWNhdGkgZGkgb2dnZXR0aSB1Z3VhbGlcclxuICAgICAgICBsZXQgdXNlZEhhc2hlc0NhY2hlOiB7IFtpbmRleDogc3RyaW5nXTogbnVtYmVyOyB9ID0ge307XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgaXRlbSA9IGl0ZW1zW2ldO1xyXG5cclxuICAgICAgICAgICAgLy8gUHJpbWEgZGkgY2FsY29sYXJlIGwnaGFzaCByaW11b3ZvIGxlIHByb3ByaWV0w6AgaW50ZXJuZSBwZXIgZXZpdGFyZSBjaGUgbWkgc2NvbXBlbnNpbm8gaSBjYWxjb2xpIHN1Y2Nlc3NpdmlcclxuICAgICAgICAgICAgbGV0IHRtcCA9IE9iamVjdC5hc3NpZ24oe30sIGl0ZW1zW2ldKTtcclxuICAgICAgICAgICAgZGVsZXRlIHRtcC5fc2VsZWN0ZWQ7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX3Zpc2libGU7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX2hhc2g7XHJcbiAgICAgICAgICAgIGRlbGV0ZSB0bXAuX29yZGluYWw7XHJcbiAgICAgICAgICAgIGxldCBoYXNoID0gdGhpcy5oYXNoRXh0cy5oYXNoT2JqZWN0KHRtcCk7XHJcblxyXG4gICAgICAgICAgICB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gPSB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gPyB1c2VkSGFzaGVzQ2FjaGVbaGFzaF0gKyAxIDogMTtcclxuICAgICAgICAgICAgaXRlbS5faGFzaCA9IGhhc2ggKyAodXNlZEhhc2hlc0NhY2hlW2hhc2hdID4gMSA/IFwiX1wiICsgdXNlZEhhc2hlc0NhY2hlW2hhc2hdIDogXCJcIik7XHJcbiAgICAgICAgICAgIGl0ZW0uX29yZGluYWwgPSBpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICogU2UgbCdJbnB1dCDDqCBudWxsICh2YWxvcmUgbm9uIHNldHRhdG8pIHZlZGUgc2UgYyfDqCB1biBkZWZhdWx0IGNvbiBjdWkgdmFsb3JpenphcmxvLiBTZSBub24gYyfDqCB1dGlsaXp6YSBpbCB2YWxvcmUgZGkgZmFsbGJhY2sgKHF1YWxvcmEgZm9ybml0bylcclxuICAgICogXHJcbiAgICAqIEBwYXJhbSB7VH0gaW5wdXRWYWx1ZSBWYWxvcmUgZGVsbCdJbnB1dFxyXG4gICAgKiBAcGFyYW0ge1R9IGRlZmF1bHRWYWx1ZSBWYWxvcmUgZGkgZGVmYXVsdCBpbXBvc3RhdG8gZGEgY29uZmlndXJhemlvbmVcclxuICAgICogQHBhcmFtIHtUfSBmYWxsYmFja1ZhbHVlIFZhbG9yZSBkZWxsJ0lucHV0IHBlciBxdWFuZG8gbm9uIMOoIHN0YXRvIGFzc2VnbmF0byBkYWwgcHJvZ3JhbW1hdG9yZSBlIG5vbiBoYSB1biBkZWZhdWx0XHJcbiAgICAqL1xyXG4gICAgcHVibGljIElucHV0T3JEZWZhdWx0PFQ+KGlucHV0VmFsdWU6IFQsIGRlZmF1bHRWYWx1ZTogVCwgZmFsbGJhY2tWYWx1ZT86IFQpIHtcclxuXHJcbiAgICAgICAgLy8gSW5wdXQgdmFsb3JpenphdG8gZGFsIHByb2dyYW1tYXRvcmVcclxuICAgICAgICBpZiAoaW5wdXRWYWx1ZSAhPSBudWxsICYmIGlucHV0VmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZTtcclxuXHJcbiAgICAgICAgLy8gSW5wdXQgdmFsb3JpenphdG8gZGEgY29uZmlndXJhemlvbmUgZ2xvYmFsZVxyXG4gICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCAmJiBkZWZhdWx0VmFsdWUgIT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xyXG5cclxuICAgICAgICAvL0lucHV0IG5vbiB2YWxvcml6emF0byBkYSBuaWVudGUgZSBkYSBuZXNzdW5vXHJcbiAgICAgICAgaWYgKGZhbGxiYWNrVmFsdWUgIT0gbnVsbCAmJiBmYWxsYmFja1ZhbHVlICE9IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgcmV0dXJuIGZhbGxiYWNrVmFsdWU7XHJcblxyXG4gICAgICAgIC8vIEkgY2FzaSBpbiBjdWkgc2kgYXJyaXZhIHF1aSBzb25vIGkgY2FzaSBkaSBJbnB1dCBjaGUgZGkgZGVmYXVsdCB2YSBiZW5lIGNoZSBzaWFubyBudWxsaSBlIGNoZSBuZXNzdW5vIHNpIGNhZ2FcclxuICAgICAgICByZXR1cm4gbnVsbDtcclxuICAgIH1cclxufVxyXG4iXX0=
|
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
import { Directive, Input, Self } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */
|
|
4
|
-
export class EsTdDirective {
|
|
5
|
-
/**
|
|
6
|
-
* @ignore
|
|
7
|
-
*/
|
|
8
|
-
constructor(Template) {
|
|
9
|
-
this.Template = Template;
|
|
10
|
-
/** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsTdComponent */
|
|
11
|
-
this._directive = true;
|
|
12
|
-
/** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */
|
|
13
|
-
this._multi = false;
|
|
14
|
-
/** Indica se la cella è visibile o meno di default */
|
|
15
|
-
this.tdVisible = true;
|
|
16
|
-
/** Equivalente dell'NgIf sul td */
|
|
17
|
-
this.tdIf = true;
|
|
18
|
-
}
|
|
19
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
20
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
21
|
-
}
|
|
22
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
23
|
-
type: Directive,
|
|
24
|
-
args: [{ selector: '[td]' }]
|
|
25
|
-
}], ctorParameters:
|
|
26
|
-
type: Self
|
|
27
|
-
}] }]
|
|
28
|
-
type: Input
|
|
29
|
-
}], td: [{
|
|
30
|
-
type: Input
|
|
31
|
-
}], tdForProperty: [{
|
|
32
|
-
type: Input
|
|
33
|
-
}], tdIf: [{
|
|
34
|
-
type: Input
|
|
35
|
-
}], tdClass: [{
|
|
36
|
-
type: Input
|
|
37
|
-
}], tdPropertyAccessor: [{
|
|
38
|
-
type: Input
|
|
39
|
-
}], tdAlignment: [{
|
|
40
|
-
type: Input
|
|
41
|
-
}], tdFormat: [{
|
|
42
|
-
type: Input
|
|
43
|
-
}], tdIconClass: [{
|
|
44
|
-
type: Input
|
|
45
|
-
}], tdConditionField: [{
|
|
46
|
-
type: Input
|
|
47
|
-
}], tdConditionValue: [{
|
|
48
|
-
type: Input
|
|
49
|
-
}], tdTitle: [{
|
|
50
|
-
type: Input
|
|
51
|
-
}], tdContent: [{
|
|
52
|
-
type: Input
|
|
53
|
-
}] } });
|
|
54
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Directive, Input, Self } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/** Direttiva per la dichiarazione snella di un EsTd da emettere per ogni elemento, data una colonna */
|
|
4
|
+
export class EsTdDirective {
|
|
5
|
+
/**
|
|
6
|
+
* @ignore
|
|
7
|
+
*/
|
|
8
|
+
constructor(Template) {
|
|
9
|
+
this.Template = Template;
|
|
10
|
+
/** Variabile interna che indica il fatto che questo componente è una direttiva. Serve per disambigualrlo dell'EsTdComponent */
|
|
11
|
+
this._directive = true;
|
|
12
|
+
/** Variabile interna che indica il fatto che questo template si riferisce a una proprietà multipla */
|
|
13
|
+
this._multi = false;
|
|
14
|
+
/** Indica se la cella è visibile o meno di default */
|
|
15
|
+
this.tdVisible = true;
|
|
16
|
+
/** Equivalente dell'NgIf sul td */
|
|
17
|
+
this.tdIf = true;
|
|
18
|
+
}
|
|
19
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsTdDirective, deps: [{ token: i0.TemplateRef, self: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
20
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: EsTdDirective, selector: "[td]", inputs: { tdVisible: "tdVisible", td: "td", tdForProperty: "tdForProperty", tdIf: "tdIf", tdClass: "tdClass", tdPropertyAccessor: "tdPropertyAccessor", tdAlignment: "tdAlignment", tdFormat: "tdFormat", tdIconClass: "tdIconClass", tdConditionField: "tdConditionField", tdConditionValue: "tdConditionValue", tdTitle: "tdTitle", tdContent: "tdContent" }, ngImport: i0 }); }
|
|
21
|
+
}
|
|
22
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsTdDirective, decorators: [{
|
|
23
|
+
type: Directive,
|
|
24
|
+
args: [{ selector: '[td]' }]
|
|
25
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef, decorators: [{
|
|
26
|
+
type: Self
|
|
27
|
+
}] }], propDecorators: { tdVisible: [{
|
|
28
|
+
type: Input
|
|
29
|
+
}], td: [{
|
|
30
|
+
type: Input
|
|
31
|
+
}], tdForProperty: [{
|
|
32
|
+
type: Input
|
|
33
|
+
}], tdIf: [{
|
|
34
|
+
type: Input
|
|
35
|
+
}], tdClass: [{
|
|
36
|
+
type: Input
|
|
37
|
+
}], tdPropertyAccessor: [{
|
|
38
|
+
type: Input
|
|
39
|
+
}], tdAlignment: [{
|
|
40
|
+
type: Input
|
|
41
|
+
}], tdFormat: [{
|
|
42
|
+
type: Input
|
|
43
|
+
}], tdIconClass: [{
|
|
44
|
+
type: Input
|
|
45
|
+
}], tdConditionField: [{
|
|
46
|
+
type: Input
|
|
47
|
+
}], tdConditionValue: [{
|
|
48
|
+
type: Input
|
|
49
|
+
}], tdTitle: [{
|
|
50
|
+
type: Input
|
|
51
|
+
}], tdContent: [{
|
|
52
|
+
type: Input
|
|
53
|
+
}] } });
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvZXMtdGFibGUvc3JjL2xpYi9kaXJlY3RpdmVzL2VzX3RkLmRpcmVjdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQWUsTUFBTSxlQUFlLENBQUM7O0FBRXBFLHVHQUF1RztBQUV2RyxNQUFNLE9BQU8sYUFBYTtJQTZDdEI7O09BRUc7SUFDSCxZQUEyQixRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtRQTlDckQsK0hBQStIO1FBQ3hILGVBQVUsR0FBRyxJQUFJLENBQUM7UUFFekIsc0dBQXNHO1FBQy9GLFdBQU0sR0FBRyxLQUFLLENBQUM7UUFFdEIsc0RBQXNEO1FBQzdDLGNBQVMsR0FBRyxJQUFJLENBQUM7UUFPMUIsbUNBQW1DO1FBQzFCLFNBQUksR0FBWSxJQUFJLENBQUM7SUErQjJCLENBQUM7K0dBaERqRCxhQUFhO21HQUFiLGFBQWE7OzRGQUFiLGFBQWE7a0JBRHpCLFNBQVM7bUJBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFOzswQkFpRGQsSUFBSTt5Q0F2Q1IsU0FBUztzQkFBakIsS0FBSztnQkFFRyxFQUFFO3NCQUFWLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUdHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFHRyxXQUFXO3NCQUFuQixLQUFLO2dCQUdHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBR0csV0FBVztzQkFBbkIsS0FBSztnQkFHRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBR0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQUdHLE9BQU87c0JBQWYsS0FBSztnQkFHRyxTQUFTO3NCQUFqQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBJbnB1dCwgU2VsZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKiBEaXJldHRpdmEgcGVyIGxhIGRpY2hpYXJhemlvbmUgc25lbGxhIGRpIHVuIEVzVGQgZGEgZW1ldHRlcmUgcGVyIG9nbmkgZWxlbWVudG8sIGRhdGEgdW5hIGNvbG9ubmEgKi9cclxuQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW3RkXScgfSlcclxuZXhwb3J0IGNsYXNzIEVzVGREaXJlY3RpdmUge1xyXG5cclxuICAgIC8qKiBWYXJpYWJpbGUgaW50ZXJuYSBjaGUgaW5kaWNhIGlsIGZhdHRvIGNoZSBxdWVzdG8gY29tcG9uZW50ZSDDqCB1bmEgZGlyZXR0aXZhLiBTZXJ2ZSBwZXIgZGlzYW1iaWd1YWxybG8gZGVsbCdFc1RkQ29tcG9uZW50ICovXHJcbiAgICBwdWJsaWMgX2RpcmVjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgLyoqIFZhcmlhYmlsZSBpbnRlcm5hIGNoZSBpbmRpY2EgaWwgZmF0dG8gY2hlIHF1ZXN0byB0ZW1wbGF0ZSBzaSByaWZlcmlzY2UgYSB1bmEgcHJvcHJpZXTDoCBtdWx0aXBsYSAqL1xyXG4gICAgcHVibGljIF9tdWx0aSA9IGZhbHNlO1xyXG5cclxuICAgIC8qKiBJbmRpY2Egc2UgbGEgY2VsbGEgw6ggdmlzaWJpbGUgbyBtZW5vIGRpIGRlZmF1bHQgKi9cclxuICAgIEBJbnB1dCgpIHRkVmlzaWJsZSA9IHRydWU7XHJcbiAgICAvKiogSWQgZGVsbGEgY29sb25uYSwgZmEgcmlmZXJpbWVudG8gYWwgKip0aCoqIHBhZHJlICovXHJcbiAgICBASW5wdXQoKSB0ZDogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBTZSBxdWVzdG8gdGQgdmllbmUgdXNhdG8gY29tZSByZW5kZXJlciBpbiBxdWVzdGEgcHJvcHJpZXTDoCDDqCBzY3JpdHRvIGlsIG5vbWUgZGVsbGEgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gYmluZGF0byBwZXIgY3VpIGZhcmUgYXBwYXJpcmUgaWwgKipUZW1wbGF0ZSoqICovXHJcbiAgICBASW5wdXQoKSB0ZEZvclByb3BlcnR5OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIEVxdWl2YWxlbnRlIGRlbGwnTmdJZiBzdWwgdGQgKi9cclxuICAgIEBJbnB1dCgpIHRkSWY6IGJvb2xlYW4gPSB0cnVlO1xyXG4gICAgLyoqIEV2ZW50dWFsaSBjbGFzc2kgZGEgYXBwbGljYXJlIGFsICoqdGQqKiBnZW5lcmF0byAqL1xyXG4gICAgQElucHV0KCkgdGRDbGFzczogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBJbiBtYW5jYW56YSBkaSAqKlRlbXBsYXRlKiogaW5kaWNhIHF1YWwgw6ggbGEgcHJvcHJpZXTDoCBkZWxsJ29nZ2V0dG8gY29udGVuZW50ZSBsZSBpbmZvcm1hemlvbmkgZGEgbW9zdHJhcmUgKi9cclxuICAgIEBJbnB1dCgpIHRkUHJvcGVydHlBY2Nlc3Nvcjogc3RyaW5nXHJcblxyXG4gICAgLyoqIEFsbGluZWFtZW50byBkZWkgdmFsb3JpIGRlbGxhIHRhYmVsbGEgKi9cclxuICAgIEBJbnB1dCgpIHRkQWxpZ25tZW50OiBcIkNlbnRlclwiIHwgXCJMZWZ0XCIgfCBcIlJpZ2h0XCI7XHJcblxyXG4gICAgLyoqIEZvcm1hdG8gZGEgYXBwbGljYXJlIGFsIHZhbG9yZSBzZSBhcHBsaWNhYmlsZSwgdXRpbGl6emFiaWxlIHNvbG8gc2UgKip0ZFByb3BlcnR5QWNjZXNzb3IqKiDDqCB2YWxvcml6emF0byAqL1xyXG4gICAgQElucHV0KCkgdGRGb3JtYXQ6IHN0cmluZztcclxuXHJcbiAgICAvKiogU2UgaWwgY29udGVudXRvIGRpIHF1ZXN0byB0ZCBkZXYnZXNzZXJlIHVuJ2ltbWFnaW5lIGNsaWNjYWJpbGUsIHF1ZXN0YSDDqCBsYSBjbGFzc2UgY2hlIGxhIGlkZW50aWZpY2EgKi9cclxuICAgIEBJbnB1dCgpIHRkSWNvbkNsYXNzOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIENhbXBvIGRhIGNvbnRyb2xsYXJlIHBlciBmYXJlIGFwcGFyaXJlL3NwYXJpcmUgaWwgY29udGVudXRvIGRpIHF1ZXN0YSBjZWxsYSBxdWFsb3JhIGZvc3NlIGRpdmVyc28gZGEgKip0ZENvbmRpdGlvblZhbHVlKiogKi9cclxuICAgIEBJbnB1dCgpIHRkQ29uZGl0aW9uRmllbGQ6IHN0cmluZztcclxuXHJcbiAgICAvKiogVmFsb3JlIGNoZSBkZXZlIGFzc3VtZXJlICoqdGRDb25kaXRpb25GaWVsZCoqIHBlciBtb3N0cmFyZSBpbCBjb250ZW51dG8gZGkgcXVlc3RhIGNlbGxhICovXHJcbiAgICBASW5wdXQoKSB0ZENvbmRpdGlvblZhbHVlOiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIFRpdG9sbyBIVE1MIGRpIHF1ZXN0YSBjZWxsYSAqL1xyXG4gICAgQElucHV0KCkgdGRUaXRsZTogc3RyaW5nO1xyXG5cclxuICAgIC8qKiBDb250ZW51dG8gc3RhdGljbyBkaSBxdWVzdGEgY2VsbGEgKi9cclxuICAgIEBJbnB1dCgpIHRkQ29udGVudDogc3RyaW5nO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQGlnbm9yZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3RvcihAU2VsZigpIHB1YmxpYyBUZW1wbGF0ZTogVGVtcGxhdGVSZWY8YW55PikgeyB9XHJcbn1cclxuXHJcbiJdfQ==
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
import { Directive, Input, Optional, Self } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
/** Direttiva che rappresenta il template dell'editor di una cella all'interno della tabella */
|
|
4
|
-
export class EsTdEditorDirective {
|
|
5
|
-
/** @ignore */
|
|
6
|
-
constructor(Template) {
|
|
7
|
-
this.Template = Template;
|
|
8
|
-
}
|
|
9
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
10
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "
|
|
11
|
-
}
|
|
12
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
13
|
-
type: Directive,
|
|
14
|
-
args: [{ selector: '[editor]' }]
|
|
15
|
-
}], ctorParameters:
|
|
16
|
-
type: Self
|
|
17
|
-
}, {
|
|
18
|
-
type: Optional
|
|
19
|
-
}] }]
|
|
20
|
-
type: Input
|
|
21
|
-
}], editorForProperty: [{
|
|
22
|
-
type: Input
|
|
23
|
-
}] } });
|
|
24
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
import { Directive, Input, Optional, Self } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/** Direttiva che rappresenta il template dell'editor di una cella all'interno della tabella */
|
|
4
|
+
export class EsTdEditorDirective {
|
|
5
|
+
/** @ignore */
|
|
6
|
+
constructor(Template) {
|
|
7
|
+
this.Template = Template;
|
|
8
|
+
}
|
|
9
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsTdEditorDirective, deps: [{ token: i0.TemplateRef, optional: true, self: true }], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
10
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.12", type: EsTdEditorDirective, selector: "[editor]", inputs: { editor: "editor", editorForProperty: "editorForProperty" }, ngImport: i0 }); }
|
|
11
|
+
}
|
|
12
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: EsTdEditorDirective, decorators: [{
|
|
13
|
+
type: Directive,
|
|
14
|
+
args: [{ selector: '[editor]' }]
|
|
15
|
+
}], ctorParameters: () => [{ type: i0.TemplateRef, decorators: [{
|
|
16
|
+
type: Self
|
|
17
|
+
}, {
|
|
18
|
+
type: Optional
|
|
19
|
+
}] }], propDecorators: { editor: [{
|
|
20
|
+
type: Input
|
|
21
|
+
}], editorForProperty: [{
|
|
22
|
+
type: Input
|
|
23
|
+
}] } });
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXNfdGRfZWRpdG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2VzLXRhYmxlL3NyYy9saWIvZGlyZWN0aXZlcy9lc190ZF9lZGl0b3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQWUsTUFBTSxlQUFlLENBQUM7O0FBRTlFLCtGQUErRjtBQUUvRixNQUFNLE9BQU8sbUJBQW1CO0lBUTVCLGNBQWM7SUFDZCxZQUF1QyxRQUEwQjtRQUExQixhQUFRLEdBQVIsUUFBUSxDQUFrQjtJQUFJLENBQUM7K0dBVDdELG1CQUFtQjttR0FBbkIsbUJBQW1COzs0RkFBbkIsbUJBQW1CO2tCQUQvQixTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRTs7MEJBVWxCLElBQUk7OzBCQUFJLFFBQVE7eUNBTnBCLE1BQU07c0JBQWQsS0FBSztnQkFHRyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEaXJlY3RpdmUsIElucHV0LCBPcHRpb25hbCwgU2VsZiwgVGVtcGxhdGVSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuXHJcbi8qKiBEaXJldHRpdmEgY2hlIHJhcHByZXNlbnRhIGlsIHRlbXBsYXRlIGRlbGwnZWRpdG9yIGRpIHVuYSBjZWxsYSBhbGwnaW50ZXJubyBkZWxsYSB0YWJlbGxhICovXHJcbkBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tlZGl0b3JdJyB9KVxyXG5leHBvcnQgY2xhc3MgRXNUZEVkaXRvckRpcmVjdGl2ZSB7XHJcblxyXG4gICAgLyoqIElkIGRlbGwnRWRpdG9yICovXHJcbiAgICBASW5wdXQoKSBlZGl0b3I6IHN0cmluZztcclxuICAgIFxyXG4gICAgLyoqIEluIHF1ZXN0YSBwcm9wcmlldMOgIMOoIHNjcml0dG8gaWwgbm9tZSBkZWxsYSBwcm9wcmlldMOgIGRlbGwnb2dnZXR0byBiaW5kYXRvIHBlciBjdWkgZmFyZSBhcHBhcmlyZSBpbCAqKlRlbXBsYXRlKiogKi9cclxuICAgIEBJbnB1dCgpIGVkaXRvckZvclByb3BlcnR5OiBzdHJpbmc7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgKi9cclxuICAgIGNvbnN0cnVjdG9yKEBTZWxmKCkgQE9wdGlvbmFsKCkgcHVibGljIFRlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+KSB7IH1cclxufVxyXG4iXX0=
|