jqtree 1.7.3 → 1.7.5
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 +5 -1
- package/.github/workflows/static.yml +57 -0
- package/bower.json +1 -1
- package/css/jqtree.postcss +4 -0
- package/docs/.ruby-version +1 -0
- package/docs/Gemfile +5 -2
- package/docs/Gemfile.lock +30 -210
- package/docs/_config.yml +110 -10
- package/docs/_entries/{10_changelog.md → general/changelog.md} +11 -1
- package/docs/_entries/multiple_selection/get-selected-nodes.md +10 -0
- package/docs/package.json +1 -1
- package/docs/pnpm-lock.yaml +30 -30
- package/jqtree.css +4 -0
- package/lib/dataLoader.js +2 -3
- package/lib/dragAndDropHandler.js +16 -14
- package/lib/elementsRenderer.js +2 -3
- package/lib/keyHandler.js +1 -5
- package/lib/mouse.widget.js +1 -2
- package/lib/node.js +30 -39
- package/lib/nodeElement.js +3 -6
- package/lib/nodeUtils.js +10 -0
- package/lib/playwright/coverage.js +14 -11
- package/lib/playwright/playwright.test.js +482 -104
- package/lib/playwright/testUtils.js +75 -49
- package/lib/saveStateHandler.js +2 -3
- package/lib/scrollHandler/containerScrollParent.js +160 -0
- package/lib/scrollHandler/createScrollParent.js +57 -0
- package/lib/scrollHandler/documentScrollParent.js +169 -0
- package/lib/scrollHandler/scrollParent.js +58 -0
- package/lib/scrollHandler/types.js +1 -0
- package/lib/scrollHandler.js +28 -207
- package/lib/selectNodeHandler.js +2 -3
- package/lib/simple.widget.js +1 -2
- package/lib/test/jqTree/loadOnDemand.test.js +3 -3
- package/lib/test/jqTree/methods.test.js +2 -1
- package/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +94 -0
- package/lib/test/node.test.js +49 -7
- package/lib/test/nodeUtils.test.js +20 -0
- package/lib/test/support/exampleData.js +1 -2
- package/lib/test/support/testUtil.js +3 -6
- package/lib/test/support/treeStructure.js +1 -2
- package/lib/tree.jquery.js +6 -7
- package/lib/util.js +4 -7
- package/lib/version.js +2 -3
- package/package.json +27 -27
- package/src/dragAndDropHandler.ts +39 -34
- package/src/keyHandler.ts +0 -8
- package/src/node.ts +32 -48
- package/src/nodeUtils.ts +10 -0
- package/src/playwright/playwright.test.ts +207 -15
- package/src/playwright/testUtils.ts +23 -15
- package/src/scrollHandler/containerScrollParent.ts +177 -0
- package/src/scrollHandler/createScrollParent.ts +50 -0
- package/src/scrollHandler/documentScrollParent.ts +182 -0
- package/src/scrollHandler/types.ts +7 -0
- package/src/scrollHandler.ts +25 -243
- package/src/test/jqTree/loadOnDemand.test.ts +2 -3
- package/src/test/jqTree/methods.test.ts +1 -1
- package/src/test/node.test.ts +84 -25
- package/src/test/nodeUtils.test.ts +21 -0
- package/src/tree.jquery.ts +27 -30
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +402 -230
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/docs/_entries/insert.py +0 -46
- package/docs/_entries/renumber.py +0 -38
- package/docs/jqtree.css +0 -189
- package/docs/static/documentation.css +0 -1335
- package/docs/static/example.css +0 -63
- package/docs/tree.jquery.js +0 -21
- /package/docs/_entries/{72_events.md → events/index.md} +0 -0
- /package/docs/_entries/{73_tree-click.md → events/tree-click.md} +0 -0
- /package/docs/_entries/{74_tree-close.md → events/tree-close.md} +0 -0
- /package/docs/_entries/{75_tree-contextmenu.md → events/tree-contextmenu.md} +0 -0
- /package/docs/_entries/{76_tree-dblclick.md → events/tree-dblclick.md} +0 -0
- /package/docs/_entries/{77_tree-init.md → events/tree-init.md} +0 -0
- /package/docs/_entries/{78_tree-load-data.md → events/tree-load-data.md} +0 -0
- /package/docs/_entries/{79_tree-loading-data.md → events/tree-loading-data.md} +0 -0
- /package/docs/_entries/{80_tree-move.md → events/tree-move.md} +0 -0
- /package/docs/_entries/{82_tree-open.md → events/tree-open.md} +0 -0
- /package/docs/_entries/{81_tree-refresh.md → events/tree-refresh.md} +0 -0
- /package/docs/_entries/{83_tree-select.md → events/tree-select.md} +0 -0
- /package/docs/_entries/{43_addnodeafter.md → functions/addnodeafter.md} +0 -0
- /package/docs/_entries/{44_addnodebefore.md → functions/addnodebefore.md} +0 -0
- /package/docs/_entries/{42_addparentnode.md → functions/addparentnode.md} +0 -0
- /package/docs/_entries/{45_appendnode.md → functions/appendnode.md} +0 -0
- /package/docs/_entries/{46_closenode.md → functions/closenode.md} +0 -0
- /package/docs/_entries/{47_destroy.md → functions/destroy.md} +0 -0
- /package/docs/_entries/{86_get-selected-nodes.md → functions/get-selected-nodes.md} +0 -0
- /package/docs/_entries/{48_getnodebycallback.md → functions/getnodebycallback.md} +0 -0
- /package/docs/_entries/{50_getnodebyhtmlelement.md → functions/getnodebyhtmlelement.md} +0 -0
- /package/docs/_entries/{49_getnodebyid.md → functions/getnodebyid.md} +0 -0
- /package/docs/_entries/{51_getselectednode.md → functions/getselectednode.md} +0 -0
- /package/docs/_entries/{52_getstate.md → functions/getstate.md} +0 -0
- /package/docs/_entries/{53_gettree.md → functions/gettree.md} +0 -0
- /package/docs/_entries/{41_functions.md → functions/index.md} +0 -0
- /package/docs/_entries/{87_is-node-selected.md → functions/is-node-selected.md} +0 -0
- /package/docs/_entries/{54_isdragging.md → functions/isdragging.md} +0 -0
- /package/docs/_entries/{55_loaddata.md → functions/loaddata.md} +0 -0
- /package/docs/_entries/{56_loaddatafromurl.md → functions/loaddatafromurl.md} +0 -0
- /package/docs/_entries/{57_movedown.md → functions/movedown.md} +0 -0
- /package/docs/_entries/{58_movenode.md → functions/movenode.md} +0 -0
- /package/docs/_entries/{59_moveup.md → functions/moveup.md} +0 -0
- /package/docs/_entries/{60_opennode.md → functions/opennode.md} +0 -0
- /package/docs/_entries/{61_prependnode.md → functions/prependnode.md} +0 -0
- /package/docs/_entries/{62_refresh.md → functions/refresh.md} +0 -0
- /package/docs/_entries/{63_reload.md → functions/reload.md} +0 -0
- /package/docs/_entries/{64_removenode.md → functions/removenode.md} +0 -0
- /package/docs/_entries/{66_scrolltonode.md → functions/scrolltonode.md} +0 -0
- /package/docs/_entries/{65_selectnode.md → functions/selectnode.md} +0 -0
- /package/docs/_entries/{67_setoption.md → functions/setoption.md} +0 -0
- /package/docs/_entries/{68_setstate.md → functions/setstate.md} +0 -0
- /package/docs/_entries/{69_toggle.md → functions/toggle.md} +0 -0
- /package/docs/_entries/{70_tojson.md → functions/tojson.md} +0 -0
- /package/docs/_entries/{71_updatenode.md → functions/updatenode.md} +0 -0
- /package/docs/_entries/{04_demo.html → general/demo.html} +0 -0
- /package/docs/_entries/{06_downloads.md → general/downloads.md} +0 -0
- /package/docs/_entries/{08_examples.md → general/examples.md} +0 -0
- /package/docs/_entries/{03_features.md → general/features.md} +0 -0
- /package/docs/_entries/{01_general.md → general/index.md} +0 -0
- /package/docs/_entries/{02_introduction.md → general/introduction.md} +0 -0
- /package/docs/_entries/{05_requirements.md → general/requirements.md} +0 -0
- /package/docs/_entries/{07_tutorial.md → general/tutorial.md} +0 -0
- /package/docs/_entries/{09_usecases.md → general/usecases.md} +0 -0
- /package/docs/_entries/{85_add-to-selection.md → multiple_selection/add-to-selection.md} +0 -0
- /package/docs/_entries/{84_multiple-selection.md → multiple_selection/index.md} +0 -0
- /package/docs/_entries/{88_remove-from-selection.md → multiple_selection/remove-from-selection.md} +0 -0
- /package/docs/_entries/{90_children.md → node/children.md} +0 -0
- /package/docs/_entries/{91_getdata.md → node/getdata.md} +0 -0
- /package/docs/_entries/{92_getlevel.md → node/getlevel.md} +0 -0
- /package/docs/_entries/{93_getnextnode.md → node/getnextnode.md} +0 -0
- /package/docs/_entries/{94_getnextsibling.md → node/getnextsibling.md} +0 -0
- /package/docs/_entries/{95_getnextvisiblenode.md → node/getnextvisiblenode.md} +0 -0
- /package/docs/_entries/{96_getpreviousnode.md → node/getpreviousnode.md} +0 -0
- /package/docs/_entries/{97_getprevioussibling.md → node/getprevioussibling.md} +0 -0
- /package/docs/_entries/{98_getpreviousvisiblenode.md → node/getpreviousvisiblenode.md} +0 -0
- /package/docs/_entries/{89_node-functions.md → node/index.md} +0 -0
- /package/docs/_entries/{99_parent.md → node/parent.md} +0 -0
- /package/docs/_entries/{12_animationspeed.md → options/animationspeed.md} +0 -0
- /package/docs/_entries/{13_autoescape.md → options/autoescape.md} +0 -0
- /package/docs/_entries/{14_autoopen.md → options/autoopen.md} +0 -0
- /package/docs/_entries/{15_buttonleft.md → options/buttonleft.md} +0 -0
- /package/docs/_entries/{16_closedicon.md → options/closedicon.md} +0 -0
- /package/docs/_entries/{19_data-url.md → options/data-url.md} +0 -0
- /package/docs/_entries/{17_data.md → options/data.md} +0 -0
- /package/docs/_entries/{18_datafilter.md → options/datafilter.md} +0 -0
- /package/docs/_entries/{20_draganddrop.md → options/draganddrop.md} +0 -0
- /package/docs/_entries/{11_options.md → options/index.md} +0 -0
- /package/docs/_entries/{21_keyboardsupport.md → options/keyboardsupport.md} +0 -0
- /package/docs/_entries/{22_oncanmove.md → options/oncanmove.md} +0 -0
- /package/docs/_entries/{23_oncanmoveto.md → options/oncanmoveto.md} +0 -0
- /package/docs/_entries/{24_oncanselectnode.md → options/oncanselectnode.md} +0 -0
- /package/docs/_entries/{25_oncreateli.md → options/oncreateli.md} +0 -0
- /package/docs/_entries/{26_ondragmove.md → options/ondragmove.md} +0 -0
- /package/docs/_entries/{27_ondragstop.md → options/ondragstop.md} +0 -0
- /package/docs/_entries/{28_onismovehandle.md → options/onismovehandle.md} +0 -0
- /package/docs/_entries/{29_onloadfailed.md → options/onloadfailed.md} +0 -0
- /package/docs/_entries/{30_onloading.md → options/onloading.md} +0 -0
- /package/docs/_entries/{31_openedicon.md → options/openedicon.md} +0 -0
- /package/docs/_entries/{32_openfolderdelay.md → options/openfolderdelay.md} +0 -0
- /package/docs/_entries/{33_rtl.md → options/rtl.md} +0 -0
- /package/docs/_entries/{34_savestate.md → options/savestate.md} +0 -0
- /package/docs/_entries/{35_selectable.md → options/selectable.md} +0 -0
- /package/docs/_entries/{36_showemptyfolder.md → options/showemptyfolder.md} +0 -0
- /package/docs/_entries/{37_slide.md → options/slide.md} +0 -0
- /package/docs/_entries/{38_start_dnd_delay.md → options/start_dnd_delay.md} +0 -0
- /package/docs/_entries/{39_tabindex.md → options/tabindex.md} +0 -0
- /package/docs/_entries/{40_usecontextmenu.md → options/usecontextmenu.md} +0 -0
package/src/test/node.test.ts
CHANGED
|
@@ -159,7 +159,7 @@ describe("addChild", () => {
|
|
|
159
159
|
expect(given.node.children).toEqual(
|
|
160
160
|
expect.arrayContaining([
|
|
161
161
|
expect.objectContaining({ id: 100, name: "child1" }),
|
|
162
|
-
])
|
|
162
|
+
]),
|
|
163
163
|
);
|
|
164
164
|
});
|
|
165
165
|
|
|
@@ -330,7 +330,7 @@ describe("constructor", () => {
|
|
|
330
330
|
const given = getGiven<Vars>();
|
|
331
331
|
|
|
332
332
|
given("node", () =>
|
|
333
|
-
given.params === undefined ? new Node() : new Node(given.params)
|
|
333
|
+
given.params === undefined ? new Node() : new Node(given.params),
|
|
334
334
|
);
|
|
335
335
|
|
|
336
336
|
context("without parameters", () => {
|
|
@@ -351,6 +351,10 @@ describe("constructor", () => {
|
|
|
351
351
|
});
|
|
352
352
|
expect(given.node).not.toHaveProperty("id");
|
|
353
353
|
});
|
|
354
|
+
|
|
355
|
+
it("sets isEmptyFolder to false", () => {
|
|
356
|
+
expect(given.node.isEmptyFolder).toBe(false);
|
|
357
|
+
});
|
|
354
358
|
});
|
|
355
359
|
|
|
356
360
|
context("with an object with a name property", () => {
|
|
@@ -408,7 +412,6 @@ describe("constructor", () => {
|
|
|
408
412
|
name: "n1",
|
|
409
413
|
url: "/",
|
|
410
414
|
});
|
|
411
|
-
// todo: match object?
|
|
412
415
|
expect(given.node).not.toHaveProperty("label");
|
|
413
416
|
expect(given.node.children).toHaveLength(0);
|
|
414
417
|
expect(given.node.parent).toBeNull();
|
|
@@ -434,10 +437,24 @@ describe("constructor", () => {
|
|
|
434
437
|
}));
|
|
435
438
|
|
|
436
439
|
it("doesn't set the children", () => {
|
|
437
|
-
// todo: match object?
|
|
438
440
|
expect(given.node.name).toBe("n1");
|
|
439
441
|
expect(given.node.children).toHaveLength(0);
|
|
440
442
|
});
|
|
443
|
+
|
|
444
|
+
it("sets isEmptyFolder to false", () => {
|
|
445
|
+
expect(given.node.isEmptyFolder).toBe(false);
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
|
|
449
|
+
context("when the data contains an empty children attribute", () => {
|
|
450
|
+
given("params", () => ({
|
|
451
|
+
name: "n1",
|
|
452
|
+
children: [],
|
|
453
|
+
}));
|
|
454
|
+
|
|
455
|
+
it("sets isEmptyFolder to true", () => {
|
|
456
|
+
expect(given.node.isEmptyFolder).toBe(true);
|
|
457
|
+
});
|
|
441
458
|
});
|
|
442
459
|
});
|
|
443
460
|
|
|
@@ -719,8 +736,8 @@ describe("getNodeByCallback", () => {
|
|
|
719
736
|
it("returns the node", () => {
|
|
720
737
|
expect(
|
|
721
738
|
given.tree.getNodeByCallback((node) =>
|
|
722
|
-
node.name.startsWith("chi")
|
|
723
|
-
)
|
|
739
|
+
node.name.startsWith("chi"),
|
|
740
|
+
),
|
|
724
741
|
).toMatchObject({
|
|
725
742
|
name: "child1",
|
|
726
743
|
});
|
|
@@ -776,7 +793,7 @@ describe("getNodeByNameMustExist", () => {
|
|
|
776
793
|
context("when the node doesn't exist", () => {
|
|
777
794
|
it("throws an exception", () => {
|
|
778
795
|
expect(() =>
|
|
779
|
-
given.tree.getNodeByNameMustExist("non-existing")
|
|
796
|
+
given.tree.getNodeByNameMustExist("non-existing"),
|
|
780
797
|
).toThrow("Node with name non-existing not found");
|
|
781
798
|
});
|
|
782
799
|
});
|
|
@@ -1074,16 +1091,10 @@ describe("iterate", () => {
|
|
|
1074
1091
|
});
|
|
1075
1092
|
|
|
1076
1093
|
describe("loadFromData", () => {
|
|
1077
|
-
interface Vars {
|
|
1078
|
-
tree: Node;
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
const given = getGiven<Vars>();
|
|
1082
|
-
|
|
1083
|
-
given("tree", () => new Node().loadFromData(exampleData));
|
|
1084
|
-
|
|
1085
1094
|
it("creates a tree", () => {
|
|
1086
|
-
|
|
1095
|
+
const tree = new Node().loadFromData(exampleData);
|
|
1096
|
+
|
|
1097
|
+
expect(tree.children).toEqual([
|
|
1087
1098
|
expect.objectContaining({
|
|
1088
1099
|
id: 123,
|
|
1089
1100
|
intProperty: 1,
|
|
@@ -1103,6 +1114,41 @@ describe("loadFromData", () => {
|
|
|
1103
1114
|
}),
|
|
1104
1115
|
]);
|
|
1105
1116
|
});
|
|
1117
|
+
|
|
1118
|
+
it("sets isEmptyFolder to true for a node when it is has an empty children attribute", () => {
|
|
1119
|
+
const data = [
|
|
1120
|
+
{
|
|
1121
|
+
name: "test1",
|
|
1122
|
+
children: [],
|
|
1123
|
+
},
|
|
1124
|
+
];
|
|
1125
|
+
|
|
1126
|
+
const tree = new Node().loadFromData(data);
|
|
1127
|
+
expect((tree.children[0] as Node).isEmptyFolder).toBe(true);
|
|
1128
|
+
});
|
|
1129
|
+
|
|
1130
|
+
it("sets isEmptyFolder to false for a node when it doesn't have a children attribute", () => {
|
|
1131
|
+
const data = [
|
|
1132
|
+
{
|
|
1133
|
+
name: "test1",
|
|
1134
|
+
},
|
|
1135
|
+
];
|
|
1136
|
+
|
|
1137
|
+
const tree = new Node().loadFromData(data);
|
|
1138
|
+
expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
|
|
1139
|
+
});
|
|
1140
|
+
|
|
1141
|
+
it("sets isEmptyFolder to false for a node when it has a children attribute that is not empty", () => {
|
|
1142
|
+
const data = [
|
|
1143
|
+
{
|
|
1144
|
+
name: "test1",
|
|
1145
|
+
children: ["child1"],
|
|
1146
|
+
},
|
|
1147
|
+
];
|
|
1148
|
+
|
|
1149
|
+
const tree = new Node().loadFromData(data);
|
|
1150
|
+
expect((tree.children[0] as Node).isEmptyFolder).toBe(false);
|
|
1151
|
+
});
|
|
1106
1152
|
});
|
|
1107
1153
|
|
|
1108
1154
|
describe("moveNode", () => {
|
|
@@ -1125,7 +1171,7 @@ describe("moveNode", () => {
|
|
|
1125
1171
|
context("when moving after a node", () => {
|
|
1126
1172
|
it("moves the node", () => {
|
|
1127
1173
|
expect(
|
|
1128
|
-
given.tree.moveNode(given.child2, given.node2, Position.After)
|
|
1174
|
+
given.tree.moveNode(given.child2, given.node2, Position.After),
|
|
1129
1175
|
).toBe(true);
|
|
1130
1176
|
|
|
1131
1177
|
expect(given.tree).toMatchObject({
|
|
@@ -1147,8 +1193,8 @@ describe("moveNode", () => {
|
|
|
1147
1193
|
given.tree.moveNode(
|
|
1148
1194
|
given.child2,
|
|
1149
1195
|
given.tree,
|
|
1150
|
-
Position.After
|
|
1151
|
-
)
|
|
1196
|
+
Position.After,
|
|
1197
|
+
),
|
|
1152
1198
|
).toBe(false);
|
|
1153
1199
|
});
|
|
1154
1200
|
});
|
|
@@ -1157,7 +1203,7 @@ describe("moveNode", () => {
|
|
|
1157
1203
|
context("when moving inside a node", () => {
|
|
1158
1204
|
it("moves the node", () => {
|
|
1159
1205
|
expect(
|
|
1160
|
-
given.tree.moveNode(given.child1, given.node2, Position.Inside)
|
|
1206
|
+
given.tree.moveNode(given.child1, given.node2, Position.Inside),
|
|
1161
1207
|
).toBe(true);
|
|
1162
1208
|
|
|
1163
1209
|
expect(given.tree).toMatchObject({
|
|
@@ -1182,7 +1228,11 @@ describe("moveNode", () => {
|
|
|
1182
1228
|
context("when moving before a node", () => {
|
|
1183
1229
|
it("moves the node", () => {
|
|
1184
1230
|
expect(
|
|
1185
|
-
given.tree.moveNode(
|
|
1231
|
+
given.tree.moveNode(
|
|
1232
|
+
given.child2,
|
|
1233
|
+
given.child1,
|
|
1234
|
+
Position.Before,
|
|
1235
|
+
),
|
|
1186
1236
|
).toBe(true);
|
|
1187
1237
|
|
|
1188
1238
|
expect(given.tree).toMatchObject({
|
|
@@ -1206,8 +1256,8 @@ describe("moveNode", () => {
|
|
|
1206
1256
|
given.tree.moveNode(
|
|
1207
1257
|
given.child2,
|
|
1208
1258
|
given.tree,
|
|
1209
|
-
Position.Before
|
|
1210
|
-
)
|
|
1259
|
+
Position.Before,
|
|
1260
|
+
),
|
|
1211
1261
|
).toBe(false);
|
|
1212
1262
|
});
|
|
1213
1263
|
});
|
|
@@ -1216,7 +1266,7 @@ describe("moveNode", () => {
|
|
|
1216
1266
|
context("when the moved node is a parent of the target node", () => {
|
|
1217
1267
|
it("doesn't move the node", () => {
|
|
1218
1268
|
expect(
|
|
1219
|
-
given.tree.moveNode(given.node1, given.child1, Position.Before)
|
|
1269
|
+
given.tree.moveNode(given.node1, given.child1, Position.Before),
|
|
1220
1270
|
).toBe(false);
|
|
1221
1271
|
|
|
1222
1272
|
expect(given.tree).toMatchObject({
|
|
@@ -1237,7 +1287,7 @@ describe("moveNode", () => {
|
|
|
1237
1287
|
context("with position None", () => {
|
|
1238
1288
|
it("returns false", () => {
|
|
1239
1289
|
expect(
|
|
1240
|
-
given.tree.moveNode(given.child2, given.node2, Position.None)
|
|
1290
|
+
given.tree.moveNode(given.child2, given.node2, Position.None),
|
|
1241
1291
|
).toBe(false);
|
|
1242
1292
|
});
|
|
1243
1293
|
});
|
|
@@ -1283,6 +1333,15 @@ describe("prepend", () => {
|
|
|
1283
1333
|
});
|
|
1284
1334
|
});
|
|
1285
1335
|
});
|
|
1336
|
+
|
|
1337
|
+
it("sets the isEmptyFolder attribute to true when the node data has empty children", () => {
|
|
1338
|
+
given.node.prepend({
|
|
1339
|
+
name: "test1",
|
|
1340
|
+
children: [],
|
|
1341
|
+
});
|
|
1342
|
+
|
|
1343
|
+
expect((given.node.children[0] as Node).isEmptyFolder).toBe(true);
|
|
1344
|
+
});
|
|
1286
1345
|
});
|
|
1287
1346
|
|
|
1288
1347
|
describe("remove", () => {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { isNodeRecordWithChildren } from "../nodeUtils";
|
|
2
|
+
|
|
3
|
+
describe("isNodeRecordWithChildren", () => {
|
|
4
|
+
it("returns true when the data is an object with the children attribute of type array", () => {
|
|
5
|
+
const data = {
|
|
6
|
+
children: [],
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
expect(isNodeRecordWithChildren(data)).toBe(true);
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
it("returns when the data is an object without the children attribute", () => {
|
|
13
|
+
const data = { name: "test" };
|
|
14
|
+
|
|
15
|
+
expect(isNodeRecordWithChildren(data)).toBe(false);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it("returns when the data is a string", () => {
|
|
19
|
+
expect(isNodeRecordWithChildren("test")).toBe(false);
|
|
20
|
+
});
|
|
21
|
+
});
|
package/src/tree.jquery.ts
CHANGED
|
@@ -101,7 +101,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
101
101
|
|
|
102
102
|
public selectNode(
|
|
103
103
|
node: Node | null,
|
|
104
|
-
optionsParam?: SelectNodeOptions
|
|
104
|
+
optionsParam?: SelectNodeOptions,
|
|
105
105
|
): JQuery {
|
|
106
106
|
this.doSelectNode(node, optionsParam);
|
|
107
107
|
return this.element;
|
|
@@ -137,21 +137,21 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
137
137
|
public loadDataFromUrl(
|
|
138
138
|
param1: string | null | Node,
|
|
139
139
|
param2?: Node | null | HandleFinishedLoading,
|
|
140
|
-
param3?: HandleFinishedLoading
|
|
140
|
+
param3?: HandleFinishedLoading,
|
|
141
141
|
): JQuery {
|
|
142
142
|
if (typeof param1 === "string") {
|
|
143
143
|
// first parameter is url
|
|
144
144
|
this.doLoadDataFromUrl(
|
|
145
145
|
param1,
|
|
146
146
|
param2 as Node | null,
|
|
147
|
-
param3 ?? null
|
|
147
|
+
param3 ?? null,
|
|
148
148
|
);
|
|
149
149
|
} else {
|
|
150
150
|
// first parameter is not url
|
|
151
151
|
this.doLoadDataFromUrl(
|
|
152
152
|
null,
|
|
153
153
|
param1,
|
|
154
|
-
param2 as HandleFinishedLoading | null
|
|
154
|
+
param2 as HandleFinishedLoading | null,
|
|
155
155
|
);
|
|
156
156
|
}
|
|
157
157
|
|
|
@@ -185,7 +185,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
185
185
|
}
|
|
186
186
|
|
|
187
187
|
public getNodeByHtmlElement(
|
|
188
|
-
element: HTMLElement | JQuery<HTMLElement
|
|
188
|
+
element: HTMLElement | JQuery<HTMLElement>,
|
|
189
189
|
): Node | null {
|
|
190
190
|
return this.getNode(jQuery(element));
|
|
191
191
|
}
|
|
@@ -197,7 +197,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
197
197
|
public openNode(
|
|
198
198
|
node: Node,
|
|
199
199
|
param1?: boolean | OnFinishOpenNode,
|
|
200
|
-
param2?: OnFinishOpenNode
|
|
200
|
+
param2?: OnFinishOpenNode,
|
|
201
201
|
): JQuery {
|
|
202
202
|
if (!node) {
|
|
203
203
|
throw Error(NODE_PARAM_IS_EMPTY);
|
|
@@ -238,7 +238,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
238
238
|
if (node.isFolder() || node.isEmptyFolder) {
|
|
239
239
|
new FolderElement(node, this).close(
|
|
240
240
|
slide,
|
|
241
|
-
this.options.animationSpeed
|
|
241
|
+
this.options.animationSpeed,
|
|
242
242
|
);
|
|
243
243
|
|
|
244
244
|
this.saveState();
|
|
@@ -258,7 +258,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
258
258
|
|
|
259
259
|
public addNodeAfter(
|
|
260
260
|
newNodeInfo: NodeData,
|
|
261
|
-
existingNode: Node
|
|
261
|
+
existingNode: Node,
|
|
262
262
|
): Node | null {
|
|
263
263
|
const newNode = existingNode.addAfter(newNodeInfo);
|
|
264
264
|
|
|
@@ -271,7 +271,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
271
271
|
|
|
272
272
|
public addNodeBefore(
|
|
273
273
|
newNodeInfo: NodeData,
|
|
274
|
-
existingNode: Node
|
|
274
|
+
existingNode: Node,
|
|
275
275
|
): Node | null {
|
|
276
276
|
if (!existingNode) {
|
|
277
277
|
throw Error(PARAM_IS_EMPTY + "existingNode");
|
|
@@ -288,7 +288,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
288
288
|
|
|
289
289
|
public addParentNode(
|
|
290
290
|
newNodeInfo: NodeData,
|
|
291
|
-
existingNode: Node
|
|
291
|
+
existingNode: Node,
|
|
292
292
|
): Node | null {
|
|
293
293
|
if (!existingNode) {
|
|
294
294
|
throw Error(PARAM_IS_EMPTY + "existingNode");
|
|
@@ -417,7 +417,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
417
417
|
this.selectNodeHandler.addToSelection(node);
|
|
418
418
|
|
|
419
419
|
this._getNodeElementForNode(node).select(
|
|
420
|
-
mustSetFocus === undefined ? true : mustSetFocus
|
|
420
|
+
mustSetFocus === undefined ? true : mustSetFocus,
|
|
421
421
|
);
|
|
422
422
|
|
|
423
423
|
this.saveState();
|
|
@@ -455,12 +455,8 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
455
455
|
throw Error(NODE_PARAM_IS_EMPTY);
|
|
456
456
|
}
|
|
457
457
|
|
|
458
|
-
const
|
|
459
|
-
const
|
|
460
|
-
|
|
461
|
-
const treeOffset = this.$el.offset();
|
|
462
|
-
const treeTop = treeOffset ? treeOffset.top : 0;
|
|
463
|
-
|
|
458
|
+
const nodeTop = jQuery(node.element).offset()?.top ?? 0;
|
|
459
|
+
const treeTop = this.$el.offset()?.top ?? 0;
|
|
464
460
|
const top = nodeTop - treeTop;
|
|
465
461
|
|
|
466
462
|
this.scrollHandler.scrollToY(top);
|
|
@@ -508,7 +504,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
508
504
|
|
|
509
505
|
public _triggerEvent(
|
|
510
506
|
eventName: string,
|
|
511
|
-
values?: Record<string, unknown
|
|
507
|
+
values?: Record<string, unknown>,
|
|
512
508
|
): JQuery.Event {
|
|
513
509
|
const event = jQuery.Event(eventName, values);
|
|
514
510
|
this.element.trigger(event);
|
|
@@ -518,18 +514,18 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
518
514
|
public _openNode(
|
|
519
515
|
node: Node,
|
|
520
516
|
slide = true,
|
|
521
|
-
onFinished: OnFinishOpenNode | null
|
|
517
|
+
onFinished: OnFinishOpenNode | null,
|
|
522
518
|
): void {
|
|
523
519
|
const doOpenNode = (
|
|
524
520
|
_node: Node,
|
|
525
521
|
_slide: boolean,
|
|
526
|
-
_onFinished: OnFinishOpenNode | null
|
|
522
|
+
_onFinished: OnFinishOpenNode | null,
|
|
527
523
|
): void => {
|
|
528
524
|
const folderElement = new FolderElement(_node, this);
|
|
529
525
|
folderElement.open(
|
|
530
526
|
_onFinished,
|
|
531
527
|
_slide,
|
|
532
|
-
this.options.animationSpeed
|
|
528
|
+
this.options.animationSpeed,
|
|
533
529
|
);
|
|
534
530
|
};
|
|
535
531
|
|
|
@@ -660,7 +656,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
660
656
|
if (this.options.dragAndDrop) {
|
|
661
657
|
const result = this.dndHandler.mouseDrag(positionInfo);
|
|
662
658
|
|
|
663
|
-
this.scrollHandler.checkScrolling();
|
|
659
|
+
this.scrollHandler.checkScrolling(positionInfo);
|
|
664
660
|
return result;
|
|
665
661
|
} else {
|
|
666
662
|
return false;
|
|
@@ -669,6 +665,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
669
665
|
|
|
670
666
|
protected mouseStop(positionInfo: PositionInfo): boolean {
|
|
671
667
|
if (this.options.dragAndDrop) {
|
|
668
|
+
this.scrollHandler.stopScrolling();
|
|
672
669
|
return this.dndHandler.mouseStop(positionInfo);
|
|
673
670
|
} else {
|
|
674
671
|
return false;
|
|
@@ -755,7 +752,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
755
752
|
this.tree = new this.options.nodeClass(
|
|
756
753
|
null,
|
|
757
754
|
true,
|
|
758
|
-
this.options.nodeClass
|
|
755
|
+
this.options.nodeClass,
|
|
759
756
|
);
|
|
760
757
|
|
|
761
758
|
this.selectNodeHandler.clear();
|
|
@@ -843,7 +840,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
843
840
|
} else {
|
|
844
841
|
this.saveStateHandler.setInitialStateOnDemand(
|
|
845
842
|
state,
|
|
846
|
-
cbFinished
|
|
843
|
+
cbFinished,
|
|
847
844
|
);
|
|
848
845
|
|
|
849
846
|
return true;
|
|
@@ -904,7 +901,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
904
901
|
}
|
|
905
902
|
|
|
906
903
|
private handleClick = (
|
|
907
|
-
e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement
|
|
904
|
+
e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>,
|
|
908
905
|
): void => {
|
|
909
906
|
const clickTarget = this.getClickTarget(e.target);
|
|
910
907
|
|
|
@@ -929,7 +926,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
929
926
|
};
|
|
930
927
|
|
|
931
928
|
private handleDblclick = (
|
|
932
|
-
e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement
|
|
929
|
+
e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>,
|
|
933
930
|
): void => {
|
|
934
931
|
const clickTarget = this.getClickTarget(e.target);
|
|
935
932
|
|
|
@@ -981,7 +978,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
981
978
|
}
|
|
982
979
|
|
|
983
980
|
private handleContextmenu = (
|
|
984
|
-
e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement
|
|
981
|
+
e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>,
|
|
985
982
|
) => {
|
|
986
983
|
const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");
|
|
987
984
|
if ($div.length) {
|
|
@@ -1054,7 +1051,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1054
1051
|
|
|
1055
1052
|
private doSelectNode(
|
|
1056
1053
|
node: Node | null,
|
|
1057
|
-
optionsParam?: SelectNodeOptions
|
|
1054
|
+
optionsParam?: SelectNodeOptions,
|
|
1058
1055
|
): void {
|
|
1059
1056
|
const saveState = (): void => {
|
|
1060
1057
|
if (this.options.saveState) {
|
|
@@ -1157,7 +1154,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1157
1154
|
private doLoadDataFromUrl(
|
|
1158
1155
|
urlInfoParam: string | JQuery.AjaxSettings | null,
|
|
1159
1156
|
parentNode: Node | null,
|
|
1160
|
-
onFinished: HandleFinishedLoading | null
|
|
1157
|
+
onFinished: HandleFinishedLoading | null,
|
|
1161
1158
|
): void {
|
|
1162
1159
|
const urlInfo = urlInfoParam || this.getDataUrlInfo(parentNode);
|
|
1163
1160
|
|
|
@@ -1167,7 +1164,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1167
1164
|
private loadFolderOnDemand(
|
|
1168
1165
|
node: Node,
|
|
1169
1166
|
slide = true,
|
|
1170
|
-
onFinished: OnFinishOpenNode | null
|
|
1167
|
+
onFinished: OnFinishOpenNode | null,
|
|
1171
1168
|
): void {
|
|
1172
1169
|
node.is_loading = true;
|
|
1173
1170
|
|
package/src/version.ts
CHANGED