jqtree 1.7.4 → 1.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (94) hide show
  1. package/.eslintrc +5 -1
  2. package/bower.json +1 -1
  3. package/config/babel.config.json +1 -1
  4. package/config/production +2 -0
  5. package/devserver/devserver_scroll.js +8 -0
  6. package/devserver/test_scroll.html +28 -0
  7. package/devserver/test_scroll_container.html +39 -0
  8. package/docs/_config.yml +1 -1
  9. package/docs/_entries/general/changelog.md +12 -0
  10. package/docs/package.json +1 -1
  11. package/docs/pnpm-lock.yaml +30 -30
  12. package/package.json +31 -27
  13. package/src/dataLoader.ts +44 -19
  14. package/src/dragAndDropHandler/dragElement.ts +42 -0
  15. package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
  16. package/src/dragAndDropHandler/index.ts +470 -0
  17. package/src/dragAndDropHandler/types.ts +12 -0
  18. package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
  19. package/src/elementsRenderer.ts +75 -40
  20. package/src/jqtreeMethodTypes.ts +40 -0
  21. package/src/jqtreeOptions.ts +43 -25
  22. package/src/keyHandler.ts +59 -38
  23. package/src/mouse.widget.ts +3 -3
  24. package/src/mouseWidgetTypes.ts +6 -0
  25. package/src/node.ts +32 -48
  26. package/src/nodeElement/borderDropHint.ts +32 -0
  27. package/src/nodeElement/folderElement.ts +133 -0
  28. package/src/nodeElement/ghostDropHint.ts +68 -0
  29. package/src/nodeElement/index.ts +101 -0
  30. package/src/nodeUtils.ts +10 -0
  31. package/src/playwright/coverage.ts +1 -4
  32. package/src/playwright/playwright.test.ts +203 -15
  33. package/src/playwright/testUtils.ts +23 -15
  34. package/src/saveStateHandler.ts +75 -26
  35. package/src/scrollHandler/containerScrollParent.ts +177 -0
  36. package/src/scrollHandler/createScrollParent.ts +50 -0
  37. package/src/scrollHandler/documentScrollParent.ts +182 -0
  38. package/src/scrollHandler/types.ts +7 -0
  39. package/src/scrollHandler.ts +36 -248
  40. package/src/selectNodeHandler.ts +10 -16
  41. package/src/test/jqTree/keyboard.test.ts +18 -23
  42. package/src/test/jqTree/loadOnDemand.test.ts +2 -3
  43. package/src/test/jqTree/methods.test.ts +33 -4
  44. package/src/test/jqTree/options.test.ts +15 -4
  45. package/src/test/node.test.ts +85 -26
  46. package/src/test/nodeUtils.test.ts +21 -0
  47. package/src/tree.jquery.ts +262 -83
  48. package/src/util.ts +3 -0
  49. package/src/version.ts +1 -1
  50. package/tree.jquery.debug.js +1922 -2608
  51. package/tree.jquery.debug.js.map +1 -1
  52. package/tree.jquery.js +2 -2
  53. package/tree.jquery.js.map +1 -1
  54. package/lib/dataLoader.js +0 -124
  55. package/lib/dragAndDropHandler.js +0 -596
  56. package/lib/elementsRenderer.js +0 -268
  57. package/lib/jqtreeOptions.js +0 -1
  58. package/lib/keyHandler.js +0 -115
  59. package/lib/mouse.widget.js +0 -256
  60. package/lib/node.js +0 -717
  61. package/lib/nodeElement.js +0 -277
  62. package/lib/playwright/coverage.js +0 -96
  63. package/lib/playwright/playwright.test.js +0 -228
  64. package/lib/playwright/testUtils.js +0 -184
  65. package/lib/saveStateHandler.js +0 -278
  66. package/lib/scrollHandler.js +0 -250
  67. package/lib/selectNodeHandler.js +0 -129
  68. package/lib/simple.widget.js +0 -159
  69. package/lib/test/global.d.js +0 -3
  70. package/lib/test/jqTree/accessibility.test.js +0 -37
  71. package/lib/test/jqTree/create.test.js +0 -48
  72. package/lib/test/jqTree/events.test.js +0 -210
  73. package/lib/test/jqTree/keyboard.test.js +0 -225
  74. package/lib/test/jqTree/loadOnDemand.test.js +0 -218
  75. package/lib/test/jqTree/methods.test.js +0 -1347
  76. package/lib/test/jqTree/options.test.js +0 -548
  77. package/lib/test/node.test.js +0 -1160
  78. package/lib/test/nodeUtil.test.js +0 -27
  79. package/lib/test/support/exampleData.js +0 -36
  80. package/lib/test/support/jqTreeMatchers.js +0 -70
  81. package/lib/test/support/matchers.d.js +0 -1
  82. package/lib/test/support/setupTests.js +0 -7
  83. package/lib/test/support/testUtil.js +0 -32
  84. package/lib/test/support/treeStructure.js +0 -39
  85. package/lib/test/util.test.js +0 -26
  86. package/lib/tree.jquery.d.js +0 -1
  87. package/lib/tree.jquery.js +0 -1106
  88. package/lib/types.js +0 -1
  89. package/lib/typings.d.js +0 -2
  90. package/lib/util.js +0 -18
  91. package/lib/version.js +0 -9
  92. package/src/dragAndDropHandler.ts +0 -719
  93. package/src/nodeElement.ts +0 -272
  94. package/src/types.ts +0 -19
@@ -0,0 +1,97 @@
1
+ import { Node } from "../node";
2
+
3
+ abstract class VisibleNodeIterator {
4
+ private tree: Node;
5
+
6
+ constructor(tree: Node) {
7
+ this.tree = tree;
8
+ }
9
+
10
+ protected iterate(): void {
11
+ let isFirstNode = true;
12
+
13
+ const _iterateNode = (node: Node, nextNode: Node | null): void => {
14
+ let mustIterateInside =
15
+ (node.is_open || !node.element) && node.hasChildren();
16
+
17
+ let element: HTMLElement | null = null;
18
+
19
+ // Is the element visible?
20
+ if (node.element?.offsetParent) {
21
+ element = node.element;
22
+
23
+ if (isFirstNode) {
24
+ this.handleFirstNode(node);
25
+ isFirstNode = false;
26
+ }
27
+
28
+ if (!node.hasChildren()) {
29
+ this.handleNode(node, nextNode, node.element);
30
+ } else if (node.is_open) {
31
+ if (!this.handleOpenFolder(node, node.element)) {
32
+ mustIterateInside = false;
33
+ }
34
+ } else {
35
+ this.handleClosedFolder(node, nextNode, element);
36
+ }
37
+ }
38
+
39
+ if (mustIterateInside) {
40
+ const childrenLength = node.children.length;
41
+ node.children.forEach((_, i) => {
42
+ const child = node.children[i];
43
+
44
+ if (child) {
45
+ if (i === childrenLength - 1) {
46
+ _iterateNode(child, null);
47
+ } else {
48
+ const nextChild = node.children[i + 1];
49
+
50
+ if (nextChild) {
51
+ _iterateNode(child, nextChild);
52
+ }
53
+ }
54
+ }
55
+ });
56
+
57
+ if (node.is_open && element) {
58
+ this.handleAfterOpenFolder(node, nextNode);
59
+ }
60
+ }
61
+ };
62
+
63
+ _iterateNode(this.tree, null);
64
+ }
65
+
66
+ protected abstract handleNode(
67
+ node: Node,
68
+ nextNode: Node | null,
69
+ element: HTMLElement,
70
+ ): void;
71
+
72
+ /*
73
+ override
74
+ return
75
+ - true: continue iterating
76
+ - false: stop iterating
77
+ */
78
+ protected abstract handleOpenFolder(
79
+ node: Node,
80
+ element: HTMLElement,
81
+ ): boolean;
82
+
83
+ protected abstract handleClosedFolder(
84
+ node: Node,
85
+ nextNode: Node | null,
86
+ element: HTMLElement,
87
+ ): void;
88
+
89
+ protected abstract handleAfterOpenFolder(
90
+ node: Node,
91
+ nextNode: Node | null,
92
+ ): void;
93
+
94
+ protected abstract handleFirstNode(node: Node): void;
95
+ }
96
+
97
+ export default VisibleNodeIterator;
@@ -1,23 +1,63 @@
1
1
  import { getBoolString } from "./util";
2
2
  import { Node } from "./node";
3
- import { JqTreeWidget } from "./tree.jquery";
4
-
5
- type IconElement = string | HTMLElement | JQuery<HTMLElement>;
3
+ import { IconElement, OnCreateLi } from "./jqtreeOptions";
4
+ import { GetTree, IsNodeSelected } from "./jqtreeMethodTypes";
5
+
6
+ interface ElementsRendererParams {
7
+ autoEscape: boolean;
8
+ buttonLeft: boolean;
9
+ closedIcon?: IconElement;
10
+ dragAndDrop: boolean;
11
+ $element: JQuery<HTMLElement>;
12
+ getTree: GetTree;
13
+ isNodeSelected: IsNodeSelected;
14
+ onCreateLi?: OnCreateLi;
15
+ openedIcon?: IconElement;
16
+ rtl?: boolean;
17
+ showEmptyFolder: boolean;
18
+ tabIndex?: number;
19
+ }
6
20
 
7
21
  export default class ElementsRenderer {
8
22
  public openedIconElement?: HTMLElement | Text;
9
23
  public closedIconElement?: HTMLElement | Text;
10
- private treeWidget: JqTreeWidget;
11
-
12
- constructor(treeWidget: JqTreeWidget) {
13
- this.treeWidget = treeWidget;
14
-
15
- this.openedIconElement = this.createButtonElement(
16
- treeWidget.options.openedIcon || "+",
17
- );
18
- this.closedIconElement = this.createButtonElement(
19
- treeWidget.options.closedIcon || "-",
20
- );
24
+ private autoEscape: boolean;
25
+ private buttonLeft: boolean;
26
+ private dragAndDrop: boolean;
27
+ private $element: JQuery<HTMLElement>;
28
+ private getTree: GetTree;
29
+ private isNodeSelected: IsNodeSelected;
30
+ private onCreateLi?: OnCreateLi;
31
+ private rtl?: boolean;
32
+ private showEmptyFolder: boolean;
33
+ private tabIndex?: number;
34
+
35
+ constructor({
36
+ autoEscape,
37
+ buttonLeft,
38
+ closedIcon,
39
+ onCreateLi,
40
+ dragAndDrop,
41
+ $element,
42
+ getTree,
43
+ isNodeSelected,
44
+ openedIcon,
45
+ rtl,
46
+ showEmptyFolder,
47
+ tabIndex,
48
+ }: ElementsRendererParams) {
49
+ this.autoEscape = autoEscape;
50
+ this.buttonLeft = buttonLeft;
51
+ this.dragAndDrop = dragAndDrop;
52
+ this.$element = $element;
53
+ this.getTree = getTree;
54
+ this.isNodeSelected = isNodeSelected;
55
+ this.onCreateLi = onCreateLi;
56
+ this.rtl = rtl;
57
+ this.showEmptyFolder = showEmptyFolder;
58
+ this.tabIndex = tabIndex;
59
+ this.openedIconElement = this.createButtonElement(openedIcon || "+");
60
+ this.closedIconElement = this.createButtonElement(closedIcon || "-");
21
61
  }
22
62
 
23
63
  public render(fromNode: Node | null): void {
@@ -29,16 +69,12 @@ export default class ElementsRenderer {
29
69
  }
30
70
 
31
71
  public renderFromRoot(): void {
32
- const $element = this.treeWidget.element;
33
- $element.empty();
72
+ this.$element.empty();
34
73
 
35
- if ($element[0]) {
36
- this.createDomElements(
37
- $element[0],
38
- this.treeWidget.tree.children,
39
- true,
40
- 1,
41
- );
74
+ const tree = this.getTree();
75
+
76
+ if (this.$element[0] && tree) {
77
+ this.createDomElements(this.$element[0], tree.children, true, 1);
42
78
  }
43
79
  }
44
80
 
@@ -104,12 +140,12 @@ export default class ElementsRenderer {
104
140
  classString = "jqtree-tree";
105
141
  role = "tree";
106
142
 
107
- if (this.treeWidget.options.rtl) {
143
+ if (this.rtl) {
108
144
  classString += " jqtree-rtl";
109
145
  }
110
146
  }
111
147
 
112
- if (this.treeWidget.options.dragAndDrop) {
148
+ if (this.dragAndDrop) {
113
149
  classString += " jqtree-dnd";
114
150
  }
115
151
 
@@ -122,20 +158,17 @@ export default class ElementsRenderer {
122
158
  }
123
159
 
124
160
  private createLi(node: Node, level: number): HTMLLIElement {
125
- const isSelected = Boolean(
126
- this.treeWidget.selectNodeHandler.isNodeSelected(node),
127
- );
161
+ const isSelected = Boolean(this.isNodeSelected(node));
128
162
 
129
163
  const mustShowFolder =
130
- node.isFolder() ||
131
- (node.isEmptyFolder && this.treeWidget.options.showEmptyFolder);
164
+ node.isFolder() || (node.isEmptyFolder && this.showEmptyFolder);
132
165
 
133
166
  const li = mustShowFolder
134
167
  ? this.createFolderLi(node, level, isSelected)
135
168
  : this.createNodeLi(node, level, isSelected);
136
169
 
137
- if (this.treeWidget.options.onCreateLi) {
138
- this.treeWidget.options.onCreateLi(node, jQuery(li), isSelected);
170
+ if (this.onCreateLi) {
171
+ this.onCreateLi(node, jQuery(li), isSelected);
139
172
  }
140
173
 
141
174
  return li;
@@ -185,7 +218,7 @@ export default class ElementsRenderer {
185
218
  buttonLink.appendChild(iconElement.cloneNode(true));
186
219
  }
187
220
 
188
- if (this.treeWidget.options.buttonLeft) {
221
+ if (this.buttonLeft) {
189
222
  div.appendChild(buttonLink);
190
223
  }
191
224
 
@@ -199,7 +232,7 @@ export default class ElementsRenderer {
199
232
  titleSpan.setAttribute("aria-expanded", getBoolString(node.is_open));
200
233
  div.appendChild(titleSpan);
201
234
 
202
- if (!this.treeWidget.options.buttonLeft) {
235
+ if (!this.buttonLeft) {
203
236
  div.appendChild(buttonLink);
204
237
  }
205
238
 
@@ -257,14 +290,12 @@ export default class ElementsRenderer {
257
290
  classes += " jqtree-title-folder";
258
291
  }
259
292
 
260
- classes += ` jqtree-title-button-${
261
- this.treeWidget.options.buttonLeft ? "left" : "right"
262
- }`;
293
+ classes += ` jqtree-title-button-${this.buttonLeft ? "left" : "right"}`;
263
294
 
264
295
  titleSpan.className = classes;
265
296
 
266
297
  if (isSelected) {
267
- const tabIndex = this.treeWidget.options.tabIndex;
298
+ const tabIndex = this.tabIndex;
268
299
 
269
300
  if (tabIndex !== undefined) {
270
301
  titleSpan.setAttribute("tabindex", `${tabIndex}`);
@@ -273,7 +304,7 @@ export default class ElementsRenderer {
273
304
 
274
305
  this.setTreeItemAriaAttributes(titleSpan, nodeName, level, isSelected);
275
306
 
276
- if (this.treeWidget.options.autoEscape) {
307
+ if (this.autoEscape) {
277
308
  titleSpan.textContent = nodeName;
278
309
  } else {
279
310
  titleSpan.innerHTML = nodeName;
@@ -289,7 +320,7 @@ export default class ElementsRenderer {
289
320
  classes.push("jqtree-closed");
290
321
  }
291
322
 
292
- if (this.treeWidget.options.buttonLeft) {
323
+ if (this.buttonLeft) {
293
324
  classes.push("jqtree-toggler-left");
294
325
  } else {
295
326
  classes.push("jqtree-toggler-right");
@@ -325,6 +356,10 @@ export default class ElementsRenderer {
325
356
  div.innerHTML = value;
326
357
 
327
358
  return document.createTextNode(div.innerHTML);
359
+ } else if (value == null) {
360
+ return undefined;
361
+ } else if ((value as HTMLElement).nodeType) {
362
+ return value as HTMLElement;
328
363
  } else {
329
364
  return jQuery(value)[0];
330
365
  }
@@ -0,0 +1,40 @@
1
+ import { Node } from "./node";
2
+
3
+ export type AddToSelection = (node: Node) => void;
4
+
5
+ export type CloseNode = (node: Node) => void;
6
+
7
+ export type GetNodeById = (nodeId: NodeId) => Node | null;
8
+
9
+ export type GetScrollLeft = () => number;
10
+
11
+ export type GetSelectedNode = () => Node | false;
12
+
13
+ export type GetSelectedNodes = () => Node[];
14
+
15
+ export type GetTree = () => Node | null;
16
+
17
+ export type IsFocusOnTree = () => boolean;
18
+
19
+ export type IsNodeSelected = (node: Node) => boolean;
20
+
21
+ export type LoadData = (data: NodeData[], parentNode: Node | null) => void;
22
+
23
+ export type OnFinishOpenNode = (node: Node) => void;
24
+
25
+ export type OpenNode = (
26
+ node: Node,
27
+ slide?: boolean,
28
+ onFinished?: OnFinishOpenNode,
29
+ ) => void;
30
+
31
+ export type RefreshElements = (fromNode: Node | null) => void;
32
+
33
+ export type RemoveFromSelection = (node: Node) => void;
34
+
35
+ export type SelectNode = (node: Node) => void;
36
+
37
+ export type TriggerEvent = (
38
+ eventName: string,
39
+ values?: Record<string, unknown>,
40
+ ) => JQuery.Event;
@@ -1,16 +1,34 @@
1
1
  import { Node } from "./node";
2
2
 
3
- type CanMoveNodeTo = (
3
+ export type OnCanMove = ((node: Node) => boolean) | undefined;
4
+
5
+ type DataUrlFunction = (node: Node | null) => JQuery.AjaxSettings;
6
+
7
+ export type DataUrl = string | JQuery.AjaxSettings | DataUrlFunction;
8
+
9
+ export type DragMethod = (node: Node, event: Event | Touch) => void;
10
+
11
+ export type OnCanMoveTo = (
4
12
  node: Node,
5
13
  targetNode: Node,
6
14
  positionName: string,
7
15
  ) => boolean;
8
- type CreateLi = (node: Node, el: JQuery, isSelected: boolean) => void;
9
- type DataFilter = (data: unknown) => NodeData[];
10
- type DataUrlFunction = (node: Node | null) => JQuery.AjaxSettings;
11
- type DataUrl = string | JQuery.AjaxSettings | DataUrlFunction;
12
- type DragMethod = (node: Node, event: Event | Touch) => void;
13
- type HandleLoadingMethod = (
16
+
17
+ export type OnGetStateFromStorage = (() => string) | undefined;
18
+
19
+ export type OnIsMoveHandle = (el: JQuery) => boolean;
20
+
21
+ export type OnLoadFailed = (response: JQuery.jqXHR) => void;
22
+
23
+ export type OnSetStateFromStorage = ((data: string) => void) | undefined;
24
+
25
+ export type DataFilter = (data: unknown) => NodeData[];
26
+
27
+ export type IconElement = string | HTMLElement | JQuery<HTMLElement>;
28
+
29
+ export type OnCreateLi = (node: Node, el: JQuery, isSelected: boolean) => void;
30
+
31
+ export type OnLoading = (
14
32
  isLoading: boolean,
15
33
  node: Node | null,
16
34
  $el: JQuery,
@@ -21,32 +39,32 @@ export interface JQTreeOptions {
21
39
  autoEscape: boolean;
22
40
  autoOpen: boolean | number;
23
41
  buttonLeft: boolean;
24
- closedIcon?: string | HTMLElement | JQuery<HTMLElement>;
25
- data: NodeData[] | undefined;
26
- dataFilter: DataFilter | undefined;
27
- dataUrl: DataUrl | undefined;
42
+ closedIcon?: IconElement;
43
+ data?: NodeData[];
44
+ dataFilter?: DataFilter;
45
+ dataUrl?: DataUrl;
28
46
  dragAndDrop: boolean;
29
47
  keyboardSupport: boolean;
30
48
  nodeClass: typeof Node;
31
- onCanMove: ((node: Node) => boolean) | undefined;
32
- onCanMoveTo: CanMoveNodeTo | undefined;
33
- onCanSelectNode: ((node: Node) => boolean) | undefined;
34
- onCreateLi: CreateLi | undefined;
35
- onDragMove: DragMethod | undefined;
36
- onDragStop: DragMethod | undefined;
37
- onGetStateFromStorage: (() => string) | undefined;
38
- onIsMoveHandle: ((el: JQuery) => boolean) | undefined;
39
- onLoadFailed: ((response: JQuery.jqXHR) => void) | undefined;
40
- onLoading: HandleLoadingMethod | undefined;
41
- onSetStateFromStorage: ((data: string) => void) | undefined;
42
- openedIcon?: string | HTMLElement | JQuery<HTMLElement>;
49
+ onCanMove?: OnCanMove;
50
+ onCanMoveTo?: OnCanMoveTo;
51
+ onCanSelectNode?: (node: Node) => boolean;
52
+ onCreateLi?: OnCreateLi;
53
+ onDragMove?: DragMethod;
54
+ onDragStop?: DragMethod;
55
+ onGetStateFromStorage?: OnGetStateFromStorage;
56
+ onIsMoveHandle?: OnIsMoveHandle;
57
+ onLoadFailed?: OnLoadFailed;
58
+ onLoading?: OnLoading;
59
+ onSetStateFromStorage?: OnSetStateFromStorage;
60
+ openedIcon?: IconElement;
43
61
  openFolderDelay: number | false;
44
- rtl: boolean | undefined;
62
+ rtl?: boolean;
45
63
  selectable: boolean;
46
64
  saveState: boolean | string;
47
65
  showEmptyFolder: boolean;
48
66
  slide: boolean;
49
67
  startDndDelay: number;
50
- tabIndex: number;
68
+ tabIndex?: number;
51
69
  useContextMenu: boolean;
52
70
  }
package/src/keyHandler.ts CHANGED
@@ -1,24 +1,58 @@
1
1
  import { Node } from "./node";
2
- import { JqTreeWidget } from "./tree.jquery";
2
+ import {
3
+ CloseNode,
4
+ GetSelectedNode,
5
+ IsFocusOnTree,
6
+ OpenNode,
7
+ SelectNode,
8
+ } from "./jqtreeMethodTypes";
9
+
10
+ type KeyboardEventHandler = (event: KeyboardEvent) => boolean;
11
+
12
+ interface KeyHandlerParams {
13
+ closeNode: CloseNode;
14
+ getSelectedNode: GetSelectedNode;
15
+ isFocusOnTree: IsFocusOnTree;
16
+ keyboardSupport: boolean;
17
+ openNode: OpenNode;
18
+ selectNode: SelectNode;
19
+ }
3
20
 
4
21
  export default class KeyHandler {
5
- private static LEFT = 37;
6
- private static UP = 38;
7
- private static RIGHT = 39;
8
- private static DOWN = 40;
9
-
10
- private treeWidget: JqTreeWidget;
11
-
12
- constructor(treeWidget: JqTreeWidget) {
13
- this.treeWidget = treeWidget;
14
-
15
- if (treeWidget.options.keyboardSupport) {
16
- jQuery(document).on("keydown.jqtree", this.handleKeyDown);
22
+ private closeNode: CloseNode;
23
+ private getSelectedNode: GetSelectedNode;
24
+ private handleKeyDownHandler?: KeyboardEventHandler;
25
+ private isFocusOnTree: IsFocusOnTree;
26
+ private keyboardSupport: boolean;
27
+ private openNode: OpenNode;
28
+ private originalSelectNode: SelectNode;
29
+
30
+ constructor({
31
+ closeNode,
32
+ getSelectedNode,
33
+ isFocusOnTree,
34
+ keyboardSupport,
35
+ openNode,
36
+ selectNode,
37
+ }: KeyHandlerParams) {
38
+ this.closeNode = closeNode;
39
+ this.getSelectedNode = getSelectedNode;
40
+ this.isFocusOnTree = isFocusOnTree;
41
+ this.keyboardSupport = keyboardSupport;
42
+ this.openNode = openNode;
43
+ this.originalSelectNode = selectNode;
44
+
45
+ if (keyboardSupport) {
46
+ this.handleKeyDownHandler = this.handleKeyDown.bind(this);
47
+
48
+ document.addEventListener("keydown", this.handleKeyDownHandler);
17
49
  }
18
50
  }
19
51
 
20
52
  public deinit(): void {
21
- jQuery(document).off("keydown.jqtree");
53
+ if (this.handleKeyDownHandler) {
54
+ document.removeEventListener("keydown", this.handleKeyDownHandler);
55
+ }
22
56
  }
23
57
 
24
58
  public moveDown(selectedNode: Node): boolean {
@@ -39,7 +73,7 @@ export default class KeyHandler {
39
73
  return this.selectNode(selectedNode.getNextVisibleNode());
40
74
  } else {
41
75
  // Right expands a closed node
42
- this.treeWidget.openNode(selectedNode);
76
+ this.openNode(selectedNode);
43
77
  return false;
44
78
  }
45
79
  }
@@ -48,7 +82,7 @@ export default class KeyHandler {
48
82
  public moveLeft(selectedNode: Node): boolean {
49
83
  if (selectedNode.isFolder() && selectedNode.is_open) {
50
84
  // Left on an open node closes the node
51
- this.treeWidget.closeNode(selectedNode);
85
+ this.closeNode(selectedNode);
52
86
  return false;
53
87
  } else {
54
88
  // Left on a closed or end node moves focus to the node's parent
@@ -60,43 +94,33 @@ export default class KeyHandler {
60
94
  if (!node) {
61
95
  return true;
62
96
  } else {
63
- this.treeWidget.selectNode(node);
64
-
65
- if (
66
- !this.treeWidget.scrollHandler.isScrolledIntoView(
67
- jQuery(node.element).find(".jqtree-element")
68
- )
69
- ) {
70
- this.treeWidget.scrollToNode(node);
71
- }
97
+ this.originalSelectNode(node);
72
98
 
73
99
  return false;
74
100
  }
75
101
  }
76
102
 
77
- private handleKeyDown = (e: JQuery.Event): boolean => {
103
+ private handleKeyDown = (e: KeyboardEvent): boolean => {
78
104
  if (!this.canHandleKeyboard()) {
79
105
  return true;
80
106
  }
81
107
 
82
- const selectedNode = this.treeWidget.getSelectedNode();
108
+ const selectedNode = this.getSelectedNode();
83
109
  if (!selectedNode) {
84
110
  return true;
85
111
  }
86
112
 
87
- const key = e.which;
88
-
89
- switch (key) {
90
- case KeyHandler.DOWN:
113
+ switch (e.key) {
114
+ case "ArrowDown":
91
115
  return this.moveDown(selectedNode);
92
116
 
93
- case KeyHandler.UP:
117
+ case "ArrowUp":
94
118
  return this.moveUp(selectedNode);
95
119
 
96
- case KeyHandler.RIGHT:
120
+ case "ArrowRight":
97
121
  return this.moveRight(selectedNode);
98
122
 
99
- case KeyHandler.LEFT:
123
+ case "ArrowLeft":
100
124
  return this.moveLeft(selectedNode);
101
125
 
102
126
  default:
@@ -105,9 +129,6 @@ export default class KeyHandler {
105
129
  };
106
130
 
107
131
  private canHandleKeyboard(): boolean {
108
- return (
109
- (this.treeWidget.options.keyboardSupport || false) &&
110
- this.treeWidget.selectNodeHandler.isFocusOnTree()
111
- );
132
+ return this.keyboardSupport && this.isFocusOnTree();
112
133
  }
113
134
  }
@@ -2,7 +2,7 @@
2
2
  This widget does the same a the mouse widget in jqueryui.
3
3
  */
4
4
  import SimpleWidget from "./simple.widget";
5
- import { PositionInfo } from "./types";
5
+ import { PositionInfo } from "./mouseWidgetTypes";
6
6
 
7
7
  const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({
8
8
  pageX: e.pageX,
@@ -13,7 +13,7 @@ const getPositionInfoFromMouseEvent = (e: MouseEvent): PositionInfo => ({
13
13
 
14
14
  const getPositionInfoFromTouch = (
15
15
  touch: Touch,
16
- e: TouchEvent
16
+ e: TouchEvent,
17
17
  ): PositionInfo => ({
18
18
  pageX: touch.pageX,
19
19
  pageY: touch.pageY,
@@ -144,7 +144,7 @@ abstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {
144
144
 
145
145
  private handleMouseMove(
146
146
  e: MouseEvent | TouchEvent,
147
- positionInfo: PositionInfo
147
+ positionInfo: PositionInfo,
148
148
  ): void {
149
149
  if (this.isMouseStarted) {
150
150
  this.mouseDrag(positionInfo);
@@ -0,0 +1,6 @@
1
+ export interface PositionInfo {
2
+ pageX: number | undefined;
3
+ pageY: number | undefined;
4
+ target: HTMLElement;
5
+ originalEvent: Event;
6
+ }