jqtree 1.7.4 → 1.8.0

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 (94) hide show
  1. package/.eslintrc +5 -1
  2. package/bower.json +1 -1
  3. package/config/babel.config.json +1 -1
  4. package/config/production +2 -0
  5. package/devserver/devserver_scroll.js +8 -0
  6. package/devserver/test_scroll.html +28 -0
  7. package/devserver/test_scroll_container.html +39 -0
  8. package/docs/_config.yml +1 -1
  9. package/docs/_entries/general/changelog.md +12 -0
  10. package/docs/package.json +1 -1
  11. package/docs/pnpm-lock.yaml +30 -30
  12. package/package.json +31 -27
  13. package/src/dataLoader.ts +44 -19
  14. package/src/dragAndDropHandler/dragElement.ts +42 -0
  15. package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
  16. package/src/dragAndDropHandler/index.ts +470 -0
  17. package/src/dragAndDropHandler/types.ts +12 -0
  18. package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
  19. package/src/elementsRenderer.ts +75 -40
  20. package/src/jqtreeMethodTypes.ts +40 -0
  21. package/src/jqtreeOptions.ts +43 -25
  22. package/src/keyHandler.ts +59 -38
  23. package/src/mouse.widget.ts +3 -3
  24. package/src/mouseWidgetTypes.ts +6 -0
  25. package/src/node.ts +32 -48
  26. package/src/nodeElement/borderDropHint.ts +32 -0
  27. package/src/nodeElement/folderElement.ts +133 -0
  28. package/src/nodeElement/ghostDropHint.ts +68 -0
  29. package/src/nodeElement/index.ts +101 -0
  30. package/src/nodeUtils.ts +10 -0
  31. package/src/playwright/coverage.ts +1 -4
  32. package/src/playwright/playwright.test.ts +203 -15
  33. package/src/playwright/testUtils.ts +23 -15
  34. package/src/saveStateHandler.ts +75 -26
  35. package/src/scrollHandler/containerScrollParent.ts +177 -0
  36. package/src/scrollHandler/createScrollParent.ts +50 -0
  37. package/src/scrollHandler/documentScrollParent.ts +182 -0
  38. package/src/scrollHandler/types.ts +7 -0
  39. package/src/scrollHandler.ts +36 -248
  40. package/src/selectNodeHandler.ts +10 -16
  41. package/src/test/jqTree/keyboard.test.ts +18 -23
  42. package/src/test/jqTree/loadOnDemand.test.ts +2 -3
  43. package/src/test/jqTree/methods.test.ts +33 -4
  44. package/src/test/jqTree/options.test.ts +15 -4
  45. package/src/test/node.test.ts +85 -26
  46. package/src/test/nodeUtils.test.ts +21 -0
  47. package/src/tree.jquery.ts +262 -83
  48. package/src/util.ts +3 -0
  49. package/src/version.ts +1 -1
  50. package/tree.jquery.debug.js +1922 -2608
  51. package/tree.jquery.debug.js.map +1 -1
  52. package/tree.jquery.js +2 -2
  53. package/tree.jquery.js.map +1 -1
  54. package/lib/dataLoader.js +0 -124
  55. package/lib/dragAndDropHandler.js +0 -596
  56. package/lib/elementsRenderer.js +0 -268
  57. package/lib/jqtreeOptions.js +0 -1
  58. package/lib/keyHandler.js +0 -115
  59. package/lib/mouse.widget.js +0 -256
  60. package/lib/node.js +0 -717
  61. package/lib/nodeElement.js +0 -277
  62. package/lib/playwright/coverage.js +0 -96
  63. package/lib/playwright/playwright.test.js +0 -228
  64. package/lib/playwright/testUtils.js +0 -184
  65. package/lib/saveStateHandler.js +0 -278
  66. package/lib/scrollHandler.js +0 -250
  67. package/lib/selectNodeHandler.js +0 -129
  68. package/lib/simple.widget.js +0 -159
  69. package/lib/test/global.d.js +0 -3
  70. package/lib/test/jqTree/accessibility.test.js +0 -37
  71. package/lib/test/jqTree/create.test.js +0 -48
  72. package/lib/test/jqTree/events.test.js +0 -210
  73. package/lib/test/jqTree/keyboard.test.js +0 -225
  74. package/lib/test/jqTree/loadOnDemand.test.js +0 -218
  75. package/lib/test/jqTree/methods.test.js +0 -1347
  76. package/lib/test/jqTree/options.test.js +0 -548
  77. package/lib/test/node.test.js +0 -1160
  78. package/lib/test/nodeUtil.test.js +0 -27
  79. package/lib/test/support/exampleData.js +0 -36
  80. package/lib/test/support/jqTreeMatchers.js +0 -70
  81. package/lib/test/support/matchers.d.js +0 -1
  82. package/lib/test/support/setupTests.js +0 -7
  83. package/lib/test/support/testUtil.js +0 -32
  84. package/lib/test/support/treeStructure.js +0 -39
  85. package/lib/test/util.test.js +0 -26
  86. package/lib/tree.jquery.d.js +0 -1
  87. package/lib/tree.jquery.js +0 -1106
  88. package/lib/types.js +0 -1
  89. package/lib/typings.d.js +0 -2
  90. package/lib/util.js +0 -18
  91. package/lib/version.js +0 -9
  92. package/src/dragAndDropHandler.ts +0 -719
  93. package/src/nodeElement.ts +0 -272
  94. package/src/types.ts +0 -19
@@ -1,548 +0,0 @@
1
- "use strict";
2
-
3
- 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); }
4
- var _givens = _interopRequireDefault(require("givens"));
5
- var _dom = require("@testing-library/dom");
6
- var _msw = require("msw");
7
- var _node = require("msw/node");
8
- require("../../tree.jquery");
9
- var _exampleData = _interopRequireDefault(require("../support/exampleData"));
10
- var _testUtil = require("../support/testUtil");
11
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
12
- function _regeneratorRuntime() { "use strict"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = "function" == typeof Symbol ? Symbol : {}, a = i.iterator || "@@iterator", c = i.asyncIterator || "@@asyncIterator", u = i.toStringTag || "@@toStringTag"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, ""); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, "_invoke", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: "normal", arg: t.call(e, r) }; } catch (t) { return { type: "throw", arg: t }; } } e.wrap = wrap; var h = "suspendedStart", l = "suspendedYield", f = "executing", s = "completed", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { ["next", "throw", "return"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if ("throw" !== c.type) { var u = c.arg, h = u.value; return h && "object" == _typeof(h) && n.call(h, "__await") ? e.resolve(h.__await).then(function (t) { invoke("next", t, i, a); }, function (t) { invoke("throw", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke("throw", t, i, a); }); } a(c.arg); } var r; o(this, "_invoke", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw new Error("Generator is already running"); if (o === s) { if ("throw" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if ("next" === n.method) n.sent = n._sent = n.arg;else if ("throw" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else "return" === n.method && n.abrupt("return", n.arg); o = f; var p = tryCatch(e, r, n); if ("normal" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } "throw" === p.type && (o = s, n.method = "throw", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, "throw" === n && e.iterator["return"] && (r.method = "return", r.arg = t, maybeInvokeDelegate(e, r), "throw" === r.method) || "return" !== n && (r.method = "throw", r.arg = new TypeError("The iterator does not provide a '" + n + "' method")), y; var i = tryCatch(o, e.iterator, r.arg); if ("throw" === i.type) return r.method = "throw", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, "return" !== r.method && (r.method = "next", r.arg = t), r.delegate = null, y) : a : (r.method = "throw", r.arg = new TypeError("iterator result is not an object"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = "normal", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: "root" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || "" === e) { var r = e[a]; if (r) return r.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + " is not iterable"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, "constructor", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, "constructor", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, "GeneratorFunction"), e.isGeneratorFunction = function (t) { var e = "function" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || "GeneratorFunction" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, "GeneratorFunction")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, "Generator"), define(g, a, function () { return this; }), define(g, "toString", function () { return "[object Generator]"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = "next", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) "t" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if ("throw" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = "throw", a.arg = e, r.next = n, o && (r.method = "next", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if ("root" === i.tryLoc) return handle("end"); if (i.tryLoc <= this.prev) { var c = n.call(i, "catchLoc"), u = n.call(i, "finallyLoc"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw new Error("try statement without catch or finally"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, "finallyLoc") && this.prev < o.finallyLoc) { var i = o; break; } } i && ("break" === t || "continue" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = "next", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if ("throw" === t.type) throw t.arg; return "break" === t.type || "continue" === t.type ? this.next = t.arg : "return" === t.type ? (this.rval = this.arg = t.arg, this.method = "return", this.next = "end") : "normal" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, "catch": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if ("throw" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw new Error("illegal catch attempt"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, "next" === this.method && (this.arg = t), y; } }, e; }
13
- function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } }
14
- function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; }
15
- var context = describe;
16
- var server = (0, _node.setupServer)();
17
- beforeAll(function () {
18
- return server.listen();
19
- });
20
- beforeEach(function () {
21
- $("body").append('<div id="tree1"></div>');
22
- });
23
- afterEach(function () {
24
- server.resetHandlers();
25
- var $tree = $("#tree1");
26
- $tree.tree("destroy");
27
- $tree.remove();
28
- localStorage.clear();
29
- });
30
- afterAll(function () {
31
- return server.close();
32
- });
33
- describe("autoEscape", function () {
34
- var given = (0, _givens["default"])();
35
- given("$tree", function () {
36
- return $("#tree1");
37
- });
38
- beforeEach(function () {
39
- given.$tree.tree({
40
- autoEscape: given.autoEscape,
41
- data: ["<span>test</span>"]
42
- });
43
- });
44
- context("with autoEscape true", function () {
45
- given("autoEscape", function () {
46
- return true;
47
- });
48
- it("escapes the node name", function () {
49
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
50
- name: "&lt;span&gt;test&lt;/span&gt;"
51
- })]);
52
- });
53
- });
54
- context("with autoEscape false", function () {
55
- given("autoEscape", function () {
56
- return false;
57
- });
58
- it("doesn't escape the node name", function () {
59
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
60
- name: "<span>test</span>"
61
- })]);
62
- });
63
- });
64
- });
65
- describe("autoOpen", function () {
66
- var given = (0, _givens["default"])();
67
- given("$tree", function () {
68
- return $("#tree1");
69
- });
70
- beforeEach(function () {
71
- given.$tree.tree({
72
- autoOpen: given.autoOpen,
73
- data: _exampleData["default"]
74
- });
75
- });
76
- context("with autoOpen false", function () {
77
- given("autoOpen", function () {
78
- return false;
79
- });
80
- it("doesn't open any nodes", function () {
81
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
82
- name: "node1",
83
- open: false
84
- }), expect.objectContaining({
85
- name: "node2",
86
- open: false
87
- })]);
88
- });
89
- });
90
- context("with autoOpen true", function () {
91
- given("autoOpen", function () {
92
- return true;
93
- });
94
- it("opens all nodes", function () {
95
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
96
- name: "node1",
97
- open: true
98
- }), expect.objectContaining({
99
- name: "node2",
100
- open: true,
101
- children: [expect.objectContaining({
102
- name: "node3",
103
- open: true
104
- })]
105
- })]);
106
- });
107
- });
108
- context("with autoOpen 0", function () {
109
- given("autoOpen", function () {
110
- return 0;
111
- });
112
- it("opens level 0", function () {
113
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
114
- name: "node1",
115
- open: true
116
- }), expect.objectContaining({
117
- name: "node2",
118
- open: true,
119
- children: [expect.objectContaining({
120
- name: "node3",
121
- open: false
122
- })]
123
- })]);
124
- });
125
- });
126
- context("with autoOpen 1", function () {
127
- given("autoOpen", function () {
128
- return 1;
129
- });
130
- it("opens levels 1", function () {
131
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
132
- name: "node1",
133
- open: true
134
- }), expect.objectContaining({
135
- name: "node2",
136
- open: true,
137
- children: [expect.objectContaining({
138
- name: "node3",
139
- open: true
140
- })]
141
- })]);
142
- });
143
- });
144
- context("with autoOpen '1'", function () {
145
- given("autoOpen", function () {
146
- return "1";
147
- });
148
- it("opens levels 1", function () {
149
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
150
- name: "node1",
151
- open: true
152
- }), expect.objectContaining({
153
- name: "node2",
154
- open: true,
155
- children: [expect.objectContaining({
156
- name: "node3",
157
- open: true
158
- })]
159
- })]);
160
- });
161
- });
162
- });
163
- describe("closedIcon", function () {
164
- it("renders a string", function () {
165
- var $tree = $("#tree1");
166
- $tree.tree({
167
- closedIcon: "closed",
168
- data: _exampleData["default"]
169
- });
170
- var $button = $tree.find("a.jqtree-toggler:first");
171
- expect($button.text()).toBe("closed");
172
- });
173
- it("escapes html", function () {
174
- var $tree = $("#tree1");
175
- $tree.tree({
176
- closedIcon: "<span>test</span>",
177
- data: _exampleData["default"]
178
- });
179
- var $button = $tree.find("a.jqtree-toggler:first");
180
- expect($button.text()).toBe("<span>test</span>");
181
- });
182
- it("renders a jquery element", function () {
183
- var $tree = $("#tree1");
184
- $tree.tree({
185
- closedIcon: $("<span class='abc'>test</span>"),
186
- data: _exampleData["default"]
187
- });
188
- var $span = $tree.find("a.jqtree-toggler:first span.abc");
189
- expect($span.text()).toBe("test");
190
- });
191
- it("renders a html element", function () {
192
- var closedIcon = document.createElement("span");
193
- closedIcon.className = "abc";
194
- closedIcon.textContent = "test";
195
- var $tree = $("#tree1");
196
- $tree.tree({
197
- closedIcon: closedIcon,
198
- data: _exampleData["default"]
199
- });
200
- var $span = $tree.find("a.jqtree-toggler:first span.abc");
201
- expect($span.text()).toBe("test");
202
- });
203
- });
204
- describe("dataUrl", function () {
205
- var exampleStructure = [expect.objectContaining({
206
- name: "node1"
207
- }), expect.objectContaining({
208
- name: "node2"
209
- })];
210
- var testCases = [{
211
- name: "string",
212
- dataUrl: "/tree/",
213
- expectedNode: "node1",
214
- expectedStructure: exampleStructure
215
- }, {
216
- name: "object with url and headers",
217
- dataUrl: {
218
- url: "/tree/",
219
- headers: {
220
- node: "test-node"
221
- }
222
- },
223
- expectedNode: "test-node",
224
- expectedStructure: [expect.objectContaining({
225
- name: "test-node"
226
- })]
227
- }, {
228
- name: "function",
229
- dataUrl: function dataUrl() {
230
- return {
231
- url: "/tree/"
232
- };
233
- },
234
- expectedNode: "node1",
235
- expectedStructure: exampleStructure
236
- }];
237
- beforeEach(function () {
238
- server.use(_msw.rest.get("/tree/", function (request, response, ctx) {
239
- var nodeName = request.headers.get("node");
240
- var data = nodeName ? [nodeName] : _exampleData["default"];
241
- return response(ctx.status(200), ctx.json(data));
242
- }));
243
- });
244
- var given = (0, _givens["default"])();
245
- given("$tree", function () {
246
- return $("#tree1");
247
- });
248
- testCases.forEach(function (_ref) {
249
- var dataUrl = _ref.dataUrl,
250
- expectedNode = _ref.expectedNode,
251
- expectedStructure = _ref.expectedStructure,
252
- name = _ref.name;
253
- context("with ".concat(name), function () {
254
- it("loads the data from the url", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
255
- return _regeneratorRuntime().wrap(function _callee$(_context) {
256
- while (1) switch (_context.prev = _context.next) {
257
- case 0:
258
- given.$tree.tree({
259
- dataUrl: dataUrl
260
- });
261
- _context.next = 3;
262
- return _dom.screen.findByText(expectedNode);
263
- case 3:
264
- expect(given.$tree).toHaveTreeStructure(expectedStructure);
265
- case 4:
266
- case "end":
267
- return _context.stop();
268
- }
269
- }, _callee);
270
- })));
271
- });
272
- });
273
- });
274
- describe("onCanSelectNode", function () {
275
- var given = (0, _givens["default"])();
276
- given("node1", function () {
277
- return given.$tree.tree("getNodeByNameMustExist", "node1");
278
- });
279
- given("$tree", function () {
280
- return $("#tree1");
281
- });
282
- beforeEach(function () {
283
- given.$tree.tree({
284
- data: _exampleData["default"],
285
- onCanSelectNode: function onCanSelectNode(node) {
286
- return node.name !== "node1";
287
- }
288
- });
289
- });
290
- it("doesn't select the node", function () {
291
- given.$tree.tree("selectNode", given.node1);
292
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
293
- });
294
- });
295
- describe("onCreateLi", function () {
296
- var given = (0, _givens["default"])();
297
- given("$tree", function () {
298
- return $("#tree1");
299
- });
300
- beforeEach(function () {
301
- given.$tree.tree({
302
- data: _exampleData["default"],
303
- onCreateLi: function onCreateLi(node, el) {
304
- (0, _testUtil.titleSpan)(el).text("_".concat(node.name, "_"));
305
- }
306
- });
307
- });
308
- it("is called when creating a node", function () {
309
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
310
- name: "_node1_"
311
- }), expect.objectContaining({
312
- name: "_node2_"
313
- })]);
314
- });
315
- });
316
- describe("onGetStateFromStorage and onSetStateFromStorage", function () {
317
- var savedState = "";
318
- var setState = function setState(state) {
319
- savedState = state;
320
- };
321
- var getState = function getState() {
322
- return savedState;
323
- };
324
- var given = (0, _givens["default"])();
325
- given("initialState", function () {
326
- return "";
327
- });
328
- given("node1", function () {
329
- return given.$tree.tree("getNodeByNameMustExist", "node1");
330
- });
331
- given("$tree", function () {
332
- return $("#tree1");
333
- });
334
- beforeEach(function () {
335
- savedState = given.initialState;
336
- given.$tree.tree({
337
- autoOpen: false,
338
- data: _exampleData["default"],
339
- onGetStateFromStorage: getState,
340
- onSetStateFromStorage: setState,
341
- saveState: true
342
- });
343
- });
344
- context("with an open and a selected node", function () {
345
- beforeEach(function () {
346
- given.$tree.tree("selectNode", given.node1);
347
- given.$tree.tree("openNode", given.node1);
348
- });
349
- it("saves the state", function () {
350
- expect(JSON.parse(savedState)).toEqual({
351
- open_nodes: [123],
352
- selected_node: [123]
353
- });
354
- });
355
- });
356
- context("with a saved state", function () {
357
- given("initialState", function () {
358
- return JSON.stringify({
359
- open_nodes: [123],
360
- selected_node: [123]
361
- });
362
- });
363
- it("restores the state", function () {
364
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
365
- name: "node1",
366
- open: true
367
- }), expect.objectContaining({
368
- name: "node2",
369
- open: false
370
- })]);
371
- expect(given.node1.element).toBeSelected();
372
- });
373
- });
374
- });
375
- describe("onLoadFailed", function () {
376
- var given = (0, _givens["default"])();
377
- given("$tree", function () {
378
- return $("#tree1");
379
- });
380
- context("when the loading fails", function () {
381
- beforeEach(function () {
382
- server.use(_msw.rest.get("/tree/", function (_request, response, ctx) {
383
- return response(ctx.status(500), ctx.body("Internal server error"));
384
- }));
385
- });
386
- it("calls onLoadFailed", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
387
- var onLoadFailed;
388
- return _regeneratorRuntime().wrap(function _callee2$(_context2) {
389
- while (1) switch (_context2.prev = _context2.next) {
390
- case 0:
391
- onLoadFailed = jest.fn();
392
- given.$tree.tree({
393
- dataUrl: "/tree/",
394
- onLoadFailed: onLoadFailed
395
- });
396
- _context2.next = 4;
397
- return (0, _dom.waitFor)(function () {
398
- expect(onLoadFailed).toHaveBeenCalledWith(expect.objectContaining({
399
- status: 500
400
- }));
401
- });
402
- case 4:
403
- case "end":
404
- return _context2.stop();
405
- }
406
- }, _callee2);
407
- })));
408
- });
409
- });
410
- describe("rtl", function () {
411
- var given = (0, _givens["default"])();
412
- given("node1", function () {
413
- return given.$tree.tree("getNodeByNameMustExist", "node1");
414
- });
415
- given("$tree", function () {
416
- return $("#tree1");
417
- });
418
- context("with the rtl option is true", function () {
419
- beforeEach(function () {
420
- given.$tree.tree({
421
- data: _exampleData["default"],
422
- rtl: true
423
- });
424
- });
425
- it("has a different closed icon", function () {
426
- expect((0, _testUtil.togglerLink)(given.node1.element).text()).toBe("◀");
427
- });
428
- });
429
- context("with the rtl data option", function () {
430
- beforeEach(function () {
431
- given.$tree.attr("data-rtl", "true");
432
- given.$tree.tree({
433
- data: _exampleData["default"]
434
- });
435
- });
436
- it("has a different closed icon", function () {
437
- expect((0, _testUtil.togglerLink)(given.node1.element).text()).toBe("◀");
438
- });
439
- });
440
- });
441
- describe("saveState", function () {
442
- var given = (0, _givens["default"])();
443
- given("node1", function () {
444
- return given.$tree.tree("getNodeByNameMustExist", "node1");
445
- });
446
- given("$tree", function () {
447
- return $("#tree1");
448
- });
449
- context("when a node is open and selected", function () {
450
- beforeEach(function () {
451
- given.$tree.tree({
452
- animationSpeed: 0,
453
- autoOpen: false,
454
- data: _exampleData["default"],
455
- saveState: given.saveState
456
- });
457
- given.$tree.tree("selectNode", given.node1);
458
- given.$tree.tree("openNode", given.node1);
459
- });
460
- context("when saveState is true", function () {
461
- given("saveState", function () {
462
- return true;
463
- });
464
- it("saves the state to local storage", function () {
465
- expect(localStorage.getItem("tree")).toBe('{"open_nodes":[123],"selected_node":[123]}');
466
- });
467
- });
468
- context("when saveState is a string", function () {
469
- given("saveState", function () {
470
- return "my-state";
471
- });
472
- it("uses the string as a key", function () {
473
- expect(localStorage.getItem("my-state")).toBe('{"open_nodes":[123],"selected_node":[123]}');
474
- });
475
- });
476
- context("when saveState is false", function () {
477
- given("saveState", function () {
478
- return false;
479
- });
480
- it("doesn't save to local storage", function () {
481
- expect(localStorage.getItem("tree")).toBeNull();
482
- });
483
- });
484
- });
485
- context("when there is a state in the local storage", function () {
486
- given("saveState", function () {
487
- return true;
488
- });
489
- beforeEach(function () {
490
- localStorage.setItem("tree", '{"open_nodes":[123],"selected_node":[123]}');
491
- given.$tree.tree({
492
- animationSpeed: 0,
493
- autoOpen: false,
494
- data: _exampleData["default"],
495
- saveState: given.saveState
496
- });
497
- });
498
- it("restores the state", function () {
499
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
500
- name: "node1",
501
- open: true,
502
- selected: true
503
- }), expect.objectContaining({
504
- name: "node2",
505
- open: false,
506
- selected: false
507
- })]);
508
- });
509
- });
510
- });
511
- describe("showEmptyFolder", function () {
512
- context("when children attribute is an empty array", function () {
513
- var given = (0, _givens["default"])();
514
- given("$tree", function () {
515
- return $("#tree1");
516
- });
517
- beforeEach(function () {
518
- given.$tree.tree({
519
- data: [{
520
- name: "parent1",
521
- children: []
522
- }],
523
- showEmptyFolder: given.showEmptyFolder
524
- });
525
- });
526
- context("with showEmptyFolder false", function () {
527
- given("showEmptyFolder", function () {
528
- return false;
529
- });
530
- it("creates a child node", function () {
531
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
532
- name: "parent1"
533
- })]);
534
- });
535
- });
536
- context("with showEmptyFolder true", function () {
537
- given("showEmptyFolder", function () {
538
- return true;
539
- });
540
- it("creates a folder", function () {
541
- expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
542
- name: "parent1",
543
- children: []
544
- })]);
545
- });
546
- });
547
- });
548
- });