jqtree 1.8.2 → 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.
- package/bower.json +1 -1
- package/package.json +20 -19
- package/src/dragAndDropHandler/generateHitAreas.ts +47 -43
- package/src/nodeElement/ghostDropHint.ts +3 -37
- package/src/nodeElement/index.ts +1 -1
- package/src/saveStateHandler.ts +43 -59
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +69 -106
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/.editorconfig +0 -12
- package/.eslintrc +0 -48
- package/.github/workflows/ci.yml +0 -68
- package/.github/workflows/codeql-analysis.yml +0 -32
- package/.github/workflows/size.yml +0 -24
- package/.github/workflows/static.yml +0 -57
- package/.prettier +0 -3
- package/config/.postcssrc +0 -6
- package/config/babel.config.json +0 -11
- package/config/babel.coverage.config.json +0 -4
- package/config/jest.config.js +0 -24
- package/config/jest.polyfills.js +0 -14
- package/config/playwright.config.js +0 -18
- package/config/production +0 -6
- package/config/rollup.config.mjs +0 -71
- package/css/jqtree.postcss +0 -193
- package/devserver/devserver.js +0 -7
- package/devserver/devserver_scroll.js +0 -8
- package/devserver/index.html +0 -22
- package/devserver/test_index.html +0 -22
- package/devserver/test_scroll.html +0 -28
- package/devserver/test_scroll_container.html +0 -39
- package/docs/.ruby-version +0 -1
- package/docs/Gemfile +0 -5
- package/docs/Gemfile.lock +0 -82
- package/docs/_config.yml +0 -126
- package/docs/_entries/events/index.md +0 -6
- package/docs/_entries/events/tree-click.md +0 -37
- package/docs/_entries/events/tree-close.md +0 -15
- package/docs/_entries/events/tree-contextmenu.md +0 -21
- package/docs/_entries/events/tree-dblclick.md +0 -19
- package/docs/_entries/events/tree-init.md +0 -15
- package/docs/_entries/events/tree-load-data.md +0 -15
- package/docs/_entries/events/tree-loading-data.md +0 -27
- package/docs/_entries/events/tree-move.md +0 -73
- package/docs/_entries/events/tree-open.md +0 -15
- package/docs/_entries/events/tree-refresh.md +0 -12
- package/docs/_entries/events/tree-select.md +0 -28
- package/docs/_entries/functions/addnodeafter.md +0 -20
- package/docs/_entries/functions/addnodebefore.md +0 -8
- package/docs/_entries/functions/addparentnode.md +0 -20
- package/docs/_entries/functions/appendnode.md +0 -50
- package/docs/_entries/functions/closenode.md +0 -23
- package/docs/_entries/functions/destroy.md +0 -12
- package/docs/_entries/functions/getnodebycallback.md +0 -24
- package/docs/_entries/functions/getnodebyhtmlelement.md +0 -29
- package/docs/_entries/functions/getnodebyid.md +0 -21
- package/docs/_entries/functions/getselectednode.md +0 -10
- package/docs/_entries/functions/getstate.md +0 -19
- package/docs/_entries/functions/gettree.md +0 -12
- package/docs/_entries/functions/index.md +0 -6
- package/docs/_entries/functions/is-node-selected.md +0 -11
- package/docs/_entries/functions/isdragging.md +0 -12
- package/docs/_entries/functions/loaddata.md +0 -46
- package/docs/_entries/functions/loaddatafromurl.md +0 -55
- package/docs/_entries/functions/movedown.md +0 -8
- package/docs/_entries/functions/movenode.md +0 -15
- package/docs/_entries/functions/moveup.md +0 -8
- package/docs/_entries/functions/opennode.md +0 -44
- package/docs/_entries/functions/prependnode.md +0 -21
- package/docs/_entries/functions/refresh.md +0 -12
- package/docs/_entries/functions/reload.md +0 -22
- package/docs/_entries/functions/removenode.md +0 -12
- package/docs/_entries/functions/scrolltonode.md +0 -13
- package/docs/_entries/functions/selectnode.md +0 -45
- package/docs/_entries/functions/setoption.md +0 -12
- package/docs/_entries/functions/setstate.md +0 -8
- package/docs/_entries/functions/toggle.md +0 -25
- package/docs/_entries/functions/tojson.md +0 -13
- package/docs/_entries/functions/updatenode.md +0 -50
- package/docs/_entries/general/changelog.md +0 -434
- package/docs/_entries/general/demo.html +0 -28
- package/docs/_entries/general/downloads.md +0 -9
- package/docs/_entries/general/examples.md +0 -8
- package/docs/_entries/general/features.md +0 -15
- package/docs/_entries/general/index.md +0 -7
- package/docs/_entries/general/introduction.md +0 -9
- package/docs/_entries/general/requirements.md +0 -6
- package/docs/_entries/general/tutorial.md +0 -71
- package/docs/_entries/general/usecases.md +0 -15
- package/docs/_entries/multiple_selection/add-to-selection.md +0 -21
- package/docs/_entries/multiple_selection/get-selected-nodes.md +0 -10
- package/docs/_entries/multiple_selection/index.md +0 -9
- package/docs/_entries/multiple_selection/remove-from-selection.md +0 -11
- package/docs/_entries/node/children.md +0 -12
- package/docs/_entries/node/getdata.md +0 -17
- package/docs/_entries/node/getlevel.md +0 -13
- package/docs/_entries/node/getnextnode.md +0 -12
- package/docs/_entries/node/getnextsibling.md +0 -10
- package/docs/_entries/node/getnextvisiblenode.md +0 -15
- package/docs/_entries/node/getpreviousnode.md +0 -12
- package/docs/_entries/node/getprevioussibling.md +0 -10
- package/docs/_entries/node/getpreviousvisiblenode.md +0 -15
- package/docs/_entries/node/index.md +0 -13
- package/docs/_entries/node/parent.md +0 -10
- package/docs/_entries/options/animationspeed.md +0 -7
- package/docs/_entries/options/autoescape.md +0 -6
- package/docs/_entries/options/autoopen.md +0 -28
- package/docs/_entries/options/buttonleft.md +0 -12
- package/docs/_entries/options/closedicon.md +0 -26
- package/docs/_entries/options/data-url.md +0 -45
- package/docs/_entries/options/data.md +0 -46
- package/docs/_entries/options/datafilter.md +0 -17
- package/docs/_entries/options/draganddrop.md +0 -18
- package/docs/_entries/options/index.md +0 -6
- package/docs/_entries/options/keyboardsupport.md +0 -14
- package/docs/_entries/options/oncanmove.md +0 -22
- package/docs/_entries/options/oncanmoveto.md +0 -22
- package/docs/_entries/options/oncanselectnode.md +0 -26
- package/docs/_entries/options/oncreateli.md +0 -22
- package/docs/_entries/options/ondragmove.md +0 -20
- package/docs/_entries/options/ondragstop.md +0 -20
- package/docs/_entries/options/onismovehandle.md +0 -17
- package/docs/_entries/options/onloadfailed.md +0 -15
- package/docs/_entries/options/onloading.md +0 -22
- package/docs/_entries/options/openedicon.md +0 -26
- package/docs/_entries/options/openfolderdelay.md +0 -15
- package/docs/_entries/options/rtl.md +0 -18
- package/docs/_entries/options/savestate.md +0 -39
- package/docs/_entries/options/selectable.md +0 -18
- package/docs/_entries/options/showemptyfolder.md +0 -26
- package/docs/_entries/options/slide.md +0 -12
- package/docs/_entries/options/start_dnd_delay.md +0 -13
- package/docs/_entries/options/tabindex.md +0 -14
- package/docs/_entries/options/usecontextmenu.md +0 -14
- package/docs/_examples/01_load_json_data.html +0 -45
- package/docs/_examples/02_load_json_data_from_server.html +0 -29
- package/docs/_examples/03_drag_and_drop.html +0 -42
- package/docs/_examples/04_save_state.html +0 -46
- package/docs/_examples/05_load_on_demand.html +0 -68
- package/docs/_examples/06_autoescape.html +0 -45
- package/docs/_examples/07_autoscroll.html +0 -42
- package/docs/_examples/08_multiple_select.html +0 -60
- package/docs/_examples/09_custom_html.html +0 -61
- package/docs/_examples/10_icon_buttons.html +0 -26
- package/docs/_examples/11_right-to-left.html +0 -25
- package/docs/_examples/12_button_on_right.html +0 -26
- package/docs/_examples/13_drag_outside.html +0 -48
- package/docs/_examples/14_filter.html +0 -111
- package/docs/_layouts/example.html +0 -7
- package/docs/_layouts/page.html +0 -26
- package/docs/documentation.css +0 -3
- package/docs/index.html +0 -65
- package/docs/package.json +0 -22
- package/docs/pnpm-lock.yaml +0 -892
- package/docs/postcss.config.js +0 -7
- package/docs/static/bower.json +0 -8
- package/docs/static/bower_components/fontawesome/css/all.min.css +0 -9
- package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
- package/docs/static/bower_components/jquery/dist/jquery.js +0 -10704
- package/docs/static/bower_components/jquery/dist/jquery.min.js +0 -2
- package/docs/static/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -1061
- package/docs/static/documentation.js +0 -26
- package/docs/static/example.postcss +0 -68
- package/docs/static/example_data.js +0 -122
- package/docs/static/examples/autoescape.js +0 -17
- package/docs/static/examples/autoscroll.js +0 -6
- package/docs/static/examples/button-on-right.js +0 -13
- package/docs/static/examples/custom_html.js +0 -27
- package/docs/static/examples/drag-outside.js +0 -37
- package/docs/static/examples/drag_and_drop.js +0 -13
- package/docs/static/examples/filter.js +0 -63
- package/docs/static/examples/icon_buttons.js +0 -12
- package/docs/static/examples/load_json_data.js +0 -16
- package/docs/static/examples/load_json_data_from_server.js +0 -9
- package/docs/static/examples/load_on_demand.js +0 -19
- package/docs/static/examples/multiple_select.js +0 -23
- package/docs/static/examples/right-to-left.js +0 -11
- package/docs/static/examples/save_state.js +0 -11
- package/docs/static/monokai.css +0 -70
- package/docs/static/spinner.gif +0 -0
- package/docs/tailwind.config.js +0 -16
- package/sitemap.txt +0 -14
- package/src/playwright/.eslintrc +0 -5
- package/src/playwright/coverage.ts +0 -38
- package/src/playwright/playwright.test.ts +0 -401
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/with-dragAndDrop-moves-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-displays-a-tree-1-Chromium-linux.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-darwin.png +0 -0
- package/src/playwright/playwright.test.ts-snapshots/without-dragAndDrop-selects-a-node-1-Chromium-linux.png +0 -0
- package/src/playwright/testUtils.ts +0 -153
- package/src/test/.eslintrc +0 -17
- package/src/test/global.d.ts +0 -1
- package/src/test/jqTree/accessibility.test.ts +0 -25
- package/src/test/jqTree/create.test.ts +0 -54
- package/src/test/jqTree/events.test.ts +0 -290
- package/src/test/jqTree/keyboard.test.ts +0 -247
- package/src/test/jqTree/loadOnDemand.test.ts +0 -198
- package/src/test/jqTree/methods.test.ts +0 -1491
- package/src/test/jqTree/mouse.test.ts +0 -82
- package/src/test/jqTree/options.test.ts +0 -595
- package/src/test/node.test.ts +0 -1396
- package/src/test/nodeUtils.test.ts +0 -21
- package/src/test/position.test.ts +0 -30
- package/src/test/support/exampleData.ts +0 -23
- package/src/test/support/jqTreeMatchers.ts +0 -68
- package/src/test/support/matchers.d.ts +0 -31
- package/src/test/support/setupTests.ts +0 -5
- package/src/test/support/testUtil.ts +0 -30
- package/src/test/support/treeStructure.ts +0 -39
- package/src/test/util.test.ts +0 -27
- 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
|
-
});
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
@@ -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
|
-
};
|
package/src/test/.eslintrc
DELETED
|
@@ -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
|
-
}
|
package/src/test/global.d.ts
DELETED
|
@@ -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
|
-
});
|