jqtree 1.7.4 → 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.
- package/.eslintrc +5 -1
- package/bower.json +1 -1
- package/docs/_config.yml +1 -1
- package/docs/_entries/general/changelog.md +5 -0
- package/docs/package.json +1 -1
- package/docs/pnpm-lock.yaml +30 -30
- package/lib/dataLoader.js +2 -3
- package/lib/dragAndDropHandler.js +5 -13
- package/lib/elementsRenderer.js +2 -3
- package/lib/keyHandler.js +1 -5
- package/lib/mouse.widget.js +1 -2
- package/lib/node.js +30 -39
- package/lib/nodeElement.js +3 -6
- package/lib/nodeUtils.js +10 -0
- package/lib/playwright/coverage.js +14 -11
- package/lib/playwright/playwright.test.js +482 -104
- package/lib/playwright/testUtils.js +75 -49
- package/lib/saveStateHandler.js +2 -3
- package/lib/scrollHandler/containerScrollParent.js +160 -0
- package/lib/scrollHandler/createScrollParent.js +57 -0
- package/lib/scrollHandler/documentScrollParent.js +169 -0
- package/lib/scrollHandler/scrollParent.js +58 -0
- package/lib/scrollHandler/types.js +1 -0
- package/lib/scrollHandler.js +28 -207
- package/lib/selectNodeHandler.js +2 -3
- package/lib/simple.widget.js +1 -2
- package/lib/test/jqTree/loadOnDemand.test.js +3 -3
- package/lib/test/jqTree/methods.test.js +2 -1
- package/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +94 -0
- package/lib/test/node.test.js +49 -7
- package/lib/test/nodeUtils.test.js +20 -0
- package/lib/test/support/exampleData.js +1 -2
- package/lib/test/support/testUtil.js +3 -6
- package/lib/test/support/treeStructure.js +1 -2
- package/lib/tree.jquery.js +6 -7
- package/lib/util.js +4 -7
- package/lib/version.js +2 -3
- package/package.json +27 -27
- package/src/dragAndDropHandler.ts +27 -33
- package/src/keyHandler.ts +0 -8
- package/src/node.ts +32 -48
- package/src/nodeUtils.ts +10 -0
- package/src/playwright/playwright.test.ts +207 -15
- package/src/playwright/testUtils.ts +23 -15
- package/src/scrollHandler/containerScrollParent.ts +177 -0
- package/src/scrollHandler/createScrollParent.ts +50 -0
- package/src/scrollHandler/documentScrollParent.ts +182 -0
- package/src/scrollHandler/types.ts +7 -0
- package/src/scrollHandler.ts +25 -243
- package/src/test/jqTree/loadOnDemand.test.ts +2 -3
- package/src/test/jqTree/methods.test.ts +1 -1
- package/src/test/node.test.ts +84 -25
- package/src/test/nodeUtils.test.ts +21 -0
- package/src/tree.jquery.ts +27 -30
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +391 -229
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
|
@@ -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";
|
package/lib/scrollHandler.js
CHANGED
|
@@ -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, "
|
|
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.
|
|
27
|
-
this.isInitialized = false;
|
|
22
|
+
this.scrollParent = undefined;
|
|
28
23
|
}
|
|
29
24
|
_createClass(ScrollHandler, [{
|
|
30
25
|
key: "checkScrolling",
|
|
31
|
-
value: function checkScrolling() {
|
|
32
|
-
this.
|
|
33
|
-
this.
|
|
34
|
-
this.checkHorizontalScrolling();
|
|
26
|
+
value: function checkScrolling(positionInfo) {
|
|
27
|
+
this.checkVerticalScrolling(positionInfo);
|
|
28
|
+
this.checkHorizontalScrolling(positionInfo);
|
|
35
29
|
}
|
|
36
30
|
}, {
|
|
37
|
-
key: "
|
|
38
|
-
value: function
|
|
39
|
-
this.
|
|
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: "
|
|
50
|
-
value: function
|
|
51
|
-
this.
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
197
|
-
this.handleHorizontalScrollingWithParent(positionInfo);
|
|
198
|
-
} else {
|
|
199
|
-
this.handleHorizontalScrollingWithDocument(positionInfo);
|
|
200
|
-
}
|
|
51
|
+
this.getScrollParent().checkVerticalScrolling(positionInfo.pageY);
|
|
201
52
|
}
|
|
202
53
|
}, {
|
|
203
|
-
key: "
|
|
204
|
-
value: function
|
|
205
|
-
if (positionInfo.pageX
|
|
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
|
-
|
|
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: "
|
|
231
|
-
value: function
|
|
232
|
-
if (
|
|
233
|
-
|
|
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
|
+
}();
|
package/lib/selectNodeHandler.js
CHANGED
|
@@ -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
|
+
}();
|
package/lib/simple.widget.js
CHANGED
|
@@ -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
|
-
|
|
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
|
+
});
|
package/lib/test/node.test.js
CHANGED
|
@@ -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
|
-
|
|
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
|
+
});
|
|
@@ -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.
|
|
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.
|
|
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;
|