@genexus/genexus-ide-ui 0.0.45 → 0.0.47
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} +249 -184
- package/dist/cjs/ch-global-stylesheet-0e78f960.js +20 -0
- package/dist/cjs/ch-grid-action-refresh_6.cjs.entry.js +43 -37
- package/dist/cjs/ch-grid-infinite-scroll.cjs.entry.js +57 -0
- package/dist/cjs/ch-grid-virtual-scroller.cjs.entry.js +31 -25
- package/dist/cjs/ch-grid_8.cjs.entry.js +30 -21
- package/dist/cjs/ch-style.cjs.entry.js +5 -5
- package/dist/cjs/ch-suggest_4.cjs.entry.js +1 -1
- package/dist/cjs/ch-test-tree-x.cjs.entry.js +26 -6
- package/dist/cjs/ch-window_2.cjs.entry.js +2 -2
- package/dist/cjs/{common-facb7f18.js → common-5d08e273.js} +10 -4
- package/dist/cjs/genexus-ide-ui.cjs.js +1 -1
- package/dist/cjs/gx-ide-container_5.cjs.entry.js +2 -2
- package/dist/cjs/gx-ide-create-kb-from-server.cjs.entry.js +2 -2
- package/dist/cjs/gx-ide-entity-selector_2.cjs.entry.js +2 -2
- package/dist/cjs/gx-ide-new-environment.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-new-kb.cjs.entry.js +40 -55
- package/dist/cjs/gx-ide-new-object.cjs.entry.js +1 -4
- package/dist/cjs/gx-ide-team-dev-select-recent-comment.cjs.entry.js +1 -1
- package/dist/cjs/gx-ide-ww-images.cjs.entry.js +1 -1
- package/dist/cjs/gxg-button.cjs.entry.js +1 -1
- package/dist/cjs/gxg-combo-box_2.cjs.entry.js +39 -42
- package/dist/cjs/gxg-drop-down.cjs.entry.js +1 -1
- package/dist/cjs/gxg-form-checkbox.cjs.entry.js +1 -1
- package/dist/cjs/gxg-form-text.cjs.entry.js +3 -2
- package/dist/cjs/gxg-form-textarea.cjs.entry.js +1 -1
- package/dist/cjs/gxg-label_2.cjs.entry.js +1 -1
- package/dist/cjs/gxg-list-box_2.cjs.entry.js +71 -60
- package/dist/cjs/gxg-menu-slim-item.cjs.entry.js +1 -1
- package/dist/cjs/gxg-option.cjs.entry.js +1 -1
- package/dist/cjs/gxg-select.cjs.entry.js +1 -1
- package/dist/cjs/gxg-test.cjs.entry.js +86 -79
- package/dist/cjs/gxg-tree-view.cjs.entry.js +342 -0
- package/dist/cjs/gxg-tree_2.cjs.entry.js +1 -1
- package/dist/cjs/{helpers-8845f008.js → helpers-291cb1cb.js} +10 -0
- package/dist/cjs/loader.cjs.js +1 -1
- package/dist/collection/collection-manifest.json +2 -0
- package/dist/collection/common/common.js +10 -4
- package/dist/collection/components/container/container.css +5 -0
- package/dist/collection/components/create-kb-from-server/create-kb-from-server.js +1 -1
- package/dist/collection/components/entity-selector/entity-selector.css +1 -1
- package/dist/collection/components/new-kb/gx-ide-assets/new-kb/langs/new-kb.lang.en.json +50 -10
- package/dist/collection/components/new-kb/new-kb.js +39 -54
- package/dist/collection/components/new-object/new-object.js +1 -4
- package/dist/collection/components/team-dev-select-recent-comment/team-dev-select-recent-comment.js +1 -1
- package/dist/components/button.js +1 -1
- package/dist/components/ch-global-stylesheet.js +14 -1
- package/dist/components/ch-grid-infinite-scroll.js +75 -0
- package/dist/components/ch-grid-rowset-legend.js +32 -1
- package/dist/components/ch-grid-virtual-scroller.js +32 -25
- package/dist/components/ch-grid2.js +30 -21
- package/dist/components/ch-paginator2.js +43 -37
- package/dist/components/ch-style.js +5 -5
- package/dist/components/ch-test-tree-x.js +29 -7
- package/dist/components/ch-window2.js +2 -2
- package/dist/components/combo-box-item.js +2 -2
- package/dist/components/combo-box.js +37 -41
- package/dist/components/common.js +10 -4
- package/dist/components/container.js +1 -1
- package/dist/components/date-picker.js +1 -1
- package/dist/components/entity-selector.js +1 -1
- package/dist/components/form-checkbox.js +1 -1
- package/dist/components/form-text.js +3 -2
- package/dist/components/form-textarea.js +1 -1
- package/dist/components/gx-ide-create-kb-from-server.js +1 -1
- package/dist/components/gx-ide-new-kb.js +40 -55
- package/dist/components/gx-ide-new-object.js +1 -4
- package/dist/components/gx-ide-team-dev-select-recent-comment.js +1 -1
- package/dist/components/gxg-drop-down.js +1 -1
- package/dist/components/gxg-label2.js +1 -1
- package/dist/components/gxg-menu-slim-item.js +1 -1
- package/dist/components/gxg-option.js +1 -1
- package/dist/components/gxg-select.js +1 -1
- package/dist/components/gxg-test.js +106 -145
- package/dist/components/gxg-tree-item2.js +1 -1
- package/dist/components/gxg-tree-view.js +393 -0
- package/dist/components/helpers.js +10 -1
- package/dist/components/index.js +2 -0
- package/dist/components/list-box-item.js +15 -18
- package/dist/components/list-box.js +58 -46
- package/dist/components/suggest.js +1 -1
- package/dist/components/tab-button.js +1 -1
- package/dist/components/tree-x-list-item.js +42 -48
- package/dist/components/tree-x-list.js +2 -51
- package/dist/components/tree-x.js +124 -91
- package/dist/esm/{ch-tree-x_3.entry.js → ch-checkbox_4.entry.js} +249 -185
- package/dist/esm/ch-global-stylesheet-4638bea5.js +16 -0
- package/dist/esm/ch-grid-action-refresh_6.entry.js +43 -37
- package/dist/esm/ch-grid-infinite-scroll.entry.js +53 -0
- package/dist/esm/ch-grid-virtual-scroller.entry.js +31 -25
- package/dist/esm/ch-grid_8.entry.js +30 -21
- package/dist/esm/ch-style.entry.js +5 -5
- package/dist/esm/ch-suggest_4.entry.js +1 -1
- package/dist/esm/ch-test-tree-x.entry.js +26 -6
- package/dist/esm/ch-window_2.entry.js +2 -2
- package/dist/esm/{common-a3df0966.js → common-ec35ec2f.js} +10 -4
- package/dist/esm/genexus-ide-ui.js +1 -1
- package/dist/esm/gx-ide-container_5.entry.js +2 -2
- package/dist/esm/gx-ide-create-kb-from-server.entry.js +2 -2
- package/dist/esm/gx-ide-entity-selector_2.entry.js +2 -2
- package/dist/esm/gx-ide-new-environment.entry.js +1 -1
- package/dist/esm/gx-ide-new-kb.entry.js +40 -55
- package/dist/esm/gx-ide-new-object.entry.js +1 -4
- package/dist/esm/gx-ide-team-dev-select-recent-comment.entry.js +1 -1
- package/dist/esm/gx-ide-ww-images.entry.js +1 -1
- package/dist/esm/gxg-button.entry.js +1 -1
- package/dist/esm/gxg-combo-box_2.entry.js +39 -42
- package/dist/esm/gxg-drop-down.entry.js +1 -1
- package/dist/esm/gxg-form-checkbox.entry.js +1 -1
- package/dist/esm/gxg-form-text.entry.js +3 -2
- package/dist/esm/gxg-form-textarea.entry.js +1 -1
- package/dist/esm/gxg-label_2.entry.js +1 -1
- package/dist/esm/gxg-list-box_2.entry.js +71 -60
- package/dist/esm/gxg-menu-slim-item.entry.js +1 -1
- package/dist/esm/gxg-option.entry.js +1 -1
- package/dist/esm/gxg-select.entry.js +1 -1
- package/dist/esm/gxg-test.entry.js +87 -80
- package/dist/esm/gxg-tree-view.entry.js +338 -0
- package/dist/esm/gxg-tree_2.entry.js +1 -1
- package/dist/esm/{helpers-56190205.js → helpers-1ecd5e26.js} +10 -1
- package/dist/esm/loader.js +1 -1
- package/dist/genexus-ide-ui/genexus-ide-ui.css +2 -2
- package/dist/genexus-ide-ui/genexus-ide-ui.esm.js +1 -1
- package/dist/genexus-ide-ui/gx-ide-assets/new-kb/langs/new-kb.lang.en.json +50 -10
- package/dist/genexus-ide-ui/p-052744b8.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-9014609e.entry.js → p-059830b9.entry.js} +1 -1
- package/dist/genexus-ide-ui/{p-e5a3e3b9.entry.js → p-282b73f8.entry.js} +1 -1
- package/dist/genexus-ide-ui/{p-6da13f78.entry.js → p-2aeae374.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-437069b0.entry.js +1 -0
- package/dist/genexus-ide-ui/p-447c3a31.entry.js +1 -0
- package/dist/genexus-ide-ui/p-4ff84cb2.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-c38c6957.entry.js → p-54d15f4d.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-5c0cb73d.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-0141cbce.entry.js → p-5cb871e3.entry.js} +1 -1
- package/dist/genexus-ide-ui/{p-a82042ee.entry.js → p-64cbe277.entry.js} +1 -1
- package/dist/genexus-ide-ui/{p-50c603e6.entry.js → p-7c88194a.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-7dbe195c.entry.js +1 -0
- package/dist/genexus-ide-ui/p-8c4b08ea.entry.js +1 -0
- package/dist/genexus-ide-ui/p-93b1e1e9.entry.js +1 -0
- package/dist/genexus-ide-ui/p-98c6b820.entry.js +1 -0
- package/dist/genexus-ide-ui/p-9aa2dd17.entry.js +1 -0
- package/dist/genexus-ide-ui/p-9ba292a0.entry.js +1 -0
- package/dist/genexus-ide-ui/p-a2fa3132.entry.js +1 -0
- package/dist/genexus-ide-ui/p-b374d112.js +1 -0
- package/dist/genexus-ide-ui/p-b5dc509f.entry.js +1 -0
- package/dist/genexus-ide-ui/p-b8d5c561.js +1 -0
- package/dist/genexus-ide-ui/p-c0edbeb5.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-f1116ac5.entry.js → p-cbeac1ab.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-cd5482fa.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-6c825ffc.entry.js → p-ce7a7b5f.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-d02f6ce4.entry.js +1 -0
- package/dist/genexus-ide-ui/p-d30c5a8e.entry.js +1 -0
- package/dist/genexus-ide-ui/p-d312fe25.entry.js +1 -0
- package/dist/genexus-ide-ui/p-d557b2fe.entry.js +1 -0
- package/dist/genexus-ide-ui/{p-72e1b9d5.entry.js → p-e586d05e.entry.js} +1 -1
- package/dist/genexus-ide-ui/p-e6ae0460.entry.js +1 -0
- package/dist/genexus-ide-ui/p-eb8f4ad5.js +1 -0
- package/dist/genexus-ide-ui/p-eddf8a1e.entry.js +1 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/grid/grid-infinite-scroll/ch-grid-infinite-scroll.css +9 -0
- package/dist/node_modules/@genexus/chameleon-controls-library/dist/collection/components/test/test-tree-x.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/button/button.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/combo-box-item/combo-box-item.css +9 -5
- package/dist/node_modules/@genexus/gemini/dist/collection/components/date-picker/date-picker.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/drop-down/drop-down.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/form-checkbox/form-checkbox.css +3 -3
- package/dist/node_modules/@genexus/gemini/dist/collection/components/form-option/option.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/form-select/select.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/form-text/form-text.css +7 -7
- package/dist/node_modules/@genexus/gemini/dist/collection/components/form-textarea/form-textarea.css +3 -3
- package/dist/node_modules/@genexus/gemini/dist/collection/components/label/gxg-label.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/list-box/list-box.css +16 -9
- package/dist/node_modules/@genexus/gemini/dist/collection/components/list-box-item/list-box-item.css +27 -9
- package/dist/node_modules/@genexus/gemini/dist/collection/components/menu-slim/item/item.css +6 -6
- package/dist/node_modules/@genexus/gemini/dist/collection/components/suggest/styles.css +5 -5
- package/dist/node_modules/@genexus/gemini/dist/collection/components/tab-button/tab-button.css +1 -1
- package/dist/node_modules/@genexus/gemini/dist/collection/components/tree-item/gxg-tree-item.css +4 -4
- package/dist/node_modules/@genexus/gemini/dist/collection/components/tree-view/tree-view.css +49 -0
- package/dist/types/common/common.d.ts +1 -1
- package/dist/types/components/new-kb/new-kb.d.ts +0 -9
- package/package.json +3 -3
- package/dist/cjs/ch-checkbox.cjs.entry.js +0 -93
- package/dist/cjs/ch-global-stylesheet-145c4b20.js +0 -5
- package/dist/components/ch-grid-rowset-legend2.js +0 -34
- package/dist/esm/ch-checkbox.entry.js +0 -89
- package/dist/esm/ch-global-stylesheet-f8bbf095.js +0 -3
- package/dist/genexus-ide-ui/p-04f69ecc.entry.js +0 -1
- package/dist/genexus-ide-ui/p-080f6c41.js +0 -1
- package/dist/genexus-ide-ui/p-1ccf523f.entry.js +0 -1
- package/dist/genexus-ide-ui/p-24f47ee2.entry.js +0 -1
- package/dist/genexus-ide-ui/p-28d0afda.entry.js +0 -1
- package/dist/genexus-ide-ui/p-44964acf.js +0 -1
- package/dist/genexus-ide-ui/p-4b7f7425.entry.js +0 -1
- package/dist/genexus-ide-ui/p-597a1d43.entry.js +0 -1
- package/dist/genexus-ide-ui/p-6afc6187.entry.js +0 -1
- package/dist/genexus-ide-ui/p-70489f0c.entry.js +0 -1
- package/dist/genexus-ide-ui/p-84e91b37.entry.js +0 -1
- package/dist/genexus-ide-ui/p-87e8eb72.js +0 -1
- package/dist/genexus-ide-ui/p-8bf7f0e1.entry.js +0 -1
- package/dist/genexus-ide-ui/p-8c2ab053.entry.js +0 -1
- package/dist/genexus-ide-ui/p-917c5696.entry.js +0 -1
- package/dist/genexus-ide-ui/p-92e84fcc.entry.js +0 -1
- package/dist/genexus-ide-ui/p-9dc36eb3.entry.js +0 -1
- package/dist/genexus-ide-ui/p-ad9fdfdf.entry.js +0 -1
- package/dist/genexus-ide-ui/p-bb1809cb.entry.js +0 -1
- package/dist/genexus-ide-ui/p-c056d050.entry.js +0 -1
- package/dist/genexus-ide-ui/p-c6ad49cc.entry.js +0 -1
- package/dist/genexus-ide-ui/p-e1cd9135.entry.js +0 -1
- package/dist/genexus-ide-ui/p-f28601c2.entry.js +0 -1
|
@@ -3,7 +3,93 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
const index = require('./index-5a32426a.js');
|
|
6
|
-
const
|
|
6
|
+
const reserverdNames = require('./reserverd-names-1b00889a.js');
|
|
7
|
+
const helpers = require('./helpers-291cb1cb.js');
|
|
8
|
+
|
|
9
|
+
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, #000);border-radius:18.75%}.container--checked{background-color:var(--option-checked-color, #ffffff00)}.container:focus-within{box-shadow:0 0 1px 1px #00000040}.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:#000;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)}";
|
|
10
|
+
|
|
11
|
+
const CHECKBOX_ID = "checkbox";
|
|
12
|
+
const PARTS = (checked, indeterminate) => `${checked ? " checked" : ""}${indeterminate ? " indeterminate" : ""}`;
|
|
13
|
+
const CheckBox = class {
|
|
14
|
+
constructor(hostRef) {
|
|
15
|
+
index.registerInstance(this, hostRef);
|
|
16
|
+
this.click = index.createEvent(this, "click", 7);
|
|
17
|
+
this.input = index.createEvent(this, "input", 7);
|
|
18
|
+
/**
|
|
19
|
+
* This attribute lets you specify if the element is disabled.
|
|
20
|
+
* If disabled, it will not fire any user interaction related event
|
|
21
|
+
* (for example, click event).
|
|
22
|
+
*/
|
|
23
|
+
this.disabled = false;
|
|
24
|
+
/**
|
|
25
|
+
* True to highlight control when an action is fired.
|
|
26
|
+
*/
|
|
27
|
+
this.highlightable = false;
|
|
28
|
+
/**
|
|
29
|
+
* `true` if the control's value is indeterminate.
|
|
30
|
+
*/
|
|
31
|
+
this.indeterminate = false;
|
|
32
|
+
/**
|
|
33
|
+
* This attribute indicates that the user cannot modify the value of the control.
|
|
34
|
+
* Same as [readonly](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input#attr-readonly)
|
|
35
|
+
* attribute for `input` elements.
|
|
36
|
+
*/
|
|
37
|
+
this.readonly = false;
|
|
38
|
+
this.getValue = (checked) => checked ? this.checkedValue : this.unCheckedValue;
|
|
39
|
+
/**
|
|
40
|
+
* Checks if it is necessary to prevent the click from bubbling
|
|
41
|
+
*/
|
|
42
|
+
this.handleClick = (event) => {
|
|
43
|
+
if (this.readonly || this.disabled) {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
event.stopPropagation();
|
|
47
|
+
};
|
|
48
|
+
this.handleChange = (event) => {
|
|
49
|
+
event.stopPropagation();
|
|
50
|
+
const inputRef = event.target;
|
|
51
|
+
const checked = inputRef.checked;
|
|
52
|
+
const value = this.getValue(checked);
|
|
53
|
+
this.checked = checked;
|
|
54
|
+
this.value = value;
|
|
55
|
+
inputRef.value = value; // Update input's value before emitting the event
|
|
56
|
+
this.input.emit(event);
|
|
57
|
+
if (this.highlightable) {
|
|
58
|
+
this.click.emit();
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
valueChanged() {
|
|
63
|
+
this.checked = this.value === this.checkedValue;
|
|
64
|
+
}
|
|
65
|
+
componentWillLoad() {
|
|
66
|
+
this.checked = this.value === this.checkedValue;
|
|
67
|
+
}
|
|
68
|
+
render() {
|
|
69
|
+
var _a;
|
|
70
|
+
const additionalParts = PARTS(this.checked, this.indeterminate);
|
|
71
|
+
return (index.h(index.Host, { class: {
|
|
72
|
+
[reserverdNames.DISABLED_CLASS]: this.disabled,
|
|
73
|
+
"ch-checkbox--actionable": (!this.readonly && !this.disabled) ||
|
|
74
|
+
(this.readonly && this.highlightable)
|
|
75
|
+
} }, index.h("div", { class: {
|
|
76
|
+
container: true,
|
|
77
|
+
"container--checked": this.checked
|
|
78
|
+
}, part: `container${additionalParts}` }, index.h("input", { "aria-label": ((_a = this.accessibleName) === null || _a === void 0 ? void 0 : _a.trim()) !== "" &&
|
|
79
|
+
this.accessibleName !== this.caption
|
|
80
|
+
? this.accessibleName
|
|
81
|
+
: 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 }), index.h("div", { class: {
|
|
82
|
+
option: true,
|
|
83
|
+
"option--checked": this.checked && !this.indeterminate,
|
|
84
|
+
"option--indeterminate": this.indeterminate
|
|
85
|
+
}, part: `option${additionalParts}`, "aria-hidden": "true" })), this.caption && (index.h("label", { class: "label", part: "label", htmlFor: CHECKBOX_ID, onClick: this.handleClick }, this.caption))));
|
|
86
|
+
}
|
|
87
|
+
get element() { return index.getElement(this); }
|
|
88
|
+
static get watchers() { return {
|
|
89
|
+
"value": ["valueChanged"]
|
|
90
|
+
}; }
|
|
91
|
+
};
|
|
92
|
+
CheckBox.style = checkboxCss;
|
|
7
93
|
|
|
8
94
|
const scrollToEdge = (event, container, scrollSpeed, scrollThreshold) => {
|
|
9
95
|
const mousePositionY = event.clientY - container.getBoundingClientRect().top;
|
|
@@ -22,9 +108,8 @@ const scrollToEdge = (event, container, scrollSpeed, scrollThreshold) => {
|
|
|
22
108
|
const treeXCss = "ch-tree-x{display:flex;position:relative;overflow:auto}ch-tree-x>ch-tree-x-list{position:absolute;inset:0;min-width:max-content}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,ch-tree-x.ch-tree-x-dragging-item ch-tree-x-list{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-list{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%}";
|
|
23
109
|
|
|
24
110
|
const TREE_ITEM_TAG_NAME$1 = "ch-tree-x-list-item";
|
|
25
|
-
const
|
|
111
|
+
const TREE_TAG_NAME = "ch-tree-x";
|
|
26
112
|
// Selectors
|
|
27
|
-
const TREE_LIST_AND_ITEM_SELECTOR = TREE_LIST_TAG_NAME + "," + TREE_ITEM_TAG_NAME$1;
|
|
28
113
|
// const CHECKED_ITEMS = `${TREE_ITEM_TAG_NAME}[checked]`;
|
|
29
114
|
const TEXT_FORMAT = "text/plain";
|
|
30
115
|
const ARROW_DOWN_KEY = "ArrowDown";
|
|
@@ -80,10 +165,6 @@ const ChTreeX = class {
|
|
|
80
165
|
this.draggedParentIds = [];
|
|
81
166
|
this.draggingInTheDocument = false;
|
|
82
167
|
this.draggingInTree = false;
|
|
83
|
-
/**
|
|
84
|
-
* Level in the tree at which the control is placed.
|
|
85
|
-
*/
|
|
86
|
-
this.level = -1;
|
|
87
168
|
/**
|
|
88
169
|
* Set this attribute if you want to allow multi selection of the items.
|
|
89
170
|
*/
|
|
@@ -98,11 +179,6 @@ const ChTreeX = class {
|
|
|
98
179
|
* tree.
|
|
99
180
|
*/
|
|
100
181
|
this.scrollToEdgeOnDrag = true;
|
|
101
|
-
/**
|
|
102
|
-
* `true` to display the relation between tree items and tree lists using
|
|
103
|
-
* lines.
|
|
104
|
-
*/
|
|
105
|
-
this.showLines = "none";
|
|
106
182
|
/**
|
|
107
183
|
* This property lets you specify if the tree is waiting to process the drop
|
|
108
184
|
* of items.
|
|
@@ -111,6 +187,7 @@ const ChTreeX = class {
|
|
|
111
187
|
this.trackItemDrag = (event) => {
|
|
112
188
|
event.preventDefault();
|
|
113
189
|
this.lastDragEvent = event;
|
|
190
|
+
this.updateDropEffect(event);
|
|
114
191
|
if (!this.needForRAF) {
|
|
115
192
|
return;
|
|
116
193
|
}
|
|
@@ -130,57 +207,6 @@ const ChTreeX = class {
|
|
|
130
207
|
requestAnimationFrame(this.fixScrollPositionOnDrag);
|
|
131
208
|
});
|
|
132
209
|
};
|
|
133
|
-
this.handleKeyDownEvents = (event) => {
|
|
134
|
-
const keyHandler = this.keyDownEvents[event.key];
|
|
135
|
-
if (keyHandler) {
|
|
136
|
-
keyHandler(event);
|
|
137
|
-
}
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
handleShowLinesChange(newShowLines) {
|
|
141
|
-
const treeItems = this.el.querySelectorAll(TREE_LIST_AND_ITEM_SELECTOR);
|
|
142
|
-
treeItems.forEach(item => {
|
|
143
|
-
item.showLines = newShowLines;
|
|
144
|
-
});
|
|
145
|
-
}
|
|
146
|
-
/**
|
|
147
|
-
* Given an item id, it displays and scrolls into the item view.
|
|
148
|
-
*/
|
|
149
|
-
async scrollIntoVisible(treeItemId) {
|
|
150
|
-
const itemRef = this.el.querySelector(`${TREE_ITEM_TAG_NAME$1}#${treeItemId}`);
|
|
151
|
-
if (!itemRef) {
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
let parentItem = itemRef.parentElement.parentElement;
|
|
155
|
-
// Expand all parents
|
|
156
|
-
while (parentItem.tagName.toLowerCase() === TREE_ITEM_TAG_NAME$1) {
|
|
157
|
-
parentItem.expanded = true;
|
|
158
|
-
parentItem = parentItem.parentElement.parentElement;
|
|
159
|
-
}
|
|
160
|
-
// Wait until the parents are expanded
|
|
161
|
-
requestAnimationFrame(() => {
|
|
162
|
-
itemRef.scrollIntoView();
|
|
163
|
-
});
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Update the information about the valid droppable zones.
|
|
167
|
-
* @param requestTimestamp Time where the request to the server was made. Useful to avoid having old information.
|
|
168
|
-
* @param newContainerId ID of the container where the drag is trying to be made.
|
|
169
|
-
* @param draggedItems Information about the dragged items.
|
|
170
|
-
* @param validDrop Current state of the droppable zone.
|
|
171
|
-
*/
|
|
172
|
-
async updateValidDroppableZone(requestTimestamp, newContainerId, draggedItems, validDrop) {
|
|
173
|
-
var _a;
|
|
174
|
-
if (!this.draggingInTheDocument ||
|
|
175
|
-
requestTimestamp <= this.dragStartTimestamp) {
|
|
176
|
-
return;
|
|
177
|
-
}
|
|
178
|
-
const droppableZoneKey = getDroppableZoneKey(newContainerId, draggedItems);
|
|
179
|
-
this.validDroppableZoneCache.set(droppableZoneKey, validDrop ? "valid" : "invalid");
|
|
180
|
-
const shouldUpdateDragEnterInCurrentContainer = ((_a = this.lastOpenSubTreeItem) === null || _a === void 0 ? void 0 : _a.id) === newContainerId;
|
|
181
|
-
if (shouldUpdateDragEnterInCurrentContainer) {
|
|
182
|
-
this.lastOpenSubTreeItem.dragState = "enter";
|
|
183
|
-
}
|
|
184
210
|
}
|
|
185
211
|
// /**
|
|
186
212
|
// * Returns an array of the selected tree items, providing the id, caption and
|
|
@@ -197,6 +223,13 @@ const ChTreeX = class {
|
|
|
197
223
|
// selected: item.selected
|
|
198
224
|
// }));
|
|
199
225
|
// }
|
|
226
|
+
// Set edit mode in items
|
|
227
|
+
handleKeyDownEvents(event) {
|
|
228
|
+
const keyHandler = this.keyDownEvents[event.key];
|
|
229
|
+
if (keyHandler) {
|
|
230
|
+
keyHandler(event);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
200
233
|
// We can't use capture, because the dataTransfer info would not be defined
|
|
201
234
|
// Also, we cant use capture and setTimeout with 0 seconds, because the
|
|
202
235
|
// getData method can only be accessed during the dragstart and drop event
|
|
@@ -251,6 +284,7 @@ const ChTreeX = class {
|
|
|
251
284
|
}
|
|
252
285
|
this.itemsDropped.emit({
|
|
253
286
|
newContainer: { id: newContainer.id, metadata: newContainer.metadata },
|
|
287
|
+
draggingSelectedItems: this.draggingSelectedItems,
|
|
254
288
|
draggedItems: draggedItems,
|
|
255
289
|
dropInTheSameTree: this.draggingInTree
|
|
256
290
|
});
|
|
@@ -260,7 +294,13 @@ const ChTreeX = class {
|
|
|
260
294
|
capture: true
|
|
261
295
|
});
|
|
262
296
|
this.currentDraggedItem = event.target;
|
|
263
|
-
this.
|
|
297
|
+
const allItemsCanBeDragged = this.checkDragValidityAndUpdateDragInfo(event.detail);
|
|
298
|
+
if (!allItemsCanBeDragged) {
|
|
299
|
+
// This effect disables drop interactions in all page elements, so there
|
|
300
|
+
// is no need to capture and prevent the drop event in the window
|
|
301
|
+
event.detail.dragEvent.dataTransfer.effectAllowed = "none";
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
264
304
|
this.draggingInTree = true;
|
|
265
305
|
if (this.scrollToEdgeOnDrag) {
|
|
266
306
|
this.fixScrollPositionOnDrag();
|
|
@@ -274,26 +314,94 @@ const ChTreeX = class {
|
|
|
274
314
|
// Reset not allowed droppable ids
|
|
275
315
|
this.resetVariables();
|
|
276
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Only sync the info about the selected items. It does not update the state
|
|
319
|
+
* of the previous selected items.
|
|
320
|
+
*/
|
|
321
|
+
handleSelectedItemSync(event) {
|
|
322
|
+
event.stopPropagation();
|
|
323
|
+
const selectedItemInfo = event.detail;
|
|
324
|
+
// If the item is selected, add it to list
|
|
325
|
+
if (selectedItemInfo.selected) {
|
|
326
|
+
this.selectedItemsInfo.set(selectedItemInfo.id, selectedItemInfo);
|
|
327
|
+
}
|
|
328
|
+
else {
|
|
329
|
+
this.selectedItemsInfo.delete(selectedItemInfo.id);
|
|
330
|
+
}
|
|
331
|
+
}
|
|
277
332
|
handleSelectedItemChange(event) {
|
|
278
333
|
event.stopPropagation();
|
|
279
334
|
const selectedItemInfo = event.detail;
|
|
280
335
|
const selectedItemEl = event.target;
|
|
281
336
|
this.handleItemSelection(selectedItemEl, selectedItemInfo);
|
|
282
337
|
}
|
|
338
|
+
/**
|
|
339
|
+
* Clear all information about the selected items. This method is intended to
|
|
340
|
+
* be used when selected items are reordered and the selected references will
|
|
341
|
+
* no longer be useful.
|
|
342
|
+
*/
|
|
343
|
+
async clearSelectedItemsInfo() {
|
|
344
|
+
this.clearSelectedItems();
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Given an item id, it displays and scrolls into the item view.
|
|
348
|
+
*/
|
|
349
|
+
async scrollIntoVisible(treeItemId) {
|
|
350
|
+
const itemRef = this.el.querySelector(`${TREE_ITEM_TAG_NAME$1}#${treeItemId}`);
|
|
351
|
+
if (!itemRef) {
|
|
352
|
+
return;
|
|
353
|
+
}
|
|
354
|
+
let parentItem = itemRef.parentElement.parentElement;
|
|
355
|
+
// Expand all parents
|
|
356
|
+
while (parentItem.tagName.toLowerCase() === TREE_ITEM_TAG_NAME$1) {
|
|
357
|
+
parentItem.expanded = true;
|
|
358
|
+
parentItem = parentItem.parentElement.parentElement;
|
|
359
|
+
}
|
|
360
|
+
// Wait until the parents are expanded
|
|
361
|
+
requestAnimationFrame(() => {
|
|
362
|
+
itemRef.scrollIntoView();
|
|
363
|
+
});
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Update the information about the valid droppable zones.
|
|
367
|
+
* @param requestTimestamp Time where the request to the server was made. Useful to avoid having old information.
|
|
368
|
+
* @param newContainerId ID of the container where the drag is trying to be made.
|
|
369
|
+
* @param draggedItems Information about the dragged items.
|
|
370
|
+
* @param validDrop Current state of the droppable zone.
|
|
371
|
+
*/
|
|
372
|
+
async updateValidDroppableZone(requestTimestamp, newContainerId, draggedItems, validDrop) {
|
|
373
|
+
var _a;
|
|
374
|
+
if (!this.draggingInTheDocument ||
|
|
375
|
+
requestTimestamp <= this.dragStartTimestamp) {
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
const droppableZoneKey = getDroppableZoneKey(newContainerId, draggedItems);
|
|
379
|
+
this.validDroppableZoneCache.set(droppableZoneKey, validDrop ? "valid" : "invalid");
|
|
380
|
+
const shouldUpdateDragEnterInCurrentContainer = ((_a = this.lastOpenSubTreeItem) === null || _a === void 0 ? void 0 : _a.id) === newContainerId;
|
|
381
|
+
if (shouldUpdateDragEnterInCurrentContainer) {
|
|
382
|
+
this.lastOpenSubTreeItem.dragState = "enter";
|
|
383
|
+
}
|
|
384
|
+
}
|
|
283
385
|
validDroppableZone(event) {
|
|
284
386
|
const containerTarget = event.target;
|
|
285
|
-
// When dragging in the same tree, don't mark droppable zones if they are
|
|
286
|
-
// the dragged items or their direct parents
|
|
287
|
-
if (this.draggingInTree &&
|
|
288
|
-
(this.draggedIds.includes(containerTarget.id) ||
|
|
289
|
-
this.draggedParentIds.includes(containerTarget.id))) {
|
|
290
|
-
return "invalid";
|
|
291
|
-
}
|
|
292
387
|
const cacheKey = getDroppableZoneKey(containerTarget.id, this.draggedItems);
|
|
293
388
|
const droppableZoneState = this.validDroppableZoneCache.get(cacheKey);
|
|
294
389
|
if (droppableZoneState != null) {
|
|
295
390
|
return droppableZoneState;
|
|
296
391
|
}
|
|
392
|
+
// Do not show drop zones if:
|
|
393
|
+
// - The effect does not allow it.
|
|
394
|
+
// - The drop is disabled in the container target.
|
|
395
|
+
// - When dragging in the same tree, don't mark droppable zones if they are
|
|
396
|
+
// the dragged items or their direct parents.
|
|
397
|
+
if (event.dataTransfer.effectAllowed === "none" ||
|
|
398
|
+
containerTarget.dropDisabled ||
|
|
399
|
+
(this.draggingInTree &&
|
|
400
|
+
(this.draggedIds.includes(containerTarget.id) ||
|
|
401
|
+
this.draggedParentIds.includes(containerTarget.id)))) {
|
|
402
|
+
this.validDroppableZoneCache.set(cacheKey, "invalid");
|
|
403
|
+
return "invalid";
|
|
404
|
+
}
|
|
297
405
|
this.validDroppableZoneCache.set(cacheKey, "checking");
|
|
298
406
|
this.droppableZoneEnter.emit({
|
|
299
407
|
newContainer: {
|
|
@@ -313,25 +421,43 @@ const ChTreeX = class {
|
|
|
313
421
|
this.expandedItemChange.emit({ id: currentTarget.id, expanded: true });
|
|
314
422
|
}, this.openSubTreeCountdown);
|
|
315
423
|
}
|
|
424
|
+
updateDropEffect(event) {
|
|
425
|
+
const itemTarget = event.target;
|
|
426
|
+
// Check if it is a valid item
|
|
427
|
+
if (itemTarget.tagName.toLowerCase() !== TREE_ITEM_TAG_NAME$1 ||
|
|
428
|
+
itemTarget.closest(TREE_TAG_NAME) !== this.el) {
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
const cacheKey = getDroppableZoneKey(itemTarget.id, this.draggedItems);
|
|
432
|
+
const droppableZoneState = this.validDroppableZoneCache.get(cacheKey);
|
|
433
|
+
if (droppableZoneState === "invalid") {
|
|
434
|
+
event.dataTransfer.dropEffect = "none";
|
|
435
|
+
}
|
|
436
|
+
}
|
|
316
437
|
resetVariables() {
|
|
317
438
|
this.draggedIds = [];
|
|
318
439
|
this.draggedParentIds = [];
|
|
319
440
|
}
|
|
320
441
|
/**
|
|
321
|
-
*
|
|
322
|
-
* the
|
|
442
|
+
* First, it check if all items can be dragged. If so, it updates the
|
|
443
|
+
* dataTransfer in the drag event to store the ids and metadata of the
|
|
444
|
+
* dragged items. Also it updates the visual information of the dragged
|
|
323
445
|
* items.
|
|
446
|
+
* @returns If all selected items can be dragged.
|
|
324
447
|
*/
|
|
325
|
-
|
|
448
|
+
checkDragValidityAndUpdateDragInfo(dragInfo) {
|
|
326
449
|
const draggedElement = dragInfo.elem;
|
|
327
450
|
const isDraggingSelectedItems = this.selectedItemsInfo.has(draggedElement.id);
|
|
328
451
|
this.draggingSelectedItems = isDraggingSelectedItems;
|
|
329
452
|
let dataTransferInfo = [];
|
|
453
|
+
let dragIsEnabledForAllItems;
|
|
330
454
|
if (isDraggingSelectedItems) {
|
|
331
455
|
const selectedItemKeys = [...this.selectedItemsInfo.keys()];
|
|
456
|
+
const selectedItemValues = [...this.selectedItemsInfo.values()];
|
|
332
457
|
const selectedItemCount = selectedItemKeys.length;
|
|
458
|
+
dragIsEnabledForAllItems = selectedItemValues.every(el => !el.itemRef.dragDisabled);
|
|
333
459
|
this.draggedIds = selectedItemKeys;
|
|
334
|
-
dataTransferInfo =
|
|
460
|
+
dataTransferInfo = selectedItemValues.map(el => ({
|
|
335
461
|
id: el.id,
|
|
336
462
|
metadata: el.metadata
|
|
337
463
|
}));
|
|
@@ -341,6 +467,7 @@ const ChTreeX = class {
|
|
|
341
467
|
: selectedItemCount.toString();
|
|
342
468
|
}
|
|
343
469
|
else {
|
|
470
|
+
dragIsEnabledForAllItems = !draggedElement.dragDisabled;
|
|
344
471
|
dataTransferInfo = [
|
|
345
472
|
{ id: draggedElement.id, metadata: draggedElement.metadata }
|
|
346
473
|
];
|
|
@@ -350,7 +477,11 @@ const ChTreeX = class {
|
|
|
350
477
|
this.getDirectParentsOfDraggableItems(isDraggingSelectedItems);
|
|
351
478
|
// Update drag event info
|
|
352
479
|
const data = JSON.stringify(dataTransferInfo);
|
|
353
|
-
dragInfo.dataTransfer.setData(TEXT_FORMAT, data);
|
|
480
|
+
dragInfo.dragEvent.dataTransfer.setData(TEXT_FORMAT, data);
|
|
481
|
+
// We must keep the data binding and processing even if there is an item
|
|
482
|
+
// that can't be dragged, otherwise, other trees or element might behave
|
|
483
|
+
// unexpected when a dragstart event comes
|
|
484
|
+
return dragIsEnabledForAllItems;
|
|
354
485
|
}
|
|
355
486
|
getDirectParentsOfDraggableItems(draggingSelectedItems) {
|
|
356
487
|
if (!draggingSelectedItems) {
|
|
@@ -373,6 +504,8 @@ const ChTreeX = class {
|
|
|
373
504
|
// If the Control key was not pressed or multi selection is disabled,
|
|
374
505
|
// remove all selected items
|
|
375
506
|
if (!selectedItemInfo.ctrlKeyPressed || !this.multiSelection) {
|
|
507
|
+
// Don't update the state of the selected item if no needed
|
|
508
|
+
this.selectedItemsInfo.delete(selectedItemInfo.id);
|
|
376
509
|
this.selectedItemsInfo.forEach(treeItem => {
|
|
377
510
|
treeItem.itemRef.selected = false;
|
|
378
511
|
});
|
|
@@ -384,23 +517,13 @@ const ChTreeX = class {
|
|
|
384
517
|
if (selectedItemInfo.selected) {
|
|
385
518
|
this.selectedItemsInfo.set(selectedItemInfo.id, selectedItemInfo);
|
|
386
519
|
}
|
|
387
|
-
else {
|
|
388
|
-
this.selectedItemsInfo.delete(selectedItemInfo.id);
|
|
389
|
-
}
|
|
390
520
|
// Sync with UI model
|
|
391
521
|
this.selectedItemsChange.emit(this.selectedItemsInfo);
|
|
392
522
|
}
|
|
393
523
|
clearSelectedItems() {
|
|
394
524
|
this.selectedItemsInfo.clear();
|
|
395
525
|
}
|
|
396
|
-
connectedCallback() {
|
|
397
|
-
// Set edit mode in items
|
|
398
|
-
this.el.addEventListener("keydown", this.handleKeyDownEvents, {
|
|
399
|
-
capture: true
|
|
400
|
-
});
|
|
401
|
-
}
|
|
402
526
|
disconnectedCallback() {
|
|
403
|
-
this.el.removeEventListener("keydown", this.handleKeyDownEvents);
|
|
404
527
|
this.resetVariables();
|
|
405
528
|
// Remove dragover body event
|
|
406
529
|
this.handleItemDragEnd();
|
|
@@ -413,18 +536,11 @@ const ChTreeX = class {
|
|
|
413
536
|
} }, index.h("slot", null), this.draggingInTree && (index.h("span", { "aria-hidden": "true", class: "ch-tree-x-drag-info" }, this.dragInfo))));
|
|
414
537
|
}
|
|
415
538
|
get el() { return index.getElement(this); }
|
|
416
|
-
static get watchers() { return {
|
|
417
|
-
"showLines": ["handleShowLinesChange"]
|
|
418
|
-
}; }
|
|
419
539
|
};
|
|
420
540
|
ChTreeX.style = treeXCss;
|
|
421
541
|
|
|
422
542
|
const treeXListCss = ":host{display:grid;grid-auto-rows:min-content;position:relative;width:100%}";
|
|
423
543
|
|
|
424
|
-
/**
|
|
425
|
-
* This variable specifies a reference to the main ch-tree-x element
|
|
426
|
-
*/
|
|
427
|
-
let mainTreeRef$1;
|
|
428
544
|
const ChTreeListX = class {
|
|
429
545
|
constructor(hostRef) {
|
|
430
546
|
index.registerInstance(this, hostRef);
|
|
@@ -432,55 +548,11 @@ const ChTreeListX = class {
|
|
|
432
548
|
* Level in the tree at which the control is placed.
|
|
433
549
|
*/
|
|
434
550
|
this.level = 0;
|
|
435
|
-
/**
|
|
436
|
-
* `true` to display the relation between tree items and tree lists using
|
|
437
|
-
* lines.
|
|
438
|
-
*/
|
|
439
|
-
this.showLines = "none";
|
|
440
|
-
this.updateLastItemDashedLine = () => {
|
|
441
|
-
// @todo WA to avoid StencilJS' bug. The showLines Watch is dispatched
|
|
442
|
-
// before the componentDidLoad lifecycle method completes
|
|
443
|
-
if (!this.slotRef) {
|
|
444
|
-
return;
|
|
445
|
-
}
|
|
446
|
-
const treeItems = this.slotRef.assignedElements();
|
|
447
|
-
if (treeItems.length === 0) {
|
|
448
|
-
return;
|
|
449
|
-
}
|
|
450
|
-
const lastItemIndex = treeItems.length - 1;
|
|
451
|
-
for (let i = 0; i < lastItemIndex; i++) {
|
|
452
|
-
treeItems[i].lastItem = false;
|
|
453
|
-
}
|
|
454
|
-
treeItems[lastItemIndex].lastItem = true;
|
|
455
|
-
};
|
|
456
|
-
}
|
|
457
|
-
handleShowLinesChange(newValue) {
|
|
458
|
-
// Displayed items may have changed since the last time that `showLines === true`
|
|
459
|
-
if (newValue !== "none" && this.level !== 0) {
|
|
460
|
-
this.updateLastItemDashedLine();
|
|
461
|
-
}
|
|
462
|
-
}
|
|
463
|
-
componentWillLoad() {
|
|
464
|
-
// Set tree level
|
|
465
|
-
const parentElement = this.el.parentElement;
|
|
466
|
-
// Set item level
|
|
467
|
-
this.level = parentElement.level + 1;
|
|
468
|
-
// If the mainTreeRef is not defined, the first item that will load this
|
|
469
|
-
// reference will be the top tree-x-list
|
|
470
|
-
if (!mainTreeRef$1) {
|
|
471
|
-
mainTreeRef$1 = parentElement;
|
|
472
|
-
}
|
|
473
|
-
this.showLines = mainTreeRef$1.showLines;
|
|
474
551
|
}
|
|
475
552
|
render() {
|
|
476
|
-
return (index.h(index.Host, { role: this.level === 0 ? "tree" : "group" }, index.h("slot",
|
|
477
|
-
? this.updateLastItemDashedLine
|
|
478
|
-
: null, ref: el => (this.slotRef = el) })));
|
|
553
|
+
return (index.h(index.Host, { role: this.level === 0 ? "tree" : "group" }, index.h("slot", null)));
|
|
479
554
|
}
|
|
480
555
|
get el() { return index.getElement(this); }
|
|
481
|
-
static get watchers() { return {
|
|
482
|
-
"showLines": ["handleShowLinesChange"]
|
|
483
|
-
}; }
|
|
484
556
|
};
|
|
485
557
|
ChTreeListX.style = treeXListCss;
|
|
486
558
|
|
|
@@ -496,10 +568,6 @@ const LAST_SUB_ITEM = `:scope>*>${TREE_ITEM_TAG_NAME}:last-child`;
|
|
|
496
568
|
const EXPANDABLE_ID = "expandable";
|
|
497
569
|
const ENTER_KEY = "Enter";
|
|
498
570
|
const ESCAPE_KEY = "Escape";
|
|
499
|
-
/**
|
|
500
|
-
* This variable specifies a reference to the main ch-tree-x element
|
|
501
|
-
*/
|
|
502
|
-
let mainTreeRef;
|
|
503
571
|
const ChTreeXListItem = class {
|
|
504
572
|
constructor(hostRef) {
|
|
505
573
|
index.registerInstance(this, hostRef);
|
|
@@ -509,6 +577,7 @@ const ChTreeXListItem = class {
|
|
|
509
577
|
this.loadLazyContent = index.createEvent(this, "loadLazyContent", 7);
|
|
510
578
|
this.modifyCaption = index.createEvent(this, "modifyCaption", 7);
|
|
511
579
|
this.selectedItemChange = index.createEvent(this, "selectedItemChange", 7);
|
|
580
|
+
this.selectedItemSync = index.createEvent(this, "selectedItemSync", 7);
|
|
512
581
|
/**
|
|
513
582
|
* Useful to ignore the checkbox change when it was committed from a children.
|
|
514
583
|
*/
|
|
@@ -533,6 +602,16 @@ const ChTreeXListItem = class {
|
|
|
533
602
|
* (for example, click event).
|
|
534
603
|
*/
|
|
535
604
|
this.disabled = false;
|
|
605
|
+
/**
|
|
606
|
+
* This attribute lets you specify if the drag operation is disabled in the
|
|
607
|
+
* control. If `true`, the control can't be dragged.
|
|
608
|
+
*/
|
|
609
|
+
this.dragDisabled = false;
|
|
610
|
+
/**
|
|
611
|
+
* This attribute lets you specify if the drop operation is disabled in the
|
|
612
|
+
* control. If `true`, the control won't accept any drops.
|
|
613
|
+
*/
|
|
614
|
+
this.dropDisabled = false;
|
|
536
615
|
/**
|
|
537
616
|
* This property lets you define the current state of the item when it's
|
|
538
617
|
* being dragged.
|
|
@@ -643,17 +722,18 @@ const ChTreeXListItem = class {
|
|
|
643
722
|
this.expanded = !this.expanded;
|
|
644
723
|
}
|
|
645
724
|
this.selected = true;
|
|
646
|
-
this.selectedItemChange.emit(
|
|
647
|
-
ctrlKeyPressed: helpers.mouseEventModifierKey(event),
|
|
648
|
-
expanded: this.expanded,
|
|
649
|
-
goToReference: false,
|
|
650
|
-
id: this.el.id,
|
|
651
|
-
itemRef: this.el,
|
|
652
|
-
metadata: this.metadata,
|
|
653
|
-
parentId: this.el.parentElement.parentElement.id,
|
|
654
|
-
selected: true
|
|
655
|
-
});
|
|
725
|
+
this.selectedItemChange.emit(this.getSelectedInfo(helpers.mouseEventModifierKey(event), false, true));
|
|
656
726
|
};
|
|
727
|
+
this.getSelectedInfo = (ctrlKeyPressed, goToReference, selected) => ({
|
|
728
|
+
ctrlKeyPressed: ctrlKeyPressed,
|
|
729
|
+
expanded: this.expanded,
|
|
730
|
+
goToReference: goToReference,
|
|
731
|
+
id: this.el.id,
|
|
732
|
+
itemRef: this.el,
|
|
733
|
+
metadata: this.metadata,
|
|
734
|
+
parentId: this.el.parentElement.parentElement.id,
|
|
735
|
+
selected: selected
|
|
736
|
+
});
|
|
657
737
|
this.handleActionDblClick = (event) => {
|
|
658
738
|
event.stopPropagation();
|
|
659
739
|
if (helpers.mouseEventModifierKey(event)) {
|
|
@@ -705,6 +785,7 @@ const ChTreeXListItem = class {
|
|
|
705
785
|
// Disallow drag when editing the caption
|
|
706
786
|
if (this.editing) {
|
|
707
787
|
event.preventDefault();
|
|
788
|
+
event.stopPropagation();
|
|
708
789
|
return;
|
|
709
790
|
}
|
|
710
791
|
// Remove drag image
|
|
@@ -713,7 +794,7 @@ const ChTreeXListItem = class {
|
|
|
713
794
|
this.dragState = "start";
|
|
714
795
|
this.itemDragStart.emit({
|
|
715
796
|
elem: this.el,
|
|
716
|
-
|
|
797
|
+
dragEvent: event
|
|
717
798
|
});
|
|
718
799
|
};
|
|
719
800
|
this.handleDragEnd = () => {
|
|
@@ -763,6 +844,11 @@ const ChTreeXListItem = class {
|
|
|
763
844
|
this.disconnectObserver();
|
|
764
845
|
}
|
|
765
846
|
}
|
|
847
|
+
handleSelectedChange(newValue) {
|
|
848
|
+
this.selectedItemSync.emit(this.getSelectedInfo(true, // Does not matter in this case
|
|
849
|
+
false, // Does not matter in this case
|
|
850
|
+
newValue));
|
|
851
|
+
}
|
|
766
852
|
handleShowLinesChange(newShowLines) {
|
|
767
853
|
if (newShowLines && this.lastItem) {
|
|
768
854
|
this.setResizeObserver();
|
|
@@ -770,9 +856,6 @@ const ChTreeXListItem = class {
|
|
|
770
856
|
else {
|
|
771
857
|
this.disconnectObserver();
|
|
772
858
|
}
|
|
773
|
-
// @todo BUG: showLines does not update in the mainTreeRef, so we have to
|
|
774
|
-
// sync the ref with the new value
|
|
775
|
-
mainTreeRef.showLines = newShowLines;
|
|
776
859
|
}
|
|
777
860
|
updateCheckboxValue(event) {
|
|
778
861
|
// No need to update the checkbox value based on the children checkbox
|
|
@@ -920,29 +1003,11 @@ const ChTreeXListItem = class {
|
|
|
920
1003
|
toggleSelected() {
|
|
921
1004
|
const selected = !this.selected;
|
|
922
1005
|
this.selected = selected;
|
|
923
|
-
this.selectedItemChange.emit(
|
|
924
|
-
ctrlKeyPressed: true,
|
|
925
|
-
expanded: this.expanded,
|
|
926
|
-
goToReference: false,
|
|
927
|
-
id: this.el.id,
|
|
928
|
-
itemRef: this.el,
|
|
929
|
-
metadata: this.metadata,
|
|
930
|
-
parentId: this.el.parentElement.parentElement.id,
|
|
931
|
-
selected: selected
|
|
932
|
-
});
|
|
1006
|
+
this.selectedItemChange.emit(this.getSelectedInfo(true, false, selected));
|
|
933
1007
|
}
|
|
934
1008
|
setSelected(goToReference) {
|
|
935
1009
|
this.selected = true;
|
|
936
|
-
this.selectedItemChange.emit(
|
|
937
|
-
ctrlKeyPressed: false,
|
|
938
|
-
expanded: this.expanded,
|
|
939
|
-
goToReference: goToReference,
|
|
940
|
-
id: this.el.id,
|
|
941
|
-
itemRef: this.el,
|
|
942
|
-
metadata: this.metadata,
|
|
943
|
-
parentId: this.el.parentElement.parentElement.id,
|
|
944
|
-
selected: true
|
|
945
|
-
});
|
|
1010
|
+
this.selectedItemChange.emit(this.getSelectedInfo(false, goToReference, true));
|
|
946
1011
|
}
|
|
947
1012
|
toggleOrSelect(event) {
|
|
948
1013
|
if (helpers.mouseEventModifierKey(event)) {
|
|
@@ -954,14 +1019,12 @@ const ChTreeXListItem = class {
|
|
|
954
1019
|
}
|
|
955
1020
|
componentWillLoad() {
|
|
956
1021
|
const parentElement = this.el.parentElement;
|
|
957
|
-
// Set item level
|
|
958
|
-
this.level = parentElement.level;
|
|
959
|
-
if (!mainTreeRef) {
|
|
960
|
-
mainTreeRef = parentElement.parentElement;
|
|
961
|
-
}
|
|
962
|
-
this.showLines = mainTreeRef.showLines;
|
|
963
1022
|
// Check if must lazy load
|
|
964
1023
|
this.lazyLoadItems(this.expanded);
|
|
1024
|
+
// Sync selected state with the main tree
|
|
1025
|
+
if (this.selected) {
|
|
1026
|
+
this.selectedItemChange.emit(this.getSelectedInfo(true, false, true));
|
|
1027
|
+
}
|
|
965
1028
|
// No need to update more the status
|
|
966
1029
|
if (this.level === 0) {
|
|
967
1030
|
return;
|
|
@@ -988,7 +1051,7 @@ const ChTreeXListItem = class {
|
|
|
988
1051
|
const evenLevel = this.level % 2 === 0;
|
|
989
1052
|
const expandableButtonVisible = !this.leaf && this.showExpandableButton;
|
|
990
1053
|
const expandableButtonNotVisible = !this.leaf && !this.showExpandableButton;
|
|
991
|
-
const acceptDrop = !this.leaf && this.dragState !== "start";
|
|
1054
|
+
const acceptDrop = !this.dropDisabled && !this.leaf && this.dragState !== "start";
|
|
992
1055
|
const hasContent = !this.leaf && !this.lazyLoad;
|
|
993
1056
|
const showAllLines = this.showLines === "all" && this.level !== 0;
|
|
994
1057
|
const showLastLine = this.showLines === "last" && this.level !== 0 && this.lastItem;
|
|
@@ -1012,7 +1075,7 @@ const ChTreeXListItem = class {
|
|
|
1012
1075
|
"header--level-0": this.level === 0
|
|
1013
1076
|
}, part: `header${this.disabled ? " disabled" : ""}${this.selected ? " selected" : ""}`, type: "button", disabled: this.disabled, onClick: this.handleActionClick, onKeyDown: !this.editing ? this.handleActionKeyDown : null,
|
|
1014
1077
|
// Drag and drop
|
|
1015
|
-
draggable:
|
|
1078
|
+
draggable: !this.dragDisabled, onDragStart: this.handleDragStart, onDragEnd: !this.dragDisabled ? this.handleDragEnd : null, ref: el => (this.headerRef = el) }, !this.leaf && this.showExpandableButton && (index.h("button", { type: "button", class: {
|
|
1016
1079
|
"expandable-button": true,
|
|
1017
1080
|
"expandable-button--expanded": this.expanded,
|
|
1018
1081
|
"expandable-button--collapsed": !this.expanded
|
|
@@ -1035,11 +1098,13 @@ const ChTreeXListItem = class {
|
|
|
1035
1098
|
"editing": ["handleEditingChange"],
|
|
1036
1099
|
"expanded": ["handleExpandedChange"],
|
|
1037
1100
|
"lastItem": ["handleLasItemChange"],
|
|
1101
|
+
"selected": ["handleSelectedChange"],
|
|
1038
1102
|
"showLines": ["handleShowLinesChange"]
|
|
1039
1103
|
}; }
|
|
1040
1104
|
};
|
|
1041
1105
|
ChTreeXListItem.style = treeXListItemCss;
|
|
1042
1106
|
|
|
1107
|
+
exports.ch_checkbox = CheckBox;
|
|
1043
1108
|
exports.ch_tree_x = ChTreeX;
|
|
1044
1109
|
exports.ch_tree_x_list = ChTreeListX;
|
|
1045
1110
|
exports.ch_tree_x_list_item = ChTreeXListItem;
|