jqtree 1.6.3 → 1.7.1

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 (97) hide show
  1. package/.github/workflows/ci.yml +15 -21
  2. package/.github/workflows/codeql-analysis.yml +2 -2
  3. package/README.md +1 -1
  4. package/bower.json +10 -3
  5. package/config/production +2 -2
  6. package/config/{rollup.config.js → rollup.config.mjs} +3 -8
  7. package/docs/Gemfile.lock +34 -37
  8. package/docs/_config.yml +1 -1
  9. package/docs/_entries/10_changelog.md +13 -0
  10. package/docs/_entries/93_getnextnode.md +4 -1
  11. package/docs/_entries/{95_getpreviousnode.md → 95_getnextvisiblenode.md} +1 -1
  12. package/docs/_entries/96_getpreviousnode.md +0 -0
  13. package/docs/_entries/98_getpreviousvisiblenode.md +14 -0
  14. package/docs/package.json +7 -7
  15. package/docs/pnpm-lock.yaml +413 -265
  16. package/docs/static/bower.json +2 -2
  17. package/docs/static/bower_components/fontawesome/css/all.min.css +6 -2
  18. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  19. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  20. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  21. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  22. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  23. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  24. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  25. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  26. package/docs/static/bower_components/jquery/dist/jquery.js +944 -1121
  27. package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -2
  28. package/docs/static/documentation.css +181 -159
  29. package/docs/static/example.css +0 -1
  30. package/docs/tree.jquery.js +3 -3
  31. package/lib/dataLoader.js +5 -31
  32. package/lib/dragAndDropHandler.js +40 -142
  33. package/lib/elementsRenderer.js +52 -72
  34. package/lib/keyHandler.js +8 -32
  35. package/lib/mouse.widget.js +24 -74
  36. package/lib/node.js +72 -134
  37. package/lib/nodeElement.js +24 -84
  38. package/lib/playwright/coverage.js +58 -97
  39. package/lib/playwright/playwright.test.js +148 -210
  40. package/lib/playwright/testUtils.js +116 -182
  41. package/lib/saveStateHandler.js +13 -62
  42. package/lib/scrollHandler.js +24 -77
  43. package/lib/selectNodeHandler.js +6 -25
  44. package/lib/simple.widget.js +20 -53
  45. package/lib/test/jqTree/accessibility.test.js +37 -0
  46. package/lib/test/jqTree/create.test.js +0 -4
  47. package/lib/test/jqTree/events.test.js +73 -84
  48. package/lib/test/jqTree/keyboard.test.js +0 -6
  49. package/lib/test/jqTree/loadOnDemand.test.js +84 -121
  50. package/lib/test/jqTree/methods.test.js +107 -150
  51. package/lib/test/jqTree/options.test.js +32 -54
  52. package/lib/test/node.test.js +134 -76
  53. package/lib/test/nodeUtil.test.js +0 -1
  54. package/lib/test/support/jqTreeMatchers.js +4 -9
  55. package/lib/test/support/setupTests.js +0 -4
  56. package/lib/test/support/testUtil.js +2 -11
  57. package/lib/test/support/treeStructure.js +0 -6
  58. package/lib/test/util.test.js +0 -1
  59. package/lib/tree.jquery.js +28 -239
  60. package/lib/util.js +0 -6
  61. package/lib/version.js +1 -1
  62. package/package.json +44 -47
  63. package/src/dragAndDropHandler.ts +24 -10
  64. package/src/elementsRenderer.ts +49 -42
  65. package/src/jqtreeOptions.ts +3 -3
  66. package/src/keyHandler.ts +3 -3
  67. package/src/mouse.widget.ts +12 -0
  68. package/src/node.ts +52 -16
  69. package/src/nodeElement.ts +27 -21
  70. package/src/saveStateHandler.ts +1 -1
  71. package/src/scrollHandler.ts +6 -2
  72. package/src/selectNodeHandler.ts +1 -1
  73. package/src/simple.widget.ts +2 -0
  74. package/src/test/.eslintrc +3 -1
  75. package/src/test/jqTree/accessibility.test.ts +25 -0
  76. package/src/test/jqTree/events.test.ts +79 -93
  77. package/src/test/jqTree/methods.test.ts +1 -1
  78. package/src/test/node.test.ts +152 -58
  79. package/src/test/nodeUtil.test.ts +1 -1
  80. package/src/tree.jquery.ts +7 -6
  81. package/src/version.ts +1 -1
  82. package/tree.jquery.debug.js +297 -904
  83. package/tree.jquery.debug.js.map +1 -1
  84. package/tree.jquery.js +3 -3
  85. package/tree.jquery.js.map +1 -1
  86. package/tsconfig.json +1 -0
  87. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
  88. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -3717
  89. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  90. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
  91. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -801
  92. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  93. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
  94. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -5028
  95. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
  96. /package/docs/_entries/{96_getprevioussibling.md → 97_getprevioussibling.md} +0 -0
  97. /package/docs/_entries/{97_parent.md → 99_parent.md} +0 -0
@@ -164,7 +164,7 @@ describe("addChild", () => {
164
164
  });
165
165
 
166
166
  it("sets the parent of the child", () => {
167
- expect(given.node.children[0].parent).toEqual(given.node);
167
+ expect(given.node.children[0]?.parent).toEqual(given.node);
168
168
  });
169
169
  });
170
170
 
@@ -538,14 +538,16 @@ describe("getLastChild", () => {
538
538
  context("when its last child is open and has children", () => {
539
539
  beforeEach(() => {
540
540
  const child2 = given.node.children[1];
541
- child2.append("child2a");
542
- child2.append("child2b");
541
+ child2?.append("child2a");
542
+ child2?.append("child2b");
543
543
  });
544
544
 
545
545
  context("and the last child is open", () => {
546
546
  beforeEach(() => {
547
547
  const child2 = given.node.children[1];
548
- child2.is_open = true;
548
+ if (child2) {
549
+ child2.is_open = true;
550
+ }
549
551
  });
550
552
 
551
553
  it("returns the last child of that child", () => {
@@ -568,52 +570,47 @@ describe("getLastChild", () => {
568
570
 
569
571
  describe("getNextNode", () => {
570
572
  interface Vars {
571
- includeChildren: boolean;
572
573
  fromNode: Node;
573
- nextNode: Node | null;
574
574
  tree: Node;
575
575
  }
576
576
  const given = getGiven<Vars>();
577
577
  given("tree", () => new Node().loadFromData(exampleData));
578
- given("nextNode", () => given.fromNode.getNextNode(given.includeChildren));
579
578
 
580
- context("with includeChildren is true", () => {
581
- given("includeChildren", () => true);
579
+ context("with a parent node", () => {
580
+ given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
582
581
 
583
- context("with a parent node", () => {
584
- given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
585
-
586
- context("when the parent node is closed", () => {
587
- it("returns the next sibling", () => {
588
- expect(given.nextNode).toMatchObject({ name: "node2" });
582
+ context("when the parent node is closed", () => {
583
+ it("returns the first child", () => {
584
+ expect(given.fromNode.getNextNode()).toMatchObject({
585
+ name: "child1",
589
586
  });
590
587
  });
588
+ });
591
589
 
592
- context("when the parent node is open", () => {
593
- beforeEach(() => {
594
- given.fromNode.is_open = true;
595
- });
590
+ context("when the parent node is open", () => {
591
+ beforeEach(() => {
592
+ given.fromNode.is_open = true;
593
+ });
596
594
 
597
- it("returns the first child", () => {
598
- expect(given.nextNode).toMatchObject({ name: "child1" });
595
+ it("returns the first child", () => {
596
+ expect(given.fromNode.getNextNode()).toMatchObject({
597
+ name: "child1",
599
598
  });
600
599
  });
601
600
  });
601
+ });
602
602
 
603
- context("with the node is the last child", () => {
604
- given("fromNode", () =>
605
- given.tree.getNodeByNameMustExist("child2")
606
- );
603
+ context("with the node is the last child", () => {
604
+ given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
607
605
 
608
- it("returns the next sibling of the parent", () => {
609
- expect(given.nextNode).toMatchObject({ name: "node2" });
606
+ it("returns the next sibling of the parent", () => {
607
+ expect(given.fromNode.getNextNode()).toMatchObject({
608
+ name: "node2",
610
609
  });
611
610
  });
612
611
  });
613
612
 
614
613
  context("with includeChildren is false", () => {
615
- given("includeChildren", () => false);
616
-
617
614
  context("with an open parent node", () => {
618
615
  given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
619
616
 
@@ -622,10 +619,63 @@ describe("getNextNode", () => {
622
619
  });
623
620
 
624
621
  it("returns the next sibling", () => {
625
- expect(given.nextNode).toMatchObject({ name: "node2" });
622
+ expect(given.fromNode.getNextNode(false)).toMatchObject({
623
+ name: "node2",
624
+ });
625
+ });
626
+ });
627
+ });
628
+ });
629
+
630
+ describe("getNextVisibleNode", () => {
631
+ interface Vars {
632
+ fromNode: Node;
633
+ tree: Node;
634
+ }
635
+ const given = getGiven<Vars>();
636
+ given("tree", () => new Node().loadFromData(exampleData));
637
+
638
+ context("with a parent node", () => {
639
+ given("fromNode", () => given.tree.getNodeByNameMustExist("node1"));
640
+
641
+ context("when the parent node is closed", () => {
642
+ it("returns the next sibling", () => {
643
+ expect(given.fromNode.getNextVisibleNode()).toMatchObject({
644
+ name: "node2",
645
+ });
646
+ });
647
+ });
648
+
649
+ context("when the parent node is open", () => {
650
+ beforeEach(() => {
651
+ given.fromNode.is_open = true;
652
+ });
653
+
654
+ it("returns the first child", () => {
655
+ expect(given.fromNode.getNextVisibleNode()).toMatchObject({
656
+ name: "child1",
657
+ });
626
658
  });
627
659
  });
628
660
  });
661
+
662
+ context("with the node is the last child", () => {
663
+ given("fromNode", () => given.tree.getNodeByNameMustExist("child2"));
664
+
665
+ it("returns the next sibling of the parent", () => {
666
+ expect(given.fromNode.getNextVisibleNode()).toMatchObject({
667
+ name: "node2",
668
+ });
669
+ });
670
+ });
671
+
672
+ context("with the tree node", () => {
673
+ given("fromNode", () => given.tree);
674
+
675
+ it("returns null", () => {
676
+ expect(given.fromNode.getNextVisibleNode()).toBeNull();
677
+ });
678
+ });
629
679
  });
630
680
 
631
681
  describe("getNextSibling", () => {
@@ -766,48 +816,92 @@ describe("getParent", () => {
766
816
 
767
817
  describe("getPreviousNode", () => {
768
818
  interface Vars {
769
- node2: Node;
770
- node3: Node;
771
819
  tree: Node;
772
820
  }
773
821
  const given = getGiven<Vars>();
774
- given("node2", () => given.tree.getNodeByNameMustExist("node2"));
775
- given("node3", () => given.tree.getNodeByNameMustExist("node3"));
776
822
  given("tree", () => new Node().loadFromData(exampleData));
777
823
 
778
- context("with a tree", () => {
779
- it("returns null", () => {
780
- expect(given.tree.getPreviousNode()).toBeNull();
824
+ it("returns null with a tree node", () => {
825
+ expect(given.tree.getPreviousNode()).toBeNull();
826
+ });
827
+
828
+ it("returns the last child of the previous sibling when the previous node is closed and has children", () => {
829
+ given.tree.getNodeByNameMustExist("node2").is_open = false;
830
+ const node2 = given.tree.getNodeByNameMustExist("node2");
831
+
832
+ expect(node2.getPreviousNode()).toMatchObject({
833
+ name: "child2",
781
834
  });
782
835
  });
783
836
 
784
- context("when the previous sibling has children", () => {
785
- context("when the previous node is closed", () => {
786
- it("returns the previous sibling", () => {
787
- expect(given.node2.getPreviousNode()).toMatchObject({
788
- name: "node1",
789
- });
790
- });
837
+ it("returns the last child of the previous sibling when the previous node is open and has children", () => {
838
+ given.tree.getNodeByNameMustExist("node2").is_open = true;
839
+ const node2 = given.tree.getNodeByNameMustExist("node2");
840
+
841
+ expect(node2.getPreviousNode()).toMatchObject({
842
+ name: "child2",
791
843
  });
844
+ });
792
845
 
793
- context("when the previous node is open", () => {
794
- beforeEach(() => {
795
- given.tree.getNodeByNameMustExist("node1").is_open = true;
796
- });
846
+ it("returns the first child if a node is the second child", () => {
847
+ const child2 = given.tree.getNodeByNameMustExist("child2");
797
848
 
798
- it("returns the last child of the previous sibling", () => {
799
- expect(given.node2.getPreviousNode()).toMatchObject({
800
- name: "child2",
801
- });
802
- });
849
+ expect(child2.getPreviousNode()).toMatchObject({
850
+ name: "child1",
803
851
  });
804
852
  });
805
853
 
806
- context("with a node that is the first child", () => {
807
- it("returns the parent", () => {
808
- expect(given.node3.getPreviousNode()).toMatchObject({
809
- name: "node2",
810
- });
854
+ it("returns the parent with a node that is the first child", () => {
855
+ const node3 = given.tree.getNodeByNameMustExist("node3");
856
+
857
+ expect(node3.getPreviousNode()).toMatchObject({
858
+ name: "node2",
859
+ });
860
+ });
861
+ });
862
+
863
+ describe("getPreviousVisibleNode", () => {
864
+ interface Vars {
865
+ tree: Node;
866
+ }
867
+ const given = getGiven<Vars>();
868
+ given("tree", () => new Node().loadFromData(exampleData));
869
+
870
+ it("returns null with a tree node", () => {
871
+ expect(given.tree.getPreviousVisibleNode()).toBeNull();
872
+ });
873
+
874
+ it("returns the previous sibling when the previous sibling is closed and has children", () => {
875
+ given.tree.getNodeByNameMustExist("node2").is_open = false;
876
+ const node2 = given.tree.getNodeByNameMustExist("node2");
877
+
878
+ expect(node2.getPreviousVisibleNode()).toMatchObject({
879
+ name: "node1",
880
+ });
881
+ });
882
+
883
+ it("returns the last child of the previous sibling when the previous sibling is open and has children", () => {
884
+ given.tree.getNodeByNameMustExist("node1").is_open = true;
885
+ const node2 = given.tree.getNodeByNameMustExist("node2");
886
+
887
+ expect(node2.getPreviousVisibleNode()).toMatchObject({
888
+ name: "child2",
889
+ });
890
+ });
891
+
892
+ it("returns the first child if a node is the second child", () => {
893
+ const child2 = given.tree.getNodeByNameMustExist("child2");
894
+
895
+ expect(child2.getPreviousVisibleNode()).toMatchObject({
896
+ name: "child1",
897
+ });
898
+ });
899
+
900
+ it("returns the parent when a node is the first child", () => {
901
+ const node3 = given.tree.getNodeByNameMustExist("node3");
902
+
903
+ expect(node3.getPreviousVisibleNode()).toMatchObject({
904
+ name: "node2",
811
905
  });
812
906
  });
813
907
  });
@@ -24,7 +24,7 @@ describe("getPositionName", () => {
24
24
 
25
25
  context("with an unknown position", () => {
26
26
  it("returns an empty string", () => {
27
- expect(getPositionName(10)).toBe("");
27
+ expect(getPositionName(10 as Position)).toBe("");
28
28
  });
29
29
  });
30
30
  });
@@ -777,7 +777,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
777
777
  // Set initial state, either by restoring the state or auto-opening nodes
778
778
  // result: must load nodes on demand?
779
779
  private setInitialState(): boolean {
780
- const restoreState = (): boolean[] => {
780
+ const restoreState = (): [boolean, boolean] => {
781
781
  // result: is state restored, must load on demand?
782
782
  if (!this.options.saveState) {
783
783
  return [false, false];
@@ -1118,11 +1118,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1118
1118
  }
1119
1119
 
1120
1120
  private doLoadData(data: NodeData[] | null, parentNode: Node | null): void {
1121
- if (!data) {
1122
- return;
1123
- } else {
1124
- this._triggerEvent("tree.load_data", { tree_data: data });
1125
-
1121
+ if (data) {
1126
1122
  if (parentNode) {
1127
1123
  this.deselectNodes(parentNode);
1128
1124
  this.loadSubtree(data, parentNode);
@@ -1134,6 +1130,11 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1134
1130
  this.dndHandler.refresh();
1135
1131
  }
1136
1132
  }
1133
+
1134
+ this._triggerEvent("tree.load_data", {
1135
+ tree_data: data,
1136
+ parent_node: parentNode,
1137
+ });
1137
1138
  }
1138
1139
 
1139
1140
  private deselectNodes(parentNode: Node): void {
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.6.2";
1
+ const version = "1.7.1";
2
2
 
3
3
  export default version;