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,1396 +0,0 @@
1
- import getGiven from "givens";
2
- import { Node } from "../node";
3
- import { Position } from "../position";
4
- import exampleData from "./support/exampleData";
5
- import "jest-extended";
6
-
7
- const context = describe;
8
-
9
- describe("addAfter", () => {
10
- interface Vars {
11
- node1: Node;
12
- tree: Node;
13
- }
14
-
15
- const given = getGiven<Vars>();
16
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
17
- given("tree", () => new Node().loadFromData(exampleData));
18
-
19
- context("when moving after node1", () => {
20
- it("returns the new node", () => {
21
- expect(given.node1.addAfter("new node")).toMatchObject({
22
- name: "new node",
23
- });
24
- });
25
-
26
- it("adds after the node", () => {
27
- given.node1.addAfter("new node");
28
-
29
- expect(given.tree).toMatchObject({
30
- children: [
31
- expect.objectContaining({ name: "node1" }),
32
- expect.objectContaining({ name: "new node" }),
33
- expect.objectContaining({ name: "node2" }),
34
- ],
35
- });
36
- });
37
- });
38
-
39
- context("when moving after the root node", () => {
40
- it("returns null", () => {
41
- expect(given.tree.addAfter("new node")).toBeNull();
42
- });
43
-
44
- it("doesn't add anything", () => {
45
- expect(given.tree).toMatchObject({
46
- children: [
47
- expect.objectContaining({ name: "node1" }),
48
- expect.objectContaining({ name: "node2" }),
49
- ],
50
- });
51
- });
52
- });
53
-
54
- context("when adding a node with children", () => {
55
- it("adds the children", () => {
56
- given.node1.addAfter({
57
- name: "new node",
58
- children: ["newchild1", "newchild2"],
59
- });
60
-
61
- expect(given.tree).toMatchObject({
62
- children: [
63
- expect.objectContaining({ name: "node1" }),
64
- expect.objectContaining({
65
- name: "new node",
66
- children: [
67
- expect.objectContaining({ name: "newchild1" }),
68
- expect.objectContaining({ name: "newchild2" }),
69
- ],
70
- }),
71
- expect.objectContaining({ name: "node2" }),
72
- ],
73
- });
74
- });
75
- });
76
- });
77
-
78
- describe("addBefore", () => {
79
- interface Vars {
80
- node2: Node;
81
- tree: Node;
82
- }
83
-
84
- const given = getGiven<Vars>();
85
- given("node2", () => given.tree.getNodeByNameMustExist("node2"));
86
- given("tree", () => new Node().loadFromData(exampleData));
87
-
88
- it("returns the new node", () => {
89
- expect(given.node2.addBefore("new node")).toMatchObject({
90
- name: "new node",
91
- });
92
- });
93
-
94
- it("adds before the node", () => {
95
- given.node2.addBefore("new node");
96
-
97
- expect(given.tree).toMatchObject({
98
- children: [
99
- expect.objectContaining({ name: "node1" }),
100
- expect.objectContaining({ name: "new node" }),
101
- expect.objectContaining({ name: "node2" }),
102
- ],
103
- });
104
- });
105
-
106
- context("with a root node", () => {
107
- it("returns null", () => {
108
- expect(given.tree.addBefore("new node")).toBeNull();
109
- });
110
-
111
- it("does nothing", () => {
112
- given.tree.addBefore("new node");
113
-
114
- expect(given.tree).toMatchObject({
115
- children: [
116
- expect.objectContaining({ name: "node1" }),
117
- expect.objectContaining({ name: "node2" }),
118
- ],
119
- });
120
- });
121
- });
122
-
123
- context("when adding a node with children", () => {
124
- it("adds the children", () => {
125
- given.node2.addBefore({
126
- name: "new node",
127
- children: ["newchild1", "newchild2"],
128
- });
129
-
130
- expect(given.tree).toMatchObject({
131
- children: [
132
- expect.objectContaining({ name: "node1" }),
133
- expect.objectContaining({
134
- name: "new node",
135
- children: [
136
- expect.objectContaining({ name: "newchild1" }),
137
- expect.objectContaining({ name: "newchild2" }),
138
- ],
139
- }),
140
- expect.objectContaining({ name: "node2" }),
141
- ],
142
- });
143
- });
144
- });
145
- });
146
-
147
- describe("addChild", () => {
148
- interface Vars {
149
- node: Node;
150
- }
151
-
152
- const given = getGiven<Vars>();
153
- given("node", () => new Node());
154
-
155
- beforeEach(() => {
156
- given.node.addChild(new Node({ id: 100, name: "child1" }));
157
- });
158
-
159
- it("adds the child", () => {
160
- expect(given.node.children).toEqual(
161
- expect.arrayContaining([
162
- expect.objectContaining({ id: 100, name: "child1" }),
163
- ]),
164
- );
165
- });
166
-
167
- it("sets the parent of the child", () => {
168
- expect(given.node.children[0]?.parent).toEqual(given.node);
169
- });
170
- });
171
-
172
- describe("addChildAtPosition", () => {
173
- interface Vars {
174
- child: Node;
175
- index: number;
176
- node: Node;
177
- }
178
-
179
- const given = getGiven<Vars>();
180
-
181
- given("child", () => new Node("new"));
182
- given("node", () => new Node("new").loadFromData(["child1", "child2"]));
183
-
184
- beforeEach(() => {
185
- given.node.addChildAtPosition(given.child, given.index);
186
- });
187
-
188
- context("with index 0", () => {
189
- given("index", () => 0);
190
-
191
- it("adds at the start", () => {
192
- expect(given.node.children).toEqual([
193
- expect.objectContaining({ name: "new" }),
194
- expect.objectContaining({ name: "child1" }),
195
- expect.objectContaining({ name: "child2" }),
196
- ]);
197
-
198
- expect(given.node.children).toEqual([
199
- expect.objectContaining({ name: "new" }),
200
- expect.objectContaining({ name: "child1" }),
201
- expect.objectContaining({ name: "child2" }),
202
- ]);
203
- });
204
- });
205
-
206
- context("with index 1", () => {
207
- given("index", () => 1);
208
-
209
- it("inserts at index 1", () => {
210
- expect(given.node.children).toEqual([
211
- expect.objectContaining({ name: "child1" }),
212
- expect.objectContaining({ name: "new" }),
213
- expect.objectContaining({ name: "child2" }),
214
- ]);
215
- });
216
- });
217
-
218
- context("with non existing index", () => {
219
- given("index", () => 99);
220
-
221
- it("adds add the end", () => {
222
- expect(given.node.children).toEqual([
223
- expect.objectContaining({ name: "child1" }),
224
- expect.objectContaining({ name: "child2" }),
225
- expect.objectContaining({ name: "new" }),
226
- ]);
227
- });
228
- });
229
- });
230
-
231
- describe("addParent", () => {
232
- interface Vars {
233
- tree: Node;
234
- node1: Node;
235
- }
236
- const given = getGiven<Vars>();
237
- given("node1", () => new Node("node1"));
238
- given("tree", () => new Node({}, true));
239
-
240
- beforeEach(() => {
241
- given.tree.addChild(given.node1);
242
- given.node1.append("child1");
243
- });
244
-
245
- it("adds a parent node", () => {
246
- given.node1.addParent("parent1");
247
-
248
- expect(given.tree).toMatchObject({
249
- name: "",
250
- children: [
251
- expect.objectContaining({
252
- name: "parent1",
253
- children: [
254
- expect.objectContaining({
255
- name: "node1",
256
- children: [
257
- expect.objectContaining({ name: "child1" }),
258
- ],
259
- }),
260
- ],
261
- }),
262
- ],
263
- });
264
- });
265
-
266
- it("returns the new node", () => {
267
- expect(given.node1.addParent("parent1")).toMatchObject({
268
- name: "parent1",
269
- });
270
- });
271
-
272
- context("with a root node", () => {
273
- it("returns null", () => {
274
- expect(given.tree.addParent("parent1")).toBeNull();
275
- });
276
- });
277
- });
278
-
279
- describe("append", () => {
280
- interface Vars {
281
- node: Node;
282
- }
283
- const given = getGiven<Vars>();
284
- given("node", () => new Node("node1"));
285
-
286
- it("appends a node", () => {
287
- given.node.append("child1");
288
- given.node.append("child2");
289
-
290
- expect(given.node).toMatchObject({
291
- name: "node1",
292
- children: [
293
- expect.objectContaining({ name: "child1" }),
294
- expect.objectContaining({ name: "child2" }),
295
- ],
296
- });
297
- });
298
-
299
- it("returns the new node", () => {
300
- expect(given.node.append("child1")).toMatchObject({ name: "child1" });
301
- });
302
-
303
- context("when adding a node with children", () => {
304
- it("adds the children", () => {
305
- given.node.append({
306
- name: "new node",
307
- children: ["newchild1", "newchild2"],
308
- });
309
-
310
- expect(given.node).toMatchObject({
311
- children: [
312
- expect.objectContaining({
313
- name: "new node",
314
- children: [
315
- expect.objectContaining({ name: "newchild1" }),
316
- expect.objectContaining({ name: "newchild2" }),
317
- ],
318
- }),
319
- ],
320
- });
321
- });
322
- });
323
- });
324
-
325
- describe("constructor", () => {
326
- interface Vars {
327
- node: Node;
328
- params: NodeData | undefined;
329
- }
330
-
331
- const given = getGiven<Vars>();
332
-
333
- given("node", () =>
334
- given.params === undefined ? new Node() : new Node(given.params),
335
- );
336
-
337
- context("without parameters", () => {
338
- it("creates a node", () => {
339
- expect(given.node.name).toBe("");
340
- expect(given.node.id).toBeUndefined();
341
- });
342
- });
343
-
344
- context("with a string", () => {
345
- given("params", () => "n1");
346
-
347
- it("creates a node", () => {
348
- expect(given.node).toMatchObject({
349
- name: "n1",
350
- children: [],
351
- parent: null,
352
- });
353
- expect(given.node.id).toBeUndefined();
354
- });
355
-
356
- it("sets isEmptyFolder to false", () => {
357
- expect(given.node.isEmptyFolder).toBe(false);
358
- });
359
- });
360
-
361
- context("with an object with a name property", () => {
362
- given("params", () => ({
363
- id: 123,
364
- name: "n1",
365
- }));
366
-
367
- it("creates a node", () => {
368
- expect(given.node).toMatchObject({
369
- id: 123,
370
- name: "n1",
371
- });
372
- });
373
- });
374
-
375
- context("when the name property is null", () => {
376
- given("params", () => ({
377
- name: null,
378
- }));
379
-
380
- it("sets the name to an empty string", () => {
381
- expect(given.node.name).toBe("");
382
- });
383
- });
384
-
385
- context("with an object with more properties", () => {
386
- given("params", () => ({
387
- color: "green",
388
- id: 123,
389
- name: "n1",
390
- url: "/abc",
391
- }));
392
-
393
- it("creates a node", () => {
394
- expect(given.node).toMatchObject({
395
- color: "green",
396
- id: 123,
397
- name: "n1",
398
- url: "/abc",
399
- });
400
- });
401
- });
402
-
403
- context("with an object with a label property", () => {
404
- given("params", () => ({
405
- id: 123,
406
- label: "n1",
407
- url: "/",
408
- }));
409
-
410
- it("creates a node", () => {
411
- expect(given.node).toMatchObject({
412
- id: 123,
413
- name: "n1",
414
- url: "/",
415
- });
416
- expect(given.node).not.toHaveProperty("label");
417
- expect(given.node.children).toHaveLength(0);
418
- expect(given.node.parent).toBeNull();
419
- });
420
- });
421
-
422
- context("with an object with a parent", () => {
423
- given("params", () => ({
424
- name: "n1",
425
- parent: "abc",
426
- }));
427
-
428
- it("doesn't set the parent", () => {
429
- expect(given.node.name).toBe("n1");
430
- expect(given.node.parent).toBeNull();
431
- });
432
- });
433
-
434
- context("with an object with children", () => {
435
- given("params", () => ({
436
- name: "n1",
437
- children: ["c"],
438
- }));
439
-
440
- it("doesn't set the children", () => {
441
- expect(given.node.name).toBe("n1");
442
- expect(given.node.children).toHaveLength(0);
443
- });
444
-
445
- it("sets isEmptyFolder to false", () => {
446
- expect(given.node.isEmptyFolder).toBe(false);
447
- });
448
- });
449
-
450
- context("when the data contains an empty children attribute", () => {
451
- given("params", () => ({
452
- name: "n1",
453
- children: [],
454
- }));
455
-
456
- it("sets isEmptyFolder to true", () => {
457
- expect(given.node.isEmptyFolder).toBe(true);
458
- });
459
- });
460
- });
461
-
462
- describe("getChildIndex", () => {
463
- interface Vars {
464
- child2: Node;
465
- node: Node;
466
- }
467
- const given = getGiven<Vars>();
468
- given("child2", () => new Node("child2"));
469
- given("node", () => new Node());
470
-
471
- beforeEach(() => {
472
- given.node.addChild(new Node("child1"));
473
- given.node.addChild(given.child2);
474
- given.node.addChild(new Node("child3"));
475
- });
476
-
477
- context("when a child exists", () => {
478
- it("returns the index", () => {
479
- expect(given.node.getChildIndex(given.child2)).toBe(1);
480
- });
481
- });
482
-
483
- context("when a child doesn't exist", () => {
484
- it("returns -1", () => {
485
- const nonExistingChild = new Node("non-existing");
486
- expect(given.node.getChildIndex(nonExistingChild)).toBe(-1);
487
- });
488
- });
489
- });
490
-
491
- describe("getData", () => {
492
- interface Vars {
493
- tree: Node;
494
- }
495
- const given = getGiven<Vars>();
496
- given("tree", () => new Node().loadFromData(exampleData));
497
-
498
- it("returns the tree data", () => {
499
- expect(given.tree.getData()).toEqual([
500
- expect.objectContaining({
501
- name: "node1",
502
- children: [
503
- expect.objectContaining({ name: "child1" }),
504
- expect.objectContaining({ name: "child2" }),
505
- ],
506
- }),
507
- expect.objectContaining({ name: "node2" }),
508
- ]);
509
- });
510
-
511
- it("doesn't include internal attributes", () => {
512
- expect(given.tree.getData()[0]).not.toContainAnyKeys([
513
- "element",
514
- "isEmptyFolder",
515
- "parent",
516
- ]);
517
- });
518
-
519
- context("with includeParent parameter", () => {
520
- it("returns the tree data including the node itself", () => {
521
- expect(given.tree.getData(true)).toEqual([
522
- expect.objectContaining({
523
- children: [
524
- expect.objectContaining({ name: "node1" }),
525
- expect.objectContaining({ name: "node2" }),
526
- ],
527
- }),
528
- ]);
529
- });
530
- });
531
- });
532
-
533
- describe("getLastChild", () => {
534
- interface Vars {
535
- node: Node;
536
- }
537
- const given = getGiven<Vars>();
538
- given("node", () => new Node());
539
-
540
- context("when a node has no children", () => {
541
- it("returns null", () => {
542
- expect(given.node.getLastChild()).toBeNull();
543
- });
544
- });
545
-
546
- context("when a node has children", () => {
547
- beforeEach(() => {
548
- given.node.append("child1");
549
- given.node.append("child2");
550
- });
551
-
552
- it("returns the last child", () => {
553
- expect(given.node.getLastChild()).toMatchObject({ name: "child2" });
554
- });
555
-
556
- context("when its last child is open and has children", () => {
557
- beforeEach(() => {
558
- const child2 = given.node.children[1];
559
- child2?.append("child2a");
560
- child2?.append("child2b");
561
- });
562
-
563
- context("and the last child is open", () => {
564
- beforeEach(() => {
565
- const child2 = given.node.children[1];
566
- if (child2) {
567
- child2.is_open = true;
568
- }
569
- });
570
-
571
- it("returns the last child of that child", () => {
572
- expect(given.node.getLastChild()).toMatchObject({
573
- name: "child2b",
574
- });
575
- });
576
- });
577
-
578
- context("and the last child is closed", () => {
579
- it("returns the last child", () => {
580
- expect(given.node.getLastChild()).toMatchObject({
581
- name: "child2",
582
- });
583
- });
584
- });
585
- });
586
- });
587
- });
588
-
589
- describe("getNextNode", () => {
590
- interface Vars {
591
- fromNode: Node;
592
- tree: Node;
593
- }
594
- const given = getGiven<Vars>();
595
- given("tree", () => new Node().loadFromData(exampleData));
596
-
597
- context("with a parent node", () => {
598
- given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
599
-
600
- context("when the parent node is closed", () => {
601
- it("returns the first child", () => {
602
- expect(given.fromNode.getNextNode()).toMatchObject({
603
- name: "child1",
604
- });
605
- });
606
- });
607
-
608
- context("when the parent node is open", () => {
609
- beforeEach(() => {
610
- given.fromNode.is_open = true;
611
- });
612
-
613
- it("returns the first child", () => {
614
- expect(given.fromNode.getNextNode()).toMatchObject({
615
- name: "child1",
616
- });
617
- });
618
- });
619
- });
620
-
621
- context("with the node is the last child", () => {
622
- given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
623
-
624
- it("returns the next sibling of the parent", () => {
625
- expect(given.fromNode.getNextNode()).toMatchObject({
626
- name: "node2",
627
- });
628
- });
629
- });
630
-
631
- context("with includeChildren is false", () => {
632
- context("with an open parent node", () => {
633
- given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
634
-
635
- beforeEach(() => {
636
- given.fromNode.is_open = true;
637
- });
638
-
639
- it("returns the next sibling", () => {
640
- expect(given.fromNode.getNextNode(false)).toMatchObject({
641
- name: "node2",
642
- });
643
- });
644
- });
645
- });
646
- });
647
-
648
- describe("getNextVisibleNode", () => {
649
- interface Vars {
650
- fromNode: Node;
651
- tree: Node;
652
- }
653
- const given = getGiven<Vars>();
654
- given("tree", () => new Node().loadFromData(exampleData));
655
-
656
- context("with a parent node", () => {
657
- given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
658
-
659
- context("when the parent node is closed", () => {
660
- it("returns the next sibling", () => {
661
- expect(given.fromNode.getNextVisibleNode()).toMatchObject({
662
- name: "node2",
663
- });
664
- });
665
- });
666
-
667
- context("when the parent node is open", () => {
668
- beforeEach(() => {
669
- given.fromNode.is_open = true;
670
- });
671
-
672
- it("returns the first child", () => {
673
- expect(given.fromNode.getNextVisibleNode()).toMatchObject({
674
- name: "child1",
675
- });
676
- });
677
- });
678
- });
679
-
680
- context("with the node is the last child", () => {
681
- given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
682
-
683
- it("returns the next sibling of the parent", () => {
684
- expect(given.fromNode.getNextVisibleNode()).toMatchObject({
685
- name: "node2",
686
- });
687
- });
688
- });
689
-
690
- context("with the tree node", () => {
691
- given("fromNode", () => given.tree);
692
-
693
- it("returns null", () => {
694
- expect(given.fromNode.getNextVisibleNode()).toBeNull();
695
- });
696
- });
697
- });
698
-
699
- describe("getNextSibling", () => {
700
- interface Vars {
701
- node1: Node;
702
- node2: Node;
703
- tree: Node;
704
- }
705
- const given = getGiven<Vars>();
706
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
707
- given("node2", () => given.tree.getNodeByNameMustExist("node2"));
708
- given("tree", () => new Node().loadFromData(exampleData));
709
-
710
- context("with a tree", () => {
711
- it("returns null", () => {
712
- expect(given.tree.getNextSibling()).toBeNull();
713
- });
714
- });
715
-
716
- context("when the node is the last child", () => {
717
- it("returns null", () => {
718
- expect(given.node2.getNextSibling()).toBeNull();
719
- });
720
- });
721
-
722
- context("when the node is the first child", () => {
723
- it("returns the second child", () => {
724
- expect(given.node1.getNextSibling()).toBe(given.node2);
725
- });
726
- });
727
- });
728
-
729
- describe("getNodeByCallback", () => {
730
- interface Vars {
731
- tree: Node;
732
- }
733
- const given = getGiven<Vars>();
734
- given("tree", () => new Node().loadFromData(exampleData));
735
-
736
- context("when a matching node exists", () => {
737
- it("returns the node", () => {
738
- expect(
739
- given.tree.getNodeByCallback((node) =>
740
- node.name.startsWith("chi"),
741
- ),
742
- ).toMatchObject({
743
- name: "child1",
744
- });
745
- });
746
- });
747
-
748
- context("when no matching node exists", () => {
749
- it("returns null", () => {
750
- expect(given.tree.getNodeByCallback(() => false)).toBeNull();
751
- });
752
- });
753
- });
754
-
755
- describe("getNodeByName", () => {
756
- interface Vars {
757
- tree: Node;
758
- }
759
- const given = getGiven<Vars>();
760
- given("tree", () => new Node().loadFromData(exampleData));
761
-
762
- context("when the node exists", () => {
763
- it("returns the node", () => {
764
- expect(given.tree.getNodeByName("child1")).toMatchObject({
765
- id: 125,
766
- name: "child1",
767
- });
768
- });
769
- });
770
-
771
- context("when the node doesn't exist", () => {
772
- it("returns null", () => {
773
- expect(given.tree.getNodeByName("non-existing")).toBeNull();
774
- });
775
- });
776
- });
777
-
778
- describe("getNodeByNameMustExist", () => {
779
- interface Vars {
780
- tree: Node;
781
- }
782
- const given = getGiven<Vars>();
783
- given("tree", () => new Node().loadFromData(exampleData));
784
-
785
- context("when the node exists", () => {
786
- it("returns the node", () => {
787
- expect(given.tree.getNodeByNameMustExist("child1")).toMatchObject({
788
- id: 125,
789
- name: "child1",
790
- });
791
- });
792
- });
793
-
794
- context("when the node doesn't exist", () => {
795
- it("throws an exception", () => {
796
- expect(() =>
797
- given.tree.getNodeByNameMustExist("non-existing"),
798
- ).toThrow("Node with name non-existing not found");
799
- });
800
- });
801
- });
802
-
803
- describe("getParent", () => {
804
- interface Vars {
805
- child1: Node;
806
- node1: Node;
807
- tree: Node;
808
- }
809
- const given = getGiven<Vars>();
810
- given("child1", () => given.tree.getNodeByNameMustExist("child1"));
811
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
812
- given("tree", () => new Node().loadFromData(exampleData));
813
-
814
- context("with a tree", () => {
815
- it("returns null", () => {
816
- expect(given.tree.getParent()).toBeNull();
817
- });
818
- });
819
-
820
- context("with a node on the first level", () => {
821
- it("returns null", () => {
822
- expect(given.node1.getParent()).toBeNull();
823
- });
824
- });
825
-
826
- context("with a node on the second level", () => {
827
- it("returns the parent", () => {
828
- expect(given.child1.getParent()).toMatchObject({
829
- name: "node1",
830
- });
831
- });
832
- });
833
- });
834
-
835
- describe("getPreviousNode", () => {
836
- interface Vars {
837
- tree: Node;
838
- }
839
- const given = getGiven<Vars>();
840
- given("tree", () => new Node().loadFromData(exampleData));
841
-
842
- it("returns null with a tree node", () => {
843
- expect(given.tree.getPreviousNode()).toBeNull();
844
- });
845
-
846
- it("returns the last child of the previous sibling when the previous node is closed and has children", () => {
847
- given.tree.getNodeByNameMustExist("node2").is_open = false;
848
- const node2 = given.tree.getNodeByNameMustExist("node2");
849
-
850
- expect(node2.getPreviousNode()).toMatchObject({
851
- name: "child2",
852
- });
853
- });
854
-
855
- it("returns the last child of the previous sibling when the previous node is open and has children", () => {
856
- given.tree.getNodeByNameMustExist("node2").is_open = true;
857
- const node2 = given.tree.getNodeByNameMustExist("node2");
858
-
859
- expect(node2.getPreviousNode()).toMatchObject({
860
- name: "child2",
861
- });
862
- });
863
-
864
- it("returns the first child if a node is the second child", () => {
865
- const child2 = given.tree.getNodeByNameMustExist("child2");
866
-
867
- expect(child2.getPreviousNode()).toMatchObject({
868
- name: "child1",
869
- });
870
- });
871
-
872
- it("returns the parent with a node that is the first child", () => {
873
- const node3 = given.tree.getNodeByNameMustExist("node3");
874
-
875
- expect(node3.getPreviousNode()).toMatchObject({
876
- name: "node2",
877
- });
878
- });
879
- });
880
-
881
- describe("getPreviousVisibleNode", () => {
882
- interface Vars {
883
- tree: Node;
884
- }
885
- const given = getGiven<Vars>();
886
- given("tree", () => new Node().loadFromData(exampleData));
887
-
888
- it("returns null with a tree node", () => {
889
- expect(given.tree.getPreviousVisibleNode()).toBeNull();
890
- });
891
-
892
- it("returns the previous sibling when the previous sibling is closed and has children", () => {
893
- given.tree.getNodeByNameMustExist("node2").is_open = false;
894
- const node2 = given.tree.getNodeByNameMustExist("node2");
895
-
896
- expect(node2.getPreviousVisibleNode()).toMatchObject({
897
- name: "node1",
898
- });
899
- });
900
-
901
- it("returns the last child of the previous sibling when the previous sibling is open and has children", () => {
902
- given.tree.getNodeByNameMustExist("node1").is_open = true;
903
- const node2 = given.tree.getNodeByNameMustExist("node2");
904
-
905
- expect(node2.getPreviousVisibleNode()).toMatchObject({
906
- name: "child2",
907
- });
908
- });
909
-
910
- it("returns the first child if a node is the second child", () => {
911
- const child2 = given.tree.getNodeByNameMustExist("child2");
912
-
913
- expect(child2.getPreviousVisibleNode()).toMatchObject({
914
- name: "child1",
915
- });
916
- });
917
-
918
- it("returns the parent when a node is the first child", () => {
919
- const node3 = given.tree.getNodeByNameMustExist("node3");
920
-
921
- expect(node3.getPreviousVisibleNode()).toMatchObject({
922
- name: "node2",
923
- });
924
- });
925
- });
926
-
927
- describe("getPreviousSibling", () => {
928
- interface Vars {
929
- node1: Node;
930
- node2: Node;
931
- tree: Node;
932
- }
933
- const given = getGiven<Vars>();
934
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
935
- given("node2", () => given.tree.getNodeByNameMustExist("node2"));
936
- given("tree", () => new Node().loadFromData(exampleData));
937
-
938
- context("with a tree", () => {
939
- it("returns null", () => {
940
- expect(given.tree.getPreviousSibling()).toBeNull();
941
- });
942
- });
943
-
944
- context("when the node is the first child", () => {
945
- it("returns null", () => {
946
- expect(given.node1.getPreviousSibling()).toBeNull();
947
- });
948
- });
949
-
950
- context("when the node is the second child", () => {
951
- it("returns the first child", () => {
952
- expect(given.node2.getPreviousSibling()).toBe(given.node1);
953
- });
954
- });
955
- });
956
-
957
- describe("hasChildren", () => {
958
- interface Vars {
959
- node: Node;
960
- }
961
- const given = getGiven<Vars>();
962
- given("node", () => new Node());
963
-
964
- context("when a node has children", () => {
965
- beforeEach(() => {
966
- given.node.addChild(new Node("child1"));
967
- });
968
-
969
- it("returns true", () => {
970
- expect(given.node.hasChildren()).toBe(true);
971
- });
972
- });
973
-
974
- context("when a node doesn't have children", () => {
975
- it("returns false", () => {
976
- expect(given.node.hasChildren()).toBe(false);
977
- });
978
- });
979
- });
980
-
981
- describe("initFromData", () => {
982
- interface Vars {
983
- tree: Node;
984
- }
985
- const given = getGiven<Vars>();
986
- given("tree", () => new Node());
987
-
988
- beforeEach(() => {
989
- given.tree.initFromData({
990
- name: "node1",
991
- id: 1,
992
- children: [
993
- { name: "child1", id: 2 },
994
- { name: "child2", id: 3 },
995
- ],
996
- });
997
- });
998
-
999
- it("loads the data", () => {
1000
- expect(given.tree).toMatchObject({
1001
- id: 1,
1002
- name: "node1",
1003
- children: [
1004
- expect.objectContaining({ id: 2, name: "child1" }),
1005
- expect.objectContaining({ id: 3, name: "child2" }),
1006
- ],
1007
- });
1008
- });
1009
- });
1010
-
1011
- describe("isFolder", () => {
1012
- interface Vars {
1013
- node: Node;
1014
- }
1015
- const given = getGiven<Vars>();
1016
- given("node", () => new Node());
1017
-
1018
- context("when the node has no children", () => {
1019
- it("returns false", () => {
1020
- expect(given.node.isFolder()).toBe(false);
1021
- });
1022
-
1023
- context("when the node is loaded on demand", () => {
1024
- beforeEach(() => {
1025
- given.node.load_on_demand = true;
1026
- });
1027
-
1028
- it("returns false", () => {
1029
- expect(given.node.isFolder()).toBe(true);
1030
- });
1031
- });
1032
- });
1033
-
1034
- context("when the node has a child", () => {
1035
- beforeEach(() => {
1036
- given.node.append("child1");
1037
- });
1038
-
1039
- it("returns false", () => {
1040
- expect(given.node.isFolder()).toBe(true);
1041
- });
1042
- });
1043
- });
1044
-
1045
- describe("iterate", () => {
1046
- interface Vars {
1047
- tree: Node;
1048
- visited: [string, number][];
1049
- visitor: (node: Node, level: number) => boolean;
1050
- }
1051
- const given = getGiven<Vars>();
1052
- given("tree", () => new Node().loadFromData(exampleData));
1053
- given("visited", () => []);
1054
-
1055
- beforeEach(() => {
1056
- given.tree.iterate(given.visitor);
1057
- });
1058
-
1059
- context("when the visitor function returns true", () => {
1060
- const visitAllNodes = (node: Node, level: number) => {
1061
- given.visited.push([node.name, level]);
1062
- return true;
1063
- };
1064
- given("visitor", () => visitAllNodes);
1065
-
1066
- it("visits all nodes", () => {
1067
- expect(given.visited).toEqual([
1068
- ["node1", 0],
1069
- ["child1", 1],
1070
- ["child2", 1],
1071
- ["node2", 0],
1072
- ["node3", 1],
1073
- ["child3", 2],
1074
- ]);
1075
- });
1076
- });
1077
-
1078
- context("when the visitor function returns false", () => {
1079
- const visitNodes = (node: Node, level: number) => {
1080
- given.visited.push([node.name, level]);
1081
- return false;
1082
- };
1083
- given("visitor", () => visitNodes);
1084
-
1085
- it("stops the iteration for the current node", () => {
1086
- expect(given.visited).toEqual([
1087
- ["node1", 0],
1088
- ["node2", 0],
1089
- ]);
1090
- });
1091
- });
1092
- });
1093
-
1094
- describe("loadFromData", () => {
1095
- it("creates a tree", () => {
1096
- const tree = new Node().loadFromData(exampleData);
1097
-
1098
- expect(tree.children).toEqual([
1099
- expect.objectContaining({
1100
- id: 123,
1101
- intProperty: 1,
1102
- name: "node1",
1103
- strProperty: "1",
1104
- children: [
1105
- expect.objectContaining({ id: 125, name: "child1" }),
1106
- expect.objectContaining({ id: 126, name: "child2" }),
1107
- ],
1108
- }),
1109
- expect.objectContaining({
1110
- id: 124,
1111
- intProperty: 3,
1112
- name: "node2",
1113
- strProperty: "3",
1114
- children: [expect.objectContaining({ id: 127, name: "node3" })],
1115
- }),
1116
- ]);
1117
- });
1118
-
1119
- it("sets isEmptyFolder to true for a node when it is has an empty children attribute", () => {
1120
- const data = [
1121
- {
1122
- name: "test1",
1123
- children: [],
1124
- },
1125
- ];
1126
-
1127
- const tree = new Node().loadFromData(data);
1128
- expect((tree.children[0] as Node).isEmptyFolder).toBe(true);
1129
- });
1130
-
1131
- it("sets isEmptyFolder to false for a node when it doesn't have a children attribute", () => {
1132
- const data = [
1133
- {
1134
- name: "test1",
1135
- },
1136
- ];
1137
-
1138
- const tree = new Node().loadFromData(data);
1139
- expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
1140
- });
1141
-
1142
- it("sets isEmptyFolder to false for a node when it has a children attribute that is not empty", () => {
1143
- const data = [
1144
- {
1145
- name: "test1",
1146
- children: ["child1"],
1147
- },
1148
- ];
1149
-
1150
- const tree = new Node().loadFromData(data);
1151
- expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
1152
- });
1153
- });
1154
-
1155
- describe("moveNode", () => {
1156
- interface Vars {
1157
- child1: Node;
1158
- child2: Node;
1159
- node1: Node;
1160
- node2: Node;
1161
- tree: Node;
1162
- }
1163
-
1164
- const given = getGiven<Vars>();
1165
-
1166
- given("child1", () => given.tree.getNodeByNameMustExist("child1"));
1167
- given("child2", () => given.tree.getNodeByNameMustExist("child2"));
1168
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
1169
- given("node2", () => given.tree.getNodeByNameMustExist("node2"));
1170
- given("tree", () => new Node().loadFromData(exampleData));
1171
-
1172
- context("when moving after a node", () => {
1173
- it("moves the node", () => {
1174
- expect(
1175
- given.tree.moveNode(given.child2, given.node2, Position.After),
1176
- ).toBe(true);
1177
-
1178
- expect(given.tree).toMatchObject({
1179
- name: "",
1180
- children: [
1181
- expect.objectContaining({
1182
- name: "node1",
1183
- children: [expect.objectContaining({ name: "child1" })],
1184
- }),
1185
- expect.objectContaining({ name: "node2" }),
1186
- expect.objectContaining({ name: "child2" }),
1187
- ],
1188
- });
1189
- });
1190
-
1191
- context("when the target is the root node", () => {
1192
- it("returns false", () => {
1193
- expect(
1194
- given.tree.moveNode(
1195
- given.child2,
1196
- given.tree,
1197
- Position.After,
1198
- ),
1199
- ).toBe(false);
1200
- });
1201
- });
1202
- });
1203
-
1204
- context("when moving inside a node", () => {
1205
- it("moves the node", () => {
1206
- expect(
1207
- given.tree.moveNode(given.child1, given.node2, Position.Inside),
1208
- ).toBe(true);
1209
-
1210
- expect(given.tree).toMatchObject({
1211
- name: "",
1212
- children: [
1213
- expect.objectContaining({
1214
- name: "node1",
1215
- children: [expect.objectContaining({ name: "child2" })],
1216
- }),
1217
- expect.objectContaining({
1218
- name: "node2",
1219
- children: [
1220
- expect.objectContaining({ name: "child1" }),
1221
- expect.objectContaining({ name: "node3" }),
1222
- ],
1223
- }),
1224
- ],
1225
- });
1226
- });
1227
- });
1228
-
1229
- context("when moving before a node", () => {
1230
- it("moves the node", () => {
1231
- expect(
1232
- given.tree.moveNode(
1233
- given.child2,
1234
- given.child1,
1235
- Position.Before,
1236
- ),
1237
- ).toBe(true);
1238
-
1239
- expect(given.tree).toMatchObject({
1240
- name: "",
1241
- children: [
1242
- expect.objectContaining({
1243
- name: "node1",
1244
- children: [
1245
- expect.objectContaining({ name: "child2" }),
1246
- expect.objectContaining({ name: "child1" }),
1247
- ],
1248
- }),
1249
- expect.objectContaining({ name: "node2" }),
1250
- ],
1251
- });
1252
- });
1253
-
1254
- context("when the target is the root node", () => {
1255
- it("returns false", () => {
1256
- expect(
1257
- given.tree.moveNode(
1258
- given.child2,
1259
- given.tree,
1260
- Position.Before,
1261
- ),
1262
- ).toBe(false);
1263
- });
1264
- });
1265
- });
1266
-
1267
- context("when the moved node is a parent of the target node", () => {
1268
- it("doesn't move the node", () => {
1269
- expect(
1270
- given.tree.moveNode(given.node1, given.child1, Position.Before),
1271
- ).toBe(false);
1272
-
1273
- expect(given.tree).toMatchObject({
1274
- children: [
1275
- expect.objectContaining({
1276
- name: "node1",
1277
- children: [
1278
- expect.objectContaining({ name: "child1" }),
1279
- expect.objectContaining({ name: "child2" }),
1280
- ],
1281
- }),
1282
- expect.objectContaining({ name: "node2" }),
1283
- ],
1284
- });
1285
- });
1286
- });
1287
-
1288
- context("with position None", () => {
1289
- it("returns false", () => {
1290
- expect(
1291
- given.tree.moveNode(given.child2, given.node2, Position.None),
1292
- ).toBe(false);
1293
- });
1294
- });
1295
- });
1296
-
1297
- describe("prepend", () => {
1298
- interface Vars {
1299
- node: Node;
1300
- }
1301
- const given = getGiven<Vars>();
1302
- given("node", () => new Node("node1"));
1303
-
1304
- it("prepends a node", () => {
1305
- given.node.prepend("child2");
1306
- given.node.prepend("child1");
1307
-
1308
- expect(given.node).toMatchObject({
1309
- name: "node1",
1310
- children: [
1311
- expect.objectContaining({ name: "child1" }),
1312
- expect.objectContaining({ name: "child2" }),
1313
- ],
1314
- });
1315
- });
1316
-
1317
- context("when prepending a node with children", () => {
1318
- it("adds the children", () => {
1319
- given.node.prepend({
1320
- name: "new node",
1321
- children: ["newchild1", "newchild2"],
1322
- });
1323
-
1324
- expect(given.node).toMatchObject({
1325
- children: [
1326
- expect.objectContaining({
1327
- name: "new node",
1328
- children: [
1329
- expect.objectContaining({ name: "newchild1" }),
1330
- expect.objectContaining({ name: "newchild2" }),
1331
- ],
1332
- }),
1333
- ],
1334
- });
1335
- });
1336
- });
1337
-
1338
- it("sets the isEmptyFolder attribute to true when the node data has empty children", () => {
1339
- given.node.prepend({
1340
- name: "test1",
1341
- children: [],
1342
- });
1343
-
1344
- expect((given.node.children[0] as Node).isEmptyFolder).toBe(true);
1345
- });
1346
- });
1347
-
1348
- describe("remove", () => {
1349
- interface Vars {
1350
- child1: Node;
1351
- tree: Node;
1352
- }
1353
- const given = getGiven<Vars>();
1354
- given("child1", () => given.tree.getNodeByNameMustExist("child1"));
1355
- given("tree", () => new Node().loadFromData(exampleData));
1356
-
1357
- beforeEach(() => {
1358
- given.child1.remove();
1359
- });
1360
-
1361
- it("removes the node", () => {
1362
- expect(given.tree).toMatchObject({
1363
- children: [
1364
- expect.objectContaining({
1365
- name: "node1",
1366
- children: [expect.objectContaining({ name: "child2" })],
1367
- }),
1368
- expect.objectContaining({ name: "node2" }),
1369
- ],
1370
- });
1371
- });
1372
- });
1373
-
1374
- describe("removeChild", () => {
1375
- interface Vars {
1376
- child1: Node;
1377
- node1: Node;
1378
- tree: Node;
1379
- }
1380
-
1381
- const given = getGiven<Vars>();
1382
-
1383
- given("child1", () => given.tree.getNodeByNameMustExist("child1"));
1384
- given("node1", () => given.tree.getNodeByNameMustExist("node1"));
1385
- given("tree", () => new Node().loadFromData(exampleData));
1386
-
1387
- beforeEach(() => {
1388
- given.node1.removeChild(given.child1);
1389
- });
1390
-
1391
- it("removes the child", () => {
1392
- expect(given.node1.children).toEqual([
1393
- expect.objectContaining({ name: "child2" }),
1394
- ]);
1395
- });
1396
- });