jqtree 1.7.0 → 1.7.2

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 (99) hide show
  1. package/.github/workflows/ci.yml +2 -15
  2. package/.github/workflows/codeql-analysis.yml +2 -2
  3. package/.github/workflows/size.yml +24 -0
  4. package/README.md +1 -1
  5. package/bower.json +1 -1
  6. package/docs/Gemfile.lock +39 -40
  7. package/docs/_config.yml +1 -1
  8. package/docs/_entries/03_features.md +1 -1
  9. package/docs/_entries/10_changelog.md +9 -0
  10. package/docs/_entries/16_closedicon.md +17 -3
  11. package/docs/_entries/31_openedicon.md +17 -3
  12. package/docs/package.json +7 -7
  13. package/docs/pnpm-lock.yaml +378 -284
  14. package/docs/static/bower.json +2 -2
  15. package/docs/static/bower_components/fontawesome/css/all.min.css +6 -2
  16. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  17. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  18. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  19. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  20. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  21. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  22. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  23. package/docs/static/bower_components/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  24. package/docs/static/bower_components/jquery/dist/jquery.js +813 -1102
  25. package/docs/static/bower_components/jquery/dist/jquery.min.js +2 -2
  26. package/docs/static/documentation.css +104 -222
  27. package/docs/static/examples/autoescape.js +15 -17
  28. package/docs/static/examples/autoscroll.js +5 -7
  29. package/docs/static/examples/button-on-right.js +4 -6
  30. package/docs/static/examples/custom_html.js +22 -24
  31. package/docs/static/examples/drag-outside.js +23 -25
  32. package/docs/static/examples/drag_and_drop.js +4 -6
  33. package/docs/static/examples/icon_buttons.js +3 -5
  34. package/docs/static/examples/load_json_data.js +14 -16
  35. package/docs/static/examples/load_json_data_from_server.js +1 -3
  36. package/docs/static/examples/load_on_demand.js +3 -5
  37. package/docs/static/examples/multiple_select.js +19 -21
  38. package/docs/static/examples/right-to-left.js +2 -4
  39. package/docs/static/examples/save_state.js +2 -4
  40. package/docs/tree.jquery.js +3 -3
  41. package/lib/dataLoader.js +3 -3
  42. package/lib/dragAndDropHandler.js +22 -11
  43. package/lib/elementsRenderer.js +26 -16
  44. package/lib/keyHandler.js +1 -1
  45. package/lib/mouse.widget.js +13 -2
  46. package/lib/node.js +17 -14
  47. package/lib/nodeElement.js +20 -13
  48. package/lib/playwright/coverage.js +11 -16
  49. package/lib/playwright/playwright.test.js +37 -58
  50. package/lib/playwright/testUtils.js +27 -44
  51. package/lib/saveStateHandler.js +2 -2
  52. package/lib/scrollHandler.js +8 -4
  53. package/lib/selectNodeHandler.js +2 -2
  54. package/lib/simple.widget.js +5 -3
  55. package/lib/test/jqTree/accessibility.test.js +37 -0
  56. package/lib/test/jqTree/events.test.js +73 -77
  57. package/lib/test/jqTree/loadOnDemand.test.js +5 -4
  58. package/lib/test/jqTree/methods.test.js +2 -2
  59. package/lib/test/jqTree/options.test.js +43 -2
  60. package/lib/test/node.test.js +7 -4
  61. package/lib/tree.jquery.js +5 -5
  62. package/lib/version.js +1 -1
  63. package/package.json +37 -41
  64. package/src/dragAndDropHandler.ts +24 -10
  65. package/src/elementsRenderer.ts +57 -50
  66. package/src/jqtreeOptions.ts +5 -5
  67. package/src/mouse.widget.ts +12 -0
  68. package/src/node.ts +10 -5
  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 +2 -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/loadOnDemand.test.ts +6 -5
  78. package/src/test/jqTree/methods.test.ts +27 -27
  79. package/src/test/jqTree/options.test.ts +61 -8
  80. package/src/test/node.test.ts +6 -4
  81. package/src/test/nodeUtil.test.ts +1 -1
  82. package/src/tree.jquery.d.ts +20 -11
  83. package/src/tree.jquery.ts +1 -1
  84. package/src/version.ts +1 -1
  85. package/tree.jquery.debug.js +143 -97
  86. package/tree.jquery.debug.js.map +1 -1
  87. package/tree.jquery.js +3 -3
  88. package/tree.jquery.js.map +1 -1
  89. package/tsconfig.json +1 -0
  90. package/.tool-versions +0 -1
  91. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.eot +0 -0
  92. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.svg +0 -3717
  93. package/docs/static/bower_components/fontawesome/webfonts/fa-brands-400.woff +0 -0
  94. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.eot +0 -0
  95. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.svg +0 -801
  96. package/docs/static/bower_components/fontawesome/webfonts/fa-regular-400.woff +0 -0
  97. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.eot +0 -0
  98. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.svg +0 -5028
  99. package/docs/static/bower_components/fontawesome/webfonts/fa-solid-900.woff +0 -0
@@ -164,6 +164,56 @@ describe("autoOpen", () => {
164
164
  });
165
165
  });
166
166
 
167
+ describe("closedIcon", () => {
168
+ it("renders a string", () => {
169
+ const $tree = $("#tree1");
170
+ $tree.tree({
171
+ closedIcon: "closed",
172
+ data: exampleData,
173
+ });
174
+
175
+ const $button = $tree.find("a.jqtree-toggler:first");
176
+ expect($button.text()).toBe("closed");
177
+ });
178
+
179
+ it("escapes html", () => {
180
+ const $tree = $("#tree1");
181
+ $tree.tree({
182
+ closedIcon: "<span>test</span>",
183
+ data: exampleData,
184
+ });
185
+
186
+ const $button = $tree.find("a.jqtree-toggler:first");
187
+ expect($button.text()).toBe("<span>test</span>");
188
+ });
189
+
190
+ it("renders a jquery element", () => {
191
+ const $tree = $("#tree1");
192
+ $tree.tree({
193
+ closedIcon: $("<span class='abc'>test</span>"),
194
+ data: exampleData,
195
+ });
196
+
197
+ const $span = $tree.find("a.jqtree-toggler:first span.abc");
198
+ expect($span.text()).toBe("test");
199
+ });
200
+
201
+ it("renders a html element", () => {
202
+ const closedIcon = document.createElement("span");
203
+ closedIcon.className = "abc";
204
+ closedIcon.textContent = "test";
205
+
206
+ const $tree = $("#tree1");
207
+ $tree.tree({
208
+ closedIcon,
209
+ data: exampleData,
210
+ });
211
+
212
+ const $span = $tree.find("a.jqtree-toggler:first span.abc");
213
+ expect($span.text()).toBe("test");
214
+ });
215
+ });
216
+
167
217
  describe("dataUrl", () => {
168
218
  const exampleStructure = [
169
219
  expect.objectContaining({ name: "node1" }),
@@ -201,7 +251,7 @@ describe("dataUrl", () => {
201
251
  const data = nodeName ? [nodeName] : exampleData;
202
252
 
203
253
  return response(ctx.status(200), ctx.json(data));
204
- })
254
+ }),
205
255
  );
206
256
  });
207
257
 
@@ -323,7 +373,7 @@ describe("onGetStateFromStorage and onSetStateFromStorage", () => {
323
373
  JSON.stringify({
324
374
  open_nodes: [123],
325
375
  selected_node: [123],
326
- })
376
+ }),
327
377
  );
328
378
 
329
379
  it("restores the state", () => {
@@ -351,8 +401,11 @@ describe("onLoadFailed", () => {
351
401
  beforeEach(() => {
352
402
  server.use(
353
403
  rest.get("/tree/", (_request, response, ctx) =>
354
- response(ctx.status(500), ctx.body("Internal server error"))
355
- )
404
+ response(
405
+ ctx.status(500),
406
+ ctx.body("Internal server error"),
407
+ ),
408
+ ),
356
409
  );
357
410
  });
358
411
 
@@ -366,7 +419,7 @@ describe("onLoadFailed", () => {
366
419
 
367
420
  await waitFor(() => {
368
421
  expect(onLoadFailed).toHaveBeenCalledWith(
369
- expect.objectContaining({ status: 500 })
422
+ expect.objectContaining({ status: 500 }),
370
423
  );
371
424
  });
372
425
  });
@@ -432,7 +485,7 @@ describe("saveState", () => {
432
485
 
433
486
  it("saves the state to local storage", () => {
434
487
  expect(localStorage.getItem("tree")).toBe(
435
- '{"open_nodes":[123],"selected_node":[123]}'
488
+ '{"open_nodes":[123],"selected_node":[123]}',
436
489
  );
437
490
  });
438
491
  });
@@ -442,7 +495,7 @@ describe("saveState", () => {
442
495
 
443
496
  it("uses the string as a key", () => {
444
497
  expect(localStorage.getItem("my-state")).toBe(
445
- '{"open_nodes":[123],"selected_node":[123]}'
498
+ '{"open_nodes":[123],"selected_node":[123]}',
446
499
  );
447
500
  });
448
501
  });
@@ -462,7 +515,7 @@ describe("saveState", () => {
462
515
  beforeEach(() => {
463
516
  localStorage.setItem(
464
517
  "tree",
465
- '{"open_nodes":[123],"selected_node":[123]}'
518
+ '{"open_nodes":[123],"selected_node":[123]}',
466
519
  );
467
520
 
468
521
  given.$tree.tree({
@@ -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
  });
@@ -34,6 +34,11 @@ interface ClickNodeEvent {
34
34
  previous_node?: INode;
35
35
  }
36
36
 
37
+ interface SelectNodeOptions {
38
+ mustToggle?: boolean;
39
+ mustSetFocus?: boolean;
40
+ }
41
+
37
42
  interface SavedState {
38
43
  open_nodes: NodeId[];
39
44
  selected_node: NodeId[];
@@ -44,7 +49,7 @@ interface IJQTreeOptions {
44
49
  autoEscape?: boolean;
45
50
  autoOpen?: boolean | number | string;
46
51
  buttonLeft?: boolean;
47
- closedIcon?: string | Element;
52
+ closedIcon?: string | HTMLElement | JQuery<HTMLElement>;
48
53
  data?: NodeData[];
49
54
  dataFilter?: (data: NodeData[]) => NodeData[];
50
55
  dataUrl?: DataUrl;
@@ -61,7 +66,7 @@ interface IJQTreeOptions {
61
66
  onLoading?: (isLoading: boolean, node: INode, $el: JQuery) => void;
62
67
  onGetStateFromStorage?: () => string;
63
68
  onSetStateFromStorage?: (data: string) => void;
64
- openedIcon?: string | Element;
69
+ openedIcon?: string | HTMLElement | JQuery<HTMLElement>;
65
70
  openFolderDelay?: number | false;
66
71
  rtl?: boolean;
67
72
  selectable?: boolean;
@@ -79,17 +84,17 @@ interface IJQTreePlugin {
79
84
  (
80
85
  behavior: "addNodeAfter",
81
86
  newNodeInfo: NodeData,
82
- existingNode: INode
87
+ existingNode: INode,
83
88
  ): INode | null;
84
89
  (
85
90
  behavior: "addNodeBefore",
86
91
  newNodeInfo: NodeData,
87
- existingNode: INode
92
+ existingNode: INode,
88
93
  ): INode | null;
89
94
  (
90
95
  behavior: "addParentNode",
91
96
  newNodeInfo: NodeData,
92
- existingNode: INode
97
+ existingNode: INode,
93
98
  ): INode | null;
94
99
  (behavior: "addToSelection", node: INode, mustSetFocus?: boolean): JQuery;
95
100
  (behavior: "appendNode", newNodeInfo: NodeData, parentNode?: INode): INode;
@@ -97,7 +102,7 @@ interface IJQTreePlugin {
97
102
  (behavior: "destroy"): void;
98
103
  (
99
104
  behavior: "getNodeByCallback",
100
- callback: (node: INode) => boolean
105
+ callback: (node: INode) => boolean,
101
106
  ): INode | null;
102
107
  (behavior: "getNodeByHtmlElement", element: Element | JQuery): INode | null;
103
108
  (behavior: "getNodeById", id: NodeId): INode | null;
@@ -116,14 +121,14 @@ interface IJQTreePlugin {
116
121
  behavior: "loadDataFromUrl",
117
122
  param1?: string | null | INode,
118
123
  param2?: INode | null | (() => void),
119
- param3?: () => void
124
+ param3?: () => void,
120
125
  ): JQuery;
121
126
  (behavior: "moveDown"): JQuery;
122
127
  (
123
128
  behavior: "moveNode",
124
129
  node: INode,
125
130
  targetNode: INode,
126
- position: string
131
+ position: string,
127
132
  ): JQuery;
128
133
  (behavior: "moveUp"): JQuery;
129
134
  (behavior: "openNode", node: INode): JQuery;
@@ -131,13 +136,13 @@ interface IJQTreePlugin {
131
136
  (
132
137
  behavior: "openNode",
133
138
  node: INode,
134
- onFinished: (node: INode) => void
139
+ onFinished: (node: INode) => void,
135
140
  ): JQuery;
136
141
  (
137
142
  behavior: "openNode",
138
143
  node: INode,
139
144
  slide: boolean,
140
- onFinished?: (node: INode) => void
145
+ onFinished?: (node: INode) => void,
141
146
  ): JQuery;
142
147
  (behavior: "prependNode", newNodeInfo: NodeData, parentNode?: INode): INode;
143
148
  (behavior: "refresh"): JQuery;
@@ -145,7 +150,11 @@ interface IJQTreePlugin {
145
150
  (behavior: "removeFromSelection", node: INode): JQuery;
146
151
  (behavior: "removeNode", node: INode): JQuery;
147
152
  (behavior: "scrollToNode", node: INode): JQuery;
148
- (behavior: "selectNode", node: INode | null): JQuery;
153
+ (
154
+ behavior: "selectNode",
155
+ node: INode | null,
156
+ optionsParam?: SelectNodeOptions,
157
+ ): JQuery;
149
158
  (behavior: "setOption", option: string, value: unknown): JQuery;
150
159
  (behavior: "setState", options: Record<string, unknown>): JQuery;
151
160
  (behavior: "toggle", node: INode, slideParam?: boolean): JQuery;
@@ -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.2";
2
2
 
3
3
  export default version;