@genexus/genexus-ide-ui 0.0.62 → 0.0.63
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/{ch-tree-x_3.cjs.entry.js → ch-checkbox_4.cjs.entry.js} +277 -71
- package/dist/cjs/ch-next-data-modeling-render.cjs.entry.js +242 -0
- package/dist/cjs/{ch-next-data-modeling-item.cjs.entry.js → ch-next-data-modeling_2.cjs.entry.js} +20 -1
- package/dist/cjs/ch-tree-view-render-wrapper.cjs.entry.js +160 -0
- package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
- package/dist/cjs/gx-ide-kb-manager-export.cjs.entry.js +41 -39
- package/dist/cjs/gx-ide-kb-manager-import.cjs.entry.js +23 -11
- package/dist/cjs/gx-ide-test.cjs.entry.js +107 -122
- package/dist/cjs/gxg-color-picker.cjs.entry.js +2 -2
- package/dist/cjs/gxg-title-editable.cjs.entry.js +11 -4
- package/dist/cjs/{gxg-tree_2.cjs.entry.js → gxg-tree-item.cjs.entry.js} +0 -212
- package/dist/cjs/gxg-tree-view.cjs.entry.js +165 -0
- package/dist/cjs/gxg-tree.cjs.entry.js +218 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +5 -3
- package/dist/collection/components/_test/test.css +5 -0
- package/dist/collection/components/_test/test.js +109 -220
- package/dist/collection/components/kb-manager-export/helpers.js +7 -23
- package/dist/collection/components/kb-manager-export/kb-manager-export.css +20 -0
- package/dist/collection/components/kb-manager-export/kb-manager-export.js +42 -22
- package/dist/collection/components/kb-manager-import/gx-ide-assets/kb-manager-import/langs/kb-manager-import.lang.en.json +1 -0
- package/dist/collection/components/kb-manager-import/kb-manager-import.js +23 -11
- package/dist/components/ch-next-data-modeling-item.js +1 -457
- package/dist/components/ch-next-data-modeling-render.js +295 -0
- package/dist/components/ch-next-data-modeling.js +1 -27
- package/dist/components/ch-tree-view-item.js +6 -0
- package/dist/components/ch-tree-view-render-wrapper.js +224 -0
- package/dist/components/ch-tree-view-render.js +6 -0
- package/dist/components/ch-tree-view.js +6 -0
- package/dist/components/gx-ide-kb-manager-export.js +75 -73
- package/dist/components/gx-ide-kb-manager-import.js +38 -20
- package/dist/components/gx-ide-references.js +21 -15
- package/dist/components/gx-ide-test.js +120 -160
- package/dist/components/gxg-color-picker.js +2 -2
- package/dist/components/gxg-title-editable.js +12 -4
- package/dist/components/gxg-tree-item.js +614 -1
- package/dist/components/gxg-tree-view.js +2 -2
- package/dist/components/gxg-tree.js +236 -1
- package/dist/components/index.js +5 -3
- package/dist/components/next-data-modeling-item.js +466 -0
- package/dist/{esm/ch-next-data-modeling.entry.js → components/next-data-modeling.js} +21 -7
- package/dist/components/{tree-x-list-item.js → tree-view-item.js} +9 -9
- package/dist/components/{ch-test-tree-x.js → tree-view-render.js} +168 -28
- package/dist/components/tree-view.js +410 -435
- package/dist/components/tree-view2.js +226 -0
- package/dist/esm/{ch-tree-x_3.entry.js → ch-checkbox_4.entry.js} +275 -70
- package/dist/esm/ch-next-data-modeling-render.entry.js +238 -0
- package/dist/esm/{ch-next-data-modeling-item.entry.js → ch-next-data-modeling_2.entry.js} +21 -3
- package/dist/esm/ch-tree-view-render-wrapper.entry.js +156 -0
- package/dist/esm/genexus-ide-ui.js +1 -1
- package/dist/esm/gx-ide-kb-manager-export.entry.js +41 -39
- package/dist/esm/gx-ide-kb-manager-import.entry.js +23 -11
- package/dist/esm/gx-ide-test.entry.js +108 -123
- package/dist/esm/gxg-color-picker.entry.js +2 -2
- package/dist/esm/gxg-title-editable.entry.js +11 -4
- package/dist/{components/gxg-tree-item2.js → esm/gxg-tree-item.entry.js} +9 -79
- package/dist/esm/gxg-tree-view.entry.js +161 -0
- package/dist/{components/gxg-tree2.js → esm/gxg-tree.entry.js} +8 -32
- package/dist/esm/loader.js +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.css +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/gx-ide-assets/kb-manager-import/langs/kb-manager-import.lang.en.json +1 -0
- package/dist/genexus-ide-ui/p-13177896.entry.js +1 -0
- package/dist/genexus-ide-ui/p-19fef562.entry.js +1 -0
- package/dist/genexus-ide-ui/p-2781b92a.entry.js +1 -0
- package/dist/genexus-ide-ui/p-2c17e71d.entry.js +1 -0
- package/dist/genexus-ide-ui/p-40a57a36.entry.js +1 -0
- package/dist/genexus-ide-ui/p-636d02fa.entry.js +1 -0
- package/dist/genexus-ide-ui/p-7b63be93.entry.js +1 -0
- package/dist/genexus-ide-ui/p-8a7c4561.entry.js +1 -0
- package/dist/genexus-ide-ui/p-a2cb0e6b.entry.js +1 -0
- package/dist/genexus-ide-ui/p-a9c8b373.entry.js +1 -0
- package/dist/genexus-ide-ui/p-b819706e.entry.js +1 -0
- package/dist/genexus-ide-ui/p-bacd879c.entry.js +1 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/next/data-modeling-render/next-data-modeling-render.css +3 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/renders/tree-view/tree-view-render.css +3 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/test/test-tree-view/tree-view-render-wrapper.css +0 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/tree-view/tree-view/tree-view.css +45 -0
- package/dist/node_modules/@genexus/gemini/dist/collection/components/title-editable/title-editable.css +17 -3
- package/dist/node_modules/@genexus/gemini/dist/collection/components/tree-view/tree-view.css +5 -2
- package/dist/types/common/helpers.d.ts +2 -2
- package/dist/types/components/_test/test.d.ts +3 -35
- package/dist/types/components/kb-manager-export/helpers.d.ts +4 -4
- package/dist/types/components/kb-manager-export/kb-manager-export.d.ts +10 -5
- package/dist/types/components/kb-manager-import/helpers.d.ts +3 -3
- package/dist/types/components/kb-manager-import/kb-manager-import.d.ts +7 -6
- package/dist/types/components/references/helpers.d.ts +2 -2
- package/dist/types/components/references/references.d.ts +3 -3
- package/dist/types/components.d.ts +3 -60
- package/package.json +3 -3
- package/dist/cjs/ch-checkbox.cjs.entry.js +0 -93
- package/dist/cjs/ch-next-data-modeling.cjs.entry.js +0 -19
- package/dist/cjs/ch-test-tree-x.cjs.entry.js +0 -458
- package/dist/components/ch-tree-x-list-item.js +0 -6
- package/dist/components/ch-tree-x.js +0 -6
- package/dist/components/tree-x.js +0 -504
- package/dist/esm/ch-checkbox.entry.js +0 -89
- package/dist/esm/ch-test-tree-x.entry.js +0 -454
- package/dist/esm/gxg-tree_2.entry.js +0 -757
- package/dist/genexus-ide-ui/p-092ccacd.entry.js +0 -1
- package/dist/genexus-ide-ui/p-1ad68b23.entry.js +0 -3
- package/dist/genexus-ide-ui/p-3442d19a.entry.js +0 -1
- package/dist/genexus-ide-ui/p-39968306.entry.js +0 -1
- package/dist/genexus-ide-ui/p-5755f985.entry.js +0 -1
- package/dist/genexus-ide-ui/p-85597097.entry.js +0 -1
- package/dist/genexus-ide-ui/p-9e530c7d.entry.js +0 -1
- package/dist/genexus-ide-ui/p-ad5040e4.entry.js +0 -1
- package/dist/genexus-ide-ui/p-aeb3b032.entry.js +0 -1
- package/dist/genexus-ide-ui/p-c53522c9.entry.js +0 -1
- package/dist/genexus-ide-ui/p-d104f9a4.entry.js +0 -1
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/test/test-tree-x.css +0 -3
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/tree-view/tree-x/tree-x.css +0 -45
- /package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/tree-view/{tree-x-list-item/tree-x-list-item.css → tree-view-item/tree-view-item.css} +0 -0
|
@@ -1,504 +0,0 @@
|
|
|
1
|
-
import { proxyCustomElement, HTMLElement, createEvent, h, Host } from '@stencil/core/internal/client';
|
|
2
|
-
import { f as focusComposedPath, m as mouseEventModifierKey } from './helpers.js';
|
|
3
|
-
|
|
4
|
-
const scrollToEdge = (event, container, scrollSpeed, scrollThreshold) => {
|
|
5
|
-
const mousePositionY = event.clientY - container.getBoundingClientRect().top;
|
|
6
|
-
const containerHeight = container.clientHeight;
|
|
7
|
-
const mouseAtTheTop = mousePositionY <= scrollThreshold;
|
|
8
|
-
const mouseAtTheBottom = mousePositionY > containerHeight - scrollThreshold;
|
|
9
|
-
if (mouseAtTheTop || mouseAtTheBottom) {
|
|
10
|
-
const scrollAmount = mouseAtTheTop
|
|
11
|
-
? mousePositionY - scrollThreshold
|
|
12
|
-
: mousePositionY - (containerHeight - scrollThreshold);
|
|
13
|
-
// Adjust container scroll position
|
|
14
|
-
container.scrollTop += scrollAmount / scrollSpeed;
|
|
15
|
-
}
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
const treeXCss = "ch-tree-x{display:flex;position:relative;width:100%;overflow:auto}ch-tree-x>.ch-tree-x-container{position:absolute;inset:0}ch-tree-x.ch-tree-x-dragging-item ch-tree-x-list-item{pointer-events:var(--ch-tree-x-pointer-events, all)}ch-tree-x.ch-tree-x-dragging-item .ch-tree-x-list-item--deny-drop{pointer-events:none}ch-tree-x.ch-tree-x--dragging-selected-items ch-tree-x-list-item[selected]{--ch-tree-x-pointer-events:none}ch-tree-x.ch-tree-x-waiting-drop-processing{cursor:wait}ch-tree-x.ch-tree-x-waiting-drop-processing>.ch-tree-x-container{pointer-events:none}.ch-tree-x-drag-info{--rtl-offset:16px;position:fixed;left:0;top:0;transform:translate(calc(var(--ch-tree-x-dragging-item-x) + var(--rtl-offset)), calc(var(--ch-tree-x-dragging-item-y) + 8px));pointer-events:none;z-index:1;animation:ch-tree-x-drag-info-fade-in 10ms}@keyframes ch-tree-x-drag-info-fade-in{0%,100%{opacity:0}}html[dir=rtl] .ch-tree-x-drag-info{--rtl-offset:-100%}";
|
|
19
|
-
|
|
20
|
-
const TREE_ITEM_TAG_NAME = "ch-tree-x-list-item";
|
|
21
|
-
const TREE_TAG_NAME = "ch-tree-x";
|
|
22
|
-
// Selectors
|
|
23
|
-
// const CHECKED_ITEMS = `${TREE_ITEM_TAG_NAME}[checked]`;
|
|
24
|
-
const TEXT_FORMAT = "text/plain";
|
|
25
|
-
const ARROW_DOWN_KEY = "ArrowDown";
|
|
26
|
-
const ARROW_UP_KEY = "ArrowUp";
|
|
27
|
-
const EDIT_KEY = "F2";
|
|
28
|
-
const isTreeItem = (element) => element.tagName.toLowerCase() === TREE_ITEM_TAG_NAME;
|
|
29
|
-
const getFocusedTreeItem = () => focusComposedPath().find(isTreeItem);
|
|
30
|
-
const canMoveTreeItemFocus = (treeItem) => treeItem && !treeItem.editing;
|
|
31
|
-
const getDroppableZoneKey = (newContainerId, draggedItems) => `"newContainerId":"${newContainerId}","metadata":"${JSON.stringify(draggedItems)}"`;
|
|
32
|
-
const POSITION_X_DRAG_CUSTOM_VAR = "--ch-tree-x-dragging-item-x";
|
|
33
|
-
const POSITION_Y_DRAG_CUSTOM_VAR = "--ch-tree-x-dragging-item-y";
|
|
34
|
-
const ChTreeX = /*@__PURE__*/ proxyCustomElement(class extends HTMLElement {
|
|
35
|
-
constructor() {
|
|
36
|
-
super();
|
|
37
|
-
this.__registerHost();
|
|
38
|
-
this.droppableZoneEnter = createEvent(this, "droppableZoneEnter", 7);
|
|
39
|
-
this.expandedItemChange = createEvent(this, "expandedItemChange", 7);
|
|
40
|
-
this.itemContextmenu = createEvent(this, "itemContextmenu", 7);
|
|
41
|
-
this.itemsDropped = createEvent(this, "itemsDropped", 7);
|
|
42
|
-
this.selectedItemsChange = createEvent(this, "selectedItemsChange", 7);
|
|
43
|
-
// @todo TODO: Check if key codes works in Safari
|
|
44
|
-
this.keyDownEvents = {
|
|
45
|
-
[ARROW_DOWN_KEY]: event => {
|
|
46
|
-
const treeItem = getFocusedTreeItem();
|
|
47
|
-
if (!canMoveTreeItemFocus(treeItem)) {
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
event.preventDefault();
|
|
51
|
-
treeItem.focusNextItem(mouseEventModifierKey(event));
|
|
52
|
-
},
|
|
53
|
-
[ARROW_UP_KEY]: event => {
|
|
54
|
-
const treeItem = getFocusedTreeItem();
|
|
55
|
-
if (!canMoveTreeItemFocus(treeItem)) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
event.preventDefault();
|
|
59
|
-
treeItem.focusPreviousItem(mouseEventModifierKey(event));
|
|
60
|
-
},
|
|
61
|
-
[EDIT_KEY]: event => {
|
|
62
|
-
const treeItem = getFocusedTreeItem();
|
|
63
|
-
if (!treeItem || !treeItem.editable) {
|
|
64
|
-
return;
|
|
65
|
-
}
|
|
66
|
-
event.preventDefault();
|
|
67
|
-
treeItem.editing = true;
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
this.draggingSelectedItems = false;
|
|
71
|
-
this.needForRAF = true; // To prevent redundant RAF (request animation frame) calls
|
|
72
|
-
this.selectedItemsInfo = new Map();
|
|
73
|
-
/**
|
|
74
|
-
* Cache to avoid duplicate requests when checking the droppable zone in the
|
|
75
|
-
* same drag event.
|
|
76
|
-
*/
|
|
77
|
-
this.validDroppableZoneCache = new Map();
|
|
78
|
-
this.draggedIds = [];
|
|
79
|
-
this.draggedParentIds = [];
|
|
80
|
-
this.draggingInTheDocument = false;
|
|
81
|
-
this.draggingInTree = false;
|
|
82
|
-
/**
|
|
83
|
-
* Set this attribute if you want to allow multi selection of the items.
|
|
84
|
-
*/
|
|
85
|
-
this.multiSelection = false;
|
|
86
|
-
/**
|
|
87
|
-
* This property lets you specify the time (in ms) that the mouse must be
|
|
88
|
-
* over in a subtree to open it when dragging.
|
|
89
|
-
*/
|
|
90
|
-
this.openSubTreeCountdown = 750;
|
|
91
|
-
/**
|
|
92
|
-
* `true` to scroll in the tree when dragging an item near the edges of the
|
|
93
|
-
* tree.
|
|
94
|
-
*/
|
|
95
|
-
this.scrollToEdgeOnDrag = true;
|
|
96
|
-
/**
|
|
97
|
-
* This property lets you specify if the tree is waiting to process the drop
|
|
98
|
-
* of items.
|
|
99
|
-
*/
|
|
100
|
-
this.waitDropProcessing = false;
|
|
101
|
-
this.trackItemDrag = (event) => {
|
|
102
|
-
event.preventDefault();
|
|
103
|
-
this.lastDragEvent = event;
|
|
104
|
-
this.updateDropEffect(event);
|
|
105
|
-
if (!this.needForRAF) {
|
|
106
|
-
return;
|
|
107
|
-
}
|
|
108
|
-
this.needForRAF = false; // No need to call RAF up until next frame
|
|
109
|
-
requestAnimationFrame(() => {
|
|
110
|
-
this.needForRAF = true; // RAF now consumes the movement instruction so a new one can come
|
|
111
|
-
this.el.style.setProperty(POSITION_X_DRAG_CUSTOM_VAR, `${this.lastDragEvent.pageX}px`);
|
|
112
|
-
this.el.style.setProperty(POSITION_Y_DRAG_CUSTOM_VAR, `${this.lastDragEvent.pageY}px`);
|
|
113
|
-
});
|
|
114
|
-
};
|
|
115
|
-
this.fixScrollPositionOnDrag = () => {
|
|
116
|
-
if (!this.draggingInTree || !this.lastDragEvent) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
requestAnimationFrame(() => {
|
|
120
|
-
scrollToEdge(this.lastDragEvent, this.el, 10, 30);
|
|
121
|
-
requestAnimationFrame(this.fixScrollPositionOnDrag);
|
|
122
|
-
});
|
|
123
|
-
};
|
|
124
|
-
}
|
|
125
|
-
// /**
|
|
126
|
-
// * Returns an array of the selected tree items, providing the id, caption and
|
|
127
|
-
// * selected status.
|
|
128
|
-
// */
|
|
129
|
-
// @Method()
|
|
130
|
-
// async getCheckedItems(): Promise<CheckedTreeItemInfo[]> {
|
|
131
|
-
// const checkedItems = Array.from(
|
|
132
|
-
// this.el.querySelectorAll(CHECKED_ITEMS)
|
|
133
|
-
// ) as HTMLChTreeXListItemElement[];
|
|
134
|
-
// return checkedItems.map(item => ({
|
|
135
|
-
// id: item.id,
|
|
136
|
-
// caption: item.caption,
|
|
137
|
-
// selected: item.selected
|
|
138
|
-
// }));
|
|
139
|
-
// }
|
|
140
|
-
handleContextMenuEvent(event) {
|
|
141
|
-
const treeItem = event.target.closest(TREE_ITEM_TAG_NAME);
|
|
142
|
-
if (!treeItem) {
|
|
143
|
-
return;
|
|
144
|
-
}
|
|
145
|
-
event.preventDefault();
|
|
146
|
-
this.itemContextmenu.emit({
|
|
147
|
-
id: treeItem.id,
|
|
148
|
-
itemRef: treeItem,
|
|
149
|
-
metadata: treeItem.metadata,
|
|
150
|
-
contextmenuEvent: event
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
// Set edit mode in items
|
|
154
|
-
handleKeyDownEvents(event) {
|
|
155
|
-
const keyHandler = this.keyDownEvents[event.key];
|
|
156
|
-
if (keyHandler) {
|
|
157
|
-
keyHandler(event);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
// We can't use capture, because the dataTransfer info would not be defined
|
|
161
|
-
// Also, we cant use capture and setTimeout with 0 seconds, because the
|
|
162
|
-
// getData method can only be accessed during the dragstart and drop event
|
|
163
|
-
handleDragStart(event) {
|
|
164
|
-
// Reset the validity of the droppable zones with each new drag start
|
|
165
|
-
this.validDroppableZoneCache.clear();
|
|
166
|
-
this.draggingInTheDocument = true;
|
|
167
|
-
this.dragStartTimestamp = new Date().getTime();
|
|
168
|
-
this.draggedItems = JSON.parse(event.dataTransfer.getData(TEXT_FORMAT));
|
|
169
|
-
}
|
|
170
|
-
handleDragEnd() {
|
|
171
|
-
this.draggingInTheDocument = false;
|
|
172
|
-
}
|
|
173
|
-
handleDragEnter(event) {
|
|
174
|
-
this.cancelSubTreeOpening(null, true);
|
|
175
|
-
event.stopPropagation();
|
|
176
|
-
const containerTarget = event.target;
|
|
177
|
-
// Check if it is a valid item
|
|
178
|
-
if (containerTarget.tagName.toLowerCase() !== TREE_ITEM_TAG_NAME) {
|
|
179
|
-
return;
|
|
180
|
-
}
|
|
181
|
-
this.lastOpenSubTreeItem = containerTarget;
|
|
182
|
-
this.openSubTreeAfterCountdown(containerTarget);
|
|
183
|
-
if (this.validDroppableZone(event) === "valid") {
|
|
184
|
-
containerTarget.dragState = "enter";
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
handleDragLeave(event) {
|
|
188
|
-
const currentTarget = event.target;
|
|
189
|
-
if (currentTarget.tagName.toLowerCase() !== TREE_ITEM_TAG_NAME) {
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
const treeItem = currentTarget;
|
|
193
|
-
treeItem.dragState = "none";
|
|
194
|
-
this.cancelSubTreeOpening(treeItem);
|
|
195
|
-
}
|
|
196
|
-
cancelSubTreeOpening(treeItem, forceClear = false) {
|
|
197
|
-
if (this.lastOpenSubTreeItem === treeItem || forceClear) {
|
|
198
|
-
clearTimeout(this.openSubTreeTimeout);
|
|
199
|
-
this.lastOpenSubTreeItem = null;
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
handleItemDrop(event) {
|
|
203
|
-
event.stopPropagation();
|
|
204
|
-
this.cancelSubTreeOpening(null, true);
|
|
205
|
-
const newContainer = event.target;
|
|
206
|
-
const draggedItems = JSON.parse(event.dataTransfer.getData(TEXT_FORMAT));
|
|
207
|
-
// The droppable zone must be checked, even if it was marked as not valid
|
|
208
|
-
// @todo Try to drop an item with high delays in droppable zone checking
|
|
209
|
-
if (this.validDroppableZone(event) !== "valid") {
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
this.itemsDropped.emit({
|
|
213
|
-
newContainer: { id: newContainer.id, metadata: newContainer.metadata },
|
|
214
|
-
draggingSelectedItems: this.draggingSelectedItems,
|
|
215
|
-
draggedItems: draggedItems,
|
|
216
|
-
dropInTheSameTree: this.draggingInTree
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
handleItemDragStart(event) {
|
|
220
|
-
document.body.addEventListener("dragover", this.trackItemDrag, {
|
|
221
|
-
capture: true
|
|
222
|
-
});
|
|
223
|
-
this.currentDraggedItem = event.target;
|
|
224
|
-
const allItemsCanBeDragged = this.checkDragValidityAndUpdateDragInfo(event.detail);
|
|
225
|
-
if (!allItemsCanBeDragged) {
|
|
226
|
-
// This effect disables drop interactions in all page elements, so there
|
|
227
|
-
// is no need to capture and prevent the drop event in the window
|
|
228
|
-
event.detail.dragEvent.dataTransfer.effectAllowed = "none";
|
|
229
|
-
return;
|
|
230
|
-
}
|
|
231
|
-
this.draggingInTree = true;
|
|
232
|
-
if (this.scrollToEdgeOnDrag) {
|
|
233
|
-
this.fixScrollPositionOnDrag();
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
handleItemDragEnd() {
|
|
237
|
-
this.draggingInTree = false;
|
|
238
|
-
document.body.removeEventListener("dragover", this.trackItemDrag, {
|
|
239
|
-
capture: true
|
|
240
|
-
});
|
|
241
|
-
// Reset not allowed droppable ids
|
|
242
|
-
this.resetVariables();
|
|
243
|
-
}
|
|
244
|
-
/**
|
|
245
|
-
* Only sync the info about the selected items. It does not update the state
|
|
246
|
-
* of the previous selected items.
|
|
247
|
-
*/
|
|
248
|
-
handleSelectedItemSync(event) {
|
|
249
|
-
event.stopPropagation();
|
|
250
|
-
const selectedItemInfo = event.detail;
|
|
251
|
-
// If the item is selected, add it to list
|
|
252
|
-
if (selectedItemInfo.selected) {
|
|
253
|
-
this.selectedItemsInfo.set(selectedItemInfo.id, selectedItemInfo);
|
|
254
|
-
}
|
|
255
|
-
else {
|
|
256
|
-
this.selectedItemsInfo.delete(selectedItemInfo.id);
|
|
257
|
-
}
|
|
258
|
-
}
|
|
259
|
-
handleSelectedItemChange(event) {
|
|
260
|
-
event.stopPropagation();
|
|
261
|
-
const selectedItemInfo = event.detail;
|
|
262
|
-
const selectedItemEl = event.target;
|
|
263
|
-
this.handleItemSelection(selectedItemEl, selectedItemInfo);
|
|
264
|
-
}
|
|
265
|
-
/**
|
|
266
|
-
* Clear all information about the selected items. This method is intended to
|
|
267
|
-
* be used when selected items are reordered and the selected references will
|
|
268
|
-
* no longer be useful.
|
|
269
|
-
*/
|
|
270
|
-
async clearSelectedItemsInfo() {
|
|
271
|
-
this.clearSelectedItems();
|
|
272
|
-
}
|
|
273
|
-
/**
|
|
274
|
-
* Given an item id, it displays and scrolls into the item view.
|
|
275
|
-
*/
|
|
276
|
-
async scrollIntoVisible(treeItemId) {
|
|
277
|
-
const itemRef = this.el.querySelector(`${TREE_ITEM_TAG_NAME}#${treeItemId}`);
|
|
278
|
-
if (!itemRef) {
|
|
279
|
-
return;
|
|
280
|
-
}
|
|
281
|
-
let parentItem = itemRef.parentElement;
|
|
282
|
-
// Expand all parents
|
|
283
|
-
while (parentItem.tagName.toLowerCase() === TREE_ITEM_TAG_NAME) {
|
|
284
|
-
parentItem.expanded = true;
|
|
285
|
-
parentItem = parentItem.parentElement;
|
|
286
|
-
}
|
|
287
|
-
// Wait until the parents are expanded
|
|
288
|
-
requestAnimationFrame(() => {
|
|
289
|
-
itemRef.scrollIntoView();
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
/**
|
|
293
|
-
* Update the information about the valid droppable zones.
|
|
294
|
-
* @param requestTimestamp Time where the request to the server was made. Useful to avoid having old information.
|
|
295
|
-
* @param newContainerId ID of the container where the drag is trying to be made.
|
|
296
|
-
* @param draggedItems Information about the dragged items.
|
|
297
|
-
* @param validDrop Current state of the droppable zone.
|
|
298
|
-
*/
|
|
299
|
-
async updateValidDropZone(requestTimestamp, newContainerId, draggedItems, validDrop) {
|
|
300
|
-
var _a;
|
|
301
|
-
if (!this.draggingInTheDocument ||
|
|
302
|
-
requestTimestamp <= this.dragStartTimestamp) {
|
|
303
|
-
return;
|
|
304
|
-
}
|
|
305
|
-
const droppableZoneKey = getDroppableZoneKey(newContainerId, draggedItems);
|
|
306
|
-
this.validDroppableZoneCache.set(droppableZoneKey, validDrop ? "valid" : "invalid");
|
|
307
|
-
const shouldUpdateDragEnterInCurrentContainer = ((_a = this.lastOpenSubTreeItem) === null || _a === void 0 ? void 0 : _a.id) === newContainerId;
|
|
308
|
-
if (shouldUpdateDragEnterInCurrentContainer) {
|
|
309
|
-
this.lastOpenSubTreeItem.dragState = "enter";
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
validDroppableZone(event) {
|
|
313
|
-
const containerTarget = event.target;
|
|
314
|
-
const cacheKey = getDroppableZoneKey(containerTarget.id, this.draggedItems);
|
|
315
|
-
let droppableZoneState = this.validDroppableZoneCache.get(cacheKey);
|
|
316
|
-
// Invalidate the cache, because the item is no longer waiting for its content to be downloaded
|
|
317
|
-
if (droppableZoneState === "temporal-invalid" &&
|
|
318
|
-
!containerTarget.lazyLoad &&
|
|
319
|
-
!containerTarget.downloading) {
|
|
320
|
-
droppableZoneState = null;
|
|
321
|
-
}
|
|
322
|
-
if (droppableZoneState != null) {
|
|
323
|
-
return droppableZoneState;
|
|
324
|
-
}
|
|
325
|
-
// Do not show drop zones if:
|
|
326
|
-
// - The effect does not allow it.
|
|
327
|
-
// - The drop is disabled in the container target.
|
|
328
|
-
// - When dragging in the same tree, don't mark droppable zones if they are
|
|
329
|
-
// the dragged items or their direct parents.
|
|
330
|
-
if (event.dataTransfer.effectAllowed === "none" ||
|
|
331
|
-
containerTarget.dropDisabled ||
|
|
332
|
-
(this.draggingInTree &&
|
|
333
|
-
(this.draggedIds.includes(containerTarget.id) ||
|
|
334
|
-
this.draggedParentIds.includes(containerTarget.id)))) {
|
|
335
|
-
this.validDroppableZoneCache.set(cacheKey, "invalid");
|
|
336
|
-
return "invalid";
|
|
337
|
-
}
|
|
338
|
-
// Disable drops when items need to lazy load their content first
|
|
339
|
-
if (containerTarget.lazyLoad || containerTarget.downloading) {
|
|
340
|
-
this.validDroppableZoneCache.set(cacheKey, "temporal-invalid");
|
|
341
|
-
return "temporal-invalid";
|
|
342
|
-
}
|
|
343
|
-
this.validDroppableZoneCache.set(cacheKey, "checking");
|
|
344
|
-
this.droppableZoneEnter.emit({
|
|
345
|
-
newContainer: {
|
|
346
|
-
id: containerTarget.id,
|
|
347
|
-
metadata: containerTarget.metadata
|
|
348
|
-
},
|
|
349
|
-
draggedItems: this.draggedItems
|
|
350
|
-
});
|
|
351
|
-
return "checking";
|
|
352
|
-
}
|
|
353
|
-
openSubTreeAfterCountdown(currentTarget) {
|
|
354
|
-
if (currentTarget.leaf || currentTarget.expanded) {
|
|
355
|
-
return;
|
|
356
|
-
}
|
|
357
|
-
this.openSubTreeTimeout = setTimeout(() => {
|
|
358
|
-
currentTarget.expanded = true;
|
|
359
|
-
this.expandedItemChange.emit({ id: currentTarget.id, expanded: true });
|
|
360
|
-
}, this.openSubTreeCountdown);
|
|
361
|
-
}
|
|
362
|
-
updateDropEffect(event) {
|
|
363
|
-
const itemTarget = event.target;
|
|
364
|
-
// Check if it is a valid item
|
|
365
|
-
if (itemTarget.tagName.toLowerCase() !== TREE_ITEM_TAG_NAME ||
|
|
366
|
-
itemTarget.closest(TREE_TAG_NAME) !== this.el) {
|
|
367
|
-
return;
|
|
368
|
-
}
|
|
369
|
-
const droppableZoneState = this.validDroppableZone(event);
|
|
370
|
-
if (droppableZoneState === "invalid" ||
|
|
371
|
-
droppableZoneState === "temporal-invalid") {
|
|
372
|
-
event.dataTransfer.dropEffect = "none";
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
|
-
resetVariables() {
|
|
376
|
-
this.draggedIds = [];
|
|
377
|
-
this.draggedParentIds = [];
|
|
378
|
-
}
|
|
379
|
-
/**
|
|
380
|
-
* First, it check if all items can be dragged. If so, it updates the
|
|
381
|
-
* dataTransfer in the drag event to store the ids and metadata of the
|
|
382
|
-
* dragged items. Also it updates the visual information of the dragged
|
|
383
|
-
* items.
|
|
384
|
-
* @returns If all selected items can be dragged.
|
|
385
|
-
*/
|
|
386
|
-
checkDragValidityAndUpdateDragInfo(dragInfo) {
|
|
387
|
-
const draggedElement = dragInfo.elem;
|
|
388
|
-
const isDraggingSelectedItems = this.selectedItemsInfo.has(draggedElement.id);
|
|
389
|
-
this.draggingSelectedItems = isDraggingSelectedItems;
|
|
390
|
-
let dataTransferInfo = [];
|
|
391
|
-
let dragIsEnabledForAllItems;
|
|
392
|
-
if (isDraggingSelectedItems) {
|
|
393
|
-
const selectedItemKeys = [...this.selectedItemsInfo.keys()];
|
|
394
|
-
const selectedItemValues = [...this.selectedItemsInfo.values()];
|
|
395
|
-
const selectedItemCount = selectedItemKeys.length;
|
|
396
|
-
dragIsEnabledForAllItems = selectedItemValues.every(el => !el.itemRef.dragDisabled);
|
|
397
|
-
this.draggedIds = selectedItemKeys;
|
|
398
|
-
dataTransferInfo = selectedItemValues.map(el => ({
|
|
399
|
-
id: el.id,
|
|
400
|
-
metadata: el.metadata
|
|
401
|
-
}));
|
|
402
|
-
this.dragInfo =
|
|
403
|
-
selectedItemCount === 1
|
|
404
|
-
? draggedElement.caption
|
|
405
|
-
: selectedItemCount.toString();
|
|
406
|
-
}
|
|
407
|
-
else {
|
|
408
|
-
dragIsEnabledForAllItems = !draggedElement.dragDisabled;
|
|
409
|
-
dataTransferInfo = [
|
|
410
|
-
{ id: draggedElement.id, metadata: draggedElement.metadata }
|
|
411
|
-
];
|
|
412
|
-
this.draggedIds = [draggedElement.id];
|
|
413
|
-
this.dragInfo = draggedElement.caption;
|
|
414
|
-
}
|
|
415
|
-
this.getDirectParentsOfDraggableItems(isDraggingSelectedItems);
|
|
416
|
-
// Update drag event info
|
|
417
|
-
const data = JSON.stringify(dataTransferInfo);
|
|
418
|
-
dragInfo.dragEvent.dataTransfer.setData(TEXT_FORMAT, data);
|
|
419
|
-
// We must keep the data binding and processing even if there is an item
|
|
420
|
-
// that can't be dragged, otherwise, other trees or element might behave
|
|
421
|
-
// unexpected when a dragstart event comes
|
|
422
|
-
return dragIsEnabledForAllItems;
|
|
423
|
-
}
|
|
424
|
-
getDirectParentsOfDraggableItems(draggingSelectedItems) {
|
|
425
|
-
if (!draggingSelectedItems) {
|
|
426
|
-
const parentTreeItemElem = this.currentDraggedItem.parentElement;
|
|
427
|
-
if (parentTreeItemElem.tagName.toLowerCase() === TREE_ITEM_TAG_NAME) {
|
|
428
|
-
this.draggedParentIds.push(parentTreeItemElem.id);
|
|
429
|
-
}
|
|
430
|
-
return;
|
|
431
|
-
}
|
|
432
|
-
// Dragging selected items
|
|
433
|
-
this.selectedItemsInfo.forEach(selectedItem => {
|
|
434
|
-
const parentId = selectedItem.parentId;
|
|
435
|
-
// parentId === "" when the item is in the first level of the tree
|
|
436
|
-
if (parentId !== "") {
|
|
437
|
-
this.draggedParentIds.push(parentId);
|
|
438
|
-
}
|
|
439
|
-
});
|
|
440
|
-
}
|
|
441
|
-
handleItemSelection(selectedItemEl, selectedItemInfo) {
|
|
442
|
-
// If the Control key was not pressed or multi selection is disabled,
|
|
443
|
-
// remove all selected items
|
|
444
|
-
if (!selectedItemInfo.ctrlKeyPressed || !this.multiSelection) {
|
|
445
|
-
// Don't update the state of the selected item if no needed
|
|
446
|
-
this.selectedItemsInfo.delete(selectedItemInfo.id);
|
|
447
|
-
this.selectedItemsInfo.forEach(treeItem => {
|
|
448
|
-
treeItem.itemRef.selected = false;
|
|
449
|
-
});
|
|
450
|
-
this.clearSelectedItems();
|
|
451
|
-
// Re-select the item
|
|
452
|
-
selectedItemEl.selected = selectedItemInfo.selected;
|
|
453
|
-
}
|
|
454
|
-
// If the item is selected, add it to list
|
|
455
|
-
if (selectedItemInfo.selected) {
|
|
456
|
-
this.selectedItemsInfo.set(selectedItemInfo.id, selectedItemInfo);
|
|
457
|
-
}
|
|
458
|
-
// Sync with UI model
|
|
459
|
-
this.selectedItemsChange.emit(this.selectedItemsInfo);
|
|
460
|
-
}
|
|
461
|
-
clearSelectedItems() {
|
|
462
|
-
this.selectedItemsInfo.clear();
|
|
463
|
-
}
|
|
464
|
-
disconnectedCallback() {
|
|
465
|
-
this.resetVariables();
|
|
466
|
-
// Remove dragover body event
|
|
467
|
-
this.handleItemDragEnd();
|
|
468
|
-
}
|
|
469
|
-
render() {
|
|
470
|
-
return (h(Host, { class: {
|
|
471
|
-
"ch-tree-x-dragging-item": this.draggingInTheDocument,
|
|
472
|
-
"ch-tree-x-not-dragging-item": !this.draggingInTheDocument,
|
|
473
|
-
"ch-tree-x--dragging-selected-items": this.draggingInTree && this.draggingSelectedItems,
|
|
474
|
-
"ch-tree-x-waiting-drop-processing": this.waitDropProcessing
|
|
475
|
-
} }, h("div", { role: "tree", part: "tree-x-container", "aria-multiselectable": this.multiSelection.toString(), class: "ch-tree-x-container" }, h("slot", null)), this.draggingInTree && (h("span", { "aria-hidden": "true", class: "ch-tree-x-drag-info" }, this.dragInfo))));
|
|
476
|
-
}
|
|
477
|
-
get el() { return this; }
|
|
478
|
-
static get style() { return treeXCss; }
|
|
479
|
-
}, [4, "ch-tree-x", {
|
|
480
|
-
"multiSelection": [4, "multi-selection"],
|
|
481
|
-
"openSubTreeCountdown": [2, "open-sub-tree-countdown"],
|
|
482
|
-
"scrollToEdgeOnDrag": [4, "scroll-to-edge-on-drag"],
|
|
483
|
-
"waitDropProcessing": [4, "wait-drop-processing"],
|
|
484
|
-
"draggingInTheDocument": [32],
|
|
485
|
-
"draggingInTree": [32],
|
|
486
|
-
"clearSelectedItemsInfo": [64],
|
|
487
|
-
"scrollIntoVisible": [64],
|
|
488
|
-
"updateValidDropZone": [64]
|
|
489
|
-
}, [[2, "contextmenu", "handleContextMenuEvent"], [2, "keydown", "handleKeyDownEvents"], [9, "dragstart", "handleDragStart"], [11, "dragend", "handleDragEnd"], [3, "dragenter", "handleDragEnter"], [3, "dragleave", "handleDragLeave"], [1, "drop", "handleItemDrop"], [0, "itemDragStart", "handleItemDragStart"], [0, "itemDragEnd", "handleItemDragEnd"], [0, "selectedItemSync", "handleSelectedItemSync"], [0, "selectedItemChange", "handleSelectedItemChange"]]]);
|
|
490
|
-
function defineCustomElement() {
|
|
491
|
-
if (typeof customElements === "undefined") {
|
|
492
|
-
return;
|
|
493
|
-
}
|
|
494
|
-
const components = ["ch-tree-x"];
|
|
495
|
-
components.forEach(tagName => { switch (tagName) {
|
|
496
|
-
case "ch-tree-x":
|
|
497
|
-
if (!customElements.get(tagName)) {
|
|
498
|
-
customElements.define(tagName, ChTreeX);
|
|
499
|
-
}
|
|
500
|
-
break;
|
|
501
|
-
} });
|
|
502
|
-
}
|
|
503
|
-
|
|
504
|
-
export { ChTreeX as C, defineCustomElement as d };
|
|
@@ -1,89 +0,0 @@
|
|
|
1
|
-
import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-0da01575.js';
|
|
2
|
-
import { D as DISABLED_CLASS } from './reserverd-names-2a2d0fb3.js';
|
|
3
|
-
|
|
4
|
-
const checkboxCss = "*,::before,::after{box-sizing:border-box}:host{display:flex;align-items:center;align-self:stretch;outline:unset;touch-action:manipulation;user-select:none}:host(.ch-checkbox--actionable) :is(.input,.label){cursor:pointer}.container{position:relative;width:min(1em, 20px);height:min(1em, 20px);border:1px solid var(--option-border-color, currentColor);border-radius:18.75%}.container--checked{background-color:var(--option-checked-color, #ffffff00)}.container:focus-within{box-shadow:0 0 1px 1px color-mix(in srgb, currentColor 25%, transparent)}.input{display:flex;width:100%;height:100%;opacity:0;margin:0;padding:0}.option{position:absolute;left:50%;top:50%;transform:translate(-50%, -50%);width:50%;height:50%;background-color:currentColor;opacity:0;pointer-events:none}.option--checked{opacity:1;-webkit-mask:url(\"data:image/svg+xml, %3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8' %3E%3Cpath fill='currentColor' d='M6.564.75l-3.59 3.612-1.538-1.55L0 4.26l2.974 2.99L8 2.193z' /%3E%3C/svg%3E\")}.option--indeterminate{opacity:1}.label{margin-inline-start:min(0.35em, 7px)}";
|
|
5
|
-
|
|
6
|
-
const CHECKBOX_ID = "checkbox";
|
|
7
|
-
const PARTS = (checked, indeterminate) => `${checked ? " checked" : ""}${indeterminate ? " indeterminate" : ""}`;
|
|
8
|
-
const CheckBox = class {
|
|
9
|
-
constructor(hostRef) {
|
|
10
|
-
registerInstance(this, hostRef);
|
|
11
|
-
this.click = createEvent(this, "click", 7);
|
|
12
|
-
this.input = createEvent(this, "input", 7);
|
|
13
|
-
/**
|
|
14
|
-
* This attribute lets you specify if the element is disabled.
|
|
15
|
-
* If disabled, it will not fire any user interaction related event
|
|
16
|
-
* (for example, click event).
|
|
17
|
-
*/
|
|
18
|
-
this.disabled = false;
|
|
19
|
-
/**
|
|
20
|
-
* True to highlight control when an action is fired.
|
|
21
|
-
*/
|
|
22
|
-
this.highlightable = false;
|
|
23
|
-
/**
|
|
24
|
-
* `true` if the control's value is indeterminate.
|
|
25
|
-
*/
|
|
26
|
-
this.indeterminate = false;
|
|
27
|
-
/**
|
|
28
|
-
* This attribute indicates that the user cannot modify the value of the control.
|
|
29
|
-
* Same as [readonly](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly)
|
|
30
|
-
* attribute for `input` elements.
|
|
31
|
-
*/
|
|
32
|
-
this.readonly = false;
|
|
33
|
-
this.getValue = (checked) => checked ? this.checkedValue : this.unCheckedValue;
|
|
34
|
-
/**
|
|
35
|
-
* Checks if it is necessary to prevent the click from bubbling
|
|
36
|
-
*/
|
|
37
|
-
this.handleClick = (event) => {
|
|
38
|
-
if (this.readonly || this.disabled) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
event.stopPropagation();
|
|
42
|
-
};
|
|
43
|
-
this.handleChange = (event) => {
|
|
44
|
-
event.stopPropagation();
|
|
45
|
-
const inputRef = event.target;
|
|
46
|
-
const checked = inputRef.checked;
|
|
47
|
-
const value = this.getValue(checked);
|
|
48
|
-
this.checked = checked;
|
|
49
|
-
this.value = value;
|
|
50
|
-
inputRef.value = value; // Update input's value before emitting the event
|
|
51
|
-
this.input.emit(event);
|
|
52
|
-
if (this.highlightable) {
|
|
53
|
-
this.click.emit();
|
|
54
|
-
}
|
|
55
|
-
};
|
|
56
|
-
}
|
|
57
|
-
valueChanged() {
|
|
58
|
-
this.checked = this.value === this.checkedValue;
|
|
59
|
-
}
|
|
60
|
-
componentWillLoad() {
|
|
61
|
-
this.checked = this.value === this.checkedValue;
|
|
62
|
-
}
|
|
63
|
-
render() {
|
|
64
|
-
var _a;
|
|
65
|
-
const additionalParts = PARTS(this.checked, this.indeterminate);
|
|
66
|
-
return (h(Host, { class: {
|
|
67
|
-
[DISABLED_CLASS]: this.disabled,
|
|
68
|
-
"ch-checkbox--actionable": (!this.readonly && !this.disabled) ||
|
|
69
|
-
(this.readonly && this.highlightable)
|
|
70
|
-
} }, h("div", { class: {
|
|
71
|
-
container: true,
|
|
72
|
-
"container--checked": this.checked
|
|
73
|
-
}, part: `container${additionalParts}` }, h("input", { "aria-label": ((_a = this.accessibleName) === null || _a === void 0 ? void 0 : _a.trim()) !== "" &&
|
|
74
|
-
this.accessibleName !== this.caption
|
|
75
|
-
? this.accessibleName
|
|
76
|
-
: null, id: this.caption ? CHECKBOX_ID : null, class: "input", part: "input", type: "checkbox", checked: this.checked, disabled: this.disabled || this.readonly, indeterminate: this.indeterminate, value: this.value, onClick: this.handleClick, onInput: this.handleChange }), h("div", { class: {
|
|
77
|
-
option: true,
|
|
78
|
-
"option--checked": this.checked && !this.indeterminate,
|
|
79
|
-
"option--indeterminate": this.indeterminate
|
|
80
|
-
}, part: `option${additionalParts}`, "aria-hidden": "true" })), this.caption && (h("label", { class: "label", part: "label", htmlFor: CHECKBOX_ID, onClick: this.handleClick }, this.caption))));
|
|
81
|
-
}
|
|
82
|
-
get element() { return getElement(this); }
|
|
83
|
-
static get watchers() { return {
|
|
84
|
-
"value": ["valueChanged"]
|
|
85
|
-
}; }
|
|
86
|
-
};
|
|
87
|
-
CheckBox.style = checkboxCss;
|
|
88
|
-
|
|
89
|
-
export { CheckBox as ch_checkbox };
|