jqtree 1.7.4 → 1.8.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 +5 -1
- package/bower.json +1 -1
- package/config/babel.config.json +1 -1
- package/config/production +2 -0
- package/devserver/devserver_scroll.js +8 -0
- package/devserver/test_scroll.html +28 -0
- package/devserver/test_scroll_container.html +39 -0
- package/docs/_config.yml +1 -1
- package/docs/_entries/general/changelog.md +12 -0
- package/docs/package.json +1 -1
- package/docs/pnpm-lock.yaml +30 -30
- package/package.json +31 -27
- package/src/dataLoader.ts +44 -19
- package/src/dragAndDropHandler/dragElement.ts +42 -0
- package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
- package/src/dragAndDropHandler/index.ts +470 -0
- package/src/dragAndDropHandler/types.ts +12 -0
- package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
- package/src/elementsRenderer.ts +75 -40
- package/src/jqtreeMethodTypes.ts +40 -0
- package/src/jqtreeOptions.ts +43 -25
- package/src/keyHandler.ts +59 -38
- package/src/mouse.widget.ts +3 -3
- package/src/mouseWidgetTypes.ts +6 -0
- package/src/node.ts +32 -48
- package/src/nodeElement/borderDropHint.ts +32 -0
- package/src/nodeElement/folderElement.ts +133 -0
- package/src/nodeElement/ghostDropHint.ts +68 -0
- package/src/nodeElement/index.ts +101 -0
- package/src/nodeUtils.ts +10 -0
- package/src/playwright/coverage.ts +1 -4
- package/src/playwright/playwright.test.ts +203 -15
- package/src/playwright/testUtils.ts +23 -15
- package/src/saveStateHandler.ts +75 -26
- 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 +36 -248
- package/src/selectNodeHandler.ts +10 -16
- package/src/test/jqTree/keyboard.test.ts +18 -23
- package/src/test/jqTree/loadOnDemand.test.ts +2 -3
- package/src/test/jqTree/methods.test.ts +33 -4
- package/src/test/jqTree/options.test.ts +15 -4
- package/src/test/node.test.ts +85 -26
- package/src/test/nodeUtils.test.ts +21 -0
- package/src/tree.jquery.ts +262 -83
- package/src/util.ts +3 -0
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +1922 -2608
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/lib/dataLoader.js +0 -124
- package/lib/dragAndDropHandler.js +0 -596
- package/lib/elementsRenderer.js +0 -268
- package/lib/jqtreeOptions.js +0 -1
- package/lib/keyHandler.js +0 -115
- package/lib/mouse.widget.js +0 -256
- package/lib/node.js +0 -717
- package/lib/nodeElement.js +0 -277
- package/lib/playwright/coverage.js +0 -96
- package/lib/playwright/playwright.test.js +0 -228
- package/lib/playwright/testUtils.js +0 -184
- package/lib/saveStateHandler.js +0 -278
- package/lib/scrollHandler.js +0 -250
- package/lib/selectNodeHandler.js +0 -129
- package/lib/simple.widget.js +0 -159
- package/lib/test/global.d.js +0 -3
- package/lib/test/jqTree/accessibility.test.js +0 -37
- package/lib/test/jqTree/create.test.js +0 -48
- package/lib/test/jqTree/events.test.js +0 -210
- package/lib/test/jqTree/keyboard.test.js +0 -225
- package/lib/test/jqTree/loadOnDemand.test.js +0 -218
- package/lib/test/jqTree/methods.test.js +0 -1347
- package/lib/test/jqTree/options.test.js +0 -548
- package/lib/test/node.test.js +0 -1160
- package/lib/test/nodeUtil.test.js +0 -27
- package/lib/test/support/exampleData.js +0 -36
- package/lib/test/support/jqTreeMatchers.js +0 -70
- package/lib/test/support/matchers.d.js +0 -1
- package/lib/test/support/setupTests.js +0 -7
- package/lib/test/support/testUtil.js +0 -32
- package/lib/test/support/treeStructure.js +0 -39
- package/lib/test/util.test.js +0 -26
- package/lib/tree.jquery.d.js +0 -1
- package/lib/tree.jquery.js +0 -1106
- package/lib/types.js +0 -1
- package/lib/typings.d.js +0 -2
- package/lib/util.js +0 -18
- package/lib/version.js +0 -9
- package/src/dragAndDropHandler.ts +0 -719
- package/src/nodeElement.ts +0 -272
- package/src/types.ts +0 -19
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", () => {
|
|
@@ -349,7 +349,11 @@ describe("constructor", () => {
|
|
|
349
349
|
children: [],
|
|
350
350
|
parent: null,
|
|
351
351
|
});
|
|
352
|
-
expect(given.node).
|
|
352
|
+
expect(given.node.id).toBeUndefined();
|
|
353
|
+
});
|
|
354
|
+
|
|
355
|
+
it("sets isEmptyFolder to false", () => {
|
|
356
|
+
expect(given.node.isEmptyFolder).toBe(false);
|
|
353
357
|
});
|
|
354
358
|
});
|
|
355
359
|
|
|
@@ -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
|
+
});
|