@sankhyalabs/ezui 2.10.1 → 2.12.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-actions-button.cjs.entry.js +1 -1
- package/dist/cjs/ez-alert.cjs.entry.js +1 -1
- package/dist/cjs/ez-application.cjs.entry.js +1 -1
- package/dist/cjs/ez-breadcrumb.cjs.entry.js +1 -1
- package/dist/cjs/ez-button.cjs.entry.js +1 -1
- package/dist/cjs/ez-calendar.cjs.entry.js +1 -1
- package/dist/cjs/ez-card-item.cjs.entry.js +1 -1
- package/dist/cjs/ez-check.cjs.entry.js +1 -1
- package/dist/cjs/ez-chip.cjs.entry.js +1 -1
- package/dist/cjs/ez-collapsible-box.cjs.entry.js +1 -1
- package/dist/cjs/ez-combo-box.cjs.entry.js +1 -1
- package/dist/cjs/ez-date-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-date-time-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-dialog.cjs.entry.js +1 -1
- package/dist/cjs/ez-dropdown.cjs.entry.js +503 -0
- package/dist/cjs/ez-file-item.cjs.entry.js +1 -1
- package/dist/cjs/ez-filter-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-form-view.cjs.entry.js +140 -0
- package/dist/cjs/ez-form.cjs.entry.js +228 -330
- package/dist/cjs/ez-grid.cjs.entry.js +1 -1
- package/dist/cjs/ez-icon.cjs.entry.js +1 -1
- package/dist/cjs/ez-list.cjs.entry.js +1 -1
- package/dist/cjs/ez-loading-bar.cjs.entry.js +1 -1
- package/dist/cjs/ez-modal-container.cjs.entry.js +1 -1
- package/dist/cjs/ez-modal.cjs.entry.js +1 -1
- package/dist/cjs/ez-number-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-popover.cjs.entry.js +1 -1
- package/dist/cjs/ez-popup.cjs.entry.js +1 -1
- package/dist/cjs/ez-radio-button.cjs.entry.js +1 -1
- package/dist/cjs/ez-scroller.cjs.entry.js +1 -1
- package/dist/cjs/ez-search.cjs.entry.js +1 -1
- package/dist/cjs/ez-sidebar-button.cjs.entry.js +1 -1
- package/dist/cjs/ez-tabselector.cjs.entry.js +6 -3
- package/dist/cjs/ez-text-area.cjs.entry.js +1 -1
- package/dist/cjs/ez-text-edit.cjs.entry.js +1 -1
- package/dist/cjs/ez-text-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-time-input.cjs.entry.js +1 -1
- package/dist/cjs/ez-toast.cjs.entry.js +1 -1
- package/dist/cjs/ez-tree.cjs.entry.js +109 -22
- package/dist/cjs/ez-upload.cjs.entry.js +1 -1
- package/dist/cjs/ez-view-stack.cjs.entry.js +1 -1
- package/dist/cjs/ezui.cjs.js +2 -2
- package/dist/cjs/{index-8646c40d.js → index-5e208fa5.js} +11 -0
- package/dist/cjs/loader.cjs.js +2 -2
- package/dist/collection/collection-manifest.json +2 -0
- package/dist/collection/components/ez-dropdown/ez-dropdown.css +349 -0
- package/dist/collection/components/ez-dropdown/ez-dropdown.js +339 -0
- package/dist/collection/components/ez-dropdown/structure/DropdownItem.js +33 -0
- package/dist/collection/components/ez-dropdown/structure/SubmenuControl.js +241 -0
- package/dist/collection/components/ez-form/{structure/FormSheetMetadata.js → FormMetadata.js} +39 -54
- package/dist/collection/components/ez-form/ez-form.css +7 -1
- package/dist/collection/components/ez-form/ez-form.js +128 -19
- package/dist/collection/components/ez-form/interfaces/IDefaultConfig.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IFieldConfig.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IFormConfig.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IFormSheetMetadata.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IInvalidField.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IRecordValidator.js +1 -0
- package/dist/collection/components/ez-form/interfaces/ITabConfig.js +1 -0
- package/dist/collection/components/ez-form/interfaces/IValidationResult.js +1 -0
- package/dist/collection/components/ez-form/interfaces/index.js +1 -0
- package/dist/collection/components/ez-form/store/form.slice.js +6 -2
- package/dist/collection/components/ez-form-view/ez-form-view.css +6 -0
- package/dist/collection/components/ez-form-view/ez-form-view.js +71 -0
- package/dist/collection/components/ez-form-view/fieldbuilder/FieldBuilder.js +26 -0
- package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/CheckBox.tpl.js +4 -4
- package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/ComboBox.tpl.js +2 -2
- package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/DateInput.tpl.js +1 -1
- package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/NumberInput.tpl.js +3 -3
- package/dist/collection/components/ez-form-view/interfaces/IFormViewField.js +1 -0
- package/dist/collection/components/ez-form-view/interfaces/index.js +1 -0
- package/dist/collection/components/ez-tabselector/ez-tabselector.js +5 -2
- package/dist/collection/components/ez-tree/ez-tree.css +8 -6
- package/dist/collection/components/ez-tree/ez-tree.js +89 -11
- package/dist/collection/components/ez-tree/subcomponents/DefaultTooltipResolver.js +3 -0
- package/dist/collection/components/ez-tree/subcomponents/TreeItem.js +4 -4
- package/dist/collection/components/ez-tree/subcomponents/index.js +1 -0
- package/dist/collection/components/ez-tree/types/Node.js +26 -4
- package/dist/collection/components/ez-tree/types/Tree.js +23 -2
- package/dist/custom-elements/index.d.ts +12 -0
- package/dist/custom-elements/index.js +977 -355
- package/dist/esm/ez-actions-button.entry.js +1 -1
- package/dist/esm/ez-alert.entry.js +1 -1
- package/dist/esm/ez-application.entry.js +1 -1
- package/dist/esm/ez-breadcrumb.entry.js +1 -1
- package/dist/esm/ez-button.entry.js +1 -1
- package/dist/esm/ez-calendar.entry.js +1 -1
- package/dist/esm/ez-card-item.entry.js +1 -1
- package/dist/esm/ez-check.entry.js +1 -1
- package/dist/esm/ez-chip.entry.js +1 -1
- package/dist/esm/ez-collapsible-box.entry.js +1 -1
- package/dist/esm/ez-combo-box.entry.js +1 -1
- package/dist/esm/ez-date-input.entry.js +1 -1
- package/dist/esm/ez-date-time-input.entry.js +1 -1
- package/dist/esm/ez-dialog.entry.js +1 -1
- package/dist/esm/ez-dropdown.entry.js +499 -0
- package/dist/esm/ez-file-item.entry.js +1 -1
- package/dist/esm/ez-filter-input.entry.js +1 -1
- package/dist/esm/ez-form-view.entry.js +136 -0
- package/dist/esm/ez-form.entry.js +229 -331
- package/dist/esm/ez-grid.entry.js +1 -1
- package/dist/esm/ez-icon.entry.js +1 -1
- package/dist/esm/ez-list.entry.js +1 -1
- package/dist/esm/ez-loading-bar.entry.js +1 -1
- package/dist/esm/ez-modal-container.entry.js +1 -1
- package/dist/esm/ez-modal.entry.js +1 -1
- package/dist/esm/ez-number-input.entry.js +1 -1
- package/dist/esm/ez-popover.entry.js +1 -1
- package/dist/esm/ez-popup.entry.js +1 -1
- package/dist/esm/ez-radio-button.entry.js +1 -1
- package/dist/esm/ez-scroller.entry.js +1 -1
- package/dist/esm/ez-search.entry.js +1 -1
- package/dist/esm/ez-sidebar-button.entry.js +1 -1
- package/dist/esm/ez-tabselector.entry.js +6 -3
- package/dist/esm/ez-text-area.entry.js +1 -1
- package/dist/esm/ez-text-edit.entry.js +1 -1
- package/dist/esm/ez-text-input.entry.js +1 -1
- package/dist/esm/ez-time-input.entry.js +1 -1
- package/dist/esm/ez-toast.entry.js +1 -1
- package/dist/esm/ez-tree.entry.js +109 -22
- package/dist/esm/ez-upload.entry.js +1 -1
- package/dist/esm/ez-view-stack.entry.js +1 -1
- package/dist/esm/ezui.js +2 -2
- package/dist/esm/{index-7bc778b3.js → index-c5203f95.js} +11 -0
- package/dist/esm/loader.js +2 -2
- package/dist/ezui/ezui.esm.js +1 -1
- package/dist/ezui/{p-739d60d1.entry.js → p-0c3f7bf2.entry.js} +1 -1
- package/dist/ezui/{p-171c3236.entry.js → p-0cd0545d.entry.js} +1 -1
- package/dist/ezui/{p-ad5fe50b.entry.js → p-1a27bb9f.entry.js} +1 -1
- package/dist/ezui/{p-3cfefc57.entry.js → p-1b94b9dc.entry.js} +1 -1
- package/dist/ezui/{p-f18f16e0.entry.js → p-20c01161.entry.js} +1 -1
- package/dist/ezui/{p-1634c851.entry.js → p-24717f87.entry.js} +1 -1
- package/dist/ezui/{p-7e496975.entry.js → p-3320768e.entry.js} +1 -1
- package/dist/ezui/{p-123a2bd5.entry.js → p-36ed5c45.entry.js} +1 -1
- package/dist/ezui/{p-25e83e46.entry.js → p-3b2091dd.entry.js} +1 -1
- package/dist/ezui/p-47bcc678.entry.js +1 -0
- package/dist/ezui/{p-9def6fd0.entry.js → p-47ca5e09.entry.js} +1 -1
- package/dist/ezui/{p-04fab1e9.entry.js → p-4c444816.entry.js} +1 -1
- package/dist/ezui/{p-9334a724.entry.js → p-608d13e8.entry.js} +1 -1
- package/dist/ezui/{p-50ae478a.entry.js → p-626b8940.entry.js} +1 -1
- package/dist/ezui/{p-14a04845.entry.js → p-6630eca2.entry.js} +1 -1
- package/dist/ezui/{p-9404f22b.entry.js → p-67b9a2cb.entry.js} +1 -1
- package/dist/ezui/{p-93bcc628.entry.js → p-6dec5cfa.entry.js} +1 -1
- package/dist/ezui/{p-5dc3af60.entry.js → p-6f9aba86.entry.js} +1 -1
- package/dist/ezui/p-7799666d.entry.js +1 -0
- package/dist/ezui/p-7b80df03.js +1 -0
- package/dist/ezui/{p-5c9ce8a7.entry.js → p-7d42065a.entry.js} +1 -1
- package/dist/ezui/{p-74c7f960.entry.js → p-81897c04.entry.js} +1 -1
- package/dist/ezui/p-91f8c816.entry.js +1 -0
- package/dist/ezui/p-97d2d2f6.entry.js +1 -0
- package/dist/ezui/{p-32f9f83a.entry.js → p-98c448c9.entry.js} +1 -1
- package/dist/ezui/{p-a86d00b3.entry.js → p-99aea44b.entry.js} +1 -1
- package/dist/ezui/p-a4b4645d.entry.js +1 -0
- package/dist/ezui/{p-e613d9bf.entry.js → p-ab5eee38.entry.js} +1 -1
- package/dist/ezui/{p-a2e55b33.entry.js → p-ad7151e0.entry.js} +1 -1
- package/dist/ezui/{p-f6111077.entry.js → p-ad8b7412.entry.js} +1 -1
- package/dist/ezui/{p-1a89d3ff.entry.js → p-b2e861cb.entry.js} +1 -1
- package/dist/ezui/{p-f2627de5.entry.js → p-b2efb22c.entry.js} +1 -1
- package/dist/ezui/{p-04a3b457.entry.js → p-b5557d33.entry.js} +1 -1
- package/dist/ezui/p-ba03ac61.entry.js +1 -0
- package/dist/ezui/{p-6fd5e142.entry.js → p-bc324ee8.entry.js} +1 -1
- package/dist/ezui/{p-cfcc23e6.entry.js → p-bd9792e2.entry.js} +1 -1
- package/dist/ezui/{p-7c227b86.entry.js → p-bf8a633d.entry.js} +1 -1
- package/dist/ezui/{p-ea877274.entry.js → p-c071db26.entry.js} +1 -1
- package/dist/ezui/{p-46113d5a.entry.js → p-c3529df3.entry.js} +1 -1
- package/dist/ezui/{p-b60fbad2.entry.js → p-ca7435a6.entry.js} +1 -1
- package/dist/ezui/{p-37335c51.entry.js → p-e203c89f.entry.js} +1 -1
- package/dist/ezui/{p-f2c4e811.entry.js → p-fc97f773.entry.js} +1 -1
- package/dist/types/components/ez-dropdown/ez-dropdown.d.ts +58 -0
- package/dist/types/components/ez-dropdown/structure/DropdownItem.d.ts +28 -0
- package/dist/types/components/ez-dropdown/structure/SubmenuControl.d.ts +78 -0
- package/dist/types/components/ez-form/DataBinder.d.ts +1 -1
- package/dist/types/components/ez-form/FormMetadata.d.ts +16 -0
- package/dist/types/components/ez-form/ez-form.d.ts +21 -43
- package/dist/types/components/ez-form/interfaces/IDefaultConfig.d.ts +5 -0
- package/dist/types/components/ez-form/interfaces/IFieldConfig.d.ts +13 -0
- package/dist/types/components/ez-form/interfaces/IFormConfig.d.ts +7 -0
- package/dist/types/components/ez-form/interfaces/IFormSheetMetadata.d.ts +9 -0
- package/dist/types/components/ez-form/interfaces/IInvalidField.d.ts +4 -0
- package/dist/types/components/ez-form/interfaces/IRecordValidator.d.ts +6 -0
- package/dist/types/components/ez-form/interfaces/ITabConfig.d.ts +5 -0
- package/dist/types/components/ez-form/interfaces/IValidationResult.d.ts +8 -0
- package/dist/types/components/ez-form/interfaces/index.d.ts +8 -0
- package/dist/types/components/ez-form/store/form.slice.d.ts +5 -3
- package/dist/types/components/ez-form-view/fieldbuilder/FieldBuilder.d.ts +2 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/CheckBox.tpl.d.ts +3 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/ComboBox.tpl.d.ts +2 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/DateInput.tpl.d.ts +4 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/FileInput.tpl.d.ts +2 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/NumberInput.tpl.d.ts +3 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/SearchInput.tpl.d.ts +2 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/TextArea.tpl.d.ts +2 -0
- package/dist/types/components/ez-form-view/fieldbuilder/templates/TextInput.tpl.d.ts +2 -0
- package/dist/types/components/ez-form-view/interfaces/IFormViewField.d.ts +10 -0
- package/dist/types/components/ez-form-view/interfaces/index.d.ts +1 -0
- package/dist/types/components/ez-tree/ez-tree.d.ts +13 -0
- package/dist/types/components/ez-tree/interfaces/ITreeItem.d.ts +1 -0
- package/dist/types/components/ez-tree/subcomponents/DefaultTooltipResolver.d.ts +2 -0
- package/dist/types/components/ez-tree/subcomponents/TreeItem.d.ts +2 -0
- package/dist/types/components/ez-tree/subcomponents/index.d.ts +1 -0
- package/dist/types/components/ez-tree/types/Node.d.ts +1 -0
- package/dist/types/components/ez-tree/types/Tree.d.ts +1 -0
- package/dist/types/components.d.ts +111 -2
- package/package.json +1 -1
- package/react/components.d.ts +2 -0
- package/react/components.js +2 -0
- package/react/components.js.map +1 -1
- package/dist/collection/components/ez-form/fieldbuilder/FieldBuilder.js +0 -48
- package/dist/collection/components/ez-form/structure/FormItem.js +0 -11
- package/dist/collection/components/ez-form/structure/FormSheet.js +0 -6
- package/dist/ezui/p-1cc11468.entry.js +0 -1
- package/dist/ezui/p-3c7ea91b.js +0 -1
- package/dist/ezui/p-79e409c6.entry.js +0 -1
- package/dist/ezui/p-941e9792.entry.js +0 -1
- package/dist/ezui/p-ddb1c350.entry.js +0 -1
- package/dist/types/components/ez-form/fieldbuilder/FieldBuilder.d.ts +0 -2
- package/dist/types/components/ez-form/fieldbuilder/tpl/CheckBox.tpl.d.ts +0 -3
- package/dist/types/components/ez-form/fieldbuilder/tpl/ComboBox.tpl.d.ts +0 -6
- package/dist/types/components/ez-form/fieldbuilder/tpl/DateInput.tpl.d.ts +0 -15
- package/dist/types/components/ez-form/fieldbuilder/tpl/FileInput.tpl.d.ts +0 -5
- package/dist/types/components/ez-form/fieldbuilder/tpl/NumberInput.tpl.d.ts +0 -7
- package/dist/types/components/ez-form/fieldbuilder/tpl/SearchInput.tpl.d.ts +0 -6
- package/dist/types/components/ez-form/fieldbuilder/tpl/TextArea.tpl.d.ts +0 -5
- package/dist/types/components/ez-form/fieldbuilder/tpl/TextInput.tpl.d.ts +0 -5
- package/dist/types/components/ez-form/structure/FormItem.d.ts +0 -9
- package/dist/types/components/ez-form/structure/FormSheet.d.ts +0 -10
- package/dist/types/components/ez-form/structure/FormSheetMetadata.d.ts +0 -35
- /package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/FileInput.tpl.js +0 -0
- /package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/SearchInput.tpl.js +0 -0
- /package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/TextArea.tpl.js +0 -0
- /package/dist/collection/components/{ez-form/fieldbuilder/tpl → ez-form-view/fieldbuilder/templates}/TextInput.tpl.js +0 -0
|
@@ -0,0 +1,339 @@
|
|
|
1
|
+
import { ElementIDUtils, ObjectUtils } from '@sankhyalabs/core';
|
|
2
|
+
import { Component, Element, Event, h, Host, Prop } from '@stencil/core';
|
|
3
|
+
import { DropdownItem } from './structure/DropdownItem';
|
|
4
|
+
import { SubmenuControl } from './structure/SubmenuControl';
|
|
5
|
+
export class EzDropdown {
|
|
6
|
+
constructor() {
|
|
7
|
+
this._itemList = {};
|
|
8
|
+
this._submenuList = [];
|
|
9
|
+
this._openedMenuList = {};
|
|
10
|
+
/**
|
|
11
|
+
* Limitador de níveis de menu + submenu.
|
|
12
|
+
* Valor 0, null ou undefined desativa o limitador.
|
|
13
|
+
*/
|
|
14
|
+
this._levelLimits = 3;
|
|
15
|
+
/**
|
|
16
|
+
* Lista de itens que vão ser apresentados no dropdown.
|
|
17
|
+
*/
|
|
18
|
+
this.items = [];
|
|
19
|
+
}
|
|
20
|
+
//---------------------------------------------
|
|
21
|
+
// Private methods
|
|
22
|
+
//---------------------------------------------
|
|
23
|
+
defaultItemBuilder(item, isLockedLevels, hasIcon, hasChildren) {
|
|
24
|
+
return (h(DropdownItem, { item: item, hasIcon: hasIcon, hasChildren: hasChildren, isLockedLevels: isLockedLevels, onSubActionClick: this.onSubActionClick.bind(this) }));
|
|
25
|
+
}
|
|
26
|
+
getMaxOrder(items) {
|
|
27
|
+
if (items == undefined || items.length === 0) {
|
|
28
|
+
return -1;
|
|
29
|
+
}
|
|
30
|
+
return Math.max(...items.map((item) => {
|
|
31
|
+
var _a;
|
|
32
|
+
const order = (_a = item.group) === null || _a === void 0 ? void 0 : _a["order"];
|
|
33
|
+
return order != undefined && order >= 0 ? order : -1;
|
|
34
|
+
}));
|
|
35
|
+
}
|
|
36
|
+
hasIcon(items) {
|
|
37
|
+
return items === null || items === void 0 ? void 0 : items.some((item) => (item.iconName || "") !== "");
|
|
38
|
+
}
|
|
39
|
+
hasGroup(items) {
|
|
40
|
+
return items === null || items === void 0 ? void 0 : items.some((item) => (item.group || "") !== "");
|
|
41
|
+
}
|
|
42
|
+
hasChildren(items) {
|
|
43
|
+
return items === null || items === void 0 ? void 0 : items.some((item) => (item.children || []).length > 0);
|
|
44
|
+
}
|
|
45
|
+
isLockedLevels(level) {
|
|
46
|
+
if (!this._levelLimits) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
return level === (this._levelLimits + 1);
|
|
50
|
+
}
|
|
51
|
+
getItemsByGroup(items, level) {
|
|
52
|
+
let itemsByGroup = {};
|
|
53
|
+
const maxOrder = this.getMaxOrder(items);
|
|
54
|
+
items.forEach((item) => {
|
|
55
|
+
const label = item.group && item.group["label"] != undefined ? item.group["label"] || "noGroup" : item.group || "noGroup";
|
|
56
|
+
const order = item.group && item.group["order"] != undefined ? item.group["order"] : item.group ? (maxOrder + 1) : (maxOrder + 2);
|
|
57
|
+
let groupObj = itemsByGroup[label];
|
|
58
|
+
if (groupObj == undefined) {
|
|
59
|
+
groupObj = {
|
|
60
|
+
items: [],
|
|
61
|
+
order
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
this.validateItem(item, level);
|
|
65
|
+
groupObj.items.push(item);
|
|
66
|
+
itemsByGroup[label] = groupObj;
|
|
67
|
+
});
|
|
68
|
+
return ObjectUtils.sortByProperty(itemsByGroup, "order");
|
|
69
|
+
}
|
|
70
|
+
validateItem(item, level) {
|
|
71
|
+
if (this._itemList == undefined) {
|
|
72
|
+
this._itemList = {};
|
|
73
|
+
}
|
|
74
|
+
if (item.type == undefined) {
|
|
75
|
+
item.type = "item";
|
|
76
|
+
}
|
|
77
|
+
if (item.id == undefined) {
|
|
78
|
+
const itemId = `level_${level}_${item.type}`;
|
|
79
|
+
const counter = Object.keys(this._itemList).filter((key) => key.includes(itemId)).length;
|
|
80
|
+
item.id = `${itemId}_${counter + 1}`;
|
|
81
|
+
}
|
|
82
|
+
if (item.label == undefined) {
|
|
83
|
+
item.label = "";
|
|
84
|
+
}
|
|
85
|
+
if (item.subAction != undefined) {
|
|
86
|
+
if (item.subAction.id == undefined) {
|
|
87
|
+
const subId = `subAction_${item.id}`;
|
|
88
|
+
item.subAction.id = subId;
|
|
89
|
+
}
|
|
90
|
+
if (item.subAction.label == undefined) {
|
|
91
|
+
item.subAction.label = "";
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
if (this._itemList[item.id] == undefined) {
|
|
95
|
+
this._itemList[item.id] = {};
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
getItemsRender(groupItems, level, hasIcon, hasChildren) {
|
|
99
|
+
if (groupItems == undefined) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
let counterLevel = level;
|
|
103
|
+
let isLockedLevels = false;
|
|
104
|
+
if (hasChildren) {
|
|
105
|
+
counterLevel++;
|
|
106
|
+
isLockedLevels = this.isLockedLevels(counterLevel);
|
|
107
|
+
}
|
|
108
|
+
return groupItems.map((item) => {
|
|
109
|
+
var _a;
|
|
110
|
+
return (item.type !== "divider"
|
|
111
|
+
? h("div", Object.assign({ ref: (ref) => this._itemList[item.id] = ref, class: "ez-dropdown__item", "data-level": level }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`${item.id}_ezDropdownItem`) }),
|
|
112
|
+
h("div", { class: "ez-dropdown__item-content", onClick: (evt) => this.onItemClick(evt, item), onMouseOver: (evt) => this.onShowSubmenu(evt, item) }, this.itemBuilder
|
|
113
|
+
? h("div", { class: "ez-dropdown__item-builder", innerHTML: this.itemBuilder(item, level) })
|
|
114
|
+
: this.defaultItemBuilder(item, isLockedLevels, hasIcon, hasChildren)),
|
|
115
|
+
((_a = item.children) === null || _a === void 0 ? void 0 : _a.length) > 0 &&
|
|
116
|
+
!isLockedLevels &&
|
|
117
|
+
hasChildren &&
|
|
118
|
+
h("div", { ref: (ref) => this._submenuList.push(ref), class: "ez-dropdown__submenu ez-dropdown__submenu--hide" }, this.renderDropdown(item.children, counterLevel)))
|
|
119
|
+
: h("hr", Object.assign({ class: "ez-dropdown__divider" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${item.id}_ezDropdownDivider` })));
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
renderDropdown(branchItems = this.items, level = 1) {
|
|
123
|
+
if (branchItems == undefined || this.isLockedLevels(level)) {
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const itemsByGroup = this.getItemsByGroup(branchItems, level);
|
|
127
|
+
const hasGroup = this.hasGroup(branchItems);
|
|
128
|
+
const hasIcon = this.hasIcon(branchItems);
|
|
129
|
+
const hasChildren = this.hasChildren(branchItems);
|
|
130
|
+
return (h("div", { class: "ez-dropdown", "data-level": level },
|
|
131
|
+
h("div", { class: "ez-dropdown__container" }, Object.keys(itemsByGroup)
|
|
132
|
+
.map((groupLabel) => {
|
|
133
|
+
return (h("div", Object.assign({ class: "ez-dropdown__group" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: ElementIDUtils.getInternalIDInfo(`${groupLabel}_ezDropdownGroup`) }),
|
|
134
|
+
groupLabel !== "noGroup" &&
|
|
135
|
+
h("label", { class: "ez-dropdown__group-label", title: groupLabel }, groupLabel),
|
|
136
|
+
hasGroup &&
|
|
137
|
+
groupLabel === "noGroup" &&
|
|
138
|
+
h("hr", { class: "ez-dropdown__divider" }),
|
|
139
|
+
this.getItemsRender(itemsByGroup[groupLabel].items, level, hasIcon, hasChildren)));
|
|
140
|
+
}))));
|
|
141
|
+
}
|
|
142
|
+
hasOpenedSubmenu(level) {
|
|
143
|
+
const openedLevels = Object.keys(this._openedMenuList);
|
|
144
|
+
return openedLevels.includes(level.toString())
|
|
145
|
+
|| openedLevels.some((openedLevel) => Number(openedLevel) > level);
|
|
146
|
+
}
|
|
147
|
+
hasSubmenuOpened() {
|
|
148
|
+
var _a;
|
|
149
|
+
return (_a = this._submenuList) === null || _a === void 0 ? void 0 : _a.some((submenu) => !submenu.classList.contains("ez-dropdown__submenu--hide"));
|
|
150
|
+
}
|
|
151
|
+
setEvents() {
|
|
152
|
+
document.removeEventListener('click', this.onHideAllSubmenu.bind(this));
|
|
153
|
+
document.addEventListener('click', this.onHideAllSubmenu.bind(this));
|
|
154
|
+
document.removeEventListener('scroll', this.onSubmenuReposition.bind(this));
|
|
155
|
+
document.addEventListener('scroll', this.onSubmenuReposition.bind(this));
|
|
156
|
+
}
|
|
157
|
+
//---------------------------------------------
|
|
158
|
+
// Event handlers
|
|
159
|
+
//---------------------------------------------
|
|
160
|
+
onShowSubmenu(evt, item) {
|
|
161
|
+
var _a;
|
|
162
|
+
if (evt == undefined) {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const menu = this._itemList[item.id];
|
|
166
|
+
if (!(menu === null || menu === void 0 ? void 0 : menu.classList.contains("ez-dropdown__item"))) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const level = Number(menu.dataset.level || "0");
|
|
170
|
+
if (this.hasOpenedSubmenu(level)) {
|
|
171
|
+
this._submenuControl.hide(this._openedMenuList[level]);
|
|
172
|
+
delete this._openedMenuList[level];
|
|
173
|
+
}
|
|
174
|
+
if (!((_a = item.children) === null || _a === void 0 ? void 0 : _a.length)) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
this._openedMenuList[menu.dataset.level] = menu;
|
|
178
|
+
this._submenuControl.show(menu);
|
|
179
|
+
}
|
|
180
|
+
onItemClick(evt, item) {
|
|
181
|
+
const target = evt === null || evt === void 0 ? void 0 : evt.target;
|
|
182
|
+
if (target === null || target === void 0 ? void 0 : target.classList.contains("ez-dropdown__link")) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this.value = item;
|
|
186
|
+
this.ezClick.emit(item);
|
|
187
|
+
}
|
|
188
|
+
onSubActionClick(item) {
|
|
189
|
+
this.ezSubActionClick.emit(item.subAction);
|
|
190
|
+
}
|
|
191
|
+
onHideAllSubmenu(evt = undefined) {
|
|
192
|
+
const target = evt === null || evt === void 0 ? void 0 : evt.target;
|
|
193
|
+
if (this.hasSubmenuOpened() && (target == undefined || (!target.closest(".ez-dropdown") && target.tagName !== "EZ-DROPDOWN"))) {
|
|
194
|
+
this._openedMenuList = {};
|
|
195
|
+
this._submenuList.forEach(this._submenuControl.reset.bind(this._submenuControl));
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
onSubmenuReposition() {
|
|
199
|
+
if (this._openedMenuList != undefined) {
|
|
200
|
+
Object.keys(this._openedMenuList).forEach((key) => {
|
|
201
|
+
const menu = this._openedMenuList[key];
|
|
202
|
+
this._submenuControl.setPosition(menu);
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
//---------------------------------------------
|
|
207
|
+
// Lifecycle web component
|
|
208
|
+
//---------------------------------------------
|
|
209
|
+
componentDidLoad() {
|
|
210
|
+
ElementIDUtils.addIDInfo(this._element);
|
|
211
|
+
this._submenuControl = new SubmenuControl();
|
|
212
|
+
this._submenuControl.setMaxHeight(this._element);
|
|
213
|
+
}
|
|
214
|
+
componentDidUpdate() {
|
|
215
|
+
this._submenuControl.setMaxHeight(this._element);
|
|
216
|
+
}
|
|
217
|
+
componentDidRender() {
|
|
218
|
+
this.setEvents();
|
|
219
|
+
}
|
|
220
|
+
render() {
|
|
221
|
+
return (h(Host, null, this.renderDropdown()));
|
|
222
|
+
}
|
|
223
|
+
static get is() { return "ez-dropdown"; }
|
|
224
|
+
static get encapsulation() { return "shadow"; }
|
|
225
|
+
static get originalStyleUrls() { return {
|
|
226
|
+
"$": ["ez-dropdown.css"]
|
|
227
|
+
}; }
|
|
228
|
+
static get styleUrls() { return {
|
|
229
|
+
"$": ["ez-dropdown.css"]
|
|
230
|
+
}; }
|
|
231
|
+
static get properties() { return {
|
|
232
|
+
"items": {
|
|
233
|
+
"type": "unknown",
|
|
234
|
+
"mutable": true,
|
|
235
|
+
"complexType": {
|
|
236
|
+
"original": "Array<IDropdownItem>",
|
|
237
|
+
"resolved": "IDropdownItem[]",
|
|
238
|
+
"references": {
|
|
239
|
+
"Array": {
|
|
240
|
+
"location": "global"
|
|
241
|
+
},
|
|
242
|
+
"IDropdownItem": {
|
|
243
|
+
"location": "import",
|
|
244
|
+
"path": "./structure/DropdownItem"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
},
|
|
248
|
+
"required": false,
|
|
249
|
+
"optional": false,
|
|
250
|
+
"docs": {
|
|
251
|
+
"tags": [],
|
|
252
|
+
"text": "Lista de itens que v\u00E3o ser apresentados no dropdown."
|
|
253
|
+
},
|
|
254
|
+
"defaultValue": "[]"
|
|
255
|
+
},
|
|
256
|
+
"value": {
|
|
257
|
+
"type": "unknown",
|
|
258
|
+
"mutable": true,
|
|
259
|
+
"complexType": {
|
|
260
|
+
"original": "IDropdownItem",
|
|
261
|
+
"resolved": "IDropdownItem",
|
|
262
|
+
"references": {
|
|
263
|
+
"IDropdownItem": {
|
|
264
|
+
"location": "import",
|
|
265
|
+
"path": "./structure/DropdownItem"
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
},
|
|
269
|
+
"required": false,
|
|
270
|
+
"optional": false,
|
|
271
|
+
"docs": {
|
|
272
|
+
"tags": [],
|
|
273
|
+
"text": "\u00DAltimo item que recebeu o click."
|
|
274
|
+
}
|
|
275
|
+
},
|
|
276
|
+
"itemBuilder": {
|
|
277
|
+
"type": "unknown",
|
|
278
|
+
"mutable": false,
|
|
279
|
+
"complexType": {
|
|
280
|
+
"original": "(item: IDropdownItem, level: number) => string",
|
|
281
|
+
"resolved": "(item: IDropdownItem, level: number) => string",
|
|
282
|
+
"references": {
|
|
283
|
+
"IDropdownItem": {
|
|
284
|
+
"location": "import",
|
|
285
|
+
"path": "./structure/DropdownItem"
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
},
|
|
289
|
+
"required": false,
|
|
290
|
+
"optional": false,
|
|
291
|
+
"docs": {
|
|
292
|
+
"tags": [],
|
|
293
|
+
"text": "Fun\u00E7\u00E3o builder que possibilita alterar como o item da lista vai ser apresentado."
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
}; }
|
|
297
|
+
static get events() { return [{
|
|
298
|
+
"method": "ezClick",
|
|
299
|
+
"name": "ezClick",
|
|
300
|
+
"bubbles": true,
|
|
301
|
+
"cancelable": true,
|
|
302
|
+
"composed": true,
|
|
303
|
+
"docs": {
|
|
304
|
+
"tags": [],
|
|
305
|
+
"text": "Emitido quando ocorrer um click em um item da lista,\no IDropdownItem que recebeu o click deve ser enviado como data do evento."
|
|
306
|
+
},
|
|
307
|
+
"complexType": {
|
|
308
|
+
"original": "IDropdownItem",
|
|
309
|
+
"resolved": "IDropdownItem",
|
|
310
|
+
"references": {
|
|
311
|
+
"IDropdownItem": {
|
|
312
|
+
"location": "import",
|
|
313
|
+
"path": "./structure/DropdownItem"
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
}, {
|
|
318
|
+
"method": "ezSubActionClick",
|
|
319
|
+
"name": "ezSubActionClick",
|
|
320
|
+
"bubbles": true,
|
|
321
|
+
"cancelable": true,
|
|
322
|
+
"composed": true,
|
|
323
|
+
"docs": {
|
|
324
|
+
"tags": [],
|
|
325
|
+
"text": "Emitido quando ocorrer um click em uma a\u00E7\u00E3o secundaria do item, \no IDropdownSubAction deve ser enviado como data do evento."
|
|
326
|
+
},
|
|
327
|
+
"complexType": {
|
|
328
|
+
"original": "IDropdownSubAction",
|
|
329
|
+
"resolved": "IDropdownSubAction",
|
|
330
|
+
"references": {
|
|
331
|
+
"IDropdownSubAction": {
|
|
332
|
+
"location": "import",
|
|
333
|
+
"path": "./structure/DropdownItem"
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}]; }
|
|
338
|
+
static get elementRef() { return "_element"; }
|
|
339
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { ElementIDUtils } from "@sankhyalabs/core";
|
|
2
|
+
import { h } from "@stencil/core";
|
|
3
|
+
export const DropdownItem = ({ item, hasIcon, hasChildren, isLockedLevels, onSubActionClick }) => {
|
|
4
|
+
return (h("div", { class: "ez-dropdown__item-wrapper", title: item.label },
|
|
5
|
+
getContentLeft(item, hasIcon),
|
|
6
|
+
h("span", { class: "ez-dropdown__item-label" }, item.label),
|
|
7
|
+
getContentRight(item, hasChildren, isLockedLevels, onSubActionClick)));
|
|
8
|
+
};
|
|
9
|
+
const getContentLeft = (item, hasIcon) => {
|
|
10
|
+
if (item == undefined || !hasIcon) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (item.iconName) {
|
|
14
|
+
return (h("ez-icon", Object.assign({ class: "ez-dropdown__icon-left", iconName: item.iconName, size: "medium" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${item.id}_ezDropdownItemIcon` })));
|
|
15
|
+
}
|
|
16
|
+
return (h("ez-icon", { class: "ez-dropdown__icon-left ez-dropdown__hidden", size: "medium" }));
|
|
17
|
+
};
|
|
18
|
+
const getContentRight = (item, hasChildren, isLockedLevels, onClick) => {
|
|
19
|
+
var _a, _b;
|
|
20
|
+
if (item == undefined) {
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
if (!((_a = item.children) === null || _a === void 0 ? void 0 : _a.length) && item.subAction != undefined && Object.keys(item.subAction).length > 0) {
|
|
24
|
+
return (h("span", Object.assign({ onClick: () => onClick(item), title: item.subAction.label, class: `ez-dropdown__link ez-dropdown__link--${item.subAction.type || "primary"}` }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${item.subAction.id}_ezDropdownItemSubAction` }), item.subAction.label));
|
|
25
|
+
}
|
|
26
|
+
if (isLockedLevels || !hasChildren) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
if (((_b = item.children) === null || _b === void 0 ? void 0 : _b.length) > 0) {
|
|
30
|
+
return (h("ez-icon", Object.assign({ class: "ez-dropdown__icon-right", iconName: "chevron-right", size: "medium" }, { [ElementIDUtils.DATA_ELEMENT_ID_ATTRIBUTE_NAME]: `${item.id}_ezDropdownIconOpenChildren` })));
|
|
31
|
+
}
|
|
32
|
+
return (h("ez-icon", { class: "ez-dropdown__icon-right ez-dropdown__hidden", size: "medium" }));
|
|
33
|
+
};
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
export class SubmenuControl {
|
|
2
|
+
constructor() { }
|
|
3
|
+
//---------------------------------------------
|
|
4
|
+
// Public methods
|
|
5
|
+
//---------------------------------------------
|
|
6
|
+
/**
|
|
7
|
+
* Método responsável por fechar submenus abertos e abrir o submenu desejado.
|
|
8
|
+
* @param menu - Item de menu selecionado para abrir o submenu.
|
|
9
|
+
*/
|
|
10
|
+
show(menu) {
|
|
11
|
+
const submenu = menu === null || menu === void 0 ? void 0 : menu.querySelector(".ez-dropdown__submenu");
|
|
12
|
+
if (menu == undefined || submenu == undefined) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
submenu.classList.remove("ez-dropdown__submenu--hide");
|
|
16
|
+
this.setPosition(menu);
|
|
17
|
+
this.setScrollContainer(menu);
|
|
18
|
+
this.setMaxHeight(submenu);
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Método responsável por fechar um determinado submenu aberto.
|
|
22
|
+
* @param menu - Item de menu selecionado com o submenu aberto.
|
|
23
|
+
*/
|
|
24
|
+
hide(menu) {
|
|
25
|
+
if (menu == undefined) {
|
|
26
|
+
return;
|
|
27
|
+
}
|
|
28
|
+
const submenuSelector = ".ez-dropdown__submenu:not(.ez-dropdown__submenu--hide)";
|
|
29
|
+
const submenuElement = menu.querySelector(submenuSelector);
|
|
30
|
+
this.reset(submenuElement);
|
|
31
|
+
this.hideChild(submenuElement);
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Método responsável por fechar todos os submenus filhos de um determinado submenu.
|
|
35
|
+
* @param submenu - Elemento HTML do submenu pai.
|
|
36
|
+
*/
|
|
37
|
+
hideChild(submenu) {
|
|
38
|
+
if (submenu == undefined) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
submenu.querySelectorAll(".ez-dropdown__submenu")
|
|
42
|
+
.forEach((child) => {
|
|
43
|
+
this.reset(child);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Método responsável por posicionar o submenu na tela.
|
|
48
|
+
* @param menu - Item da lista selecionado para abrir o submenu.
|
|
49
|
+
*/
|
|
50
|
+
setPosition(menu) {
|
|
51
|
+
const submenu = menu === null || menu === void 0 ? void 0 : menu.querySelector(".ez-dropdown__submenu");
|
|
52
|
+
const dropdown = menu === null || menu === void 0 ? void 0 : menu.closest(".ez-dropdown");
|
|
53
|
+
if (submenu == undefined || dropdown == undefined) {
|
|
54
|
+
return;
|
|
55
|
+
}
|
|
56
|
+
submenu.style.top = this.getPositionTop(menu);
|
|
57
|
+
submenu.style.left = this.getPositionRight(dropdown);
|
|
58
|
+
const bounding = submenu === null || submenu === void 0 ? void 0 : submenu.getBoundingClientRect();
|
|
59
|
+
const docWidth = document.body.clientWidth;
|
|
60
|
+
if ((bounding === null || bounding === void 0 ? void 0 : bounding.right) > docWidth) {
|
|
61
|
+
this.updatePosition(dropdown, submenu);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Método responsável por controlar a altura máxima do dropdown.
|
|
66
|
+
* @param element - Elemento HTML pai do dropdown que será renderizado.
|
|
67
|
+
*/
|
|
68
|
+
setMaxHeight(element) {
|
|
69
|
+
var _a;
|
|
70
|
+
const parentElement = (element === null || element === void 0 ? void 0 : element.shadowRoot) || element;
|
|
71
|
+
const dropdown = parentElement === null || parentElement === void 0 ? void 0 : parentElement.querySelector(".ez-dropdown");
|
|
72
|
+
const docHeight = document.body.clientHeight;
|
|
73
|
+
let submenu;
|
|
74
|
+
let bounding;
|
|
75
|
+
if ((parentElement === null || parentElement === void 0 ? void 0 : parentElement["tagName"]) != undefined) {
|
|
76
|
+
submenu = parentElement;
|
|
77
|
+
bounding = submenu === null || submenu === void 0 ? void 0 : submenu.getBoundingClientRect();
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
bounding = dropdown === null || dropdown === void 0 ? void 0 : dropdown.getBoundingClientRect();
|
|
81
|
+
}
|
|
82
|
+
if (dropdown == undefined || bounding == undefined) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Menu aberto irá ultrapassar a altura da página?
|
|
87
|
+
*/
|
|
88
|
+
if ((bounding.y + bounding.height) > docHeight) {
|
|
89
|
+
/**
|
|
90
|
+
* Menu aberto é um submenu?
|
|
91
|
+
* Sim: realiza o calculo com base na altura do menu pai
|
|
92
|
+
* Não: recalcula a altura do menu para atualizar a barra de rolagem
|
|
93
|
+
*/
|
|
94
|
+
if (submenu != undefined) {
|
|
95
|
+
const dropdownParent = submenu.closest(".ez-dropdown");
|
|
96
|
+
const boundingParent = dropdownParent === null || dropdownParent === void 0 ? void 0 : dropdownParent.getBoundingClientRect();
|
|
97
|
+
const marginTop = parseFloat(((_a = getComputedStyle(submenu)) === null || _a === void 0 ? void 0 : _a.marginTop) || "0");
|
|
98
|
+
if (dropdownParent == undefined || boundingParent == undefined) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Submenu aberto ao ser reposicionado ficará acima da altura do menu pai?
|
|
103
|
+
* Sim: posiciona o submenu na altura do menu pai e recalcula a sua altura para atualizar a barra de rolagem
|
|
104
|
+
* Não: posiciona o submenu entre a altura do menu pai e o rodapé da página
|
|
105
|
+
*/
|
|
106
|
+
if ((boundingParent.y + bounding.height) > docHeight) {
|
|
107
|
+
submenu.style.top = (boundingParent.y - marginTop) + "px";
|
|
108
|
+
dropdown.style.maxHeight = (docHeight - boundingParent.y) + "px";
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
submenu.style.top = (docHeight - bounding.height - marginTop) + "px";
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
let maxHeight = docHeight - bounding.y;
|
|
116
|
+
if (maxHeight < 0) {
|
|
117
|
+
maxHeight = bounding.height - docHeight;
|
|
118
|
+
}
|
|
119
|
+
dropdown.style.maxHeight = maxHeight + "px";
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
this.setSpacerContainer(dropdown);
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Método responsável por atribuir a classe de espaçamento entre o conteúdo e o scroll.
|
|
126
|
+
* @param dropdown - Elemento HTML pai do container que receberá a classe.
|
|
127
|
+
*/
|
|
128
|
+
setSpacerContainer(dropdown) {
|
|
129
|
+
const container = dropdown === null || dropdown === void 0 ? void 0 : dropdown.querySelector(".ez-dropdown__container");
|
|
130
|
+
if (container == undefined) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (container.scrollHeight > container.clientHeight) {
|
|
134
|
+
container.classList.add("ez-dropdown__container--spacer");
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
container.classList.remove("ez-dropdown__container--spacer");
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Método responsável por resetar um determinado submenu aberto.
|
|
142
|
+
* @param submenu - Elemento HTML do submenu que será resetado.
|
|
143
|
+
*/
|
|
144
|
+
reset(submenu) {
|
|
145
|
+
if (submenu == undefined) {
|
|
146
|
+
return;
|
|
147
|
+
}
|
|
148
|
+
submenu.classList.add("ez-dropdown__submenu--hide");
|
|
149
|
+
submenu.style.left = "";
|
|
150
|
+
submenu.style.top = "";
|
|
151
|
+
const dropdown = submenu.querySelector(".ez-dropdown");
|
|
152
|
+
this.resetDropdown(dropdown);
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Método responsável por resetar um determinado dropdown renderizado.
|
|
156
|
+
* @param dropdown - Elemento HTML do dropdown que será resetado.
|
|
157
|
+
*/
|
|
158
|
+
resetDropdown(dropdown) {
|
|
159
|
+
if (dropdown == undefined) {
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
dropdown.style.maxHeight = "";
|
|
163
|
+
this.setSpacerContainer(dropdown);
|
|
164
|
+
}
|
|
165
|
+
//---------------------------------------------
|
|
166
|
+
// Private methods
|
|
167
|
+
//---------------------------------------------
|
|
168
|
+
/**
|
|
169
|
+
* Método responsável por controlar o scroll do container do submenu aberto.
|
|
170
|
+
* @param menu - Item da lista selecionado para abrir o submenu.
|
|
171
|
+
*/
|
|
172
|
+
setScrollContainer(menu) {
|
|
173
|
+
const container = menu === null || menu === void 0 ? void 0 : menu.closest(".ez-dropdown__container");
|
|
174
|
+
if (container == undefined) {
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
container.onscroll = this.onScrollContainer.bind(this);
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Método responsável por fechar os submenus filhos ao movimentar o scroll.
|
|
181
|
+
* @param event - Evento de scroll disparado pelo Elemento HTML pai.
|
|
182
|
+
*/
|
|
183
|
+
onScrollContainer(event) {
|
|
184
|
+
const target = event === null || event === void 0 ? void 0 : event.target;
|
|
185
|
+
this.hideChild(target);
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Método responsável por retornar a posição superior (top) de um elemento HTML na tela.
|
|
189
|
+
* @param hostElement - Elemento HTML que será capturado o valor de sua posição superior (top) na tela.
|
|
190
|
+
* @returns Valor da posição superior (top) de um determinado elemento HTML.
|
|
191
|
+
*/
|
|
192
|
+
getPositionTop(hostElement) {
|
|
193
|
+
const boundingHost = hostElement === null || hostElement === void 0 ? void 0 : hostElement.getBoundingClientRect();
|
|
194
|
+
if (boundingHost == undefined) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
return boundingHost.y + "px";
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Método responsável por retornar a posição direita (right) de um elemento HTML na tela.
|
|
201
|
+
* @param hostElement - Elemento HTML que será capturado o valor de sua posição direita (right) na tela.
|
|
202
|
+
* @returns Valor da posição direita (right) de um determinado elemento HTML.
|
|
203
|
+
*/
|
|
204
|
+
getPositionRight(hostElement) {
|
|
205
|
+
const boundingHost = hostElement === null || hostElement === void 0 ? void 0 : hostElement.getBoundingClientRect();
|
|
206
|
+
if (boundingHost == undefined) {
|
|
207
|
+
return;
|
|
208
|
+
}
|
|
209
|
+
return (boundingHost.x + boundingHost.width) + "px";
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Método responsável por retornar a posição esquerda (left) de um elemento HTML desconsiderando a largura de outro elemento HTML.
|
|
213
|
+
* @param hostElement - Elemento HTML que será capturado o valor de sua posição esquerda (left) na tela.
|
|
214
|
+
* @param targetElement - Elemento HTML que será capturado o valor de sua largura (width).
|
|
215
|
+
* @returns Valor da posição esquerda (left) de um determinado elemento HTML desconsiderando a largura de outro elemento HTML.
|
|
216
|
+
*/
|
|
217
|
+
getPositionLeft(hostElement, targetElement) {
|
|
218
|
+
const boundingHost = hostElement === null || hostElement === void 0 ? void 0 : hostElement.getBoundingClientRect();
|
|
219
|
+
const boundingTarget = targetElement === null || targetElement === void 0 ? void 0 : targetElement.getBoundingClientRect();
|
|
220
|
+
if (boundingHost == undefined || boundingTarget == undefined) {
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
return (boundingHost.x - boundingTarget.width) + "px";
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Método responsável por atualizar a posição de um elemento HTML que renderizou fora da tela.
|
|
227
|
+
* @param hostElement - Elemento HTML que será a referência de posição dentro da tela.
|
|
228
|
+
* @param targetElement - Elemento HTML que será reposicionado na tela.
|
|
229
|
+
*/
|
|
230
|
+
updatePosition(hostElement, targetElement) {
|
|
231
|
+
const boundingHost = hostElement === null || hostElement === void 0 ? void 0 : hostElement.getBoundingClientRect();
|
|
232
|
+
const boundingTarget = targetElement === null || targetElement === void 0 ? void 0 : targetElement.getBoundingClientRect();
|
|
233
|
+
if (boundingHost == undefined || boundingTarget == undefined) {
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
if (boundingHost.x < boundingTarget.right) {
|
|
237
|
+
targetElement.style.left = this.getPositionLeft(hostElement, targetElement);
|
|
238
|
+
this.updatePosition(hostElement, targetElement);
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|