jqtree 1.8.1 → 1.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/bower.json +1 -1
  2. package/package.json +20 -19
  3. package/src/dragAndDropHandler/generateHitAreas.ts +56 -41
  4. package/src/nodeElement/ghostDropHint.ts +3 -37
  5. package/src/nodeElement/index.ts +1 -1
  6. package/src/saveStateHandler.ts +43 -59
  7. package/src/version.ts +1 -1
  8. package/tree.jquery.debug.js +77 -104
  9. package/tree.jquery.debug.js.map +1 -1
  10. package/tree.jquery.js +2 -2
  11. package/tree.jquery.js.map +1 -1
  12. package/.editorconfig +0 -12
  13. package/.eslintrc +0 -48
  14. package/.github/workflows/ci.yml +0 -68
  15. package/.github/workflows/codeql-analysis.yml +0 -32
  16. package/.github/workflows/size.yml +0 -24
  17. package/.github/workflows/static.yml +0 -57
  18. package/.prettier +0 -3
  19. package/config/.postcssrc +0 -6
  20. package/config/babel.config.json +0 -11
  21. package/config/babel.coverage.config.json +0 -4
  22. package/config/jest.config.js +0 -24
  23. package/config/jest.polyfills.js +0 -14
  24. package/config/playwright.config.js +0 -18
  25. package/config/production +0 -6
  26. package/config/rollup.config.mjs +0 -71
  27. package/css/jqtree.postcss +0 -193
  28. package/devserver/devserver.js +0 -7
  29. package/devserver/devserver_scroll.js +0 -8
  30. package/devserver/index.html +0 -22
  31. package/devserver/test_index.html +0 -22
  32. package/devserver/test_scroll.html +0 -28
  33. package/devserver/test_scroll_container.html +0 -39
  34. package/docs/.ruby-version +0 -1
  35. package/docs/Gemfile +0 -5
  36. package/docs/Gemfile.lock +0 -82
  37. package/docs/_config.yml +0 -126
  38. package/docs/_entries/events/index.md +0 -6
  39. package/docs/_entries/events/tree-click.md +0 -37
  40. package/docs/_entries/events/tree-close.md +0 -15
  41. package/docs/_entries/events/tree-contextmenu.md +0 -21
  42. package/docs/_entries/events/tree-dblclick.md +0 -19
  43. package/docs/_entries/events/tree-init.md +0 -15
  44. package/docs/_entries/events/tree-load-data.md +0 -15
  45. package/docs/_entries/events/tree-loading-data.md +0 -27
  46. package/docs/_entries/events/tree-move.md +0 -73
  47. package/docs/_entries/events/tree-open.md +0 -15
  48. package/docs/_entries/events/tree-refresh.md +0 -12
  49. package/docs/_entries/events/tree-select.md +0 -28
  50. package/docs/_entries/functions/addnodeafter.md +0 -20
  51. package/docs/_entries/functions/addnodebefore.md +0 -8
  52. package/docs/_entries/functions/addparentnode.md +0 -20
  53. package/docs/_entries/functions/appendnode.md +0 -50
  54. package/docs/_entries/functions/closenode.md +0 -23
  55. package/docs/_entries/functions/destroy.md +0 -12
  56. package/docs/_entries/functions/getnodebycallback.md +0 -24
  57. package/docs/_entries/functions/getnodebyhtmlelement.md +0 -29
  58. package/docs/_entries/functions/getnodebyid.md +0 -21
  59. package/docs/_entries/functions/getselectednode.md +0 -10
  60. package/docs/_entries/functions/getstate.md +0 -19
  61. package/docs/_entries/functions/gettree.md +0 -12
  62. package/docs/_entries/functions/index.md +0 -6
  63. package/docs/_entries/functions/is-node-selected.md +0 -11
  64. package/docs/_entries/functions/isdragging.md +0 -12
  65. package/docs/_entries/functions/loaddata.md +0 -46
  66. package/docs/_entries/functions/loaddatafromurl.md +0 -55
  67. package/docs/_entries/functions/movedown.md +0 -8
  68. package/docs/_entries/functions/movenode.md +0 -15
  69. package/docs/_entries/functions/moveup.md +0 -8
  70. package/docs/_entries/functions/opennode.md +0 -44
  71. package/docs/_entries/functions/prependnode.md +0 -21
  72. package/docs/_entries/functions/refresh.md +0 -12
  73. package/docs/_entries/functions/reload.md +0 -22
  74. package/docs/_entries/functions/removenode.md +0 -12
  75. package/docs/_entries/functions/scrolltonode.md +0 -13
  76. package/docs/_entries/functions/selectnode.md +0 -45
  77. package/docs/_entries/functions/setoption.md +0 -12
  78. package/docs/_entries/functions/setstate.md +0 -8
  79. package/docs/_entries/functions/toggle.md +0 -25
  80. package/docs/_entries/functions/tojson.md +0 -13
  81. package/docs/_entries/functions/updatenode.md +0 -50
  82. package/docs/_entries/general/changelog.md +0 -430
  83. package/docs/_entries/general/demo.html +0 -28
  84. package/docs/_entries/general/downloads.md +0 -9
  85. package/docs/_entries/general/examples.md +0 -8
  86. package/docs/_entries/general/features.md +0 -15
  87. package/docs/_entries/general/index.md +0 -7
  88. package/docs/_entries/general/introduction.md +0 -9
  89. package/docs/_entries/general/requirements.md +0 -6
  90. package/docs/_entries/general/tutorial.md +0 -71
  91. package/docs/_entries/general/usecases.md +0 -15
  92. package/docs/_entries/multiple_selection/add-to-selection.md +0 -21
  93. package/docs/_entries/multiple_selection/get-selected-nodes.md +0 -10
  94. package/docs/_entries/multiple_selection/index.md +0 -9
  95. package/docs/_entries/multiple_selection/remove-from-selection.md +0 -11
  96. package/docs/_entries/node/children.md +0 -12
  97. package/docs/_entries/node/getdata.md +0 -17
  98. package/docs/_entries/node/getlevel.md +0 -13
  99. package/docs/_entries/node/getnextnode.md +0 -12
  100. package/docs/_entries/node/getnextsibling.md +0 -10
  101. package/docs/_entries/node/getnextvisiblenode.md +0 -15
  102. package/docs/_entries/node/getpreviousnode.md +0 -12
  103. package/docs/_entries/node/getprevioussibling.md +0 -10
  104. package/docs/_entries/node/getpreviousvisiblenode.md +0 -15
  105. package/docs/_entries/node/index.md +0 -13
  106. package/docs/_entries/node/parent.md +0 -10
  107. package/docs/_entries/options/animationspeed.md +0 -7
  108. package/docs/_entries/options/autoescape.md +0 -6
  109. package/docs/_entries/options/autoopen.md +0 -28
  110. package/docs/_entries/options/buttonleft.md +0 -12
  111. package/docs/_entries/options/closedicon.md +0 -26
  112. package/docs/_entries/options/data-url.md +0 -45
  113. package/docs/_entries/options/data.md +0 -46
  114. package/docs/_entries/options/datafilter.md +0 -17
  115. package/docs/_entries/options/draganddrop.md +0 -18
  116. package/docs/_entries/options/index.md +0 -6
  117. package/docs/_entries/options/keyboardsupport.md +0 -14
  118. package/docs/_entries/options/oncanmove.md +0 -22
  119. package/docs/_entries/options/oncanmoveto.md +0 -22
  120. package/docs/_entries/options/oncanselectnode.md +0 -26
  121. package/docs/_entries/options/oncreateli.md +0 -22
  122. package/docs/_entries/options/ondragmove.md +0 -20
  123. package/docs/_entries/options/ondragstop.md +0 -20
  124. package/docs/_entries/options/onismovehandle.md +0 -17
  125. package/docs/_entries/options/onloadfailed.md +0 -15
  126. package/docs/_entries/options/onloading.md +0 -22
  127. package/docs/_entries/options/openedicon.md +0 -26
  128. package/docs/_entries/options/openfolderdelay.md +0 -15
  129. package/docs/_entries/options/rtl.md +0 -18
  130. package/docs/_entries/options/savestate.md +0 -39
  131. package/docs/_entries/options/selectable.md +0 -18
  132. package/docs/_entries/options/showemptyfolder.md +0 -26
  133. package/docs/_entries/options/slide.md +0 -12
  134. package/docs/_entries/options/start_dnd_delay.md +0 -13
  135. package/docs/_entries/options/tabindex.md +0 -14
  136. package/docs/_entries/options/usecontextmenu.md +0 -14
  137. package/docs/_examples/01_load_json_data.html +0 -45
  138. package/docs/_examples/02_load_json_data_from_server.html +0 -29
  139. package/docs/_examples/03_drag_and_drop.html +0 -42
  140. package/docs/_examples/04_save_state.html +0 -46
  141. package/docs/_examples/05_load_on_demand.html +0 -68
  142. package/docs/_examples/06_autoescape.html +0 -45
  143. package/docs/_examples/07_autoscroll.html +0 -42
  144. package/docs/_examples/08_multiple_select.html +0 -60
  145. package/docs/_examples/09_custom_html.html +0 -61
  146. package/docs/_examples/10_icon_buttons.html +0 -26
  147. package/docs/_examples/11_right-to-left.html +0 -25
  148. package/docs/_examples/12_button_on_right.html +0 -26
  149. package/docs/_examples/13_drag_outside.html +0 -48
  150. package/docs/_examples/14_filter.html +0 -111
  151. package/docs/_layouts/example.html +0 -7
  152. package/docs/_layouts/page.html +0 -26
  153. package/docs/documentation.css +0 -3
  154. package/docs/index.html +0 -65
  155. package/docs/package.json +0 -22
  156. package/docs/pnpm-lock.yaml +0 -892
  157. package/docs/postcss.config.js +0 -7
  158. package/docs/static/bower.json +0 -8
  159. package/docs/static/bower_components/fontawesome/css/all.min.css +0 -9
  160. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  161. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  162. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  163. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  164. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  165. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  166. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  167. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  168. package/docs/static/bower_components/jquery/dist/jquery.js +0 -10704
  169. package/docs/static/bower_components/jquery/dist/jquery.min.js +0 -2
  170. package/docs/static/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -1061
  171. package/docs/static/documentation.js +0 -26
  172. package/docs/static/example.postcss +0 -68
  173. package/docs/static/example_data.js +0 -122
  174. package/docs/static/examples/autoescape.js +0 -17
  175. package/docs/static/examples/autoscroll.js +0 -6
  176. package/docs/static/examples/button-on-right.js +0 -13
  177. package/docs/static/examples/custom_html.js +0 -27
  178. package/docs/static/examples/drag-outside.js +0 -37
  179. package/docs/static/examples/drag_and_drop.js +0 -13
  180. package/docs/static/examples/filter.js +0 -63
  181. package/docs/static/examples/icon_buttons.js +0 -12
  182. package/docs/static/examples/load_json_data.js +0 -16
  183. package/docs/static/examples/load_json_data_from_server.js +0 -9
  184. package/docs/static/examples/load_on_demand.js +0 -19
  185. package/docs/static/examples/multiple_select.js +0 -23
  186. package/docs/static/examples/right-to-left.js +0 -11
  187. package/docs/static/examples/save_state.js +0 -11
  188. package/docs/static/monokai.css +0 -70
  189. package/docs/static/spinner.gif +0 -0
  190. package/docs/tailwind.config.js +0 -16
  191. package/sitemap.txt +0 -14
  192. package/src/playwright/.eslintrc +0 -5
  193. package/src/playwright/coverage.ts +0 -38
  194. package/src/playwright/playwright.test.ts +0 -401
  195. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
  196. package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
  197. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
  198. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
  199. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
  200. package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
  201. package/src/playwright/testUtils.ts +0 -153
  202. package/src/test/.eslintrc +0 -17
  203. package/src/test/global.d.ts +0 -1
  204. package/src/test/jqTree/accessibility.test.ts +0 -25
  205. package/src/test/jqTree/create.test.ts +0 -54
  206. package/src/test/jqTree/events.test.ts +0 -290
  207. package/src/test/jqTree/keyboard.test.ts +0 -247
  208. package/src/test/jqTree/loadOnDemand.test.ts +0 -198
  209. package/src/test/jqTree/methods.test.ts +0 -1491
  210. package/src/test/jqTree/mouse.test.ts +0 -82
  211. package/src/test/jqTree/options.test.ts +0 -595
  212. package/src/test/node.test.ts +0 -1396
  213. package/src/test/nodeUtils.test.ts +0 -21
  214. package/src/test/position.test.ts +0 -30
  215. package/src/test/support/exampleData.ts +0 -23
  216. package/src/test/support/jqTreeMatchers.ts +0 -68
  217. package/src/test/support/matchers.d.ts +0 -31
  218. package/src/test/support/setupTests.ts +0 -5
  219. package/src/test/support/testUtil.ts +0 -30
  220. package/src/test/support/treeStructure.ts +0 -39
  221. package/src/test/util.test.ts +0 -27
  222. package/tsconfig.json +0 -24
@@ -1,1491 +0,0 @@
1
- import getGiven from "givens";
2
- import { screen, waitFor } from "@testing-library/dom";
3
- import { http, HttpResponse } from "msw";
4
- import { userEvent } from "@testing-library/user-event";
5
- import { setupServer } from "msw/node";
6
- import "../../tree.jquery";
7
- import exampleData from "../support/exampleData";
8
- import { titleSpan } from "../support/testUtil";
9
- import __version__ from "../../version";
10
-
11
- const context = describe;
12
-
13
- const server = setupServer();
14
-
15
- beforeAll(() => server.listen());
16
-
17
- beforeEach(() => {
18
- $("body").append('<div id="tree1"></div>');
19
- });
20
-
21
- afterEach(() => {
22
- server.resetHandlers();
23
-
24
- const $tree = $("#tree1");
25
- $tree.tree("destroy");
26
- $tree.remove();
27
- localStorage.clear();
28
- });
29
-
30
- afterAll(() => server.close());
31
-
32
- describe("addNodeAfter", () => {
33
- interface Vars {
34
- node: INode;
35
- $tree: JQuery<HTMLElement>;
36
- }
37
-
38
- const given = getGiven<Vars>();
39
- given("$tree", () => $("#tree1"));
40
- given("node", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
41
-
42
- beforeEach(() => {
43
- given.$tree.tree({
44
- autoOpen: true,
45
- data: exampleData,
46
- });
47
-
48
- given.$tree.tree("addNodeAfter", "added-node", given.node);
49
- });
50
-
51
- it("adds the node", () => {
52
- expect(given.$tree).toHaveTreeStructure([
53
- expect.objectContaining({ name: "node1" }),
54
- expect.objectContaining({ name: "added-node" }),
55
- expect.objectContaining({ name: "node2" }),
56
- ]);
57
- });
58
- });
59
-
60
- describe("addNodeBefore", () => {
61
- interface Vars {
62
- node: INode;
63
- $tree: JQuery<HTMLElement>;
64
- }
65
-
66
- const given = getGiven<Vars>();
67
- given("$tree", () => $("#tree1"));
68
- given("node", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
69
-
70
- beforeEach(() => {
71
- given.$tree.tree({
72
- autoOpen: true,
73
- data: exampleData,
74
- });
75
-
76
- given.$tree.tree("addNodeBefore", "added-node", given.node);
77
- });
78
-
79
- it("adds the node", () => {
80
- expect(given.$tree).toHaveTreeStructure([
81
- expect.objectContaining({ name: "added-node" }),
82
- expect.objectContaining({ name: "node1" }),
83
- expect.objectContaining({ name: "node2" }),
84
- ]);
85
- });
86
- });
87
-
88
- describe("addParentNode", () => {
89
- interface Vars {
90
- child1: INode;
91
- $tree: JQuery<HTMLElement>;
92
- }
93
-
94
- const given = getGiven<Vars>();
95
- given("$tree", () => $("#tree1"));
96
- given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
97
-
98
- beforeEach(() => {
99
- given.$tree.tree({
100
- autoOpen: true,
101
- data: exampleData,
102
- });
103
-
104
- given.$tree.tree("addParentNode", "new-parent-node", given.child1);
105
- });
106
-
107
- it("adds the parent node", () => {
108
- expect(given.$tree).toHaveTreeStructure([
109
- expect.objectContaining({
110
- name: "node1",
111
- children: [
112
- expect.objectContaining({
113
- name: "new-parent-node",
114
- children: [
115
- expect.objectContaining({ name: "child1" }),
116
- expect.objectContaining({ name: "child2" }),
117
- ],
118
- }),
119
- ],
120
- }),
121
- expect.objectContaining({ name: "node2" }),
122
- ]);
123
- });
124
- });
125
-
126
- describe("addToSelection", () => {
127
- interface Vars {
128
- child1: INode;
129
- child2: INode;
130
- $tree: JQuery<HTMLElement>;
131
- }
132
-
133
- const given = getGiven<Vars>();
134
- given("$tree", () => $("#tree1"));
135
- given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
136
- given("child2", () => given.$tree.tree("getNodeByNameMustExist", "child2"));
137
-
138
- it("selects the nodes", () => {
139
- given.$tree.tree({
140
- autoOpen: true,
141
- data: exampleData,
142
- });
143
-
144
- given.$tree.tree("addToSelection", given.child1);
145
- given.$tree.tree("addToSelection", given.child2);
146
-
147
- expect(given.$tree.tree("getSelectedNodes")).toEqual(
148
- expect.arrayContaining([given.child1, given.child2]),
149
- );
150
- });
151
-
152
- it("renders the nodes correctly", () => {
153
- given.$tree.tree({
154
- autoOpen: true,
155
- data: exampleData,
156
- });
157
-
158
- given.$tree.tree("addToSelection", given.child1);
159
- given.$tree.tree("addToSelection", given.child2);
160
-
161
- expect(given.$tree).toHaveTreeStructure([
162
- expect.objectContaining({
163
- name: "node1",
164
- selected: false,
165
- children: [
166
- expect.objectContaining({ name: "child1", selected: true }),
167
- expect.objectContaining({ name: "child2", selected: true }),
168
- ],
169
- }),
170
- expect.objectContaining({
171
- name: "node2",
172
- selected: false,
173
- children: [
174
- expect.objectContaining({
175
- name: "node3",
176
- selected: false,
177
- }),
178
- ],
179
- }),
180
- ]);
181
- });
182
-
183
- it("opens the parent node when it's closed", () => {
184
- given.$tree.tree({
185
- autoOpen: false,
186
- data: exampleData,
187
- });
188
-
189
- const node1 = given.$tree.tree("getNodeByNameMustExist", "node1");
190
- expect(node1.is_open).toBeFalsy();
191
-
192
- given.$tree.tree("addToSelection", given.child1);
193
-
194
- expect(node1.is_open).toBe(true);
195
- });
196
- });
197
-
198
- describe("appendNode", () => {
199
- interface Vars {
200
- nodeData: NodeData;
201
- parent: INode | undefined;
202
- $tree: JQuery<HTMLElement>;
203
- }
204
-
205
- const given = getGiven<Vars>();
206
- given("$tree", () => $("#tree1"));
207
- given("parent", () => undefined);
208
- given("nodeData", () => "appended-node");
209
-
210
- beforeEach(() => {
211
- given.$tree.tree({
212
- autoOpen: true,
213
- data: exampleData,
214
- });
215
-
216
- given.$tree.tree("appendNode", given.nodeData, given.parent);
217
- });
218
-
219
- context("with an empty parent parameter", () => {
220
- it("appends the node to the tree", () => {
221
- expect(given.$tree).toHaveTreeStructure([
222
- expect.objectContaining({ name: "node1" }),
223
- expect.objectContaining({ name: "node2" }),
224
- expect.objectContaining({ name: "appended-node" }),
225
- ]);
226
- });
227
- });
228
-
229
- context("when appending to a parent node", () => {
230
- given("parent", () =>
231
- given.$tree.tree("getNodeByNameMustExist", "node1"),
232
- );
233
-
234
- it("appends the node to parent node", () => {
235
- expect(given.$tree).toHaveTreeStructure([
236
- expect.objectContaining({
237
- name: "node1",
238
- children: [
239
- expect.objectContaining({ name: "child1" }),
240
- expect.objectContaining({ name: "child2" }),
241
- expect.objectContaining({ name: "appended-node" }),
242
- ],
243
- }),
244
- expect.objectContaining({ name: "node2" }),
245
- ]);
246
- });
247
- });
248
-
249
- context("when appending a node using an object", () => {
250
- given("nodeData", () => ({
251
- color: "green",
252
- id: 99,
253
- name: "appended-using-object",
254
- }));
255
-
256
- it("appends the node to the tree", () => {
257
- expect(given.$tree).toHaveTreeStructure([
258
- expect.objectContaining({
259
- name: "node1",
260
- }),
261
- expect.objectContaining({ name: "node2" }),
262
- expect.objectContaining({ name: "appended-using-object" }),
263
- ]);
264
- });
265
-
266
- it("sets the properties of the object", () => {
267
- expect(given.$tree.tree("getNodeById", 99)).toMatchObject(
268
- given.nodeData,
269
- );
270
- });
271
- });
272
- });
273
-
274
- describe("closeNode", () => {
275
- interface Vars {
276
- node1: INode;
277
- $tree: JQuery<HTMLElement>;
278
- }
279
-
280
- const given = getGiven<Vars>();
281
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
282
- given("$tree", () => $("#tree1"));
283
-
284
- beforeEach(() => {
285
- given.$tree.tree({
286
- autoOpen: true,
287
- data: exampleData,
288
- });
289
- given.$tree.tree("closeNode", given.node1, false);
290
- });
291
-
292
- it("closes the node", () => {
293
- expect(given.node1.element).toBeClosed();
294
- });
295
- });
296
-
297
- describe("getNodeByCallback", () => {
298
- interface Vars {
299
- $tree: JQuery<HTMLElement>;
300
- }
301
-
302
- const given = getGiven<Vars>();
303
- given("$tree", () => $("#tree1"));
304
-
305
- beforeEach(() => {
306
- given.$tree.tree({ data: exampleData });
307
- });
308
-
309
- it("returns the node", () => {
310
- const callback = (node: INode) => node.name.startsWith("chi");
311
-
312
- expect(given.$tree.tree("getNodeByCallback", callback)).toMatchObject({
313
- name: "child1",
314
- });
315
- });
316
- });
317
-
318
- describe("getNodeByHtmlElement", () => {
319
- interface Vars {
320
- htmlElement: HTMLElement;
321
- $tree: JQuery<HTMLElement>;
322
- }
323
-
324
- const given = getGiven<Vars>();
325
- given("htmlElement", () =>
326
- screen.getByText("node1", { selector: ".jqtree-title" }),
327
- );
328
- given("$tree", () => $("#tree1"));
329
-
330
- beforeEach(() => {
331
- given.$tree.tree({ data: exampleData });
332
- });
333
-
334
- it("returns the node", () => {
335
- expect(
336
- given.$tree.tree("getNodeByHtmlElement", given.htmlElement),
337
- ).toEqual(expect.objectContaining({ name: "node1" }));
338
- });
339
- });
340
-
341
- describe("getNodeById", () => {
342
- interface Vars {
343
- data: NodeData[];
344
- $tree: JQuery<HTMLElement>;
345
- }
346
-
347
- const given = getGiven<Vars>();
348
- given("data", () => exampleData);
349
- given("$tree", () => $("#tree1"));
350
-
351
- beforeEach(() => {
352
- given.$tree.tree({
353
- data: given.data,
354
- });
355
- });
356
-
357
- it("returns the node", () => {
358
- expect(given.$tree.tree("getNodeById", 127)).toMatchObject({
359
- name: "node3",
360
- });
361
- });
362
-
363
- context("with a string parameter", () => {
364
- it("doesn't return the node", () => {
365
- expect(given.$tree.tree("getNodeById", "127")).toBeNull();
366
- });
367
- });
368
-
369
- context("when the node doesn't exist", () => {
370
- it("returns null", () => {
371
- expect(given.$tree.tree("getNodeById", 99999)).toBeNull();
372
- });
373
- });
374
-
375
- context("when the data has string ids", () => {
376
- given("data", () => [{ id: "123", name: "node1" }]);
377
-
378
- context("with a string parameter", () => {
379
- it("returns the node", () => {
380
- expect(given.$tree.tree("getNodeById", "123")).toMatchObject({
381
- name: "node1",
382
- });
383
- });
384
- });
385
-
386
- context("with a number parameter", () => {
387
- it("doesn't return the node", () => {
388
- expect(given.$tree.tree("getNodeById", 123)).toBeNull();
389
- });
390
- });
391
-
392
- context("when the node doesn't exist", () => {
393
- it("returns null", () => {
394
- expect(given.$tree.tree("getNodeById", "abc")).toBeNull();
395
- });
396
- });
397
- });
398
- });
399
-
400
- describe("getNodesByProperty", () => {
401
- interface Vars {
402
- node1: INode;
403
- $tree: JQuery<HTMLElement>;
404
- }
405
-
406
- const given = getGiven<Vars>();
407
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
408
- given("$tree", () => $("#tree1"));
409
-
410
- beforeEach(() => {
411
- given.$tree.tree({
412
- data: exampleData,
413
- });
414
- });
415
-
416
- it("gets nodes by property", () => {
417
- expect(
418
- given.$tree.tree("getNodesByProperty", "intProperty", 1),
419
- ).toEqual([given.node1]);
420
- });
421
- });
422
-
423
- describe("getSelectedNode", () => {
424
- interface Vars {
425
- node: INode;
426
- $tree: JQuery<HTMLElement>;
427
- treeData: NodeData[];
428
- }
429
-
430
- const given = getGiven<Vars>();
431
- given("$tree", () => $("#tree1"));
432
-
433
- beforeEach(() => {
434
- given.$tree.tree({
435
- data: given.treeData,
436
- });
437
- });
438
-
439
- context("when nodes have ids", () => {
440
- given("node", () =>
441
- given.$tree.tree("getNodeByNameMustExist", "node1"),
442
- );
443
- given("treeData", () => exampleData);
444
-
445
- context("when no node is selected", () => {
446
- it("returns false", () => {
447
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
448
- });
449
- });
450
-
451
- context("when a node is selected", () => {
452
- beforeEach(() => {
453
- given.$tree.tree("selectNode", given.node);
454
- });
455
-
456
- it("returns the selected node", () => {
457
- expect(given.$tree.tree("getSelectedNode")).toBe(given.node);
458
- });
459
- });
460
- });
461
-
462
- context("when nodes don't have ids", () => {
463
- given("node", () =>
464
- given.$tree.tree("getNodeByNameMustExist", "without-id1"),
465
- );
466
- given("treeData", () => ["without-id1", "without-id2"]);
467
-
468
- context("when no node is selected", () => {
469
- it("returns false", () => {
470
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
471
- });
472
- });
473
-
474
- context("when a node is selected", () => {
475
- beforeEach(() => {
476
- given.$tree.tree("selectNode", given.node);
477
- });
478
-
479
- it("returns the selected node", () => {
480
- expect(given.$tree.tree("getSelectedNode")).toBe(given.node);
481
- });
482
- });
483
- });
484
- });
485
-
486
- describe("getSelectedNodes", () => {
487
- interface Vars {
488
- child1: INode;
489
- child2: INode;
490
- $tree: JQuery<HTMLElement>;
491
- }
492
-
493
- const given = getGiven<Vars>();
494
- given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
495
- given("child2", () => given.$tree.tree("getNodeByNameMustExist", "child2"));
496
- given("$tree", () => $("#tree1"));
497
-
498
- beforeEach(() => {
499
- given.$tree.tree({
500
- data: exampleData,
501
- });
502
- });
503
-
504
- context("when no node is selected", () => {
505
- it("returns an empty array", () => {
506
- expect(given.$tree.tree("getSelectedNodes")).toHaveLength(0);
507
- });
508
- });
509
-
510
- context("when nodes are selected", () => {
511
- beforeEach(() => {
512
- given.$tree.tree("addToSelection", given.child1);
513
- given.$tree.tree("addToSelection", given.child2);
514
- });
515
-
516
- it("returns the selected nodes", () => {
517
- expect(given.$tree.tree("getSelectedNodes")).toEqual(
518
- expect.arrayContaining([given.child1, given.child2]),
519
- );
520
- });
521
- });
522
- });
523
-
524
- describe("getState", () => {
525
- interface Vars {
526
- node1: INode;
527
- $tree: JQuery<HTMLElement>;
528
- }
529
-
530
- const given = getGiven<Vars>();
531
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
532
- given("$tree", () => $("#tree1"));
533
-
534
- beforeEach(() => {
535
- given.$tree.tree({ data: exampleData });
536
- given.$tree.tree("openNode", given.node1, false);
537
- });
538
-
539
- it("returns the state", () => {
540
- expect(given.$tree.tree("getState")).toEqual({
541
- open_nodes: [123],
542
- selected_node: [],
543
- });
544
- });
545
- });
546
-
547
- describe("getStateFromStorage", () => {
548
- interface Vars {
549
- node1: INode;
550
- $tree: JQuery<HTMLElement>;
551
- }
552
-
553
- const given = getGiven<Vars>();
554
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
555
- given("$tree", () => $("#tree1"));
556
-
557
- beforeEach(() => {
558
- given.$tree.tree({
559
- data: exampleData,
560
- saveState: true,
561
- });
562
- given.$tree.tree("openNode", given.node1, false);
563
- });
564
-
565
- it("returns the state", () => {
566
- expect(given.$tree.tree("getStateFromStorage")).toEqual({
567
- open_nodes: [123],
568
- selected_node: [],
569
- });
570
- });
571
- });
572
-
573
- describe("getTree", () => {
574
- interface Vars {
575
- $tree: JQuery<HTMLElement>;
576
- }
577
- const given = getGiven<Vars>();
578
- given("$tree", () => $("#tree1"));
579
-
580
- beforeEach(() => {
581
- given.$tree.tree({ data: exampleData });
582
- });
583
-
584
- it("returns the tree", () => {
585
- expect(given.$tree.tree("getTree")).toMatchObject({
586
- children: [
587
- expect.objectContaining({ name: "node1" }),
588
- expect.objectContaining({ name: "node2" }),
589
- ],
590
- });
591
- });
592
- });
593
-
594
- describe("getVersion", () => {
595
- interface Vars {
596
- $tree: JQuery<HTMLElement>;
597
- }
598
-
599
- const given = getGiven<Vars>();
600
- given("$tree", () => $("#tree1"));
601
-
602
- beforeEach(() => {
603
- given.$tree.tree();
604
- });
605
-
606
- it("returns the version", () => {
607
- expect(given.$tree.tree("getVersion")).toBe(__version__);
608
- });
609
- });
610
-
611
- describe("isNodeSelected", () => {
612
- interface Vars {
613
- node1: INode;
614
- $tree: JQuery<HTMLElement>;
615
- }
616
-
617
- const given = getGiven<Vars>();
618
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
619
- given("$tree", () => $("#tree1"));
620
-
621
- beforeEach(() => {
622
- given.$tree.tree({ data: exampleData });
623
- });
624
-
625
- context("when the node is selected", () => {
626
- beforeEach(() => {
627
- given.$tree.tree("selectNode", given.node1);
628
- });
629
-
630
- it("returns true", () => {
631
- expect(given.$tree.tree("isNodeSelected", given.node1)).toBeTrue();
632
- });
633
- });
634
-
635
- context("when the node is not selected", () => {
636
- it("returns false", () => {
637
- expect(given.$tree.tree("isNodeSelected", given.node1)).toBeFalse();
638
- });
639
- });
640
- });
641
-
642
- describe("loadData", () => {
643
- interface Vars {
644
- initialData: NodeData[];
645
- $tree: JQuery<HTMLElement>;
646
- }
647
-
648
- const given = getGiven<Vars>();
649
- given("initialData", () => ["initial1"]);
650
- given("$tree", () => $("#tree1"));
651
-
652
- beforeEach(() => {
653
- given.$tree.tree({ data: given.initialData });
654
- });
655
-
656
- context("when the node parameter is empty", () => {
657
- beforeEach(() => {
658
- given.$tree.tree("loadData", exampleData);
659
- });
660
-
661
- it("replaces the whole tree", () => {
662
- expect(given.$tree).toHaveTreeStructure([
663
- expect.objectContaining({
664
- name: "node1",
665
- children: [
666
- expect.objectContaining({ name: "child1" }),
667
- expect.objectContaining({ name: "child2" }),
668
- ],
669
- }),
670
- expect.objectContaining({
671
- name: "node2",
672
- children: [expect.objectContaining({ name: "node3" })],
673
- }),
674
- ]);
675
- });
676
- });
677
-
678
- context("with a node parameter", () => {
679
- beforeEach(() => {
680
- given.$tree.tree(
681
- "loadData",
682
- exampleData,
683
- given.$tree.tree("getNodeByNameMustExist", "initial1"),
684
- );
685
- });
686
-
687
- it("loads the data under the node", () => {
688
- expect(given.$tree).toHaveTreeStructure([
689
- expect.objectContaining({
690
- name: "initial1",
691
- children: [
692
- expect.objectContaining({
693
- name: "node1",
694
- children: [
695
- expect.objectContaining({ name: "child1" }),
696
- expect.objectContaining({ name: "child2" }),
697
- ],
698
- }),
699
- expect.objectContaining({ name: "node2" }),
700
- ],
701
- }),
702
- ]);
703
- });
704
- });
705
-
706
- context("with a node parameter which has a selected child", () => {
707
- given("initialData", () => exampleData);
708
-
709
- beforeEach(() => {
710
- given.$tree.tree(
711
- "selectNode",
712
- given.$tree.tree("getNodeByNameMustExist", "child1"),
713
- );
714
- });
715
-
716
- it("deselects the node", () => {
717
- given.$tree.tree(
718
- "loadData",
719
- ["new-child1"],
720
- given.$tree.tree("getNodeByNameMustExist", "node1"),
721
- );
722
-
723
- expect(given.$tree.tree("getSelectedNode")).toBeFalse();
724
- });
725
-
726
- context("when the selected node doesn't have an id", () => {
727
- given("initialData", () => [
728
- { name: "node1", children: ["child1", "child2"] },
729
- "node2",
730
- ]);
731
-
732
- it("deselects the node", () => {
733
- given.$tree.tree(
734
- "loadData",
735
- ["new-child1"],
736
- given.$tree.tree("getNodeByNameMustExist", "node1"),
737
- );
738
-
739
- expect(given.$tree.tree("getSelectedNode")).toBeFalse();
740
- });
741
-
742
- context("when the selected child is under another node", () => {
743
- it("doesn't deselect the node", () => {
744
- given.$tree.tree(
745
- "loadData",
746
- ["new-child1"],
747
- given.$tree.tree("getNodeByNameMustExist", "node2"),
748
- );
749
-
750
- expect(given.$tree.tree("getSelectedNode")).toMatchObject({
751
- name: "child1",
752
- });
753
- });
754
- });
755
- });
756
- });
757
- });
758
-
759
- describe("loadDataFromUrl", () => {
760
- interface Vars {
761
- initialData: NodeData[];
762
- serverData: NodeData[];
763
- $tree: JQuery<HTMLElement>;
764
- }
765
-
766
- const given = getGiven<Vars>();
767
- given("initialData", () => []);
768
- given("serverData", () => exampleData);
769
- given("$tree", () => $("#tree1"));
770
-
771
- beforeEach(() => {
772
- server.use(
773
- http.get("/tree/", () => HttpResponse.json(given.serverData)),
774
- );
775
-
776
- given.$tree.tree({ data: given.initialData });
777
- });
778
-
779
- context("with url parameter", () => {
780
- it("loads the tree", async () => {
781
- given.$tree.tree("loadDataFromUrl", "/tree/");
782
- await screen.findByText("node1");
783
-
784
- expect(given.$tree).toHaveTreeStructure([
785
- expect.objectContaining({ name: "node1" }),
786
- expect.objectContaining({ name: "node2" }),
787
- ]);
788
- });
789
-
790
- context("with parent node", () => {
791
- given("initialData", () => ["initial1", "initial2"]);
792
- given("serverData", () => ["new1", "new2"]);
793
-
794
- it("loads a subtree", async () => {
795
- const parentNode = given.$tree.tree(
796
- "getNodeByNameMustExist",
797
- "initial1",
798
- );
799
- given.$tree.tree("loadDataFromUrl", "/tree/", parentNode);
800
- await screen.findByText("new1");
801
-
802
- expect(given.$tree).toHaveTreeStructure([
803
- expect.objectContaining({
804
- name: "initial1",
805
- children: [
806
- expect.objectContaining({ name: "new1" }),
807
- expect.objectContaining({ name: "new2" }),
808
- ],
809
- }),
810
- expect.objectContaining({ name: "initial2" }),
811
- ]);
812
- });
813
- });
814
- });
815
-
816
- context("without url parameter", () => {
817
- it("loads the data from dataUrl", async () => {
818
- given.$tree.tree("setOption", "dataUrl", "/tree/");
819
- given.$tree.tree("loadDataFromUrl");
820
- await screen.findByText("node1");
821
-
822
- expect(given.$tree).toHaveTreeStructure([
823
- expect.objectContaining({ name: "node1" }),
824
- expect.objectContaining({ name: "node2" }),
825
- ]);
826
- });
827
- });
828
- });
829
-
830
- describe("moveDown", () => {
831
- interface Vars {
832
- node1: INode;
833
- $tree: JQuery<HTMLElement>;
834
- }
835
- const given = getGiven<Vars>();
836
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
837
- given("$tree", () => $("#tree1"));
838
-
839
- beforeEach(() => {
840
- given.$tree.tree({ data: exampleData });
841
- given.$tree.tree("selectNode", given.node1);
842
- });
843
-
844
- it("selects the next node", () => {
845
- given.$tree.tree("moveDown");
846
- expect(given.$tree.tree("getSelectedNode")).toMatchObject({
847
- name: "node2",
848
- });
849
- });
850
- });
851
-
852
- describe("moveNode", () => {
853
- interface Vars {
854
- child1: INode;
855
- node2: INode;
856
- $tree: JQuery<HTMLElement>;
857
- }
858
-
859
- const given = getGiven<Vars>();
860
- given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
861
- given("node2", () => given.$tree.tree("getNodeByNameMustExist", "node2"));
862
- given("$tree", () => $("#tree1"));
863
-
864
- beforeEach(() => {
865
- given.$tree.tree({
866
- autoOpen: true,
867
- data: exampleData,
868
- });
869
- given.$tree.tree("moveNode", given.child1, given.node2, "after");
870
- });
871
-
872
- it("moves node", () => {
873
- expect(given.$tree).toHaveTreeStructure([
874
- expect.objectContaining({
875
- name: "node1",
876
- children: [expect.objectContaining({ name: "child2" })],
877
- }),
878
- expect.objectContaining({ name: "node2" }),
879
- expect.objectContaining({ name: "child1" }),
880
- ]);
881
- });
882
- });
883
-
884
- describe("moveUp", () => {
885
- interface Vars {
886
- node2: INode;
887
- $tree: JQuery<HTMLElement>;
888
- }
889
- const given = getGiven<Vars>();
890
- given("node2", () => given.$tree.tree("getNodeByNameMustExist", "node2"));
891
- given("$tree", () => $("#tree1"));
892
-
893
- beforeEach(() => {
894
- given.$tree.tree({ data: exampleData });
895
- given.$tree.tree("selectNode", given.node2);
896
- });
897
-
898
- it("selects the next node", () => {
899
- given.$tree.tree("moveUp");
900
- expect(given.$tree.tree("getSelectedNode")).toMatchObject({
901
- name: "node1",
902
- });
903
- });
904
- });
905
-
906
- describe("openNode", () => {
907
- interface Vars {
908
- node1: INode;
909
- $tree: JQuery<HTMLElement>;
910
- }
911
-
912
- const given = getGiven<Vars>();
913
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
914
- given("$tree", () => $("#tree1"));
915
-
916
- beforeEach(() => {
917
- given.$tree.tree({
918
- autoOpen: false,
919
- data: exampleData,
920
- });
921
- });
922
-
923
- it("opens the node", () => {
924
- given.$tree.tree("openNode", given.node1, false);
925
-
926
- expect(given.node1.element).toBeOpen();
927
- });
928
-
929
- context("with onFinished parameter", () => {
930
- it("calls the function", async () => {
931
- const onFinished = jest.fn();
932
-
933
- given.$tree.tree("openNode", given.node1, onFinished);
934
-
935
- await waitFor(() => {
936
- expect(onFinished).toHaveBeenCalledWith(given.node1);
937
- });
938
- });
939
- });
940
- });
941
-
942
- describe("prependNode", () => {
943
- interface Vars {
944
- parent: INode | undefined;
945
- $tree: JQuery<HTMLElement>;
946
- }
947
-
948
- const given = getGiven<Vars>();
949
- given("$tree", () => $("#tree1"));
950
- given("parent", () => undefined);
951
-
952
- beforeEach(() => {
953
- given.$tree.tree({
954
- data: exampleData,
955
- });
956
- given.$tree.tree("prependNode", "prepended-node", given.parent);
957
- });
958
-
959
- context("with an empty parent parameter", () => {
960
- it("prepends the node to the tree", () => {
961
- expect(given.$tree).toHaveTreeStructure([
962
- expect.objectContaining({ name: "prepended-node" }),
963
- expect.objectContaining({ name: "node1" }),
964
- expect.objectContaining({ name: "node2" }),
965
- ]);
966
- });
967
- });
968
-
969
- context("with a parent node", () => {
970
- given("parent", () =>
971
- given.$tree.tree("getNodeByNameMustExist", "node1"),
972
- );
973
-
974
- it("prepends the node to the parent", () => {
975
- expect(given.$tree).toHaveTreeStructure([
976
- expect.objectContaining({
977
- name: "node1",
978
- children: [
979
- expect.objectContaining({ name: "prepended-node" }),
980
- expect.objectContaining({ name: "child1" }),
981
- expect.objectContaining({ name: "child2" }),
982
- ],
983
- }),
984
- expect.objectContaining({ name: "node2" }),
985
- ]);
986
- });
987
- });
988
- });
989
-
990
- describe("refresh", () => {
991
- interface Vars {
992
- $tree: JQuery<HTMLElement>;
993
- }
994
-
995
- const given = getGiven<Vars>();
996
- given("$tree", () => $("#tree1"));
997
-
998
- beforeEach(() => {
999
- given.$tree.tree({
1000
- data: exampleData,
1001
- });
1002
- });
1003
-
1004
- it("rerenders the tree", () => {
1005
- const tree = given.$tree.tree("getTree");
1006
- (tree.children[0] as INode).name = "node1a"; // eslint-disable-line testing-library/no-node-access
1007
-
1008
- expect(given.$tree).toHaveTreeStructure([
1009
- expect.objectContaining({ name: "node1" }),
1010
- expect.objectContaining({ name: "node2" }),
1011
- ]);
1012
-
1013
- given.$tree.tree("refresh");
1014
-
1015
- expect(given.$tree).toHaveTreeStructure([
1016
- expect.objectContaining({ name: "node1a" }),
1017
- expect.objectContaining({ name: "node2" }),
1018
- ]);
1019
- });
1020
- });
1021
-
1022
- describe("reload", () => {
1023
- interface Vars {
1024
- node1: INode;
1025
- $tree: JQuery<HTMLElement>;
1026
- }
1027
-
1028
- const given = getGiven<Vars>();
1029
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
1030
- given("$tree", () => $("#tree1"));
1031
-
1032
- beforeEach(async () => {
1033
- server.use(http.get("/tree2/", () => HttpResponse.json(exampleData)));
1034
-
1035
- given.$tree.tree({ dataUrl: "/tree2/" });
1036
- await screen.findByText("node1");
1037
-
1038
- given.$tree.tree("removeNode", given.node1);
1039
- });
1040
-
1041
- it("reloads the data from the server", async () => {
1042
- expect(given.$tree).toHaveTreeStructure([
1043
- expect.objectContaining({ name: "node2" }),
1044
- ]);
1045
-
1046
- given.$tree.tree("reload");
1047
- await screen.findByText("node1");
1048
-
1049
- expect(given.$tree).toHaveTreeStructure([
1050
- expect.objectContaining({ name: "node1" }),
1051
- expect.objectContaining({ name: "node2" }),
1052
- ]);
1053
- });
1054
-
1055
- context("with a onFinished parameter", () => {
1056
- it("calls onFinished", async () => {
1057
- const handleFinished = jest.fn();
1058
-
1059
- given.$tree.tree("reload", handleFinished);
1060
-
1061
- await waitFor(() => expect(handleFinished).toHaveBeenCalledWith());
1062
-
1063
- expect(given.$tree).toHaveTreeStructure([
1064
- expect.objectContaining({ name: "node1" }),
1065
- expect.objectContaining({ name: "node2" }),
1066
- ]);
1067
- });
1068
- });
1069
- });
1070
-
1071
- describe("removeNode", () => {
1072
- interface Vars {
1073
- node: INode;
1074
- $tree: JQuery<HTMLElement>;
1075
- }
1076
-
1077
- const given = getGiven<Vars>();
1078
- given("$tree", () => $("#tree1"));
1079
-
1080
- beforeEach(() => {
1081
- given.$tree.tree({
1082
- data: exampleData,
1083
- });
1084
- });
1085
-
1086
- context("with a child node", () => {
1087
- given("node", () =>
1088
- given.$tree.tree("getNodeByNameMustExist", "child1"),
1089
- );
1090
-
1091
- it("removes the node", () => {
1092
- given.$tree.tree("removeNode", given.node);
1093
-
1094
- expect(given.$tree).toHaveTreeStructure([
1095
- expect.objectContaining({
1096
- name: "node1",
1097
- children: [expect.objectContaining({ name: "child2" })],
1098
- }),
1099
- expect.objectContaining({
1100
- name: "node2",
1101
- children: [expect.objectContaining({ name: "node3" })],
1102
- }),
1103
- ]);
1104
- });
1105
-
1106
- context("when the node is selected", () => {
1107
- beforeEach(() => {
1108
- given.$tree.tree("selectNode", given.node);
1109
- });
1110
-
1111
- it("removes and deselects the node", () => {
1112
- given.$tree.tree("removeNode", given.node);
1113
-
1114
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
1115
- });
1116
- });
1117
- });
1118
-
1119
- context("with a parent node and its children", () => {
1120
- given("node", () =>
1121
- given.$tree.tree("getNodeByNameMustExist", "node1"),
1122
- );
1123
-
1124
- it("removes the node", () => {
1125
- given.$tree.tree("removeNode", given.node);
1126
-
1127
- expect(given.$tree).toHaveTreeStructure([
1128
- expect.objectContaining({
1129
- name: "node2",
1130
- children: [expect.objectContaining({ name: "node3" })],
1131
- }),
1132
- ]);
1133
- });
1134
-
1135
- context("when a child node is selected", () => {
1136
- beforeEach(() => {
1137
- const child1 = given.$tree.tree(
1138
- "getNodeByNameMustExist",
1139
- "child1",
1140
- );
1141
- given.$tree.tree("selectNode", child1);
1142
- });
1143
-
1144
- it("removes the node and deselects the child", () => {
1145
- given.$tree.tree("removeNode", given.node);
1146
-
1147
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
1148
- });
1149
- });
1150
- });
1151
-
1152
- context("with a root node", () => {
1153
- given("node", () => given.$tree.tree("getTree"));
1154
-
1155
- it("raises an exception", () => {
1156
- expect(() => given.$tree.tree("removeNode", given.node)).toThrow(
1157
- "Node has no parent",
1158
- );
1159
- });
1160
- });
1161
- });
1162
-
1163
- describe("selectNode", () => {
1164
- interface Vars {
1165
- node1: INode;
1166
- node2: INode;
1167
- $tree: JQuery<HTMLElement>;
1168
- }
1169
-
1170
- const given = getGiven<Vars>();
1171
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
1172
- given("node2", () => given.$tree.tree("getNodeByNameMustExist", "node2"));
1173
- given("$tree", () => $("#tree1"));
1174
-
1175
- beforeEach(() => {
1176
- given.$tree.tree({
1177
- data: exampleData,
1178
- selectable: true,
1179
- });
1180
- });
1181
-
1182
- context("when another node is selected", () => {
1183
- beforeEach(() => {
1184
- given.$tree.tree("selectNode", given.node2);
1185
- given.$tree.tree("selectNode", given.node1);
1186
- });
1187
-
1188
- it("selects the node and deselects the previous node", () => {
1189
- expect(given.node1.element).toBeSelected();
1190
- expect(given.node2.element).not.toBeSelected();
1191
- });
1192
- });
1193
-
1194
- context("when the node is not selected", () => {
1195
- beforeEach(() => {
1196
- given.$tree.tree("selectNode", given.node1);
1197
- });
1198
-
1199
- it("selects the node", () => {
1200
- expect(given.node1.element).toBeSelected();
1201
- });
1202
- });
1203
-
1204
- context("when the node is selected", () => {
1205
- beforeEach(() => {
1206
- given.$tree.tree("selectNode", given.node1);
1207
- });
1208
-
1209
- it("deselects the node", () => {
1210
- given.$tree.tree("selectNode", given.node1);
1211
- expect(given.node1.element).not.toBeSelected();
1212
- });
1213
- });
1214
-
1215
- context("with a null parameter", () => {
1216
- beforeEach(() => {
1217
- given.$tree.tree("selectNode", given.node1);
1218
- });
1219
-
1220
- it("deselects the current node", () => {
1221
- given.$tree.tree("selectNode", null);
1222
- expect(given.$tree.tree("getSelectedNode")).toBeFalse();
1223
- });
1224
- });
1225
-
1226
- it("opens the parent node when it's closed", () => {
1227
- expect(given.node1.is_open).toBeFalsy();
1228
-
1229
- const child1 = given.$tree.tree("getNodeByNameMustExist", "child1");
1230
- given.$tree.tree("selectNode", child1);
1231
-
1232
- expect(given.node1.is_open).toBe(true);
1233
- });
1234
- });
1235
-
1236
- describe("setOption", () => {
1237
- interface Vars {
1238
- node1: INode;
1239
- $tree: JQuery<HTMLElement>;
1240
- }
1241
-
1242
- const given = getGiven<Vars>();
1243
- beforeEach(() => {
1244
- given.$tree.tree({
1245
- animationSpeed: 0,
1246
- data: exampleData,
1247
- selectable: false,
1248
- });
1249
- });
1250
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
1251
- given("$tree", () => $("#tree1"));
1252
-
1253
- it("sets an option", async () => {
1254
- given.$tree.tree("setOption", "selectable", true);
1255
- await userEvent.click(
1256
- titleSpan(given.node1.element).get(0) as HTMLElement,
1257
- );
1258
- expect(given.$tree.tree("getSelectedNode")).toMatchObject({
1259
- name: "node1",
1260
- });
1261
- });
1262
- });
1263
-
1264
- describe("setState", () => {
1265
- interface Vars {
1266
- $tree: JQuery<HTMLElement>;
1267
- }
1268
-
1269
- const given = getGiven<Vars>();
1270
- beforeEach(() => {
1271
- given.$tree.tree({
1272
- autoOpen: false,
1273
- data: exampleData,
1274
- selectable: true,
1275
- });
1276
- });
1277
- given("$tree", () => $("#tree1"));
1278
-
1279
- it("sets the state", () => {
1280
- given.$tree.tree("setState", {
1281
- open_nodes: [123],
1282
- selected_node: [123],
1283
- });
1284
-
1285
- expect(given.$tree).toHaveTreeStructure([
1286
- expect.objectContaining({
1287
- name: "node1",
1288
- open: true,
1289
- selected: true,
1290
- }),
1291
- expect.objectContaining({
1292
- name: "node2",
1293
- open: false,
1294
- selected: false,
1295
- }),
1296
- ]);
1297
- });
1298
- });
1299
-
1300
- describe("toggle", () => {
1301
- interface Vars {
1302
- autoOpen: boolean;
1303
- node1: INode;
1304
- $tree: JQuery<HTMLElement>;
1305
- }
1306
-
1307
- const given = getGiven<Vars>();
1308
- given("autoOpen", () => false);
1309
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
1310
- given("$tree", () => $("#tree1"));
1311
-
1312
- beforeEach(() => {
1313
- given.$tree.tree({
1314
- autoOpen: given.autoOpen,
1315
- data: exampleData,
1316
- });
1317
- given.$tree.tree("toggle", given.node1, false);
1318
- });
1319
-
1320
- context("when the node is closed", () => {
1321
- it("opens the node", () => {
1322
- expect(given.node1.element).toBeOpen();
1323
- });
1324
- });
1325
-
1326
- context("when the node is open", () => {
1327
- given("autoOpen", () => true);
1328
-
1329
- it("closes the node", () => {
1330
- expect(given.node1.element).toBeClosed();
1331
- });
1332
- });
1333
- });
1334
-
1335
- describe("toJson", () => {
1336
- interface Vars {
1337
- $tree: JQuery<HTMLElement>;
1338
- }
1339
-
1340
- const given = getGiven<Vars>();
1341
- given("$tree", () => $("#tree1"));
1342
-
1343
- beforeEach(() => {
1344
- given.$tree.tree({
1345
- data: exampleData,
1346
- });
1347
- });
1348
-
1349
- it("returns nodes as json", () => {
1350
- expect(JSON.parse(given.$tree.tree("toJson"))).toEqual(exampleData);
1351
- });
1352
- });
1353
-
1354
- describe("updateNode", () => {
1355
- interface Vars {
1356
- isSelected: boolean;
1357
- node: INode;
1358
- nodeData: NodeData;
1359
- $tree: JQuery<HTMLElement>;
1360
- }
1361
-
1362
- const given = getGiven<Vars>();
1363
- given("isSelected", () => false);
1364
- given("node", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
1365
- given("$tree", () => $("#tree1"));
1366
-
1367
- beforeEach(() => {
1368
- given.$tree.tree({
1369
- autoOpen: true,
1370
- data: exampleData,
1371
- });
1372
-
1373
- if (given.isSelected) {
1374
- given.$tree.tree("selectNode", given.node);
1375
- }
1376
-
1377
- given.$tree.tree("updateNode", given.node, given.nodeData);
1378
- });
1379
-
1380
- context("with a string", () => {
1381
- given("nodeData", () => "updated-node");
1382
-
1383
- it("updates the name", () => {
1384
- expect(given.$tree).toHaveTreeStructure([
1385
- expect.objectContaining({ name: "updated-node" }),
1386
- expect.objectContaining({ name: "node2" }),
1387
- ]);
1388
- });
1389
- });
1390
-
1391
- context("with an object containing a name", () => {
1392
- given("nodeData", () => ({ name: "updated-node" }));
1393
-
1394
- it("updates the name", () => {
1395
- expect(given.$tree).toHaveTreeStructure([
1396
- expect.objectContaining({ name: "updated-node" }),
1397
- expect.objectContaining({ name: "node2" }),
1398
- ]);
1399
- });
1400
- });
1401
-
1402
- context("with an object containing an id", () => {
1403
- given("nodeData", () => ({ id: 999 }));
1404
-
1405
- it("updates the id", () => {
1406
- expect(given.$tree).toHaveTreeStructure([
1407
- expect.objectContaining({ name: "node1" }),
1408
- expect.objectContaining({ name: "node2" }),
1409
- ]);
1410
- expect(given.$tree.tree("getNodeById", 999)).toMatchObject(
1411
- given.nodeData,
1412
- );
1413
- });
1414
- });
1415
-
1416
- context("with an object containing a property", () => {
1417
- given("nodeData", () => ({ color: "green" }));
1418
-
1419
- it("updates the node", () => {
1420
- expect(given.$tree).toHaveTreeStructure([
1421
- expect.objectContaining({ name: "node1" }),
1422
- expect.objectContaining({ name: "node2" }),
1423
- ]);
1424
- expect(given.$tree.tree("getNodeById", 123)).toMatchObject({
1425
- color: "green",
1426
- name: "node1",
1427
- });
1428
- });
1429
- });
1430
-
1431
- context("with an object containing children", () => {
1432
- context("when adding a child to a child node", () => {
1433
- given("nodeData", () => ({ children: ["new-child"] }));
1434
- given("node", () =>
1435
- given.$tree.tree("getNodeByNameMustExist", "child1"),
1436
- );
1437
-
1438
- it("adds the child node", () => {
1439
- expect(given.$tree).toHaveTreeStructure([
1440
- expect.objectContaining({
1441
- name: "node1",
1442
- children: [
1443
- expect.objectContaining({
1444
- name: "child1",
1445
- children: [
1446
- expect.objectContaining({
1447
- name: "new-child",
1448
- }),
1449
- ],
1450
- }),
1451
- expect.objectContaining({ name: "child2" }),
1452
- ],
1453
- }),
1454
- expect.objectContaining({ name: "node2" }),
1455
- ]);
1456
- });
1457
- });
1458
-
1459
- context("when removing the children", () => {
1460
- given("nodeData", () => ({ children: [] }));
1461
-
1462
- it("removes the children", () => {
1463
- expect(given.$tree).toHaveTreeStructure([
1464
- expect.objectContaining({
1465
- nodeType: "child",
1466
- name: "node1",
1467
- }),
1468
- expect.objectContaining({
1469
- nodeType: "folder",
1470
- name: "node2",
1471
- }),
1472
- ]);
1473
- });
1474
- });
1475
- });
1476
-
1477
- context("when the node was selected", () => {
1478
- given("isSelected", () => true);
1479
-
1480
- it("keeps the node selected", () => {
1481
- expect(given.$tree).toHaveTreeStructure([
1482
- expect.objectContaining({ name: "node1" }),
1483
- expect.objectContaining({ name: "node2" }),
1484
- ]);
1485
- });
1486
-
1487
- it("keeps the focus on the node", () => {
1488
- expect(given.node.element).toBeFocused();
1489
- });
1490
- });
1491
- });