jqtree 1.7.5 → 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 (90) hide show
  1. package/bower.json +1 -1
  2. package/config/babel.config.json +1 -1
  3. package/config/production +2 -0
  4. package/devserver/devserver_scroll.js +8 -0
  5. package/devserver/test_scroll.html +28 -0
  6. package/devserver/test_scroll_container.html +39 -0
  7. package/docs/_config.yml +1 -1
  8. package/docs/_entries/general/changelog.md +7 -0
  9. package/package.json +5 -1
  10. package/src/dataLoader.ts +44 -19
  11. package/src/dragAndDropHandler/dragElement.ts +42 -0
  12. package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
  13. package/src/dragAndDropHandler/index.ts +470 -0
  14. package/src/dragAndDropHandler/types.ts +12 -0
  15. package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
  16. package/src/elementsRenderer.ts +75 -40
  17. package/src/jqtreeMethodTypes.ts +40 -0
  18. package/src/jqtreeOptions.ts +43 -25
  19. package/src/keyHandler.ts +59 -30
  20. package/src/mouse.widget.ts +3 -3
  21. package/src/mouseWidgetTypes.ts +6 -0
  22. package/src/nodeElement/borderDropHint.ts +32 -0
  23. package/src/nodeElement/folderElement.ts +133 -0
  24. package/src/nodeElement/ghostDropHint.ts +68 -0
  25. package/src/nodeElement/index.ts +101 -0
  26. package/src/playwright/coverage.ts +1 -4
  27. package/src/playwright/playwright.test.ts +0 -4
  28. package/src/saveStateHandler.ts +75 -26
  29. package/src/scrollHandler.ts +13 -7
  30. package/src/selectNodeHandler.ts +10 -16
  31. package/src/test/jqTree/keyboard.test.ts +18 -23
  32. package/src/test/jqTree/methods.test.ts +32 -3
  33. package/src/test/jqTree/options.test.ts +15 -4
  34. package/src/test/node.test.ts +1 -1
  35. package/src/tree.jquery.ts +239 -57
  36. package/src/util.ts +3 -0
  37. package/src/version.ts +1 -1
  38. package/tree.jquery.debug.js +1728 -2576
  39. package/tree.jquery.debug.js.map +1 -1
  40. package/tree.jquery.js +2 -2
  41. package/tree.jquery.js.map +1 -1
  42. package/lib/dataLoader.js +0 -123
  43. package/lib/dragAndDropHandler.js +0 -588
  44. package/lib/elementsRenderer.js +0 -267
  45. package/lib/jqtreeOptions.js +0 -1
  46. package/lib/keyHandler.js +0 -111
  47. package/lib/mouse.widget.js +0 -255
  48. package/lib/node.js +0 -708
  49. package/lib/nodeElement.js +0 -274
  50. package/lib/nodeUtils.js +0 -10
  51. package/lib/playwright/coverage.js +0 -99
  52. package/lib/playwright/playwright.test.js +0 -606
  53. package/lib/playwright/testUtils.js +0 -210
  54. package/lib/saveStateHandler.js +0 -277
  55. package/lib/scrollHandler/containerScrollParent.js +0 -160
  56. package/lib/scrollHandler/createScrollParent.js +0 -57
  57. package/lib/scrollHandler/documentScrollParent.js +0 -169
  58. package/lib/scrollHandler/scrollParent.js +0 -58
  59. package/lib/scrollHandler/types.js +0 -1
  60. package/lib/scrollHandler.js +0 -71
  61. package/lib/selectNodeHandler.js +0 -128
  62. package/lib/simple.widget.js +0 -158
  63. package/lib/test/global.d.js +0 -3
  64. package/lib/test/jqTree/accessibility.test.js +0 -37
  65. package/lib/test/jqTree/create.test.js +0 -48
  66. package/lib/test/jqTree/events.test.js +0 -210
  67. package/lib/test/jqTree/keyboard.test.js +0 -225
  68. package/lib/test/jqTree/loadOnDemand.test.js +0 -218
  69. package/lib/test/jqTree/methods.test.js +0 -1348
  70. package/lib/test/jqTree/options.test.js +0 -548
  71. package/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +0 -94
  72. package/lib/test/node.test.js +0 -1202
  73. package/lib/test/nodeUtil.test.js +0 -27
  74. package/lib/test/nodeUtils.test.js +0 -20
  75. package/lib/test/support/exampleData.js +0 -35
  76. package/lib/test/support/jqTreeMatchers.js +0 -70
  77. package/lib/test/support/matchers.d.js +0 -1
  78. package/lib/test/support/setupTests.js +0 -7
  79. package/lib/test/support/testUtil.js +0 -29
  80. package/lib/test/support/treeStructure.js +0 -38
  81. package/lib/test/util.test.js +0 -26
  82. package/lib/tree.jquery.d.js +0 -1
  83. package/lib/tree.jquery.js +0 -1105
  84. package/lib/types.js +0 -1
  85. package/lib/typings.d.js +0 -2
  86. package/lib/util.js +0 -15
  87. package/lib/version.js +0 -8
  88. package/src/dragAndDropHandler.ts +0 -713
  89. package/src/nodeElement.ts +0 -272
  90. package/src/types.ts +0 -19
@@ -134,7 +134,7 @@ describe("addToSelection", () => {
134
134
  given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
135
135
  given("child2", () => given.$tree.tree("getNodeByNameMustExist", "child2"));
136
136
 
137
- beforeEach(() => {
137
+ it("selects the nodes", () => {
138
138
  given.$tree.tree({
139
139
  autoOpen: true,
140
140
  data: exampleData,
@@ -142,15 +142,21 @@ describe("addToSelection", () => {
142
142
 
143
143
  given.$tree.tree("addToSelection", given.child1);
144
144
  given.$tree.tree("addToSelection", given.child2);
145
- });
146
145
 
147
- it("selects the nodes", () => {
148
146
  expect(given.$tree.tree("getSelectedNodes")).toEqual(
149
147
  expect.arrayContaining([given.child1, given.child2]),
150
148
  );
151
149
  });
152
150
 
153
151
  it("renders the nodes correctly", () => {
152
+ given.$tree.tree({
153
+ autoOpen: true,
154
+ data: exampleData,
155
+ });
156
+
157
+ given.$tree.tree("addToSelection", given.child1);
158
+ given.$tree.tree("addToSelection", given.child2);
159
+
154
160
  expect(given.$tree).toHaveTreeStructure([
155
161
  expect.objectContaining({
156
162
  name: "node1",
@@ -172,6 +178,20 @@ describe("addToSelection", () => {
172
178
  }),
173
179
  ]);
174
180
  });
181
+
182
+ it("opens the parent node when it's closed", () => {
183
+ given.$tree.tree({
184
+ autoOpen: false,
185
+ data: exampleData,
186
+ });
187
+
188
+ const node1 = given.$tree.tree("getNodeByNameMustExist", "node1");
189
+ expect(node1.is_open).toBeFalsy();
190
+
191
+ given.$tree.tree("addToSelection", given.child1);
192
+
193
+ expect(node1.is_open).toBe(true);
194
+ });
175
195
  });
176
196
 
177
197
  describe("appendNode", () => {
@@ -1207,6 +1227,15 @@ describe("selectNode", () => {
1207
1227
  expect(given.$tree.tree("getSelectedNode")).toBeFalse();
1208
1228
  });
1209
1229
  });
1230
+
1231
+ it("opens the parent node when it's closed", () => {
1232
+ expect(given.node1.is_open).toBeFalsy();
1233
+
1234
+ const child1 = given.$tree.tree("getNodeByNameMustExist", "child1");
1235
+ given.$tree.tree("selectNode", child1);
1236
+
1237
+ expect(given.node1.is_open).toBe(true);
1238
+ });
1210
1239
  });
1211
1240
 
1212
1241
  describe("setOption", () => {
@@ -199,19 +199,30 @@ describe("closedIcon", () => {
199
199
  });
200
200
 
201
201
  it("renders a html element", () => {
202
- const closedIcon = document.createElement("span");
203
- closedIcon.className = "abc";
204
- closedIcon.textContent = "test";
202
+ const icon = document.createElement("span");
203
+ icon.className = "abc";
204
+ icon.textContent = "test";
205
205
 
206
206
  const $tree = $("#tree1");
207
207
  $tree.tree({
208
- closedIcon,
208
+ closedIcon: icon,
209
209
  data: exampleData,
210
210
  });
211
211
 
212
212
  const $span = $tree.find("a.jqtree-toggler:first span.abc");
213
213
  expect($span.text()).toBe("test");
214
214
  });
215
+
216
+ it("renders a default when the option is empty", () => {
217
+ const $tree = $("#tree1");
218
+ $tree.tree({
219
+ closedIcon: undefined,
220
+ data: exampleData,
221
+ });
222
+
223
+ const $span = $tree.find("a.jqtree-toggler:first");
224
+ expect($span.text()).toBe("►");
225
+ });
215
226
  });
216
227
 
217
228
  describe("dataUrl", () => {
@@ -349,7 +349,7 @@ describe("constructor", () => {
349
349
  children: [],
350
350
  parent: null,
351
351
  });
352
- expect(given.node).not.toHaveProperty("id");
352
+ expect(given.node.id).toBeUndefined();
353
353
  });
354
354
 
355
355
  it("sets isEmptyFolder to false", () => {
@@ -4,14 +4,16 @@ import ElementsRenderer from "./elementsRenderer";
4
4
  import DataLoader, { HandleFinishedLoading } from "./dataLoader";
5
5
  import KeyHandler from "./keyHandler";
6
6
  import MouseWidget from "./mouse.widget";
7
- import { PositionInfo } from "./types";
7
+ import { PositionInfo } from "./mouseWidgetTypes";
8
8
  import SaveStateHandler, { SavedState } from "./saveStateHandler";
9
9
  import ScrollHandler from "./scrollHandler";
10
10
  import SelectNodeHandler from "./selectNodeHandler";
11
11
  import SimpleWidget from "./simple.widget";
12
12
  import { Node, getPosition } from "./node";
13
13
  import { isFunction } from "./util";
14
- import { FolderElement, NodeElement, OnFinishOpenNode } from "./nodeElement";
14
+ import NodeElement from "./nodeElement";
15
+ import FolderElement from "./nodeElement/folderElement";
16
+ import { OnFinishOpenNode } from "./jqtreeMethodTypes";
15
17
  import { JQTreeOptions } from "./jqtreeOptions";
16
18
 
17
19
  interface ClickTarget {
@@ -185,9 +187,18 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
185
187
  }
186
188
 
187
189
  public getNodeByHtmlElement(
188
- element: HTMLElement | JQuery<HTMLElement>,
190
+ inputElement: HTMLElement | JQuery<HTMLElement>,
189
191
  ): Node | null {
190
- return this.getNode(jQuery(element));
192
+ const element =
193
+ inputElement instanceof HTMLElement
194
+ ? inputElement
195
+ : inputElement[0];
196
+
197
+ if (!element) {
198
+ return null;
199
+ }
200
+
201
+ return this.getNode(element);
191
202
  }
192
203
 
193
204
  public getNodeByCallback(callback: (node: Node) => boolean): Node | null {
@@ -203,12 +214,12 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
203
214
  throw Error(NODE_PARAM_IS_EMPTY);
204
215
  }
205
216
 
206
- const parseParams = (): [boolean, OnFinishOpenNode | null] => {
217
+ const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {
207
218
  let onFinished: OnFinishOpenNode | null;
208
219
  let slide: boolean | null;
209
220
 
210
221
  if (isFunction(param1)) {
211
- onFinished = param1 as OnFinishOpenNode | null;
222
+ onFinished = param1 as OnFinishOpenNode;
212
223
  slide = null;
213
224
  } else {
214
225
  slide = param1 as boolean;
@@ -236,7 +247,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
236
247
  const slide = slideParam ?? this.options.slide;
237
248
 
238
249
  if (node.isFolder() || node.isEmptyFolder) {
239
- new FolderElement(node, this).close(
250
+ this.createFolderElement(node).close(
240
251
  slide,
241
252
  this.options.animationSpeed,
242
253
  );
@@ -415,6 +426,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
415
426
  }
416
427
 
417
428
  this.selectNodeHandler.addToSelection(node);
429
+ this.openParents(node);
418
430
 
419
431
  this._getNodeElementForNode(node).select(
420
432
  mustSetFocus === undefined ? true : mustSetFocus,
@@ -514,14 +526,14 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
514
526
  public _openNode(
515
527
  node: Node,
516
528
  slide = true,
517
- onFinished: OnFinishOpenNode | null,
529
+ onFinished?: OnFinishOpenNode,
518
530
  ): void {
519
531
  const doOpenNode = (
520
532
  _node: Node,
521
533
  _slide: boolean,
522
- _onFinished: OnFinishOpenNode | null,
534
+ _onFinished?: OnFinishOpenNode,
523
535
  ): void => {
524
- const folderElement = new FolderElement(_node, this);
536
+ const folderElement = this.createFolderElement(_node);
525
537
  folderElement.open(
526
538
  _onFinished,
527
539
  _slide,
@@ -538,7 +550,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
538
550
  while (parent) {
539
551
  // nb: do not open root element
540
552
  if (parent.parent) {
541
- doOpenNode(parent, false, null);
553
+ doOpenNode(parent, false);
542
554
  }
543
555
  parent = parent.parent;
544
556
  }
@@ -554,7 +566,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
554
566
  from_node: redraw this subtree
555
567
  */
556
568
  public _refreshElements(fromNode: Node | null): void {
557
- const mustSetFocus = this.selectNodeHandler.isFocusOnTree();
569
+ const mustSetFocus = this.isFocusOnTree();
558
570
  const mustSelect = fromNode
559
571
  ? this.isSelectedNodeInSubtree(fromNode)
560
572
  : false;
@@ -570,14 +582,14 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
570
582
 
571
583
  public _getNodeElementForNode(node: Node): NodeElement {
572
584
  if (node.isFolder()) {
573
- return new FolderElement(node, this);
585
+ return this.createFolderElement(node);
574
586
  } else {
575
- return new NodeElement(node, this);
587
+ return this.createNodeElement(node);
576
588
  }
577
589
  }
578
590
 
579
- public _getNodeElement($element: JQuery<HTMLElement>): NodeElement | null {
580
- const node = this.getNode($element);
591
+ public _getNodeElement(element: HTMLElement): NodeElement | null {
592
+ const node = this.getNode(element);
581
593
  if (node) {
582
594
  return this._getNodeElementForNode(node);
583
595
  } else {
@@ -585,12 +597,6 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
585
597
  }
586
598
  }
587
599
 
588
- public _containsElement(element: HTMLElement): boolean {
589
- const node = this.getNode(jQuery(element));
590
-
591
- return node != null && node.tree === this.tree;
592
- }
593
-
594
600
  public _getScrollLeft(): number {
595
601
  return this.scrollHandler.getScrollLeft();
596
602
  }
@@ -607,13 +613,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
607
613
  this.options.closedIcon = this.getDefaultClosedIcon();
608
614
  }
609
615
 
610
- this.renderer = new ElementsRenderer(this);
611
- this.dataLoader = new DataLoader(this);
612
- this.saveStateHandler = new SaveStateHandler(this);
613
- this.selectNodeHandler = new SelectNodeHandler(this);
614
- this.dndHandler = new DragAndDropHandler(this);
615
- this.scrollHandler = new ScrollHandler(this);
616
- this.keyHandler = new KeyHandler(this);
616
+ this.connectHandlers();
617
617
 
618
618
  this.initData();
619
619
 
@@ -869,7 +869,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
869
869
 
870
870
  return false;
871
871
  } else {
872
- this._openNode(node, false, null);
872
+ this._openNode(node, false);
873
873
 
874
874
  return level !== maxLevel;
875
875
  }
@@ -938,13 +938,11 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
938
938
  }
939
939
  };
940
940
 
941
- private getClickTarget(element: EventTarget): ClickTarget | null {
942
- const $target = jQuery(element);
943
-
944
- const $button = $target.closest(".jqtree-toggler");
941
+ private getClickTarget(element: HTMLElement): ClickTarget | null {
942
+ const button = element.closest(".jqtree-toggler");
945
943
 
946
- if ($button.length) {
947
- const node = this.getNode($button as JQuery<HTMLElement>);
944
+ if (button) {
945
+ const node = this.getNode(button as HTMLElement);
948
946
 
949
947
  if (node) {
950
948
  return {
@@ -953,9 +951,10 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
953
951
  };
954
952
  }
955
953
  } else {
956
- const $el = $target.closest(".jqtree-element");
957
- if ($el.length) {
958
- const node = this.getNode($el as JQuery<HTMLElement>);
954
+ const jqTreeElement = element.closest(".jqtree-element");
955
+
956
+ if (jqTreeElement) {
957
+ const node = this.getNode(jqTreeElement as HTMLElement);
959
958
  if (node) {
960
959
  return {
961
960
  type: "label",
@@ -968,21 +967,23 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
968
967
  return null;
969
968
  }
970
969
 
971
- private getNode($element: JQuery<HTMLElement>): null | Node {
972
- const $li = $element.closest("li.jqtree_common");
973
- if ($li.length === 0) {
974
- return null;
970
+ private getNode(element: HTMLElement): null | Node {
971
+ const liElement = element.closest("li.jqtree_common");
972
+
973
+ if (liElement) {
974
+ return jQuery(liElement).data("node") as Node;
975
975
  } else {
976
- return $li.data("node") as Node;
976
+ return null;
977
977
  }
978
978
  }
979
979
 
980
980
  private handleContextmenu = (
981
981
  e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>,
982
982
  ) => {
983
- const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");
984
- if ($div.length) {
985
- const node = this.getNode($div);
983
+ const div = e.target.closest("ul.jqtree-tree .jqtree-element");
984
+
985
+ if (div) {
986
+ const node = this.getNode(div as HTMLElement);
986
987
  if (node) {
987
988
  e.preventDefault();
988
989
  e.stopPropagation();
@@ -1079,14 +1080,6 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1079
1080
  }
1080
1081
  };
1081
1082
 
1082
- const openParents = (): void => {
1083
- const parent = node.parent;
1084
-
1085
- if (parent && parent.parent && !parent.is_open) {
1086
- this.openNode(parent, false);
1087
- }
1088
- };
1089
-
1090
1083
  if (!canSelect()) {
1091
1084
  return;
1092
1085
  }
@@ -1108,7 +1101,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1108
1101
  node,
1109
1102
  deselected_node: deselectedNode,
1110
1103
  });
1111
- openParents();
1104
+ this.openParents(node);
1112
1105
  }
1113
1106
 
1114
1107
  saveState();
@@ -1164,7 +1157,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1164
1157
  private loadFolderOnDemand(
1165
1158
  node: Node,
1166
1159
  slide = true,
1167
- onFinished: OnFinishOpenNode | null,
1160
+ onFinished?: OnFinishOpenNode,
1168
1161
  ): void {
1169
1162
  node.is_loading = true;
1170
1163
 
@@ -1172,6 +1165,195 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1172
1165
  this._openNode(node, slide, onFinished);
1173
1166
  });
1174
1167
  }
1168
+
1169
+ private containsElement(element: HTMLElement): boolean {
1170
+ const node = this.getNode(element);
1171
+
1172
+ return node != null && node.tree === this.tree;
1173
+ }
1174
+
1175
+ private isFocusOnTree(): boolean {
1176
+ const activeElement = document.activeElement;
1177
+
1178
+ return Boolean(
1179
+ activeElement &&
1180
+ activeElement.tagName === "SPAN" &&
1181
+ this.containsElement(activeElement as HTMLElement),
1182
+ );
1183
+ }
1184
+
1185
+ private connectHandlers() {
1186
+ const {
1187
+ autoEscape,
1188
+ buttonLeft,
1189
+ closedIcon,
1190
+ dataFilter,
1191
+ dragAndDrop,
1192
+ keyboardSupport,
1193
+ onCanMove,
1194
+ onCreateLi,
1195
+ onDragMove,
1196
+ onDragStop,
1197
+ onGetStateFromStorage,
1198
+ onIsMoveHandle,
1199
+ onLoadFailed,
1200
+ onLoading,
1201
+ onSetStateFromStorage,
1202
+ openedIcon,
1203
+ openFolderDelay,
1204
+ rtl,
1205
+ saveState,
1206
+ showEmptyFolder,
1207
+ slide,
1208
+ tabIndex,
1209
+ } = this.options;
1210
+
1211
+ const closeNode = this.closeNode.bind(this);
1212
+ const getNodeElement = this._getNodeElement.bind(this);
1213
+ const getNodeElementForNode = this._getNodeElementForNode.bind(this);
1214
+ const getNodeById = this.getNodeById.bind(this);
1215
+ const getScrollLeft = this._getScrollLeft.bind(this);
1216
+ const getSelectedNode = this.getSelectedNode.bind(this);
1217
+ const getTree = this.getTree.bind(this);
1218
+ const isFocusOnTree = this.isFocusOnTree.bind(this);
1219
+ const loadData = this.loadData.bind(this);
1220
+ const openNode = this._openNode.bind(this);
1221
+ const refreshElements = this._refreshElements.bind(this);
1222
+ const refreshHitAreas = this.refreshHitAreas.bind(this);
1223
+ const selectNode = this.selectNode.bind(this);
1224
+ const $treeElement = this.element;
1225
+ const triggerEvent = this._triggerEvent.bind(this);
1226
+
1227
+ const selectNodeHandler = new SelectNodeHandler({
1228
+ getNodeById,
1229
+ });
1230
+
1231
+ const addToSelection =
1232
+ selectNodeHandler.addToSelection.bind(selectNodeHandler);
1233
+ const getSelectedNodes =
1234
+ selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);
1235
+ const isNodeSelected =
1236
+ selectNodeHandler.isNodeSelected.bind(selectNodeHandler);
1237
+ const removeFromSelection =
1238
+ selectNodeHandler.removeFromSelection.bind(selectNodeHandler);
1239
+
1240
+ const dataLoader = new DataLoader({
1241
+ dataFilter,
1242
+ loadData,
1243
+ onLoadFailed,
1244
+ onLoading,
1245
+ $treeElement,
1246
+ triggerEvent,
1247
+ });
1248
+
1249
+ const saveStateHandler = new SaveStateHandler({
1250
+ addToSelection,
1251
+ getNodeById,
1252
+ getSelectedNodes,
1253
+ getTree,
1254
+ onGetStateFromStorage,
1255
+ onSetStateFromStorage,
1256
+ openNode,
1257
+ refreshElements,
1258
+ removeFromSelection,
1259
+ saveState,
1260
+ });
1261
+
1262
+ const dndHandler = new DragAndDropHandler({
1263
+ autoEscape,
1264
+ getNodeElement,
1265
+ getNodeElementForNode,
1266
+ getScrollLeft,
1267
+ getTree,
1268
+ onCanMove,
1269
+ onDragMove,
1270
+ onDragStop,
1271
+ onIsMoveHandle,
1272
+ openFolderDelay,
1273
+ openNode,
1274
+ refreshElements,
1275
+ slide,
1276
+ $treeElement,
1277
+ triggerEvent,
1278
+ });
1279
+
1280
+ const scrollHandler = new ScrollHandler({
1281
+ refreshHitAreas,
1282
+ $treeElement,
1283
+ });
1284
+
1285
+ const keyHandler = new KeyHandler({
1286
+ closeNode,
1287
+ getSelectedNode,
1288
+ isFocusOnTree,
1289
+ keyboardSupport,
1290
+ openNode,
1291
+ selectNode,
1292
+ });
1293
+
1294
+ const renderer = new ElementsRenderer({
1295
+ autoEscape,
1296
+ buttonLeft,
1297
+ closedIcon,
1298
+ dragAndDrop,
1299
+ $element: $treeElement,
1300
+ getTree,
1301
+ isNodeSelected,
1302
+ onCreateLi,
1303
+ openedIcon,
1304
+ rtl,
1305
+ showEmptyFolder,
1306
+ tabIndex,
1307
+ });
1308
+
1309
+ this.dataLoader = dataLoader;
1310
+ this.dndHandler = dndHandler;
1311
+ this.keyHandler = keyHandler;
1312
+ this.renderer = renderer;
1313
+ this.saveStateHandler = saveStateHandler;
1314
+ this.scrollHandler = scrollHandler;
1315
+ this.selectNodeHandler = selectNodeHandler;
1316
+ }
1317
+
1318
+ private createFolderElement(node: Node) {
1319
+ const closedIconElement = this.renderer.closedIconElement;
1320
+ const getScrollLeft = this._getScrollLeft.bind(this);
1321
+ const openedIconElement = this.renderer.openedIconElement;
1322
+ const tabIndex = this.options.tabIndex;
1323
+ const $treeElement = this.element;
1324
+ const triggerEvent = this._triggerEvent.bind(this);
1325
+
1326
+ return new FolderElement({
1327
+ closedIconElement,
1328
+ getScrollLeft,
1329
+ node,
1330
+ openedIconElement,
1331
+ tabIndex,
1332
+ $treeElement,
1333
+ triggerEvent,
1334
+ });
1335
+ }
1336
+
1337
+ private createNodeElement(node: Node) {
1338
+ const getScrollLeft = this._getScrollLeft.bind(this);
1339
+ const tabIndex = this.options.tabIndex;
1340
+ const $treeElement = this.element;
1341
+
1342
+ return new NodeElement({
1343
+ getScrollLeft,
1344
+ node,
1345
+ tabIndex,
1346
+ $treeElement,
1347
+ });
1348
+ }
1349
+
1350
+ private openParents(node: Node) {
1351
+ const parent = node.parent;
1352
+
1353
+ if (parent && parent.parent && !parent.is_open) {
1354
+ this.openNode(parent, false);
1355
+ }
1356
+ }
1175
1357
  }
1176
1358
 
1177
1359
  SimpleWidget.register(JqTreeWidget, "tree");
package/src/util.ts CHANGED
@@ -5,3 +5,6 @@ export const isFunction = (v: unknown): boolean => typeof v === "function";
5
5
 
6
6
  export const getBoolString = (value: unknown): string =>
7
7
  value ? "true" : "false";
8
+
9
+ export const getOffsetTop = (element: HTMLElement) =>
10
+ element.getBoundingClientRect().y + window.scrollY;
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.7.5";
1
+ const version = "1.8.0";
2
2
 
3
3
  export default version;