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.
Files changed (91) hide show
  1. package/README.md +23 -20
  2. package/lib/classNames.js +4 -4
  3. package/lib/classNames.js.map +1 -1
  4. package/lib/dataLoader.d.ts +0 -1
  5. package/lib/dataLoader.d.ts.map +1 -1
  6. package/lib/dataLoader.js +10 -7
  7. package/lib/dataLoader.js.map +1 -1
  8. package/lib/dragAndDropHandler/generateHitAreas.d.ts.map +1 -1
  9. package/lib/dragAndDropHandler/generateHitAreas.js +3 -2
  10. package/lib/dragAndDropHandler/generateHitAreas.js.map +1 -1
  11. package/lib/dragAndDropHandler/index.d.ts +2 -4
  12. package/lib/dragAndDropHandler/index.d.ts.map +1 -1
  13. package/lib/dragAndDropHandler/index.js +2 -9
  14. package/lib/dragAndDropHandler/index.js.map +1 -1
  15. package/lib/elementsRenderer.d.ts +11 -4
  16. package/lib/elementsRenderer.d.ts.map +1 -1
  17. package/lib/elementsRenderer.js +104 -43
  18. package/lib/elementsRenderer.js.map +1 -1
  19. package/lib/events.d.ts +13 -7
  20. package/lib/events.d.ts.map +1 -1
  21. package/lib/folderOpenState.d.ts +8 -0
  22. package/lib/folderOpenState.d.ts.map +1 -0
  23. package/lib/folderOpenState.js +22 -0
  24. package/lib/folderOpenState.js.map +1 -0
  25. package/lib/index.d.ts +27 -20
  26. package/lib/index.d.ts.map +1 -1
  27. package/lib/index.js +166 -65
  28. package/lib/index.js.map +1 -1
  29. package/lib/keyHandler.d.ts +16 -3
  30. package/lib/keyHandler.d.ts.map +1 -1
  31. package/lib/keyHandler.js +79 -32
  32. package/lib/keyHandler.js.map +1 -1
  33. package/lib/methodTypes.d.ts +3 -0
  34. package/lib/methodTypes.d.ts.map +1 -1
  35. package/lib/mouseHandler.d.ts.map +1 -1
  36. package/lib/mouseHandler.js +12 -12
  37. package/lib/mouseHandler.js.map +1 -1
  38. package/lib/node.d.ts +12 -10
  39. package/lib/node.d.ts.map +1 -1
  40. package/lib/node.js +12 -10
  41. package/lib/node.js.map +1 -1
  42. package/lib/nodeElement/folderElement.d.ts +7 -5
  43. package/lib/nodeElement/folderElement.d.ts.map +1 -1
  44. package/lib/nodeElement/folderElement.js +35 -55
  45. package/lib/nodeElement/folderElement.js.map +1 -1
  46. package/lib/nodeElement/index.d.ts +3 -2
  47. package/lib/nodeElement/index.d.ts.map +1 -1
  48. package/lib/nodeElement/index.js +15 -12
  49. package/lib/nodeElement/index.js.map +1 -1
  50. package/lib/options.d.ts +29 -14
  51. package/lib/options.d.ts.map +1 -1
  52. package/lib/options.js +12 -0
  53. package/lib/options.js.map +1 -0
  54. package/lib/saveStateHandler.d.ts.map +1 -1
  55. package/lib/saveStateHandler.js +6 -6
  56. package/lib/saveStateHandler.js.map +1 -1
  57. package/lib/selectNodeHandler.d.ts +3 -0
  58. package/lib/selectNodeHandler.d.ts.map +1 -1
  59. package/lib/selectNodeHandler.js +66 -22
  60. package/lib/selectNodeHandler.js.map +1 -1
  61. package/lib/setDefaultOptions.d.ts.map +1 -1
  62. package/lib/setDefaultOptions.js +1 -0
  63. package/lib/setDefaultOptions.js.map +1 -1
  64. package/lib/version.d.ts +1 -1
  65. package/lib/version.js +1 -1
  66. package/lib/version.js.map +1 -1
  67. package/package.json +38 -32
  68. package/src/classNames.ts +4 -4
  69. package/src/dataLoader.ts +9 -10
  70. package/src/dragAndDropHandler/generateHitAreas.ts +3 -2
  71. package/src/dragAndDropHandler/index.ts +3 -17
  72. package/src/elementsRenderer.ts +124 -55
  73. package/src/events.ts +13 -7
  74. package/src/folderOpenState.ts +38 -0
  75. package/src/index.ts +191 -82
  76. package/src/keyHandler.ts +104 -34
  77. package/src/methodTypes.ts +6 -0
  78. package/src/mouseHandler.ts +15 -13
  79. package/src/node.ts +12 -10
  80. package/src/nodeElement/folderElement.ts +47 -72
  81. package/src/nodeElement/index.ts +20 -17
  82. package/src/options.ts +46 -14
  83. package/src/saveStateHandler.ts +5 -8
  84. package/src/selectNodeHandler.ts +69 -25
  85. package/src/setDefaultOptions.ts +1 -0
  86. package/src/version.ts +1 -1
  87. package/tree_element.css +48 -5
  88. package/tree_element.debug.js +540 -278
  89. package/tree_element.debug.js.map +1 -1
  90. package/tree_element.js +2 -2
  91. package/tree_element.js.map +1 -1
@@ -1,13 +1,14 @@
1
- import { slideUp, slideDown } from '../animation.js';
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._closedIconElement = closedIconElement;
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 (!this._isRendered()) {
34
- this._triggerEvent("tree.close", {
35
- node: this._node
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
- // The children are rendered the first time the folder is opened
84
- let ul = this._getUl() ?? this._renderChildren(this._node);
85
- if (ul) {
86
- if (slide) {
87
- await slideDown(ul, animationSpeed);
88
- } else {
89
- ul.style.display = "block";
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 closedIconElement?: globalThis.Node;\n openedIconElement?: globalThis.Node;\n renderChildren: RenderChildren;\n triggerEvent: TriggerEvent;\n}\n\nclass FolderElement extends NodeElement {\n private closedIconElement?: globalThis.Node;\n private openedIconElement?: globalThis.Node;\n private renderChildren: RenderChildren;\n private triggerEvent: TriggerEvent;\n\n constructor({\n classNames,\n closedIconElement,\n getScrollLeft,\n node,\n openedIconElement,\n renderChildren,\n tabIndex,\n treeElement,\n triggerEvent,\n }: FolderElementParams) {\n super({\n classNames,\n getScrollLeft,\n node,\n tabIndex,\n treeElement,\n });\n\n this.closedIconElement = closedIconElement;\n this.openedIconElement = openedIconElement;\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.triggerEvent(\"tree.close\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.add(this.classNames.closed);\n button.replaceChildren();\n\n const closedIconElement = this.closedIconElement;\n\n if (closedIconElement) {\n const icon = closedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n const ul = this.getUl();\n\n if (ul) {\n if (slide) {\n await slideUp(ul, animationSpeed);\n } else {\n ul.style.display = \"none\";\n }\n }\n\n this.element.classList.add(this.classNames.closed);\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"false\");\n\n this.triggerEvent(\"tree.close\", {\n node: this.node,\n });\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 if (!this.isRendered()) {\n // The folder is rendered open when its parent is opened\n this.triggerEvent(\"tree.open\", { node: this.node });\n return;\n }\n\n const button = this.getButton();\n button.classList.remove(this.classNames.closed);\n button.replaceChildren();\n\n const openedIconElement = this.openedIconElement;\n\n if (openedIconElement) {\n const icon = openedIconElement.cloneNode(true);\n button.append(icon);\n }\n\n // The children are rendered the first time the folder is opened\n const ul = this.getUl() ?? this.renderChildren(this.node);\n\n if (ul) {\n if (slide) {\n await slideDown(ul, animationSpeed);\n } else {\n ul.style.display = \"block\";\n }\n }\n\n this.element.classList.remove(this.classNames.closed);\n\n const titleSpan = this.getTitleSpan();\n titleSpan.setAttribute(\"aria-expanded\", \"true\");\n\n this.triggerEvent(\"tree.open\", {\n node: this.node,\n });\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\nexport default FolderElement;\n"],"names":["closedIconElement","openedIconElement","renderChildren","triggerEvent","close","node","isRendered","getButton","classNames","getUl","element","getTitleSpan","open","mustShowBorderDropHint"],"mappings":"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"}
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;IAC7B,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,QAAQ,CAAC,CAAS;IAC1B,OAAO,CAAC,WAAW,CAAc;gBAErB,EACV,UAAU,EACV,aAAa,EACb,IAAI,EACJ,QAAQ,EACR,WAAW,GACZ,EAAE,iBAAiB;IAWb,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ;IAMzC,QAAQ,IAAI,IAAI;IAmBhB,MAAM,CAAC,YAAY,EAAE,OAAO,GAAG,IAAI;IAsB1C,SAAS,CAAC,YAAY,IAAI,eAAe;IAMzC,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"}
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"}
@@ -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
- let titleSpan = this._getTitleSpan();
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
- titleSpan.setAttribute("tabindex", "-1");
41
+ this._element.setAttribute("tabindex", "-1");
34
42
  }
35
- titleSpan.setAttribute("aria-selected", "false");
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
- let titleSpan = this._getTitleSpan();
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
- titleSpan.setAttribute("tabindex", tabIndex.toString());
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
- titleSpan.focus();
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 const titleSpan = this.getTitleSpan();\n\n // Check for null or undefined\n if (this.tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", \"-1\");\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"false\");\n\n titleSpan.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\n const titleSpan = this.getTitleSpan();\n const tabIndex = this.tabIndex;\n\n // Check for null or undefined\n if (tabIndex != null) {\n titleSpan.setAttribute(\"tabindex\", tabIndex.toString());\n }\n\n titleSpan.setAttribute(\"aria-selected\", \"true\");\n\n if (mustSetFocus) {\n titleSpan.focus();\n }\n }\n\n protected getTitleSpan(): HTMLSpanElement {\n return this.element.querySelector(\n `:scope > .${this.classNames.element} > span.${this.classNames.title}`,\n ) as HTMLSpanElement;\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","node","tabIndex","treeElement","element","addDropHint","mustShowBorderDropHint","deselect","isRendered","getTitleSpan","select","getUl"],"mappings":"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"}
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 200ms, `"slow"` is
17
- * 600ms, a number is milliseconds.
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 html — only do
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 css classes the widget puts on the elements it
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 stylesheet uses the default prefix, so
67
- * change it only if you bring your own css. See
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 html; an element is
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 svg triangle pointing right, or left when `rtl` is
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 url to fetch the data from, or a function that returns one. The
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 json string, from somewhere other than
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 json string, to somewhere other than
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 svg triangle pointing down, sized in em and filled with
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; `true` uses `tree`. See
278
+ * as the storage key, and `true` uses `tree`. See
264
279
  * [Saving state](/guide/saving-state).
265
280
  *
266
281
  * @defaultValue `false`
@@ -1 +1 @@
1
- {"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../src/options.ts"],"names":[],"mappings":"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"}
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;IAUtC,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;IAQtB,OAAO,CAAC,kBAAkB;CAiB3B"}
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"}
@@ -25,9 +25,7 @@ class SaveStateHandler {
25
25
  this._saveStateOption = saveState;
26
26
  }
27
27
  _getNodeIdToBeSelected() {
28
- if (!this._saveStateOption) {
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 selectCount = 0;
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 selectCount !== 0;
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;CA+CrE"}
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"}