@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.
Files changed (33) hide show
  1. package/dist/cjs/ez-tree.cjs.entry.js +375 -0
  2. package/dist/cjs/ezui.cjs.js +1 -1
  3. package/dist/cjs/loader.cjs.js +1 -1
  4. package/dist/collection/collection-manifest.json +1 -0
  5. package/dist/collection/components/ez-tree/ez-tree.css +154 -0
  6. package/dist/collection/components/ez-tree/ez-tree.js +428 -0
  7. package/dist/collection/components/ez-tree/interfaces/ITree.js +1 -0
  8. package/dist/collection/components/ez-tree/interfaces/ITreeItem.js +1 -0
  9. package/dist/collection/components/ez-tree/subcomponents/DefaultIconResolver.js +8 -0
  10. package/dist/collection/components/ez-tree/subcomponents/TreeItem.js +25 -0
  11. package/dist/collection/components/ez-tree/subcomponents/index.js +1 -0
  12. package/dist/collection/components/ez-tree/types/Node.js +72 -0
  13. package/dist/collection/components/ez-tree/types/Tree.js +70 -0
  14. package/dist/custom-elements/index.d.ts +6 -0
  15. package/dist/custom-elements/index.js +382 -11
  16. package/dist/esm/ez-tree.entry.js +371 -0
  17. package/dist/esm/ezui.js +1 -1
  18. package/dist/esm/loader.js +1 -1
  19. package/dist/ezui/ezui.esm.js +1 -1
  20. package/dist/ezui/p-79e409c6.entry.js +1 -0
  21. package/dist/types/components/ez-tree/ez-tree.d.ts +66 -0
  22. package/dist/types/components/ez-tree/interfaces/ITree.d.ts +5 -0
  23. package/dist/types/components/ez-tree/interfaces/ITreeItem.d.ts +10 -0
  24. package/dist/types/components/ez-tree/subcomponents/DefaultIconResolver.d.ts +2 -0
  25. package/dist/types/components/ez-tree/subcomponents/TreeItem.d.ts +13 -0
  26. package/dist/types/components/ez-tree/subcomponents/index.d.ts +1 -0
  27. package/dist/types/components/ez-tree/types/Node.d.ts +20 -0
  28. package/dist/types/components/ez-tree/types/Tree.d.ts +16 -0
  29. package/dist/types/components.d.ts +66 -0
  30. package/package.json +1 -1
  31. package/react/components.d.ts +1 -0
  32. package/react/components.js +1 -0
  33. 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,8 @@
1
+ const ICON_EXPANDED = "chevron-down";
2
+ const ICON_COLAPSED = "chevron-right";
3
+ export const defaultIconResolver = (item, expanded, _level) => {
4
+ if (expanded) {
5
+ return item.iconExpanded || ICON_EXPANDED;
6
+ }
7
+ return item.iconContracted || ICON_COLAPSED;
8
+ };
@@ -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;