jqtree 1.6.0 → 1.6.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 (301) hide show
  1. package/.eslintrc +3 -11
  2. package/.github/workflows/ci.yml +48 -23
  3. package/.github/workflows/codeql-analysis.yml +9 -5
  4. package/.prettier +3 -0
  5. package/README.md +11 -8
  6. package/bower.json +1 -1
  7. package/{.postcssrc → config/.postcssrc} +0 -0
  8. package/config/babel.config.json +11 -0
  9. package/config/babel.coverage.config.json +4 -0
  10. package/{jest-jsdom.config.js → config/jest.config.js} +9 -5
  11. package/config/playwright.config.js +18 -0
  12. package/config/production +4 -0
  13. package/{rollup.config.js → config/rollup.config.js} +19 -14
  14. package/{jqtree.postcss → css/jqtree.postcss} +3 -0
  15. package/devserver/index.html +1 -9
  16. package/docs/Gemfile +2 -0
  17. package/docs/Gemfile.lock +263 -0
  18. package/{_config.yml → docs/_config.yml} +8 -1
  19. package/{_entries → docs/_entries}/01_general.md +0 -0
  20. package/{_entries → docs/_entries}/02_introduction.md +0 -0
  21. package/{_entries → docs/_entries}/03_features.md +1 -1
  22. package/{_entries → docs/_entries}/04_demo.html +1 -7
  23. package/{_entries → docs/_entries}/05_requirements.md +0 -0
  24. package/{_entries → docs/_entries}/06_downloads.md +0 -0
  25. package/{_entries → docs/_entries}/07_tutorial.md +0 -0
  26. package/{_entries → docs/_entries}/08_examples.md +0 -0
  27. package/{_entries → docs/_entries}/09_usecases.md +0 -0
  28. package/{_entries → docs/_entries}/10_changelog.md +14 -0
  29. package/{_entries → docs/_entries}/11_options.md +0 -0
  30. package/{_entries → docs/_entries}/12_animationspeed.md +0 -0
  31. package/{_entries → docs/_entries}/13_autoescape.md +0 -0
  32. package/{_entries → docs/_entries}/14_autoopen.md +0 -0
  33. package/{_entries → docs/_entries}/15_buttonleft.md +0 -0
  34. package/{_entries → docs/_entries}/16_closedicon.md +0 -0
  35. package/{_entries → docs/_entries}/17_data.md +0 -0
  36. package/{_entries → docs/_entries}/18_datafilter.md +0 -0
  37. package/{_entries → docs/_entries}/19_data-url.md +0 -0
  38. package/{_entries → docs/_entries}/20_draganddrop.md +0 -0
  39. package/{_entries → docs/_entries}/21_keyboardsupport.md +0 -0
  40. package/{_entries → docs/_entries}/22_oncanmove.md +0 -0
  41. package/{_entries → docs/_entries}/23_oncanmoveto.md +2 -2
  42. package/{_entries → docs/_entries}/24_oncanselectnode.md +0 -0
  43. package/{_entries → docs/_entries}/25_oncreateli.md +2 -2
  44. package/{_entries → docs/_entries}/26_ondragmove.md +0 -0
  45. package/{_entries → docs/_entries}/27_ondragstop.md +0 -0
  46. package/{_entries → docs/_entries}/28_onismovehandle.md +0 -0
  47. package/{_entries → docs/_entries}/29_onloadfailed.md +0 -0
  48. package/{_entries → docs/_entries}/30_onloading.md +2 -2
  49. package/{_entries → docs/_entries}/31_openedicon.md +0 -0
  50. package/{_entries → docs/_entries}/32_openfolderdelay.md +2 -0
  51. package/{_entries → docs/_entries}/33_rtl.md +0 -0
  52. package/{_entries → docs/_entries}/34_savestate.md +0 -0
  53. package/{_entries → docs/_entries}/35_selectable.md +0 -0
  54. package/{_entries → docs/_entries}/36_showemptyfolder.md +0 -0
  55. package/{_entries → docs/_entries}/37_slide.md +0 -0
  56. package/{_entries → docs/_entries}/38_start_dnd_delay.md +0 -0
  57. package/{_entries → docs/_entries}/39_tabindex.md +0 -0
  58. package/{_entries → docs/_entries}/40_usecontextmenu.md +0 -0
  59. package/{_entries → docs/_entries}/41_functions.md +0 -0
  60. package/{_entries → docs/_entries}/42_addparentnode.md +1 -1
  61. package/{_entries → docs/_entries}/43_addnodeafter.md +1 -1
  62. package/{_entries → docs/_entries}/44_addnodebefore.md +1 -1
  63. package/{_entries → docs/_entries}/45_appendnode.md +5 -5
  64. package/{_entries → docs/_entries}/46_closenode.md +0 -0
  65. package/{_entries → docs/_entries}/47_destroy.md +0 -0
  66. package/{_entries → docs/_entries}/48_getnodebycallback.md +0 -0
  67. package/{_entries → docs/_entries}/49_getnodebyid.md +0 -0
  68. package/{_entries → docs/_entries}/50_getnodebyhtmlelement.md +2 -2
  69. package/{_entries → docs/_entries}/51_getselectednode.md +0 -0
  70. package/{_entries → docs/_entries}/52_getstate.md +0 -0
  71. package/{_entries → docs/_entries}/53_gettree.md +1 -1
  72. package/{_entries → docs/_entries}/54_isdragging.md +1 -1
  73. package/{_entries → docs/_entries}/55_loaddata.md +3 -3
  74. package/{_entries → docs/_entries}/56_loaddatafromurl.md +4 -4
  75. package/{_entries → docs/_entries}/57_movedown.md +0 -0
  76. package/{_entries → docs/_entries}/58_movenode.md +3 -3
  77. package/{_entries → docs/_entries}/59_moveup.md +0 -0
  78. package/{_entries → docs/_entries}/60_opennode.md +3 -3
  79. package/docs/_entries/61_prependnode.md +21 -0
  80. package/docs/_entries/62_refresh.md +12 -0
  81. package/{_entries/62_reload.md → docs/_entries/63_reload.md} +2 -2
  82. package/{_entries/63_removenode.md → docs/_entries/64_removenode.md} +0 -0
  83. package/{_entries/64_selectnode.md → docs/_entries/65_selectnode.md} +0 -0
  84. package/{_entries/65_scrolltonode.md → docs/_entries/66_scrolltonode.md} +0 -0
  85. package/{_entries/66_setoption.md → docs/_entries/67_setoption.md} +0 -0
  86. package/{_entries/67_setstate.md → docs/_entries/68_setstate.md} +0 -0
  87. package/{_entries/68_toggle.md → docs/_entries/69_toggle.md} +0 -0
  88. package/{_entries/69_tojson.md → docs/_entries/70_tojson.md} +0 -0
  89. package/{_entries/70_updatenode.md → docs/_entries/71_updatenode.md} +1 -1
  90. package/{_entries/71_events.md → docs/_entries/72_events.md} +0 -0
  91. package/{_entries/72_tree-click.md → docs/_entries/73_tree-click.md} +0 -0
  92. package/{_entries/73_tree-close.md → docs/_entries/74_tree-close.md} +0 -0
  93. package/{_entries/74_tree-contextmenu.md → docs/_entries/75_tree-contextmenu.md} +0 -0
  94. package/{_entries/75_tree-dblclick.md → docs/_entries/76_tree-dblclick.md} +0 -0
  95. package/{_entries/76_tree-init.md → docs/_entries/77_tree-init.md} +0 -0
  96. package/{_entries/77_tree-load-data.md → docs/_entries/78_tree-load-data.md} +0 -0
  97. package/{_entries/78_tree-loading-data.md → docs/_entries/79_tree-loading-data.md} +0 -0
  98. package/{_entries/79_tree-move.md → docs/_entries/80_tree-move.md} +0 -0
  99. package/{_entries/80_tree-refresh.md → docs/_entries/81_tree-refresh.md} +0 -0
  100. package/{_entries/81_tree-open.md → docs/_entries/82_tree-open.md} +0 -0
  101. package/{_entries/82_tree-select.md → docs/_entries/83_tree-select.md} +0 -0
  102. package/{_entries/83_multiple-selection.md → docs/_entries/84_multiple-selection.md} +0 -0
  103. package/{_entries/84_add-to-selection.md → docs/_entries/85_add-to-selection.md} +0 -0
  104. package/{_entries/85_get-selected-nodes.md → docs/_entries/86_get-selected-nodes.md} +0 -0
  105. package/{_entries/86_is-node-selected.md → docs/_entries/87_is-node-selected.md} +1 -1
  106. package/{_entries/87_remove-from-selection.md → docs/_entries/88_remove-from-selection.md} +0 -0
  107. package/{_entries/88_node-functions.md → docs/_entries/89_node-functions.md} +0 -0
  108. package/{_entries/89_children.md → docs/_entries/90_children.md} +0 -0
  109. package/{_entries/90_getdata.md → docs/_entries/91_getdata.md} +2 -2
  110. package/{_entries/91_getlevel.md → docs/_entries/92_getlevel.md} +0 -0
  111. package/{_entries/92_getnextnode.md → docs/_entries/93_getnextnode.md} +0 -0
  112. package/{_entries/93_getnextsibling.md → docs/_entries/94_getnextsibling.md} +0 -0
  113. package/{_entries/94_getpreviousnode.md → docs/_entries/95_getpreviousnode.md} +0 -0
  114. package/{_entries/95_getprevioussibling.md → docs/_entries/96_getprevioussibling.md} +0 -0
  115. package/{_entries/96_parent.md → docs/_entries/97_parent.md} +1 -1
  116. package/{_entries → docs/_entries}/insert.py +0 -0
  117. package/{_entries → docs/_entries}/renumber.py +0 -0
  118. package/{_examples → docs/_examples}/01_load_json_data.html +3 -5
  119. package/{_examples → docs/_examples}/02_load_json_data_from_server.html +3 -5
  120. package/{_examples → docs/_examples}/03_drag_and_drop.html +3 -5
  121. package/{_examples → docs/_examples}/04_save_state.html +3 -5
  122. package/{_examples → docs/_examples}/05_load_on_demand.html +3 -5
  123. package/{_examples → docs/_examples}/06_autoescape.html +3 -5
  124. package/{_examples → docs/_examples}/07_autoscroll.html +3 -5
  125. package/{_examples → docs/_examples}/08_multiple_select.html +3 -5
  126. package/{_examples → docs/_examples}/09_custom_html.html +3 -5
  127. package/{_examples → docs/_examples}/10_icon_buttons.html +3 -5
  128. package/{_examples → docs/_examples}/11_right-to-left.html +3 -5
  129. package/{_examples → docs/_examples}/12_button_on_right.html +3 -5
  130. package/docs/_examples/13_drag_outside.html +48 -0
  131. package/docs/_examples/14_filter.html +111 -0
  132. package/docs/_layouts/example.html +7 -0
  133. package/docs/_layouts/page.html +26 -0
  134. package/docs/documentation.css +3 -0
  135. package/docs/index.html +65 -0
  136. package/docs/jqtree.css +189 -0
  137. package/docs/package.json +22 -0
  138. package/docs/pnpm-lock.yaml +768 -0
  139. package/docs/postcss.config.js +7 -0
  140. package/docs/static/bower.json +8 -0
  141. package/docs/static/bower_components/fontawesome/css/all.min.css +5 -0
  142. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
  143. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.svg +774 -627
  144. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  145. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  146. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  147. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
  148. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.svg +93 -95
  149. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  150. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  151. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  152. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
  153. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.svg +1164 -1074
  154. package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  155. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
  156. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  157. package/{static → docs/static}/bower_components/jquery/dist/jquery.js +118 -109
  158. package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -0
  159. package/{static → docs/static}/bower_components/jquery-mockjax/dist/jquery.mockjax.js +15 -9
  160. package/docs/static/documentation.css +1313 -0
  161. package/docs/static/documentation.js +26 -0
  162. package/{static → docs/static}/example.css +14 -33
  163. package/{static → docs/static}/example.postcss +15 -32
  164. package/{static → docs/static}/example_data.js +33 -36
  165. package/{static → docs/static}/examples/autoescape.js +0 -0
  166. package/{static → docs/static}/examples/autoscroll.js +0 -0
  167. package/{static → docs/static}/examples/button-on-right.js +0 -0
  168. package/{static → docs/static}/examples/custom_html.js +5 -9
  169. package/{static → docs/static}/examples/drag-outside.js +0 -0
  170. package/{static → docs/static}/examples/drag_and_drop.js +0 -0
  171. package/docs/static/examples/filter.js +63 -0
  172. package/{static → docs/static}/examples/icon_buttons.js +0 -0
  173. package/{static → docs/static}/examples/load_json_data.js +0 -0
  174. package/{static → docs/static}/examples/load_json_data_from_server.js +0 -0
  175. package/{static → docs/static}/examples/load_on_demand.js +0 -0
  176. package/{static → docs/static}/examples/multiple_select.js +0 -0
  177. package/{static → docs/static}/examples/right-to-left.js +0 -0
  178. package/{static → docs/static}/examples/save_state.js +0 -0
  179. package/{static → docs/static}/monokai.css +0 -0
  180. package/{static → docs/static}/spinner.gif +0 -0
  181. package/docs/tailwind.config.js +16 -0
  182. package/docs/tree.jquery.js +21 -0
  183. package/jqtree.css +4 -1
  184. package/lib/dataLoader.js +146 -98
  185. package/lib/dragAndDropHandler.js +672 -470
  186. package/lib/elementsRenderer.js +282 -197
  187. package/lib/jqtreeOptions.js +1 -2
  188. package/lib/keyHandler.js +134 -87
  189. package/lib/mouse.widget.js +285 -184
  190. package/lib/node.js +691 -505
  191. package/lib/nodeElement.js +329 -205
  192. package/lib/playwright/coverage.js +140 -0
  193. package/lib/playwright/playwright.test.js +298 -179
  194. package/lib/playwright/testUtils.js +267 -0
  195. package/lib/saveStateHandler.js +311 -204
  196. package/lib/scrollHandler.js +293 -199
  197. package/lib/selectNodeHandler.js +140 -100
  198. package/lib/simple.widget.js +184 -109
  199. package/lib/test/global.d.js +3 -0
  200. package/lib/test/jqTree/create.test.js +44 -40
  201. package/lib/test/jqTree/events.test.js +186 -138
  202. package/lib/test/jqTree/keyboard.test.js +216 -199
  203. package/lib/test/jqTree/loadOnDemand.test.js +238 -157
  204. package/lib/test/jqTree/methods.test.js +1289 -1019
  205. package/lib/test/jqTree/options.test.js +491 -410
  206. package/lib/test/node.test.js +1036 -873
  207. package/lib/test/nodeUtil.test.js +21 -20
  208. package/lib/test/support/exampleData.js +35 -23
  209. package/lib/test/support/jqTreeMatchers.js +72 -54
  210. package/lib/test/support/matchers.d.js +1 -0
  211. package/lib/test/support/setupTests.js +9 -3
  212. package/lib/test/support/testUtil.js +35 -15
  213. package/lib/test/support/treeStructure.js +41 -32
  214. package/lib/test/util.test.js +21 -20
  215. package/lib/tree.jquery.d.js +1 -0
  216. package/lib/tree.jquery.js +1264 -886
  217. package/lib/types.js +1 -2
  218. package/lib/typings.d.js +2 -0
  219. package/lib/util.js +19 -8
  220. package/lib/version.js +8 -3
  221. package/package.json +54 -47
  222. package/src/dataLoader.ts +6 -6
  223. package/src/dragAndDropHandler.ts +8 -8
  224. package/src/elementsRenderer.ts +4 -0
  225. package/src/jqtreeOptions.ts +2 -2
  226. package/src/mouse.widget.ts +19 -15
  227. package/src/node.ts +27 -41
  228. package/src/nodeElement.ts +17 -9
  229. package/src/playwright/.eslintrc +5 -0
  230. package/src/playwright/coverage.ts +41 -0
  231. package/src/playwright/playwright.test.ts +75 -77
  232. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
  233. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
  234. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
  235. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
  236. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
  237. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
  238. package/src/playwright/testUtils.ts +122 -0
  239. package/src/saveStateHandler.ts +11 -6
  240. package/src/selectNodeHandler.ts +1 -1
  241. package/src/simple.widget.ts +1 -1
  242. package/src/test/.eslintrc +14 -0
  243. package/src/test/jqTree/create.test.ts +0 -1
  244. package/src/test/jqTree/events.test.ts +10 -10
  245. package/src/test/jqTree/keyboard.test.ts +0 -1
  246. package/src/test/jqTree/loadOnDemand.test.ts +56 -11
  247. package/src/test/jqTree/methods.test.ts +72 -55
  248. package/src/test/jqTree/options.test.ts +30 -33
  249. package/src/test/node.test.ts +2 -2
  250. package/src/test/support/jqTreeMatchers.ts +8 -9
  251. package/src/test/support/matchers.d.ts +2 -4
  252. package/src/test/support/setupTests.ts +2 -1
  253. package/src/tree.jquery.d.ts +19 -13
  254. package/src/tree.jquery.ts +35 -28
  255. package/src/version.ts +1 -1
  256. package/tree.jquery.debug.js +4810 -3325
  257. package/tree.jquery.debug.js.map +1 -1
  258. package/tree.jquery.js +3 -3
  259. package/tree.jquery.js.map +1 -1
  260. package/tsconfig.json +1 -0
  261. package/_entries/61_prependnode.md +0 -21
  262. package/_examples/13_drag_outside.html +0 -25
  263. package/_layouts/base.html +0 -55
  264. package/_layouts/frontpage.html +0 -20
  265. package/_layouts/page.html +0 -7
  266. package/index.html +0 -48
  267. package/jest-browser.config.js +0 -18
  268. package/jest-playwright.config.js +0 -21
  269. package/jest.config.js +0 -8
  270. package/lib/playwright/testUtil.js +0 -223
  271. package/lib/playwright/visualRegression.js +0 -128
  272. package/production +0 -5
  273. package/src/playwright/screenshots/displays_a_tree_Desktop.png +0 -0
  274. package/src/playwright/screenshots/displays_a_tree_iPhone 6.png +0 -0
  275. package/src/playwright/screenshots/moves_a_node_Desktop.png +0 -0
  276. package/src/playwright/screenshots/moves_a_node_iPhone 6.png +0 -0
  277. package/src/playwright/screenshots/opens_a_node_Desktop.png +0 -0
  278. package/src/playwright/screenshots/opens_a_node_iPhone 6.png +0 -0
  279. package/src/playwright/screenshots/selects_a_node_Desktop.png +0 -0
  280. package/src/playwright/screenshots/selects_a_node_iPhone 6.png +0 -0
  281. package/src/playwright/testUtil.ts +0 -171
  282. package/src/playwright/visualRegression.ts +0 -88
  283. package/static/bower.json +0 -9
  284. package/static/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +0 -6
  285. package/static/bower_components/bootstrap/dist/css/bootstrap.min.css +0 -6
  286. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
  287. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +0 -288
  288. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  289. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
  290. package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  291. package/static/bower_components/bootstrap/dist/js/bootstrap.min.js +0 -6
  292. package/static/bower_components/fontawesome/css/all.min.css +0 -5
  293. package/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  294. package/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  295. package/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  296. package/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  297. package/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
  298. package/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  299. package/static/bower_components/jquery/dist/jquery.min.js +0 -2
  300. package/static/documentation.css +0 -171
  301. package/static/documentation.js +0 -48
package/lib/types.js CHANGED
@@ -1,2 +1 @@
1
- "use strict";
2
- exports.__esModule = true;
1
+ "use strict";
@@ -0,0 +1,2 @@
1
+ /// <reference path="./tree.jquery.d.ts" />
2
+ "use strict";
package/lib/util.js CHANGED
@@ -1,13 +1,24 @@
1
1
  "use strict";
2
- exports.__esModule = true;
3
- exports.getBoolString = exports.isFunction = exports.isInt = void 0;
4
- var isInt = function (n) {
5
- return typeof n === "number" && n % 1 === 0;
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isInt = exports.isFunction = exports.getBoolString = void 0;
7
+
8
+ var isInt = function isInt(n) {
9
+ return typeof n === "number" && n % 1 === 0;
6
10
  };
11
+
7
12
  exports.isInt = isInt;
8
- var isFunction = function (v) { return typeof v === "function"; };
13
+
14
+ var isFunction = function isFunction(v) {
15
+ return typeof v === "function";
16
+ };
17
+
9
18
  exports.isFunction = isFunction;
10
- var getBoolString = function (value) {
11
- return value ? "true" : "false";
19
+
20
+ var getBoolString = function getBoolString(value) {
21
+ return value ? "true" : "false";
12
22
  };
13
- exports.getBoolString = getBoolString;
23
+
24
+ exports.getBoolString = getBoolString;
package/lib/version.js CHANGED
@@ -1,4 +1,9 @@
1
1
  "use strict";
2
- exports.__esModule = true;
3
- var version = "1.6.0";
4
- exports["default"] = version;
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var version = "1.6.2";
8
+ var _default = version;
9
+ exports["default"] = _default;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jqtree",
3
- "version": "1.6.0",
3
+ "version": "1.6.3",
4
4
  "description": "Tree widget for jQuery",
5
5
  "keywords": [
6
6
  "jquery-plugin",
@@ -14,61 +14,68 @@
14
14
  "url": "https://github.com/mbraak/jqtree"
15
15
  },
16
16
  "scripts": {
17
- "test": "start-server-and-test 'yarn devserver-with-coverage' http://localhost:8080 'jest --runInBand --coverage --no-cache --verbose'",
18
- "test-with-server": "jest --runInBand --coverage",
19
- "test-watch": "jest --watch",
17
+ "ci": "pnpm lint && pnpm tsc && pnpm test",
18
+ "jest": "jest --coverage --no-cache --verbose --config ./config/jest.config.js",
19
+ "jest-watch": "jest --watch",
20
20
  "lint": "eslint src/ --ext .ts,.tsx",
21
- "production": "./production",
22
- "jekyll-build": "bundle exec jekyll build",
23
- "jekyll-serve": "bundle exec jekyll serve",
24
- "devserver": "SERVE=true rollup -c -w rollup.config.js",
25
- "devserver-with-coverage": "COVERAGE=true SERVE=true rollup -c rollup.config.js",
26
- "prettier": "prettier src/*.ts src_test/*.ts --write --tab-width 4",
21
+ "production": "./config/production",
22
+ "devserver": "SERVE=true rollup --config config/rollup.config.js --watch",
23
+ "devserver-with-coverage": "COVERAGE=true SERVE=true rollup --config config/rollup.config.js",
24
+ "build-with-coverage": "COVERAGE=true rollup --config config/rollup.config.js",
25
+ "prettier": "prettier src/*.ts --write --tab-width 4",
27
26
  "coveralls": "nyc report --reporter=text-lcov | coveralls",
28
27
  "tsc": "tsc --noEmit --project tsconfig.json",
29
28
  "merge-coverage": "cp jest-coverage/coverage-final.json .nyc_output/coverage_jsdom.json",
30
- "clean-coverage": "rm -rf coverage jest-coverage .nyc_output && jest --clearCache",
31
- "print-coverage": "nyc report"
29
+ "clean-coverage": "rm -rf .nyc_output && jest --clearCache",
30
+ "print-coverage": "nyc report",
31
+ "playwright": "pnpm build-with-coverage && playwright test --config config/playwright.config.js",
32
+ "test": "pnpm jest && pnpm playwright"
32
33
  },
33
34
  "dependencies": {
34
- "jquery": ">=1.9"
35
+ "jquery": "^3.6.0"
35
36
  },
36
37
  "devDependencies": {
37
- "@rollup/plugin-typescript": "^8.0.0",
38
- "@testing-library/dom": "^7.21.7",
39
- "@types/jest": "^26.0.8",
40
- "@types/jquery": "^3.5.0",
41
- "@types/pngjs": "^6.0.0",
42
- "@typescript-eslint/eslint-plugin": "^4.0.1",
43
- "@typescript-eslint/parser": "^4.0.1",
44
- "autoprefixer": "^10.0.0",
45
- "coveralls": "^3.1.0",
46
- "eslint": "^7.3.1",
47
- "eslint-plugin-import": "^2.22.0",
48
- "eslint-plugin-jest": "^24.0.0",
49
- "expect-playwright": "^0.3.0",
50
- "givens": "^1.3.4",
51
- "jest": "^26.2.2",
52
- "jest-extended": "^0.11.5",
53
- "jest-playwright-preset": "^1.3.1",
54
- "jsonfile": "^6.0.1",
38
+ "@babel/cli": "^7.18.10",
39
+ "@babel/core": "^7.18.10",
40
+ "@babel/preset-env": "^7.18.10",
41
+ "@babel/preset-typescript": "^7.18.6",
42
+ "@playwright/test": "^1.24.2",
43
+ "@rollup/plugin-babel": "^5.3.1",
44
+ "@rollup/plugin-node-resolve": "^13.3.0",
45
+ "@testing-library/dom": "^8.16.1",
46
+ "@types/debug": "^4.1.7",
47
+ "@types/jest": "^28.1.6",
48
+ "@types/jquery": "^3.5.14",
49
+ "@typescript-eslint/eslint-plugin": "^5.32.0",
50
+ "@typescript-eslint/parser": "^5.32.0",
51
+ "autoprefixer": "^10.4.8",
52
+ "babel-jest": "^28.1.3",
53
+ "babel-plugin-istanbul": "^6.1.1",
54
+ "coveralls": "^3.1.1",
55
+ "eslint": "^8.21.0",
56
+ "eslint-plugin-import": "^2.26.0",
57
+ "eslint-plugin-jest": "^26.7.0",
58
+ "eslint-plugin-playwright": "^0.10.0",
59
+ "eslint-plugin-testing-library": "^5.6.0",
60
+ "givens": "^1.3.9",
61
+ "jest": "^28.1.3",
62
+ "jest-environment-jsdom": "^28.1.3",
63
+ "jest-extended": "^3.0.2",
64
+ "jsonfile": "^6.1.0",
55
65
  "lodash.template": "^4.5.0",
56
- "msw": "^0.26.0",
57
- "pixelmatch": "^5.2.1",
58
- "playwright": "^1.4.1",
59
- "pngjs": "^6.0.0",
60
- "postcss": "^8.0.7",
61
- "postcss-cli": "^8.0.0",
62
- "postcss-load-config": "^3.0.0",
63
- "postcss-nested": "^5.0.0",
64
- "prettier": "^2.0.5",
65
- "rollup": "^2.7.6",
66
- "rollup-plugin-istanbul2": "^2.0.2",
67
- "rollup-plugin-serve": "^1.0.4",
66
+ "msw": "^0.44.2",
67
+ "nyc": "^15.1.0",
68
+ "playwright": "^1.24.2",
69
+ "postcss": "^8.4.16",
70
+ "postcss-cli": "^10.0.0",
71
+ "postcss-import": "^14.1.0",
72
+ "postcss-load-config": "^4.0.1",
73
+ "postcss-nested": "^5.0.6",
74
+ "prettier": "^2.7.1",
75
+ "rollup": "^2.77.2",
76
+ "rollup-plugin-serve": "^2.0.0",
68
77
  "rollup-plugin-terser": "^7.0.2",
69
- "start-server-and-test": "^1.11.3",
70
- "ts-jest": "^26.1.4",
71
- "tslib": "^2.0.1",
72
- "typescript": "^4.1.2"
78
+ "tslib": "^2.4.0",
79
+ "typescript": "^4.7.4"
73
80
  }
74
81
  }
package/src/dataLoader.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { DefaultRecord, Node, NodeData } from "./node";
1
+ import { Node } from "./node";
2
2
  import { JqTreeWidget } from "./tree.jquery";
3
3
 
4
4
  export type HandleFinishedLoading = () => void;
@@ -28,7 +28,7 @@ export default class DataLoader {
28
28
  this.notifyLoading(false, parentNode, $el);
29
29
  };
30
30
 
31
- const handleSuccess = (data: any): void => {
31
+ const handleSuccess = (data: string | NodeData[]): void => {
32
32
  stopLoading();
33
33
  this.treeWidget.loadData(this.parseData(data), parentNode);
34
34
 
@@ -108,12 +108,12 @@ export default class DataLoader {
108
108
  void jQuery.ajax(ajaxSettings);
109
109
  }
110
110
 
111
- private parseData(data: NodeData): NodeData[] {
111
+ private parseData(data: string | NodeData[]): NodeData[] {
112
112
  const { dataFilter } = this.treeWidget.options;
113
113
 
114
- const getParsedData = (): unknown => {
114
+ const getParsedData = () => {
115
115
  if (typeof data === "string") {
116
- return JSON.parse(data) as unknown;
116
+ return JSON.parse(data) as NodeData[];
117
117
  } else {
118
118
  return data;
119
119
  }
@@ -124,7 +124,7 @@ export default class DataLoader {
124
124
  if (dataFilter) {
125
125
  return dataFilter(parsedData);
126
126
  } else {
127
- return parsedData as DefaultRecord[];
127
+ return parsedData;
128
128
  }
129
129
  }
130
130
  }
@@ -1,12 +1,8 @@
1
- import * as jQueryProxy from "jquery";
2
1
  import { getPositionName, Node, Position } from "./node";
3
2
  import { DropHint, HitArea, PositionInfo } from "./types";
4
3
  import { NodeElement } from "./nodeElement";
5
4
  import { JqTreeWidget } from "./tree.jquery";
6
5
 
7
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
8
- const jQuery: JQueryStatic = (<any>jQueryProxy).default || jQueryProxy;
9
-
10
6
  interface Dimensions {
11
7
  left: number;
12
8
  top: number;
@@ -316,10 +312,14 @@ export class DragAndDropHandler {
316
312
 
317
313
  this.stopOpenFolderTimer();
318
314
 
319
- this.openFolderTimer = window.setTimeout(
320
- openFolder,
321
- this.treeWidget.options.openFolderDelay
322
- );
315
+ const openFolderDelay = this.treeWidget.options.openFolderDelay;
316
+
317
+ if (openFolderDelay !== false) {
318
+ this.openFolderTimer = window.setTimeout(
319
+ openFolder,
320
+ openFolderDelay
321
+ );
322
+ }
323
323
  }
324
324
 
325
325
  private stopOpenFolderTimer(): void {
@@ -248,6 +248,10 @@ export default class ElementsRenderer {
248
248
  classes += " jqtree-title-folder";
249
249
  }
250
250
 
251
+ classes += ` jqtree-title-button-${
252
+ this.treeWidget.options.buttonLeft ? "left" : "right"
253
+ }`;
254
+
251
255
  titleSpan.className = classes;
252
256
 
253
257
  titleSpan.setAttribute("role", "treeitem");
@@ -1,4 +1,4 @@
1
- import { Node, NodeData } from "./node";
1
+ import { Node } from "./node";
2
2
 
3
3
  type CanMoveNodeTo = (
4
4
  node: Node,
@@ -40,7 +40,7 @@ export interface JQTreeOptions {
40
40
  onLoading: HandleLoadingMethod | undefined;
41
41
  onSetStateFromStorage: ((data: string) => void) | undefined;
42
42
  openedIcon: string | Element;
43
- openFolderDelay: number;
43
+ openFolderDelay: number | false;
44
44
  rtl: boolean | undefined;
45
45
  selectable: boolean;
46
46
  saveState: boolean | string;
@@ -22,7 +22,6 @@ const getPositionInfoFromTouch = (
22
22
  });
23
23
 
24
24
  abstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {
25
- public $el: JQuery<HTMLElement>;
26
25
  protected isMouseStarted: boolean;
27
26
  protected mouseDownInfo: PositionInfo | null;
28
27
  private mouseDelayTimer: number | null;
@@ -30,12 +29,15 @@ abstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {
30
29
 
31
30
  public init(): void {
32
31
  const element = this.$el.get(0);
33
- element.addEventListener("mousedown", this.mouseDown, {
34
- passive: false,
35
- });
36
- element.addEventListener("touchstart", this.touchStart, {
37
- passive: false,
38
- });
32
+
33
+ if (element) {
34
+ element.addEventListener("mousedown", this.mouseDown, {
35
+ passive: false,
36
+ });
37
+ element.addEventListener("touchstart", this.touchStart, {
38
+ passive: false,
39
+ });
40
+ }
39
41
 
40
42
  this.isMouseStarted = false;
41
43
  this.mouseDelayTimer = null;
@@ -46,15 +48,17 @@ abstract class MouseWidget<WidgetOptions> extends SimpleWidget<WidgetOptions> {
46
48
  public deinit(): void {
47
49
  const el = this.$el.get(0);
48
50
 
49
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
50
- (el as any).removeEventListener("mousedown", this.mouseDown, {
51
- passive: false,
52
- });
51
+ if (el) {
52
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
53
+ (el as any).removeEventListener("mousedown", this.mouseDown, {
54
+ passive: false,
55
+ });
53
56
 
54
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
55
- (el as any).removeEventListener("touchstart", this.touchStart, {
56
- passive: false,
57
- });
57
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
58
+ (el as any).removeEventListener("touchstart", this.touchStart, {
59
+ passive: false,
60
+ });
61
+ }
58
62
 
59
63
  this.removeMouseMoveEventListeners();
60
64
  }
package/src/node.ts CHANGED
@@ -1,7 +1,6 @@
1
- export type NodeId = number | string;
2
-
3
- export type DefaultRecord = Record<string, unknown>;
4
- export type NodeData = string | DefaultRecord;
1
+ interface NodeRecordWithChildren extends NodeRecord {
2
+ children: NodeData[];
3
+ }
5
4
 
6
5
  export enum Position {
7
6
  Before = 1,
@@ -34,6 +33,13 @@ export const getPositionName = (position: Position): string => {
34
33
  export const getPosition = (name: string): Position | undefined =>
35
34
  positionNames[name];
36
35
 
36
+ const isNodeRecordWithChildren = (
37
+ data: NodeData
38
+ ): data is NodeRecordWithChildren =>
39
+ typeof data === "object" &&
40
+ "children" in data &&
41
+ data["children"] instanceof Array;
42
+
37
43
  export class Node implements INode {
38
44
  public id?: NodeId;
39
45
  public name: string;
@@ -131,15 +137,11 @@ export class Node implements INode {
131
137
  const node = this.createNode(o);
132
138
  this.addChild(node);
133
139
 
134
- if (
135
- typeof o === "object" &&
136
- o["children"] &&
137
- o["children"] instanceof Array
138
- ) {
139
- if (o["children"].length === 0) {
140
+ if (isNodeRecordWithChildren(o)) {
141
+ if (o.children.length === 0) {
140
142
  node.isEmptyFolder = true;
141
143
  } else {
142
- node.loadFromData(o["children"]);
144
+ node.loadFromData(o.children);
143
145
  }
144
146
  }
145
147
  }
@@ -299,7 +301,7 @@ export class Node implements INode {
299
301
  /*
300
302
  Get the tree as data.
301
303
  */
302
- public getData(includeParent = false): DefaultRecord[] {
304
+ public getData(includeParent = false): NodeRecord[] {
303
305
  const getDataFromNodes = (nodes: Node[]): Record<string, unknown>[] => {
304
306
  return nodes.map((node) => {
305
307
  const tmpNode: Record<string, unknown> = {};
@@ -379,12 +381,10 @@ export class Node implements INode {
379
381
  this.parent.addChildAtPosition(node, childIndex + 1);
380
382
 
381
383
  if (
382
- typeof nodeInfo === "object" &&
383
- nodeInfo["children"] &&
384
- nodeInfo["children"] instanceof Array &&
385
- nodeInfo["children"].length
384
+ isNodeRecordWithChildren(nodeInfo) &&
385
+ nodeInfo.children.length
386
386
  ) {
387
- node.loadFromData(nodeInfo["children"]);
387
+ node.loadFromData(nodeInfo.children);
388
388
  }
389
389
 
390
390
  return node;
@@ -401,12 +401,10 @@ export class Node implements INode {
401
401
  this.parent.addChildAtPosition(node, childIndex);
402
402
 
403
403
  if (
404
- typeof nodeInfo === "object" &&
405
- nodeInfo["children"] &&
406
- nodeInfo["children"] instanceof Array &&
407
- nodeInfo["children"].length
404
+ isNodeRecordWithChildren(nodeInfo) &&
405
+ nodeInfo.children.length
408
406
  ) {
409
- node.loadFromData(nodeInfo["children"]);
407
+ node.loadFromData(nodeInfo.children);
410
408
  }
411
409
 
412
410
  return node;
@@ -445,13 +443,8 @@ export class Node implements INode {
445
443
  const node = this.createNode(nodeInfo);
446
444
  this.addChild(node);
447
445
 
448
- if (
449
- typeof nodeInfo === "object" &&
450
- nodeInfo["children"] &&
451
- nodeInfo["children"] instanceof Array &&
452
- nodeInfo["children"].length
453
- ) {
454
- node.loadFromData(nodeInfo["children"]);
446
+ if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {
447
+ node.loadFromData(nodeInfo.children);
455
448
  }
456
449
 
457
450
  return node;
@@ -461,13 +454,8 @@ export class Node implements INode {
461
454
  const node = this.createNode(nodeInfo);
462
455
  this.addChildAtPosition(node, 0);
463
456
 
464
- if (
465
- typeof nodeInfo === "object" &&
466
- nodeInfo["children"] &&
467
- nodeInfo["children"] instanceof Array &&
468
- nodeInfo["children"].length
469
- ) {
470
- node.loadFromData(nodeInfo["children"]);
457
+ if (isNodeRecordWithChildren(nodeInfo) && nodeInfo.children.length) {
458
+ node.loadFromData(nodeInfo.children);
471
459
  }
472
460
 
473
461
  return node;
@@ -641,12 +629,10 @@ export class Node implements INode {
641
629
  this.setData(nodeData);
642
630
 
643
631
  if (
644
- typeof nodeData === "object" &&
645
- nodeData["children"] &&
646
- nodeData["children"] instanceof Array &&
647
- nodeData["children"].length
632
+ isNodeRecordWithChildren(nodeData) &&
633
+ nodeData.children.length
648
634
  ) {
649
- addChildren(nodeData["children"]);
635
+ addChildren(nodeData.children);
650
636
  }
651
637
  };
652
638
 
@@ -18,10 +18,16 @@ export class NodeElement {
18
18
  this.treeWidget = treeWidget;
19
19
 
20
20
  if (!node.element) {
21
- node.element = this.treeWidget.element.get(0);
21
+ const element = this.treeWidget.element.get(0);
22
+
23
+ if (element) {
24
+ node.element = element;
25
+ }
22
26
  }
23
27
 
24
- this.$element = jQuery(node.element);
28
+ if (node.element) {
29
+ this.$element = jQuery(node.element);
30
+ }
25
31
  }
26
32
 
27
33
  public addDropHint(position: number): DropHint {
@@ -99,9 +105,8 @@ export class FolderElement extends NodeElement {
99
105
  const buttonEl = $button.get(0);
100
106
 
101
107
  if (buttonEl) {
102
- const icon = this.treeWidget.renderer.openedIconElement.cloneNode(
103
- true
104
- );
108
+ const icon =
109
+ this.treeWidget.renderer.openedIconElement.cloneNode(true);
105
110
 
106
111
  buttonEl.appendChild(icon);
107
112
  }
@@ -147,9 +152,8 @@ export class FolderElement extends NodeElement {
147
152
  const buttonEl = $button.get(0);
148
153
 
149
154
  if (buttonEl) {
150
- const icon = this.treeWidget.renderer.closedIconElement.cloneNode(
151
- true
152
- );
155
+ const icon =
156
+ this.treeWidget.renderer.closedIconElement.cloneNode(true);
153
157
 
154
158
  buttonEl.appendChild(icon);
155
159
  }
@@ -248,7 +252,11 @@ class GhostDropHint implements DropHint {
248
252
  }
249
253
 
250
254
  public moveInsideOpenFolder(): void {
251
- jQuery(this.node.children[0].element).before(this.$ghost);
255
+ const childElement = this.node.children[0].element;
256
+
257
+ if (childElement) {
258
+ jQuery(childElement).before(this.$ghost);
259
+ }
252
260
  }
253
261
 
254
262
  public moveInside(): void {
@@ -0,0 +1,5 @@
1
+ {
2
+ "extends": [
3
+ "plugin:playwright/playwright-test"
4
+ ]
5
+ }
@@ -0,0 +1,41 @@
1
+ import fs from "fs";
2
+ import path from "path";
3
+ import crypto from "crypto";
4
+ import { BrowserContext } from "@playwright/test";
5
+
6
+ const istanbulCLIOutput = path.join(process.cwd(), ".nyc_output");
7
+
8
+ const generateUUID = () => crypto.randomBytes(16).toString("hex");
9
+
10
+ export const initCoverage = async (context: BrowserContext) => {
11
+ await fs.promises.mkdir(istanbulCLIOutput, { recursive: true });
12
+
13
+ await context.exposeFunction(
14
+ "collectIstanbulCoverage",
15
+ (coverageJSON: string) => {
16
+ if (!coverageJSON) {
17
+ console.log("No coverage");
18
+ } else {
19
+ const filename = path.join(
20
+ istanbulCLIOutput,
21
+ `playwright_coverage_${generateUUID()}.json`
22
+ );
23
+ console.log(`Writing coverage to ${filename}`);
24
+ fs.writeFileSync(filename, coverageJSON);
25
+ }
26
+ }
27
+ );
28
+ };
29
+
30
+ export const saveCoverage = async (context: BrowserContext) => {
31
+ for (const page of context.pages()) {
32
+ await page.evaluate(() => {
33
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
34
+ const anyWindow = window as any;
35
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
36
+ const coverageData = anyWindow.__coverage__;
37
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access
38
+ anyWindow.collectIstanbulCoverage(JSON.stringify(coverageData));
39
+ });
40
+ }
41
+ };