jqtree 1.6.2 → 1.7.0
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/.eslintrc +3 -12
- package/.github/workflows/ci.yml +57 -30
- package/.github/workflows/codeql-analysis.yml +9 -5
- package/.prettier +3 -0
- package/.tool-versions +1 -0
- package/README.md +12 -9
- package/bower.json +10 -3
- package/{.postcssrc → config/.postcssrc} +0 -0
- package/{babel.config.json → config/babel.config.json} +0 -0
- package/{babel.coverage.config.json → config/babel.coverage.config.json} +0 -0
- package/{jest-jsdom.config.js → config/jest.config.js} +8 -3
- package/config/playwright.config.js +18 -0
- package/config/production +4 -0
- package/{rollup.config.js → config/rollup.config.mjs} +3 -8
- package/{jqtree.postcss → css/jqtree.postcss} +0 -0
- package/devserver/index.html +1 -9
- package/docs/Gemfile +2 -0
- package/docs/Gemfile.lock +263 -0
- package/{_config.yml → docs/_config.yml} +8 -1
- package/{_entries → docs/_entries}/01_general.md +0 -0
- package/{_entries → docs/_entries}/02_introduction.md +0 -0
- package/{_entries → docs/_entries}/03_features.md +1 -1
- package/{_entries → docs/_entries}/04_demo.html +1 -7
- package/{_entries → docs/_entries}/05_requirements.md +0 -0
- package/{_entries → docs/_entries}/06_downloads.md +0 -0
- package/{_entries → docs/_entries}/07_tutorial.md +0 -0
- package/{_entries → docs/_entries}/08_examples.md +0 -0
- package/{_entries → docs/_entries}/09_usecases.md +0 -0
- package/{_entries → docs/_entries}/10_changelog.md +13 -0
- package/{_entries → docs/_entries}/11_options.md +0 -0
- package/{_entries → docs/_entries}/12_animationspeed.md +0 -0
- package/{_entries → docs/_entries}/13_autoescape.md +0 -0
- package/{_entries → docs/_entries}/14_autoopen.md +0 -0
- package/{_entries → docs/_entries}/15_buttonleft.md +0 -0
- package/{_entries → docs/_entries}/16_closedicon.md +0 -0
- package/{_entries → docs/_entries}/17_data.md +0 -0
- package/{_entries → docs/_entries}/18_datafilter.md +0 -0
- package/{_entries → docs/_entries}/19_data-url.md +0 -0
- package/{_entries → docs/_entries}/20_draganddrop.md +0 -0
- package/{_entries → docs/_entries}/21_keyboardsupport.md +0 -0
- package/{_entries → docs/_entries}/22_oncanmove.md +0 -0
- package/{_entries → docs/_entries}/23_oncanmoveto.md +2 -2
- package/{_entries → docs/_entries}/24_oncanselectnode.md +0 -0
- package/{_entries → docs/_entries}/25_oncreateli.md +2 -2
- package/{_entries → docs/_entries}/26_ondragmove.md +0 -0
- package/{_entries → docs/_entries}/27_ondragstop.md +0 -0
- package/{_entries → docs/_entries}/28_onismovehandle.md +0 -0
- package/{_entries → docs/_entries}/29_onloadfailed.md +0 -0
- package/{_entries → docs/_entries}/30_onloading.md +2 -2
- package/{_entries → docs/_entries}/31_openedicon.md +0 -0
- package/{_entries → docs/_entries}/32_openfolderdelay.md +2 -0
- package/{_entries → docs/_entries}/33_rtl.md +0 -0
- package/{_entries → docs/_entries}/34_savestate.md +0 -0
- package/{_entries → docs/_entries}/35_selectable.md +0 -0
- package/{_entries → docs/_entries}/36_showemptyfolder.md +0 -0
- package/{_entries → docs/_entries}/37_slide.md +0 -0
- package/{_entries → docs/_entries}/38_start_dnd_delay.md +0 -0
- package/{_entries → docs/_entries}/39_tabindex.md +0 -0
- package/{_entries → docs/_entries}/40_usecontextmenu.md +0 -0
- package/{_entries → docs/_entries}/41_functions.md +0 -0
- package/{_entries → docs/_entries}/42_addparentnode.md +1 -1
- package/{_entries → docs/_entries}/43_addnodeafter.md +1 -1
- package/{_entries → docs/_entries}/44_addnodebefore.md +1 -1
- package/{_entries → docs/_entries}/45_appendnode.md +5 -5
- package/{_entries → docs/_entries}/46_closenode.md +0 -0
- package/{_entries → docs/_entries}/47_destroy.md +0 -0
- package/{_entries → docs/_entries}/48_getnodebycallback.md +0 -0
- package/{_entries → docs/_entries}/49_getnodebyid.md +0 -0
- package/{_entries → docs/_entries}/50_getnodebyhtmlelement.md +2 -2
- package/{_entries → docs/_entries}/51_getselectednode.md +0 -0
- package/{_entries → docs/_entries}/52_getstate.md +0 -0
- package/{_entries → docs/_entries}/53_gettree.md +1 -1
- package/{_entries → docs/_entries}/54_isdragging.md +1 -1
- package/{_entries → docs/_entries}/55_loaddata.md +3 -3
- package/{_entries → docs/_entries}/56_loaddatafromurl.md +4 -4
- package/{_entries → docs/_entries}/57_movedown.md +0 -0
- package/{_entries → docs/_entries}/58_movenode.md +3 -3
- package/{_entries → docs/_entries}/59_moveup.md +0 -0
- package/{_entries → docs/_entries}/60_opennode.md +3 -3
- package/docs/_entries/61_prependnode.md +21 -0
- package/{_entries → docs/_entries}/62_refresh.md +0 -0
- package/{_entries → docs/_entries}/63_reload.md +2 -2
- package/{_entries → docs/_entries}/64_removenode.md +0 -0
- package/{_entries → docs/_entries}/65_selectnode.md +0 -0
- package/{_entries → docs/_entries}/66_scrolltonode.md +0 -0
- package/{_entries → docs/_entries}/67_setoption.md +0 -0
- package/{_entries → docs/_entries}/68_setstate.md +0 -0
- package/{_entries → docs/_entries}/69_toggle.md +0 -0
- package/{_entries → docs/_entries}/70_tojson.md +0 -0
- package/{_entries → docs/_entries}/71_updatenode.md +1 -1
- package/{_entries → docs/_entries}/72_events.md +0 -0
- package/{_entries → docs/_entries}/73_tree-click.md +0 -0
- package/{_entries → docs/_entries}/74_tree-close.md +0 -0
- package/{_entries → docs/_entries}/75_tree-contextmenu.md +0 -0
- package/{_entries → docs/_entries}/76_tree-dblclick.md +0 -0
- package/{_entries → docs/_entries}/77_tree-init.md +0 -0
- package/{_entries → docs/_entries}/78_tree-load-data.md +0 -0
- package/{_entries → docs/_entries}/79_tree-loading-data.md +0 -0
- package/{_entries → docs/_entries}/80_tree-move.md +0 -0
- package/{_entries → docs/_entries}/81_tree-refresh.md +0 -0
- package/{_entries → docs/_entries}/82_tree-open.md +0 -0
- package/{_entries → docs/_entries}/83_tree-select.md +0 -0
- package/{_entries → docs/_entries}/84_multiple-selection.md +0 -0
- package/{_entries → docs/_entries}/85_add-to-selection.md +0 -0
- package/{_entries → docs/_entries}/86_get-selected-nodes.md +0 -0
- package/{_entries → docs/_entries}/87_is-node-selected.md +1 -1
- package/{_entries → docs/_entries}/88_remove-from-selection.md +0 -0
- package/{_entries → docs/_entries}/89_node-functions.md +0 -0
- package/{_entries → docs/_entries}/90_children.md +0 -0
- package/{_entries → docs/_entries}/91_getdata.md +2 -2
- package/{_entries → docs/_entries}/92_getlevel.md +0 -0
- package/docs/_entries/93_getnextnode.md +15 -0
- package/{_entries → docs/_entries}/94_getnextsibling.md +0 -0
- package/{_entries/95_getpreviousnode.md → docs/_entries/95_getnextvisiblenode.md} +1 -1
- package/docs/_entries/96_getpreviousnode.md +0 -0
- package/{_entries/96_getprevioussibling.md → docs/_entries/97_getprevioussibling.md} +0 -0
- package/docs/_entries/98_getpreviousvisiblenode.md +14 -0
- package/{_entries/97_parent.md → docs/_entries/99_parent.md} +1 -1
- package/{_entries → docs/_entries}/insert.py +0 -0
- package/{_entries → docs/_entries}/renumber.py +0 -0
- package/{_examples → docs/_examples}/01_load_json_data.html +3 -5
- package/{_examples → docs/_examples}/02_load_json_data_from_server.html +3 -5
- package/{_examples → docs/_examples}/03_drag_and_drop.html +3 -5
- package/{_examples → docs/_examples}/04_save_state.html +3 -5
- package/{_examples → docs/_examples}/05_load_on_demand.html +3 -5
- package/{_examples → docs/_examples}/06_autoescape.html +3 -5
- package/{_examples → docs/_examples}/07_autoscroll.html +3 -5
- package/{_examples → docs/_examples}/08_multiple_select.html +3 -5
- package/{_examples → docs/_examples}/09_custom_html.html +3 -5
- package/{_examples → docs/_examples}/10_icon_buttons.html +3 -5
- package/{_examples → docs/_examples}/11_right-to-left.html +3 -5
- package/{_examples → docs/_examples}/12_button_on_right.html +3 -5
- package/docs/_examples/13_drag_outside.html +48 -0
- package/{_examples → docs/_examples}/14_filter.html +7 -9
- package/docs/_layouts/example.html +7 -0
- package/{_layouts/base.html → docs/_layouts/page.html} +4 -11
- package/docs/documentation.css +3 -0
- package/docs/index.html +65 -0
- package/docs/jqtree.css +189 -0
- package/docs/package.json +22 -0
- package/docs/pnpm-lock.yaml +798 -0
- package/docs/postcss.config.js +7 -0
- package/{static → docs/static}/bower.json +1 -2
- package/{static → docs/static}/bower_components/fontawesome/css/all.min.css +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/{static → docs/static}/bower_components/jquery/dist/jquery.js +209 -97
- package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -0
- package/{static → docs/static}/bower_components/jquery-mockjax/dist/jquery.mockjax.js +0 -0
- package/docs/static/documentation.css +1453 -0
- package/docs/static/documentation.js +26 -0
- package/{static → docs/static}/example.css +5 -38
- package/{static → docs/static}/example.postcss +5 -35
- package/{static → docs/static}/example_data.js +0 -0
- package/{static → docs/static}/examples/autoescape.js +0 -0
- package/{static → docs/static}/examples/autoscroll.js +0 -0
- package/{static → docs/static}/examples/button-on-right.js +0 -0
- package/{static → docs/static}/examples/custom_html.js +5 -9
- package/{static → docs/static}/examples/drag-outside.js +0 -0
- package/{static → docs/static}/examples/drag_and_drop.js +0 -0
- package/{static → docs/static}/examples/filter.js +2 -2
- package/{static → docs/static}/examples/icon_buttons.js +0 -0
- package/{static → docs/static}/examples/load_json_data.js +0 -0
- package/{static → docs/static}/examples/load_json_data_from_server.js +0 -0
- package/{static → docs/static}/examples/load_on_demand.js +0 -0
- package/{static → docs/static}/examples/multiple_select.js +0 -0
- package/{static → docs/static}/examples/right-to-left.js +0 -0
- package/{static → docs/static}/examples/save_state.js +0 -0
- package/{static → docs/static}/monokai.css +0 -0
- package/{static → docs/static}/spinner.gif +0 -0
- package/docs/tailwind.config.js +16 -0
- package/docs/tree.jquery.js +21 -0
- package/lib/dataLoader.js +5 -31
- package/lib/dragAndDropHandler.js +26 -135
- package/lib/elementsRenderer.js +29 -59
- package/lib/keyHandler.js +8 -32
- package/lib/mouse.widget.js +16 -77
- package/lib/node.js +60 -125
- package/lib/nodeElement.js +8 -75
- package/lib/playwright/coverage.js +101 -0
- package/lib/playwright/playwright.test.js +212 -182
- package/lib/playwright/testUtils.js +201 -0
- package/lib/saveStateHandler.js +12 -61
- package/lib/scrollHandler.js +17 -74
- package/lib/selectNodeHandler.js +5 -24
- package/lib/simple.widget.js +18 -53
- package/lib/test/jqTree/create.test.js +0 -4
- package/lib/test/jqTree/events.test.js +10 -16
- package/lib/test/jqTree/keyboard.test.js +0 -6
- package/lib/test/jqTree/loadOnDemand.test.js +107 -139
- package/lib/test/jqTree/methods.test.js +136 -159
- package/lib/test/jqTree/options.test.js +53 -63
- package/lib/test/node.test.js +127 -72
- package/lib/test/nodeUtil.test.js +0 -1
- package/lib/test/support/jqTreeMatchers.js +4 -9
- package/lib/test/support/setupTests.js +0 -4
- package/lib/test/support/testUtil.js +2 -11
- package/lib/test/support/treeStructure.js +0 -6
- package/lib/test/util.test.js +0 -1
- package/lib/tree.jquery.js +32 -243
- package/lib/util.js +0 -6
- package/lib/version.js +1 -1
- package/package.json +54 -54
- package/src/dragAndDropHandler.ts +8 -4
- package/src/jqtreeOptions.ts +1 -1
- package/src/keyHandler.ts +3 -3
- package/src/node.ts +43 -12
- package/src/playwright/.eslintrc +2 -2
- package/src/playwright/coverage.ts +41 -0
- package/src/playwright/playwright.test.ts +50 -52
- 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 +122 -0
- package/src/test/.eslintrc +15 -3
- package/src/test/jqTree/events.test.ts +10 -9
- package/src/test/jqTree/loadOnDemand.test.ts +10 -10
- package/src/test/jqTree/methods.test.ts +37 -45
- package/src/test/jqTree/options.test.ts +26 -28
- package/src/test/node.test.ts +146 -54
- package/src/tree.jquery.d.ts +1 -1
- package/src/tree.jquery.ts +6 -5
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +217 -867
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +3 -3
- package/tree.jquery.js.map +1 -1
- package/_entries/61_prependnode.md +0 -21
- package/_entries/93_getnextnode.md +0 -12
- package/_examples/13_drag_outside.html +0 -26
- package/_layouts/frontpage.html +0 -20
- package/_layouts/page.html +0 -7
- package/index.html +0 -48
- package/jest-browser.config.js +0 -15
- package/jest-playwright.config.js +0 -21
- package/jest.config.js +0 -8
- package/lib/playwright/testUtil.js +0 -459
- package/lib/playwright/visualRegression.js +0 -193
- package/production +0 -5
- package/src/playwright/screenshots/displays_a_tree_Desktop.png +0 -0
- package/src/playwright/screenshots/displays_a_tree_iPhone 6.png +0 -0
- package/src/playwright/screenshots/moves_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/moves_a_node_iPhone 6.png +0 -0
- package/src/playwright/screenshots/opens_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/opens_a_node_iPhone 6.png +0 -0
- package/src/playwright/screenshots/selects_a_node_Desktop.png +0 -0
- package/src/playwright/screenshots/selects_a_node_iPhone 6.png +0 -0
- package/src/playwright/testUtil.ts +0 -170
- package/src/playwright/visualRegression.ts +0 -88
- package/static/bower_components/bootstrap/dist/css/bootstrap-theme.min.css +0 -6
- package/static/bower_components/bootstrap/dist/css/bootstrap.min.css +0 -6
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.eot +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.svg +0 -288
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.ttf +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff +0 -0
- package/static/bower_components/bootstrap/dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
- package/static/bower_components/bootstrap/dist/js/bootstrap.min.js +0 -6
- package/static/bower_components/jquery/dist/jquery.min.js +0 -2
- package/static/documentation.css +0 -171
- package/static/documentation.js +0 -48
|
@@ -7,16 +7,24 @@ import { titleSpan } from "../support/testUtil";
|
|
|
7
7
|
|
|
8
8
|
const context = describe;
|
|
9
9
|
|
|
10
|
+
const server = setupServer();
|
|
11
|
+
|
|
12
|
+
beforeAll(() => server.listen());
|
|
13
|
+
|
|
10
14
|
beforeEach(() => {
|
|
11
15
|
$("body").append('<div id="tree1"></div>');
|
|
12
16
|
});
|
|
13
17
|
|
|
14
18
|
afterEach(() => {
|
|
19
|
+
server.resetHandlers();
|
|
20
|
+
|
|
15
21
|
const $tree = $("#tree1");
|
|
16
22
|
$tree.tree("destroy");
|
|
17
23
|
$tree.remove();
|
|
18
24
|
});
|
|
19
25
|
|
|
26
|
+
afterAll(() => server.close());
|
|
27
|
+
|
|
20
28
|
describe("tree.click", () => {
|
|
21
29
|
interface Vars {
|
|
22
30
|
node1: INode;
|
|
@@ -131,19 +139,12 @@ describe("tree.init", () => {
|
|
|
131
139
|
});
|
|
132
140
|
|
|
133
141
|
context("with data loaded from an url", () => {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
beforeAll(() => {
|
|
137
|
-
server = setupServer(
|
|
142
|
+
beforeEach(() => {
|
|
143
|
+
server.use(
|
|
138
144
|
rest.get("/tree/", (_request, response, ctx) =>
|
|
139
145
|
response(ctx.status(200), ctx.json(exampleData))
|
|
140
146
|
)
|
|
141
147
|
);
|
|
142
|
-
server.listen();
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
afterAll(() => {
|
|
146
|
-
server?.close();
|
|
147
148
|
});
|
|
148
149
|
|
|
149
150
|
it("is called", () =>
|
|
@@ -7,17 +7,25 @@ import { togglerLink } from "../support/testUtil";
|
|
|
7
7
|
|
|
8
8
|
const context = describe;
|
|
9
9
|
|
|
10
|
+
const server = setupServer();
|
|
11
|
+
|
|
12
|
+
beforeAll(() => server.listen());
|
|
13
|
+
|
|
10
14
|
beforeEach(() => {
|
|
11
15
|
$("body").append('<div id="tree1"></div>');
|
|
12
16
|
});
|
|
13
17
|
|
|
14
18
|
afterEach(() => {
|
|
19
|
+
server.resetHandlers();
|
|
20
|
+
|
|
15
21
|
const $tree = $("#tree1");
|
|
16
22
|
$tree.tree("destroy");
|
|
17
23
|
$tree.remove();
|
|
18
24
|
localStorage.clear();
|
|
19
25
|
});
|
|
20
26
|
|
|
27
|
+
afterAll(() => server.close());
|
|
28
|
+
|
|
21
29
|
context("when a node has load_on_demand in the data", () => {
|
|
22
30
|
interface Vars {
|
|
23
31
|
autoOpen: boolean;
|
|
@@ -37,10 +45,8 @@ context("when a node has load_on_demand in the data", () => {
|
|
|
37
45
|
},
|
|
38
46
|
];
|
|
39
47
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
beforeAll(() => {
|
|
43
|
-
server = setupServer(
|
|
48
|
+
beforeEach(() => {
|
|
49
|
+
server.use(
|
|
44
50
|
rest.get("/tree/", (request, response, ctx) => {
|
|
45
51
|
const parentId = request.url.searchParams.get("node");
|
|
46
52
|
|
|
@@ -54,12 +60,6 @@ context("when a node has load_on_demand in the data", () => {
|
|
|
54
60
|
}
|
|
55
61
|
})
|
|
56
62
|
);
|
|
57
|
-
|
|
58
|
-
server.listen();
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
afterAll(() => {
|
|
62
|
-
server?.close();
|
|
63
63
|
});
|
|
64
64
|
|
|
65
65
|
beforeEach(() => {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import getGiven from "givens";
|
|
2
|
-
import { screen } from "@testing-library/dom";
|
|
2
|
+
import { screen, waitFor } from "@testing-library/dom";
|
|
3
3
|
import { rest } from "msw";
|
|
4
4
|
import { setupServer } from "msw/node";
|
|
5
5
|
import "../../tree.jquery";
|
|
@@ -9,17 +9,25 @@ import __version__ from "../../version";
|
|
|
9
9
|
|
|
10
10
|
const context = describe;
|
|
11
11
|
|
|
12
|
+
const server = setupServer();
|
|
13
|
+
|
|
14
|
+
beforeAll(() => server.listen());
|
|
15
|
+
|
|
12
16
|
beforeEach(() => {
|
|
13
17
|
$("body").append('<div id="tree1"></div>');
|
|
14
18
|
});
|
|
15
19
|
|
|
16
20
|
afterEach(() => {
|
|
21
|
+
server.resetHandlers();
|
|
22
|
+
|
|
17
23
|
const $tree = $("#tree1");
|
|
18
24
|
$tree.tree("destroy");
|
|
19
25
|
$tree.remove();
|
|
20
26
|
localStorage.clear();
|
|
21
27
|
});
|
|
22
28
|
|
|
29
|
+
afterAll(() => server.close());
|
|
30
|
+
|
|
23
31
|
describe("addNodeAfter", () => {
|
|
24
32
|
interface Vars {
|
|
25
33
|
node: INode;
|
|
@@ -739,22 +747,13 @@ describe("loadDataFromUrl", () => {
|
|
|
739
747
|
given("serverData", () => exampleData);
|
|
740
748
|
given("$tree", () => $("#tree1"));
|
|
741
749
|
|
|
742
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
return response(ctx.status(200), ctx.json(given.serverData));
|
|
748
|
-
})
|
|
750
|
+
beforeEach(() => {
|
|
751
|
+
server.use(
|
|
752
|
+
rest.get("/tree/", (_request, response, ctx) =>
|
|
753
|
+
response(ctx.status(200), ctx.json(given.serverData))
|
|
754
|
+
)
|
|
749
755
|
);
|
|
750
|
-
server.listen();
|
|
751
|
-
});
|
|
752
|
-
|
|
753
|
-
afterAll(() => {
|
|
754
|
-
server?.close();
|
|
755
|
-
});
|
|
756
756
|
|
|
757
|
-
beforeEach(() => {
|
|
758
757
|
given.$tree.tree({ data: given.initialData });
|
|
759
758
|
});
|
|
760
759
|
|
|
@@ -909,12 +908,15 @@ describe("openNode", () => {
|
|
|
909
908
|
});
|
|
910
909
|
|
|
911
910
|
context("with onFinished parameter", () => {
|
|
912
|
-
it("calls the function", () =>
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
)
|
|
911
|
+
it("calls the function", async () => {
|
|
912
|
+
const onFinished = jest.fn();
|
|
913
|
+
|
|
914
|
+
given.$tree.tree("openNode", given.node1, onFinished);
|
|
915
|
+
|
|
916
|
+
await waitFor(() => {
|
|
917
|
+
expect(onFinished).toHaveBeenCalledWith(given.node1);
|
|
918
|
+
});
|
|
919
|
+
});
|
|
918
920
|
});
|
|
919
921
|
});
|
|
920
922
|
|
|
@@ -1008,23 +1010,14 @@ describe("reload", () => {
|
|
|
1008
1010
|
given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
|
|
1009
1011
|
given("$tree", () => $("#tree1"));
|
|
1010
1012
|
|
|
1011
|
-
|
|
1012
|
-
|
|
1013
|
-
|
|
1014
|
-
server = setupServer(
|
|
1015
|
-
rest.get("/tree/", (_request, response, ctx) =>
|
|
1013
|
+
beforeEach(async () => {
|
|
1014
|
+
server.use(
|
|
1015
|
+
rest.get("/tree2/", (_request, response, ctx) =>
|
|
1016
1016
|
response(ctx.status(200), ctx.json(exampleData))
|
|
1017
1017
|
)
|
|
1018
1018
|
);
|
|
1019
|
-
server.listen();
|
|
1020
|
-
});
|
|
1021
|
-
|
|
1022
|
-
afterAll(() => {
|
|
1023
|
-
server?.close();
|
|
1024
|
-
});
|
|
1025
1019
|
|
|
1026
|
-
|
|
1027
|
-
given.$tree.tree({ dataUrl: "/tree/" });
|
|
1020
|
+
given.$tree.tree({ dataUrl: "/tree2/" });
|
|
1028
1021
|
await screen.findByText("node1");
|
|
1029
1022
|
|
|
1030
1023
|
given.$tree.tree("removeNode", given.node1);
|
|
@@ -1045,19 +1038,18 @@ describe("reload", () => {
|
|
|
1045
1038
|
});
|
|
1046
1039
|
|
|
1047
1040
|
context("with a onFinished parameter", () => {
|
|
1048
|
-
it("calls onFinished", () =>
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
expect.objectContaining({ name: "node1" }),
|
|
1053
|
-
expect.objectContaining({ name: "node2" }),
|
|
1054
|
-
]);
|
|
1041
|
+
it("calls onFinished", async () => {
|
|
1042
|
+
const handleFinished = jest.fn();
|
|
1043
|
+
|
|
1044
|
+
given.$tree.tree("reload", handleFinished);
|
|
1055
1045
|
|
|
1056
|
-
|
|
1057
|
-
};
|
|
1046
|
+
await waitFor(() => expect(handleFinished).toHaveBeenCalledWith());
|
|
1058
1047
|
|
|
1059
|
-
|
|
1060
|
-
|
|
1048
|
+
expect(given.$tree).toHaveTreeStructure([
|
|
1049
|
+
expect.objectContaining({ name: "node1" }),
|
|
1050
|
+
expect.objectContaining({ name: "node2" }),
|
|
1051
|
+
]);
|
|
1052
|
+
});
|
|
1061
1053
|
});
|
|
1062
1054
|
});
|
|
1063
1055
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import getGiven from "givens";
|
|
2
|
-
import { screen } from "@testing-library/dom";
|
|
2
|
+
import { screen, waitFor } from "@testing-library/dom";
|
|
3
3
|
import { rest } from "msw";
|
|
4
4
|
import { setupServer } from "msw/node";
|
|
5
5
|
import "../../tree.jquery";
|
|
@@ -8,17 +8,25 @@ import { titleSpan, togglerLink } from "../support/testUtil";
|
|
|
8
8
|
|
|
9
9
|
const context = describe;
|
|
10
10
|
|
|
11
|
+
const server = setupServer();
|
|
12
|
+
|
|
13
|
+
beforeAll(() => server.listen());
|
|
14
|
+
|
|
11
15
|
beforeEach(() => {
|
|
12
16
|
$("body").append('<div id="tree1"></div>');
|
|
13
17
|
});
|
|
14
18
|
|
|
15
19
|
afterEach(() => {
|
|
20
|
+
server.resetHandlers();
|
|
21
|
+
|
|
16
22
|
const $tree = $("#tree1");
|
|
17
23
|
$tree.tree("destroy");
|
|
18
24
|
$tree.remove();
|
|
19
25
|
localStorage.clear();
|
|
20
26
|
});
|
|
21
27
|
|
|
28
|
+
afterAll(() => server.close());
|
|
29
|
+
|
|
22
30
|
describe("autoEscape", () => {
|
|
23
31
|
interface Vars {
|
|
24
32
|
autoEscape: boolean;
|
|
@@ -186,10 +194,8 @@ describe("dataUrl", () => {
|
|
|
186
194
|
},
|
|
187
195
|
];
|
|
188
196
|
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
beforeAll(() => {
|
|
192
|
-
server = setupServer(
|
|
197
|
+
beforeEach(() => {
|
|
198
|
+
server.use(
|
|
193
199
|
rest.get("/tree/", (request, response, ctx) => {
|
|
194
200
|
const nodeName = request.headers.get("node");
|
|
195
201
|
const data = nodeName ? [nodeName] : exampleData;
|
|
@@ -197,11 +203,6 @@ describe("dataUrl", () => {
|
|
|
197
203
|
return response(ctx.status(200), ctx.json(data));
|
|
198
204
|
})
|
|
199
205
|
);
|
|
200
|
-
server.listen();
|
|
201
|
-
});
|
|
202
|
-
|
|
203
|
-
afterAll(() => {
|
|
204
|
-
server?.close();
|
|
205
206
|
});
|
|
206
207
|
|
|
207
208
|
interface Vars {
|
|
@@ -347,31 +348,28 @@ describe("onLoadFailed", () => {
|
|
|
347
348
|
given("$tree", () => $("#tree1"));
|
|
348
349
|
|
|
349
350
|
context("when the loading fails", () => {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
beforeAll(() => {
|
|
353
|
-
server = setupServer(
|
|
351
|
+
beforeEach(() => {
|
|
352
|
+
server.use(
|
|
354
353
|
rest.get("/tree/", (_request, response, ctx) =>
|
|
355
354
|
response(ctx.status(500), ctx.body("Internal server error"))
|
|
356
355
|
)
|
|
357
356
|
);
|
|
358
|
-
server.listen();
|
|
359
357
|
});
|
|
360
358
|
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
359
|
+
it("calls onLoadFailed", async () => {
|
|
360
|
+
const onLoadFailed = jest.fn();
|
|
361
|
+
|
|
362
|
+
given.$tree.tree({
|
|
363
|
+
dataUrl: "/tree/",
|
|
364
|
+
onLoadFailed,
|
|
365
|
+
});
|
|
364
366
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
done();
|
|
372
|
-
},
|
|
373
|
-
});
|
|
374
|
-
}));
|
|
367
|
+
await waitFor(() => {
|
|
368
|
+
expect(onLoadFailed).toHaveBeenCalledWith(
|
|
369
|
+
expect.objectContaining({ status: 500 })
|
|
370
|
+
);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
375
373
|
});
|
|
376
374
|
});
|
|
377
375
|
|
package/src/test/node.test.ts
CHANGED
|
@@ -568,52 +568,47 @@ describe("getLastChild", () => {
|
|
|
568
568
|
|
|
569
569
|
describe("getNextNode", () => {
|
|
570
570
|
interface Vars {
|
|
571
|
-
includeChildren: boolean;
|
|
572
571
|
fromNode: Node;
|
|
573
|
-
nextNode: Node | null;
|
|
574
572
|
tree: Node;
|
|
575
573
|
}
|
|
576
574
|
const given = getGiven<Vars>();
|
|
577
575
|
given("tree", () => new Node().loadFromData(exampleData));
|
|
578
|
-
given("nextNode", () => given.fromNode.getNextNode(given.includeChildren));
|
|
579
576
|
|
|
580
|
-
context("with
|
|
581
|
-
given("
|
|
577
|
+
context("with a parent node", () => {
|
|
578
|
+
given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
|
|
582
579
|
|
|
583
|
-
context("
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
it("returns the next sibling", () => {
|
|
588
|
-
expect(given.nextNode).toMatchObject({ name: "node2" });
|
|
580
|
+
context("when the parent node is closed", () => {
|
|
581
|
+
it("returns the first child", () => {
|
|
582
|
+
expect(given.fromNode.getNextNode()).toMatchObject({
|
|
583
|
+
name: "child1",
|
|
589
584
|
});
|
|
590
585
|
});
|
|
586
|
+
});
|
|
591
587
|
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
588
|
+
context("when the parent node is open", () => {
|
|
589
|
+
beforeEach(() => {
|
|
590
|
+
given.fromNode.is_open = true;
|
|
591
|
+
});
|
|
596
592
|
|
|
597
|
-
|
|
598
|
-
|
|
593
|
+
it("returns the first child", () => {
|
|
594
|
+
expect(given.fromNode.getNextNode()).toMatchObject({
|
|
595
|
+
name: "child1",
|
|
599
596
|
});
|
|
600
597
|
});
|
|
601
598
|
});
|
|
599
|
+
});
|
|
602
600
|
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
given.tree.getNodeByNameMustExist("child2")
|
|
606
|
-
);
|
|
601
|
+
context("with the node is the last child", () => {
|
|
602
|
+
given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
|
|
607
603
|
|
|
608
|
-
|
|
609
|
-
|
|
604
|
+
it("returns the next sibling of the parent", () => {
|
|
605
|
+
expect(given.fromNode.getNextNode()).toMatchObject({
|
|
606
|
+
name: "node2",
|
|
610
607
|
});
|
|
611
608
|
});
|
|
612
609
|
});
|
|
613
610
|
|
|
614
611
|
context("with includeChildren is false", () => {
|
|
615
|
-
given("includeChildren", () => false);
|
|
616
|
-
|
|
617
612
|
context("with an open parent node", () => {
|
|
618
613
|
given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
|
|
619
614
|
|
|
@@ -622,10 +617,63 @@ describe("getNextNode", () => {
|
|
|
622
617
|
});
|
|
623
618
|
|
|
624
619
|
it("returns the next sibling", () => {
|
|
625
|
-
expect(given.
|
|
620
|
+
expect(given.fromNode.getNextNode(false)).toMatchObject({
|
|
621
|
+
name: "node2",
|
|
622
|
+
});
|
|
623
|
+
});
|
|
624
|
+
});
|
|
625
|
+
});
|
|
626
|
+
});
|
|
627
|
+
|
|
628
|
+
describe("getNextVisibleNode", () => {
|
|
629
|
+
interface Vars {
|
|
630
|
+
fromNode: Node;
|
|
631
|
+
tree: Node;
|
|
632
|
+
}
|
|
633
|
+
const given = getGiven<Vars>();
|
|
634
|
+
given("tree", () => new Node().loadFromData(exampleData));
|
|
635
|
+
|
|
636
|
+
context("with a parent node", () => {
|
|
637
|
+
given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
|
|
638
|
+
|
|
639
|
+
context("when the parent node is closed", () => {
|
|
640
|
+
it("returns the next sibling", () => {
|
|
641
|
+
expect(given.fromNode.getNextVisibleNode()).toMatchObject({
|
|
642
|
+
name: "node2",
|
|
643
|
+
});
|
|
644
|
+
});
|
|
645
|
+
});
|
|
646
|
+
|
|
647
|
+
context("when the parent node is open", () => {
|
|
648
|
+
beforeEach(() => {
|
|
649
|
+
given.fromNode.is_open = true;
|
|
650
|
+
});
|
|
651
|
+
|
|
652
|
+
it("returns the first child", () => {
|
|
653
|
+
expect(given.fromNode.getNextVisibleNode()).toMatchObject({
|
|
654
|
+
name: "child1",
|
|
655
|
+
});
|
|
626
656
|
});
|
|
627
657
|
});
|
|
628
658
|
});
|
|
659
|
+
|
|
660
|
+
context("with the node is the last child", () => {
|
|
661
|
+
given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
|
|
662
|
+
|
|
663
|
+
it("returns the next sibling of the parent", () => {
|
|
664
|
+
expect(given.fromNode.getNextVisibleNode()).toMatchObject({
|
|
665
|
+
name: "node2",
|
|
666
|
+
});
|
|
667
|
+
});
|
|
668
|
+
});
|
|
669
|
+
|
|
670
|
+
context("with the tree node", () => {
|
|
671
|
+
given("fromNode", () => given.tree);
|
|
672
|
+
|
|
673
|
+
it("returns null", () => {
|
|
674
|
+
expect(given.fromNode.getNextVisibleNode()).toBeNull();
|
|
675
|
+
});
|
|
676
|
+
});
|
|
629
677
|
});
|
|
630
678
|
|
|
631
679
|
describe("getNextSibling", () => {
|
|
@@ -766,48 +814,92 @@ describe("getParent", () => {
|
|
|
766
814
|
|
|
767
815
|
describe("getPreviousNode", () => {
|
|
768
816
|
interface Vars {
|
|
769
|
-
node2: Node;
|
|
770
|
-
node3: Node;
|
|
771
817
|
tree: Node;
|
|
772
818
|
}
|
|
773
819
|
const given = getGiven<Vars>();
|
|
774
|
-
given("node2", () => given.tree.getNodeByNameMustExist("node2"));
|
|
775
|
-
given("node3", () => given.tree.getNodeByNameMustExist("node3"));
|
|
776
820
|
given("tree", () => new Node().loadFromData(exampleData));
|
|
777
821
|
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
822
|
+
it("returns null with a tree node", () => {
|
|
823
|
+
expect(given.tree.getPreviousNode()).toBeNull();
|
|
824
|
+
});
|
|
825
|
+
|
|
826
|
+
it("returns the last child of the previous sibling when the previous node is closed and has children", () => {
|
|
827
|
+
given.tree.getNodeByNameMustExist("node2").is_open = false;
|
|
828
|
+
const node2 = given.tree.getNodeByNameMustExist("node2");
|
|
829
|
+
|
|
830
|
+
expect(node2.getPreviousNode()).toMatchObject({
|
|
831
|
+
name: "child2",
|
|
781
832
|
});
|
|
782
833
|
});
|
|
783
834
|
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
});
|
|
835
|
+
it("returns the last child of the previous sibling when the previous node is open and has children", () => {
|
|
836
|
+
given.tree.getNodeByNameMustExist("node2").is_open = true;
|
|
837
|
+
const node2 = given.tree.getNodeByNameMustExist("node2");
|
|
838
|
+
|
|
839
|
+
expect(node2.getPreviousNode()).toMatchObject({
|
|
840
|
+
name: "child2",
|
|
791
841
|
});
|
|
842
|
+
});
|
|
792
843
|
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
given.tree.getNodeByNameMustExist("node1").is_open = true;
|
|
796
|
-
});
|
|
844
|
+
it("returns the first child if a node is the second child", () => {
|
|
845
|
+
const child2 = given.tree.getNodeByNameMustExist("child2");
|
|
797
846
|
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
name: "child2",
|
|
801
|
-
});
|
|
802
|
-
});
|
|
847
|
+
expect(child2.getPreviousNode()).toMatchObject({
|
|
848
|
+
name: "child1",
|
|
803
849
|
});
|
|
804
850
|
});
|
|
805
851
|
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
852
|
+
it("returns the parent with a node that is the first child", () => {
|
|
853
|
+
const node3 = given.tree.getNodeByNameMustExist("node3");
|
|
854
|
+
|
|
855
|
+
expect(node3.getPreviousNode()).toMatchObject({
|
|
856
|
+
name: "node2",
|
|
857
|
+
});
|
|
858
|
+
});
|
|
859
|
+
});
|
|
860
|
+
|
|
861
|
+
describe("getPreviousVisibleNode", () => {
|
|
862
|
+
interface Vars {
|
|
863
|
+
tree: Node;
|
|
864
|
+
}
|
|
865
|
+
const given = getGiven<Vars>();
|
|
866
|
+
given("tree", () => new Node().loadFromData(exampleData));
|
|
867
|
+
|
|
868
|
+
it("returns null with a tree node", () => {
|
|
869
|
+
expect(given.tree.getPreviousVisibleNode()).toBeNull();
|
|
870
|
+
});
|
|
871
|
+
|
|
872
|
+
it("returns the previous sibling when the previous sibling is closed and has children", () => {
|
|
873
|
+
given.tree.getNodeByNameMustExist("node2").is_open = false;
|
|
874
|
+
const node2 = given.tree.getNodeByNameMustExist("node2");
|
|
875
|
+
|
|
876
|
+
expect(node2.getPreviousVisibleNode()).toMatchObject({
|
|
877
|
+
name: "node1",
|
|
878
|
+
});
|
|
879
|
+
});
|
|
880
|
+
|
|
881
|
+
it("returns the last child of the previous sibling when the previous sibling is open and has children", () => {
|
|
882
|
+
given.tree.getNodeByNameMustExist("node1").is_open = true;
|
|
883
|
+
const node2 = given.tree.getNodeByNameMustExist("node2");
|
|
884
|
+
|
|
885
|
+
expect(node2.getPreviousVisibleNode()).toMatchObject({
|
|
886
|
+
name: "child2",
|
|
887
|
+
});
|
|
888
|
+
});
|
|
889
|
+
|
|
890
|
+
it("returns the first child if a node is the second child", () => {
|
|
891
|
+
const child2 = given.tree.getNodeByNameMustExist("child2");
|
|
892
|
+
|
|
893
|
+
expect(child2.getPreviousVisibleNode()).toMatchObject({
|
|
894
|
+
name: "child1",
|
|
895
|
+
});
|
|
896
|
+
});
|
|
897
|
+
|
|
898
|
+
it("returns the parent when a node is the first child", () => {
|
|
899
|
+
const node3 = given.tree.getNodeByNameMustExist("node3");
|
|
900
|
+
|
|
901
|
+
expect(node3.getPreviousVisibleNode()).toMatchObject({
|
|
902
|
+
name: "node2",
|
|
811
903
|
});
|
|
812
904
|
});
|
|
813
905
|
});
|
package/src/tree.jquery.d.ts
CHANGED
|
@@ -62,7 +62,7 @@ interface IJQTreeOptions {
|
|
|
62
62
|
onGetStateFromStorage?: () => string;
|
|
63
63
|
onSetStateFromStorage?: (data: string) => void;
|
|
64
64
|
openedIcon?: string | Element;
|
|
65
|
-
openFolderDelay?: number;
|
|
65
|
+
openFolderDelay?: number | false;
|
|
66
66
|
rtl?: boolean;
|
|
67
67
|
selectable?: boolean;
|
|
68
68
|
saveState?: boolean | string;
|
package/src/tree.jquery.ts
CHANGED
|
@@ -1118,11 +1118,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1118
1118
|
}
|
|
1119
1119
|
|
|
1120
1120
|
private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {
|
|
1121
|
-
if (
|
|
1122
|
-
return;
|
|
1123
|
-
} else {
|
|
1124
|
-
this._triggerEvent("tree.load_data", { tree_data: data });
|
|
1125
|
-
|
|
1121
|
+
if (data) {
|
|
1126
1122
|
if (parentNode) {
|
|
1127
1123
|
this.deselectNodes(parentNode);
|
|
1128
1124
|
this.loadSubtree(data, parentNode);
|
|
@@ -1134,6 +1130,11 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1134
1130
|
this.dndHandler.refresh();
|
|
1135
1131
|
}
|
|
1136
1132
|
}
|
|
1133
|
+
|
|
1134
|
+
this._triggerEvent("tree.load_data", {
|
|
1135
|
+
tree_data: data,
|
|
1136
|
+
parent_node: parentNode,
|
|
1137
|
+
});
|
|
1137
1138
|
}
|
|
1138
1139
|
|
|
1139
1140
|
private deselectNodes(parentNode: Node): void {
|
package/src/version.ts
CHANGED