jqtree 1.7.0 → 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 (68) hide show
  1. package/.github/workflows/ci.yml +2 -10
  2. package/.github/workflows/codeql-analysis.yml +2 -2
  3. package/bower.json +1 -1
  4. package/docs/Gemfile.lock +34 -37
  5. package/docs/_config.yml +1 -1
  6. package/docs/_entries/10_changelog.md +4 -0
  7. package/docs/package.json +7 -7
  8. package/docs/pnpm-lock.yaml +387 -269
  9. package/docs/static/bower.json +2 -2
  10. package/docs/static/bower_components/fontawesome/css/all.min.css +6 -2
  11. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  12. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  13. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  14. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  15. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  16. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  17. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  18. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  19. package/docs/static/bower_components/jquery/dist/jquery.js +813 -1102
  20. package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -2
  21. package/docs/static/documentation.css +104 -222
  22. package/docs/tree.jquery.js +3 -3
  23. package/lib/dragAndDropHandler.js +21 -10
  24. package/lib/elementsRenderer.js +25 -15
  25. package/lib/mouse.widget.js +12 -1
  26. package/lib/node.js +13 -10
  27. package/lib/nodeElement.js +19 -12
  28. package/lib/saveStateHandler.js +1 -1
  29. package/lib/scrollHandler.js +7 -3
  30. package/lib/selectNodeHandler.js +1 -1
  31. package/lib/simple.widget.js +2 -0
  32. package/lib/test/jqTree/accessibility.test.js +37 -0
  33. package/lib/test/jqTree/events.test.js +73 -77
  34. package/lib/test/node.test.js +7 -4
  35. package/lib/version.js +1 -1
  36. package/package.json +36 -40
  37. package/src/dragAndDropHandler.ts +24 -10
  38. package/src/elementsRenderer.ts +49 -42
  39. package/src/jqtreeOptions.ts +3 -3
  40. package/src/mouse.widget.ts +12 -0
  41. package/src/node.ts +10 -5
  42. package/src/nodeElement.ts +27 -21
  43. package/src/saveStateHandler.ts +1 -1
  44. package/src/scrollHandler.ts +6 -2
  45. package/src/selectNodeHandler.ts +1 -1
  46. package/src/simple.widget.ts +2 -0
  47. package/src/test/jqTree/accessibility.test.ts +25 -0
  48. package/src/test/jqTree/events.test.ts +79 -93
  49. package/src/test/jqTree/methods.test.ts +1 -1
  50. package/src/test/node.test.ts +6 -4
  51. package/src/test/nodeUtil.test.ts +1 -1
  52. package/src/tree.jquery.ts +1 -1
  53. package/src/version.ts +1 -1
  54. package/tree.jquery.debug.js +100 -54
  55. package/tree.jquery.debug.js.map +1 -1
  56. package/tree.jquery.js +3 -3
  57. package/tree.jquery.js.map +1 -1
  58. package/tsconfig.json +1 -0
  59. package/.tool-versions +0 -1
  60. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
  61. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -3717
  62. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  63. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
  64. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -801
  65. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  66. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
  67. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -5028
  68. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
@@ -1,6 +1,7 @@
1
1
  import getGiven from "givens";
2
2
  import { rest } from "msw";
3
3
  import { setupServer } from "msw/node";
4
+ import { waitFor } from "@testing-library/dom";
4
5
  import "../../tree.jquery";
5
6
  import exampleData from "../support/exampleData";
6
7
  import { titleSpan } from "../support/testUtil";
@@ -41,17 +42,15 @@ describe("tree.click", () => {
41
42
  given.$tree.tree({ data: exampleData });
42
43
  });
43
44
 
44
- it("fires tree.click", () =>
45
- new Promise<void>((done) => {
46
- given.$tree.on("tree.click", (e: unknown) => {
47
- const treeClickEvent = e as ClickNodeEvent;
45
+ it("fires tree.click", () => {
46
+ const onClick = jest.fn();
47
+ given.$tree.on("tree.click", onClick);
48
48
 
49
- expect(treeClickEvent.node).toBe(given.node1);
50
- done();
51
- });
52
-
53
- given.titleSpan.trigger("click");
54
- }));
49
+ given.titleSpan.trigger("click");
50
+ expect(onClick).toHaveBeenCalledWith(
51
+ expect.objectContaining({ node: given.node1 })
52
+ );
53
+ });
55
54
  });
56
55
 
57
56
  describe("tree.contextmenu", () => {
@@ -70,17 +69,15 @@ describe("tree.contextmenu", () => {
70
69
  given.$tree.tree({ data: exampleData });
71
70
  });
72
71
 
73
- it("fires tree.contextmenu", () =>
74
- new Promise<void>((done) => {
75
- given.$tree.on("tree.contextmenu", (e: unknown) => {
76
- const treeClickEvent = e as ClickNodeEvent;
72
+ it("fires tree.contextmenu", () => {
73
+ const onContextMenu = jest.fn();
74
+ given.$tree.on("tree.contextmenu", onContextMenu);
77
75
 
78
- expect(treeClickEvent.node).toBe(given.node1);
79
- done();
80
- });
81
-
82
- given.titleSpan.contextmenu();
83
- }));
76
+ given.titleSpan.trigger("contextmenu");
77
+ expect(onContextMenu).toHaveBeenCalledWith(
78
+ expect.objectContaining({ node: given.node1 })
79
+ );
80
+ });
84
81
  });
85
82
 
86
83
  describe("tree.dblclick", () => {
@@ -99,17 +96,15 @@ describe("tree.dblclick", () => {
99
96
  given.$tree.tree({ data: exampleData });
100
97
  });
101
98
 
102
- it("fires tree.dblclick", () =>
103
- new Promise<void>((done) => {
104
- given.$tree.on("tree.dblclick", (e: unknown) => {
105
- const treeClickEvent = e as ClickNodeEvent;
99
+ it("fires tree.dblclick", () => {
100
+ const onDoubleClick = jest.fn();
101
+ given.$tree.on("tree.dblclick", onDoubleClick);
106
102
 
107
- expect(treeClickEvent.node).toBe(given.node1);
108
- done();
109
- });
110
-
111
- given.titleSpan.trigger("dblclick");
112
- }));
103
+ given.titleSpan.trigger("dblclick");
104
+ expect(onDoubleClick).toHaveBeenCalledWith(
105
+ expect.objectContaining({ node: given.node1 })
106
+ );
107
+ });
113
108
  });
114
109
 
115
110
  describe("tree.init", () => {
@@ -120,22 +115,17 @@ describe("tree.init", () => {
120
115
  given("$tree", () => $("#tree1"));
121
116
 
122
117
  context("with json data", () => {
123
- it("is called", () =>
124
- new Promise<void>((done) => {
125
- given.$tree.on("tree.init", () => {
126
- expect(
127
- given.$tree.tree("getNodeByName", "node2")
128
- ).toMatchObject({
129
- id: 124,
130
- name: "node2",
131
- });
132
- done();
133
- });
134
-
135
- given.$tree.tree({
136
- data: exampleData,
137
- });
138
- }));
118
+ it("is called", () => {
119
+ const onInit = jest.fn();
120
+ given.$tree.on("tree.init", onInit);
121
+
122
+ given.$tree.tree({
123
+ data: exampleData,
124
+ });
125
+
126
+ // eslint-disable-next-line jest/prefer-called-with
127
+ expect(onInit).toHaveBeenCalled();
128
+ });
139
129
  });
140
130
 
141
131
  context("with data loaded from an url", () => {
@@ -147,20 +137,17 @@ describe("tree.init", () => {
147
137
  );
148
138
  });
149
139
 
150
- it("is called", () =>
151
- new Promise<void>((done) => {
152
- given.$tree.on("tree.init", () => {
153
- expect(
154
- given.$tree.tree("getNodeByName", "node2")
155
- ).toMatchObject({
156
- id: 124,
157
- name: "node2",
158
- });
159
- done();
160
- });
161
-
162
- given.$tree.tree({ dataUrl: "/tree/" });
163
- }));
140
+ it("is called", async () => {
141
+ const onInit = jest.fn();
142
+ given.$tree.on("tree.init", onInit);
143
+
144
+ given.$tree.tree({ dataUrl: "/tree/" });
145
+
146
+ await waitFor(() => {
147
+ // eslint-disable-next-line jest/prefer-called-with
148
+ expect(onInit).toHaveBeenCalled();
149
+ });
150
+ });
164
151
  });
165
152
  });
166
153
 
@@ -172,16 +159,15 @@ describe("tree.load_data", () => {
172
159
  given("$tree", () => $("#tree1"));
173
160
 
174
161
  context("when the tree is initialized with data", () => {
175
- it("fires tree.load_data", () =>
176
- new Promise<void>((resolve) => {
177
- given.$tree.on("tree.load_data", (e: any) => {
178
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
179
- expect(e.tree_data).toEqual(exampleData);
180
- resolve();
181
- });
182
-
183
- given.$tree.tree({ data: exampleData });
184
- }));
162
+ it("fires tree.load_data", () => {
163
+ const onLoadData = jest.fn();
164
+ given.$tree.on("tree.load_data", onLoadData);
165
+
166
+ given.$tree.tree({ data: exampleData });
167
+ expect(onLoadData).toHaveBeenCalledWith(
168
+ expect.objectContaining({ tree_data: exampleData })
169
+ );
170
+ });
185
171
  });
186
172
  });
187
173
 
@@ -203,35 +189,35 @@ describe("tree.select", () => {
203
189
  });
204
190
  });
205
191
 
206
- it("fires tree.click", () =>
207
- new Promise<void>((done) => {
208
- given.$tree.on("tree.select", (e: unknown) => {
209
- const treeClickEvent = e as ClickNodeEvent;
210
-
211
- expect(treeClickEvent.node).toBe(given.node1);
212
- expect(treeClickEvent.deselected_node).toBeNull();
213
- done();
214
- });
215
-
216
- given.titleSpan.trigger("click");
217
- }));
192
+ it("fires tree.select", () => {
193
+ const onSelect = jest.fn();
194
+ given.$tree.on("tree.select", onSelect);
195
+
196
+ given.titleSpan.trigger("click");
197
+ expect(onSelect).toHaveBeenCalledWith(
198
+ expect.objectContaining({
199
+ node: given.node1,
200
+ deselected_node: null,
201
+ })
202
+ );
203
+ });
218
204
 
219
205
  context("when the node was selected", () => {
220
206
  beforeEach(() => {
221
207
  given.$tree.tree("selectNode", given.node1);
222
208
  });
223
209
 
224
- it("fires tree.select with node is null", () =>
225
- new Promise<void>((done) => {
226
- given.$tree.on("tree.select", (e: unknown) => {
227
- const treeClickEvent = e as ClickNodeEvent;
228
-
229
- expect(treeClickEvent.node).toBeNull();
230
- expect(treeClickEvent.previous_node).toBe(given.node1);
231
- done();
232
- });
210
+ it("fires tree.select with node is null", () => {
211
+ const onSelect = jest.fn();
212
+ given.$tree.on("tree.select", onSelect);
233
213
 
234
- given.titleSpan.trigger("click");
235
- }));
214
+ given.titleSpan.trigger("click");
215
+ expect(onSelect).toHaveBeenCalledWith(
216
+ expect.objectContaining({
217
+ node: null,
218
+ previous_node: given.node1,
219
+ })
220
+ );
221
+ });
236
222
  });
237
223
  });
@@ -984,7 +984,7 @@ describe("refresh", () => {
984
984
 
985
985
  it("rerenders the tree", () => {
986
986
  const tree = given.$tree.tree("getTree");
987
- tree.children[0].name = "node1a";
987
+ (tree.children[0] as INode).name = "node1a";
988
988
 
989
989
  expect(given.$tree).toHaveTreeStructure([
990
990
  expect.objectContaining({ name: "node1" }),
@@ -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", () => {
@@ -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];
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.7.0";
1
+ const version = "1.7.1";
2
2
 
3
3
  export default version;