tree-element 0.3.2 → 0.4.1
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/README.md +23 -20
- package/lib/classNames.js +4 -4
- package/lib/classNames.js.map +1 -1
- package/lib/dataLoader.d.ts +0 -1
- package/lib/dataLoader.d.ts.map +1 -1
- package/lib/dataLoader.js +10 -7
- package/lib/dataLoader.js.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
- package/lib/dragAndDropHandler/generateHitAreas.js +3 -2
- package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
- package/lib/dragAndDropHandler/index.d.ts +2 -4
- package/lib/dragAndDropHandler/index.d.ts.map +1 -1
- package/lib/dragAndDropHandler/index.js +2 -9
- package/lib/dragAndDropHandler/index.js.map +1 -1
- package/lib/elementsRenderer.d.ts +11 -4
- package/lib/elementsRenderer.d.ts.map +1 -1
- package/lib/elementsRenderer.js +104 -43
- package/lib/elementsRenderer.js.map +1 -1
- package/lib/events.d.ts +13 -7
- package/lib/events.d.ts.map +1 -1
- package/lib/folderOpenState.d.ts +8 -0
- package/lib/folderOpenState.d.ts.map +1 -0
- package/lib/folderOpenState.js +22 -0
- package/lib/folderOpenState.js.map +1 -0
- package/lib/index.d.ts +27 -20
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +166 -65
- package/lib/index.js.map +1 -1
- package/lib/keyHandler.d.ts +16 -3
- package/lib/keyHandler.d.ts.map +1 -1
- package/lib/keyHandler.js +79 -32
- package/lib/keyHandler.js.map +1 -1
- package/lib/methodTypes.d.ts +3 -0
- package/lib/methodTypes.d.ts.map +1 -1
- package/lib/mouseHandler.d.ts.map +1 -1
- package/lib/mouseHandler.js +12 -12
- package/lib/mouseHandler.js.map +1 -1
- package/lib/node.d.ts +12 -10
- package/lib/node.d.ts.map +1 -1
- package/lib/node.js +12 -10
- package/lib/node.js.map +1 -1
- package/lib/nodeElement/folderElement.d.ts +7 -5
- package/lib/nodeElement/folderElement.d.ts.map +1 -1
- package/lib/nodeElement/folderElement.js +35 -55
- package/lib/nodeElement/folderElement.js.map +1 -1
- package/lib/nodeElement/index.d.ts +3 -2
- package/lib/nodeElement/index.d.ts.map +1 -1
- package/lib/nodeElement/index.js +15 -12
- package/lib/nodeElement/index.js.map +1 -1
- package/lib/options.d.ts +29 -14
- package/lib/options.d.ts.map +1 -1
- package/lib/options.js +12 -0
- package/lib/options.js.map +1 -0
- package/lib/saveStateHandler.d.ts.map +1 -1
- package/lib/saveStateHandler.js +6 -6
- package/lib/saveStateHandler.js.map +1 -1
- package/lib/selectNodeHandler.d.ts +3 -0
- package/lib/selectNodeHandler.d.ts.map +1 -1
- package/lib/selectNodeHandler.js +66 -22
- package/lib/selectNodeHandler.js.map +1 -1
- package/lib/setDefaultOptions.d.ts.map +1 -1
- package/lib/setDefaultOptions.js +1 -0
- package/lib/setDefaultOptions.js.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/lib/version.js.map +1 -1
- package/package.json +38 -32
- package/src/classNames.ts +4 -4
- package/src/dataLoader.ts +9 -10
- package/src/dragAndDropHandler/generateHitAreas.ts +3 -2
- package/src/dragAndDropHandler/index.ts +3 -17
- package/src/elementsRenderer.ts +124 -55
- package/src/events.ts +13 -7
- package/src/folderOpenState.ts +38 -0
- package/src/index.ts +191 -82
- package/src/keyHandler.ts +104 -34
- package/src/methodTypes.ts +6 -0
- package/src/mouseHandler.ts +15 -13
- package/src/node.ts +12 -10
- package/src/nodeElement/folderElement.ts +47 -72
- package/src/nodeElement/index.ts +20 -17
- package/src/options.ts +46 -14
- package/src/saveStateHandler.ts +5 -8
- package/src/selectNodeHandler.ts +69 -25
- package/src/setDefaultOptions.ts +1 -0
- package/src/version.ts +1 -1
- package/tree_element.css +48 -5
- package/tree_element.debug.js +540 -278
- package/tree_element.debug.js.map +1 -1
- package/tree_element.js +2 -2
- package/tree_element.js.map +1 -1
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { slideDown, slideUp } from '../animation.js';
|
|
2
|
+
import { setTogglerOpenState, setFolderLiOpenState } from '../folderOpenState.js';
|
|
2
3
|
import NodeElement from './index.js';
|
|
3
4
|
|
|
4
5
|
class FolderElement extends NodeElement {
|
|
5
6
|
constructor({
|
|
6
7
|
_classNames: classNames,
|
|
7
|
-
_closedIconElement: closedIconElement,
|
|
8
8
|
_getScrollLeft: getScrollLeft,
|
|
9
|
+
_icons: icons,
|
|
10
|
+
_multiSelect: multiSelect,
|
|
9
11
|
_node: node,
|
|
10
|
-
_openedIconElement: openedIconElement,
|
|
11
12
|
_renderChildren: renderChildren,
|
|
12
13
|
_tabIndex: tabIndex,
|
|
13
14
|
_treeElement: treeElement,
|
|
@@ -16,12 +17,12 @@ class FolderElement extends NodeElement {
|
|
|
16
17
|
super({
|
|
17
18
|
_classNames: classNames,
|
|
18
19
|
_getScrollLeft: getScrollLeft,
|
|
20
|
+
_multiSelect: multiSelect,
|
|
19
21
|
_node: node,
|
|
20
22
|
_tabIndex: tabIndex,
|
|
21
23
|
_treeElement: treeElement
|
|
22
24
|
});
|
|
23
|
-
this.
|
|
24
|
-
this._openedIconElement = openedIconElement;
|
|
25
|
+
this._icons = icons;
|
|
25
26
|
this._renderChildren = renderChildren;
|
|
26
27
|
this._triggerEvent = triggerEvent;
|
|
27
28
|
}
|
|
@@ -30,31 +31,11 @@ class FolderElement extends NodeElement {
|
|
|
30
31
|
return;
|
|
31
32
|
}
|
|
32
33
|
this._node.is_open = false;
|
|
33
|
-
if (
|
|
34
|
-
this.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
let button = this._getButton();
|
|
40
|
-
button.classList.add(this._classNames.closed);
|
|
41
|
-
button.replaceChildren();
|
|
42
|
-
let closedIconElement = this._closedIconElement;
|
|
43
|
-
if (closedIconElement) {
|
|
44
|
-
let icon = closedIconElement.cloneNode(true);
|
|
45
|
-
button.append(icon);
|
|
34
|
+
if (this._isRendered()) {
|
|
35
|
+
this._setButtonState(false);
|
|
36
|
+
await this._setUlState(this._getUl(), false, slide, animationSpeed);
|
|
37
|
+
this._setElementState(false);
|
|
46
38
|
}
|
|
47
|
-
let ul = this._getUl();
|
|
48
|
-
if (ul) {
|
|
49
|
-
if (slide) {
|
|
50
|
-
await slideUp(ul, animationSpeed);
|
|
51
|
-
} else {
|
|
52
|
-
ul.style.display = "none";
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
this._element.classList.add(this._classNames.closed);
|
|
56
|
-
let titleSpan = this._getTitleSpan();
|
|
57
|
-
titleSpan.setAttribute("aria-expanded", "false");
|
|
58
39
|
this._triggerEvent("tree.close", {
|
|
59
40
|
node: this._node
|
|
60
41
|
});
|
|
@@ -64,34 +45,17 @@ class FolderElement extends NodeElement {
|
|
|
64
45
|
return;
|
|
65
46
|
}
|
|
66
47
|
this._node.is_open = true;
|
|
67
|
-
if (!this._isRendered()) {
|
|
68
|
-
// The folder is rendered open when its parent is opened
|
|
69
|
-
this._triggerEvent("tree.open", {
|
|
70
|
-
node: this._node
|
|
71
|
-
});
|
|
72
|
-
return;
|
|
73
|
-
}
|
|
74
|
-
let button = this._getButton();
|
|
75
|
-
button.classList.remove(this._classNames.closed);
|
|
76
|
-
button.replaceChildren();
|
|
77
|
-
let openedIconElement = this._openedIconElement;
|
|
78
|
-
if (openedIconElement) {
|
|
79
|
-
let icon = openedIconElement.cloneNode(true);
|
|
80
|
-
button.append(icon);
|
|
81
|
-
}
|
|
82
48
|
|
|
83
|
-
//
|
|
84
|
-
|
|
85
|
-
if (
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
49
|
+
// A folder that is not rendered is rendered open when its parent is
|
|
50
|
+
// opened
|
|
51
|
+
if (this._isRendered()) {
|
|
52
|
+
this._setButtonState(true);
|
|
53
|
+
|
|
54
|
+
// The children are rendered the first time the folder is opened
|
|
55
|
+
let ul = this._getUl() ?? this._renderChildren(this._node);
|
|
56
|
+
await this._setUlState(ul, true, slide, animationSpeed);
|
|
57
|
+
this._setElementState(true);
|
|
91
58
|
}
|
|
92
|
-
this._element.classList.remove(this._classNames.closed);
|
|
93
|
-
let titleSpan = this._getTitleSpan();
|
|
94
|
-
titleSpan.setAttribute("aria-expanded", "true");
|
|
95
59
|
this._triggerEvent("tree.open", {
|
|
96
60
|
node: this._node
|
|
97
61
|
});
|
|
@@ -102,6 +66,22 @@ class FolderElement extends NodeElement {
|
|
|
102
66
|
_getButton() {
|
|
103
67
|
return this._element.querySelector(`:scope > .${this._classNames.element} > .${this._classNames.toggler}`);
|
|
104
68
|
}
|
|
69
|
+
_setButtonState(isOpen) {
|
|
70
|
+
setTogglerOpenState(this._getButton(), isOpen, this._classNames, this._icons);
|
|
71
|
+
}
|
|
72
|
+
_setElementState(isOpen) {
|
|
73
|
+
setFolderLiOpenState(this._element, isOpen, this._classNames);
|
|
74
|
+
}
|
|
75
|
+
async _setUlState(ul, isOpen, slide, animationSpeed) {
|
|
76
|
+
if (!ul) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (slide) {
|
|
80
|
+
await (isOpen ? slideDown : slideUp)(ul, animationSpeed);
|
|
81
|
+
} else {
|
|
82
|
+
ul.style.display = isOpen ? "block" : "none";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
105
85
|
}
|
|
106
86
|
|
|
107
87
|
export { FolderElement as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"folderElement.js","sources":["../../src/nodeElement/folderElement.ts"],"sourcesContent":["import type { AnimationSpeed } from \"../animation\";\nimport type { TriggerEvent } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\nimport type { NodeElementParams } from \"./index\";\n\nimport { slideDown, slideUp } from \"../animation\";\nimport NodeElement from \"./index\";\n\nexport type RenderChildren = (node: Node) => HTMLUListElement | null;\n\ninterface FolderElementParams extends NodeElementParams {\n
|
|
1
|
+
{"version":3,"file":"folderElement.js","sources":["../../src/nodeElement/folderElement.ts"],"sourcesContent":["import type { AnimationSpeed } from \"../animation\";\nimport type { FolderIcons } from \"../folderOpenState\";\nimport type { TriggerEvent } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\nimport type { NodeElementParams } from \"./index\";\n\nimport { slideDown, slideUp } from \"../animation\";\nimport { setFolderLiOpenState, setTogglerOpenState } from \"../folderOpenState\";\nimport NodeElement from \"./index\";\n\nexport type RenderChildren = (node: Node) => HTMLUListElement | null;\n\ninterface FolderElementParams extends NodeElementParams {\n icons: FolderIcons;\n renderChildren: RenderChildren;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private icons: FolderIcons;\n private renderChildren: RenderChildren;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n getScrollLeft,\n icons,\n multiSelect,\n node,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n classNames,\n getScrollLeft,\n multiSelect,\n node,\n tabIndex,\n treeElement,\n });\n\n this.icons = icons;\n this.renderChildren = renderChildren;\n this.triggerEvent = triggerEvent;\n }\n\n public async close(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (!this.node.is_open) {\n return;\n }\n\n this.node.is_open = false;\n\n if (this.isRendered()) {\n this.setButtonState(false);\n await this.setUlState(this.getUl(), false, slide, animationSpeed);\n this.setElementState(false);\n }\n\n this.triggerEvent(\"tree.close\", { node: this.node });\n }\n\n public async open(\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (this.node.is_open) {\n return;\n }\n\n this.node.is_open = true;\n\n // A folder that is not rendered is rendered open when its parent is\n // opened\n if (this.isRendered()) {\n this.setButtonState(true);\n\n // The children are rendered the first time the folder is opened\n const ul = this.getUl() ?? this.renderChildren(this.node);\n await this.setUlState(ul, true, slide, animationSpeed);\n\n this.setElementState(true);\n }\n\n this.triggerEvent(\"tree.open\", { node: this.node });\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return !this.node.is_open && position === \"inside\";\n }\n\n private getButton(): HTMLElement {\n return this.element.querySelector(\n `:scope > .${this.classNames.element} > .${this.classNames.toggler}`,\n ) as HTMLElement;\n }\n\n private setButtonState(isOpen: boolean): void {\n setTogglerOpenState(this.getButton(), isOpen, this.classNames, this.icons);\n }\n\n private setElementState(isOpen: boolean): void {\n setFolderLiOpenState(this.element, isOpen, this.classNames);\n }\n\n private async setUlState(\n ul: HTMLUListElement | null,\n isOpen: boolean,\n slide: boolean,\n animationSpeed: AnimationSpeed,\n ): Promise<void> {\n if (!ul) {\n return;\n }\n\n if (slide) {\n await (isOpen ? slideDown : slideUp)(ul, animationSpeed);\n } else {\n ul.style.display = isOpen ? \"block\" : \"none\";\n }\n }\n}\n\nexport default FolderElement;\n"],"names":["icons","renderChildren","triggerEvent","close","node","isRendered","setButtonState","setUlState","getUl","setElementState","open","mustShowBorderDropHint","getButton","element","classNames"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import type { Node, Position } from "../node.js";
|
|
|
5
5
|
export interface NodeElementParams {
|
|
6
6
|
classNames: ClassNames;
|
|
7
7
|
getScrollLeft: GetScrollLeft;
|
|
8
|
+
multiSelect?: boolean;
|
|
8
9
|
node: Node;
|
|
9
10
|
tabIndex?: number;
|
|
10
11
|
treeElement: HTMLElement;
|
|
@@ -14,13 +15,13 @@ declare class NodeElement {
|
|
|
14
15
|
node: Node;
|
|
15
16
|
protected classNames: ClassNames;
|
|
16
17
|
private getScrollLeft;
|
|
18
|
+
private multiSelect;
|
|
17
19
|
private tabIndex?;
|
|
18
20
|
private treeElement;
|
|
19
|
-
constructor({ classNames, getScrollLeft, node, tabIndex, treeElement, }: NodeElementParams);
|
|
21
|
+
constructor({ classNames, getScrollLeft, multiSelect, node, tabIndex, treeElement, }: NodeElementParams);
|
|
20
22
|
addDropHint(position: Position): DropHint;
|
|
21
23
|
deselect(): void;
|
|
22
24
|
select(mustSetFocus: boolean): void;
|
|
23
|
-
protected getTitleSpan(): HTMLSpanElement;
|
|
24
25
|
protected getUl(): HTMLUListElement | null;
|
|
25
26
|
protected isRendered(): boolean;
|
|
26
27
|
protected mustShowBorderDropHint(position: Position): boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nodeElement/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/nodeElement/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK9C,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,UAAU,CAAC;IACvB,aAAa,EAAE,aAAa,CAAC;IAI7B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,IAAI,EAAE,IAAI,CAAC;IACX,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,cAAM,WAAW;IACR,OAAO,EAAE,WAAW,CAAC;IACrB,IAAI,EAAE,IAAI,CAAC;IAClB,SAAS,CAAC,UAAU,EAAE,UAAU,CAAC;IACjC,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAU;IAC7B,OAAO,CAAC,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAErB,EACV,UAAU,EACV,aAAa,EACb,WAAmB,EACnB,IAAI,EACJ,QAAQ,EACR,WAAW,GACZ,EAAE,iBAAiB;IAYb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAMzC,QAAQ,IAAI,IAAI;IAuBhB,MAAM,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAoB1C,SAAS,CAAC,KAAK,IAAI,gBAAgB,GAAG,IAAI;IAO1C,SAAS,CAAC,UAAU,IAAI,OAAO;IAI/B,SAAS,CAAC,sBAAsB,CAAC,QAAQ,EAAE,QAAQ,GAAG,OAAO;CAG9D;AAED,eAAe,WAAW,CAAC"}
|
package/lib/nodeElement/index.js
CHANGED
|
@@ -5,12 +5,14 @@ class NodeElement {
|
|
|
5
5
|
constructor({
|
|
6
6
|
_classNames: classNames,
|
|
7
7
|
_getScrollLeft: getScrollLeft,
|
|
8
|
+
_multiSelect: multiSelect = false,
|
|
8
9
|
_node: node,
|
|
9
10
|
_tabIndex: tabIndex,
|
|
10
11
|
_treeElement: treeElement
|
|
11
12
|
}) {
|
|
12
13
|
this._classNames = classNames;
|
|
13
14
|
this._getScrollLeft = getScrollLeft;
|
|
15
|
+
this._multiSelect = multiSelect;
|
|
14
16
|
this._node = node;
|
|
15
17
|
this._tabIndex = tabIndex;
|
|
16
18
|
this._treeElement = treeElement;
|
|
@@ -26,35 +28,36 @@ class NodeElement {
|
|
|
26
28
|
return;
|
|
27
29
|
}
|
|
28
30
|
this._element.classList.remove(this._classNames.selected);
|
|
29
|
-
|
|
31
|
+
|
|
32
|
+
// Only a multiselect tree marks the nodes that are not selected
|
|
33
|
+
if (this._multiSelect) {
|
|
34
|
+
this._element.setAttribute("aria-selected", "false");
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
this._element.removeAttribute("aria-selected");
|
|
30
38
|
|
|
31
39
|
// Check for null or undefined
|
|
32
40
|
if (this._tabIndex != null) {
|
|
33
|
-
|
|
41
|
+
this._element.setAttribute("tabindex", "-1");
|
|
34
42
|
}
|
|
35
|
-
|
|
36
|
-
titleSpan.blur();
|
|
43
|
+
this._element.blur();
|
|
37
44
|
}
|
|
38
45
|
_select(mustSetFocus) {
|
|
39
46
|
if (!this._isRendered()) {
|
|
40
47
|
return;
|
|
41
48
|
}
|
|
42
49
|
this._element.classList.add(this._classNames.selected);
|
|
43
|
-
|
|
50
|
+
this._element.setAttribute("aria-selected", "true");
|
|
44
51
|
let tabIndex = this._tabIndex;
|
|
45
52
|
|
|
46
53
|
// Check for null or undefined
|
|
47
|
-
if (tabIndex != null) {
|
|
48
|
-
|
|
54
|
+
if (tabIndex != null && !this._multiSelect) {
|
|
55
|
+
this._element.setAttribute("tabindex", tabIndex.toString());
|
|
49
56
|
}
|
|
50
|
-
titleSpan.setAttribute("aria-selected", "true");
|
|
51
57
|
if (mustSetFocus) {
|
|
52
|
-
|
|
58
|
+
this._element.focus();
|
|
53
59
|
}
|
|
54
60
|
}
|
|
55
|
-
_getTitleSpan() {
|
|
56
|
-
return this._element.querySelector(`:scope > .${this._classNames.element} > span.${this._classNames.title}`);
|
|
57
|
-
}
|
|
58
61
|
_getUl() {
|
|
59
62
|
return this._element.querySelector(":scope > ul");
|
|
60
63
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../src/nodeElement/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type { DropHint } from \"../dragAndDropHandler/types\";\nimport type { GetScrollLeft } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\n\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nexport interface NodeElementParams {\n classNames: ClassNames;\n getScrollLeft: GetScrollLeft;\n node: Node;\n tabIndex?: number;\n treeElement: HTMLElement;\n}\n\nclass NodeElement {\n public element: HTMLElement;\n public node: Node;\n protected classNames: ClassNames;\n private getScrollLeft: GetScrollLeft;\n private tabIndex?: number;\n private treeElement: HTMLElement;\n\n constructor({\n classNames,\n getScrollLeft,\n node,\n tabIndex,\n treeElement,\n }: NodeElementParams) {\n this.classNames = classNames;\n this.getScrollLeft = getScrollLeft;\n this.node = node;\n this.tabIndex = tabIndex;\n this.treeElement = treeElement;\n\n // The root node has no element of its own; it uses the tree element.\n this.element = node.element ?? this.treeElement;\n }\n\n public addDropHint(position: Position): DropHint {\n return this.mustShowBorderDropHint(position)\n ? new BorderDropHint(this.element, this.getScrollLeft(), this.classNames)\n : new GhostDropHint(this.node, this.element, position, this.classNames);\n }\n\n public deselect(): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.remove(this.classNames.selected);\n\n
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../src/nodeElement/index.ts"],"sourcesContent":["import type { ClassNames } from \"../classNames\";\nimport type { DropHint } from \"../dragAndDropHandler/types\";\nimport type { GetScrollLeft } from \"../methodTypes\";\nimport type { Node, Position } from \"../node\";\n\nimport BorderDropHint from \"./borderDropHint\";\nimport GhostDropHint from \"./ghostDropHint\";\n\nexport interface NodeElementParams {\n classNames: ClassNames;\n getScrollLeft: GetScrollLeft;\n /* With multiSelect the focus moves independently of the selection, so\n * selecting doesn't change the tabindex or the focus.\n */\n multiSelect?: boolean;\n node: Node;\n tabIndex?: number;\n treeElement: HTMLElement;\n}\n\nclass NodeElement {\n public element: HTMLElement;\n public node: Node;\n protected classNames: ClassNames;\n private getScrollLeft: GetScrollLeft;\n private multiSelect: boolean;\n private tabIndex?: number;\n private treeElement: HTMLElement;\n\n constructor({\n classNames,\n getScrollLeft,\n multiSelect = false,\n node,\n tabIndex,\n treeElement,\n }: NodeElementParams) {\n this.classNames = classNames;\n this.getScrollLeft = getScrollLeft;\n this.multiSelect = multiSelect;\n this.node = node;\n this.tabIndex = tabIndex;\n this.treeElement = treeElement;\n\n // The root node has no element of its own; it uses the tree element.\n this.element = node.element ?? this.treeElement;\n }\n\n public addDropHint(position: Position): DropHint {\n return this.mustShowBorderDropHint(position)\n ? new BorderDropHint(this.element, this.getScrollLeft(), this.classNames)\n : new GhostDropHint(this.node, this.element, position, this.classNames);\n }\n\n public deselect(): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.remove(this.classNames.selected);\n\n // Only a multiselect tree marks the nodes that are not selected\n if (this.multiSelect) {\n this.element.setAttribute(\"aria-selected\", \"false\");\n return;\n }\n\n this.element.removeAttribute(\"aria-selected\");\n\n // Check for null or undefined\n if (this.tabIndex != null) {\n this.element.setAttribute(\"tabindex\", \"-1\");\n }\n\n this.element.blur();\n }\n\n public select(mustSetFocus: boolean): void {\n if (!this.isRendered()) {\n return;\n }\n\n this.element.classList.add(this.classNames.selected);\n this.element.setAttribute(\"aria-selected\", \"true\");\n\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null && !this.multiSelect) {\n this.element.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n if (mustSetFocus) {\n this.element.focus();\n }\n }\n\n protected getUl(): HTMLUListElement | null {\n return this.element.querySelector(\":scope > ul\");\n }\n\n /* A node inside a closed folder is not rendered. Its selected and open\n * state is applied when it is rendered.\n */\n protected isRendered(): boolean {\n return Boolean(this.node.element);\n }\n\n protected mustShowBorderDropHint(position: Position): boolean {\n return position === \"inside\";\n }\n}\n\nexport default NodeElement;\n"],"names":["classNames","getScrollLeft","multiSelect","node","tabIndex","treeElement","element","addDropHint","mustShowBorderDropHint","deselect","isRendered","select","getUl"],"mappings":"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"}
|
package/lib/options.d.ts
CHANGED
|
@@ -11,10 +11,15 @@ export type OnCreateLi = (node: Node, el: HTMLElement, isSelected: boolean) => v
|
|
|
11
11
|
export type OnGetStateFromStorage = (() => string) | undefined;
|
|
12
12
|
export type OnIsMoveHandle = (el: HTMLElement) => boolean;
|
|
13
13
|
export type OnSetStateFromStorage = ((data: string) => void) | undefined;
|
|
14
|
+
export declare const changeableOptions: readonly ["animationSpeed", "dataUrl", "dragAndDrop", "keyboardSupport", "multiSelect", "onCanSelectNode", "selectable", "slide", "startDndDelay", "tabIndex"];
|
|
15
|
+
/**
|
|
16
|
+
* The options that `setOption` can change.
|
|
17
|
+
*/
|
|
18
|
+
export type ChangeableOption = (typeof changeableOptions)[number];
|
|
14
19
|
export interface TreeElementOptions {
|
|
15
20
|
/**
|
|
16
|
-
* The duration of the slide animation: `"fast"` is
|
|
17
|
-
*
|
|
21
|
+
* The duration of the slide animation: `"fast"` is 200 milliseconds,
|
|
22
|
+
* `"slow"` is 600, and a number is milliseconds.
|
|
18
23
|
*
|
|
19
24
|
* @defaultValue `"fast"`, or `0` when the user prefers reduced motion
|
|
20
25
|
* (`prefers-reduced-motion: reduce`).
|
|
@@ -36,7 +41,7 @@ export interface TreeElementOptions {
|
|
|
36
41
|
*/
|
|
37
42
|
ariaLabelledBy?: string;
|
|
38
43
|
/**
|
|
39
|
-
* Escape node names. With `false`, names are inserted as
|
|
44
|
+
* Escape node names. With `false`, names are inserted as HTML—only do
|
|
40
45
|
* that for data you control.
|
|
41
46
|
*
|
|
42
47
|
* @defaultValue `true`
|
|
@@ -61,10 +66,10 @@ export interface TreeElementOptions {
|
|
|
61
66
|
*/
|
|
62
67
|
buttonLeft: boolean;
|
|
63
68
|
/**
|
|
64
|
-
* The prefix of the
|
|
69
|
+
* The prefix of the CSS classes the widget puts on the elements it
|
|
65
70
|
* creates: with `"my-tree"` a title gets `my-tree-title` instead of
|
|
66
|
-
* `tree-element-title`. The bundled
|
|
67
|
-
* change it only if you bring your own
|
|
71
|
+
* `tree-element-title`. The bundled style sheet uses the default prefix,
|
|
72
|
+
* so change it only if you bring your own CSS. See
|
|
68
73
|
* [Styling](/guide/styling#changing-the-class-names).
|
|
69
74
|
*
|
|
70
75
|
* @defaultValue `"tree-element"`
|
|
@@ -72,12 +77,12 @@ export interface TreeElementOptions {
|
|
|
72
77
|
*/
|
|
73
78
|
classPrefix: string;
|
|
74
79
|
/**
|
|
75
|
-
* The icon of a closed folder. A string is inserted as
|
|
76
|
-
* cloned for every node.
|
|
80
|
+
* The icon of a closed folder. A string is inserted as HTML, and an element
|
|
81
|
+
* is cloned for every node.
|
|
77
82
|
*
|
|
78
83
|
* Type: `HTMLElement | string`
|
|
79
84
|
*
|
|
80
|
-
* @defaultValue An
|
|
85
|
+
* @defaultValue An SVG triangle pointing right, or left when `rtl` is
|
|
81
86
|
* true. It is sized in em and filled with `currentColor`.
|
|
82
87
|
* @group Appearance
|
|
83
88
|
*/
|
|
@@ -105,7 +110,7 @@ export interface TreeElementOptions {
|
|
|
105
110
|
*/
|
|
106
111
|
dataFilter?: DataFilter;
|
|
107
112
|
/**
|
|
108
|
-
* A
|
|
113
|
+
* A URL to fetch the data from, or a function that returns one. The
|
|
109
114
|
* function is called with the node that is being loaded, and without an
|
|
110
115
|
* argument for the initial load. See
|
|
111
116
|
* [Loading on demand](/guide/loading-on-demand).
|
|
@@ -131,6 +136,16 @@ export interface TreeElementOptions {
|
|
|
131
136
|
* @group Selection
|
|
132
137
|
*/
|
|
133
138
|
keyboardSupport: boolean;
|
|
139
|
+
/**
|
|
140
|
+
* Let the user select multiple nodes: a click adds a node to the
|
|
141
|
+
* selection, or removes it when it is selected. The arrow keys move the
|
|
142
|
+
* focus instead of the selection, and `Space` adds the focused node or
|
|
143
|
+
* removes it. See [Selection](/guide/selection#multiple-nodes).
|
|
144
|
+
*
|
|
145
|
+
* @defaultValue `false`
|
|
146
|
+
* @group Selection
|
|
147
|
+
*/
|
|
148
|
+
multiSelect: boolean;
|
|
134
149
|
/**
|
|
135
150
|
* The class used to create nodes. Subclass [`Node`](/reference/node) to
|
|
136
151
|
* add your own methods. The `Node` class is not exposed on the global
|
|
@@ -207,7 +222,7 @@ export interface TreeElementOptions {
|
|
|
207
222
|
*/
|
|
208
223
|
onDragStop?: DragMethod;
|
|
209
224
|
/**
|
|
210
|
-
* Read the saved state, as a
|
|
225
|
+
* Read the saved state, as a JSON string, from somewhere other than
|
|
211
226
|
* `localStorage`.
|
|
212
227
|
*
|
|
213
228
|
* Type: `() => string`
|
|
@@ -225,7 +240,7 @@ export interface TreeElementOptions {
|
|
|
225
240
|
*/
|
|
226
241
|
onIsMoveHandle?: OnIsMoveHandle;
|
|
227
242
|
/**
|
|
228
|
-
* Write the state, as a
|
|
243
|
+
* Write the state, as a JSON string, to somewhere other than
|
|
229
244
|
* `localStorage`.
|
|
230
245
|
*
|
|
231
246
|
* Type: `(state: string) => void`
|
|
@@ -238,7 +253,7 @@ export interface TreeElementOptions {
|
|
|
238
253
|
*
|
|
239
254
|
* Type: `HTMLElement | string`
|
|
240
255
|
*
|
|
241
|
-
* @defaultValue An
|
|
256
|
+
* @defaultValue An SVG triangle pointing down, sized in em and filled with
|
|
242
257
|
* `currentColor`.
|
|
243
258
|
* @group Appearance
|
|
244
259
|
*/
|
|
@@ -260,7 +275,7 @@ export interface TreeElementOptions {
|
|
|
260
275
|
rtl?: boolean;
|
|
261
276
|
/**
|
|
262
277
|
* Remember the open and selected nodes in `localStorage`. A string is used
|
|
263
|
-
* as the storage key
|
|
278
|
+
* as the storage key, and `true` uses `tree`. See
|
|
264
279
|
* [Saving state](/guide/saving-state).
|
|
265
280
|
*
|
|
266
281
|
* @defaultValue `false`
|
package/lib/options.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAE7C,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,OAAO,KAAK,QAAQ,EAAE,CAAC;AAEvD,MAAM,MAAM,OAAO,GAAG,eAAe,GAAG,MAAM,CAAC;AAE/C,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC;AAEpE,MAAM,MAAM,WAAW,GAAG,WAAW,GAAG,MAAM,CAAC;AAE/C,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC,GAAG,SAAS,CAAC;AAE9D,MAAM,MAAM,WAAW,GAAG,CACxB,IAAI,EAAE,IAAI,EACV,UAAU,EAAE,IAAI,EAChB,YAAY,EAAE,MAAM,KACjB,OAAO,CAAC;AAEb,MAAM,MAAM,eAAe,GAAG,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;AAEtD,MAAM,MAAM,UAAU,GAAG,CACvB,IAAI,EAAE,IAAI,EACV,EAAE,EAAE,WAAW,EACf,UAAU,EAAE,OAAO,KAChB,IAAI,CAAC;AAEV,MAAM,MAAM,qBAAqB,GAAG,CAAC,MAAM,MAAM,CAAC,GAAG,SAAS,CAAC;AAE/D,MAAM,MAAM,cAAc,GAAG,CAAC,EAAE,EAAE,WAAW,KAAK,OAAO,CAAC;AAE1D,MAAM,MAAM,qBAAqB,GAAG,CAAC,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
|
package/lib/options.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/* The options that setOption can change. The others are read once, in the
|
|
2
|
+
* constructor, so changing them later would have no effect or leave the tree
|
|
3
|
+
* in an inconsistent state.
|
|
4
|
+
*/
|
|
5
|
+
let changeableOptions = ["animationSpeed", "dataUrl", "dragAndDrop", "keyboardSupport", "multiSelect", "onCanSelectNode", "selectable", "slide", "startDndDelay", "tabIndex"];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* The options that `setOption` can change.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
export { changeableOptions };
|
|
12
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sources":["../src/options.ts"],"sourcesContent":["import type { AnimationSpeed } from \"./animation\";\nimport type { Node, NodeData } from \"./node\";\n\nexport type DataFilter = (data: unknown) => NodeData[];\n\nexport type DataUrl = DataUrlFunction | string;\n\nexport type DragMethod = (node: Node, event: Event | Touch) => void;\n\nexport type IconElement = HTMLElement | string;\n\nexport type OnCanMove = ((node: Node) => boolean) | undefined;\n\nexport type OnCanMoveTo = (\n node: Node,\n targetNode: Node,\n positionName: string,\n) => boolean;\n\nexport type OnCanSelectNode = (node: Node) => boolean;\n\nexport type OnCreateLi = (\n node: Node,\n el: HTMLElement,\n isSelected: boolean,\n) => void;\n\nexport type OnGetStateFromStorage = (() => string) | undefined;\n\nexport type OnIsMoveHandle = (el: HTMLElement) => boolean;\n\nexport type OnSetStateFromStorage = ((data: string) => void) | undefined;\n\n/* The options that setOption can change. The others are read once, in the\n * constructor, so changing them later would have no effect or leave the tree\n * in an inconsistent state.\n */\nexport const changeableOptions = [\n \"animationSpeed\",\n \"dataUrl\",\n \"dragAndDrop\",\n \"keyboardSupport\",\n \"multiSelect\",\n \"onCanSelectNode\",\n \"selectable\",\n \"slide\",\n \"startDndDelay\",\n \"tabIndex\",\n] as const;\n\n/**\n * The options that `setOption` can change.\n */\nexport type ChangeableOption = (typeof changeableOptions)[number];\n\nexport interface TreeElementOptions {\n /**\n * The duration of the slide animation: `\"fast\"` is 200 milliseconds,\n * `\"slow\"` is 600, and a number is milliseconds.\n *\n * @defaultValue `\"fast\"`, or `0` when the user prefers reduced motion\n * (`prefers-reduced-motion: reduce`).\n * @group Appearance\n */\n animationSpeed: AnimationSpeed;\n /**\n * The accessible name of the tree, set as `aria-label` on the root `ul`.\n * Use `ariaLabelledBy` instead when the name is visible on the page.\n *\n * @group Appearance\n */\n ariaLabel?: string;\n /**\n * The id of the element that names the tree, set as `aria-labelledby` on\n * the root `ul`.\n *\n * @group Appearance\n */\n ariaLabelledBy?: string;\n /**\n * Escape node names. With `false`, names are inserted as HTML—only do\n * that for data you control.\n *\n * @defaultValue `true`\n * @group Data\n */\n autoEscape: boolean;\n /**\n * Which levels are open initially: `false` none, `true` all, a number that\n * many levels starting at `0` (so `0` opens the top level, `1` the first\n * two levels).\n *\n * @defaultValue `false`\n * @group Appearance\n */\n autoOpen: boolean | number;\n /**\n * Put the open/close button before the node title. With `false` it goes\n * after it.\n *\n * @defaultValue `true`\n * @group Appearance\n */\n buttonLeft: boolean;\n /**\n * The prefix of the CSS classes the widget puts on the elements it\n * creates: with `\"my-tree\"` a title gets `my-tree-title` instead of\n * `tree-element-title`. The bundled style sheet uses the default prefix,\n * so change it only if you bring your own CSS. See\n * [Styling](/guide/styling#changing-the-class-names).\n *\n * @defaultValue `\"tree-element\"`\n * @group Appearance\n */\n classPrefix: string;\n /**\n * The icon of a closed folder. A string is inserted as HTML, and an element\n * is cloned for every node.\n *\n * Type: `HTMLElement | string`\n *\n * @defaultValue An SVG triangle pointing right, or left when `rtl` is\n * true. It is sized in em and filled with `currentColor`.\n * @group Appearance\n */\n closedIcon?: IconElement;\n /**\n * The class that every element of the widget gets.\n *\n * @defaultValue `\"<classPrefix>-common\"`\n * @group Appearance\n */\n commonClassName?: string;\n /**\n * The nodes of the tree. See [Data](/guide/data) for the format.\n *\n * @group Data\n */\n data?: NodeData[];\n /**\n * Transforms a response from `dataUrl` into node data. Use it when the\n * server wraps the nodes in another object.\n *\n * Type: `(data: unknown) => NodeData[]`\n *\n * @group Data\n */\n dataFilter?: DataFilter;\n /**\n * A URL to fetch the data from, or a function that returns one. The\n * function is called with the node that is being loaded, and without an\n * argument for the initial load. See\n * [Loading on demand](/guide/loading-on-demand).\n *\n * Type: `string | ((node?: Node) => string)`\n *\n * @defaultValue The element's `data-url` attribute.\n * @group Data\n */\n dataUrl?: DataUrl;\n /**\n * Let the user move nodes by dragging them.\n *\n * @defaultValue `false`\n * @group Drag and drop\n */\n dragAndDrop: boolean;\n /**\n * Handle the keyboard when the focus is on the tree. See\n * [Selection](/guide/selection#keyboard-navigation).\n *\n * @defaultValue `true`\n * @group Selection\n */\n keyboardSupport: boolean;\n /**\n * Let the user select multiple nodes: a click adds a node to the\n * selection, or removes it when it is selected. The arrow keys move the\n * focus instead of the selection, and `Space` adds the focused node or\n * removes it. See [Selection](/guide/selection#multiple-nodes).\n *\n * @defaultValue `false`\n * @group Selection\n */\n multiSelect: boolean;\n /**\n * The class used to create nodes. Subclass [`Node`](/reference/node) to\n * add your own methods. The `Node` class is not exposed on the global\n * `TreeElement`, so this option needs the `lib` build.\n *\n * @example\n * ```js\n * import TreeElement from \"tree-element/lib/index.js\";\n * import { Node } from \"tree-element/lib/node.js\";\n *\n * class MyNode extends Node {\n * fullName() {\n * return this.getParent()\n * ? `${this.getParent().name}/${this.name}`\n * : this.name;\n * }\n * }\n *\n * new TreeElement({ data, htmlElement, nodeClass: MyNode });\n * ```\n *\n * @defaultValue `Node`\n * @group Advanced\n */\n nodeClass: typeof Node;\n /**\n * Called before a drag starts. Return `false` to keep the node in place.\n *\n * Type: `(node: Node) => boolean`\n *\n * @group Drag and drop\n */\n onCanMove?: OnCanMove;\n /**\n * Called for a possible drop. `position` is `\"before\"`, `\"after\"` or\n * `\"inside\"`. Return `false` to refuse the drop.\n *\n * Type: `(movedNode: Node, targetNode: Node, position: string) => boolean`\n *\n * @group Drag and drop\n */\n onCanMoveTo?: OnCanMoveTo;\n /**\n * Called before a node is selected. Return `false` to refuse.\n *\n * Type: `(node: Node) => boolean`\n *\n * @group Selection\n */\n onCanSelectNode?: OnCanSelectNode;\n /**\n * Called after the `li` of a node is created, so you can add to it. See\n * [Styling](/guide/styling#customizing-the-markup).\n *\n * Type: `(node: Node, li: HTMLElement, isSelected: boolean) => void`\n *\n * @group Appearance\n */\n onCreateLi?: OnCreateLi;\n /**\n * Called while a node is being dragged.\n *\n * Type: `(node: Node, event: Event | Touch) => void`\n *\n * @group Drag and drop\n */\n onDragMove?: DragMethod;\n /**\n * Called when a drag ends.\n *\n * Type: `(node: Node, event: Event | Touch) => void`\n *\n * @group Drag and drop\n */\n onDragStop?: DragMethod;\n /**\n * Read the saved state, as a JSON string, from somewhere other than\n * `localStorage`.\n *\n * Type: `() => string`\n *\n * @group State\n */\n onGetStateFromStorage?: OnGetStateFromStorage;\n /**\n * Decides whether an element inside a node starts a drag. Without it, the\n * whole node is a handle.\n *\n * Type: `(element: HTMLElement) => boolean`\n *\n * @group Drag and drop\n */\n onIsMoveHandle?: OnIsMoveHandle;\n /**\n * Write the state, as a JSON string, to somewhere other than\n * `localStorage`.\n *\n * Type: `(state: string) => void`\n *\n * @group State\n */\n onSetStateFromStorage?: OnSetStateFromStorage;\n /**\n * The icon of an open folder.\n *\n * Type: `HTMLElement | string`\n *\n * @defaultValue An SVG triangle pointing down, sized in em and filled with\n * `currentColor`.\n * @group Appearance\n */\n openedIcon?: IconElement;\n /**\n * How long, in milliseconds, a closed folder has to be hovered during a\n * drag before it opens. `false` never opens folders while dragging.\n *\n * @defaultValue `500`\n * @group Drag and drop\n */\n openFolderDelay: false | number;\n /**\n * Mirror the tree for right-to-left languages.\n *\n * @defaultValue The element's `data-rtl` attribute, otherwise `false`.\n * @group Appearance\n */\n rtl?: boolean;\n /**\n * Remember the open and selected nodes in `localStorage`. A string is used\n * as the storage key, and `true` uses `tree`. See\n * [Saving state](/guide/saving-state).\n *\n * @defaultValue `false`\n * @group State\n */\n saveState: boolean | string;\n /**\n * Allow the user to select nodes.\n *\n * @defaultValue `true`\n * @group Selection\n */\n selectable: boolean;\n /**\n * Render a node with `children: []` as a folder instead of as a leaf.\n *\n * @defaultValue `false`\n * @group Appearance\n */\n showEmptyFolder: boolean;\n /**\n * Animate opening and closing folders.\n *\n * @defaultValue `true`\n * @group Appearance\n */\n slide: boolean;\n /**\n * How long, in milliseconds, the mouse has to be held down on a node\n * before a drag starts.\n *\n * @defaultValue `300`\n * @group Drag and drop\n */\n startDndDelay?: number;\n /**\n * The `tabindex` of the selected node's title, which is what makes the\n * tree focusable. When no node is selected, the first node gets it. The\n * other nodes get `-1`.\n *\n * @defaultValue `0`\n * @group Selection\n */\n tabIndex?: number;\n /**\n * The class of the root `ul`.\n *\n * @defaultValue The value of `classPrefix`.\n * @group Appearance\n */\n treeClassName?: string;\n /**\n * Handle right clicks on a node: the browser menu is suppressed and\n * [`tree.contextmenu`](/reference/events#tree-contextmenu) is dispatched\n * instead.\n *\n * @defaultValue `true`\n * @group Selection\n */\n useContextMenu: boolean;\n}\n\ntype DataUrlFunction = (node?: Node) => string;\n"],"names":[],"mappings":"AAiCA;AACA;AACA;AACA;AACO,IAAM,iBAAiB,GAAG,CAC/B,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,iBAAiB,EACjB,aAAa,EACb,iBAAiB,EACjB,YAAY,EACZ,OAAO,EACP,eAAe,EACf,UAAU;;AAGZ;AACA;AACA;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveStateHandler.d.ts","sourceRoot":"","sources":["../src/saveStateHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,eAAe,EACf,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAI9E,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,sBAAsB;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,eAAe,CAAmB;gBAE9B,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,SAAS,GACV,EAAE,sBAAsB;IAalB,qBAAqB,IAAI,MAAM,GAAG,IAAI;
|
|
1
|
+
{"version":3,"file":"saveStateHandler.d.ts","sourceRoot":"","sources":["../src/saveStateHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,QAAQ,EACR,eAAe,EACf,mBAAmB,EACpB,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAQ,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;AAI9E,MAAM,WAAW,UAAU;IACzB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC1B;AAED,UAAU,sBAAsB;IAC9B,cAAc,EAAE,cAAc,CAAC;IAC/B,WAAW,EAAE,WAAW,CAAC;IACzB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,qBAAqB,CAAC,EAAE,qBAAqB,CAAC;IAC9C,QAAQ,EAAE,QAAQ,CAAC;IACnB,eAAe,EAAE,eAAe,CAAC;IACjC,mBAAmB,EAAE,mBAAmB,CAAC;IACzC,SAAS,EAAE,OAAO,GAAG,MAAM,CAAC;CAC7B;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,gBAAgB,CAAmB;IAC3C,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,qBAAqB,CAAC,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,eAAe,CAAkB;IACzC,OAAO,CAAC,mBAAmB,CAAsB;IACjD,OAAO,CAAC,eAAe,CAAmB;gBAE9B,EACV,cAAc,EACd,WAAW,EACX,gBAAgB,EAChB,OAAO,EACP,qBAAqB,EACrB,qBAAqB,EACrB,QAAQ,EACR,eAAe,EACf,mBAAmB,EACnB,SAAS,GACV,EAAE,sBAAsB;IAalB,qBAAqB,IAAI,MAAM,GAAG,IAAI;IAOtC,QAAQ,IAAI,UAAU;IAgCtB,mBAAmB,IAAI,IAAI,GAAG,UAAU;IAUxC,SAAS,IAAI,IAAI;IAoBjB,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAcrC,uBAAuB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAyCtE,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,UAAU;IAYlB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,kBAAkB;CAgB3B"}
|
package/lib/saveStateHandler.js
CHANGED
|
@@ -25,9 +25,7 @@ class SaveStateHandler {
|
|
|
25
25
|
this._saveStateOption = saveState;
|
|
26
26
|
}
|
|
27
27
|
_getNodeIdToBeSelected() {
|
|
28
|
-
|
|
29
|
-
return null;
|
|
30
|
-
}
|
|
28
|
+
// Without the saveState option there is no state
|
|
31
29
|
let state = this._getStateFromStorage();
|
|
32
30
|
return state?.selected_node ? state.selected_node[0] ?? null : null;
|
|
33
31
|
}
|
|
@@ -156,17 +154,19 @@ class SaveStateHandler {
|
|
|
156
154
|
this._removeFromSelection(node);
|
|
157
155
|
}
|
|
158
156
|
}
|
|
157
|
+
|
|
158
|
+
// result: is a node selected?
|
|
159
159
|
_selectInitialNodes(nodeIds) {
|
|
160
|
-
let
|
|
160
|
+
let isNodeSelected = false;
|
|
161
161
|
for (let nodeId of nodeIds) {
|
|
162
162
|
let node = this._getNodeById(nodeId);
|
|
163
163
|
if (!node) {
|
|
164
164
|
continue;
|
|
165
165
|
}
|
|
166
|
-
selectCount += 1;
|
|
167
166
|
this._addToSelection(node);
|
|
167
|
+
isNodeSelected = true;
|
|
168
168
|
}
|
|
169
|
-
return
|
|
169
|
+
return isNodeSelected;
|
|
170
170
|
}
|
|
171
171
|
}
|
|
172
172
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"saveStateHandler.js","sources":["../src/saveStateHandler.ts"],"sourcesContent":["import type {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./methodTypes\";\nimport type { Node, NodeId } from \"./node\";\nimport type { OnGetStateFromStorage, OnSetStateFromStorage } from \"./options\";\n\nimport { isInt } from \"./util\";\n\nexport interface SavedState {\n open_nodes?: NodeId[];\n selected_node?: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n if (!this.saveStateOption) {\n return null;\n }\n\n const state = this.getStateFromStorage();\n\n return state?.selected_node ? (state.selected_node[0] ?? null) : null;\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n for (const node of this.getSelectedNodes()) {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n }\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n public getStateFromStorage(): null | SavedState {\n if (!this.saveStateOption) {\n return null;\n }\n\n const jsonData = this.loadFromStorage();\n\n return jsonData ? this.parseState(jsonData) : null;\n }\n\n public saveState(): void {\n if (!this.saveStateOption) {\n return;\n }\n\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand (boolean)\n */\n public setInitialState(state: SavedState): boolean {\n const mustLoadOnDemand = state.open_nodes\n ? this.openInitialNodes(state.open_nodes)\n : false;\n\n this.resetSelection();\n\n if (state.selected_node) {\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n\n public async setInitialStateOnDemand(state: SavedState): Promise<void> {\n let nodeIds = state.open_nodes;\n\n const openNodes = async () => {\n if (!nodeIds) {\n return;\n }\n\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n await loadAndOpenNode(node);\n } else {\n await this.openNode(node, false);\n }\n }\n } else {\n newNodesIds.push(nodeId);\n }\n }\n\n nodeIds = newNodesIds;\n\n if (state.selected_node && this.selectInitialNodes(state.selected_node)) {\n this.refreshElements(null);\n }\n };\n\n const loadAndOpenNode = async (node: Node) => {\n await this.openNode(node, false);\n await openNodes();\n };\n\n await openNodes();\n }\n\n private getKeyName(): string {\n return typeof this.saveStateOption === \"string\"\n ? this.saveStateOption\n : \"tree\";\n }\n\n private loadFromStorage(): null | string {\n return this.onGetStateFromStorage\n ? this.onGetStateFromStorage()\n : localStorage.getItem(this.getKeyName());\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n } else {\n node.is_open = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record<string, unknown>;\n\n // Check if selected_node is an int (instead of an array)\n if (state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n for (const node of selectedNodes) {\n this.removeFromSelection(node);\n }\n }\n\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let selectCount = 0;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n continue;\n }\n\n selectCount += 1;\n\n this.addToSelection(node);\n }\n\n return selectCount !== 0;\n }\n}\n"],"names":["addToSelection","getNodeById","getSelectedNodes","getTree","onGetStateFromStorage","onSetStateFromStorage","openNode","refreshElements","removeFromSelection","saveStateOption","getNodeIdToBeSelected","getStateFromStorage","getState","loadFromStorage","parseState","saveState","getKeyName","setInitialState","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"saveStateHandler.js","sources":["../src/saveStateHandler.ts"],"sourcesContent":["import type {\n AddToSelection,\n GetNodeById,\n GetSelectedNodes,\n GetTree,\n OpenNode,\n RefreshElements,\n RemoveFromSelection,\n} from \"./methodTypes\";\nimport type { Node, NodeId } from \"./node\";\nimport type { OnGetStateFromStorage, OnSetStateFromStorage } from \"./options\";\n\nimport { isInt } from \"./util\";\n\nexport interface SavedState {\n open_nodes?: NodeId[];\n selected_node?: NodeId[];\n}\n\ninterface SaveStateHandlerParams {\n addToSelection: AddToSelection;\n getNodeById: GetNodeById;\n getSelectedNodes: GetSelectedNodes;\n getTree: GetTree;\n onGetStateFromStorage?: OnGetStateFromStorage;\n onSetStateFromStorage?: OnSetStateFromStorage;\n openNode: OpenNode;\n refreshElements: RefreshElements;\n removeFromSelection: RemoveFromSelection;\n saveState: boolean | string;\n}\n\nexport default class SaveStateHandler {\n private addToSelection: AddToSelection;\n private getNodeById: GetNodeById;\n private getSelectedNodes: GetSelectedNodes;\n private getTree: GetTree;\n private onGetStateFromStorage?: OnGetStateFromStorage;\n private onSetStateFromStorage?: OnSetStateFromStorage;\n private openNode: OpenNode;\n private refreshElements: RefreshElements;\n private removeFromSelection: RemoveFromSelection;\n private saveStateOption: boolean | string;\n\n constructor({\n addToSelection,\n getNodeById,\n getSelectedNodes,\n getTree,\n onGetStateFromStorage,\n onSetStateFromStorage,\n openNode,\n refreshElements,\n removeFromSelection,\n saveState,\n }: SaveStateHandlerParams) {\n this.addToSelection = addToSelection;\n this.getNodeById = getNodeById;\n this.getSelectedNodes = getSelectedNodes;\n this.getTree = getTree;\n this.onGetStateFromStorage = onGetStateFromStorage;\n this.onSetStateFromStorage = onSetStateFromStorage;\n this.openNode = openNode;\n this.refreshElements = refreshElements;\n this.removeFromSelection = removeFromSelection;\n this.saveStateOption = saveState;\n }\n\n public getNodeIdToBeSelected(): NodeId | null {\n // Without the saveState option there is no state\n const state = this.getStateFromStorage();\n\n return state?.selected_node ? (state.selected_node[0] ?? null) : null;\n }\n\n public getState(): SavedState {\n const getOpenNodeIds = (): NodeId[] => {\n const openNodes: NodeId[] = [];\n\n this.getTree()?.iterate((node: Node) => {\n if (node.is_open && node.id && node.hasChildren()) {\n openNodes.push(node.id);\n }\n return true;\n });\n\n return openNodes;\n };\n\n const getSelectedNodeIds = (): NodeId[] => {\n const selectedNodeIds: NodeId[] = [];\n\n for (const node of this.getSelectedNodes()) {\n if (node.id != null) {\n selectedNodeIds.push(node.id);\n }\n }\n\n return selectedNodeIds;\n };\n\n return {\n open_nodes: getOpenNodeIds(),\n selected_node: getSelectedNodeIds(),\n };\n }\n\n public getStateFromStorage(): null | SavedState {\n if (!this.saveStateOption) {\n return null;\n }\n\n const jsonData = this.loadFromStorage();\n\n return jsonData ? this.parseState(jsonData) : null;\n }\n\n public saveState(): void {\n if (!this.saveStateOption) {\n return;\n }\n\n const state = JSON.stringify(this.getState());\n\n if (this.onSetStateFromStorage) {\n this.onSetStateFromStorage(state);\n } else {\n localStorage.setItem(this.getKeyName(), state);\n }\n }\n\n /*\n Set initial state\n Don't handle nodes that are loaded on demand\n\n result: must load on demand (boolean)\n */\n public setInitialState(state: SavedState): boolean {\n const mustLoadOnDemand = state.open_nodes\n ? this.openInitialNodes(state.open_nodes)\n : false;\n\n this.resetSelection();\n\n if (state.selected_node) {\n this.selectInitialNodes(state.selected_node);\n }\n\n return mustLoadOnDemand;\n }\n\n public async setInitialStateOnDemand(state: SavedState): Promise<void> {\n let nodeIds = state.open_nodes;\n\n const openNodes = async () => {\n if (!nodeIds) {\n return;\n }\n\n const newNodesIds = [];\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (!node.is_loading) {\n if (node.load_on_demand) {\n await loadAndOpenNode(node);\n } else {\n await this.openNode(node, false);\n }\n }\n } else {\n newNodesIds.push(nodeId);\n }\n }\n\n nodeIds = newNodesIds;\n\n if (state.selected_node && this.selectInitialNodes(state.selected_node)) {\n this.refreshElements(null);\n }\n };\n\n const loadAndOpenNode = async (node: Node) => {\n await this.openNode(node, false);\n await openNodes();\n };\n\n await openNodes();\n }\n\n private getKeyName(): string {\n return typeof this.saveStateOption === \"string\"\n ? this.saveStateOption\n : \"tree\";\n }\n\n private loadFromStorage(): null | string {\n return this.onGetStateFromStorage\n ? this.onGetStateFromStorage()\n : localStorage.getItem(this.getKeyName());\n }\n\n private openInitialNodes(nodeIds: NodeId[]): boolean {\n let mustLoadOnDemand = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (node) {\n if (node.load_on_demand) {\n mustLoadOnDemand = true;\n } else {\n node.is_open = true;\n }\n }\n }\n\n return mustLoadOnDemand;\n }\n\n private parseState(jsonData: string): SavedState {\n const state = JSON.parse(jsonData) as Record<string, unknown>;\n\n // Check if selected_node is an int (instead of an array)\n if (state.selected_node && isInt(state.selected_node)) {\n // Convert to array\n state.selected_node = [state.selected_node];\n }\n\n return state;\n }\n\n private resetSelection(): void {\n const selectedNodes = this.getSelectedNodes();\n\n for (const node of selectedNodes) {\n this.removeFromSelection(node);\n }\n }\n\n // result: is a node selected?\n private selectInitialNodes(nodeIds: NodeId[]): boolean {\n let isNodeSelected = false;\n\n for (const nodeId of nodeIds) {\n const node = this.getNodeById(nodeId);\n\n if (!node) {\n continue;\n }\n\n this.addToSelection(node);\n isNodeSelected = true;\n }\n\n return isNodeSelected;\n }\n}\n"],"names":["addToSelection","getNodeById","getSelectedNodes","getTree","onGetStateFromStorage","onSetStateFromStorage","openNode","refreshElements","removeFromSelection","saveStateOption","getNodeIdToBeSelected","getStateFromStorage","getState","loadFromStorage","parseState","saveState","getKeyName","setInitialState","openInitialNodes","resetSelection","selectInitialNodes","setInitialStateOnDemand"],"mappings":"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"}
|
|
@@ -35,6 +35,9 @@ export default class SelectNodeHandler {
|
|
|
35
35
|
isNodeSelected(node: Node): boolean;
|
|
36
36
|
removeFromSelection(node: Node, includeChildren?: boolean): void;
|
|
37
37
|
selectSingleNode(node: Node, optionsParam?: SelectNodeOptions): void;
|
|
38
|
+
toggleNodeInSelection(node: Node, mustSetFocus?: boolean): void;
|
|
39
|
+
private canSelect;
|
|
40
|
+
private deselectNode;
|
|
38
41
|
}
|
|
39
42
|
export {};
|
|
40
43
|
//# sourceMappingURL=selectNodeHandler.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"selectNodeHandler.d.ts","sourceRoot":"","sources":["../src/selectNodeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IACtD,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAa;gBAEtB,EACV,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE,2BAA2B;IAavB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQhC,KAAK,IAAI,IAAI;IAKb,eAAe,IAAI,IAAI,GAAG,IAAI;IAM9B,gBAAgB,IAAI,IAAI,EAAE;IAiB1B,qBAAqB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE;IAmB3C,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOnC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,UAAQ,GAAG,IAAI;IA6B9D,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"selectNodeHandler.d.ts","sourceRoot":"","sources":["../src/selectNodeHandler.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,qBAAqB,EACrB,WAAW,EACX,YAAY,EACb,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,IAAI,EAAU,MAAM,QAAQ,CAAC;AAC3C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAEjD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,UAAU,2BAA2B;IACnC,WAAW,EAAE,WAAW,CAAC;IACzB,qBAAqB,EAAE,qBAAqB,CAAC;IAC7C,kBAAkB,EAAE,MAAM,eAAe,GAAG,SAAS,CAAC;IACtD,aAAa,EAAE,MAAM,OAAO,CAAC;IAC7B,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,EAAE,MAAM,IAAI,CAAC;IACtB,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,qBAAqB,CAAwB;IACrD,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,aAAa,CAAgB;IACrC,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,SAAS,CAAa;IAC9B,OAAO,CAAC,aAAa,CAAc;IACnC,OAAO,CAAC,kBAAkB,CAAc;IACxC,OAAO,CAAC,YAAY,CAAe;IACnC,OAAO,CAAC,aAAa,CAAa;gBAEtB,EACV,WAAW,EACX,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,EACb,WAAW,EACX,SAAS,EACT,YAAY,EACZ,aAAa,GACd,EAAE,2BAA2B;IAavB,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI;IAQhC,KAAK,IAAI,IAAI;IAKb,eAAe,IAAI,IAAI,GAAG,IAAI;IAM9B,gBAAgB,IAAI,IAAI,EAAE;IAiB1B,qBAAqB,CAAC,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE;IAmB3C,cAAc,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO;IAOnC,mBAAmB,CAAC,IAAI,EAAE,IAAI,EAAE,eAAe,UAAQ,GAAG,IAAI;IA6B9D,gBAAgB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,CAAC,EAAE,iBAAiB;IA0D7D,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,YAAY,UAAO,GAAG,IAAI;IAoBnE,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,YAAY;CAIrB"}
|