jqtree 1.8.1 → 1.8.3

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 (222) hide show
  1. package/bower.json +1 -1
  2. package/package.json +20 -19
  3. package/src/dragAndDropHandler/generateHitAreas.ts +56 -41
  4. package/src/nodeElement/ghostDropHint.ts +3 -37
  5. package/src/nodeElement/index.ts +1 -1
  6. package/src/saveStateHandler.ts +43 -59
  7. package/src/version.ts +1 -1
  8. package/tree.jquery.debug.js +77 -104
  9. package/tree.jquery.debug.js.map +1 -1
  10. package/tree.jquery.js +2 -2
  11. package/tree.jquery.js.map +1 -1
  12. package/.editorconfig +0 -12
  13. package/.eslintrc +0 -48
  14. package/.github/workflows/ci.yml +0 -68
  15. package/.github/workflows/codeql-analysis.yml +0 -32
  16. package/.github/workflows/size.yml +0 -24
  17. package/.github/workflows/static.yml +0 -57
  18. package/.prettier +0 -3
  19. package/config/.postcssrc +0 -6
  20. package/config/babel.config.json +0 -11
  21. package/config/babel.coverage.config.json +0 -4
  22. package/config/jest.config.js +0 -24
  23. package/config/jest.polyfills.js +0 -14
  24. package/config/playwright.config.js +0 -18
  25. package/config/production +0 -6
  26. package/config/rollup.config.mjs +0 -71
  27. package/css/jqtree.postcss +0 -193
  28. package/devserver/devserver.js +0 -7
  29. package/devserver/devserver_scroll.js +0 -8
  30. package/devserver/index.html +0 -22
  31. package/devserver/test_index.html +0 -22
  32. package/devserver/test_scroll.html +0 -28
  33. package/devserver/test_scroll_container.html +0 -39
  34. package/docs/.ruby-version +0 -1
  35. package/docs/Gemfile +0 -5
  36. package/docs/Gemfile.lock +0 -82
  37. package/docs/_config.yml +0 -126
  38. package/docs/_entries/events/index.md +0 -6
  39. package/docs/_entries/events/tree-click.md +0 -37
  40. package/docs/_entries/events/tree-close.md +0 -15
  41. package/docs/_entries/events/tree-contextmenu.md +0 -21
  42. package/docs/_entries/events/tree-dblclick.md +0 -19
  43. package/docs/_entries/events/tree-init.md +0 -15
  44. package/docs/_entries/events/tree-load-data.md +0 -15
  45. package/docs/_entries/events/tree-loading-data.md +0 -27
  46. package/docs/_entries/events/tree-move.md +0 -73
  47. package/docs/_entries/events/tree-open.md +0 -15
  48. package/docs/_entries/events/tree-refresh.md +0 -12
  49. package/docs/_entries/events/tree-select.md +0 -28
  50. package/docs/_entries/functions/addnodeafter.md +0 -20
  51. package/docs/_entries/functions/addnodebefore.md +0 -8
  52. package/docs/_entries/functions/addparentnode.md +0 -20
  53. package/docs/_entries/functions/appendnode.md +0 -50
  54. package/docs/_entries/functions/closenode.md +0 -23
  55. package/docs/_entries/functions/destroy.md +0 -12
  56. package/docs/_entries/functions/getnodebycallback.md +0 -24
  57. package/docs/_entries/functions/getnodebyhtmlelement.md +0 -29
  58. package/docs/_entries/functions/getnodebyid.md +0 -21
  59. package/docs/_entries/functions/getselectednode.md +0 -10
  60. package/docs/_entries/functions/getstate.md +0 -19
  61. package/docs/_entries/functions/gettree.md +0 -12
  62. package/docs/_entries/functions/index.md +0 -6
  63. package/docs/_entries/functions/is-node-selected.md +0 -11
  64. package/docs/_entries/functions/isdragging.md +0 -12
  65. package/docs/_entries/functions/loaddata.md +0 -46
  66. package/docs/_entries/functions/loaddatafromurl.md +0 -55
  67. package/docs/_entries/functions/movedown.md +0 -8
  68. package/docs/_entries/functions/movenode.md +0 -15
  69. package/docs/_entries/functions/moveup.md +0 -8
  70. package/docs/_entries/functions/opennode.md +0 -44
  71. package/docs/_entries/functions/prependnode.md +0 -21
  72. package/docs/_entries/functions/refresh.md +0 -12
  73. package/docs/_entries/functions/reload.md +0 -22
  74. package/docs/_entries/functions/removenode.md +0 -12
  75. package/docs/_entries/functions/scrolltonode.md +0 -13
  76. package/docs/_entries/functions/selectnode.md +0 -45
  77. package/docs/_entries/functions/setoption.md +0 -12
  78. package/docs/_entries/functions/setstate.md +0 -8
  79. package/docs/_entries/functions/toggle.md +0 -25
  80. package/docs/_entries/functions/tojson.md +0 -13
  81. package/docs/_entries/functions/updatenode.md +0 -50
  82. package/docs/_entries/general/changelog.md +0 -430
  83. package/docs/_entries/general/demo.html +0 -28
  84. package/docs/_entries/general/downloads.md +0 -9
  85. package/docs/_entries/general/examples.md +0 -8
  86. package/docs/_entries/general/features.md +0 -15
  87. package/docs/_entries/general/index.md +0 -7
  88. package/docs/_entries/general/introduction.md +0 -9
  89. package/docs/_entries/general/requirements.md +0 -6
  90. package/docs/_entries/general/tutorial.md +0 -71
  91. package/docs/_entries/general/usecases.md +0 -15
  92. package/docs/_entries/multiple_selection/add-to-selection.md +0 -21
  93. package/docs/_entries/multiple_selection/get-selected-nodes.md +0 -10
  94. package/docs/_entries/multiple_selection/index.md +0 -9
  95. package/docs/_entries/multiple_selection/remove-from-selection.md +0 -11
  96. package/docs/_entries/node/children.md +0 -12
  97. package/docs/_entries/node/getdata.md +0 -17
  98. package/docs/_entries/node/getlevel.md +0 -13
  99. package/docs/_entries/node/getnextnode.md +0 -12
  100. package/docs/_entries/node/getnextsibling.md +0 -10
  101. package/docs/_entries/node/getnextvisiblenode.md +0 -15
  102. package/docs/_entries/node/getpreviousnode.md +0 -12
  103. package/docs/_entries/node/getprevioussibling.md +0 -10
  104. package/docs/_entries/node/getpreviousvisiblenode.md +0 -15
  105. package/docs/_entries/node/index.md +0 -13
  106. package/docs/_entries/node/parent.md +0 -10
  107. package/docs/_entries/options/animationspeed.md +0 -7
  108. package/docs/_entries/options/autoescape.md +0 -6
  109. package/docs/_entries/options/autoopen.md +0 -28
  110. package/docs/_entries/options/buttonleft.md +0 -12
  111. package/docs/_entries/options/closedicon.md +0 -26
  112. package/docs/_entries/options/data-url.md +0 -45
  113. package/docs/_entries/options/data.md +0 -46
  114. package/docs/_entries/options/datafilter.md +0 -17
  115. package/docs/_entries/options/draganddrop.md +0 -18
  116. package/docs/_entries/options/index.md +0 -6
  117. package/docs/_entries/options/keyboardsupport.md +0 -14
  118. package/docs/_entries/options/oncanmove.md +0 -22
  119. package/docs/_entries/options/oncanmoveto.md +0 -22
  120. package/docs/_entries/options/oncanselectnode.md +0 -26
  121. package/docs/_entries/options/oncreateli.md +0 -22
  122. package/docs/_entries/options/ondragmove.md +0 -20
  123. package/docs/_entries/options/ondragstop.md +0 -20
  124. package/docs/_entries/options/onismovehandle.md +0 -17
  125. package/docs/_entries/options/onloadfailed.md +0 -15
  126. package/docs/_entries/options/onloading.md +0 -22
  127. package/docs/_entries/options/openedicon.md +0 -26
  128. package/docs/_entries/options/openfolderdelay.md +0 -15
  129. package/docs/_entries/options/rtl.md +0 -18
  130. package/docs/_entries/options/savestate.md +0 -39
  131. package/docs/_entries/options/selectable.md +0 -18
  132. package/docs/_entries/options/showemptyfolder.md +0 -26
  133. package/docs/_entries/options/slide.md +0 -12
  134. package/docs/_entries/options/start_dnd_delay.md +0 -13
  135. package/docs/_entries/options/tabindex.md +0 -14
  136. package/docs/_entries/options/usecontextmenu.md +0 -14
  137. package/docs/_examples/01_load_json_data.html +0 -45
  138. package/docs/_examples/02_load_json_data_from_server.html +0 -29
  139. package/docs/_examples/03_drag_and_drop.html +0 -42
  140. package/docs/_examples/04_save_state.html +0 -46
  141. package/docs/_examples/05_load_on_demand.html +0 -68
  142. package/docs/_examples/06_autoescape.html +0 -45
  143. package/docs/_examples/07_autoscroll.html +0 -42
  144. package/docs/_examples/08_multiple_select.html +0 -60
  145. package/docs/_examples/09_custom_html.html +0 -61
  146. package/docs/_examples/10_icon_buttons.html +0 -26
  147. package/docs/_examples/11_right-to-left.html +0 -25
  148. package/docs/_examples/12_button_on_right.html +0 -26
  149. package/docs/_examples/13_drag_outside.html +0 -48
  150. package/docs/_examples/14_filter.html +0 -111
  151. package/docs/_layouts/example.html +0 -7
  152. package/docs/_layouts/page.html +0 -26
  153. package/docs/documentation.css +0 -3
  154. package/docs/index.html +0 -65
  155. package/docs/package.json +0 -22
  156. package/docs/pnpm-lock.yaml +0 -892
  157. package/docs/postcss.config.js +0 -7
  158. package/docs/static/bower.json +0 -8
  159. package/docs/static/bower_components/fontawesome/css/all.min.css +0 -9
  160. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  161. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  162. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  163. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  164. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  165. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  166. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  167. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  168. package/docs/static/bower_components/jquery/dist/jquery.js +0 -10704
  169. package/docs/static/bower_components/jquery/dist/jquery.min.js +0 -2
  170. package/docs/static/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -1061
  171. package/docs/static/documentation.js +0 -26
  172. package/docs/static/example.postcss +0 -68
  173. package/docs/static/example_data.js +0 -122
  174. package/docs/static/examples/autoescape.js +0 -17
  175. package/docs/static/examples/autoscroll.js +0 -6
  176. package/docs/static/examples/button-on-right.js +0 -13
  177. package/docs/static/examples/custom_html.js +0 -27
  178. package/docs/static/examples/drag-outside.js +0 -37
  179. package/docs/static/examples/drag_and_drop.js +0 -13
  180. package/docs/static/examples/filter.js +0 -63
  181. package/docs/static/examples/icon_buttons.js +0 -12
  182. package/docs/static/examples/load_json_data.js +0 -16
  183. package/docs/static/examples/load_json_data_from_server.js +0 -9
  184. package/docs/static/examples/load_on_demand.js +0 -19
  185. package/docs/static/examples/multiple_select.js +0 -23
  186. package/docs/static/examples/right-to-left.js +0 -11
  187. package/docs/static/examples/save_state.js +0 -11
  188. package/docs/static/monokai.css +0 -70
  189. package/docs/static/spinner.gif +0 -0
  190. package/docs/tailwind.config.js +0 -16
  191. package/sitemap.txt +0 -14
  192. package/src/playwright/.eslintrc +0 -5
  193. package/src/playwright/coverage.ts +0 -38
  194. package/src/playwright/playwright.test.ts +0 -401
  195. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
  196. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
  197. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
  198. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
  199. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
  200. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
  201. package/src/playwright/testUtils.ts +0 -153
  202. package/src/test/.eslintrc +0 -17
  203. package/src/test/global.d.ts +0 -1
  204. package/src/test/jqTree/accessibility.test.ts +0 -25
  205. package/src/test/jqTree/create.test.ts +0 -54
  206. package/src/test/jqTree/events.test.ts +0 -290
  207. package/src/test/jqTree/keyboard.test.ts +0 -247
  208. package/src/test/jqTree/loadOnDemand.test.ts +0 -198
  209. package/src/test/jqTree/methods.test.ts +0 -1491
  210. package/src/test/jqTree/mouse.test.ts +0 -82
  211. package/src/test/jqTree/options.test.ts +0 -595
  212. package/src/test/node.test.ts +0 -1396
  213. package/src/test/nodeUtils.test.ts +0 -21
  214. package/src/test/position.test.ts +0 -30
  215. package/src/test/support/exampleData.ts +0 -23
  216. package/src/test/support/jqTreeMatchers.ts +0 -68
  217. package/src/test/support/matchers.d.ts +0 -31
  218. package/src/test/support/setupTests.ts +0 -5
  219. package/src/test/support/testUtil.ts +0 -30
  220. package/src/test/support/treeStructure.ts +0 -39
  221. package/src/test/util.test.ts +0 -27
  222. package/tsconfig.json +0 -24
package/bower.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jqTree",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "main": [
5
5
  "jqtree.css",
6
6
  "jqtree-circle.png",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jqtree",
3
- "version": "1.8.1",
3
+ "version": "1.8.3",
4
4
  "description": "Tree widget for jQuery",
5
5
  "keywords": [
6
6
  "jquery-plugin",
@@ -35,11 +35,12 @@
35
35
  "jquery": "^3"
36
36
  },
37
37
  "devDependencies": {
38
- "@babel/cli": "^7.23.9",
39
- "@babel/core": "^7.23.9",
40
- "@babel/preset-env": "^7.23.9",
41
- "@babel/preset-typescript": "^7.23.3",
42
- "@playwright/test": "^1.41.2",
38
+ "@babel/cli": "^7.24.1",
39
+ "@babel/core": "^7.24.4",
40
+ "@babel/preset-env": "^7.24.4",
41
+ "@babel/preset-typescript": "^7.24.1",
42
+ "@codecov/rollup-plugin": "0.0.1-beta.5",
43
+ "@playwright/test": "^1.43.0",
43
44
  "@rollup/plugin-babel": "^6.0.4",
44
45
  "@rollup/plugin-node-resolve": "^15.2.3",
45
46
  "@rollup/plugin-terser": "^0.4.4",
@@ -49,17 +50,17 @@
49
50
  "@types/jest": "^29.5.12",
50
51
  "@types/jest-axe": "^3.5.9",
51
52
  "@types/jquery": "^3.5.29",
52
- "@types/node": "^20.11.19",
53
- "@typescript-eslint/eslint-plugin": "^7.0.1",
54
- "@typescript-eslint/parser": "^7.0.1",
55
- "autoprefixer": "^10.4.17",
53
+ "@types/node": "^20.12.5",
54
+ "@typescript-eslint/eslint-plugin": "^7.5.0",
55
+ "@typescript-eslint/parser": "^7.5.0",
56
+ "autoprefixer": "^10.4.19",
56
57
  "babel-jest": "^29.7.0",
57
58
  "babel-plugin-istanbul": "^6.1.1",
58
- "eslint": "^8.56.0",
59
+ "eslint": "^8.57.0",
59
60
  "eslint-import-resolver-typescript": "^3.6.1",
60
61
  "eslint-plugin-import": "^2.29.1",
61
62
  "eslint-plugin-jest": "^27.9.0",
62
- "eslint-plugin-playwright": "^1.1.2",
63
+ "eslint-plugin-playwright": "^1.5.4",
63
64
  "eslint-plugin-testing-library": "^6.2.0",
64
65
  "givens": "^1.3.9",
65
66
  "graphql": "^16.8.1",
@@ -68,18 +69,18 @@
68
69
  "jest-environment-jsdom": "^29.7.0",
69
70
  "jest-extended": "^4.0.2",
70
71
  "jsonfile": "^6.1.0",
71
- "lodash.template": "^4.5.0",
72
- "msw": "^2.2.1",
73
- "postcss": "^8.4.35",
72
+ "lodash": "^4.17.21",
73
+ "msw": "^2.2.13",
74
+ "postcss": "^8.4.38",
74
75
  "postcss-cli": "^11.0.0",
75
- "postcss-import": "^16.0.1",
76
+ "postcss-import": "^16.1.0",
76
77
  "postcss-load-config": "^5.0.3",
77
78
  "postcss-nested": "^6.0.1",
78
79
  "prettier": "^3.2.5",
79
- "rollup": "^4.12.0",
80
+ "rollup": "^4.14.0",
80
81
  "rollup-plugin-serve": "^3.0.0",
81
82
  "tslib": "^2.6.2",
82
- "typescript": "^5.3.3",
83
- "undici": "^5.28.3"
83
+ "typescript": "^5.4.4",
84
+ "undici": "^5.28.4"
84
85
  }
85
86
  }
@@ -4,28 +4,34 @@ import { Position } from "../position";
4
4
  import { getOffsetTop } from "../util";
5
5
  import iterateVisibleNodes from "./iterateVisibleNodes";
6
6
 
7
- const generatePositions = (tree: Node, currentNode: Node): HitArea[] => {
8
- const positions: HitArea[] = [];
7
+ interface HitPosition {
8
+ top: number;
9
+ node: Node;
10
+ position: Position;
11
+ }
12
+
13
+ export const generateHitPositions = (
14
+ tree: Node,
15
+ currentNode: Node,
16
+ ): HitPosition[] => {
17
+ const hitPositions: HitPosition[] = [];
9
18
  let lastTop = 0;
10
19
 
11
- const addPosition = (node: Node, position: number, top: number) => {
12
- const area = {
20
+ const addHitPosition = (node: Node, position: number, top: number) => {
21
+ hitPositions.push({
13
22
  top,
14
- bottom: 0,
15
23
  node,
16
24
  position,
17
- };
18
-
19
- positions.push(area);
25
+ });
20
26
  lastTop = top;
21
27
  };
22
28
 
23
29
  const handleAfterOpenFolder = (node: Node, nextNode: Node | null) => {
24
30
  if (node === currentNode || nextNode === currentNode) {
25
31
  // Cannot move before or after current item
26
- addPosition(node, Position.None, lastTop);
32
+ addHitPosition(node, Position.None, lastTop);
27
33
  } else {
28
- addPosition(node, Position.After, lastTop);
34
+ addHitPosition(node, Position.After, lastTop);
29
35
  }
30
36
  };
31
37
 
@@ -38,20 +44,20 @@ const generatePositions = (tree: Node, currentNode: Node): HitArea[] => {
38
44
 
39
45
  if (node === currentNode) {
40
46
  // Cannot move after current item
41
- addPosition(node, Position.None, top);
47
+ addHitPosition(node, Position.None, top);
42
48
  } else {
43
- addPosition(node, Position.Inside, top);
49
+ addHitPosition(node, Position.Inside, top);
44
50
 
45
51
  // Cannot move before current item
46
52
  if (nextNode !== currentNode) {
47
- addPosition(node, Position.After, top);
53
+ addHitPosition(node, Position.After, top);
48
54
  }
49
55
  }
50
56
  };
51
57
 
52
58
  const handleFirstNode = (node: Node) => {
53
59
  if (node !== currentNode) {
54
- addPosition(node, Position.Before, getOffsetTop(node.element));
60
+ addHitPosition(node, Position.Before, getOffsetTop(node.element));
55
61
  }
56
62
  };
57
63
 
@@ -64,29 +70,40 @@ const generatePositions = (tree: Node, currentNode: Node): HitArea[] => {
64
70
 
65
71
  if (node === currentNode) {
66
72
  // Cannot move inside current item
67
- addPosition(node, Position.None, top);
73
+ addHitPosition(node, Position.None, top);
68
74
  } else {
69
- addPosition(node, Position.Inside, top);
75
+ addHitPosition(node, Position.Inside, top);
70
76
  }
71
77
 
72
78
  if (nextNode === currentNode || node === currentNode) {
73
79
  // Cannot move before or after current item
74
- addPosition(node, Position.None, top);
80
+ addHitPosition(node, Position.None, top);
75
81
  } else {
76
- addPosition(node, Position.After, top);
82
+ addHitPosition(node, Position.After, top);
77
83
  }
78
84
  };
79
85
 
80
86
  const handleOpenFolder = (node: Node, element: HTMLElement) => {
81
87
  if (node === currentNode) {
82
88
  // Cannot move inside current item
89
+
90
+ // Dnd over the current element is not possible: add a position with type None for the top and the bottom.
91
+ const top = getOffsetTop(element);
92
+ const height = element.clientHeight;
93
+ addHitPosition(node, Position.None, top);
94
+
95
+ if (height > 5) {
96
+ // Subtract 5 pixels to allow more space for the next element.
97
+ addHitPosition(node, Position.None, top + height - 5);
98
+ }
99
+
83
100
  // Stop iterating
84
101
  return false;
85
102
  }
86
103
 
87
104
  // Cannot move before current item
88
105
  if (node.children[0] !== currentNode) {
89
- addPosition(node, Position.Inside, getOffsetTop(element));
106
+ addHitPosition(node, Position.Inside, getOffsetTop(element));
90
107
  }
91
108
 
92
109
  // Continue iterating
@@ -101,12 +118,12 @@ const generatePositions = (tree: Node, currentNode: Node): HitArea[] => {
101
118
  handleOpenFolder,
102
119
  });
103
120
 
104
- return positions;
121
+ return hitPositions;
105
122
  };
106
123
 
107
- const generateHitAreasForGroup = (
124
+ export const generateHitAreasForGroup = (
108
125
  hitAreas: HitArea[],
109
- positionsInGroup: HitArea[],
126
+ positionsInGroup: HitPosition[],
110
127
  top: number,
111
128
  bottom: number,
112
129
  ) => {
@@ -116,11 +133,10 @@ const generateHitAreasForGroup = (
116
133
  const areaHeight = Math.round((bottom - top) / positionCount);
117
134
  let areaTop = top;
118
135
 
119
- let i = 0;
120
- while (i < positionCount) {
121
- const position = positionsInGroup[i];
136
+ for (let i = 0; i < positionCount; i++) {
137
+ const position = positionsInGroup[i] as HitPosition;
122
138
 
123
- if (position) {
139
+ if (position.position !== Position.None) {
124
140
  hitAreas.push({
125
141
  top: areaTop,
126
142
  bottom: areaTop + areaHeight,
@@ -130,19 +146,22 @@ const generateHitAreasForGroup = (
130
146
  }
131
147
 
132
148
  areaTop += areaHeight;
133
- i += 1;
134
149
  }
135
150
  };
136
151
 
137
- const generateHitAreasFromPositions = (
138
- positions: HitArea[],
152
+ export const generateHitAreasFromPositions = (
153
+ hitPositions: HitPosition[],
139
154
  treeBottom: number,
140
155
  ): HitArea[] => {
141
- let previousTop = positions[0]?.top ?? 0;
142
- let group = [];
156
+ if (!hitPositions.length) {
157
+ return [];
158
+ }
159
+
160
+ let previousTop = (hitPositions[0] as HitPosition).top;
161
+ let group: HitPosition[] = [];
143
162
  const hitAreas: HitArea[] = [];
144
163
 
145
- for (const position of positions) {
164
+ for (const position of hitPositions) {
146
165
  if (position.top !== previousTop && group.length) {
147
166
  generateHitAreasForGroup(
148
167
  hitAreas,
@@ -163,14 +182,10 @@ const generateHitAreasFromPositions = (
163
182
  return hitAreas;
164
183
  };
165
184
 
166
- const generateHitAreas = (
167
- tree: Node,
168
- currentNode: Node,
169
- treeBottom: number,
170
- ) => {
171
- const positions = generatePositions(tree, currentNode);
172
-
173
- return generateHitAreasFromPositions(positions, treeBottom);
174
- };
185
+ const generateHitAreas = (tree: Node, currentNode: Node, treeBottom: number) =>
186
+ generateHitAreasFromPositions(
187
+ generateHitPositions(tree, currentNode),
188
+ treeBottom,
189
+ );
175
190
 
176
191
  export default generateHitAreas;
@@ -1,55 +1,21 @@
1
- import { Node } from "../node";
2
- import { Position } from "../position";
3
1
  import { DropHint } from "../dragAndDropHandler/types";
4
2
 
5
3
  class GhostDropHint implements DropHint {
6
4
  private element: HTMLElement;
7
- private node: Node;
8
5
  private ghost: HTMLElement;
9
6
 
10
- constructor(node: Node, element: HTMLElement, position: Position) {
7
+ constructor(element: HTMLElement) {
11
8
  this.element = element;
12
- this.node = node;
13
9
  this.ghost = this.createGhostElement();
14
10
 
15
- if (position === Position.After) {
16
- this.moveAfter();
17
- } else if (position === Position.Before) {
18
- this.moveBefore();
19
- } else if (position === Position.Inside) {
20
- if (node.isFolder() && node.is_open) {
21
- this.moveInsideOpenFolder();
22
- } else {
23
- this.moveInside();
24
- }
25
- }
11
+ this.element.after(this.ghost);
12
+ this.ghost.classList.add("jqtree-inside");
26
13
  }
27
14
 
28
15
  public remove(): void {
29
16
  this.ghost.remove();
30
17
  }
31
18
 
32
- private moveAfter(): void {
33
- this.element.after(this.ghost);
34
- }
35
-
36
- private moveBefore(): void {
37
- this.element.before(this.ghost);
38
- }
39
-
40
- private moveInsideOpenFolder(): void {
41
- const childElement = this.node.children[0]?.element;
42
-
43
- if (childElement) {
44
- childElement.before(this.ghost);
45
- }
46
- }
47
-
48
- private moveInside(): void {
49
- this.element.after(this.ghost);
50
- this.ghost.classList.add("jqtree-inside");
51
- }
52
-
53
19
  private createGhostElement() {
54
20
  const ghost = document.createElement("li");
55
21
  ghost.className = "jqtree_common jqtree-ghost";
@@ -52,7 +52,7 @@ class NodeElement {
52
52
  if (this.mustShowBorderDropHint(position)) {
53
53
  return new BorderDropHint(this.element, this.getScrollLeft());
54
54
  } else {
55
- return new GhostDropHint(this.node, this.element, position);
55
+ return new GhostDropHint(this.element);
56
56
  }
57
57
  }
58
58
 
@@ -147,21 +147,54 @@ export default class SaveStateHandler {
147
147
  state: SavedState,
148
148
  cbFinished: () => void,
149
149
  ): void {
150
- if (state) {
151
- this.doSetInitialStateOnDemand(
152
- state.open_nodes,
153
- state.selected_node,
154
- cbFinished,
155
- );
156
- } else {
157
- cbFinished();
158
- }
150
+ let loadingCount = 0;
151
+ let nodeIds = state.open_nodes;
152
+
153
+ const openNodes = (): void => {
154
+ const newNodesIds = [];
155
+
156
+ for (const nodeId of nodeIds) {
157
+ const node = this.getNodeById(nodeId);
158
+
159
+ if (!node) {
160
+ newNodesIds.push(nodeId);
161
+ } else {
162
+ if (!node.is_loading) {
163
+ if (node.load_on_demand) {
164
+ loadAndOpenNode(node);
165
+ } else {
166
+ this.openNode(node, false);
167
+ }
168
+ }
169
+ }
170
+ }
171
+
172
+ nodeIds = newNodesIds;
173
+
174
+ if (this.selectInitialNodes(state.selected_node)) {
175
+ this.refreshElements(null);
176
+ }
177
+
178
+ if (loadingCount === 0) {
179
+ cbFinished();
180
+ }
181
+ };
182
+
183
+ const loadAndOpenNode = (node: Node): void => {
184
+ loadingCount += 1;
185
+ this.openNode(node, false, () => {
186
+ loadingCount -= 1;
187
+ openNodes();
188
+ });
189
+ };
190
+
191
+ openNodes();
159
192
  }
160
193
 
161
194
  public getNodeIdToBeSelected(): NodeId | null {
162
195
  const state = this.getStateFromStorage();
163
196
 
164
- if (state && state.selected_node) {
197
+ if (state?.selected_node) {
165
198
  return state.selected_node[0] || null;
166
199
  } else {
167
200
  return null;
@@ -232,55 +265,6 @@ export default class SaveStateHandler {
232
265
  });
233
266
  }
234
267
 
235
- private doSetInitialStateOnDemand(
236
- nodeIdsParam: NodeId[],
237
- selectedNodes: NodeId[],
238
- cbFinished: () => void,
239
- ): void {
240
- let loadingCount = 0;
241
- let nodeIds = nodeIdsParam;
242
-
243
- const openNodes = (): void => {
244
- const newNodesIds = [];
245
-
246
- for (const nodeId of nodeIds) {
247
- const node = this.getNodeById(nodeId);
248
-
249
- if (!node) {
250
- newNodesIds.push(nodeId);
251
- } else {
252
- if (!node.is_loading) {
253
- if (node.load_on_demand) {
254
- loadAndOpenNode(node);
255
- } else {
256
- this.openNode(node, false);
257
- }
258
- }
259
- }
260
- }
261
-
262
- nodeIds = newNodesIds;
263
-
264
- if (this.selectInitialNodes(selectedNodes)) {
265
- this.refreshElements(null);
266
- }
267
-
268
- if (loadingCount === 0) {
269
- cbFinished();
270
- }
271
- };
272
-
273
- const loadAndOpenNode = (node: Node): void => {
274
- loadingCount += 1;
275
- this.openNode(node, false, () => {
276
- loadingCount -= 1;
277
- openNodes();
278
- });
279
- };
280
-
281
- openNodes();
282
- }
283
-
284
268
  private getKeyName(): string {
285
269
  if (typeof this.saveStateOption === "string") {
286
270
  return this.saveStateOption;
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.8.1";
1
+ const version = "1.8.3";
2
2
 
3
3
  export default version;