@sankhyalabs/ezui 2.7.6 → 2.8.0
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/dist/cjs/ez-tree.cjs.entry.js +375 -0
- package/dist/cjs/ezui.cjs.js +1 -1
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +1 -0
- package/dist/collection/components/ez-tree/ez-tree.css +154 -0
- package/dist/collection/components/ez-tree/ez-tree.js +428 -0
- package/dist/collection/components/ez-tree/interfaces/ITree.js +1 -0
- package/dist/collection/components/ez-tree/interfaces/ITreeItem.js +1 -0
- package/dist/collection/components/ez-tree/subcomponents/DefaultIconResolver.js +8 -0
- package/dist/collection/components/ez-tree/subcomponents/TreeItem.js +25 -0
- package/dist/collection/components/ez-tree/subcomponents/index.js +1 -0
- package/dist/collection/components/ez-tree/types/Node.js +72 -0
- package/dist/collection/components/ez-tree/types/Tree.js +70 -0
- package/dist/custom-elements/index.d.ts +6 -0
- package/dist/custom-elements/index.js +382 -11
- package/dist/esm/ez-tree.entry.js +371 -0
- package/dist/esm/ezui.js +1 -1
- package/dist/esm/loader.js +1 -1
- package/dist/ezui/ezui.esm.js +1 -1
- package/dist/ezui/p-79e409c6.entry.js +1 -0
- package/dist/types/components/ez-tree/ez-tree.d.ts +66 -0
- package/dist/types/components/ez-tree/interfaces/ITree.d.ts +5 -0
- package/dist/types/components/ez-tree/interfaces/ITreeItem.d.ts +10 -0
- package/dist/types/components/ez-tree/subcomponents/DefaultIconResolver.d.ts +2 -0
- package/dist/types/components/ez-tree/subcomponents/TreeItem.d.ts +13 -0
- package/dist/types/components/ez-tree/subcomponents/index.d.ts +1 -0
- package/dist/types/components/ez-tree/types/Node.d.ts +20 -0
- package/dist/types/components/ez-tree/types/Tree.d.ts +16 -0
- package/dist/types/components.d.ts +66 -0
- package/package.json +1 -1
- package/react/components.d.ts +1 -0
- package/react/components.js +1 -0
- package/react/components.js.map +1 -1
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
import { ElementIDUtils } from '@sankhyalabs/core';
|
|
2
|
+
import { Component, Element, Event, forceUpdate, h, Host, Listen, Method, Prop, State, Watch } from '@stencil/core';
|
|
3
|
+
import { defaultIconResolver } from './subcomponents';
|
|
4
|
+
import { TreeItem } from './subcomponents/TreeItem';
|
|
5
|
+
import { Tree } from './types/Tree';
|
|
6
|
+
export class EzTree {
|
|
7
|
+
constructor() {
|
|
8
|
+
this._tree = new Tree(() => forceUpdate(this));
|
|
9
|
+
this._onItemClick = (item) => {
|
|
10
|
+
this.openClose(item);
|
|
11
|
+
this.value = item;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Define os itens apresentados na árvore.
|
|
15
|
+
*/
|
|
16
|
+
this.items = [];
|
|
17
|
+
/**
|
|
18
|
+
* Define uma função que vai resolver o ícone daquele item. Retorna o nome do ícone da lib de icones do DS.
|
|
19
|
+
*/
|
|
20
|
+
this.iconResolver = defaultIconResolver;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Efetua a seleção de um item.
|
|
24
|
+
*/
|
|
25
|
+
async selectItem(id) {
|
|
26
|
+
const node = this._tree.getNode(id);
|
|
27
|
+
if (node) {
|
|
28
|
+
this.value = node.item;
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
this.value = undefined;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Realiza a abertura de um item, incluindo a hieraquia acima.
|
|
36
|
+
* Observação para carga dinâmica (Lazyload): O item solicitado já deve
|
|
37
|
+
* estar carregado na lista. Nos casos onde o item ainda não esteja
|
|
38
|
+
* carregado o id pode ser uma string no formato "id1>>id2>>id3",
|
|
39
|
+
* tornando possível a carga a partir de um ponto já carregado.
|
|
40
|
+
*/
|
|
41
|
+
async openItem(id) {
|
|
42
|
+
this._waintingForLoad = true;
|
|
43
|
+
await this._tree.open(id);
|
|
44
|
+
this._waintingForLoad = false;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Desabilita um ou mais itens.
|
|
48
|
+
*/
|
|
49
|
+
async disableItem(id) {
|
|
50
|
+
[].concat(id).forEach(item => this._tree.setDisabled(item, true));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Habilita um ou mais itens.
|
|
54
|
+
*/
|
|
55
|
+
async enableItem(id) {
|
|
56
|
+
[].concat(id).forEach(item => this._tree.setDisabled(item, false));
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Adiciona um ou mais itens. Opcionalmente pode-se determinar a qual
|
|
60
|
+
* item da árvore será anexado o item. Caso não informado parentId,
|
|
61
|
+
* adiciona no item selecionado.
|
|
62
|
+
* Observação para carga dinâmica (Lazyload): O parentId deve ser
|
|
63
|
+
* um item carregado atualmente na árvore.
|
|
64
|
+
*/
|
|
65
|
+
async addChild(item, parentId) {
|
|
66
|
+
var _a;
|
|
67
|
+
if (parentId == undefined) {
|
|
68
|
+
parentId = (_a = this.value) === null || _a === void 0 ? void 0 : _a.id;
|
|
69
|
+
}
|
|
70
|
+
this._tree.addChildAt(parentId, item);
|
|
71
|
+
const node = this._tree.getNode(parentId);
|
|
72
|
+
if (node) {
|
|
73
|
+
node.item.expanded = true;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
observeItems() {
|
|
77
|
+
this._tree.load(this.items);
|
|
78
|
+
}
|
|
79
|
+
observeValue() {
|
|
80
|
+
this.ezChange.emit(this.value);
|
|
81
|
+
}
|
|
82
|
+
onKeyDownListener(event) {
|
|
83
|
+
if (!this.value) {
|
|
84
|
+
return;
|
|
85
|
+
}
|
|
86
|
+
let stop = false;
|
|
87
|
+
switch (event.key) {
|
|
88
|
+
case "ArrowUp":
|
|
89
|
+
this.previousItem();
|
|
90
|
+
stop = true;
|
|
91
|
+
break;
|
|
92
|
+
case "ArrowDown":
|
|
93
|
+
this.nextItem();
|
|
94
|
+
stop = true;
|
|
95
|
+
break;
|
|
96
|
+
case "ArrowLeft":
|
|
97
|
+
this.previousLevel();
|
|
98
|
+
stop = true;
|
|
99
|
+
break;
|
|
100
|
+
case "ArrowRight":
|
|
101
|
+
this.nextLevel();
|
|
102
|
+
stop = true;
|
|
103
|
+
break;
|
|
104
|
+
case " ":
|
|
105
|
+
this.openClose(this.value);
|
|
106
|
+
stop = true;
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
if (stop) {
|
|
110
|
+
event.stopPropagation();
|
|
111
|
+
event.preventDefault();
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
openClose(item) {
|
|
115
|
+
if (item == undefined) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const expanded = !item.expanded;
|
|
119
|
+
item.expanded = expanded;
|
|
120
|
+
if (expanded) {
|
|
121
|
+
this.ezOpenItem.emit(item);
|
|
122
|
+
}
|
|
123
|
+
forceUpdate(this);
|
|
124
|
+
}
|
|
125
|
+
previousLevel() {
|
|
126
|
+
var _a;
|
|
127
|
+
if (!this.value) {
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
if (this.value.expanded) {
|
|
131
|
+
this.value.expanded = false;
|
|
132
|
+
forceUpdate(this);
|
|
133
|
+
}
|
|
134
|
+
else {
|
|
135
|
+
const node = this._tree.getNode(this.value.id);
|
|
136
|
+
const parentItem = (_a = node.parent) === null || _a === void 0 ? void 0 : _a.item;
|
|
137
|
+
if (parentItem) {
|
|
138
|
+
this.value = parentItem;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
nextLevel() {
|
|
143
|
+
if (!this.value) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const node = this._tree.getNode(this.value.id);
|
|
147
|
+
if (!node.isExpandable()) {
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (this.value.expanded) {
|
|
151
|
+
this.nextItem();
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
this.value.expanded = true;
|
|
155
|
+
forceUpdate(this);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
nextItem() {
|
|
159
|
+
const nextIndex = this._visibleItems.indexOf(this.value) + 1;
|
|
160
|
+
if (nextIndex < this._visibleItems.length) {
|
|
161
|
+
this.value = this._visibleItems[nextIndex];
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
previousItem() {
|
|
165
|
+
const nextIndex = this._visibleItems.indexOf(this.value) - 1;
|
|
166
|
+
if (nextIndex > -1) {
|
|
167
|
+
this.value = this._visibleItems[nextIndex];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
render() {
|
|
171
|
+
ElementIDUtils.addIDInfoIfNotExists(this._element, 'ezTree');
|
|
172
|
+
if (this.items == undefined) {
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
this._visibleItems = [];
|
|
176
|
+
return (h(Host, { tabindex: "-1" }, this._waintingForLoad ?
|
|
177
|
+
h("label", null, "Carregando...")
|
|
178
|
+
:
|
|
179
|
+
this._tree.getChildren().map(node => {
|
|
180
|
+
var _a;
|
|
181
|
+
return h(TreeItem, { selectedId: (_a = this.value) === null || _a === void 0 ? void 0 : _a.id, node: node, itemClick: this._onItemClick, iconResolver: this.iconResolver, itemsList: this._visibleItems });
|
|
182
|
+
})));
|
|
183
|
+
}
|
|
184
|
+
static get is() { return "ez-tree"; }
|
|
185
|
+
static get encapsulation() { return "shadow"; }
|
|
186
|
+
static get originalStyleUrls() { return {
|
|
187
|
+
"$": ["ez-tree.css"]
|
|
188
|
+
}; }
|
|
189
|
+
static get styleUrls() { return {
|
|
190
|
+
"$": ["ez-tree.css"]
|
|
191
|
+
}; }
|
|
192
|
+
static get properties() { return {
|
|
193
|
+
"items": {
|
|
194
|
+
"type": "unknown",
|
|
195
|
+
"mutable": false,
|
|
196
|
+
"complexType": {
|
|
197
|
+
"original": "Array<ITreeItem>",
|
|
198
|
+
"resolved": "ITreeItem[]",
|
|
199
|
+
"references": {
|
|
200
|
+
"Array": {
|
|
201
|
+
"location": "global"
|
|
202
|
+
},
|
|
203
|
+
"ITreeItem": {
|
|
204
|
+
"location": "import",
|
|
205
|
+
"path": "./interfaces/ITreeItem"
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
},
|
|
209
|
+
"required": false,
|
|
210
|
+
"optional": false,
|
|
211
|
+
"docs": {
|
|
212
|
+
"tags": [],
|
|
213
|
+
"text": "Define os itens apresentados na \u00E1rvore."
|
|
214
|
+
},
|
|
215
|
+
"defaultValue": "[]"
|
|
216
|
+
},
|
|
217
|
+
"value": {
|
|
218
|
+
"type": "unknown",
|
|
219
|
+
"mutable": true,
|
|
220
|
+
"complexType": {
|
|
221
|
+
"original": "ITreeItem",
|
|
222
|
+
"resolved": "ITreeItem",
|
|
223
|
+
"references": {
|
|
224
|
+
"ITreeItem": {
|
|
225
|
+
"location": "import",
|
|
226
|
+
"path": "./interfaces/ITreeItem"
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
},
|
|
230
|
+
"required": false,
|
|
231
|
+
"optional": false,
|
|
232
|
+
"docs": {
|
|
233
|
+
"tags": [],
|
|
234
|
+
"text": "Define o item selecionado na \u00E1rvore."
|
|
235
|
+
}
|
|
236
|
+
},
|
|
237
|
+
"iconResolver": {
|
|
238
|
+
"type": "unknown",
|
|
239
|
+
"mutable": false,
|
|
240
|
+
"complexType": {
|
|
241
|
+
"original": "(item: ITreeItem, expanded: boolean, level: number) => string",
|
|
242
|
+
"resolved": "(item: ITreeItem, expanded: boolean, level: number) => string",
|
|
243
|
+
"references": {
|
|
244
|
+
"ITreeItem": {
|
|
245
|
+
"location": "import",
|
|
246
|
+
"path": "./interfaces/ITreeItem"
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
},
|
|
250
|
+
"required": false,
|
|
251
|
+
"optional": false,
|
|
252
|
+
"docs": {
|
|
253
|
+
"tags": [],
|
|
254
|
+
"text": "Define uma fun\u00E7\u00E3o que vai resolver o \u00EDcone daquele item. Retorna o nome do \u00EDcone da lib de icones do DS."
|
|
255
|
+
},
|
|
256
|
+
"defaultValue": "defaultIconResolver"
|
|
257
|
+
}
|
|
258
|
+
}; }
|
|
259
|
+
static get states() { return {
|
|
260
|
+
"_waintingForLoad": {}
|
|
261
|
+
}; }
|
|
262
|
+
static get events() { return [{
|
|
263
|
+
"method": "ezChange",
|
|
264
|
+
"name": "ezChange",
|
|
265
|
+
"bubbles": true,
|
|
266
|
+
"cancelable": true,
|
|
267
|
+
"composed": true,
|
|
268
|
+
"docs": {
|
|
269
|
+
"tags": [],
|
|
270
|
+
"text": "Emitido quando um item \u00E9 selecionado na \u00E1rvore."
|
|
271
|
+
},
|
|
272
|
+
"complexType": {
|
|
273
|
+
"original": "ITreeItem",
|
|
274
|
+
"resolved": "ITreeItem",
|
|
275
|
+
"references": {
|
|
276
|
+
"ITreeItem": {
|
|
277
|
+
"location": "import",
|
|
278
|
+
"path": "./interfaces/ITreeItem"
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
}, {
|
|
283
|
+
"method": "ezOpenItem",
|
|
284
|
+
"name": "ezOpenItem",
|
|
285
|
+
"bubbles": true,
|
|
286
|
+
"cancelable": true,
|
|
287
|
+
"composed": true,
|
|
288
|
+
"docs": {
|
|
289
|
+
"tags": [],
|
|
290
|
+
"text": "Emitido quando um item \u00E9 aberto na \u00E1rvore."
|
|
291
|
+
},
|
|
292
|
+
"complexType": {
|
|
293
|
+
"original": "ITreeItem",
|
|
294
|
+
"resolved": "ITreeItem",
|
|
295
|
+
"references": {
|
|
296
|
+
"ITreeItem": {
|
|
297
|
+
"location": "import",
|
|
298
|
+
"path": "./interfaces/ITreeItem"
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}]; }
|
|
303
|
+
static get methods() { return {
|
|
304
|
+
"selectItem": {
|
|
305
|
+
"complexType": {
|
|
306
|
+
"signature": "(id: string) => Promise<void>",
|
|
307
|
+
"parameters": [{
|
|
308
|
+
"tags": [],
|
|
309
|
+
"text": ""
|
|
310
|
+
}],
|
|
311
|
+
"references": {
|
|
312
|
+
"Promise": {
|
|
313
|
+
"location": "global"
|
|
314
|
+
}
|
|
315
|
+
},
|
|
316
|
+
"return": "Promise<void>"
|
|
317
|
+
},
|
|
318
|
+
"docs": {
|
|
319
|
+
"text": "Efetua a sele\u00E7\u00E3o de um item.",
|
|
320
|
+
"tags": []
|
|
321
|
+
}
|
|
322
|
+
},
|
|
323
|
+
"openItem": {
|
|
324
|
+
"complexType": {
|
|
325
|
+
"signature": "(id: string) => Promise<void>",
|
|
326
|
+
"parameters": [{
|
|
327
|
+
"tags": [],
|
|
328
|
+
"text": ""
|
|
329
|
+
}],
|
|
330
|
+
"references": {
|
|
331
|
+
"Promise": {
|
|
332
|
+
"location": "global"
|
|
333
|
+
}
|
|
334
|
+
},
|
|
335
|
+
"return": "Promise<void>"
|
|
336
|
+
},
|
|
337
|
+
"docs": {
|
|
338
|
+
"text": "Realiza a abertura de um item, incluindo a hieraquia acima.\nObserva\u00E7\u00E3o para carga din\u00E2mica (Lazyload): O item solicitado j\u00E1 deve\nestar carregado na lista. Nos casos onde o item ainda n\u00E3o esteja \ncarregado o id pode ser uma string no formato \"id1>>id2>>id3\",\ntornando poss\u00EDvel a carga a partir de um ponto j\u00E1 carregado.",
|
|
339
|
+
"tags": []
|
|
340
|
+
}
|
|
341
|
+
},
|
|
342
|
+
"disableItem": {
|
|
343
|
+
"complexType": {
|
|
344
|
+
"signature": "(id: string | Array<string>) => Promise<void>",
|
|
345
|
+
"parameters": [{
|
|
346
|
+
"tags": [],
|
|
347
|
+
"text": ""
|
|
348
|
+
}],
|
|
349
|
+
"references": {
|
|
350
|
+
"Promise": {
|
|
351
|
+
"location": "global"
|
|
352
|
+
},
|
|
353
|
+
"Array": {
|
|
354
|
+
"location": "global"
|
|
355
|
+
}
|
|
356
|
+
},
|
|
357
|
+
"return": "Promise<void>"
|
|
358
|
+
},
|
|
359
|
+
"docs": {
|
|
360
|
+
"text": "Desabilita um ou mais itens.",
|
|
361
|
+
"tags": []
|
|
362
|
+
}
|
|
363
|
+
},
|
|
364
|
+
"enableItem": {
|
|
365
|
+
"complexType": {
|
|
366
|
+
"signature": "(id: string | Array<string>) => Promise<void>",
|
|
367
|
+
"parameters": [{
|
|
368
|
+
"tags": [],
|
|
369
|
+
"text": ""
|
|
370
|
+
}],
|
|
371
|
+
"references": {
|
|
372
|
+
"Promise": {
|
|
373
|
+
"location": "global"
|
|
374
|
+
},
|
|
375
|
+
"Array": {
|
|
376
|
+
"location": "global"
|
|
377
|
+
}
|
|
378
|
+
},
|
|
379
|
+
"return": "Promise<void>"
|
|
380
|
+
},
|
|
381
|
+
"docs": {
|
|
382
|
+
"text": "Habilita um ou mais itens.",
|
|
383
|
+
"tags": []
|
|
384
|
+
}
|
|
385
|
+
},
|
|
386
|
+
"addChild": {
|
|
387
|
+
"complexType": {
|
|
388
|
+
"signature": "(item: ITreeItem, parentId?: string) => Promise<void>",
|
|
389
|
+
"parameters": [{
|
|
390
|
+
"tags": [],
|
|
391
|
+
"text": ""
|
|
392
|
+
}, {
|
|
393
|
+
"tags": [],
|
|
394
|
+
"text": ""
|
|
395
|
+
}],
|
|
396
|
+
"references": {
|
|
397
|
+
"Promise": {
|
|
398
|
+
"location": "global"
|
|
399
|
+
},
|
|
400
|
+
"ITreeItem": {
|
|
401
|
+
"location": "import",
|
|
402
|
+
"path": "./interfaces/ITreeItem"
|
|
403
|
+
}
|
|
404
|
+
},
|
|
405
|
+
"return": "Promise<void>"
|
|
406
|
+
},
|
|
407
|
+
"docs": {
|
|
408
|
+
"text": "Adiciona um ou mais itens. Opcionalmente pode-se determinar a qual\nitem da \u00E1rvore ser\u00E1 anexado o item. Caso n\u00E3o informado parentId,\nadiciona no item selecionado.\nObserva\u00E7\u00E3o para carga din\u00E2mica (Lazyload): O parentId deve ser\num item carregado atualmente na \u00E1rvore.",
|
|
409
|
+
"tags": []
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
}; }
|
|
413
|
+
static get elementRef() { return "_element"; }
|
|
414
|
+
static get watchers() { return [{
|
|
415
|
+
"propName": "items",
|
|
416
|
+
"methodName": "observeItems"
|
|
417
|
+
}, {
|
|
418
|
+
"propName": "value",
|
|
419
|
+
"methodName": "observeValue"
|
|
420
|
+
}]; }
|
|
421
|
+
static get listeners() { return [{
|
|
422
|
+
"name": "keydown",
|
|
423
|
+
"method": "onKeyDownListener",
|
|
424
|
+
"target": undefined,
|
|
425
|
+
"capture": true,
|
|
426
|
+
"passive": false
|
|
427
|
+
}]; }
|
|
428
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { ElementIDUtils } from "@sankhyalabs/core";
|
|
2
|
+
import { h } from "@stencil/core";
|
|
3
|
+
export const TreeItem = (props) => {
|
|
4
|
+
const { node, selectedId, itemClick, iconResolver, itemsList } = props;
|
|
5
|
+
const treeItem = node.item;
|
|
6
|
+
const level = props.level || 1;
|
|
7
|
+
const disabled = node.isDisabled();
|
|
8
|
+
const expanded = !disabled && treeItem.expanded;
|
|
9
|
+
const expandable = node.isExpandable();
|
|
10
|
+
const available = !disabled && !node.isPlaceHolder;
|
|
11
|
+
if (available) {
|
|
12
|
+
itemsList.push(treeItem);
|
|
13
|
+
}
|
|
14
|
+
return (h("ul", { title: treeItem.label, class: level === 1 ? "first-level" : undefined },
|
|
15
|
+
h("li", Object.assign({ class: "tree-item", onClick: () => available && itemClick(treeItem) }, {
|
|
16
|
+
disabled,
|
|
17
|
+
selected: treeItem.id === selectedId,
|
|
18
|
+
[ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`ezTreeItem_${treeItem.id}`)
|
|
19
|
+
}),
|
|
20
|
+
h("div", { class: "item-icon-box" }, expandable &&
|
|
21
|
+
h("ez-icon", { id: treeItem.id, class: "item-icon", size: "small", iconName: iconResolver(treeItem, expanded, level) })),
|
|
22
|
+
h("label", { class: "item-label" }, treeItem.label)),
|
|
23
|
+
expanded
|
|
24
|
+
&& node.getChildren().map(child => h(TreeItem, { selectedId: selectedId, node: child, itemClick: itemClick, level: level + 1, iconResolver: iconResolver, itemsList: itemsList }))));
|
|
25
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { defaultIconResolver } from "./DefaultIconResolver";
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export class Node {
|
|
2
|
+
constructor(tree, item, parent, isPlaceHolder = false) {
|
|
3
|
+
this.children = new Map();
|
|
4
|
+
this.item = item;
|
|
5
|
+
this.parent = parent;
|
|
6
|
+
this._tree = tree;
|
|
7
|
+
this.isPlaceHolder = isPlaceHolder;
|
|
8
|
+
if (item && !isPlaceHolder) {
|
|
9
|
+
this._isLazyLoad = typeof item.children === "function" || item.childrenCount > 0;
|
|
10
|
+
if (Array.isArray(item.children)) {
|
|
11
|
+
Array.from(item.children).forEach(item => this.addChild(this._tree, item));
|
|
12
|
+
this._childrenLoaded = true;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
else {
|
|
16
|
+
this._isLazyLoad = false;
|
|
17
|
+
this._childrenLoaded = true;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
isDisabled() {
|
|
21
|
+
if (this.isPlaceHolder) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return this._tree.isNodeDisabled(this.item.id, this.item.disabled);
|
|
25
|
+
}
|
|
26
|
+
updateChildren(children) {
|
|
27
|
+
if (this.isPlaceHolder) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
this.item.children = children;
|
|
31
|
+
this._childrenLoaded = true;
|
|
32
|
+
this.children.clear();
|
|
33
|
+
children.forEach(item => this.addChild(this._tree, Object.assign({}, item)));
|
|
34
|
+
}
|
|
35
|
+
addChild(tree, item) {
|
|
36
|
+
if (!this.children.has(item.id)) {
|
|
37
|
+
this.children.set(item.id, new Node(tree, item, this));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
addPlaceHolder() {
|
|
41
|
+
this.children.clear();
|
|
42
|
+
const id = this.item.id;
|
|
43
|
+
this.children.set(id, new Node(undefined, { id: `placeholder_${id}`, label: "Carregando..." }, this, true));
|
|
44
|
+
}
|
|
45
|
+
getNode(id) {
|
|
46
|
+
if (this.children.has(id)) {
|
|
47
|
+
return this.children.get(id);
|
|
48
|
+
}
|
|
49
|
+
const childrenArray = Array.from(this.children.values());
|
|
50
|
+
for (const child of childrenArray) {
|
|
51
|
+
const result = child.getNode(id);
|
|
52
|
+
if (result) {
|
|
53
|
+
return result;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
needLoad() {
|
|
58
|
+
return this._isLazyLoad && !this._childrenLoaded;
|
|
59
|
+
}
|
|
60
|
+
isExpandable() {
|
|
61
|
+
return this._isLazyLoad || this.children.size > 0 || Array.isArray(this.item.children);
|
|
62
|
+
}
|
|
63
|
+
getChildren() {
|
|
64
|
+
if (this.isPlaceHolder) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
if (this.needLoad()) {
|
|
68
|
+
this._tree.loadChildren(this);
|
|
69
|
+
}
|
|
70
|
+
return Array.from(this.children.values());
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Node } from "./Node";
|
|
2
|
+
export class Tree extends Node {
|
|
3
|
+
constructor(changeCallback) {
|
|
4
|
+
super(undefined);
|
|
5
|
+
this._disabledValues = new Map();
|
|
6
|
+
this._changeCallback = changeCallback;
|
|
7
|
+
}
|
|
8
|
+
async addChildAt(parentId, item) {
|
|
9
|
+
const parent = this.getNode(parentId);
|
|
10
|
+
if (parent == undefined) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
parent.addChild(this, item);
|
|
14
|
+
this._changeCallback();
|
|
15
|
+
}
|
|
16
|
+
setDisabled(id, value) {
|
|
17
|
+
this._disabledValues.set(id, value);
|
|
18
|
+
this._changeCallback();
|
|
19
|
+
}
|
|
20
|
+
isNodeDisabled(id, defaultValue) {
|
|
21
|
+
if (!this._disabledValues.has(id)) {
|
|
22
|
+
return defaultValue;
|
|
23
|
+
}
|
|
24
|
+
return this._disabledValues.get(id);
|
|
25
|
+
}
|
|
26
|
+
load(items) {
|
|
27
|
+
this.children.clear();
|
|
28
|
+
items.forEach(item => this.addChild(this, Object.assign({}, item)));
|
|
29
|
+
}
|
|
30
|
+
async open(path) {
|
|
31
|
+
return new Promise(async (resolve) => {
|
|
32
|
+
await this.walk(this, path, node => node.item.expanded = true);
|
|
33
|
+
resolve();
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async walk(parent, path, callback, currentLevel = 0) {
|
|
37
|
+
return new Promise(async (resolve) => {
|
|
38
|
+
const levels = path.split(">>").map(item => item.trim());
|
|
39
|
+
if (levels.length > currentLevel) {
|
|
40
|
+
const node = parent.getNode(levels[currentLevel]);
|
|
41
|
+
if (node) {
|
|
42
|
+
if (node.needLoad()) {
|
|
43
|
+
await this.loadLevel(node);
|
|
44
|
+
}
|
|
45
|
+
callback(node);
|
|
46
|
+
await this.walk(node, path, callback, currentLevel + 1);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
resolve();
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
async loadChildren(node) {
|
|
53
|
+
return new Promise(resolve => {
|
|
54
|
+
this.loadLevel(node).then(() => {
|
|
55
|
+
resolve();
|
|
56
|
+
this._changeCallback();
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
async loadLevel(node) {
|
|
61
|
+
return new Promise(resolve => {
|
|
62
|
+
node.addPlaceHolder();
|
|
63
|
+
const loader = node.item.children;
|
|
64
|
+
loader(node.item).then(result => {
|
|
65
|
+
node.updateChildren(result);
|
|
66
|
+
resolve();
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -206,6 +206,12 @@ export const EzToast: {
|
|
|
206
206
|
new (): EzToast;
|
|
207
207
|
};
|
|
208
208
|
|
|
209
|
+
interface EzTree extends Components.EzTree, HTMLElement {}
|
|
210
|
+
export const EzTree: {
|
|
211
|
+
prototype: EzTree;
|
|
212
|
+
new (): EzTree;
|
|
213
|
+
};
|
|
214
|
+
|
|
209
215
|
interface EzUpload extends Components.EzUpload, HTMLElement {}
|
|
210
216
|
export const EzUpload: {
|
|
211
217
|
prototype: EzUpload;
|