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.
Files changed (94) hide show
  1. package/.eslintrc +5 -1
  2. package/bower.json +1 -1
  3. package/config/babel.config.json +1 -1
  4. package/config/production +2 -0
  5. package/devserver/devserver_scroll.js +8 -0
  6. package/devserver/test_scroll.html +28 -0
  7. package/devserver/test_scroll_container.html +39 -0
  8. package/docs/_config.yml +1 -1
  9. package/docs/_entries/general/changelog.md +12 -0
  10. package/docs/package.json +1 -1
  11. package/docs/pnpm-lock.yaml +30 -30
  12. package/package.json +31 -27
  13. package/src/dataLoader.ts +44 -19
  14. package/src/dragAndDropHandler/dragElement.ts +42 -0
  15. package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
  16. package/src/dragAndDropHandler/index.ts +470 -0
  17. package/src/dragAndDropHandler/types.ts +12 -0
  18. package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
  19. package/src/elementsRenderer.ts +75 -40
  20. package/src/jqtreeMethodTypes.ts +40 -0
  21. package/src/jqtreeOptions.ts +43 -25
  22. package/src/keyHandler.ts +59 -38
  23. package/src/mouse.widget.ts +3 -3
  24. package/src/mouseWidgetTypes.ts +6 -0
  25. package/src/node.ts +32 -48
  26. package/src/nodeElement/borderDropHint.ts +32 -0
  27. package/src/nodeElement/folderElement.ts +133 -0
  28. package/src/nodeElement/ghostDropHint.ts +68 -0
  29. package/src/nodeElement/index.ts +101 -0
  30. package/src/nodeUtils.ts +10 -0
  31. package/src/playwright/coverage.ts +1 -4
  32. package/src/playwright/playwright.test.ts +203 -15
  33. package/src/playwright/testUtils.ts +23 -15
  34. package/src/saveStateHandler.ts +75 -26
  35. package/src/scrollHandler/containerScrollParent.ts +177 -0
  36. package/src/scrollHandler/createScrollParent.ts +50 -0
  37. package/src/scrollHandler/documentScrollParent.ts +182 -0
  38. package/src/scrollHandler/types.ts +7 -0
  39. package/src/scrollHandler.ts +36 -248
  40. package/src/selectNodeHandler.ts +10 -16
  41. package/src/test/jqTree/keyboard.test.ts +18 -23
  42. package/src/test/jqTree/loadOnDemand.test.ts +2 -3
  43. package/src/test/jqTree/methods.test.ts +33 -4
  44. package/src/test/jqTree/options.test.ts +15 -4
  45. package/src/test/node.test.ts +85 -26
  46. package/src/test/nodeUtils.test.ts +21 -0
  47. package/src/tree.jquery.ts +262 -83
  48. package/src/util.ts +3 -0
  49. package/src/version.ts +1 -1
  50. package/tree.jquery.debug.js +1922 -2608
  51. package/tree.jquery.debug.js.map +1 -1
  52. package/tree.jquery.js +2 -2
  53. package/tree.jquery.js.map +1 -1
  54. package/lib/dataLoader.js +0 -124
  55. package/lib/dragAndDropHandler.js +0 -596
  56. package/lib/elementsRenderer.js +0 -268
  57. package/lib/jqtreeOptions.js +0 -1
  58. package/lib/keyHandler.js +0 -115
  59. package/lib/mouse.widget.js +0 -256
  60. package/lib/node.js +0 -717
  61. package/lib/nodeElement.js +0 -277
  62. package/lib/playwright/coverage.js +0 -96
  63. package/lib/playwright/playwright.test.js +0 -228
  64. package/lib/playwright/testUtils.js +0 -184
  65. package/lib/saveStateHandler.js +0 -278
  66. package/lib/scrollHandler.js +0 -250
  67. package/lib/selectNodeHandler.js +0 -129
  68. package/lib/simple.widget.js +0 -159
  69. package/lib/test/global.d.js +0 -3
  70. package/lib/test/jqTree/accessibility.test.js +0 -37
  71. package/lib/test/jqTree/create.test.js +0 -48
  72. package/lib/test/jqTree/events.test.js +0 -210
  73. package/lib/test/jqTree/keyboard.test.js +0 -225
  74. package/lib/test/jqTree/loadOnDemand.test.js +0 -218
  75. package/lib/test/jqTree/methods.test.js +0 -1347
  76. package/lib/test/jqTree/options.test.js +0 -548
  77. package/lib/test/node.test.js +0 -1160
  78. package/lib/test/nodeUtil.test.js +0 -27
  79. package/lib/test/support/exampleData.js +0 -36
  80. package/lib/test/support/jqTreeMatchers.js +0 -70
  81. package/lib/test/support/matchers.d.js +0 -1
  82. package/lib/test/support/setupTests.js +0 -7
  83. package/lib/test/support/testUtil.js +0 -32
  84. package/lib/test/support/treeStructure.js +0 -39
  85. package/lib/test/util.test.js +0 -26
  86. package/lib/tree.jquery.d.js +0 -1
  87. package/lib/tree.jquery.js +0 -1106
  88. package/lib/types.js +0 -1
  89. package/lib/typings.d.js +0 -2
  90. package/lib/util.js +0 -18
  91. package/lib/version.js +0 -9
  92. package/src/dragAndDropHandler.ts +0 -719
  93. package/src/nodeElement.ts +0 -272
  94. package/src/types.ts +0 -19
@@ -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).not.toHaveProperty("id");
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
- expect(given.tree.children).toEqual([
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(given.child2, given.child1, Position.Before)
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
+ });