@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,136 +1,136 @@
|
|
|
1
|
-
/** Classe contenente la gestione della modalità gerarchica */
|
|
2
|
-
export class HierarchyModeHandler {
|
|
3
|
-
/** @ignore Costruttore*/
|
|
4
|
-
constructor(est) {
|
|
5
|
-
this.est = est;
|
|
6
|
-
}
|
|
7
|
-
/**
|
|
8
|
-
* Data una lista di oggetti assegno il livello gerarchico rispetto alla lista di oggetti passata
|
|
9
|
-
*
|
|
10
|
-
* @param {any[]} objs Lista di oggetti a cui aggiungere l'informazione del livello gerarchico
|
|
11
|
-
*/
|
|
12
|
-
assignHierarchyLevels(objs) {
|
|
13
|
-
// Casistica input nullo
|
|
14
|
-
if (!objs || !objs.length)
|
|
15
|
-
return;
|
|
16
|
-
//Se mancano entrambe le info le cerco di valorizzare in automatico coi default "parentid" e "id" (posto che le props esistano nell'oggetto)
|
|
17
|
-
if (!this.est.ParentKey && !this.est.OwnKey) {
|
|
18
|
-
if (objs[0]['parentid'] !== undefined)
|
|
19
|
-
this.est.ParentKey = 'parentid';
|
|
20
|
-
if (objs[0]['id'] !== undefined)
|
|
21
|
-
this.est.OwnKey = 'id';
|
|
22
|
-
}
|
|
23
|
-
//Check finale per assicurarmi che le props ci siano
|
|
24
|
-
if (!this.est.ParentKey || !this.est.OwnKey) {
|
|
25
|
-
console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
// Valorizzazione campi level, expanded, e visible per ogni item
|
|
29
|
-
let currentLevel = 1;
|
|
30
|
-
let assigned = 0;
|
|
31
|
-
do {
|
|
32
|
-
assigned = this.assignLevel(objs, currentLevel);
|
|
33
|
-
currentLevel++;
|
|
34
|
-
} while (assigned > 0);
|
|
35
|
-
// butto su lato html e poi me la gioco là con padding = 20 * (level - 1) per far capire il diverso livello
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Per ognuno degli oggetti passati gli assegna un livello di gerarchia in base a **ParentKey** e **OwnKey**
|
|
39
|
-
*
|
|
40
|
-
* @param {any[]} objs Oggetti a cui assegnare il livello di gerarchia
|
|
41
|
-
* @param {number} levelToAssign Livello che sta assegnando attualmente questa iterazione (dato che è ricorsiva)
|
|
42
|
-
*
|
|
43
|
-
* @returns {number} Numero di oggetti a cui è stato assegnato un livello gerarchico
|
|
44
|
-
*/
|
|
45
|
-
assignLevel(objs, levelToAssign) {
|
|
46
|
-
let assigned = 0;
|
|
47
|
-
for (let i = 0; i < objs.length; i++) {
|
|
48
|
-
let obj = objs[i];
|
|
49
|
-
// Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)
|
|
50
|
-
if (!obj[this.est.ParentKey] && levelToAssign == 1) {
|
|
51
|
-
obj._level = 1;
|
|
52
|
-
obj._visible = true;
|
|
53
|
-
obj._expanded = this.est.StartsExpanded;
|
|
54
|
-
assigned++;
|
|
55
|
-
continue;
|
|
56
|
-
}
|
|
57
|
-
// Per i livelli superiore al primo
|
|
58
|
-
if (obj[this.est.ParentKey] && levelToAssign > 1) {
|
|
59
|
-
// trovo il parent
|
|
60
|
-
for (let p = 0; p < objs.length; p++) {
|
|
61
|
-
let possibleParent = objs[p];
|
|
62
|
-
// Trovato il parent dell'item, assegno all'item il livello giusto
|
|
63
|
-
if (possibleParent[this.est.OwnKey] == obj[this.est.ParentKey] && possibleParent._level == levelToAssign - 1) {
|
|
64
|
-
obj._level = levelToAssign;
|
|
65
|
-
// So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica
|
|
66
|
-
// per la visibilità del figlio
|
|
67
|
-
possibleParent._expanded = this.est.StartsExpanded;
|
|
68
|
-
possibleParent.parent = true;
|
|
69
|
-
obj._visible = this.est.StartsExpanded;
|
|
70
|
-
assigned++;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return assigned;
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Funzione che permette di effettuare l'espansione di un parent quando la tabella funziona in modalità gerarchica
|
|
80
|
-
*
|
|
81
|
-
* @param {string} key Chiave del parent da espandere
|
|
82
|
-
*/
|
|
83
|
-
expandParent(key) {
|
|
84
|
-
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
85
|
-
let obj = this.est.boundSource[i];
|
|
86
|
-
// Trovo il parent con quell'id e lo espando
|
|
87
|
-
if (obj[this.est.OwnKey] == key) {
|
|
88
|
-
obj._expanded = true;
|
|
89
|
-
for (let ic = 0; ic < this.est.boundSource.length; ic++) {
|
|
90
|
-
let child = this.est.boundSource[ic];
|
|
91
|
-
// Trovo tutti i child di quel parent e li rendo visibili
|
|
92
|
-
if (child[this.est.ParentKey] == key)
|
|
93
|
-
child._visible = true;
|
|
94
|
-
}
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Funzione che permette di effettuare il collapse di un parent quando la tabella funziona in modalità gerarchica
|
|
101
|
-
*
|
|
102
|
-
* @param {string} key Chiave del parent da collassare
|
|
103
|
-
*/
|
|
104
|
-
collapseParent(key) {
|
|
105
|
-
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
106
|
-
let obj = this.est.boundSource[i];
|
|
107
|
-
// Trovo il parent con quell'id e lo collasso
|
|
108
|
-
if (obj[this.est.OwnKey] == key) {
|
|
109
|
-
obj._expanded = false;
|
|
110
|
-
// Collasso/nascondo tutti i child del parent
|
|
111
|
-
this.collapseChildOfParent(key);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
/**
|
|
117
|
-
* Collassa ricorsivamente tutti i figli di un parent identificato dalla **parentKey**
|
|
118
|
-
*
|
|
119
|
-
* @param {string} parentKey Chiave del parent di cui collassare i figli
|
|
120
|
-
*/
|
|
121
|
-
collapseChildOfParent(parentKey) {
|
|
122
|
-
for (let ic = 0; ic < this.est.boundSource.length; ic++) {
|
|
123
|
-
let child = this.est.boundSource[ic];
|
|
124
|
-
// Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,
|
|
125
|
-
// lo collasso e vado in ricorsione sui figli
|
|
126
|
-
if (child[this.est.ParentKey] == parentKey && !child.parent)
|
|
127
|
-
child._visible = false;
|
|
128
|
-
else if (child[this.est.ParentKey] == parentKey && child.parent) {
|
|
129
|
-
child._expanded = false;
|
|
130
|
-
child._visible = false;
|
|
131
|
-
this.collapseChildOfParent(child[this.est.OwnKey]);
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGllcmFyY2h5TW9kZUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy10YWJsZS9zcmMvbGliL2NvcmUvaGFuZGxlcnMvSGllcmFyY2h5TW9kZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsOERBQThEO0FBQzlELE1BQU0sT0FBTyxvQkFBb0I7SUFFN0IseUJBQXlCO0lBQ3pCLFlBQW9CLEdBQXFCO1FBQXJCLFFBQUcsR0FBSCxHQUFHLENBQWtCO0lBQUksQ0FBQztJQUU5Qzs7OztPQUlHO0lBQ0kscUJBQXFCLENBQUMsSUFBVztRQUNwQyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ3JCLE9BQU87UUFFWCw0SUFBNEk7UUFDNUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7WUFDekMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLEtBQUssU0FBUztnQkFDakMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLFNBQVM7Z0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQztTQUM5QjtRQUVELG9EQUFvRDtRQUNwRCxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRTtZQUN6QyxPQUFPLENBQUMsS0FBSyxDQUFDLHlJQUF5SSxDQUFDLENBQUM7WUFDekosT0FBTztTQUNWO1FBRUQsZ0VBQWdFO1FBQ2hFLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixJQUFJ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QVEsR0FBRyxLQUFLLENBQUM7aUJBQ3RCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUU7Z0JBQzdELEtBQUssQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO2dCQUN4QixLQUFLLENBQUMsUUFBUSxHQUFHLEtBQUssQ0FBQztnQkFDdkIsSUFBSSxDQUFDLHFCQUFxQixDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDdEQ7U0FDSjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5cclxuLyoqIENsYXNzZSBjb250ZW5lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIG1vZGFsaXTDoCBnZXJhcmNoaWNhICovXHJcbmV4cG9ydCBjbGFzcyBIaWVyYXJjaHlNb2RlSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSB1bmEgbGlzdGEgZGkgb2dnZXR0aSBhc3NlZ25vIGlsIGxpdmVsbG8gZ2VyYXJjaGljbyByaXNwZXR0byBhbGxhIGxpc3RhIGRpIG9nZ2V0dGkgcGFzc2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55W119IG9ianMgTGlzdGEgZGkgb2dnZXR0aSBhIGN1aSBhZ2dpdW5nZXJlIGwnaW5mb3JtYXppb25lIGRlbCBsaXZlbGxvIGdlcmFyY2hpY29cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzc2lnbkhpZXJhcmNoeUxldmVscyhvYmpzOiBhbnlbXSkge1xyXG4gICAgICAgIC8vIENhc2lzdGljYSBpbnB1dCBudWxsb1xyXG4gICAgICAgIGlmICghb2JqcyB8fCAhb2Jqcy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy9TZSBtYW5jYW5vIGVudHJhbWJlIGxlIGluZm8gbGUgY2VyY28gZGkgdmFsb3JpenphcmUgaW4gYXV0b21hdGljbyBjb2kgZGVmYXVsdCBcInBhcmVudGlkXCIgZSBcImlkXCIgKHBvc3RvIGNoZSBsZSBwcm9wcyBlc2lzdGFubyBuZWxsJ29nZ2V0dG8pXHJcbiAgICAgICAgaWYgKCF0aGlzLmVzdC5QYXJlbnRLZXkgJiYgIXRoaXMuZXN0Lk93bktleSkge1xyXG4gICAgICAgICAgICBpZiAob2Jqc1swXVsncGFyZW50aWQnXSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuUGFyZW50S2V5ID0gJ3BhcmVudGlkJztcclxuICAgICAgICAgICAgaWYgKG9ianNbMF1bJ2lkJ10gIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lk93bktleSA9ICdpZCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0NoZWNrIGZpbmFsZSBwZXIgYXNzaWN1cmFybWkgY2hlIGxlIHByb3BzIGNpIHNpYW5vXHJcbiAgICAgICAgaWYgKCF0aGlzLmVzdC5QYXJlbnRLZXkgfHwgIXRoaXMuZXN0Lk93bktleSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQZXIgdXRpbGl6emFyZSBpbCBzaXN0ZW1hIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIMOoIG9iYmxpZ2F0b3JpbyBzcGVjaWZpY2FyZSBzaWEgUGFyZW50S2V5IGNoZSBPd25LZXkuIEZhbGxiYWNrIGEgc2lzdGVtYSBub24gZ2VyYXJjaGljbycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxvcml6emF6aW9uZSBjYW1waSBsZXZlbCwgZXhwYW5kZWQsIGUgdmlzaWJsZSBwZXIgb2duaSBpdGVtXHJcbiAgICAgICAgbGV0IGN1cnJlbnRMZXZlbCA9IDE7XHJcbiAgICAgICAgbGV0IGFzc2lnbmVkID0gMDtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdGhpcy5hc3NpZ25MZXZlbChvYmpzLCBjdXJyZW50TGV2ZWwpO1xyXG4gICAgICAgICAgICBjdXJyZW50TGV2ZWwrKztcclxuICAgICAgICB9IHdoaWxlIChhc3NpZ25lZCA+IDApO1xyXG4gICAgICAgIC8vIGJ1dHRvIHN1IGxhdG8gaHRtbCBlIHBvaSBtZSBsYSBnaW9jbyBsw6AgY29uIHBhZGRpbmcgPSAyMCAqIChsZXZlbCAtIDEpIHBlciBmYXIgY2FwaXJlIGlsIGRpdmVyc28gbGl2ZWxsb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyIG9nbnVubyBkZWdsaSBvZ2dldHRpIHBhc3NhdGkgZ2xpIGFzc2VnbmEgdW4gbGl2ZWxsbyBkaSBnZXJhcmNoaWEgaW4gYmFzZSBhICoqUGFyZW50S2V5KiogZSAqKk93bktleSoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gb2JqcyBPZ2dldHRpIGEgY3VpIGFzc2VnbmFyZSBpbCBsaXZlbGxvIGRpIGdlcmFyY2hpYVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsVG9Bc3NpZ24gTGl2ZWxsbyBjaGUgc3RhIGFzc2VnbmFuZG8gYXR0dWFsbWVudGUgcXVlc3RhIGl0ZXJhemlvbmUgKGRhdG8gY2hlIMOoIHJpY29yc2l2YSlcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1lcm8gZGkgb2dnZXR0aSBhIGN1aSDDqCBzdGF0byBhc3NlZ25hdG8gdW4gbGl2ZWxsbyBnZXJhcmNoaWNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXNzaWduTGV2ZWwob2JqczogYW55W10sIGxldmVsVG9Bc3NpZ246IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGFzc2lnbmVkID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IG9iaiA9IG9ianNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsYSBwYXJlbnRLZXkgbm9uIMOoIHZhbG9yaXp6YXRhLCBxdWVzdG8gw6ggaWwgbGl2ZWxsbyAwICgxLi4uIHBlcmNow6kgZ2xpIDAgc29uIHBlcmNpb2xvc2kpXHJcbiAgICAgICAgICAgIGlmICghb2JqW3RoaXMuZXN0LlBhcmVudEtleV0gJiYgbGV2ZWxUb0Fzc2lnbiA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2xldmVsID0gMTtcclxuICAgICAgICAgICAgICAgIG9iai5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gdGhpcy5lc3QuU3RhcnRzRXhwYW5kZWQ7XHJcbiAgICAgICAgICAgICAgICBhc3NpZ25lZCsrO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBpIGxpdmVsbGkgc3VwZXJpb3JlIGFsIHByaW1vXHJcbiAgICAgICAgICAgIGlmIChvYmpbdGhpcy5lc3QuUGFyZW50S2V5XSAmJiBsZXZlbFRvQXNzaWduID4gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdHJvdm8gaWwgcGFyZW50XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IG9ianMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zc2libGVQYXJlbnQgPSBvYmpzW3BdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUcm92YXRvIGlsIHBhcmVudCBkZWxsJ2l0ZW0sIGFzc2Vnbm8gYWxsJ2l0ZW0gaWwgbGl2ZWxsbyBnaXVzdG9cclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVQYXJlbnRbdGhpcy5lc3QuT3duS2V5XSA9PSBvYmpbdGhpcy5lc3QuUGFyZW50S2V5XSAmJiBwb3NzaWJsZVBhcmVudC5fbGV2ZWwgPT0gbGV2ZWxUb0Fzc2lnbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqLl9sZXZlbCA9IGxldmVsVG9Bc3NpZ247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBjaGUgcXVlc3RvIGl0ZW0gaGEgdW4gcGFyZW50LiBSaWJhZGlzY28gY2hlIGlsIHBhcmVudCDDqCBlc3BhbnNvIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmUgZSBzdGVzc2EgbG9naWNhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlciBsYSB2aXNpYmlsaXTDoCBkZWwgZmlnbGlvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlUGFyZW50Ll9leHBhbmRlZCA9IHRoaXMuZXN0LlN0YXJ0c0V4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVBhcmVudC5wYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmouX3Zpc2libGUgPSB0aGlzLmVzdC5TdGFydHNFeHBhbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NpZ25lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBwZXJtZXR0ZSBkaSBlZmZldHR1YXJlIGwnZXNwYW5zaW9uZSBkaSB1biBwYXJlbnQgcXVhbmRvIGxhIHRhYmVsbGEgZnVuemlvbmEgaW4gbW9kYWxpdMOgIGdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoaWF2ZSBkZWwgcGFyZW50IGRhIGVzcGFuZGVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kUGFyZW50KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVzdC5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgb2JqID0gdGhpcy5lc3QuYm91bmRTb3VyY2VbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBUcm92byBpbCBwYXJlbnQgY29uIHF1ZWxsJ2lkIGUgbG8gZXNwYW5kb1xyXG4gICAgICAgICAgICBpZiAob2JqW3RoaXMuZXN0Lk93bktleV0gPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpYyA9IDA7IGljIDwgdGhpcy5lc3QuYm91bmRTb3VyY2UubGVuZ3RoOyBpYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5lc3QuYm91bmRTb3VyY2VbaWNdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUcm92byB0dXR0aSBpIGNoaWxkIGRpIHF1ZWwgcGFyZW50IGUgbGkgcmVuZG8gdmlzaWJpbGlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRbdGhpcy5lc3QuUGFyZW50S2V5XSA9PSBrZXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBwZXJtZXR0ZSBkaSBlZmZldHR1YXJlIGlsIGNvbGxhcHNlIGRpIHVuIHBhcmVudCBxdWFuZG8gbGEgdGFiZWxsYSBmdW56aW9uYSBpbiBtb2RhbGl0w6AgZ2VyYXJjaGljYVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hpYXZlIGRlbCBwYXJlbnQgZGEgY29sbGFzc2FyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFwc2VQYXJlbnQoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0LmJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLmVzdC5ib3VuZFNvdXJjZVtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyb3ZvIGlsIHBhcmVudCBjb24gcXVlbGwnaWQgZSBsbyBjb2xsYXNzb1xyXG4gICAgICAgICAgICBpZiAob2JqW3RoaXMuZXN0Lk93bktleV0gPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ29sbGFzc28vbmFzY29uZG8gdHV0dGkgaSBjaGlsZCBkZWwgcGFyZW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGRPZlBhcmVudChrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGFzc2Egcmljb3JzaXZhbWVudGUgdHV0dGkgaSBmaWdsaSBkaSB1biBwYXJlbnQgaWRlbnRpZmljYXRvIGRhbGxhICoqcGFyZW50S2V5KipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50S2V5IENoaWF2ZSBkZWwgcGFyZW50IGRpIGN1aSBjb2xsYXNzYXJlIGkgZmlnbGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb2xsYXBzZUNoaWxkT2ZQYXJlbnQocGFyZW50S2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpYyA9IDA7IGljIDwgdGhpcy5lc3QuYm91bmRTb3VyY2UubGVuZ3RoOyBpYysrKSB7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuZXN0LmJvdW5kU291cmNlW2ljXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyb3ZvIHR1dHRpIGkgY2hpbGQgZGkgcXVlbCBwYXJlbnQgZSBsaSByZW5kbyBpbnZpc2liaWxpLiBTZSBpbCBjaGlsZCB0cm92YXRvIMOoIGEgc3VhIHZvbHRhIHVuIHBhcmVudCxcclxuICAgICAgICAgICAgLy8gbG8gY29sbGFzc28gZSB2YWRvIGluIHJpY29yc2lvbmUgc3VpIGZpZ2xpXHJcbiAgICAgICAgICAgIGlmIChjaGlsZFt0aGlzLmVzdC5QYXJlbnRLZXldID09IHBhcmVudEtleSAmJiAhY2hpbGQucGFyZW50KVxyXG4gICAgICAgICAgICAgICAgY2hpbGQuX3Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRbdGhpcy5lc3QuUGFyZW50S2V5XSA9PSBwYXJlbnRLZXkgJiYgY2hpbGQucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5fZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNoaWxkLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGRPZlBhcmVudChjaGlsZFt0aGlzLmVzdC5Pd25LZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|
|
1
|
+
/** Classe contenente la gestione della modalità gerarchica */
|
|
2
|
+
export class HierarchyModeHandler {
|
|
3
|
+
/** @ignore Costruttore*/
|
|
4
|
+
constructor(est) {
|
|
5
|
+
this.est = est;
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Data una lista di oggetti assegno il livello gerarchico rispetto alla lista di oggetti passata
|
|
9
|
+
*
|
|
10
|
+
* @param {any[]} objs Lista di oggetti a cui aggiungere l'informazione del livello gerarchico
|
|
11
|
+
*/
|
|
12
|
+
assignHierarchyLevels(objs) {
|
|
13
|
+
// Casistica input nullo
|
|
14
|
+
if (!objs || !objs.length)
|
|
15
|
+
return;
|
|
16
|
+
//Se mancano entrambe le info le cerco di valorizzare in automatico coi default "parentid" e "id" (posto che le props esistano nell'oggetto)
|
|
17
|
+
if (!this.est.ParentKey && !this.est.OwnKey) {
|
|
18
|
+
if (objs[0]['parentid'] !== undefined)
|
|
19
|
+
this.est.ParentKey = 'parentid';
|
|
20
|
+
if (objs[0]['id'] !== undefined)
|
|
21
|
+
this.est.OwnKey = 'id';
|
|
22
|
+
}
|
|
23
|
+
//Check finale per assicurarmi che le props ci siano
|
|
24
|
+
if (!this.est.ParentKey || !this.est.OwnKey) {
|
|
25
|
+
console.error('Per utilizzare il sistema in modalità gerarchica è obbligatorio specificare sia ParentKey che OwnKey. Fallback a sistema non gerarchico');
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
// Valorizzazione campi level, expanded, e visible per ogni item
|
|
29
|
+
let currentLevel = 1;
|
|
30
|
+
let assigned = 0;
|
|
31
|
+
do {
|
|
32
|
+
assigned = this.assignLevel(objs, currentLevel);
|
|
33
|
+
currentLevel++;
|
|
34
|
+
} while (assigned > 0);
|
|
35
|
+
// butto su lato html e poi me la gioco là con padding = 20 * (level - 1) per far capire il diverso livello
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Per ognuno degli oggetti passati gli assegna un livello di gerarchia in base a **ParentKey** e **OwnKey**
|
|
39
|
+
*
|
|
40
|
+
* @param {any[]} objs Oggetti a cui assegnare il livello di gerarchia
|
|
41
|
+
* @param {number} levelToAssign Livello che sta assegnando attualmente questa iterazione (dato che è ricorsiva)
|
|
42
|
+
*
|
|
43
|
+
* @returns {number} Numero di oggetti a cui è stato assegnato un livello gerarchico
|
|
44
|
+
*/
|
|
45
|
+
assignLevel(objs, levelToAssign) {
|
|
46
|
+
let assigned = 0;
|
|
47
|
+
for (let i = 0; i < objs.length; i++) {
|
|
48
|
+
let obj = objs[i];
|
|
49
|
+
// Se la parentKey non è valorizzata, questo è il livello 0 (1... perché gli 0 son perciolosi)
|
|
50
|
+
if (!obj[this.est.ParentKey] && levelToAssign == 1) {
|
|
51
|
+
obj._level = 1;
|
|
52
|
+
obj._visible = true;
|
|
53
|
+
obj._expanded = this.est.StartsExpanded;
|
|
54
|
+
assigned++;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
// Per i livelli superiore al primo
|
|
58
|
+
if (obj[this.est.ParentKey] && levelToAssign > 1) {
|
|
59
|
+
// trovo il parent
|
|
60
|
+
for (let p = 0; p < objs.length; p++) {
|
|
61
|
+
let possibleParent = objs[p];
|
|
62
|
+
// Trovato il parent dell'item, assegno all'item il livello giusto
|
|
63
|
+
if (possibleParent[this.est.OwnKey] == obj[this.est.ParentKey] && possibleParent._level == levelToAssign - 1) {
|
|
64
|
+
obj._level = levelToAssign;
|
|
65
|
+
// So che questo item ha un parent. Ribadisco che il parent è espanso in base alle impostazione e stessa logica
|
|
66
|
+
// per la visibilità del figlio
|
|
67
|
+
possibleParent._expanded = this.est.StartsExpanded;
|
|
68
|
+
possibleParent.parent = true;
|
|
69
|
+
obj._visible = this.est.StartsExpanded;
|
|
70
|
+
assigned++;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return assigned;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Funzione che permette di effettuare l'espansione di un parent quando la tabella funziona in modalità gerarchica
|
|
80
|
+
*
|
|
81
|
+
* @param {string} key Chiave del parent da espandere
|
|
82
|
+
*/
|
|
83
|
+
expandParent(key) {
|
|
84
|
+
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
85
|
+
let obj = this.est.boundSource[i];
|
|
86
|
+
// Trovo il parent con quell'id e lo espando
|
|
87
|
+
if (obj[this.est.OwnKey] == key) {
|
|
88
|
+
obj._expanded = true;
|
|
89
|
+
for (let ic = 0; ic < this.est.boundSource.length; ic++) {
|
|
90
|
+
let child = this.est.boundSource[ic];
|
|
91
|
+
// Trovo tutti i child di quel parent e li rendo visibili
|
|
92
|
+
if (child[this.est.ParentKey] == key)
|
|
93
|
+
child._visible = true;
|
|
94
|
+
}
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Funzione che permette di effettuare il collapse di un parent quando la tabella funziona in modalità gerarchica
|
|
101
|
+
*
|
|
102
|
+
* @param {string} key Chiave del parent da collassare
|
|
103
|
+
*/
|
|
104
|
+
collapseParent(key) {
|
|
105
|
+
for (let i = 0; i < this.est.boundSource.length; i++) {
|
|
106
|
+
let obj = this.est.boundSource[i];
|
|
107
|
+
// Trovo il parent con quell'id e lo collasso
|
|
108
|
+
if (obj[this.est.OwnKey] == key) {
|
|
109
|
+
obj._expanded = false;
|
|
110
|
+
// Collasso/nascondo tutti i child del parent
|
|
111
|
+
this.collapseChildOfParent(key);
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Collassa ricorsivamente tutti i figli di un parent identificato dalla **parentKey**
|
|
118
|
+
*
|
|
119
|
+
* @param {string} parentKey Chiave del parent di cui collassare i figli
|
|
120
|
+
*/
|
|
121
|
+
collapseChildOfParent(parentKey) {
|
|
122
|
+
for (let ic = 0; ic < this.est.boundSource.length; ic++) {
|
|
123
|
+
let child = this.est.boundSource[ic];
|
|
124
|
+
// Trovo tutti i child di quel parent e li rendo invisibili. Se il child trovato è a sua volta un parent,
|
|
125
|
+
// lo collasso e vado in ricorsione sui figli
|
|
126
|
+
if (child[this.est.ParentKey] == parentKey && !child.parent)
|
|
127
|
+
child._visible = false;
|
|
128
|
+
else if (child[this.est.ParentKey] == parentKey && child.parent) {
|
|
129
|
+
child._expanded = false;
|
|
130
|
+
child._visible = false;
|
|
131
|
+
this.collapseChildOfParent(child[this.est.OwnKey]);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSGllcmFyY2h5TW9kZUhhbmRsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9lcy10YWJsZS9zcmMvbGliL2NvcmUvaGFuZGxlcnMvSGllcmFyY2h5TW9kZUhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsOERBQThEO0FBQzlELE1BQU0sT0FBTyxvQkFBb0I7SUFFN0IseUJBQXlCO0lBQ3pCLFlBQW9CLEdBQXFCO1FBQXJCLFFBQUcsR0FBSCxHQUFHLENBQWtCO0lBQUksQ0FBQztJQUU5Qzs7OztPQUlHO0lBQ0kscUJBQXFCLENBQUMsSUFBVztRQUNwQyx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNO1lBQ3JCLE9BQU87UUFFWCw0SUFBNEk7UUFDNUksSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxTQUFTO2dCQUNqQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUM7WUFDcEMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssU0FBUztnQkFDM0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQy9CLENBQUM7UUFFRCxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxQyxPQUFPLENBQUMsS0FBSyxDQUFDLHlJQUF5SSxDQUFDLENBQUM7WUFDekosT0FBTztRQUNYLENBQUM7UUFFRCxnRUFBZ0U7UUFDaEUsSUFBSSxZQUFZLEdBQUcs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QUFDO1lBRXJDLHlHQUF5RztZQUN6Ryw2Q0FBNkM7WUFDN0MsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsSUFBSSxTQUFTLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTTtnQkFDdkQsS0FBSyxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUM7aUJBQ3RCLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDOUQsS0FBSyxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7Z0JBQ3hCLEtBQUssQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUN2QixJQUFJLENBQUMscUJBQXFCLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztZQUN2RCxDQUFDO1FBQ0wsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEVzVGFibGVDb21wb25lbnQgfSBmcm9tIFwiLi4vLi4vY29tcG9uZW50cy9lcy10YWJsZS9lc190YWJsZS5jb21wb25lbnRcIlxyXG5cclxuLyoqIENsYXNzZSBjb250ZW5lbnRlIGxhIGdlc3Rpb25lIGRlbGxhIG1vZGFsaXTDoCBnZXJhcmNoaWNhICovXHJcbmV4cG9ydCBjbGFzcyBIaWVyYXJjaHlNb2RlSGFuZGxlciB7XHJcblxyXG4gICAgLyoqIEBpZ25vcmUgQ29zdHJ1dHRvcmUqL1xyXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBlc3Q6IEVzVGFibGVDb21wb25lbnQpIHsgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogRGF0YSB1bmEgbGlzdGEgZGkgb2dnZXR0aSBhc3NlZ25vIGlsIGxpdmVsbG8gZ2VyYXJjaGljbyByaXNwZXR0byBhbGxhIGxpc3RhIGRpIG9nZ2V0dGkgcGFzc2F0YVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7YW55W119IG9ianMgTGlzdGEgZGkgb2dnZXR0aSBhIGN1aSBhZ2dpdW5nZXJlIGwnaW5mb3JtYXppb25lIGRlbCBsaXZlbGxvIGdlcmFyY2hpY29cclxuICAgICAqL1xyXG4gICAgcHVibGljIGFzc2lnbkhpZXJhcmNoeUxldmVscyhvYmpzOiBhbnlbXSkge1xyXG4gICAgICAgIC8vIENhc2lzdGljYSBpbnB1dCBudWxsb1xyXG4gICAgICAgIGlmICghb2JqcyB8fCAhb2Jqcy5sZW5ndGgpXHJcbiAgICAgICAgICAgIHJldHVybjtcclxuXHJcbiAgICAgICAgLy9TZSBtYW5jYW5vIGVudHJhbWJlIGxlIGluZm8gbGUgY2VyY28gZGkgdmFsb3JpenphcmUgaW4gYXV0b21hdGljbyBjb2kgZGVmYXVsdCBcInBhcmVudGlkXCIgZSBcImlkXCIgKHBvc3RvIGNoZSBsZSBwcm9wcyBlc2lzdGFubyBuZWxsJ29nZ2V0dG8pXHJcbiAgICAgICAgaWYgKCF0aGlzLmVzdC5QYXJlbnRLZXkgJiYgIXRoaXMuZXN0Lk93bktleSkge1xyXG4gICAgICAgICAgICBpZiAob2Jqc1swXVsncGFyZW50aWQnXSAhPT0gdW5kZWZpbmVkKVxyXG4gICAgICAgICAgICAgICAgdGhpcy5lc3QuUGFyZW50S2V5ID0gJ3BhcmVudGlkJztcclxuICAgICAgICAgICAgaWYgKG9ianNbMF1bJ2lkJ10gIT09IHVuZGVmaW5lZClcclxuICAgICAgICAgICAgICAgIHRoaXMuZXN0Lk93bktleSA9ICdpZCc7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvL0NoZWNrIGZpbmFsZSBwZXIgYXNzaWN1cmFybWkgY2hlIGxlIHByb3BzIGNpIHNpYW5vXHJcbiAgICAgICAgaWYgKCF0aGlzLmVzdC5QYXJlbnRLZXkgfHwgIXRoaXMuZXN0Lk93bktleSkge1xyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdQZXIgdXRpbGl6emFyZSBpbCBzaXN0ZW1hIGluIG1vZGFsaXTDoCBnZXJhcmNoaWNhIMOoIG9iYmxpZ2F0b3JpbyBzcGVjaWZpY2FyZSBzaWEgUGFyZW50S2V5IGNoZSBPd25LZXkuIEZhbGxiYWNrIGEgc2lzdGVtYSBub24gZ2VyYXJjaGljbycpO1xyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBWYWxvcml6emF6aW9uZSBjYW1waSBsZXZlbCwgZXhwYW5kZWQsIGUgdmlzaWJsZSBwZXIgb2duaSBpdGVtXHJcbiAgICAgICAgbGV0IGN1cnJlbnRMZXZlbCA9IDE7XHJcbiAgICAgICAgbGV0IGFzc2lnbmVkID0gMDtcclxuICAgICAgICBkbyB7XHJcbiAgICAgICAgICAgIGFzc2lnbmVkID0gdGhpcy5hc3NpZ25MZXZlbChvYmpzLCBjdXJyZW50TGV2ZWwpO1xyXG4gICAgICAgICAgICBjdXJyZW50TGV2ZWwrKztcclxuICAgICAgICB9IHdoaWxlIChhc3NpZ25lZCA+IDApO1xyXG4gICAgICAgIC8vIGJ1dHRvIHN1IGxhdG8gaHRtbCBlIHBvaSBtZSBsYSBnaW9jbyBsw6AgY29uIHBhZGRpbmcgPSAyMCAqIChsZXZlbCAtIDEpIHBlciBmYXIgY2FwaXJlIGlsIGRpdmVyc28gbGl2ZWxsb1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogUGVyIG9nbnVubyBkZWdsaSBvZ2dldHRpIHBhc3NhdGkgZ2xpIGFzc2VnbmEgdW4gbGl2ZWxsbyBkaSBnZXJhcmNoaWEgaW4gYmFzZSBhICoqUGFyZW50S2V5KiogZSAqKk93bktleSoqXHJcbiAgICAgKlxyXG4gICAgICogQHBhcmFtIHthbnlbXX0gb2JqcyBPZ2dldHRpIGEgY3VpIGFzc2VnbmFyZSBpbCBsaXZlbGxvIGRpIGdlcmFyY2hpYVxyXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGxldmVsVG9Bc3NpZ24gTGl2ZWxsbyBjaGUgc3RhIGFzc2VnbmFuZG8gYXR0dWFsbWVudGUgcXVlc3RhIGl0ZXJhemlvbmUgKGRhdG8gY2hlIMOoIHJpY29yc2l2YSlcclxuICAgICAqXHJcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBOdW1lcm8gZGkgb2dnZXR0aSBhIGN1aSDDqCBzdGF0byBhc3NlZ25hdG8gdW4gbGl2ZWxsbyBnZXJhcmNoaWNvXHJcbiAgICAgKi9cclxuICAgIHByaXZhdGUgYXNzaWduTGV2ZWwob2JqczogYW55W10sIGxldmVsVG9Bc3NpZ246IG51bWJlcik6IG51bWJlciB7XHJcbiAgICAgICAgbGV0IGFzc2lnbmVkID0gMDtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9ianMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICAgICAgbGV0IG9iaiA9IG9ianNbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBTZSBsYSBwYXJlbnRLZXkgbm9uIMOoIHZhbG9yaXp6YXRhLCBxdWVzdG8gw6ggaWwgbGl2ZWxsbyAwICgxLi4uIHBlcmNow6kgZ2xpIDAgc29uIHBlcmNpb2xvc2kpXHJcbiAgICAgICAgICAgIGlmICghb2JqW3RoaXMuZXN0LlBhcmVudEtleV0gJiYgbGV2ZWxUb0Fzc2lnbiA9PSAxKSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2xldmVsID0gMTtcclxuICAgICAgICAgICAgICAgIG9iai5fdmlzaWJsZSA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gdGhpcy5lc3QuU3RhcnRzRXhwYW5kZWQ7XHJcbiAgICAgICAgICAgICAgICBhc3NpZ25lZCsrO1xyXG4gICAgICAgICAgICAgICAgY29udGludWU7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgIC8vIFBlciBpIGxpdmVsbGkgc3VwZXJpb3JlIGFsIHByaW1vXHJcbiAgICAgICAgICAgIGlmIChvYmpbdGhpcy5lc3QuUGFyZW50S2V5XSAmJiBsZXZlbFRvQXNzaWduID4gMSkge1xyXG4gICAgICAgICAgICAgICAgLy8gdHJvdm8gaWwgcGFyZW50XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBwID0gMDsgcCA8IG9ianMubGVuZ3RoOyBwKyspIHtcclxuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zc2libGVQYXJlbnQgPSBvYmpzW3BdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUcm92YXRvIGlsIHBhcmVudCBkZWxsJ2l0ZW0sIGFzc2Vnbm8gYWxsJ2l0ZW0gaWwgbGl2ZWxsbyBnaXVzdG9cclxuICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVQYXJlbnRbdGhpcy5lc3QuT3duS2V5XSA9PSBvYmpbdGhpcy5lc3QuUGFyZW50S2V5XSAmJiBwb3NzaWJsZVBhcmVudC5fbGV2ZWwgPT0gbGV2ZWxUb0Fzc2lnbiAtIDEpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgb2JqLl9sZXZlbCA9IGxldmVsVG9Bc3NpZ247XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTbyBjaGUgcXVlc3RvIGl0ZW0gaGEgdW4gcGFyZW50LiBSaWJhZGlzY28gY2hlIGlsIHBhcmVudCDDqCBlc3BhbnNvIGluIGJhc2UgYWxsZSBpbXBvc3RhemlvbmUgZSBzdGVzc2EgbG9naWNhXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlciBsYSB2aXNpYmlsaXTDoCBkZWwgZmlnbGlvXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlUGFyZW50Ll9leHBhbmRlZCA9IHRoaXMuZXN0LlN0YXJ0c0V4cGFuZGVkO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZVBhcmVudC5wYXJlbnQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBvYmouX3Zpc2libGUgPSB0aGlzLmVzdC5TdGFydHNFeHBhbmRlZDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduZWQrKztcclxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBhc3NpZ25lZDtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBwZXJtZXR0ZSBkaSBlZmZldHR1YXJlIGwnZXNwYW5zaW9uZSBkaSB1biBwYXJlbnQgcXVhbmRvIGxhIHRhYmVsbGEgZnVuemlvbmEgaW4gbW9kYWxpdMOgIGdlcmFyY2hpY2FcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IENoaWF2ZSBkZWwgcGFyZW50IGRhIGVzcGFuZGVyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgZXhwYW5kUGFyZW50KGtleTogc3RyaW5nKSB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmVzdC5ib3VuZFNvdXJjZS5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBsZXQgb2JqID0gdGhpcy5lc3QuYm91bmRTb3VyY2VbaV07XHJcblxyXG4gICAgICAgICAgICAvLyBUcm92byBpbCBwYXJlbnQgY29uIHF1ZWxsJ2lkIGUgbG8gZXNwYW5kb1xyXG4gICAgICAgICAgICBpZiAob2JqW3RoaXMuZXN0Lk93bktleV0gPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gdHJ1ZTtcclxuXHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpYyA9IDA7IGljIDwgdGhpcy5lc3QuYm91bmRTb3VyY2UubGVuZ3RoOyBpYysrKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5lc3QuYm91bmRTb3VyY2VbaWNdO1xyXG5cclxuICAgICAgICAgICAgICAgICAgICAvLyBUcm92byB0dXR0aSBpIGNoaWxkIGRpIHF1ZWwgcGFyZW50IGUgbGkgcmVuZG8gdmlzaWJpbGlcclxuICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRbdGhpcy5lc3QuUGFyZW50S2V5XSA9PSBrZXkpXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLl92aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIEZ1bnppb25lIGNoZSBwZXJtZXR0ZSBkaSBlZmZldHR1YXJlIGlsIGNvbGxhcHNlIGRpIHVuIHBhcmVudCBxdWFuZG8gbGEgdGFiZWxsYSBmdW56aW9uYSBpbiBtb2RhbGl0w6AgZ2VyYXJjaGljYVxyXG4gICAgICpcclxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgQ2hpYXZlIGRlbCBwYXJlbnQgZGEgY29sbGFzc2FyZVxyXG4gICAgICovXHJcbiAgICBwdWJsaWMgY29sbGFwc2VQYXJlbnQoa2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuZXN0LmJvdW5kU291cmNlLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGxldCBvYmogPSB0aGlzLmVzdC5ib3VuZFNvdXJjZVtpXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyb3ZvIGlsIHBhcmVudCBjb24gcXVlbGwnaWQgZSBsbyBjb2xsYXNzb1xyXG4gICAgICAgICAgICBpZiAob2JqW3RoaXMuZXN0Lk93bktleV0gPT0ga2V5KSB7XHJcbiAgICAgICAgICAgICAgICBvYmouX2V4cGFuZGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgICAgICAgICAgLy8gQ29sbGFzc28vbmFzY29uZG8gdHV0dGkgaSBjaGlsZCBkZWwgcGFyZW50XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGRPZlBhcmVudChrZXkpO1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQ29sbGFzc2Egcmljb3JzaXZhbWVudGUgdHV0dGkgaSBmaWdsaSBkaSB1biBwYXJlbnQgaWRlbnRpZmljYXRvIGRhbGxhICoqcGFyZW50S2V5KipcclxuICAgICAqXHJcbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyZW50S2V5IENoaWF2ZSBkZWwgcGFyZW50IGRpIGN1aSBjb2xsYXNzYXJlIGkgZmlnbGlcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjb2xsYXBzZUNoaWxkT2ZQYXJlbnQocGFyZW50S2V5OiBzdHJpbmcpIHtcclxuICAgICAgICBmb3IgKGxldCBpYyA9IDA7IGljIDwgdGhpcy5lc3QuYm91bmRTb3VyY2UubGVuZ3RoOyBpYysrKSB7XHJcbiAgICAgICAgICAgIGxldCBjaGlsZCA9IHRoaXMuZXN0LmJvdW5kU291cmNlW2ljXTtcclxuXHJcbiAgICAgICAgICAgIC8vIFRyb3ZvIHR1dHRpIGkgY2hpbGQgZGkgcXVlbCBwYXJlbnQgZSBsaSByZW5kbyBpbnZpc2liaWxpLiBTZSBpbCBjaGlsZCB0cm92YXRvIMOoIGEgc3VhIHZvbHRhIHVuIHBhcmVudCxcclxuICAgICAgICAgICAgLy8gbG8gY29sbGFzc28gZSB2YWRvIGluIHJpY29yc2lvbmUgc3VpIGZpZ2xpXHJcbiAgICAgICAgICAgIGlmIChjaGlsZFt0aGlzLmVzdC5QYXJlbnRLZXldID09IHBhcmVudEtleSAmJiAhY2hpbGQucGFyZW50KVxyXG4gICAgICAgICAgICAgICAgY2hpbGQuX3Zpc2libGUgPSBmYWxzZTtcclxuICAgICAgICAgICAgZWxzZSBpZiAoY2hpbGRbdGhpcy5lc3QuUGFyZW50S2V5XSA9PSBwYXJlbnRLZXkgJiYgY2hpbGQucGFyZW50KSB7XHJcbiAgICAgICAgICAgICAgICBjaGlsZC5fZXhwYW5kZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNoaWxkLl92aXNpYmxlID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlQ2hpbGRPZlBhcmVudChjaGlsZFt0aGlzLmVzdC5Pd25LZXldKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxufVxyXG4iXX0=
|