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
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+ var _containerScrollParent = _interopRequireDefault(require("./containerScrollParent"));
8
+ var _documentScrollParent = _interopRequireDefault(require("./documentScrollParent"));
9
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
10
+ function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
11
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
12
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
13
+ var hasOverFlow = function hasOverFlow($element) {
14
+ for (var _i = 0, _arr = ["overflow", "overflow-y"]; _i < _arr.length; _i++) {
15
+ var attr = _arr[_i];
16
+ var overflowValue = $element.css(attr);
17
+ if (overflowValue === "auto" || overflowValue === "scroll") {
18
+ return true;
19
+ }
20
+ }
21
+ return false;
22
+ };
23
+ var getParentWithOverflow = function getParentWithOverflow($treeElement) {
24
+ if (hasOverFlow($treeElement)) {
25
+ return $treeElement;
26
+ }
27
+ var _iterator = _createForOfIteratorHelper($treeElement.parents().get()),
28
+ _step;
29
+ try {
30
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
31
+ var element = _step.value;
32
+ var $element = jQuery(element);
33
+ if (hasOverFlow($element)) {
34
+ return $element;
35
+ }
36
+ }
37
+ } catch (err) {
38
+ _iterator.e(err);
39
+ } finally {
40
+ _iterator.f();
41
+ }
42
+ return null;
43
+ };
44
+ var createScrollParent = function createScrollParent($treeElement, refreshHitAreas) {
45
+ var _$container$;
46
+ var $container = getParentWithOverflow($treeElement);
47
+ if ($container !== null && $container !== void 0 && $container.length && ((_$container$ = $container[0]) === null || _$container$ === void 0 ? void 0 : _$container$.tagName) !== "HTML") {
48
+ return new _containerScrollParent["default"]({
49
+ $container: $container,
50
+ refreshHitAreas: refreshHitAreas,
51
+ $treeElement: $treeElement
52
+ });
53
+ } else {
54
+ return new _documentScrollParent["default"]($treeElement, refreshHitAreas);
55
+ }
56
+ };
57
+ var _default = createScrollParent;
58
+ exports["default"] = _default;
@@ -0,0 +1 @@
1
+ "use strict";
@@ -4,247 +4,68 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports["default"] = void 0;
7
+ var _createScrollParent = _interopRequireDefault(require("./scrollHandler/createScrollParent"));
8
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
7
9
  function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
8
- function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
9
- function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
10
- function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
11
10
  function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
12
11
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
13
12
  function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
14
13
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
14
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
16
15
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
17
- var ScrollHandler = /*#__PURE__*/function () {
16
+ var ScrollHandler = exports["default"] = /*#__PURE__*/function () {
18
17
  function ScrollHandler(treeWidget) {
19
18
  _classCallCheck(this, ScrollHandler);
20
19
  _defineProperty(this, "treeWidget", void 0);
21
- _defineProperty(this, "previousTop", void 0);
22
- _defineProperty(this, "isInitialized", void 0);
23
- _defineProperty(this, "$scrollParent", void 0);
24
- _defineProperty(this, "scrollParentTop", void 0);
20
+ _defineProperty(this, "scrollParent", void 0);
25
21
  this.treeWidget = treeWidget;
26
- this.previousTop = -1;
27
- this.isInitialized = false;
22
+ this.scrollParent = undefined;
28
23
  }
29
24
  _createClass(ScrollHandler, [{
30
25
  key: "checkScrolling",
31
- value: function checkScrolling() {
32
- this.ensureInit();
33
- this.checkVerticalScrolling();
34
- this.checkHorizontalScrolling();
26
+ value: function checkScrolling(positionInfo) {
27
+ this.checkVerticalScrolling(positionInfo);
28
+ this.checkHorizontalScrolling(positionInfo);
35
29
  }
36
30
  }, {
37
- key: "scrollToY",
38
- value: function scrollToY(top) {
39
- this.ensureInit();
40
- if (this.$scrollParent && this.$scrollParent[0]) {
41
- this.$scrollParent[0].scrollTop = top;
42
- } else {
43
- var offset = this.treeWidget.$el.offset();
44
- var treeTop = offset ? offset.top : 0;
45
- jQuery(document).scrollTop(top + treeTop);
46
- }
31
+ key: "stopScrolling",
32
+ value: function stopScrolling() {
33
+ this.getScrollParent().stopScrolling();
47
34
  }
48
35
  }, {
49
- key: "isScrolledIntoView",
50
- value: function isScrolledIntoView($element) {
51
- this.ensureInit();
52
- var elementBottom;
53
- var viewBottom;
54
- var elementTop;
55
- var viewTop;
56
- var elHeight = $element.height() || 0;
57
- if (this.$scrollParent) {
58
- viewTop = 0;
59
- viewBottom = this.$scrollParent.height() || 0;
60
- var offset = $element.offset();
61
- var originalTop = offset ? offset.top : 0;
62
- elementTop = originalTop - this.scrollParentTop;
63
- elementBottom = elementTop + elHeight;
64
- } else {
65
- viewTop = jQuery(window).scrollTop() || 0;
66
- var windowHeight = jQuery(window).height() || 0;
67
- viewBottom = viewTop + windowHeight;
68
- var _offset = $element.offset();
69
- elementTop = _offset ? _offset.top : 0;
70
- elementBottom = elementTop + elHeight;
71
- }
72
- return elementBottom <= viewBottom && elementTop >= viewTop;
36
+ key: "scrollToY",
37
+ value: function scrollToY(top) {
38
+ this.getScrollParent().scrollToY(top);
73
39
  }
74
40
  }, {
75
41
  key: "getScrollLeft",
76
42
  value: function getScrollLeft() {
77
- if (!this.$scrollParent) {
78
- return 0;
79
- } else {
80
- return this.$scrollParent.scrollLeft() || 0;
81
- }
82
- }
83
- }, {
84
- key: "initScrollParent",
85
- value: function initScrollParent() {
86
- var _this = this,
87
- _$scrollParent$;
88
- var getParentWithOverflow = function getParentWithOverflow() {
89
- var cssAttributes = ["overflow", "overflow-y"];
90
- var hasOverFlow = function hasOverFlow($el) {
91
- for (var _i = 0, _cssAttributes = cssAttributes; _i < _cssAttributes.length; _i++) {
92
- var attr = _cssAttributes[_i];
93
- var overflowValue = $el.css(attr);
94
- if (overflowValue === "auto" || overflowValue === "scroll") {
95
- return true;
96
- }
97
- }
98
- return false;
99
- };
100
- if (hasOverFlow(_this.treeWidget.$el)) {
101
- return _this.treeWidget.$el;
102
- }
103
- var _iterator = _createForOfIteratorHelper(_this.treeWidget.$el.parents().get()),
104
- _step;
105
- try {
106
- for (_iterator.s(); !(_step = _iterator.n()).done;) {
107
- var el = _step.value;
108
- var $el = jQuery(el);
109
- if (hasOverFlow($el)) {
110
- return $el;
111
- }
112
- }
113
- } catch (err) {
114
- _iterator.e(err);
115
- } finally {
116
- _iterator.f();
117
- }
118
- return null;
119
- };
120
- var setDocumentAsScrollParent = function setDocumentAsScrollParent() {
121
- _this.scrollParentTop = 0;
122
- _this.$scrollParent = null;
123
- };
124
- if (this.treeWidget.$el.css("position") === "fixed") {
125
- setDocumentAsScrollParent();
126
- }
127
- var $scrollParent = getParentWithOverflow();
128
- if ($scrollParent && $scrollParent.length && ((_$scrollParent$ = $scrollParent[0]) === null || _$scrollParent$ === void 0 ? void 0 : _$scrollParent$.tagName) !== "HTML") {
129
- this.$scrollParent = $scrollParent;
130
- var offset = this.$scrollParent.offset();
131
- this.scrollParentTop = offset ? offset.top : 0;
132
- } else {
133
- setDocumentAsScrollParent();
134
- }
135
- this.isInitialized = true;
136
- }
137
- }, {
138
- key: "ensureInit",
139
- value: function ensureInit() {
140
- if (!this.isInitialized) {
141
- this.initScrollParent();
142
- }
143
- }
144
- }, {
145
- key: "handleVerticalScrollingWithScrollParent",
146
- value: function handleVerticalScrollingWithScrollParent(area) {
147
- var scrollParent = this.$scrollParent && this.$scrollParent[0];
148
- if (!scrollParent) {
149
- return;
150
- }
151
- var distanceBottom = this.scrollParentTop + scrollParent.offsetHeight - area.bottom;
152
- if (distanceBottom < 20) {
153
- scrollParent.scrollTop += 20;
154
- this.treeWidget.refreshHitAreas();
155
- this.previousTop = -1;
156
- } else if (area.top - this.scrollParentTop < 20) {
157
- scrollParent.scrollTop -= 20;
158
- this.treeWidget.refreshHitAreas();
159
- this.previousTop = -1;
160
- }
161
- }
162
- }, {
163
- key: "handleVerticalScrollingWithDocument",
164
- value: function handleVerticalScrollingWithDocument(area) {
165
- var scrollTop = jQuery(document).scrollTop() || 0;
166
- var distanceTop = area.top - scrollTop;
167
- if (distanceTop < 20) {
168
- jQuery(document).scrollTop(scrollTop - 20);
169
- } else {
170
- var windowHeight = jQuery(window).height() || 0;
171
- if (windowHeight - (area.bottom - scrollTop) < 20) {
172
- jQuery(document).scrollTop(scrollTop + 20);
173
- }
174
- }
43
+ return this.getScrollParent().getScrollLeft();
175
44
  }
176
45
  }, {
177
46
  key: "checkVerticalScrolling",
178
- value: function checkVerticalScrolling() {
179
- var hoveredArea = this.treeWidget.dndHandler.hoveredArea;
180
- if (hoveredArea && hoveredArea.top !== this.previousTop) {
181
- this.previousTop = hoveredArea.top;
182
- if (this.$scrollParent) {
183
- this.handleVerticalScrollingWithScrollParent(hoveredArea);
184
- } else {
185
- this.handleVerticalScrollingWithDocument(hoveredArea);
186
- }
187
- }
188
- }
189
- }, {
190
- key: "checkHorizontalScrolling",
191
- value: function checkHorizontalScrolling() {
192
- var positionInfo = this.treeWidget.dndHandler.positionInfo;
193
- if (!positionInfo) {
47
+ value: function checkVerticalScrolling(positionInfo) {
48
+ if (positionInfo.pageY == null) {
194
49
  return;
195
50
  }
196
- if (this.$scrollParent) {
197
- this.handleHorizontalScrollingWithParent(positionInfo);
198
- } else {
199
- this.handleHorizontalScrollingWithDocument(positionInfo);
200
- }
51
+ this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);
201
52
  }
202
53
  }, {
203
- key: "handleHorizontalScrollingWithParent",
204
- value: function handleHorizontalScrollingWithParent(positionInfo) {
205
- if (positionInfo.pageX === undefined || positionInfo.pageY === undefined) {
206
- return;
207
- }
208
- var $scrollParent = this.$scrollParent;
209
- var scrollParentOffset = $scrollParent && $scrollParent.offset();
210
- if (!($scrollParent && scrollParentOffset)) {
211
- return;
212
- }
213
- var scrollParent = $scrollParent[0];
214
- if (!scrollParent) {
54
+ key: "checkHorizontalScrolling",
55
+ value: function checkHorizontalScrolling(positionInfo) {
56
+ if (positionInfo.pageX == null) {
215
57
  return;
216
58
  }
217
- var canScrollRight = scrollParent.scrollLeft + scrollParent.clientWidth < scrollParent.scrollWidth;
218
- var canScrollLeft = scrollParent.scrollLeft > 0;
219
- var rightEdge = scrollParentOffset.left + scrollParent.clientWidth;
220
- var leftEdge = scrollParentOffset.left;
221
- var isNearRightEdge = positionInfo.pageX > rightEdge - 20;
222
- var isNearLeftEdge = positionInfo.pageX < leftEdge + 20;
223
- if (isNearRightEdge && canScrollRight) {
224
- scrollParent.scrollLeft = Math.min(scrollParent.scrollLeft + 20, scrollParent.scrollWidth);
225
- } else if (isNearLeftEdge && canScrollLeft) {
226
- scrollParent.scrollLeft = Math.max(scrollParent.scrollLeft - 20, 0);
227
- }
59
+ this.getScrollParent().checkHorizontalScrolling(positionInfo.pageX);
228
60
  }
229
61
  }, {
230
- key: "handleHorizontalScrollingWithDocument",
231
- value: function handleHorizontalScrollingWithDocument(positionInfo) {
232
- if (positionInfo.pageX === undefined || positionInfo.pageY === undefined) {
233
- return;
234
- }
235
- var $document = jQuery(document);
236
- var scrollLeft = $document.scrollLeft() || 0;
237
- var windowWidth = jQuery(window).width() || 0;
238
- var canScrollLeft = scrollLeft > 0;
239
- var isNearRightEdge = positionInfo.pageX > windowWidth - 20;
240
- var isNearLeftEdge = positionInfo.pageX - scrollLeft < 20;
241
- if (isNearRightEdge) {
242
- $document.scrollLeft(scrollLeft + 20);
243
- } else if (isNearLeftEdge && canScrollLeft) {
244
- $document.scrollLeft(Math.max(scrollLeft - 20, 0));
62
+ key: "getScrollParent",
63
+ value: function getScrollParent() {
64
+ if (!this.scrollParent) {
65
+ this.scrollParent = (0, _createScrollParent["default"])(this.treeWidget.$el, this.treeWidget.refreshHitAreas.bind(this.treeWidget));
245
66
  }
67
+ return this.scrollParent;
246
68
  }
247
69
  }]);
248
70
  return ScrollHandler;
249
- }();
250
- exports["default"] = ScrollHandler;
71
+ }();
@@ -11,7 +11,7 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
11
11
  function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
12
12
  function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
13
13
  function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
14
- var SelectNodeHandler = /*#__PURE__*/function () {
14
+ var SelectNodeHandler = exports["default"] = /*#__PURE__*/function () {
15
15
  function SelectNodeHandler(treeWidget) {
16
16
  _classCallCheck(this, SelectNodeHandler);
17
17
  _defineProperty(this, "treeWidget", void 0);
@@ -125,5 +125,4 @@ var SelectNodeHandler = /*#__PURE__*/function () {
125
125
  }
126
126
  }]);
127
127
  return SelectNodeHandler;
128
- }();
129
- exports["default"] = SelectNodeHandler;
128
+ }();
@@ -121,7 +121,7 @@ var _register = function register(widgetClass, widgetName) {
121
121
  }
122
122
  };
123
123
  };
124
- var SimpleWidget = /*#__PURE__*/function () {
124
+ var SimpleWidget = exports["default"] = /*#__PURE__*/function () {
125
125
  function SimpleWidget(el, options) {
126
126
  _classCallCheck(this, SimpleWidget);
127
127
  _defineProperty(this, "options", void 0);
@@ -155,5 +155,4 @@ var SimpleWidget = /*#__PURE__*/function () {
155
155
  }]);
156
156
  return SimpleWidget;
157
157
  }();
158
- exports["default"] = SimpleWidget;
159
158
  _defineProperty(SimpleWidget, "defaults", {});
@@ -141,10 +141,10 @@ context("when a node has load_on_demand in the data", function () {
141
141
  });
142
142
  context("when the node is selected and doesn't have the focus", function () {
143
143
  beforeEach(function () {
144
- given.$tree.tree("selectNode", given.node, {
145
- mustSetFocus: false
146
- });
144
+ given.$tree.tree("selectNode", given.node);
145
+ document.activeElement.blur(); // eslint-disable-line testing-library/no-node-access
147
146
  });
147
+
148
148
  it("keeps the node selected and not focused", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee4() {
149
149
  return _regeneratorRuntime().wrap(function _callee4$(_context4) {
150
150
  while (1) switch (_context4.prev = _context4.next) {
@@ -892,7 +892,8 @@ describe("refresh", function () {
892
892
  });
893
893
  it("rerenders the tree", function () {
894
894
  var tree = given.$tree.tree("getTree");
895
- tree.children[0].name = "node1a";
895
+ tree.children[0].name = "node1a"; // eslint-disable-line testing-library/no-node-access
896
+
896
897
  expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
897
898
  name: "node1"
898
899
  }), expect.objectContaining({
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ var _containerScrollParent = _interopRequireDefault(require("../../../scrollHandler/containerScrollParent"));
4
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
5
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
6
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
7
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
8
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
9
+ function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
10
+ function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
11
+ var defaultMockJQueryElementParams = {
12
+ height: 200,
13
+ innerHeight: 180,
14
+ offsetTop: 20,
15
+ scrollLeft: 0
16
+ };
17
+ var mock$JQueryElement = function mock$JQueryElement(inputParams) {
18
+ var params = _objectSpread(_objectSpread({}, defaultMockJQueryElementParams), inputParams);
19
+ var element = {};
20
+ var $element = {
21
+ get: function get(_) {
22
+ return element;
23
+ },
24
+ height: function height() {
25
+ return params.height;
26
+ },
27
+ innerHeight: function innerHeight() {
28
+ return params.innerHeight;
29
+ },
30
+ offset: function offset() {
31
+ return {
32
+ top: params.offsetTop
33
+ };
34
+ },
35
+ scrollLeft: function scrollLeft() {
36
+ return params.scrollLeft;
37
+ }
38
+ };
39
+ return $element;
40
+ };
41
+ var mockContainerScrollParent = function mockContainerScrollParent($container) {
42
+ var refreshHitAreas = jest.fn();
43
+ var $treeElement = {};
44
+ return new _containerScrollParent["default"]({
45
+ $container: $container,
46
+ refreshHitAreas: refreshHitAreas,
47
+ $treeElement: $treeElement
48
+ });
49
+ };
50
+ describe("getScrollLeft", function () {
51
+ it("returns the scrollLeft of the container", function () {
52
+ var $container = mock$JQueryElement({
53
+ scrollLeft: 10
54
+ });
55
+ var containerScrollParent = mockContainerScrollParent($container);
56
+ expect(containerScrollParent.getScrollLeft()).toBe(10);
57
+ });
58
+ });
59
+ describe("isScrolledIntoView", function () {
60
+ it("returns true when the element is visible", function () {
61
+ var $container = mock$JQueryElement({
62
+ height: 100,
63
+ offsetTop: 0
64
+ });
65
+ var containerScrollParent = mockContainerScrollParent($container);
66
+ var $element = mock$JQueryElement({
67
+ height: 10,
68
+ offsetTop: 0
69
+ });
70
+ expect(containerScrollParent.isScrolledIntoView($element)).toBe(true);
71
+ });
72
+ it("returns false when the element is not visible", function () {
73
+ var $container = mock$JQueryElement({
74
+ height: 100,
75
+ offsetTop: 0
76
+ });
77
+ var containerScrollParent = mockContainerScrollParent($container);
78
+ var $element = mock$JQueryElement({
79
+ height: 10,
80
+ offsetTop: 150
81
+ });
82
+ expect(containerScrollParent.isScrolledIntoView($element)).toBe(false);
83
+ });
84
+ });
85
+ describe("scrollToY", function () {
86
+ it("sets scrollTop of the container", function () {
87
+ var $container = mock$JQueryElement({
88
+ scrollLeft: 10
89
+ });
90
+ var containerScrollParent = mockContainerScrollParent($container);
91
+ containerScrollParent.scrollToY(10);
92
+ expect($container.get(0).scrollTop).toBe(10);
93
+ });
94
+ });
@@ -318,6 +318,9 @@ describe("constructor", function () {
318
318
  });
319
319
  expect(given.node).not.toHaveProperty("id");
320
320
  });
321
+ it("sets isEmptyFolder to false", function () {
322
+ expect(given.node.isEmptyFolder).toBe(false);
323
+ });
321
324
  });
322
325
  context("with an object with a name property", function () {
323
326
  given("params", function () {
@@ -375,7 +378,6 @@ describe("constructor", function () {
375
378
  name: "n1",
376
379
  url: "/"
377
380
  });
378
- // todo: match object?
379
381
  expect(given.node).not.toHaveProperty("label");
380
382
  expect(given.node.children).toHaveLength(0);
381
383
  expect(given.node.parent).toBeNull();
@@ -401,10 +403,23 @@ describe("constructor", function () {
401
403
  };
402
404
  });
403
405
  it("doesn't set the children", function () {
404
- // todo: match object?
405
406
  expect(given.node.name).toBe("n1");
406
407
  expect(given.node.children).toHaveLength(0);
407
408
  });
409
+ it("sets isEmptyFolder to false", function () {
410
+ expect(given.node.isEmptyFolder).toBe(false);
411
+ });
412
+ });
413
+ context("when the data contains an empty children attribute", function () {
414
+ given("params", function () {
415
+ return {
416
+ name: "n1",
417
+ children: []
418
+ };
419
+ });
420
+ it("sets isEmptyFolder to true", function () {
421
+ expect(given.node.isEmptyFolder).toBe(true);
422
+ });
408
423
  });
409
424
  });
410
425
  describe("getChildIndex", function () {
@@ -942,12 +957,9 @@ describe("iterate", function () {
942
957
  });
943
958
  });
944
959
  describe("loadFromData", function () {
945
- var given = (0, _givens["default"])();
946
- given("tree", function () {
947
- return new _node.Node().loadFromData(_exampleData["default"]);
948
- });
949
960
  it("creates a tree", function () {
950
- expect(given.tree.children).toEqual([expect.objectContaining({
961
+ var tree = new _node.Node().loadFromData(_exampleData["default"]);
962
+ expect(tree.children).toEqual([expect.objectContaining({
951
963
  id: 123,
952
964
  intProperty: 1,
953
965
  name: "node1",
@@ -970,6 +982,29 @@ describe("loadFromData", function () {
970
982
  })]
971
983
  })]);
972
984
  });
985
+ it("sets isEmptyFolder to true for a node when it is has an empty children attribute", function () {
986
+ var data = [{
987
+ name: "test1",
988
+ children: []
989
+ }];
990
+ var tree = new _node.Node().loadFromData(data);
991
+ expect(tree.children[0].isEmptyFolder).toBe(true);
992
+ });
993
+ it("sets isEmptyFolder to false for a node when it doesn't have a children attribute", function () {
994
+ var data = [{
995
+ name: "test1"
996
+ }];
997
+ var tree = new _node.Node().loadFromData(data);
998
+ expect(tree.children[0].isEmptyFolder).toBe(false);
999
+ });
1000
+ it("sets isEmptyFolder to false for a node when it has a children attribute that is not empty", function () {
1001
+ var data = [{
1002
+ name: "test1",
1003
+ children: ["child1"]
1004
+ }];
1005
+ var tree = new _node.Node().loadFromData(data);
1006
+ expect(tree.children[0].isEmptyFolder).toBe(false);
1007
+ });
973
1008
  });
974
1009
  describe("moveNode", function () {
975
1010
  var given = (0, _givens["default"])();
@@ -1113,6 +1148,13 @@ describe("prepend", function () {
1113
1148
  });
1114
1149
  });
1115
1150
  });
1151
+ it("sets the isEmptyFolder attribute to true when the node data has empty children", function () {
1152
+ given.node.prepend({
1153
+ name: "test1",
1154
+ children: []
1155
+ });
1156
+ expect(given.node.children[0].isEmptyFolder).toBe(true);
1157
+ });
1116
1158
  });
1117
1159
  describe("remove", function () {
1118
1160
  var given = (0, _givens["default"])();
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ var _nodeUtils = require("../nodeUtils");
4
+ describe("isNodeRecordWithChildren", function () {
5
+ it("returns true when the data is an object with the children attribute of type array", function () {
6
+ var data = {
7
+ children: []
8
+ };
9
+ expect((0, _nodeUtils.isNodeRecordWithChildren)(data)).toBe(true);
10
+ });
11
+ it("returns when the data is an object without the children attribute", function () {
12
+ var data = {
13
+ name: "test"
14
+ };
15
+ expect((0, _nodeUtils.isNodeRecordWithChildren)(data)).toBe(false);
16
+ });
17
+ it("returns when the data is a string", function () {
18
+ expect((0, _nodeUtils.isNodeRecordWithChildren)("test")).toBe(false);
19
+ });
20
+ });
@@ -32,5 +32,4 @@ var exampleData = [{
32
32
  }]
33
33
  }]
34
34
  }];
35
- var _default = exampleData;
36
- exports["default"] = _default;
35
+ var _default = exports["default"] = exampleData;
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.togglerLink = exports.titleSpan = exports.singleChild = void 0;
7
- var singleChild = function singleChild($el, selector) {
7
+ var singleChild = exports.singleChild = function singleChild($el, selector) {
8
8
  var $result = $el.children(selector);
9
9
 
10
10
  /* istanbul ignore if */
@@ -18,15 +18,12 @@ var singleChild = function singleChild($el, selector) {
18
18
  }
19
19
  return $result;
20
20
  };
21
- exports.singleChild = singleChild;
22
- var titleSpan = function titleSpan(liNode) {
21
+ var titleSpan = exports.titleSpan = function titleSpan(liNode) {
23
22
  return singleChild(nodeElement(liNode), "span.jqtree-title");
24
23
  };
25
- exports.titleSpan = titleSpan;
26
- var togglerLink = function togglerLink(liNode) {
24
+ var togglerLink = exports.togglerLink = function togglerLink(liNode) {
27
25
  return singleChild(nodeElement(liNode), "a.jqtree-toggler");
28
26
  };
29
- exports.togglerLink = togglerLink;
30
27
  var nodeElement = function nodeElement(liNode) {
31
28
  return singleChild(jQuery(liNode), "div.jqtree-element ");
32
29
  };
@@ -35,5 +35,4 @@ var getChildren = function getChildren($ul) {
35
35
  var treeStructure = function treeStructure($el) {
36
36
  return getChildren((0, _testUtil.singleChild)($el, "ul.jqtree-tree"));
37
37
  };
38
- var _default = treeStructure;
39
- exports["default"] = _default;
38
+ var _default = exports["default"] = treeStructure;