jqtree 1.6.0 → 1.6.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/.eslintrc +3 -11
- package/.github/workflows/ci.yml +48 -23
- package/.github/workflows/codeql-analysis.yml +9 -5
- package/.prettier +3 -0
- package/README.md +11 -8
- package/bower.json +1 -1
- package/{.postcssrc → config/.postcssrc} +0 -0
- package/config/babel.config.json +11 -0
- package/config/babel.coverage.config.json +4 -0
- package/{jest-jsdom.config.js → config/jest.config.js} +9 -5
- package/config/playwright.config.js +18 -0
- package/config/production +4 -0
- package/{rollup.config.js → config/rollup.config.js} +19 -14
- package/{jqtree.postcss → css/jqtree.postcss} +3 -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 +14 -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/docs/_entries/62_refresh.md +12 -0
- package/{_entries/62_reload.md → docs/_entries/63_reload.md} +2 -2
- package/{_entries/63_removenode.md → docs/_entries/64_removenode.md} +0 -0
- package/{_entries/64_selectnode.md → docs/_entries/65_selectnode.md} +0 -0
- package/{_entries/65_scrolltonode.md → docs/_entries/66_scrolltonode.md} +0 -0
- package/{_entries/66_setoption.md → docs/_entries/67_setoption.md} +0 -0
- package/{_entries/67_setstate.md → docs/_entries/68_setstate.md} +0 -0
- package/{_entries/68_toggle.md → docs/_entries/69_toggle.md} +0 -0
- package/{_entries/69_tojson.md → docs/_entries/70_tojson.md} +0 -0
- package/{_entries/70_updatenode.md → docs/_entries/71_updatenode.md} +1 -1
- package/{_entries/71_events.md → docs/_entries/72_events.md} +0 -0
- package/{_entries/72_tree-click.md → docs/_entries/73_tree-click.md} +0 -0
- package/{_entries/73_tree-close.md → docs/_entries/74_tree-close.md} +0 -0
- package/{_entries/74_tree-contextmenu.md → docs/_entries/75_tree-contextmenu.md} +0 -0
- package/{_entries/75_tree-dblclick.md → docs/_entries/76_tree-dblclick.md} +0 -0
- package/{_entries/76_tree-init.md → docs/_entries/77_tree-init.md} +0 -0
- package/{_entries/77_tree-load-data.md → docs/_entries/78_tree-load-data.md} +0 -0
- package/{_entries/78_tree-loading-data.md → docs/_entries/79_tree-loading-data.md} +0 -0
- package/{_entries/79_tree-move.md → docs/_entries/80_tree-move.md} +0 -0
- package/{_entries/80_tree-refresh.md → docs/_entries/81_tree-refresh.md} +0 -0
- package/{_entries/81_tree-open.md → docs/_entries/82_tree-open.md} +0 -0
- package/{_entries/82_tree-select.md → docs/_entries/83_tree-select.md} +0 -0
- package/{_entries/83_multiple-selection.md → docs/_entries/84_multiple-selection.md} +0 -0
- package/{_entries/84_add-to-selection.md → docs/_entries/85_add-to-selection.md} +0 -0
- package/{_entries/85_get-selected-nodes.md → docs/_entries/86_get-selected-nodes.md} +0 -0
- package/{_entries/86_is-node-selected.md → docs/_entries/87_is-node-selected.md} +1 -1
- package/{_entries/87_remove-from-selection.md → docs/_entries/88_remove-from-selection.md} +0 -0
- package/{_entries/88_node-functions.md → docs/_entries/89_node-functions.md} +0 -0
- package/{_entries/89_children.md → docs/_entries/90_children.md} +0 -0
- package/{_entries/90_getdata.md → docs/_entries/91_getdata.md} +2 -2
- package/{_entries/91_getlevel.md → docs/_entries/92_getlevel.md} +0 -0
- package/{_entries/92_getnextnode.md → docs/_entries/93_getnextnode.md} +0 -0
- package/{_entries/93_getnextsibling.md → docs/_entries/94_getnextsibling.md} +0 -0
- package/{_entries/94_getpreviousnode.md → docs/_entries/95_getpreviousnode.md} +0 -0
- package/{_entries/95_getprevioussibling.md → docs/_entries/96_getprevioussibling.md} +0 -0
- package/{_entries/96_parent.md → docs/_entries/97_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/docs/_examples/14_filter.html +111 -0
- package/docs/_layouts/example.html +7 -0
- package/docs/_layouts/page.html +26 -0
- 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 +768 -0
- package/docs/postcss.config.js +7 -0
- package/docs/static/bower.json +8 -0
- package/docs/static/bower_components/fontawesome/css/all.min.css +5 -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 +774 -627
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
- package/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 +93 -95
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
- package/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 +1164 -1074
- package/{static → docs/static}/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
- package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/{static → docs/static}/bower_components/jquery/dist/jquery.js +118 -109
- package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -0
- package/{static → docs/static}/bower_components/jquery-mockjax/dist/jquery.mockjax.js +15 -9
- package/docs/static/documentation.css +1313 -0
- package/docs/static/documentation.js +26 -0
- package/{static → docs/static}/example.css +14 -33
- package/{static → docs/static}/example.postcss +15 -32
- package/{static → docs/static}/example_data.js +33 -36
- 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/docs/static/examples/filter.js +63 -0
- 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/jqtree.css +4 -1
- package/lib/dataLoader.js +146 -98
- package/lib/dragAndDropHandler.js +672 -470
- package/lib/elementsRenderer.js +282 -197
- package/lib/jqtreeOptions.js +1 -2
- package/lib/keyHandler.js +134 -87
- package/lib/mouse.widget.js +285 -184
- package/lib/node.js +691 -505
- package/lib/nodeElement.js +329 -205
- package/lib/playwright/coverage.js +140 -0
- package/lib/playwright/playwright.test.js +298 -179
- package/lib/playwright/testUtils.js +267 -0
- package/lib/saveStateHandler.js +311 -204
- package/lib/scrollHandler.js +293 -199
- package/lib/selectNodeHandler.js +140 -100
- package/lib/simple.widget.js +184 -109
- package/lib/test/global.d.js +3 -0
- package/lib/test/jqTree/create.test.js +44 -40
- package/lib/test/jqTree/events.test.js +186 -138
- package/lib/test/jqTree/keyboard.test.js +216 -199
- package/lib/test/jqTree/loadOnDemand.test.js +238 -157
- package/lib/test/jqTree/methods.test.js +1289 -1019
- package/lib/test/jqTree/options.test.js +491 -410
- package/lib/test/node.test.js +1036 -873
- package/lib/test/nodeUtil.test.js +21 -20
- package/lib/test/support/exampleData.js +35 -23
- package/lib/test/support/jqTreeMatchers.js +72 -54
- package/lib/test/support/matchers.d.js +1 -0
- package/lib/test/support/setupTests.js +9 -3
- package/lib/test/support/testUtil.js +35 -15
- package/lib/test/support/treeStructure.js +41 -32
- package/lib/test/util.test.js +21 -20
- package/lib/tree.jquery.d.js +1 -0
- package/lib/tree.jquery.js +1264 -886
- package/lib/types.js +1 -2
- package/lib/typings.d.js +2 -0
- package/lib/util.js +19 -8
- package/lib/version.js +8 -3
- package/package.json +54 -47
- package/src/dataLoader.ts +6 -6
- package/src/dragAndDropHandler.ts +8 -8
- package/src/elementsRenderer.ts +4 -0
- package/src/jqtreeOptions.ts +2 -2
- package/src/mouse.widget.ts +19 -15
- package/src/node.ts +27 -41
- package/src/nodeElement.ts +17 -9
- package/src/playwright/.eslintrc +5 -0
- package/src/playwright/coverage.ts +41 -0
- package/src/playwright/playwright.test.ts +75 -77
- 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/saveStateHandler.ts +11 -6
- package/src/selectNodeHandler.ts +1 -1
- package/src/simple.widget.ts +1 -1
- package/src/test/.eslintrc +14 -0
- package/src/test/jqTree/create.test.ts +0 -1
- package/src/test/jqTree/events.test.ts +10 -10
- package/src/test/jqTree/keyboard.test.ts +0 -1
- package/src/test/jqTree/loadOnDemand.test.ts +56 -11
- package/src/test/jqTree/methods.test.ts +72 -55
- package/src/test/jqTree/options.test.ts +30 -33
- package/src/test/node.test.ts +2 -2
- package/src/test/support/jqTreeMatchers.ts +8 -9
- package/src/test/support/matchers.d.ts +2 -4
- package/src/test/support/setupTests.ts +2 -1
- package/src/tree.jquery.d.ts +19 -13
- package/src/tree.jquery.ts +35 -28
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +4810 -3325
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +3 -3
- package/tree.jquery.js.map +1 -1
- package/tsconfig.json +1 -0
- package/_entries/61_prependnode.md +0 -21
- package/_examples/13_drag_outside.html +0 -25
- package/_layouts/base.html +0 -55
- package/_layouts/frontpage.html +0 -20
- package/_layouts/page.html +0 -7
- package/index.html +0 -48
- package/jest-browser.config.js +0 -18
- package/jest-playwright.config.js +0 -21
- package/jest.config.js +0 -8
- package/lib/playwright/testUtil.js +0 -223
- package/lib/playwright/visualRegression.js +0 -128
- 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 -171
- package/src/playwright/visualRegression.ts +0 -88
- package/static/bower.json +0 -9
- 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/fontawesome/css/all.min.css +0 -5
- package/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
- package/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
- package/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
- package/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
- package/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
- package/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
- package/static/bower_components/jquery/dist/jquery.min.js +0 -2
- package/static/documentation.css +0 -171
- package/static/documentation.js +0 -48
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as $ from "jquery";
|
|
2
1
|
import getGiven from "givens";
|
|
3
|
-
import { screen } from "@testing-library/dom";
|
|
2
|
+
import { screen, waitFor } from "@testing-library/dom";
|
|
4
3
|
import { rest } from "msw";
|
|
5
4
|
import { setupServer } from "msw/node";
|
|
6
5
|
import "../../tree.jquery";
|
|
@@ -10,17 +9,25 @@ import __version__ from "../../version";
|
|
|
10
9
|
|
|
11
10
|
const context = describe;
|
|
12
11
|
|
|
12
|
+
const server = setupServer();
|
|
13
|
+
|
|
14
|
+
beforeAll(() => server.listen());
|
|
15
|
+
|
|
13
16
|
beforeEach(() => {
|
|
14
17
|
$("body").append('<div id="tree1"></div>');
|
|
15
18
|
});
|
|
16
19
|
|
|
17
20
|
afterEach(() => {
|
|
21
|
+
server.resetHandlers();
|
|
22
|
+
|
|
18
23
|
const $tree = $("#tree1");
|
|
19
24
|
$tree.tree("destroy");
|
|
20
25
|
$tree.remove();
|
|
21
26
|
localStorage.clear();
|
|
22
27
|
});
|
|
23
28
|
|
|
29
|
+
afterAll(() => server.close());
|
|
30
|
+
|
|
24
31
|
describe("addNodeAfter", () => {
|
|
25
32
|
interface Vars {
|
|
26
33
|
node: INode;
|
|
@@ -740,22 +747,13 @@ describe("loadDataFromUrl", () => {
|
|
|
740
747
|
given("serverData", () => exampleData);
|
|
741
748
|
given("$tree", () => $("#tree1"));
|
|
742
749
|
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
return response(ctx.status(200), ctx.json(given.serverData));
|
|
749
|
-
})
|
|
750
|
+
beforeEach(() => {
|
|
751
|
+
server.use(
|
|
752
|
+
rest.get("/tree/", (_request, response, ctx) =>
|
|
753
|
+
response(ctx.status(200), ctx.json(given.serverData))
|
|
754
|
+
)
|
|
750
755
|
);
|
|
751
|
-
server.listen();
|
|
752
|
-
});
|
|
753
|
-
|
|
754
|
-
afterAll(() => {
|
|
755
|
-
server?.close();
|
|
756
|
-
});
|
|
757
756
|
|
|
758
|
-
beforeEach(() => {
|
|
759
757
|
given.$tree.tree({ data: given.initialData });
|
|
760
758
|
});
|
|
761
759
|
|
|
@@ -910,12 +908,15 @@ describe("openNode", () => {
|
|
|
910
908
|
});
|
|
911
909
|
|
|
912
910
|
context("with onFinished parameter", () => {
|
|
913
|
-
it("calls the function", () =>
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
)
|
|
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
|
+
});
|
|
919
920
|
});
|
|
920
921
|
});
|
|
921
922
|
|
|
@@ -967,6 +968,38 @@ describe("prependNode", () => {
|
|
|
967
968
|
});
|
|
968
969
|
});
|
|
969
970
|
|
|
971
|
+
describe("refresh", () => {
|
|
972
|
+
interface Vars {
|
|
973
|
+
$tree: JQuery<HTMLElement>;
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
const given = getGiven<Vars>();
|
|
977
|
+
given("$tree", () => $("#tree1"));
|
|
978
|
+
|
|
979
|
+
beforeEach(() => {
|
|
980
|
+
given.$tree.tree({
|
|
981
|
+
data: exampleData,
|
|
982
|
+
});
|
|
983
|
+
});
|
|
984
|
+
|
|
985
|
+
it("rerenders the tree", () => {
|
|
986
|
+
const tree = given.$tree.tree("getTree");
|
|
987
|
+
tree.children[0].name = "node1a";
|
|
988
|
+
|
|
989
|
+
expect(given.$tree).toHaveTreeStructure([
|
|
990
|
+
expect.objectContaining({ name: "node1" }),
|
|
991
|
+
expect.objectContaining({ name: "node2" }),
|
|
992
|
+
]);
|
|
993
|
+
|
|
994
|
+
given.$tree.tree("refresh");
|
|
995
|
+
|
|
996
|
+
expect(given.$tree).toHaveTreeStructure([
|
|
997
|
+
expect.objectContaining({ name: "node1a" }),
|
|
998
|
+
expect.objectContaining({ name: "node2" }),
|
|
999
|
+
]);
|
|
1000
|
+
});
|
|
1001
|
+
});
|
|
1002
|
+
|
|
970
1003
|
describe("reload", () => {
|
|
971
1004
|
interface Vars {
|
|
972
1005
|
node1: INode;
|
|
@@ -977,23 +1010,14 @@ describe("reload", () => {
|
|
|
977
1010
|
given("node1", () => given.$tree.tree("getNodeByNameMustExist", "node1"));
|
|
978
1011
|
given("$tree", () => $("#tree1"));
|
|
979
1012
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
server = setupServer(
|
|
984
|
-
rest.get("/tree/", (_request, response, ctx) =>
|
|
1013
|
+
beforeEach(async () => {
|
|
1014
|
+
server.use(
|
|
1015
|
+
rest.get("/tree2/", (_request, response, ctx) =>
|
|
985
1016
|
response(ctx.status(200), ctx.json(exampleData))
|
|
986
1017
|
)
|
|
987
1018
|
);
|
|
988
|
-
server.listen();
|
|
989
|
-
});
|
|
990
1019
|
|
|
991
|
-
|
|
992
|
-
server?.close();
|
|
993
|
-
});
|
|
994
|
-
|
|
995
|
-
beforeEach(async () => {
|
|
996
|
-
given.$tree.tree({ dataUrl: "/tree/" });
|
|
1020
|
+
given.$tree.tree({ dataUrl: "/tree2/" });
|
|
997
1021
|
await screen.findByText("node1");
|
|
998
1022
|
|
|
999
1023
|
given.$tree.tree("removeNode", given.node1);
|
|
@@ -1014,19 +1038,18 @@ describe("reload", () => {
|
|
|
1014
1038
|
});
|
|
1015
1039
|
|
|
1016
1040
|
context("with a onFinished parameter", () => {
|
|
1017
|
-
it("calls onFinished", () =>
|
|
1018
|
-
|
|
1019
|
-
const handleFinished = () => {
|
|
1020
|
-
expect(given.$tree).toHaveTreeStructure([
|
|
1021
|
-
expect.objectContaining({ name: "node1" }),
|
|
1022
|
-
expect.objectContaining({ name: "node2" }),
|
|
1023
|
-
]);
|
|
1041
|
+
it("calls onFinished", async () => {
|
|
1042
|
+
const handleFinished = jest.fn();
|
|
1024
1043
|
|
|
1025
|
-
|
|
1026
|
-
};
|
|
1044
|
+
given.$tree.tree("reload", handleFinished);
|
|
1027
1045
|
|
|
1028
|
-
|
|
1029
|
-
|
|
1046
|
+
await waitFor(() => expect(handleFinished).toHaveBeenCalledWith());
|
|
1047
|
+
|
|
1048
|
+
expect(given.$tree).toHaveTreeStructure([
|
|
1049
|
+
expect.objectContaining({ name: "node1" }),
|
|
1050
|
+
expect.objectContaining({ name: "node2" }),
|
|
1051
|
+
]);
|
|
1052
|
+
});
|
|
1030
1053
|
});
|
|
1031
1054
|
});
|
|
1032
1055
|
|
|
@@ -1149,7 +1172,7 @@ describe("selectNode", () => {
|
|
|
1149
1172
|
|
|
1150
1173
|
it("selects the node and deselects the previous node", () => {
|
|
1151
1174
|
expect(given.node1.element).toBeSelected();
|
|
1152
|
-
expect(given.node2.element).
|
|
1175
|
+
expect(given.node2.element).not.toBeSelected();
|
|
1153
1176
|
});
|
|
1154
1177
|
});
|
|
1155
1178
|
|
|
@@ -1170,7 +1193,7 @@ describe("selectNode", () => {
|
|
|
1170
1193
|
|
|
1171
1194
|
it("deselects the node", () => {
|
|
1172
1195
|
given.$tree.tree("selectNode", given.node1);
|
|
1173
|
-
expect(given.node1.element).
|
|
1196
|
+
expect(given.node1.element).not.toBeSelected();
|
|
1174
1197
|
});
|
|
1175
1198
|
});
|
|
1176
1199
|
|
|
@@ -1436,13 +1459,7 @@ describe("updateNode", () => {
|
|
|
1436
1459
|
});
|
|
1437
1460
|
|
|
1438
1461
|
it("keeps the focus on the node", () => {
|
|
1439
|
-
expect(
|
|
1440
|
-
expect(
|
|
1441
|
-
given.$tree.tree(
|
|
1442
|
-
"getNodeByHtmlElement",
|
|
1443
|
-
document.activeElement as HTMLElement
|
|
1444
|
-
)
|
|
1445
|
-
).not.toBeNil();
|
|
1462
|
+
expect(given.node.element).toBeFocused();
|
|
1446
1463
|
});
|
|
1447
1464
|
});
|
|
1448
1465
|
});
|
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as $ from "jquery";
|
|
2
1
|
import getGiven from "givens";
|
|
3
|
-
import { screen } from "@testing-library/dom";
|
|
2
|
+
import { screen, waitFor } from "@testing-library/dom";
|
|
4
3
|
import { rest } from "msw";
|
|
5
4
|
import { setupServer } from "msw/node";
|
|
6
5
|
import "../../tree.jquery";
|
|
@@ -9,17 +8,25 @@ import { titleSpan, togglerLink } from "../support/testUtil";
|
|
|
9
8
|
|
|
10
9
|
const context = describe;
|
|
11
10
|
|
|
11
|
+
const server = setupServer();
|
|
12
|
+
|
|
13
|
+
beforeAll(() => server.listen());
|
|
14
|
+
|
|
12
15
|
beforeEach(() => {
|
|
13
16
|
$("body").append('<div id="tree1"></div>');
|
|
14
17
|
});
|
|
15
18
|
|
|
16
19
|
afterEach(() => {
|
|
20
|
+
server.resetHandlers();
|
|
21
|
+
|
|
17
22
|
const $tree = $("#tree1");
|
|
18
23
|
$tree.tree("destroy");
|
|
19
24
|
$tree.remove();
|
|
20
25
|
localStorage.clear();
|
|
21
26
|
});
|
|
22
27
|
|
|
28
|
+
afterAll(() => server.close());
|
|
29
|
+
|
|
23
30
|
describe("autoEscape", () => {
|
|
24
31
|
interface Vars {
|
|
25
32
|
autoEscape: boolean;
|
|
@@ -187,10 +194,8 @@ describe("dataUrl", () => {
|
|
|
187
194
|
},
|
|
188
195
|
];
|
|
189
196
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
beforeAll(() => {
|
|
193
|
-
server = setupServer(
|
|
197
|
+
beforeEach(() => {
|
|
198
|
+
server.use(
|
|
194
199
|
rest.get("/tree/", (request, response, ctx) => {
|
|
195
200
|
const nodeName = request.headers.get("node");
|
|
196
201
|
const data = nodeName ? [nodeName] : exampleData;
|
|
@@ -198,11 +203,6 @@ describe("dataUrl", () => {
|
|
|
198
203
|
return response(ctx.status(200), ctx.json(data));
|
|
199
204
|
})
|
|
200
205
|
);
|
|
201
|
-
server.listen();
|
|
202
|
-
});
|
|
203
|
-
|
|
204
|
-
afterAll(() => {
|
|
205
|
-
server?.close();
|
|
206
206
|
});
|
|
207
207
|
|
|
208
208
|
interface Vars {
|
|
@@ -348,31 +348,28 @@ describe("onLoadFailed", () => {
|
|
|
348
348
|
given("$tree", () => $("#tree1"));
|
|
349
349
|
|
|
350
350
|
context("when the loading fails", () => {
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
beforeAll(() => {
|
|
354
|
-
server = setupServer(
|
|
351
|
+
beforeEach(() => {
|
|
352
|
+
server.use(
|
|
355
353
|
rest.get("/tree/", (_request, response, ctx) =>
|
|
356
354
|
response(ctx.status(500), ctx.body("Internal server error"))
|
|
357
355
|
)
|
|
358
356
|
);
|
|
359
|
-
server.listen();
|
|
360
357
|
});
|
|
361
358
|
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
359
|
+
it("calls onLoadFailed", async () => {
|
|
360
|
+
const onLoadFailed = jest.fn();
|
|
361
|
+
|
|
362
|
+
given.$tree.tree({
|
|
363
|
+
dataUrl: "/tree/",
|
|
364
|
+
onLoadFailed,
|
|
365
|
+
});
|
|
365
366
|
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
done();
|
|
373
|
-
},
|
|
374
|
-
});
|
|
375
|
-
}));
|
|
367
|
+
await waitFor(() => {
|
|
368
|
+
expect(onLoadFailed).toHaveBeenCalledWith(
|
|
369
|
+
expect.objectContaining({ status: 500 })
|
|
370
|
+
);
|
|
371
|
+
});
|
|
372
|
+
});
|
|
376
373
|
});
|
|
377
374
|
});
|
|
378
375
|
|
|
@@ -391,7 +388,7 @@ describe("rtl", () => {
|
|
|
391
388
|
});
|
|
392
389
|
|
|
393
390
|
it("has a different closed icon", () => {
|
|
394
|
-
expect(togglerLink(given.node1.element).text()).
|
|
391
|
+
expect(togglerLink(given.node1.element).text()).toBe("◀");
|
|
395
392
|
});
|
|
396
393
|
});
|
|
397
394
|
|
|
@@ -402,7 +399,7 @@ describe("rtl", () => {
|
|
|
402
399
|
});
|
|
403
400
|
|
|
404
401
|
it("has a different closed icon", () => {
|
|
405
|
-
expect(togglerLink(given.node1.element).text()).
|
|
402
|
+
expect(togglerLink(given.node1.element).text()).toBe("◀");
|
|
406
403
|
});
|
|
407
404
|
});
|
|
408
405
|
});
|
|
@@ -434,7 +431,7 @@ describe("saveState", () => {
|
|
|
434
431
|
given("saveState", () => true);
|
|
435
432
|
|
|
436
433
|
it("saves the state to local storage", () => {
|
|
437
|
-
expect(localStorage.getItem("tree")).
|
|
434
|
+
expect(localStorage.getItem("tree")).toBe(
|
|
438
435
|
'{"open_nodes":[123],"selected_node":[123]}'
|
|
439
436
|
);
|
|
440
437
|
});
|
|
@@ -444,7 +441,7 @@ describe("saveState", () => {
|
|
|
444
441
|
given("saveState", () => "my-state");
|
|
445
442
|
|
|
446
443
|
it("uses the string as a key", () => {
|
|
447
|
-
expect(localStorage.getItem("my-state")).
|
|
444
|
+
expect(localStorage.getItem("my-state")).toBe(
|
|
448
445
|
'{"open_nodes":[123],"selected_node":[123]}'
|
|
449
446
|
);
|
|
450
447
|
});
|
package/src/test/node.test.ts
CHANGED
|
@@ -855,13 +855,13 @@ describe("hasChildren", () => {
|
|
|
855
855
|
});
|
|
856
856
|
|
|
857
857
|
it("returns true", () => {
|
|
858
|
-
expect(given.node.hasChildren()).
|
|
858
|
+
expect(given.node.hasChildren()).toBe(true);
|
|
859
859
|
});
|
|
860
860
|
});
|
|
861
861
|
|
|
862
862
|
context("when a node doesn't have children", () => {
|
|
863
863
|
it("returns false", () => {
|
|
864
|
-
expect(given.node.hasChildren()).
|
|
864
|
+
expect(given.node.hasChildren()).toBe(false);
|
|
865
865
|
});
|
|
866
866
|
});
|
|
867
867
|
});
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import treeStructure from "./treeStructure";
|
|
2
|
+
import { titleSpan } from "./testUtil";
|
|
2
3
|
|
|
3
4
|
const assertJqTreeFolder = ($el: JQuery<HTMLElement>) => {
|
|
4
5
|
/* istanbul ignore if */
|
|
@@ -8,15 +9,6 @@ const assertJqTreeFolder = ($el: JQuery<HTMLElement>) => {
|
|
|
8
9
|
};
|
|
9
10
|
|
|
10
11
|
expect.extend({
|
|
11
|
-
notToBeSelected(el: HTMLElement | JQuery<HTMLElement>) {
|
|
12
|
-
const $el = jQuery(el);
|
|
13
|
-
|
|
14
|
-
/* istanbul ignore next */
|
|
15
|
-
return {
|
|
16
|
-
message: () => "The node is selected",
|
|
17
|
-
pass: !$el.hasClass("jqtree-selected"),
|
|
18
|
-
};
|
|
19
|
-
},
|
|
20
12
|
toBeClosed(el: HTMLElement | JQuery<HTMLElement>) {
|
|
21
13
|
const $el = jQuery(el);
|
|
22
14
|
assertJqTreeFolder($el);
|
|
@@ -27,6 +19,13 @@ expect.extend({
|
|
|
27
19
|
pass: $el.hasClass("jqtree-closed"),
|
|
28
20
|
};
|
|
29
21
|
},
|
|
22
|
+
toBeFocused(el: HTMLElement | JQuery<HTMLElement>) {
|
|
23
|
+
/* istanbul ignore next */
|
|
24
|
+
return {
|
|
25
|
+
message: () => "The is node is not focused",
|
|
26
|
+
pass: document.activeElement === titleSpan(el)[0],
|
|
27
|
+
};
|
|
28
|
+
},
|
|
30
29
|
toBeOpen(el: HTMLElement | JQuery<HTMLElement>) {
|
|
31
30
|
const $el = jQuery(el);
|
|
32
31
|
assertJqTreeFolder($el);
|
|
@@ -22,12 +22,10 @@ declare namespace JQTreeMatchers {
|
|
|
22
22
|
declare namespace jest {
|
|
23
23
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
24
24
|
interface Matchers<R> {
|
|
25
|
-
notToBeSelected(): boolean;
|
|
26
25
|
toBeClosed(): boolean;
|
|
26
|
+
toBeFocused(): boolean;
|
|
27
27
|
toBeOpen(): boolean;
|
|
28
28
|
toBeSelected(): boolean;
|
|
29
|
-
toHaveTreeStructure(
|
|
30
|
-
treeStructure: JQTreeMatchers.TreeStructure
|
|
31
|
-
): boolean;
|
|
29
|
+
toHaveTreeStructure(treeStructure: any): boolean;
|
|
32
30
|
}
|
|
33
31
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import
|
|
1
|
+
import jQuery from "jquery";
|
|
2
2
|
import "./jqTreeMatchers";
|
|
3
3
|
|
|
4
|
+
(window as any).$ = jQuery; // eslint-disable-line @typescript-eslint/no-unsafe-member-access
|
|
4
5
|
(window as any).jQuery = jQuery; // eslint-disable-line @typescript-eslint/no-unsafe-member-access
|
package/src/tree.jquery.d.ts
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
type NodeId = number | string;
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
interface NodeRecord {
|
|
4
|
+
[key: string]: unknown;
|
|
5
|
+
id?: NodeId;
|
|
6
|
+
children?: NodeData[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
type NodeData = string | NodeRecord;
|
|
5
10
|
|
|
6
11
|
type IterateCallback = (node: INode, level: number) => boolean;
|
|
7
12
|
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
interface INode {
|
|
14
|
+
id?: NodeId;
|
|
15
|
+
name: string;
|
|
16
|
+
children: INode[];
|
|
17
|
+
element: HTMLElement;
|
|
18
|
+
is_open: boolean;
|
|
19
|
+
parent: INode | null;
|
|
15
20
|
|
|
16
21
|
[key: string]: unknown;
|
|
17
22
|
|
|
18
|
-
|
|
23
|
+
iterate(callback: IterateCallback): void;
|
|
19
24
|
}
|
|
20
25
|
|
|
21
26
|
type DataUrlFunction = (node?: Node) => JQuery.AjaxSettings;
|
|
@@ -41,7 +46,7 @@ interface IJQTreeOptions {
|
|
|
41
46
|
buttonLeft?: boolean;
|
|
42
47
|
closedIcon?: string | Element;
|
|
43
48
|
data?: NodeData[];
|
|
44
|
-
dataFilter?: (data:
|
|
49
|
+
dataFilter?: (data: NodeData[]) => NodeData[];
|
|
45
50
|
dataUrl?: DataUrl;
|
|
46
51
|
dragAndDrop?: boolean;
|
|
47
52
|
nodeClass?: any;
|
|
@@ -57,7 +62,7 @@ interface IJQTreeOptions {
|
|
|
57
62
|
onGetStateFromStorage?: () => string;
|
|
58
63
|
onSetStateFromStorage?: (data: string) => void;
|
|
59
64
|
openedIcon?: string | Element;
|
|
60
|
-
openFolderDelay?: number;
|
|
65
|
+
openFolderDelay?: number | false;
|
|
61
66
|
rtl?: boolean;
|
|
62
67
|
selectable?: boolean;
|
|
63
68
|
saveState?: boolean | string;
|
|
@@ -135,13 +140,14 @@ interface IJQTreePlugin {
|
|
|
135
140
|
onFinished?: (node: INode) => void
|
|
136
141
|
): JQuery;
|
|
137
142
|
(behavior: "prependNode", newNodeInfo: NodeData, parentNode?: INode): INode;
|
|
143
|
+
(behavior: "refresh"): JQuery;
|
|
138
144
|
(behavior: "reload", onFinished?: () => void): JQuery;
|
|
139
145
|
(behavior: "removeFromSelection", node: INode): JQuery;
|
|
140
146
|
(behavior: "removeNode", node: INode): JQuery;
|
|
141
147
|
(behavior: "scrollToNode", node: INode): JQuery;
|
|
142
148
|
(behavior: "selectNode", node: INode | null): JQuery;
|
|
143
149
|
(behavior: "setOption", option: string, value: unknown): JQuery;
|
|
144
|
-
(behavior: "setState", options:
|
|
150
|
+
(behavior: "setState", options: Record<string, unknown>): JQuery;
|
|
145
151
|
(behavior: "toggle", node: INode, slideParam?: boolean): JQuery;
|
|
146
152
|
(behavior: "toJson"): string;
|
|
147
153
|
(behavior: "updateNode", node: INode, data: NodeData): JQuery;
|
package/src/tree.jquery.ts
CHANGED
|
@@ -1,23 +1,19 @@
|
|
|
1
1
|
import __version__ from "./version";
|
|
2
|
-
import * as jQueryProxy from "jquery";
|
|
3
2
|
import { DragAndDropHandler } from "./dragAndDropHandler";
|
|
4
3
|
import ElementsRenderer from "./elementsRenderer";
|
|
5
4
|
import DataLoader, { HandleFinishedLoading } from "./dataLoader";
|
|
6
5
|
import KeyHandler from "./keyHandler";
|
|
7
6
|
import MouseWidget from "./mouse.widget";
|
|
8
7
|
import { PositionInfo } from "./types";
|
|
9
|
-
import SaveStateHandler from "./saveStateHandler";
|
|
8
|
+
import SaveStateHandler, { SavedState } from "./saveStateHandler";
|
|
10
9
|
import ScrollHandler from "./scrollHandler";
|
|
11
10
|
import SelectNodeHandler from "./selectNodeHandler";
|
|
12
11
|
import SimpleWidget from "./simple.widget";
|
|
13
|
-
import { Node,
|
|
12
|
+
import { Node, getPosition } from "./node";
|
|
14
13
|
import { isFunction } from "./util";
|
|
15
14
|
import { FolderElement, NodeElement, OnFinishOpenNode } from "./nodeElement";
|
|
16
15
|
import { JQTreeOptions } from "./jqtreeOptions";
|
|
17
16
|
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
19
|
-
const jQuery: JQueryStatic = (<any>jQueryProxy).default || jQueryProxy;
|
|
20
|
-
|
|
21
17
|
interface ClickTarget {
|
|
22
18
|
node: Node;
|
|
23
19
|
type: "button" | "label";
|
|
@@ -167,6 +163,11 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
167
163
|
return this.element;
|
|
168
164
|
}
|
|
169
165
|
|
|
166
|
+
public refresh(): JQuery {
|
|
167
|
+
this._refreshElements(null);
|
|
168
|
+
return this.element;
|
|
169
|
+
}
|
|
170
|
+
|
|
170
171
|
public getNodeById(nodeId: NodeId): Node | null {
|
|
171
172
|
return this.tree.getNodeById(nodeId);
|
|
172
173
|
}
|
|
@@ -366,19 +367,12 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
366
367
|
node.removeChildren();
|
|
367
368
|
|
|
368
369
|
if (data.children.length) {
|
|
369
|
-
node.loadFromData(data.children);
|
|
370
|
+
node.loadFromData(data.children as Node[]);
|
|
370
371
|
}
|
|
371
372
|
}
|
|
372
373
|
|
|
373
|
-
const mustSetFocus = this.selectNodeHandler.isFocusOnTree();
|
|
374
|
-
const mustSelect = this.isSelectedNodeInSubtree(node);
|
|
375
|
-
|
|
376
374
|
this._refreshElements(node);
|
|
377
375
|
|
|
378
|
-
if (mustSelect) {
|
|
379
|
-
this.selectCurrentNode(mustSetFocus);
|
|
380
|
-
}
|
|
381
|
-
|
|
382
376
|
return this.element;
|
|
383
377
|
}
|
|
384
378
|
|
|
@@ -486,7 +480,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
486
480
|
}
|
|
487
481
|
|
|
488
482
|
public setOption(option: string, value: unknown): JQuery {
|
|
489
|
-
(
|
|
483
|
+
(this.options as unknown as Record<string, unknown>)[option] = value;
|
|
490
484
|
return this.element;
|
|
491
485
|
}
|
|
492
486
|
|
|
@@ -514,7 +508,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
514
508
|
|
|
515
509
|
public _triggerEvent(
|
|
516
510
|
eventName: string,
|
|
517
|
-
values?:
|
|
511
|
+
values?: Record<string, unknown>
|
|
518
512
|
): JQuery.Event {
|
|
519
513
|
const event = jQuery.Event(eventName, values);
|
|
520
514
|
this.element.trigger(event);
|
|
@@ -528,7 +522,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
528
522
|
): void {
|
|
529
523
|
const doOpenNode = (
|
|
530
524
|
_node: Node,
|
|
531
|
-
_slide:
|
|
525
|
+
_slide: boolean,
|
|
532
526
|
_onFinished: OnFinishOpenNode | null
|
|
533
527
|
): void => {
|
|
534
528
|
const folderElement = new FolderElement(_node, this);
|
|
@@ -564,8 +558,17 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
564
558
|
from_node: redraw this subtree
|
|
565
559
|
*/
|
|
566
560
|
public _refreshElements(fromNode: Node | null): void {
|
|
561
|
+
const mustSetFocus = this.selectNodeHandler.isFocusOnTree();
|
|
562
|
+
const mustSelect = fromNode
|
|
563
|
+
? this.isSelectedNodeInSubtree(fromNode)
|
|
564
|
+
: false;
|
|
565
|
+
|
|
567
566
|
this.renderer.render(fromNode);
|
|
568
567
|
|
|
568
|
+
if (mustSelect) {
|
|
569
|
+
this.selectCurrentNode(mustSetFocus);
|
|
570
|
+
}
|
|
571
|
+
|
|
569
572
|
this._triggerEvent("tree.refresh");
|
|
570
573
|
}
|
|
571
574
|
|
|
@@ -737,7 +740,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
737
740
|
}
|
|
738
741
|
}
|
|
739
742
|
|
|
740
|
-
private initTree(data:
|
|
743
|
+
private initTree(data: NodeData[]): void {
|
|
741
744
|
const doInit = (): void => {
|
|
742
745
|
if (!this.isInitialized) {
|
|
743
746
|
this.isInitialized = true;
|
|
@@ -784,9 +787,8 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
784
787
|
if (!state) {
|
|
785
788
|
return [false, false];
|
|
786
789
|
} else {
|
|
787
|
-
const mustLoadOnDemand =
|
|
788
|
-
state
|
|
789
|
-
);
|
|
790
|
+
const mustLoadOnDemand =
|
|
791
|
+
this.saveStateHandler.setInitialState(state);
|
|
790
792
|
|
|
791
793
|
// return true: the state is restored
|
|
792
794
|
return [true, mustLoadOnDemand];
|
|
@@ -901,7 +903,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
901
903
|
}
|
|
902
904
|
}
|
|
903
905
|
|
|
904
|
-
private handleClick = (
|
|
906
|
+
private handleClick = (
|
|
907
|
+
e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
|
|
908
|
+
): void => {
|
|
905
909
|
const clickTarget = this.getClickTarget(e.target);
|
|
906
910
|
|
|
907
911
|
if (clickTarget) {
|
|
@@ -924,7 +928,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
924
928
|
}
|
|
925
929
|
};
|
|
926
930
|
|
|
927
|
-
private handleDblclick = (
|
|
931
|
+
private handleDblclick = (
|
|
932
|
+
e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
|
|
933
|
+
): void => {
|
|
928
934
|
const clickTarget = this.getClickTarget(e.target);
|
|
929
935
|
|
|
930
936
|
if (clickTarget?.type === "label") {
|
|
@@ -974,7 +980,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
974
980
|
}
|
|
975
981
|
}
|
|
976
982
|
|
|
977
|
-
private handleContextmenu = (
|
|
983
|
+
private handleContextmenu = (
|
|
984
|
+
e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>
|
|
985
|
+
) => {
|
|
978
986
|
const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");
|
|
979
987
|
if ($div.length) {
|
|
980
988
|
const node = this.getNode($div);
|
|
@@ -1129,15 +1137,14 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1129
1137
|
}
|
|
1130
1138
|
|
|
1131
1139
|
private deselectNodes(parentNode: Node): void {
|
|
1132
|
-
const selectedNodesUnderParent =
|
|
1133
|
-
parentNode
|
|
1134
|
-
);
|
|
1140
|
+
const selectedNodesUnderParent =
|
|
1141
|
+
this.selectNodeHandler.getSelectedNodesUnder(parentNode);
|
|
1135
1142
|
for (const n of selectedNodesUnderParent) {
|
|
1136
1143
|
this.selectNodeHandler.removeFromSelection(n);
|
|
1137
1144
|
}
|
|
1138
1145
|
}
|
|
1139
1146
|
|
|
1140
|
-
private loadSubtree(data:
|
|
1147
|
+
private loadSubtree(data: NodeData[], parentNode: Node): void {
|
|
1141
1148
|
parentNode.loadFromData(data);
|
|
1142
1149
|
|
|
1143
1150
|
parentNode.load_on_demand = false;
|
package/src/version.ts
CHANGED