jqtree 1.7.3 → 1.7.5

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 (170) hide show
  1. package/.eslintrc +5 -1
  2. package/.github/workflows/static.yml +57 -0
  3. package/bower.json +1 -1
  4. package/css/jqtree.postcss +4 -0
  5. package/docs/.ruby-version +1 -0
  6. package/docs/Gemfile +5 -2
  7. package/docs/Gemfile.lock +30 -210
  8. package/docs/_config.yml +110 -10
  9. package/docs/_entries/{10_changelog.md → general/changelog.md} +11 -1
  10. package/docs/_entries/multiple_selection/get-selected-nodes.md +10 -0
  11. package/docs/package.json +1 -1
  12. package/docs/pnpm-lock.yaml +30 -30
  13. package/jqtree.css +4 -0
  14. package/lib/dataLoader.js +2 -3
  15. package/lib/dragAndDropHandler.js +16 -14
  16. package/lib/elementsRenderer.js +2 -3
  17. package/lib/keyHandler.js +1 -5
  18. package/lib/mouse.widget.js +1 -2
  19. package/lib/node.js +30 -39
  20. package/lib/nodeElement.js +3 -6
  21. package/lib/nodeUtils.js +10 -0
  22. package/lib/playwright/coverage.js +14 -11
  23. package/lib/playwright/playwright.test.js +482 -104
  24. package/lib/playwright/testUtils.js +75 -49
  25. package/lib/saveStateHandler.js +2 -3
  26. package/lib/scrollHandler/containerScrollParent.js +160 -0
  27. package/lib/scrollHandler/createScrollParent.js +57 -0
  28. package/lib/scrollHandler/documentScrollParent.js +169 -0
  29. package/lib/scrollHandler/scrollParent.js +58 -0
  30. package/lib/scrollHandler/types.js +1 -0
  31. package/lib/scrollHandler.js +28 -207
  32. package/lib/selectNodeHandler.js +2 -3
  33. package/lib/simple.widget.js +1 -2
  34. package/lib/test/jqTree/loadOnDemand.test.js +3 -3
  35. package/lib/test/jqTree/methods.test.js +2 -1
  36. package/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +94 -0
  37. package/lib/test/node.test.js +49 -7
  38. package/lib/test/nodeUtils.test.js +20 -0
  39. package/lib/test/support/exampleData.js +1 -2
  40. package/lib/test/support/testUtil.js +3 -6
  41. package/lib/test/support/treeStructure.js +1 -2
  42. package/lib/tree.jquery.js +6 -7
  43. package/lib/util.js +4 -7
  44. package/lib/version.js +2 -3
  45. package/package.json +27 -27
  46. package/src/dragAndDropHandler.ts +39 -34
  47. package/src/keyHandler.ts +0 -8
  48. package/src/node.ts +32 -48
  49. package/src/nodeUtils.ts +10 -0
  50. package/src/playwright/playwright.test.ts +207 -15
  51. package/src/playwright/testUtils.ts +23 -15
  52. package/src/scrollHandler/containerScrollParent.ts +177 -0
  53. package/src/scrollHandler/createScrollParent.ts +50 -0
  54. package/src/scrollHandler/documentScrollParent.ts +182 -0
  55. package/src/scrollHandler/types.ts +7 -0
  56. package/src/scrollHandler.ts +25 -243
  57. package/src/test/jqTree/loadOnDemand.test.ts +2 -3
  58. package/src/test/jqTree/methods.test.ts +1 -1
  59. package/src/test/node.test.ts +84 -25
  60. package/src/test/nodeUtils.test.ts +21 -0
  61. package/src/tree.jquery.ts +27 -30
  62. package/src/version.ts +1 -1
  63. package/tree.jquery.debug.js +402 -230
  64. package/tree.jquery.debug.js.map +1 -1
  65. package/tree.jquery.js +2 -2
  66. package/tree.jquery.js.map +1 -1
  67. package/docs/_entries/insert.py +0 -46
  68. package/docs/_entries/renumber.py +0 -38
  69. package/docs/jqtree.css +0 -189
  70. package/docs/static/documentation.css +0 -1335
  71. package/docs/static/example.css +0 -63
  72. package/docs/tree.jquery.js +0 -21
  73. /package/docs/_entries/{72_events.md → events/index.md} +0 -0
  74. /package/docs/_entries/{73_tree-click.md → events/tree-click.md} +0 -0
  75. /package/docs/_entries/{74_tree-close.md → events/tree-close.md} +0 -0
  76. /package/docs/_entries/{75_tree-contextmenu.md → events/tree-contextmenu.md} +0 -0
  77. /package/docs/_entries/{76_tree-dblclick.md → events/tree-dblclick.md} +0 -0
  78. /package/docs/_entries/{77_tree-init.md → events/tree-init.md} +0 -0
  79. /package/docs/_entries/{78_tree-load-data.md → events/tree-load-data.md} +0 -0
  80. /package/docs/_entries/{79_tree-loading-data.md → events/tree-loading-data.md} +0 -0
  81. /package/docs/_entries/{80_tree-move.md → events/tree-move.md} +0 -0
  82. /package/docs/_entries/{82_tree-open.md → events/tree-open.md} +0 -0
  83. /package/docs/_entries/{81_tree-refresh.md → events/tree-refresh.md} +0 -0
  84. /package/docs/_entries/{83_tree-select.md → events/tree-select.md} +0 -0
  85. /package/docs/_entries/{43_addnodeafter.md → functions/addnodeafter.md} +0 -0
  86. /package/docs/_entries/{44_addnodebefore.md → functions/addnodebefore.md} +0 -0
  87. /package/docs/_entries/{42_addparentnode.md → functions/addparentnode.md} +0 -0
  88. /package/docs/_entries/{45_appendnode.md → functions/appendnode.md} +0 -0
  89. /package/docs/_entries/{46_closenode.md → functions/closenode.md} +0 -0
  90. /package/docs/_entries/{47_destroy.md → functions/destroy.md} +0 -0
  91. /package/docs/_entries/{86_get-selected-nodes.md → functions/get-selected-nodes.md} +0 -0
  92. /package/docs/_entries/{48_getnodebycallback.md → functions/getnodebycallback.md} +0 -0
  93. /package/docs/_entries/{50_getnodebyhtmlelement.md → functions/getnodebyhtmlelement.md} +0 -0
  94. /package/docs/_entries/{49_getnodebyid.md → functions/getnodebyid.md} +0 -0
  95. /package/docs/_entries/{51_getselectednode.md → functions/getselectednode.md} +0 -0
  96. /package/docs/_entries/{52_getstate.md → functions/getstate.md} +0 -0
  97. /package/docs/_entries/{53_gettree.md → functions/gettree.md} +0 -0
  98. /package/docs/_entries/{41_functions.md → functions/index.md} +0 -0
  99. /package/docs/_entries/{87_is-node-selected.md → functions/is-node-selected.md} +0 -0
  100. /package/docs/_entries/{54_isdragging.md → functions/isdragging.md} +0 -0
  101. /package/docs/_entries/{55_loaddata.md → functions/loaddata.md} +0 -0
  102. /package/docs/_entries/{56_loaddatafromurl.md → functions/loaddatafromurl.md} +0 -0
  103. /package/docs/_entries/{57_movedown.md → functions/movedown.md} +0 -0
  104. /package/docs/_entries/{58_movenode.md → functions/movenode.md} +0 -0
  105. /package/docs/_entries/{59_moveup.md → functions/moveup.md} +0 -0
  106. /package/docs/_entries/{60_opennode.md → functions/opennode.md} +0 -0
  107. /package/docs/_entries/{61_prependnode.md → functions/prependnode.md} +0 -0
  108. /package/docs/_entries/{62_refresh.md → functions/refresh.md} +0 -0
  109. /package/docs/_entries/{63_reload.md → functions/reload.md} +0 -0
  110. /package/docs/_entries/{64_removenode.md → functions/removenode.md} +0 -0
  111. /package/docs/_entries/{66_scrolltonode.md → functions/scrolltonode.md} +0 -0
  112. /package/docs/_entries/{65_selectnode.md → functions/selectnode.md} +0 -0
  113. /package/docs/_entries/{67_setoption.md → functions/setoption.md} +0 -0
  114. /package/docs/_entries/{68_setstate.md → functions/setstate.md} +0 -0
  115. /package/docs/_entries/{69_toggle.md → functions/toggle.md} +0 -0
  116. /package/docs/_entries/{70_tojson.md → functions/tojson.md} +0 -0
  117. /package/docs/_entries/{71_updatenode.md → functions/updatenode.md} +0 -0
  118. /package/docs/_entries/{04_demo.html → general/demo.html} +0 -0
  119. /package/docs/_entries/{06_downloads.md → general/downloads.md} +0 -0
  120. /package/docs/_entries/{08_examples.md → general/examples.md} +0 -0
  121. /package/docs/_entries/{03_features.md → general/features.md} +0 -0
  122. /package/docs/_entries/{01_general.md → general/index.md} +0 -0
  123. /package/docs/_entries/{02_introduction.md → general/introduction.md} +0 -0
  124. /package/docs/_entries/{05_requirements.md → general/requirements.md} +0 -0
  125. /package/docs/_entries/{07_tutorial.md → general/tutorial.md} +0 -0
  126. /package/docs/_entries/{09_usecases.md → general/usecases.md} +0 -0
  127. /package/docs/_entries/{85_add-to-selection.md → multiple_selection/add-to-selection.md} +0 -0
  128. /package/docs/_entries/{84_multiple-selection.md → multiple_selection/index.md} +0 -0
  129. /package/docs/_entries/{88_remove-from-selection.md → multiple_selection/remove-from-selection.md} +0 -0
  130. /package/docs/_entries/{90_children.md → node/children.md} +0 -0
  131. /package/docs/_entries/{91_getdata.md → node/getdata.md} +0 -0
  132. /package/docs/_entries/{92_getlevel.md → node/getlevel.md} +0 -0
  133. /package/docs/_entries/{93_getnextnode.md → node/getnextnode.md} +0 -0
  134. /package/docs/_entries/{94_getnextsibling.md → node/getnextsibling.md} +0 -0
  135. /package/docs/_entries/{95_getnextvisiblenode.md → node/getnextvisiblenode.md} +0 -0
  136. /package/docs/_entries/{96_getpreviousnode.md → node/getpreviousnode.md} +0 -0
  137. /package/docs/_entries/{97_getprevioussibling.md → node/getprevioussibling.md} +0 -0
  138. /package/docs/_entries/{98_getpreviousvisiblenode.md → node/getpreviousvisiblenode.md} +0 -0
  139. /package/docs/_entries/{89_node-functions.md → node/index.md} +0 -0
  140. /package/docs/_entries/{99_parent.md → node/parent.md} +0 -0
  141. /package/docs/_entries/{12_animationspeed.md → options/animationspeed.md} +0 -0
  142. /package/docs/_entries/{13_autoescape.md → options/autoescape.md} +0 -0
  143. /package/docs/_entries/{14_autoopen.md → options/autoopen.md} +0 -0
  144. /package/docs/_entries/{15_buttonleft.md → options/buttonleft.md} +0 -0
  145. /package/docs/_entries/{16_closedicon.md → options/closedicon.md} +0 -0
  146. /package/docs/_entries/{19_data-url.md → options/data-url.md} +0 -0
  147. /package/docs/_entries/{17_data.md → options/data.md} +0 -0
  148. /package/docs/_entries/{18_datafilter.md → options/datafilter.md} +0 -0
  149. /package/docs/_entries/{20_draganddrop.md → options/draganddrop.md} +0 -0
  150. /package/docs/_entries/{11_options.md → options/index.md} +0 -0
  151. /package/docs/_entries/{21_keyboardsupport.md → options/keyboardsupport.md} +0 -0
  152. /package/docs/_entries/{22_oncanmove.md → options/oncanmove.md} +0 -0
  153. /package/docs/_entries/{23_oncanmoveto.md → options/oncanmoveto.md} +0 -0
  154. /package/docs/_entries/{24_oncanselectnode.md → options/oncanselectnode.md} +0 -0
  155. /package/docs/_entries/{25_oncreateli.md → options/oncreateli.md} +0 -0
  156. /package/docs/_entries/{26_ondragmove.md → options/ondragmove.md} +0 -0
  157. /package/docs/_entries/{27_ondragstop.md → options/ondragstop.md} +0 -0
  158. /package/docs/_entries/{28_onismovehandle.md → options/onismovehandle.md} +0 -0
  159. /package/docs/_entries/{29_onloadfailed.md → options/onloadfailed.md} +0 -0
  160. /package/docs/_entries/{30_onloading.md → options/onloading.md} +0 -0
  161. /package/docs/_entries/{31_openedicon.md → options/openedicon.md} +0 -0
  162. /package/docs/_entries/{32_openfolderdelay.md → options/openfolderdelay.md} +0 -0
  163. /package/docs/_entries/{33_rtl.md → options/rtl.md} +0 -0
  164. /package/docs/_entries/{34_savestate.md → options/savestate.md} +0 -0
  165. /package/docs/_entries/{35_selectable.md → options/selectable.md} +0 -0
  166. /package/docs/_entries/{36_showemptyfolder.md → options/showemptyfolder.md} +0 -0
  167. /package/docs/_entries/{37_slide.md → options/slide.md} +0 -0
  168. /package/docs/_entries/{38_start_dnd_delay.md → options/start_dnd_delay.md} +0 -0
  169. /package/docs/_entries/{39_tabindex.md → options/tabindex.md} +0 -0
  170. /package/docs/_entries/{40_usecontextmenu.md → options/usecontextmenu.md} +0 -0
@@ -159,7 +159,7 @@ describe("addChild", () => {
159
159
  expect(given.node.children).toEqual(
160
160
  expect.arrayContaining([
161
161
  expect.objectContaining({ id: 100, name: "child1" }),
162
- ])
162
+ ]),
163
163
  );
164
164
  });
165
165
 
@@ -330,7 +330,7 @@ describe("constructor", () => {
330
330
  const given = getGiven<Vars>();
331
331
 
332
332
  given("node", () =>
333
- given.params === undefined ? new Node() : new Node(given.params)
333
+ given.params === undefined ? new Node() : new Node(given.params),
334
334
  );
335
335
 
336
336
  context("without parameters", () => {
@@ -351,6 +351,10 @@ describe("constructor", () => {
351
351
  });
352
352
  expect(given.node).not.toHaveProperty("id");
353
353
  });
354
+
355
+ it("sets isEmptyFolder to false", () => {
356
+ expect(given.node.isEmptyFolder).toBe(false);
357
+ });
354
358
  });
355
359
 
356
360
  context("with an object with a name property", () => {
@@ -408,7 +412,6 @@ describe("constructor", () => {
408
412
  name: "n1",
409
413
  url: "/",
410
414
  });
411
- // todo: match object?
412
415
  expect(given.node).not.toHaveProperty("label");
413
416
  expect(given.node.children).toHaveLength(0);
414
417
  expect(given.node.parent).toBeNull();
@@ -434,10 +437,24 @@ describe("constructor", () => {
434
437
  }));
435
438
 
436
439
  it("doesn't set the children", () => {
437
- // todo: match object?
438
440
  expect(given.node.name).toBe("n1");
439
441
  expect(given.node.children).toHaveLength(0);
440
442
  });
443
+
444
+ it("sets isEmptyFolder to false", () => {
445
+ expect(given.node.isEmptyFolder).toBe(false);
446
+ });
447
+ });
448
+
449
+ context("when the data contains an empty children attribute", () => {
450
+ given("params", () => ({
451
+ name: "n1",
452
+ children: [],
453
+ }));
454
+
455
+ it("sets isEmptyFolder to true", () => {
456
+ expect(given.node.isEmptyFolder).toBe(true);
457
+ });
441
458
  });
442
459
  });
443
460
 
@@ -719,8 +736,8 @@ describe("getNodeByCallback", () => {
719
736
  it("returns the node", () => {
720
737
  expect(
721
738
  given.tree.getNodeByCallback((node) =>
722
- node.name.startsWith("chi")
723
- )
739
+ node.name.startsWith("chi"),
740
+ ),
724
741
  ).toMatchObject({
725
742
  name: "child1",
726
743
  });
@@ -776,7 +793,7 @@ describe("getNodeByNameMustExist", () => {
776
793
  context("when the node doesn't exist", () => {
777
794
  it("throws an exception", () => {
778
795
  expect(() =>
779
- given.tree.getNodeByNameMustExist("non-existing")
796
+ given.tree.getNodeByNameMustExist("non-existing"),
780
797
  ).toThrow("Node with name non-existing not found");
781
798
  });
782
799
  });
@@ -1074,16 +1091,10 @@ describe("iterate", () => {
1074
1091
  });
1075
1092
 
1076
1093
  describe("loadFromData", () => {
1077
- interface Vars {
1078
- tree: Node;
1079
- }
1080
-
1081
- const given = getGiven<Vars>();
1082
-
1083
- given("tree", () => new Node().loadFromData(exampleData));
1084
-
1085
1094
  it("creates a tree", () => {
1086
- expect(given.tree.children).toEqual([
1095
+ const tree = new Node().loadFromData(exampleData);
1096
+
1097
+ expect(tree.children).toEqual([
1087
1098
  expect.objectContaining({
1088
1099
  id: 123,
1089
1100
  intProperty: 1,
@@ -1103,6 +1114,41 @@ describe("loadFromData", () => {
1103
1114
  }),
1104
1115
  ]);
1105
1116
  });
1117
+
1118
+ it("sets isEmptyFolder to true for a node when it is has an empty children attribute", () => {
1119
+ const data = [
1120
+ {
1121
+ name: "test1",
1122
+ children: [],
1123
+ },
1124
+ ];
1125
+
1126
+ const tree = new Node().loadFromData(data);
1127
+ expect((tree.children[0] as Node).isEmptyFolder).toBe(true);
1128
+ });
1129
+
1130
+ it("sets isEmptyFolder to false for a node when it doesn't have a children attribute", () => {
1131
+ const data = [
1132
+ {
1133
+ name: "test1",
1134
+ },
1135
+ ];
1136
+
1137
+ const tree = new Node().loadFromData(data);
1138
+ expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
1139
+ });
1140
+
1141
+ it("sets isEmptyFolder to false for a node when it has a children attribute that is not empty", () => {
1142
+ const data = [
1143
+ {
1144
+ name: "test1",
1145
+ children: ["child1"],
1146
+ },
1147
+ ];
1148
+
1149
+ const tree = new Node().loadFromData(data);
1150
+ expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
1151
+ });
1106
1152
  });
1107
1153
 
1108
1154
  describe("moveNode", () => {
@@ -1125,7 +1171,7 @@ describe("moveNode", () => {
1125
1171
  context("when moving after a node", () => {
1126
1172
  it("moves the node", () => {
1127
1173
  expect(
1128
- given.tree.moveNode(given.child2, given.node2, Position.After)
1174
+ given.tree.moveNode(given.child2, given.node2, Position.After),
1129
1175
  ).toBe(true);
1130
1176
 
1131
1177
  expect(given.tree).toMatchObject({
@@ -1147,8 +1193,8 @@ describe("moveNode", () => {
1147
1193
  given.tree.moveNode(
1148
1194
  given.child2,
1149
1195
  given.tree,
1150
- Position.After
1151
- )
1196
+ Position.After,
1197
+ ),
1152
1198
  ).toBe(false);
1153
1199
  });
1154
1200
  });
@@ -1157,7 +1203,7 @@ describe("moveNode", () => {
1157
1203
  context("when moving inside a node", () => {
1158
1204
  it("moves the node", () => {
1159
1205
  expect(
1160
- given.tree.moveNode(given.child1, given.node2, Position.Inside)
1206
+ given.tree.moveNode(given.child1, given.node2, Position.Inside),
1161
1207
  ).toBe(true);
1162
1208
 
1163
1209
  expect(given.tree).toMatchObject({
@@ -1182,7 +1228,11 @@ describe("moveNode", () => {
1182
1228
  context("when moving before a node", () => {
1183
1229
  it("moves the node", () => {
1184
1230
  expect(
1185
- given.tree.moveNode(given.child2, given.child1, Position.Before)
1231
+ given.tree.moveNode(
1232
+ given.child2,
1233
+ given.child1,
1234
+ Position.Before,
1235
+ ),
1186
1236
  ).toBe(true);
1187
1237
 
1188
1238
  expect(given.tree).toMatchObject({
@@ -1206,8 +1256,8 @@ describe("moveNode", () => {
1206
1256
  given.tree.moveNode(
1207
1257
  given.child2,
1208
1258
  given.tree,
1209
- Position.Before
1210
- )
1259
+ Position.Before,
1260
+ ),
1211
1261
  ).toBe(false);
1212
1262
  });
1213
1263
  });
@@ -1216,7 +1266,7 @@ describe("moveNode", () => {
1216
1266
  context("when the moved node is a parent of the target node", () => {
1217
1267
  it("doesn't move the node", () => {
1218
1268
  expect(
1219
- given.tree.moveNode(given.node1, given.child1, Position.Before)
1269
+ given.tree.moveNode(given.node1, given.child1, Position.Before),
1220
1270
  ).toBe(false);
1221
1271
 
1222
1272
  expect(given.tree).toMatchObject({
@@ -1237,7 +1287,7 @@ describe("moveNode", () => {
1237
1287
  context("with position None", () => {
1238
1288
  it("returns false", () => {
1239
1289
  expect(
1240
- given.tree.moveNode(given.child2, given.node2, Position.None)
1290
+ given.tree.moveNode(given.child2, given.node2, Position.None),
1241
1291
  ).toBe(false);
1242
1292
  });
1243
1293
  });
@@ -1283,6 +1333,15 @@ describe("prepend", () => {
1283
1333
  });
1284
1334
  });
1285
1335
  });
1336
+
1337
+ it("sets the isEmptyFolder attribute to true when the node data has empty children", () => {
1338
+ given.node.prepend({
1339
+ name: "test1",
1340
+ children: [],
1341
+ });
1342
+
1343
+ expect((given.node.children[0] as Node).isEmptyFolder).toBe(true);
1344
+ });
1286
1345
  });
1287
1346
 
1288
1347
  describe("remove", () => {
@@ -0,0 +1,21 @@
1
+ import { isNodeRecordWithChildren } from "../nodeUtils";
2
+
3
+ describe("isNodeRecordWithChildren", () => {
4
+ it("returns true when the data is an object with the children attribute of type array", () => {
5
+ const data = {
6
+ children: [],
7
+ };
8
+
9
+ expect(isNodeRecordWithChildren(data)).toBe(true);
10
+ });
11
+
12
+ it("returns when the data is an object without the children attribute", () => {
13
+ const data = { name: "test" };
14
+
15
+ expect(isNodeRecordWithChildren(data)).toBe(false);
16
+ });
17
+
18
+ it("returns when the data is a string", () => {
19
+ expect(isNodeRecordWithChildren("test")).toBe(false);
20
+ });
21
+ });
@@ -101,7 +101,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
101
101
 
102
102
  public selectNode(
103
103
  node: Node | null,
104
- optionsParam?: SelectNodeOptions
104
+ optionsParam?: SelectNodeOptions,
105
105
  ): JQuery {
106
106
  this.doSelectNode(node, optionsParam);
107
107
  return this.element;
@@ -137,21 +137,21 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
137
137
  public loadDataFromUrl(
138
138
  param1: string | null | Node,
139
139
  param2?: Node | null | HandleFinishedLoading,
140
- param3?: HandleFinishedLoading
140
+ param3?: HandleFinishedLoading,
141
141
  ): JQuery {
142
142
  if (typeof param1 === "string") {
143
143
  // first parameter is url
144
144
  this.doLoadDataFromUrl(
145
145
  param1,
146
146
  param2 as Node | null,
147
- param3 ?? null
147
+ param3 ?? null,
148
148
  );
149
149
  } else {
150
150
  // first parameter is not url
151
151
  this.doLoadDataFromUrl(
152
152
  null,
153
153
  param1,
154
- param2 as HandleFinishedLoading | null
154
+ param2 as HandleFinishedLoading | null,
155
155
  );
156
156
  }
157
157
 
@@ -185,7 +185,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
185
185
  }
186
186
 
187
187
  public getNodeByHtmlElement(
188
- element: HTMLElement | JQuery<HTMLElement>
188
+ element: HTMLElement | JQuery<HTMLElement>,
189
189
  ): Node | null {
190
190
  return this.getNode(jQuery(element));
191
191
  }
@@ -197,7 +197,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
197
197
  public openNode(
198
198
  node: Node,
199
199
  param1?: boolean | OnFinishOpenNode,
200
- param2?: OnFinishOpenNode
200
+ param2?: OnFinishOpenNode,
201
201
  ): JQuery {
202
202
  if (!node) {
203
203
  throw Error(NODE_PARAM_IS_EMPTY);
@@ -238,7 +238,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
238
238
  if (node.isFolder() || node.isEmptyFolder) {
239
239
  new FolderElement(node, this).close(
240
240
  slide,
241
- this.options.animationSpeed
241
+ this.options.animationSpeed,
242
242
  );
243
243
 
244
244
  this.saveState();
@@ -258,7 +258,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
258
258
 
259
259
  public addNodeAfter(
260
260
  newNodeInfo: NodeData,
261
- existingNode: Node
261
+ existingNode: Node,
262
262
  ): Node | null {
263
263
  const newNode = existingNode.addAfter(newNodeInfo);
264
264
 
@@ -271,7 +271,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
271
271
 
272
272
  public addNodeBefore(
273
273
  newNodeInfo: NodeData,
274
- existingNode: Node
274
+ existingNode: Node,
275
275
  ): Node | null {
276
276
  if (!existingNode) {
277
277
  throw Error(PARAM_IS_EMPTY + "existingNode");
@@ -288,7 +288,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
288
288
 
289
289
  public addParentNode(
290
290
  newNodeInfo: NodeData,
291
- existingNode: Node
291
+ existingNode: Node,
292
292
  ): Node | null {
293
293
  if (!existingNode) {
294
294
  throw Error(PARAM_IS_EMPTY + "existingNode");
@@ -417,7 +417,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
417
417
  this.selectNodeHandler.addToSelection(node);
418
418
 
419
419
  this._getNodeElementForNode(node).select(
420
- mustSetFocus === undefined ? true : mustSetFocus
420
+ mustSetFocus === undefined ? true : mustSetFocus,
421
421
  );
422
422
 
423
423
  this.saveState();
@@ -455,12 +455,8 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
455
455
  throw Error(NODE_PARAM_IS_EMPTY);
456
456
  }
457
457
 
458
- const nodeOffset = jQuery(node.element).offset();
459
- const nodeTop = nodeOffset ? nodeOffset.top : 0;
460
-
461
- const treeOffset = this.$el.offset();
462
- const treeTop = treeOffset ? treeOffset.top : 0;
463
-
458
+ const nodeTop = jQuery(node.element).offset()?.top ?? 0;
459
+ const treeTop = this.$el.offset()?.top ?? 0;
464
460
  const top = nodeTop - treeTop;
465
461
 
466
462
  this.scrollHandler.scrollToY(top);
@@ -508,7 +504,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
508
504
 
509
505
  public _triggerEvent(
510
506
  eventName: string,
511
- values?: Record<string, unknown>
507
+ values?: Record<string, unknown>,
512
508
  ): JQuery.Event {
513
509
  const event = jQuery.Event(eventName, values);
514
510
  this.element.trigger(event);
@@ -518,18 +514,18 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
518
514
  public _openNode(
519
515
  node: Node,
520
516
  slide = true,
521
- onFinished: OnFinishOpenNode | null
517
+ onFinished: OnFinishOpenNode | null,
522
518
  ): void {
523
519
  const doOpenNode = (
524
520
  _node: Node,
525
521
  _slide: boolean,
526
- _onFinished: OnFinishOpenNode | null
522
+ _onFinished: OnFinishOpenNode | null,
527
523
  ): void => {
528
524
  const folderElement = new FolderElement(_node, this);
529
525
  folderElement.open(
530
526
  _onFinished,
531
527
  _slide,
532
- this.options.animationSpeed
528
+ this.options.animationSpeed,
533
529
  );
534
530
  };
535
531
 
@@ -660,7 +656,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
660
656
  if (this.options.dragAndDrop) {
661
657
  const result = this.dndHandler.mouseDrag(positionInfo);
662
658
 
663
- this.scrollHandler.checkScrolling();
659
+ this.scrollHandler.checkScrolling(positionInfo);
664
660
  return result;
665
661
  } else {
666
662
  return false;
@@ -669,6 +665,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
669
665
 
670
666
  protected mouseStop(positionInfo: PositionInfo): boolean {
671
667
  if (this.options.dragAndDrop) {
668
+ this.scrollHandler.stopScrolling();
672
669
  return this.dndHandler.mouseStop(positionInfo);
673
670
  } else {
674
671
  return false;
@@ -755,7 +752,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
755
752
  this.tree = new this.options.nodeClass(
756
753
  null,
757
754
  true,
758
- this.options.nodeClass
755
+ this.options.nodeClass,
759
756
  );
760
757
 
761
758
  this.selectNodeHandler.clear();
@@ -843,7 +840,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
843
840
  } else {
844
841
  this.saveStateHandler.setInitialStateOnDemand(
845
842
  state,
846
- cbFinished
843
+ cbFinished,
847
844
  );
848
845
 
849
846
  return true;
@@ -904,7 +901,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
904
901
  }
905
902
 
906
903
  private handleClick = (
907
- e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
904
+ e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>,
908
905
  ): void => {
909
906
  const clickTarget = this.getClickTarget(e.target);
910
907
 
@@ -929,7 +926,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
929
926
  };
930
927
 
931
928
  private handleDblclick = (
932
- e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
929
+ e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>,
933
930
  ): void => {
934
931
  const clickTarget = this.getClickTarget(e.target);
935
932
 
@@ -981,7 +978,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
981
978
  }
982
979
 
983
980
  private handleContextmenu = (
984
- e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>
981
+ e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>,
985
982
  ) => {
986
983
  const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");
987
984
  if ($div.length) {
@@ -1054,7 +1051,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1054
1051
 
1055
1052
  private doSelectNode(
1056
1053
  node: Node | null,
1057
- optionsParam?: SelectNodeOptions
1054
+ optionsParam?: SelectNodeOptions,
1058
1055
  ): void {
1059
1056
  const saveState = (): void => {
1060
1057
  if (this.options.saveState) {
@@ -1157,7 +1154,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1157
1154
  private doLoadDataFromUrl(
1158
1155
  urlInfoParam: string | JQuery.AjaxSettings | null,
1159
1156
  parentNode: Node | null,
1160
- onFinished: HandleFinishedLoading | null
1157
+ onFinished: HandleFinishedLoading | null,
1161
1158
  ): void {
1162
1159
  const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);
1163
1160
 
@@ -1167,7 +1164,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1167
1164
  private loadFolderOnDemand(
1168
1165
  node: Node,
1169
1166
  slide = true,
1170
- onFinished: OnFinishOpenNode | null
1167
+ onFinished: OnFinishOpenNode | null,
1171
1168
  ): void {
1172
1169
  node.is_loading = true;
1173
1170
 
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.7.3";
1
+ const version = "1.7.5";
2
2
 
3
3
  export default version;