jqtree 1.6.1 → 1.6.2

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 (84) hide show
  1. package/.eslintrc +1 -0
  2. package/_config.yml +1 -1
  3. package/_entries/10_changelog.md +5 -0
  4. package/_layouts/base.html +0 -22
  5. package/babel.config.json +11 -0
  6. package/babel.coverage.config.json +4 -0
  7. package/bower.json +1 -1
  8. package/jest-browser.config.js +0 -3
  9. package/jest-jsdom.config.js +1 -2
  10. package/jqtree.css +4 -1
  11. package/jqtree.postcss +3 -0
  12. package/lib/dataLoader.js +146 -98
  13. package/lib/dragAndDropHandler.js +668 -472
  14. package/lib/elementsRenderer.js +282 -197
  15. package/lib/jqtreeOptions.js +1 -2
  16. package/lib/keyHandler.js +134 -87
  17. package/lib/mouse.widget.js +285 -186
  18. package/lib/node.js +691 -505
  19. package/lib/nodeElement.js +329 -207
  20. package/lib/playwright/playwright.test.js +216 -189
  21. package/lib/playwright/testUtil.js +429 -193
  22. package/lib/playwright/visualRegression.js +182 -117
  23. package/lib/saveStateHandler.js +311 -204
  24. package/lib/scrollHandler.js +293 -199
  25. package/lib/selectNodeHandler.js +140 -100
  26. package/lib/simple.widget.js +184 -109
  27. package/lib/test/global.d.js +3 -0
  28. package/lib/test/jqTree/create.test.js +44 -40
  29. package/lib/test/jqTree/events.test.js +185 -138
  30. package/lib/test/jqTree/keyboard.test.js +216 -199
  31. package/lib/test/jqTree/loadOnDemand.test.js +233 -157
  32. package/lib/test/jqTree/methods.test.js +1269 -1019
  33. package/lib/test/jqTree/options.test.js +467 -398
  34. package/lib/test/node.test.js +1036 -873
  35. package/lib/test/nodeUtil.test.js +21 -20
  36. package/lib/test/support/exampleData.js +35 -23
  37. package/lib/test/support/jqTreeMatchers.js +72 -54
  38. package/lib/test/support/matchers.d.js +1 -0
  39. package/lib/test/support/setupTests.js +9 -3
  40. package/lib/test/support/testUtil.js +35 -15
  41. package/lib/test/support/treeStructure.js +41 -32
  42. package/lib/test/util.test.js +21 -20
  43. package/lib/tree.jquery.d.js +1 -0
  44. package/lib/tree.jquery.js +1264 -892
  45. package/lib/types.js +1 -2
  46. package/lib/typings.d.js +2 -0
  47. package/lib/util.js +19 -8
  48. package/lib/version.js +8 -3
  49. package/package.json +42 -34
  50. package/production +4 -4
  51. package/rollup.config.js +16 -11
  52. package/src/dataLoader.ts +6 -6
  53. package/src/dragAndDropHandler.ts +0 -4
  54. package/src/elementsRenderer.ts +4 -0
  55. package/src/jqtreeOptions.ts +1 -1
  56. package/src/mouse.widget.ts +19 -15
  57. package/src/node.ts +27 -41
  58. package/src/nodeElement.ts +17 -9
  59. package/src/playwright/.eslintrc +5 -0
  60. package/src/playwright/playwright.test.ts +29 -29
  61. package/src/saveStateHandler.ts +11 -6
  62. package/src/selectNodeHandler.ts +1 -1
  63. package/src/simple.widget.ts +1 -1
  64. package/src/test/.eslintrc +4 -0
  65. package/src/test/jqTree/create.test.ts +0 -1
  66. package/src/test/jqTree/events.test.ts +0 -1
  67. package/src/test/jqTree/keyboard.test.ts +0 -1
  68. package/src/test/jqTree/loadOnDemand.test.ts +46 -1
  69. package/src/test/jqTree/methods.test.ts +35 -10
  70. package/src/test/jqTree/options.test.ts +4 -5
  71. package/src/test/node.test.ts +2 -2
  72. package/src/test/support/jqTreeMatchers.ts +8 -9
  73. package/src/test/support/matchers.d.ts +2 -4
  74. package/src/test/support/setupTests.ts +2 -1
  75. package/src/tree.jquery.d.ts +18 -12
  76. package/src/tree.jquery.ts +25 -21
  77. package/src/version.ts +1 -1
  78. package/static/example.postcss +13 -0
  79. package/static/example_data.js +33 -36
  80. package/tree.jquery.debug.js +4806 -3325
  81. package/tree.jquery.debug.js.map +1 -1
  82. package/tree.jquery.js +2 -2
  83. package/tree.jquery.js.map +1 -1
  84. package/tsconfig.json +1 -0
@@ -1,173 +1,249 @@
1
1
  "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- var __generator = (this && this.__generator) || function (thisArg, body) {
12
- var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
- return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
- function verb(n) { return function (v) { return step([n, v]); }; }
15
- function step(op) {
16
- if (f) throw new TypeError("Generator is already executing.");
17
- while (_) try {
18
- if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
- if (y = 0, t) op = [op[0] & 2, t.value];
20
- switch (op[0]) {
21
- case 0: case 1: t = op; break;
22
- case 4: _.label++; return { value: op[1], done: false };
23
- case 5: _.label++; y = op[1]; op = [0]; continue;
24
- case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
- default:
26
- if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
- if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
- if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
- if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
- if (t[2]) _.ops.pop();
31
- _.trys.pop(); continue;
32
- }
33
- op = body.call(thisArg, _);
34
- } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
- if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
- }
37
- };
38
- exports.__esModule = true;
39
- var $ = require("jquery");
40
- var givens_1 = require("givens");
41
- var dom_1 = require("@testing-library/dom");
42
- var msw_1 = require("msw");
43
- var node_1 = require("msw/node");
2
+
3
+ var _givens = _interopRequireDefault(require("givens"));
4
+
5
+ var _dom = require("@testing-library/dom");
6
+
7
+ var _msw = require("msw");
8
+
9
+ var _node = require("msw/node");
10
+
44
11
  require("../../tree.jquery");
45
- var testUtil_1 = require("../support/testUtil");
12
+
13
+ var _testUtil = require("../support/testUtil");
14
+
15
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; }
16
+
17
+ 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); } }
18
+
19
+ 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); }); }; }
20
+
46
21
  var context = describe;
47
22
  beforeEach(function () {
48
- $("body").append('<div id="tree1"></div>');
23
+ $("body").append('<div id="tree1"></div>');
49
24
  });
50
25
  afterEach(function () {
51
- var $tree = $("#tree1");
52
- $tree.tree("destroy");
53
- $tree.remove();
54
- localStorage.clear();
26
+ var $tree = $("#tree1");
27
+ $tree.tree("destroy");
28
+ $tree.remove();
29
+ localStorage.clear();
55
30
  });
56
31
  context("when a node has load_on_demand in the data", function () {
57
- var given = givens_1["default"]();
58
- given("autoOpen", function () { return false; });
59
- given("$tree", function () { return $("#tree1"); });
60
- var initialData = [
61
- {
62
- id: 1,
63
- name: "parent-node",
64
- load_on_demand: true
65
- },
66
- ];
67
- var server = null;
68
- beforeAll(function () {
69
- server = node_1.setupServer(msw_1.rest.get("/tree/", function (request, response, ctx) {
70
- var parentId = request.url.searchParams.get("node");
71
- if (parentId === "1") {
72
- return response(ctx.status(200), ctx.json([{ id: 2, name: "loaded-on-demand" }]));
73
- }
74
- else {
75
- return response(ctx.status(400));
76
- }
77
- }));
78
- server.listen();
32
+ var given = (0, _givens["default"])();
33
+ given("autoOpen", function () {
34
+ return false;
35
+ });
36
+ given("$tree", function () {
37
+ return $("#tree1");
38
+ });
39
+ var initialData = [{
40
+ id: 1,
41
+ name: "parent-node",
42
+ load_on_demand: true
43
+ }];
44
+ var server = null;
45
+ beforeAll(function () {
46
+ server = (0, _node.setupServer)(_msw.rest.get("/tree/", function (request, response, ctx) {
47
+ var parentId = request.url.searchParams.get("node");
48
+
49
+ if (parentId === "1") {
50
+ return response(ctx.status(200), ctx.json([{
51
+ id: 2,
52
+ name: "loaded-on-demand"
53
+ }]));
54
+ } else {
55
+ return response(ctx.status(400));
56
+ }
57
+ }));
58
+ server.listen();
59
+ });
60
+ afterAll(function () {
61
+ var _server;
62
+
63
+ (_server = server) === null || _server === void 0 ? void 0 : _server.close();
64
+ });
65
+ beforeEach(function () {
66
+ if (given.savedState) {
67
+ localStorage.setItem("tree", given.savedState);
68
+ }
69
+
70
+ given.$tree.tree({
71
+ autoOpen: given.autoOpen,
72
+ data: initialData,
73
+ dataUrl: "/tree/",
74
+ saveState: true
79
75
  });
80
- afterAll(function () {
81
- server === null || server === void 0 ? void 0 : server.close();
76
+ });
77
+ it("creates a parent node without children", function () {
78
+ expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
79
+ children: [],
80
+ name: "parent-node",
81
+ open: false
82
+ })]);
83
+ });
84
+ context("when the node is opened", function () {
85
+ given("node", function () {
86
+ return given.$tree.tree("getNodeByNameMustExist", "parent-node");
82
87
  });
83
- beforeEach(function () {
84
- if (given.savedState) {
85
- localStorage.setItem("tree", given.savedState);
88
+ it("loads the subtree", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
89
+ return regeneratorRuntime.wrap(function _callee$(_context) {
90
+ while (1) {
91
+ switch (_context.prev = _context.next) {
92
+ case 0:
93
+ (0, _testUtil.togglerLink)(given.node.element).trigger("click");
94
+ _context.next = 3;
95
+ return _dom.screen.findByText("loaded-on-demand");
96
+
97
+ case 3:
98
+ expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
99
+ name: "parent-node",
100
+ open: true,
101
+ children: [expect.objectContaining({
102
+ name: "loaded-on-demand"
103
+ })]
104
+ })]);
105
+
106
+ case 4:
107
+ case "end":
108
+ return _context.stop();
109
+ }
86
110
  }
87
- given.$tree.tree({
88
- autoOpen: given.autoOpen,
89
- data: initialData,
90
- dataUrl: "/tree/",
91
- saveState: true
92
- });
111
+ }, _callee);
112
+ })));
113
+ context("when the node is selected and has the focus", function () {
114
+ beforeEach(function () {
115
+ given.$tree.tree("selectNode", given.node);
116
+ });
117
+ it("keeps the node selected and focused", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() {
118
+ return regeneratorRuntime.wrap(function _callee2$(_context2) {
119
+ while (1) {
120
+ switch (_context2.prev = _context2.next) {
121
+ case 0:
122
+ expect(given.node.element).toBeSelected();
123
+ expect(given.node.element).toBeFocused();
124
+ (0, _testUtil.togglerLink)(given.node.element).trigger("click");
125
+ _context2.next = 5;
126
+ return _dom.screen.findByText("loaded-on-demand");
127
+
128
+ case 5:
129
+ expect(given.node.element).toBeSelected();
130
+ expect(given.node.element).toBeFocused();
131
+
132
+ case 7:
133
+ case "end":
134
+ return _context2.stop();
135
+ }
136
+ }
137
+ }, _callee2);
138
+ })));
93
139
  });
94
- it("creates a parent node without children", function () {
95
- expect(given.$tree).toHaveTreeStructure([
96
- expect.objectContaining({
97
- children: [],
98
- name: "parent-node",
99
- open: false
100
- }),
101
- ]);
140
+ context("when the node is not selected", function () {
141
+ it("doesn't select the node", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3() {
142
+ return regeneratorRuntime.wrap(function _callee3$(_context3) {
143
+ while (1) {
144
+ switch (_context3.prev = _context3.next) {
145
+ case 0:
146
+ expect(given.node.element).not.toBeSelected();
147
+ (0, _testUtil.togglerLink)(given.node.element).trigger("click");
148
+ _context3.next = 4;
149
+ return _dom.screen.findByText("loaded-on-demand");
150
+
151
+ case 4:
152
+ expect(given.node.element).not.toBeSelected();
153
+
154
+ case 5:
155
+ case "end":
156
+ return _context3.stop();
157
+ }
158
+ }
159
+ }, _callee3);
160
+ })));
102
161
  });
103
- context("when the node is opened", function () {
104
- given("node", function () {
105
- return given.$tree.tree("getNodeByNameMustExist", "parent-node");
106
- });
107
- it("loads the subtree", function () { return __awaiter(void 0, void 0, void 0, function () {
108
- return __generator(this, function (_a) {
109
- switch (_a.label) {
110
- case 0:
111
- testUtil_1.togglerLink(given.node.element).trigger("click");
112
- return [4 /*yield*/, dom_1.screen.findByText("loaded-on-demand")];
113
- case 1:
114
- _a.sent();
115
- expect(given.$tree).toHaveTreeStructure([
116
- expect.objectContaining({
117
- name: "parent-node",
118
- open: true,
119
- children: [
120
- expect.objectContaining({ name: "loaded-on-demand" }),
121
- ]
122
- }),
123
- ]);
124
- return [2 /*return*/];
125
- }
126
- });
127
- }); });
162
+ context("when the node is selected and doesn't have the focus", function () {
163
+ beforeEach(function () {
164
+ given.$tree.tree("selectNode", given.node);
165
+ document.activeElement.blur();
166
+ });
167
+ it("keeps the node selected and not focused", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() {
168
+ return regeneratorRuntime.wrap(function _callee4$(_context4) {
169
+ while (1) {
170
+ switch (_context4.prev = _context4.next) {
171
+ case 0:
172
+ expect(given.node.element).toBeSelected();
173
+ expect(given.node.element).not.toBeFocused();
174
+ (0, _testUtil.togglerLink)(given.node.element).trigger("click");
175
+ _context4.next = 5;
176
+ return _dom.screen.findByText("loaded-on-demand");
177
+
178
+ case 5:
179
+ expect(given.node.element).toBeSelected();
180
+ expect(given.node.element).not.toBeFocused();
181
+
182
+ case 7:
183
+ case "end":
184
+ return _context4.stop();
185
+ }
186
+ }
187
+ }, _callee4);
188
+ })));
128
189
  });
129
- context("with autoOpen is true", function () {
130
- given("autoOpen", function () { return true; });
131
- it("loads the node on demand", function () { return __awaiter(void 0, void 0, void 0, function () {
132
- return __generator(this, function (_a) {
133
- switch (_a.label) {
134
- case 0: return [4 /*yield*/, dom_1.screen.findByText("loaded-on-demand")];
135
- case 1:
136
- _a.sent();
137
- expect(given.$tree).toHaveTreeStructure([
138
- expect.objectContaining({
139
- name: "parent-node",
140
- open: true,
141
- children: [
142
- expect.objectContaining({ name: "loaded-on-demand" }),
143
- ]
144
- }),
145
- ]);
146
- return [2 /*return*/];
147
- }
148
- });
149
- }); });
190
+ });
191
+ context("with autoOpen is true", function () {
192
+ given("autoOpen", function () {
193
+ return true;
150
194
  });
151
- context("with a saved state with an opened node", function () {
152
- given("savedState", function () { return '{"open_nodes":[1],"selected_node":[]}'; });
153
- it("opens the node and loads its children on demand", function () { return __awaiter(void 0, void 0, void 0, function () {
154
- return __generator(this, function (_a) {
155
- switch (_a.label) {
156
- case 0: return [4 /*yield*/, dom_1.screen.findByText("loaded-on-demand")];
157
- case 1:
158
- _a.sent();
159
- expect(given.$tree).toHaveTreeStructure([
160
- expect.objectContaining({
161
- name: "parent-node",
162
- open: true,
163
- children: [
164
- expect.objectContaining({ name: "loaded-on-demand" }),
165
- ]
166
- }),
167
- ]);
168
- return [2 /*return*/];
169
- }
170
- });
171
- }); });
195
+ it("loads the node on demand", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() {
196
+ return regeneratorRuntime.wrap(function _callee5$(_context5) {
197
+ while (1) {
198
+ switch (_context5.prev = _context5.next) {
199
+ case 0:
200
+ _context5.next = 2;
201
+ return _dom.screen.findByText("loaded-on-demand");
202
+
203
+ case 2:
204
+ expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
205
+ name: "parent-node",
206
+ open: true,
207
+ children: [expect.objectContaining({
208
+ name: "loaded-on-demand"
209
+ })]
210
+ })]);
211
+
212
+ case 3:
213
+ case "end":
214
+ return _context5.stop();
215
+ }
216
+ }
217
+ }, _callee5);
218
+ })));
219
+ });
220
+ context("with a saved state with an opened node", function () {
221
+ given("savedState", function () {
222
+ return '{"open_nodes":[1],"selected_node":[]}';
172
223
  });
173
- });
224
+ it("opens the node and loads its children on demand", /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee6() {
225
+ return regeneratorRuntime.wrap(function _callee6$(_context6) {
226
+ while (1) {
227
+ switch (_context6.prev = _context6.next) {
228
+ case 0:
229
+ _context6.next = 2;
230
+ return _dom.screen.findByText("loaded-on-demand");
231
+
232
+ case 2:
233
+ expect(given.$tree).toHaveTreeStructure([expect.objectContaining({
234
+ name: "parent-node",
235
+ open: true,
236
+ children: [expect.objectContaining({
237
+ name: "loaded-on-demand"
238
+ })]
239
+ })]);
240
+
241
+ case 3:
242
+ case "end":
243
+ return _context6.stop();
244
+ }
245
+ }
246
+ }, _callee6);
247
+ })));
248
+ });
249
+ });