jqtree 1.8.2 → 1.8.4

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 +31 -29
  3. package/src/dragAndDropHandler/generateHitAreas.ts +47 -43
  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 +69 -106
  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 -434
  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,82 +0,0 @@
1
- import "../../tree.jquery";
2
- import { userEvent } from "@testing-library/user-event";
3
- import exampleData from "../support/exampleData";
4
- import { titleSpan, togglerLink } from "../support/testUtil";
5
-
6
- beforeEach(() => {
7
- $("body").append('<div id="tree1"></div>');
8
- });
9
-
10
- afterEach(() => {
11
- const $tree = $("#tree1");
12
- $tree.tree("destroy");
13
- $tree.remove();
14
- });
15
-
16
- it("selects a node and sets the focus when it is clicked", async () => {
17
- const $tree = $("#tree1");
18
- $tree.tree({ data: exampleData });
19
-
20
- const node = $tree.tree("getNodeByNameMustExist", "node1");
21
- expect(node.element).not.toBeSelected();
22
- expect(node.element).not.toBeFocused();
23
-
24
- await userEvent.click(titleSpan(node.element).get(0) as HTMLElement);
25
-
26
- expect(node.element).toBeSelected();
27
- });
28
-
29
- it("deselects when a selected node is clicked", async () => {
30
- const $tree = $("#tree1");
31
- $tree.tree({ data: exampleData });
32
-
33
- const node = $tree.tree("getNodeByNameMustExist", "node1");
34
- $tree.tree("selectNode", node);
35
-
36
- expect(node.element).toBeSelected();
37
-
38
- await userEvent.click(titleSpan(node.element).get(0) as HTMLElement);
39
-
40
- expect(node.element).not.toBeSelected();
41
- });
42
-
43
- it("opens a node when the toggle button is clicked", async () => {
44
- const $tree = $("#tree1");
45
- $tree.tree({ data: exampleData });
46
-
47
- const node = $tree.tree("getNodeByNameMustExist", "node1");
48
- expect(node.element).not.toBeOpen();
49
-
50
- await userEvent.click(togglerLink(node.element).get(0) as HTMLElement);
51
-
52
- expect(node.element).toBeOpen();
53
- });
54
-
55
- it("doesn't select a node when it is opened", async () => {
56
- const $tree = $("#tree1");
57
- $tree.tree({ data: exampleData });
58
-
59
- const node = $tree.tree("getNodeByNameMustExist", "node1");
60
- expect(node.element).not.toBeSelected();
61
- expect(node.element).not.toBeOpen();
62
-
63
- await userEvent.click(togglerLink(node.element).get(0) as HTMLElement);
64
-
65
- expect(node.element).not.toBeSelected();
66
- expect(node.element).toBeOpen();
67
- });
68
-
69
- it("keeps it selected when a selected node is opened", async () => {
70
- const $tree = $("#tree1");
71
- $tree.tree({ data: exampleData });
72
-
73
- const node = $tree.tree("getNodeByNameMustExist", "node1");
74
- $tree.tree("selectNode", node);
75
- expect(node.element).toBeSelected();
76
- expect(node.element).not.toBeOpen();
77
-
78
- await userEvent.click(togglerLink(node.element).get(0) as HTMLElement);
79
-
80
- expect(node.element).toBeSelected();
81
- expect(node.element).toBeOpen();
82
- });
@@ -1,595 +0,0 @@
1
- import getGiven from "givens";
2
- import { screen, waitFor } from "@testing-library/dom";
3
- import { http, HttpResponse } from "msw";
4
- import { setupServer } from "msw/node";
5
- import "../../tree.jquery";
6
- import exampleData from "../support/exampleData";
7
- import { titleSpan, togglerLink } from "../support/testUtil";
8
-
9
- const context = describe;
10
-
11
- const server = setupServer();
12
-
13
- beforeAll(() => server.listen());
14
-
15
- beforeEach(() => {
16
- $("body").append('<div id="tree1"></div>');
17
- });
18
-
19
- afterEach(() => {
20
- server.resetHandlers();
21
-
22
- const $tree = $("#tree1");
23
- $tree.tree("destroy");
24
- $tree.remove();
25
- localStorage.clear();
26
- });
27
-
28
- afterAll(() => server.close());
29
-
30
- describe("autoEscape", () => {
31
- interface Vars {
32
- autoEscape: boolean;
33
- $tree: JQuery<HTMLElement>;
34
- }
35
-
36
- const given = getGiven<Vars>();
37
- given("$tree", () => $("#tree1"));
38
-
39
- beforeEach(() => {
40
- given.$tree.tree({
41
- autoEscape: given.autoEscape,
42
- data: ["<span>test</span>"],
43
- });
44
- });
45
-
46
- context("with autoEscape true", () => {
47
- given("autoEscape", () => true);
48
-
49
- it("escapes the node name", () => {
50
- expect(given.$tree).toHaveTreeStructure([
51
- expect.objectContaining({
52
- name: "&lt;span&gt;test&lt;/span&gt;",
53
- }),
54
- ]);
55
- });
56
- });
57
-
58
- context("with autoEscape false", () => {
59
- given("autoEscape", () => false);
60
-
61
- it("doesn't escape the node name", () => {
62
- expect(given.$tree).toHaveTreeStructure([
63
- expect.objectContaining({
64
- name: "<span>test</span>",
65
- }),
66
- ]);
67
- });
68
- });
69
- });
70
-
71
- describe("autoOpen", () => {
72
- interface Vars {
73
- autoOpen: boolean | number | string;
74
- $tree: JQuery<HTMLElement>;
75
- }
76
-
77
- const given = getGiven<Vars>();
78
- given("$tree", () => $("#tree1"));
79
-
80
- beforeEach(() => {
81
- given.$tree.tree({
82
- autoOpen: given.autoOpen,
83
- data: exampleData,
84
- });
85
- });
86
-
87
- context("with autoOpen false", () => {
88
- given("autoOpen", () => false);
89
-
90
- it("doesn't open any nodes", () => {
91
- expect(given.$tree).toHaveTreeStructure([
92
- expect.objectContaining({ name: "node1", open: false }),
93
- expect.objectContaining({ name: "node2", open: false }),
94
- ]);
95
- });
96
- });
97
-
98
- context("with autoOpen true", () => {
99
- given("autoOpen", () => true);
100
-
101
- it("opens all nodes", () => {
102
- expect(given.$tree).toHaveTreeStructure([
103
- expect.objectContaining({ name: "node1", open: true }),
104
- expect.objectContaining({
105
- name: "node2",
106
- open: true,
107
- children: [
108
- expect.objectContaining({ name: "node3", open: true }),
109
- ],
110
- }),
111
- ]);
112
- });
113
- });
114
-
115
- context("with autoOpen 0", () => {
116
- given("autoOpen", () => 0);
117
-
118
- it("opens level 0", () => {
119
- expect(given.$tree).toHaveTreeStructure([
120
- expect.objectContaining({ name: "node1", open: true }),
121
- expect.objectContaining({
122
- name: "node2",
123
- open: true,
124
- children: [
125
- expect.objectContaining({ name: "node3", open: false }),
126
- ],
127
- }),
128
- ]);
129
- });
130
- });
131
-
132
- context("with autoOpen 1", () => {
133
- given("autoOpen", () => 1);
134
-
135
- it("opens levels 1", () => {
136
- expect(given.$tree).toHaveTreeStructure([
137
- expect.objectContaining({ name: "node1", open: true }),
138
- expect.objectContaining({
139
- name: "node2",
140
- open: true,
141
- children: [
142
- expect.objectContaining({ name: "node3", open: true }),
143
- ],
144
- }),
145
- ]);
146
- });
147
- });
148
-
149
- context("with autoOpen '1'", () => {
150
- given("autoOpen", () => "1");
151
-
152
- it("opens levels 1", () => {
153
- expect(given.$tree).toHaveTreeStructure([
154
- expect.objectContaining({ name: "node1", open: true }),
155
- expect.objectContaining({
156
- name: "node2",
157
- open: true,
158
- children: [
159
- expect.objectContaining({ name: "node3", open: true }),
160
- ],
161
- }),
162
- ]);
163
- });
164
- });
165
- });
166
-
167
- describe("closedIcon", () => {
168
- it("renders a string", () => {
169
- const $tree = $("#tree1");
170
- $tree.tree({
171
- closedIcon: "closed",
172
- data: exampleData,
173
- });
174
-
175
- const $button = $tree.find("a.jqtree-toggler:first");
176
- expect($button.text()).toBe("closed");
177
- });
178
-
179
- it("escapes html", () => {
180
- const $tree = $("#tree1");
181
- $tree.tree({
182
- closedIcon: "<span>test</span>",
183
- data: exampleData,
184
- });
185
-
186
- const $button = $tree.find("a.jqtree-toggler:first");
187
- expect($button.text()).toBe("<span>test</span>");
188
- });
189
-
190
- it("renders a jquery element", () => {
191
- const $tree = $("#tree1");
192
- $tree.tree({
193
- closedIcon: $("<span class='abc'>test</span>"),
194
- data: exampleData,
195
- });
196
-
197
- const $span = $tree.find("a.jqtree-toggler:first span.abc");
198
- expect($span.text()).toBe("test");
199
- });
200
-
201
- it("renders a html element", () => {
202
- const icon = document.createElement("span");
203
- icon.className = "abc";
204
- icon.textContent = "test";
205
-
206
- const $tree = $("#tree1");
207
- $tree.tree({
208
- closedIcon: icon,
209
- data: exampleData,
210
- });
211
-
212
- const $span = $tree.find("a.jqtree-toggler:first span.abc");
213
- expect($span.text()).toBe("test");
214
- });
215
-
216
- it("renders a default when the option is empty", () => {
217
- const $tree = $("#tree1");
218
- $tree.tree({
219
- closedIcon: undefined,
220
- data: exampleData,
221
- });
222
-
223
- const $span = $tree.find("a.jqtree-toggler:first");
224
- expect($span.text()).toBe("►");
225
- });
226
- });
227
-
228
- describe("dataUrl", () => {
229
- const exampleStructure = [
230
- expect.objectContaining({ name: "node1" }),
231
- expect.objectContaining({ name: "node2" }),
232
- ];
233
-
234
- const testCases = [
235
- {
236
- name: "string",
237
- dataUrl: "/tree/",
238
- expectedNode: "node1",
239
- expectedStructure: exampleStructure,
240
- },
241
- {
242
- name: "object with url and headers",
243
- dataUrl: {
244
- url: "/tree/",
245
- headers: { node: "test-node" },
246
- },
247
- expectedNode: "test-node",
248
- expectedStructure: [expect.objectContaining({ name: "test-node" })],
249
- },
250
- {
251
- name: "function",
252
- dataUrl: () => ({ url: "/tree/" }),
253
- expectedNode: "node1",
254
- expectedStructure: exampleStructure,
255
- },
256
- ];
257
-
258
- beforeEach(() => {
259
- server.use(
260
- http.get("/tree/", ({ request }) => {
261
- const nodeName = request.headers.get("node");
262
- const data = nodeName ? [nodeName] : exampleData;
263
-
264
- return HttpResponse.json(data);
265
- }),
266
- );
267
- });
268
-
269
- interface Vars {
270
- $tree: JQuery<HTMLElement>;
271
- }
272
- const given = getGiven<Vars>();
273
- given("$tree", () => $("#tree1"));
274
-
275
- testCases.forEach(({ dataUrl, expectedNode, expectedStructure, name }) => {
276
- context(`with ${name}`, () => {
277
- it("loads the data from the url", async () => {
278
- given.$tree.tree({ dataUrl });
279
- await screen.findByText(expectedNode);
280
-
281
- expect(given.$tree).toHaveTreeStructure(expectedStructure);
282
- });
283
- });
284
- });
285
- });
286
-
287
- describe("onCanSelectNode", () => {
288
- interface Vars {
289
- node1: INode;
290
- $tree: JQuery<HTMLElement>;
291
- }
292
-
293
- const given = getGiven<Vars>();
294
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
295
- given("$tree", () => $("#tree1"));
296
-
297
- beforeEach(() => {
298
- given.$tree.tree({
299
- data: exampleData,
300
- onCanSelectNode: (node: INode) => node.name !== "node1",
301
- });
302
- });
303
-
304
- it("doesn't select the node", () => {
305
- given.$tree.tree("selectNode", given.node1);
306
-
307
- expect(given.$tree.tree("getSelectedNode")).toBe(false);
308
- });
309
- });
310
-
311
- describe("onCreateLi", () => {
312
- interface Vars {
313
- $tree: JQuery<HTMLElement>;
314
- }
315
-
316
- const given = getGiven<Vars>();
317
- given("$tree", () => $("#tree1"));
318
-
319
- beforeEach(() => {
320
- given.$tree.tree({
321
- data: exampleData,
322
- onCreateLi: (node: INode, el: JQuery<HTMLElement>) => {
323
- titleSpan(el).text(`_${node.name}_`);
324
- },
325
- });
326
- });
327
-
328
- it("is called when creating a node", () => {
329
- expect(given.$tree).toHaveTreeStructure([
330
- expect.objectContaining({ name: "_node1_" }),
331
- expect.objectContaining({ name: "_node2_" }),
332
- ]);
333
- });
334
- });
335
-
336
- describe("onGetStateFromStorage and onSetStateFromStorage", () => {
337
- let savedState = "";
338
-
339
- const setState = (state: string): void => {
340
- savedState = state;
341
- };
342
-
343
- const getState = (): string => savedState;
344
-
345
- interface Vars {
346
- initialState: string;
347
- node1: INode;
348
- $tree: JQuery<HTMLElement>;
349
- }
350
-
351
- const given = getGiven<Vars>();
352
- given("initialState", () => "");
353
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
354
- given("$tree", () => $("#tree1"));
355
-
356
- beforeEach(() => {
357
- savedState = given.initialState;
358
-
359
- given.$tree.tree({
360
- autoOpen: false,
361
- data: exampleData,
362
- onGetStateFromStorage: getState,
363
- onSetStateFromStorage: setState,
364
- saveState: true,
365
- });
366
- });
367
-
368
- context("with an open and a selected node", () => {
369
- beforeEach(() => {
370
- given.$tree.tree("selectNode", given.node1);
371
- given.$tree.tree("openNode", given.node1);
372
- });
373
-
374
- it("saves the state", () => {
375
- expect(JSON.parse(savedState)).toEqual({
376
- open_nodes: [123],
377
- selected_node: [123],
378
- });
379
- });
380
- });
381
-
382
- context("with a saved state", () => {
383
- given("initialState", () =>
384
- JSON.stringify({
385
- open_nodes: [123],
386
- selected_node: [123],
387
- }),
388
- );
389
-
390
- it("restores the state", () => {
391
- expect(given.$tree).toHaveTreeStructure([
392
- expect.objectContaining({
393
- name: "node1",
394
- open: true,
395
- }),
396
- expect.objectContaining({ name: "node2", open: false }),
397
- ]);
398
- expect(given.node1.element).toBeSelected();
399
- });
400
- });
401
- });
402
-
403
- describe("onLoadFailed", () => {
404
- interface Vars {
405
- $tree: JQuery<HTMLElement>;
406
- }
407
-
408
- const given = getGiven<Vars>();
409
- given("$tree", () => $("#tree1"));
410
-
411
- context("when the loading fails", () => {
412
- beforeEach(() => {
413
- server.use(
414
- http.get(
415
- "/tree/",
416
- () =>
417
- new HttpResponse("Internal server error", {
418
- status: 500,
419
- }),
420
- ),
421
- );
422
- });
423
-
424
- it("calls onLoadFailed", async () => {
425
- const onLoadFailed = jest.fn();
426
-
427
- given.$tree.tree({
428
- dataUrl: "/tree/",
429
- onLoadFailed,
430
- });
431
-
432
- await waitFor(() => {
433
- expect(onLoadFailed).toHaveBeenCalledWith(
434
- expect.objectContaining({ status: 500 }),
435
- );
436
- });
437
- });
438
- });
439
- });
440
-
441
- describe("rtl", () => {
442
- interface Vars {
443
- node1: INode;
444
- $tree: JQuery<HTMLElement>;
445
- }
446
- const given = getGiven<Vars>();
447
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
448
- given("$tree", () => $("#tree1"));
449
-
450
- context("with the rtl option is true", () => {
451
- beforeEach(() => {
452
- given.$tree.tree({ data: exampleData, rtl: true });
453
- });
454
-
455
- it("has a different closed icon", () => {
456
- expect(togglerLink(given.node1.element).text()).toBe("◀");
457
- });
458
- });
459
-
460
- context("with the rtl data option", () => {
461
- beforeEach(() => {
462
- given.$tree.attr("data-rtl", "true");
463
- given.$tree.tree({ data: exampleData });
464
- });
465
-
466
- it("has a different closed icon", () => {
467
- expect(togglerLink(given.node1.element).text()).toBe("◀");
468
- });
469
- });
470
- });
471
-
472
- describe("saveState", () => {
473
- interface Vars {
474
- node1: INode;
475
- saveState: boolean | string;
476
- $tree: JQuery<HTMLElement>;
477
- }
478
- const given = getGiven<Vars>();
479
- given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
480
- given("$tree", () => $("#tree1"));
481
-
482
- context("when a node is open and selected", () => {
483
- beforeEach(() => {
484
- given.$tree.tree({
485
- animationSpeed: 0,
486
- autoOpen: false,
487
- data: exampleData,
488
- saveState: given.saveState,
489
- });
490
-
491
- given.$tree.tree("selectNode", given.node1);
492
- given.$tree.tree("openNode", given.node1);
493
- });
494
-
495
- context("when saveState is true", () => {
496
- given("saveState", () => true);
497
-
498
- it("saves the state to local storage", () => {
499
- expect(localStorage.getItem("tree")).toBe(
500
- '{"open_nodes":[123],"selected_node":[123]}',
501
- );
502
- });
503
- });
504
-
505
- context("when saveState is a string", () => {
506
- given("saveState", () => "my-state");
507
-
508
- it("uses the string as a key", () => {
509
- expect(localStorage.getItem("my-state")).toBe(
510
- '{"open_nodes":[123],"selected_node":[123]}',
511
- );
512
- });
513
- });
514
-
515
- context("when saveState is false", () => {
516
- given("saveState", () => false);
517
-
518
- it("doesn't save to local storage", () => {
519
- expect(localStorage.getItem("tree")).toBeNull();
520
- });
521
- });
522
- });
523
-
524
- context("when there is a state in the local storage", () => {
525
- given("saveState", () => true);
526
-
527
- beforeEach(() => {
528
- localStorage.setItem(
529
- "tree",
530
- '{"open_nodes":[123],"selected_node":[123]}',
531
- );
532
-
533
- given.$tree.tree({
534
- animationSpeed: 0,
535
- autoOpen: false,
536
- data: exampleData,
537
- saveState: given.saveState,
538
- });
539
- });
540
-
541
- it("restores the state", () => {
542
- expect(given.$tree).toHaveTreeStructure([
543
- expect.objectContaining({
544
- name: "node1",
545
- open: true,
546
- selected: true,
547
- }),
548
- expect.objectContaining({
549
- name: "node2",
550
- open: false,
551
- selected: false,
552
- }),
553
- ]);
554
- });
555
- });
556
- });
557
-
558
- describe("showEmptyFolder", () => {
559
- context("when children attribute is an empty array", () => {
560
- interface Vars {
561
- showEmptyFolder: boolean;
562
- $tree: JQuery<HTMLElement>;
563
- }
564
-
565
- const given = getGiven<Vars>();
566
- given("$tree", () => $("#tree1"));
567
-
568
- beforeEach(() => {
569
- given.$tree.tree({
570
- data: [{ name: "parent1", children: [] }],
571
- showEmptyFolder: given.showEmptyFolder,
572
- });
573
- });
574
-
575
- context("with showEmptyFolder false", () => {
576
- given("showEmptyFolder", () => false);
577
-
578
- it("creates a child node", () => {
579
- expect(given.$tree).toHaveTreeStructure([
580
- expect.objectContaining({ name: "parent1" }),
581
- ]);
582
- });
583
- });
584
-
585
- context("with showEmptyFolder true", () => {
586
- given("showEmptyFolder", () => true);
587
-
588
- it("creates a folder", () => {
589
- expect(given.$tree).toHaveTreeStructure([
590
- expect.objectContaining({ name: "parent1", children: [] }),
591
- ]);
592
- });
593
- });
594
- });
595
- });