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,401 +0,0 @@
1
- import { test, expect, Page } from "@playwright/test";
2
- import {
3
- boundingBox,
4
- dragAndDrop,
5
- findNodeElement,
6
- getNodeRect,
7
- getSelectedNodeName,
8
- getTreeStructure,
9
- moveMouseToNode,
10
- selectNode,
11
- sleep,
12
- } from "./testUtils";
13
- import { initCoverage, saveCoverage } from "./coverage";
14
-
15
- const initPage = async (page: Page, baseURL: string | undefined) => {
16
- if (!baseURL) {
17
- throw new Error("Missing baseURL");
18
- }
19
-
20
- await page.goto(`${baseURL}/test_index.html`);
21
- await page.waitForLoadState("domcontentloaded");
22
-
23
- page.on("console", (msg) => console.log(`console: ${msg.text()}`));
24
- };
25
-
26
- interface InitTreeOptions {
27
- autoOpen?: number;
28
- dragAndDrop?: boolean;
29
- }
30
-
31
- const initTree = async (
32
- page: Page,
33
- { autoOpen, dragAndDrop }: InitTreeOptions,
34
- ) => {
35
- await page.evaluate(`
36
- const $tree = jQuery("#tree1");
37
-
38
- $tree.tree({
39
- animationSpeed: 0,
40
- autoOpen: ${autoOpen || 0},
41
- data: ExampleData.exampleData,
42
- dragAndDrop: ${dragAndDrop || false},
43
- startDndDelay: 100,
44
- });
45
- `);
46
- };
47
-
48
- test.beforeEach(async ({ context }) => {
49
- await initCoverage(context);
50
- });
51
-
52
- test.afterEach(async ({ context }) => {
53
- await saveCoverage(context);
54
- });
55
-
56
- test.describe("without dragAndDrop", () => {
57
- test.beforeEach(async ({ baseURL, page }) => {
58
- await initPage(page, baseURL);
59
- await initTree(page, { dragAndDrop: false });
60
- });
61
-
62
- test("displays a tree", async ({ page }) => {
63
- await expect(page.locator("body")).toHaveText(/.*Saurischia.*/);
64
- await expect(page.locator("body")).toHaveText(/.*Ornithischians.*/);
65
- await expect(page.locator("body")).toHaveText(/.*Coelophysoids.*/);
66
-
67
- const screenshot = await page.screenshot();
68
- expect(screenshot).toMatchSnapshot();
69
- });
70
-
71
- test("selects a node", async ({ page }) => {
72
- await expect(page.locator("body")).toHaveText(/.*Saurischia.*/);
73
-
74
- const saurischia = await findNodeElement(page, "Saurischia");
75
- await selectNode(saurischia);
76
-
77
- expect(await getSelectedNodeName(page)).toBe("Saurischia");
78
-
79
- const screenshot = await page.screenshot();
80
- expect(screenshot).toMatchSnapshot();
81
- });
82
- });
83
-
84
- test.describe("with dragAndDrop", () => {
85
- test.beforeEach(async ({ baseURL, page }) => {
86
- await initPage(page, baseURL);
87
- await initTree(page, { dragAndDrop: true });
88
- });
89
-
90
- test("moves a node", async ({ page }) => {
91
- await dragAndDrop(page, "Herrerasaurians", "Ornithischians");
92
-
93
- const structure = await getTreeStructure(page);
94
-
95
- expect(structure).toEqual([
96
- expect.objectContaining({
97
- name: "Saurischia",
98
- children: [
99
- expect.objectContaining({ name: "Theropods" }),
100
- expect.objectContaining({ name: "Sauropodomorphs" }),
101
- ],
102
- }),
103
- expect.objectContaining({
104
- name: "Ornithischians",
105
- children: [
106
- expect.objectContaining({ name: "Herrerasaurians" }),
107
- expect.objectContaining({ name: "Heterodontosaurids" }),
108
- expect.objectContaining({ name: "Thyreophorans" }),
109
- expect.objectContaining({ name: "Ornithopods" }),
110
- expect.objectContaining({
111
- name: "Pachycephalosaurians",
112
- }),
113
- expect.objectContaining({ name: "Ceratopsians" }),
114
- ],
115
- }),
116
- ]);
117
-
118
- const screenshot = await page.screenshot();
119
- expect(screenshot).toMatchSnapshot();
120
- });
121
-
122
- test("moves a node with touch events", async ({ page }) => {
123
- const client = await page.context().newCDPSession(page);
124
-
125
- const box1 = await getNodeRect(page, "Herrerasaurians");
126
-
127
- await client.send("Input.dispatchTouchEvent", {
128
- type: "touchStart",
129
- touchPoints: [{ x: box1.x + 10, y: box1.y + box1.height / 2 }],
130
- });
131
-
132
- await sleep(page, 200);
133
-
134
- const box2 = await getNodeRect(page, "Ornithischians");
135
- await client.send("Input.dispatchTouchEvent", {
136
- type: "touchEnd",
137
- touchPoints: [{ x: box2.x + 10, y: box2.y + box2.height / 2 }],
138
- });
139
-
140
- const structure = await getTreeStructure(page);
141
-
142
- expect(structure).toEqual([
143
- expect.objectContaining({
144
- name: "Saurischia",
145
- children: [
146
- expect.objectContaining({ name: "Theropods" }),
147
- expect.objectContaining({ name: "Sauropodomorphs" }),
148
- ],
149
- }),
150
- expect.objectContaining({
151
- name: "Ornithischians",
152
- children: [
153
- expect.objectContaining({ name: "Herrerasaurians" }),
154
- expect.objectContaining({ name: "Heterodontosaurids" }),
155
- expect.objectContaining({ name: "Thyreophorans" }),
156
- expect.objectContaining({ name: "Ornithopods" }),
157
- expect.objectContaining({
158
- name: "Pachycephalosaurians",
159
- }),
160
- expect.objectContaining({ name: "Ceratopsians" }),
161
- ],
162
- }),
163
- ]);
164
- });
165
- });
166
-
167
- test.describe("autoscroll when the window is scrollable", () => {
168
- test("it scrolls vertically when the users drags an element to the bottom", async ({
169
- baseURL,
170
- page,
171
- }) => {
172
- await page.setViewportSize({ width: 200, height: 100 });
173
- await initPage(page, baseURL);
174
- await initTree(page, { autoOpen: 3, dragAndDrop: true });
175
-
176
- expect(
177
- await page
178
- .getByRole("document")
179
- .evaluate((element) => element.scrollTop),
180
- ).toEqual(0);
181
-
182
- await moveMouseToNode(page, "Saurischia");
183
- await page.mouse.down();
184
-
185
- await sleep(page, 200);
186
-
187
- await page.mouse.move(20, 190);
188
- await sleep(page, 50);
189
-
190
- expect(
191
- await page
192
- .getByRole("document")
193
- .evaluate((element) => element.scrollTop),
194
- ).toBeGreaterThan(0);
195
- });
196
-
197
- test("it scrolls horizontally when the users drags an element to the right", async ({
198
- baseURL,
199
- page,
200
- }) => {
201
- await page.setViewportSize({ width: 60, height: 400 });
202
- await initPage(page, baseURL);
203
- await initTree(page, { autoOpen: 3, dragAndDrop: true });
204
-
205
- expect(
206
- await page
207
- .getByRole("document")
208
- .evaluate((element) => element.scrollLeft),
209
- ).toEqual(0);
210
-
211
- await moveMouseToNode(page, "Saurischia");
212
- await page.mouse.down();
213
- await sleep(page, 200);
214
-
215
- await page.mouse.move(55, 10);
216
- await sleep(page, 50);
217
-
218
- expect(
219
- await page
220
- .getByRole("document")
221
- .evaluate((element) => element.scrollLeft),
222
- ).toBeGreaterThan(0);
223
- });
224
-
225
- test("scrollToNode scrolls to a node", async ({ baseURL, page }) => {
226
- await page.setViewportSize({ width: 200, height: 100 });
227
- await initPage(page, baseURL);
228
- await initTree(page, { autoOpen: 3, dragAndDrop: true });
229
-
230
- expect(
231
- await page
232
- .getByRole("document")
233
- .evaluate((element) => element.scrollTop),
234
- ).toEqual(0);
235
-
236
- await page.evaluate(`
237
- const $tree = jQuery("#tree1");
238
- const node = $tree.tree("getNodeByName", "Sauropodomorphs");
239
- $tree.tree("scrollToNode",node);
240
- `);
241
-
242
- expect(
243
- await page
244
- .getByRole("document")
245
- .evaluate((element) => element.scrollTop),
246
- ).toBeGreaterThan(0);
247
- });
248
- });
249
-
250
- test.describe("autoscroll when the container is scrollable vertically", () => {
251
- test.beforeEach(async ({ page, baseURL }) => {
252
- await initPage(page, baseURL);
253
-
254
- // Add a container and make it the parent of the tree element
255
- await page.evaluate(`
256
- document.body.style.marginLeft = "40px";
257
- document.body.style.marginTop = "40px";
258
-
259
- const treeElement = document.querySelector("#tree1");
260
-
261
- const container = document.createElement("div");
262
- container.id = "container";
263
- container.style.height = "200px";
264
- container.style.overflowY = "scroll";
265
-
266
- document.body.replaceChild(container, treeElement);
267
- container.appendChild(treeElement);
268
- `);
269
-
270
- await initTree(page, { autoOpen: 3, dragAndDrop: true });
271
- });
272
-
273
- test("it scrolls vertically when the users drags an element to the bottom", async ({
274
- page,
275
- }) => {
276
- const container = page.locator("#container");
277
-
278
- expect(
279
- await container.evaluate((element) => element.scrollTop),
280
- ).toEqual(0);
281
-
282
- await moveMouseToNode(page, "Saurischia");
283
- await page.mouse.down();
284
- await sleep(page, 200);
285
-
286
- await page.mouse.move(20, 245);
287
- await sleep(page, 50);
288
-
289
- expect(
290
- await container.evaluate((element) => element.scrollTop),
291
- ).toBeGreaterThan(0);
292
- });
293
-
294
- test("scrollToNode scrolls to a node", async ({ page }) => {
295
- const container = page.locator("#container");
296
-
297
- expect(
298
- await container.evaluate((element) => element.scrollTop),
299
- ).toEqual(0);
300
-
301
- await page.evaluate(`
302
- const $tree = jQuery("#tree1");
303
- const node = $tree.tree("getNodeByName", "Sauropodomorphs");
304
- $tree.tree("scrollToNode",node);
305
- `);
306
-
307
- expect(
308
- await container.evaluate((element) => element.scrollTop),
309
- ).toBeGreaterThan(0);
310
- });
311
- });
312
-
313
- test.describe("autoscroll when the container is scrollable horizontally", () => {
314
- test.beforeEach(async ({ page, baseURL }) => {
315
- await initPage(page, baseURL);
316
-
317
- // Add a container and make it the parent of the tree element
318
- await page.evaluate(`
319
- document.body.style.marginLeft = "40px";
320
- document.body.style.marginTop = "40px";
321
-
322
- const treeElement = document.querySelector("#tree1");
323
-
324
- const container = document.createElement("div");
325
- container.id = "container";
326
- container.style.width = "400px";
327
- container.style.overflowX = "scroll";
328
- container.classList.add('wide-tree');
329
-
330
- document.body.replaceChild(container, treeElement);
331
- container.appendChild(treeElement);
332
- `);
333
-
334
- await initTree(page, { autoOpen: 3, dragAndDrop: true });
335
- });
336
-
337
- test("it scrolls horizontally when the users drags an element to the right", async ({
338
- page,
339
- }) => {
340
- const container = page.locator("#container");
341
-
342
- expect(
343
- await container.evaluate((element) => element.scrollLeft),
344
- ).toEqual(0);
345
-
346
- await moveMouseToNode(page, "Saurischia");
347
- await page.mouse.down();
348
- await sleep(page, 200);
349
-
350
- const containerBox = await boundingBox(container);
351
-
352
- await page.mouse.move(
353
- containerBox.x + containerBox.width,
354
- containerBox.y + 10,
355
- );
356
- await sleep(page, 100);
357
-
358
- expect(
359
- await container.evaluate((element) => element.scrollLeft),
360
- ).toBeGreaterThan(0);
361
- });
362
-
363
- test("it moves a node after scrolling horizontally", async ({ page }) => {
364
- await moveMouseToNode(page, "Coelophysoids");
365
- await page.mouse.down();
366
- await sleep(page, 200);
367
-
368
- const container = page.locator("#container");
369
- const containerBox = await boundingBox(container);
370
-
371
- await page.mouse.move(
372
- containerBox.x + containerBox.width,
373
- containerBox.y + 10,
374
- );
375
-
376
- await page.waitForFunction(() => {
377
- const container = document.querySelector("#container");
378
-
379
- if (!container) {
380
- return false;
381
- }
382
-
383
- return (
384
- container.scrollLeft >=
385
- container.scrollWidth - container.clientWidth
386
- );
387
- });
388
-
389
- await moveMouseToNode(page, "Tyrannosauroids");
390
- await page.mouse.down();
391
- await sleep(page, 200);
392
-
393
- const childrenJson = await page.evaluate<string>(`
394
- const $tree = jQuery("#tree1");
395
- const node = $tree.tree("getNodeByName", "Tyrannosauroids");
396
- const children = node.children.map(child => child.name)
397
- JSON.stringify(children);
398
- `);
399
- expect(JSON.parse(childrenJson)).toEqual(["Coelophysoids"]);
400
- });
401
- });
@@ -1,153 +0,0 @@
1
- import { ElementHandle, Locator, Page } from "@playwright/test";
2
-
3
- interface BoundingBox {
4
- x: number;
5
- y: number;
6
- width: number;
7
- height: number;
8
- }
9
-
10
- export const sleep = async (page: Page, timeout: number) =>
11
- await page.waitForTimeout(timeout); // eslint-disable-line playwright/no-wait-for-timeout
12
-
13
- export const locateTitle = (page: Page, title: string) =>
14
- page.locator(".jqtree-title", {
15
- hasText: title,
16
- });
17
-
18
- export const findNodeElement = async (page: Page, title: string) => {
19
- const titleElement = await locateTitle(page, title).elementHandle();
20
-
21
- if (!titleElement) {
22
- throw new Error(`Title element not found: ${title}`);
23
- }
24
-
25
- const nodeElement = await titleElement.evaluateHandle((el) => {
26
- const li = el.closest("li");
27
-
28
- if (!li) {
29
- throw Error("Node element not found");
30
- }
31
-
32
- return li;
33
- });
34
-
35
- return nodeElement;
36
- };
37
-
38
- export const selectNode = async (nodeElement: ElementHandle) => {
39
- const titleHandle = await nodeElement.$(".jqtree-title");
40
-
41
- if (!titleHandle) {
42
- throw new Error("Could not select: title element not found");
43
- }
44
-
45
- await titleHandle.click();
46
- };
47
-
48
- export const boundingBox = async (locator: Locator) => {
49
- const result = await locator.boundingBox();
50
-
51
- if (!result) {
52
- throw new Error("Empty boundingBox");
53
- }
54
-
55
- return result;
56
- };
57
-
58
- const getRect = async (
59
- elementHandle: ElementHandle<HTMLElement>,
60
- ): Promise<BoundingBox> => {
61
- const boundingBox = await elementHandle.boundingBox();
62
-
63
- if (!boundingBox) {
64
- throw "No bounding box";
65
- }
66
-
67
- return boundingBox;
68
- };
69
-
70
- export const getTreeStructure = async (page: Page) => {
71
- const structure = await page.evaluate<string>(`
72
- ;
73
- function getTreeNode($li) {
74
- const $div = $li.children("div.jqtree-element");
75
- const $span = $div.children("span.jqtree-title");
76
- const name = $span.text();
77
- const selected = $li.hasClass("jqtree-selected");
78
-
79
- if ($li.hasClass("jqtree-folder")) {
80
- const $ul = $li.children("ul.jqtree_common");
81
-
82
- return {
83
- nodeType: "folder",
84
- children: getChildren($ul),
85
- name,
86
- open: !$li.hasClass("jqtree-closed"),
87
- selected,
88
- };
89
- } else {
90
- return {
91
- nodeType: "child",
92
- name,
93
- selected,
94
- };
95
- }
96
- }
97
-
98
- function getChildren($ul) {
99
- return $ul
100
- .children("li.jqtree_common")
101
- .map((_, li) => {
102
- return getTreeNode(jQuery(li));
103
- })
104
- .get();
105
- }
106
-
107
- JSON.stringify(window.getChildren(jQuery("ul.jqtree-tree")));
108
- `);
109
-
110
- return JSON.parse(structure) as JQTreeMatchers.TreeStructure;
111
- };
112
-
113
- export const getNodeRect = async (
114
- page: Page,
115
- title: string,
116
- ): Promise<BoundingBox> => {
117
- const titleElement = await locateTitle(page, title).elementHandle();
118
-
119
- if (!titleElement) {
120
- throw Error("Element not found");
121
- }
122
-
123
- const rect = await getRect(titleElement as ElementHandle<HTMLElement>);
124
- return rect;
125
- };
126
-
127
- export const moveMouseToNode = async (page: Page, title: string) => {
128
- const rect = await getNodeRect(page, title);
129
-
130
- await page.mouse.move(rect.x + 10, rect.y + rect.height / 2);
131
- };
132
-
133
- export const dragAndDrop = async (
134
- page: Page,
135
- fromTitle: string,
136
- toTitle: string,
137
- ): Promise<void> => {
138
- await moveMouseToNode(page, fromTitle);
139
- await page.mouse.down();
140
-
141
- await sleep(page, 200);
142
-
143
- await moveMouseToNode(page, toTitle);
144
- await page.mouse.up();
145
- };
146
-
147
- export const getSelectedNodeName = async (page: Page) => {
148
- return await page.evaluate(`
149
- const $tree = jQuery("#tree1");
150
- const node = $tree.tree('getSelectedNode');
151
- node?.name;
152
- `);
153
- };
@@ -1,17 +0,0 @@
1
- {
2
- "plugins": ["jest", "testing-library"],
3
- "extends": ["plugin:jest/all", "plugin:testing-library/dom"],
4
- "rules": {
5
- "jest/consistent-test-it": "off",
6
- "jest/max-expects": ["off"],
7
- "jest/no-duplicate-hooks": "off",
8
- "jest/no-hooks": "off",
9
- "jest/no-identical-title": "off",
10
- "jest/no-standalone-expect": "off",
11
- "jest/prefer-expect-assertions": "off",
12
- "jest/prefer-strict-equal": "off",
13
- "jest/require-hook": "off",
14
- "jest/require-top-level-describe": "off",
15
- "testing-library/no-node-access": "off"
16
- }
17
- }
@@ -1 +0,0 @@
1
- import "jest-extended";
@@ -1,25 +0,0 @@
1
- import { axe, toHaveNoViolations } from "jest-axe";
2
- import "../../tree.jquery";
3
- import exampleData from "../support/exampleData";
4
-
5
- expect.extend(toHaveNoViolations);
6
-
7
- beforeEach(() => {
8
- $("body").append('<div id="tree1"></div>');
9
- });
10
-
11
- afterEach(() => {
12
- const $tree = $("#tree1");
13
- $tree.tree("destroy");
14
- $tree.remove();
15
- });
16
-
17
- it("has an accessible ui", async () => {
18
- const $tree = $("#tree1");
19
- $tree.tree({
20
- data: exampleData,
21
- });
22
- const element = $tree.get()[0] as HTMLElement;
23
-
24
- await expect(axe(element)).resolves.toHaveNoViolations();
25
- });
@@ -1,54 +0,0 @@
1
- import getGiven from "givens";
2
- import "../../tree.jquery";
3
- import exampleData from "../support/exampleData";
4
-
5
- beforeEach(() => {
6
- $("body").append('<div id="tree1"></div>');
7
- });
8
-
9
- afterEach(() => {
10
- const $tree = $("#tree1");
11
- $tree.tree("destroy");
12
- $tree.remove();
13
- });
14
-
15
- describe("create with data", () => {
16
- interface Vars {
17
- $tree: JQuery<HTMLElement>;
18
- }
19
-
20
- const given = getGiven<Vars>();
21
- given("$tree", () => $("#tree1"));
22
-
23
- beforeEach(() => {
24
- given.$tree.tree({
25
- data: exampleData,
26
- });
27
- });
28
-
29
- it("creates a tree", () => {
30
- expect(given.$tree).toHaveTreeStructure([
31
- expect.objectContaining({
32
- name: "node1",
33
- open: false,
34
- selected: false,
35
- children: [
36
- expect.objectContaining({ name: "child1" }),
37
- expect.objectContaining({ name: "child2" }),
38
- ],
39
- }),
40
- expect.objectContaining({
41
- name: "node2",
42
- open: false,
43
- selected: false,
44
- children: [
45
- expect.objectContaining({
46
- name: "node3",
47
- open: false,
48
- children: [expect.objectContaining({ name: "child3" })],
49
- }),
50
- ],
51
- }),
52
- ]);
53
- });
54
- });