jqtree 1.6.1 → 1.6.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 (84) hide show
  1. package/.eslintrc +1 -0
  2. package/_config.yml +1 -1
  3. package/_entries/10_changelog.md +5 -0
  4. package/_layouts/base.html +0 -22
  5. package/babel.config.json +11 -0
  6. package/babel.coverage.config.json +4 -0
  7. package/bower.json +1 -1
  8. package/jest-browser.config.js +0 -3
  9. package/jest-jsdom.config.js +1 -2
  10. package/jqtree.css +4 -1
  11. package/jqtree.postcss +3 -0
  12. package/lib/dataLoader.js +146 -98
  13. package/lib/dragAndDropHandler.js +668 -472
  14. package/lib/elementsRenderer.js +282 -197
  15. package/lib/jqtreeOptions.js +1 -2
  16. package/lib/keyHandler.js +134 -87
  17. package/lib/mouse.widget.js +285 -186
  18. package/lib/node.js +691 -505
  19. package/lib/nodeElement.js +329 -207
  20. package/lib/playwright/playwright.test.js +216 -189
  21. package/lib/playwright/testUtil.js +429 -193
  22. package/lib/playwright/visualRegression.js +182 -117
  23. package/lib/saveStateHandler.js +311 -204
  24. package/lib/scrollHandler.js +293 -199
  25. package/lib/selectNodeHandler.js +140 -100
  26. package/lib/simple.widget.js +184 -109
  27. package/lib/test/global.d.js +3 -0
  28. package/lib/test/jqTree/create.test.js +44 -40
  29. package/lib/test/jqTree/events.test.js +185 -138
  30. package/lib/test/jqTree/keyboard.test.js +216 -199
  31. package/lib/test/jqTree/loadOnDemand.test.js +233 -157
  32. package/lib/test/jqTree/methods.test.js +1269 -1019
  33. package/lib/test/jqTree/options.test.js +467 -398
  34. package/lib/test/node.test.js +1036 -873
  35. package/lib/test/nodeUtil.test.js +21 -20
  36. package/lib/test/support/exampleData.js +35 -23
  37. package/lib/test/support/jqTreeMatchers.js +72 -54
  38. package/lib/test/support/matchers.d.js +1 -0
  39. package/lib/test/support/setupTests.js +9 -3
  40. package/lib/test/support/testUtil.js +35 -15
  41. package/lib/test/support/treeStructure.js +41 -32
  42. package/lib/test/util.test.js +21 -20
  43. package/lib/tree.jquery.d.js +1 -0
  44. package/lib/tree.jquery.js +1264 -892
  45. package/lib/types.js +1 -2
  46. package/lib/typings.d.js +2 -0
  47. package/lib/util.js +19 -8
  48. package/lib/version.js +8 -3
  49. package/package.json +42 -34
  50. package/production +4 -4
  51. package/rollup.config.js +16 -11
  52. package/src/dataLoader.ts +6 -6
  53. package/src/dragAndDropHandler.ts +0 -4
  54. package/src/elementsRenderer.ts +4 -0
  55. package/src/jqtreeOptions.ts +1 -1
  56. package/src/mouse.widget.ts +19 -15
  57. package/src/node.ts +27 -41
  58. package/src/nodeElement.ts +17 -9
  59. package/src/playwright/.eslintrc +5 -0
  60. package/src/playwright/playwright.test.ts +29 -29
  61. package/src/saveStateHandler.ts +11 -6
  62. package/src/selectNodeHandler.ts +1 -1
  63. package/src/simple.widget.ts +1 -1
  64. package/src/test/.eslintrc +4 -0
  65. package/src/test/jqTree/create.test.ts +0 -1
  66. package/src/test/jqTree/events.test.ts +0 -1
  67. package/src/test/jqTree/keyboard.test.ts +0 -1
  68. package/src/test/jqTree/loadOnDemand.test.ts +46 -1
  69. package/src/test/jqTree/methods.test.ts +35 -10
  70. package/src/test/jqTree/options.test.ts +4 -5
  71. package/src/test/node.test.ts +2 -2
  72. package/src/test/support/jqTreeMatchers.ts +8 -9
  73. package/src/test/support/matchers.d.ts +2 -4
  74. package/src/test/support/setupTests.ts +2 -1
  75. package/src/tree.jquery.d.ts +18 -12
  76. package/src/tree.jquery.ts +25 -21
  77. package/src/version.ts +1 -1
  78. package/static/example.postcss +13 -0
  79. package/static/example_data.js +33 -36
  80. package/tree.jquery.debug.js +4806 -3325
  81. package/tree.jquery.debug.js.map +1 -1
  82. package/tree.jquery.js +2 -2
  83. package/tree.jquery.js.map +1 -1
  84. package/tsconfig.json +1 -0
@@ -1,6 +1,11 @@
1
1
  import { isInt } from "./util";
2
2
  import { JqTreeWidget } from "./tree.jquery";
3
- import { Node, NodeId } from "./node";
3
+ import { Node } from "./node";
4
+
5
+ export interface SavedState {
6
+ open_nodes: NodeId[];
7
+ selected_node: NodeId[];
8
+ }
4
9
 
5
10
  export default class SaveStateHandler {
6
11
  private treeWidget: JqTreeWidget;
@@ -24,7 +29,7 @@ export default class SaveStateHandler {
24
29
  const jsonData = this.loadFromStorage();
25
30
 
26
31
  if (jsonData) {
27
- return (this.parseState(jsonData) as unknown) as SavedState;
32
+ return this.parseState(jsonData) as unknown as SavedState;
28
33
  } else {
29
34
  return null;
30
35
  }
@@ -121,7 +126,7 @@ export default class SaveStateHandler {
121
126
  state.selected_node = [state.selected_node];
122
127
  }
123
128
 
124
- return (state as unknown) as SavedState;
129
+ return state as unknown as SavedState;
125
130
  }
126
131
 
127
132
  private loadFromStorage(): string | null {
@@ -134,11 +139,11 @@ export default class SaveStateHandler {
134
139
  }
135
140
  }
136
141
 
137
- private openInitialNodes(nodeIds: any[]): boolean {
142
+ private openInitialNodes(nodeIds: NodeId[]): boolean {
138
143
  let mustLoadOnDemand = false;
139
144
 
140
- for (const nodeDd of nodeIds) {
141
- const node = this.treeWidget.getNodeById(nodeDd);
145
+ for (const nodeId of nodeIds) {
146
+ const node = this.treeWidget.getNodeById(nodeId);
142
147
 
143
148
  if (node) {
144
149
  if (!node.load_on_demand) {
@@ -1,4 +1,4 @@
1
- import { Node, NodeId } from "./node";
1
+ import { Node } from "./node";
2
2
  import { JqTreeWidget } from "./tree.jquery";
3
3
 
4
4
  export default class SelectNodeHandler {
@@ -109,7 +109,7 @@ export default class SimpleWidget<WidgetOptions> {
109
109
 
110
110
  public options: WidgetOptions;
111
111
 
112
- protected $el: JQuery<HTMLElement>;
112
+ public $el: JQuery<HTMLElement>;
113
113
 
114
114
  constructor(el: HTMLElement, options: WidgetOptions) {
115
115
  this.$el = jQuery(el);
@@ -0,0 +1,4 @@
1
+ {
2
+ "plugins": ["testing-library"],
3
+ "extends": ["plugin:testing-library/dom"]
4
+ }
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import "../../tree.jquery";
4
3
  import exampleData from "../support/exampleData";
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import { rest } from "msw";
4
3
  import { setupServer } from "msw/node";
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import "../../tree.jquery";
4
3
  import exampleData from "../support/exampleData";
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import { screen } from "@testing-library/dom";
4
3
  import { rest } from "msw";
@@ -106,6 +105,52 @@ context("when a node has load_on_demand in the data", () => {
106
105
  }),
107
106
  ]);
108
107
  });
108
+
109
+ context("when the node is selected and has the focus", () => {
110
+ beforeEach(() => {
111
+ given.$tree.tree("selectNode", given.node);
112
+ });
113
+
114
+ it("keeps the node selected and focused", async () => {
115
+ expect(given.node.element).toBeSelected();
116
+ expect(given.node.element).toBeFocused();
117
+
118
+ togglerLink(given.node.element).trigger("click");
119
+ await screen.findByText("loaded-on-demand");
120
+
121
+ expect(given.node.element).toBeSelected();
122
+ expect(given.node.element).toBeFocused();
123
+ });
124
+ });
125
+
126
+ context("when the node is not selected", () => {
127
+ it("doesn't select the node", async () => {
128
+ expect(given.node.element).not.toBeSelected();
129
+
130
+ togglerLink(given.node.element).trigger("click");
131
+ await screen.findByText("loaded-on-demand");
132
+
133
+ expect(given.node.element).not.toBeSelected();
134
+ });
135
+ });
136
+
137
+ context("when the node is selected and doesn't have the focus", () => {
138
+ beforeEach(() => {
139
+ given.$tree.tree("selectNode", given.node);
140
+ (document.activeElement as HTMLElement).blur();
141
+ });
142
+
143
+ it("keeps the node selected and not focused", async () => {
144
+ expect(given.node.element).toBeSelected();
145
+ expect(given.node.element).not.toBeFocused();
146
+
147
+ togglerLink(given.node.element).trigger("click");
148
+ await screen.findByText("loaded-on-demand");
149
+
150
+ expect(given.node.element).toBeSelected();
151
+ expect(given.node.element).not.toBeFocused();
152
+ });
153
+ });
109
154
  });
110
155
 
111
156
  context("with autoOpen is true", () => {
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import { screen } from "@testing-library/dom";
4
3
  import { rest } from "msw";
@@ -967,6 +966,38 @@ describe("prependNode", () => {
967
966
  });
968
967
  });
969
968
 
969
+ describe("refresh", () => {
970
+ interface Vars {
971
+ $tree: JQuery<HTMLElement>;
972
+ }
973
+
974
+ const given = getGiven<Vars>();
975
+ given("$tree", () => $("#tree1"));
976
+
977
+ beforeEach(() => {
978
+ given.$tree.tree({
979
+ data: exampleData,
980
+ });
981
+ });
982
+
983
+ it("rerenders the tree", () => {
984
+ const tree = given.$tree.tree("getTree");
985
+ tree.children[0].name = "node1a";
986
+
987
+ expect(given.$tree).toHaveTreeStructure([
988
+ expect.objectContaining({ name: "node1" }),
989
+ expect.objectContaining({ name: "node2" }),
990
+ ]);
991
+
992
+ given.$tree.tree("refresh");
993
+
994
+ expect(given.$tree).toHaveTreeStructure([
995
+ expect.objectContaining({ name: "node1a" }),
996
+ expect.objectContaining({ name: "node2" }),
997
+ ]);
998
+ });
999
+ });
1000
+
970
1001
  describe("reload", () => {
971
1002
  interface Vars {
972
1003
  node1: INode;
@@ -1149,7 +1180,7 @@ describe("selectNode", () => {
1149
1180
 
1150
1181
  it("selects the node and deselects the previous node", () => {
1151
1182
  expect(given.node1.element).toBeSelected();
1152
- expect(given.node2.element).notToBeSelected();
1183
+ expect(given.node2.element).not.toBeSelected();
1153
1184
  });
1154
1185
  });
1155
1186
 
@@ -1170,7 +1201,7 @@ describe("selectNode", () => {
1170
1201
 
1171
1202
  it("deselects the node", () => {
1172
1203
  given.$tree.tree("selectNode", given.node1);
1173
- expect(given.node1.element).notToBeSelected();
1204
+ expect(given.node1.element).not.toBeSelected();
1174
1205
  });
1175
1206
  });
1176
1207
 
@@ -1436,13 +1467,7 @@ describe("updateNode", () => {
1436
1467
  });
1437
1468
 
1438
1469
  it("keeps the focus on the node", () => {
1439
- expect(document.activeElement).not.toBeNil();
1440
- expect(
1441
- given.$tree.tree(
1442
- "getNodeByHtmlElement",
1443
- document.activeElement as HTMLElement
1444
- )
1445
- ).not.toBeNil();
1470
+ expect(given.node.element).toBeFocused();
1446
1471
  });
1447
1472
  });
1448
1473
  });
@@ -1,4 +1,3 @@
1
- import * as $ from "jquery";
2
1
  import getGiven from "givens";
3
2
  import { screen } from "@testing-library/dom";
4
3
  import { rest } from "msw";
@@ -391,7 +390,7 @@ describe("rtl", () => {
391
390
  });
392
391
 
393
392
  it("has a different closed icon", () => {
394
- expect(togglerLink(given.node1.element).text()).toEqual("◀");
393
+ expect(togglerLink(given.node1.element).text()).toBe("◀");
395
394
  });
396
395
  });
397
396
 
@@ -402,7 +401,7 @@ describe("rtl", () => {
402
401
  });
403
402
 
404
403
  it("has a different closed icon", () => {
405
- expect(togglerLink(given.node1.element).text()).toEqual("◀");
404
+ expect(togglerLink(given.node1.element).text()).toBe("◀");
406
405
  });
407
406
  });
408
407
  });
@@ -434,7 +433,7 @@ describe("saveState", () => {
434
433
  given("saveState", () => true);
435
434
 
436
435
  it("saves the state to local storage", () => {
437
- expect(localStorage.getItem("tree")).toEqual(
436
+ expect(localStorage.getItem("tree")).toBe(
438
437
  '{"open_nodes":[123],"selected_node":[123]}'
439
438
  );
440
439
  });
@@ -444,7 +443,7 @@ describe("saveState", () => {
444
443
  given("saveState", () => "my-state");
445
444
 
446
445
  it("uses the string as a key", () => {
447
- expect(localStorage.getItem("my-state")).toEqual(
446
+ expect(localStorage.getItem("my-state")).toBe(
448
447
  '{"open_nodes":[123],"selected_node":[123]}'
449
448
  );
450
449
  });
@@ -855,13 +855,13 @@ describe("hasChildren", () => {
855
855
  });
856
856
 
857
857
  it("returns true", () => {
858
- expect(given.node.hasChildren()).toEqual(true);
858
+ expect(given.node.hasChildren()).toBe(true);
859
859
  });
860
860
  });
861
861
 
862
862
  context("when a node doesn't have children", () => {
863
863
  it("returns false", () => {
864
- expect(given.node.hasChildren()).toEqual(false);
864
+ expect(given.node.hasChildren()).toBe(false);
865
865
  });
866
866
  });
867
867
  });
@@ -1,4 +1,5 @@
1
1
  import treeStructure from "./treeStructure";
2
+ import { titleSpan } from "./testUtil";
2
3
 
3
4
  const assertJqTreeFolder = ($el: JQuery<HTMLElement>) => {
4
5
  /* istanbul ignore if */
@@ -8,15 +9,6 @@ const assertJqTreeFolder = ($el: JQuery<HTMLElement>) => {
8
9
  };
9
10
 
10
11
  expect.extend({
11
- notToBeSelected(el: HTMLElement | JQuery<HTMLElement>) {
12
- const $el = jQuery(el);
13
-
14
- /* istanbul ignore next */
15
- return {
16
- message: () => "The node is selected",
17
- pass: !$el.hasClass("jqtree-selected"),
18
- };
19
- },
20
12
  toBeClosed(el: HTMLElement | JQuery<HTMLElement>) {
21
13
  const $el = jQuery(el);
22
14
  assertJqTreeFolder($el);
@@ -27,6 +19,13 @@ expect.extend({
27
19
  pass: $el.hasClass("jqtree-closed"),
28
20
  };
29
21
  },
22
+ toBeFocused(el: HTMLElement | JQuery<HTMLElement>) {
23
+ /* istanbul ignore next */
24
+ return {
25
+ message: () => "The is node is not focused",
26
+ pass: document.activeElement === titleSpan(el)[0],
27
+ };
28
+ },
30
29
  toBeOpen(el: HTMLElement | JQuery<HTMLElement>) {
31
30
  const $el = jQuery(el);
32
31
  assertJqTreeFolder($el);
@@ -22,12 +22,10 @@ declare namespace JQTreeMatchers {
22
22
  declare namespace jest {
23
23
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
24
24
  interface Matchers<R> {
25
- notToBeSelected(): boolean;
26
25
  toBeClosed(): boolean;
26
+ toBeFocused(): boolean;
27
27
  toBeOpen(): boolean;
28
28
  toBeSelected(): boolean;
29
- toHaveTreeStructure(
30
- treeStructure: JQTreeMatchers.TreeStructure
31
- ): boolean;
29
+ toHaveTreeStructure(treeStructure: any): boolean;
32
30
  }
33
31
  }
@@ -1,4 +1,5 @@
1
- import * as jQuery from "jquery";
1
+ import jQuery from "jquery";
2
2
  import "./jqTreeMatchers";
3
3
 
4
+ (window as any).$ = jQuery; // eslint-disable-line @typescript-eslint/no-unsafe-member-access
4
5
  (window as any).jQuery = jQuery; // eslint-disable-line @typescript-eslint/no-unsafe-member-access
@@ -1,21 +1,26 @@
1
1
  type NodeId = number | string;
2
2
 
3
- type DefaultRecord = Record<string, unknown>;
4
- type NodeData = string | DefaultRecord;
3
+ interface NodeRecord {
4
+ [key: string]: unknown;
5
+ id?: NodeId;
6
+ children?: NodeData[];
7
+ }
8
+
9
+ type NodeData = string | NodeRecord;
5
10
 
6
11
  type IterateCallback = (node: INode, level: number) => boolean;
7
12
 
8
- declare class INode {
9
- public id?: NodeId;
10
- public name: string;
11
- public children: INode[];
12
- public element: HTMLElement;
13
- public is_open: boolean;
14
- public parent: INode | null;
13
+ interface INode {
14
+ id?: NodeId;
15
+ name: string;
16
+ children: INode[];
17
+ element: HTMLElement;
18
+ is_open: boolean;
19
+ parent: INode | null;
15
20
 
16
21
  [key: string]: unknown;
17
22
 
18
- public iterate(callback: IterateCallback): void;
23
+ iterate(callback: IterateCallback): void;
19
24
  }
20
25
 
21
26
  type DataUrlFunction = (node?: Node) => JQuery.AjaxSettings;
@@ -41,7 +46,7 @@ interface IJQTreeOptions {
41
46
  buttonLeft?: boolean;
42
47
  closedIcon?: string | Element;
43
48
  data?: NodeData[];
44
- dataFilter?: (data: unknown) => NodeData[];
49
+ dataFilter?: (data: NodeData[]) => NodeData[];
45
50
  dataUrl?: DataUrl;
46
51
  dragAndDrop?: boolean;
47
52
  nodeClass?: any;
@@ -135,13 +140,14 @@ interface IJQTreePlugin {
135
140
  onFinished?: (node: INode) => void
136
141
  ): JQuery;
137
142
  (behavior: "prependNode", newNodeInfo: NodeData, parentNode?: INode): INode;
143
+ (behavior: "refresh"): JQuery;
138
144
  (behavior: "reload", onFinished?: () => void): JQuery;
139
145
  (behavior: "removeFromSelection", node: INode): JQuery;
140
146
  (behavior: "removeNode", node: INode): JQuery;
141
147
  (behavior: "scrollToNode", node: INode): JQuery;
142
148
  (behavior: "selectNode", node: INode | null): JQuery;
143
149
  (behavior: "setOption", option: string, value: unknown): JQuery;
144
- (behavior: "setState", options: DefaultRecord): JQuery;
150
+ (behavior: "setState", options: Record<string, unknown>): JQuery;
145
151
  (behavior: "toggle", node: INode, slideParam?: boolean): JQuery;
146
152
  (behavior: "toJson"): string;
147
153
  (behavior: "updateNode", node: INode, data: NodeData): JQuery;
@@ -1,23 +1,19 @@
1
1
  import __version__ from "./version";
2
- import * as jQueryProxy from "jquery";
3
2
  import { DragAndDropHandler } from "./dragAndDropHandler";
4
3
  import ElementsRenderer from "./elementsRenderer";
5
4
  import DataLoader, { HandleFinishedLoading } from "./dataLoader";
6
5
  import KeyHandler from "./keyHandler";
7
6
  import MouseWidget from "./mouse.widget";
8
7
  import { PositionInfo } from "./types";
9
- import SaveStateHandler from "./saveStateHandler";
8
+ import SaveStateHandler, { SavedState } from "./saveStateHandler";
10
9
  import ScrollHandler from "./scrollHandler";
11
10
  import SelectNodeHandler from "./selectNodeHandler";
12
11
  import SimpleWidget from "./simple.widget";
13
- import { Node, NodeId, getPosition, NodeData } from "./node";
12
+ import { Node, getPosition } from "./node";
14
13
  import { isFunction } from "./util";
15
14
  import { FolderElement, NodeElement, OnFinishOpenNode } from "./nodeElement";
16
15
  import { JQTreeOptions } from "./jqtreeOptions";
17
16
 
18
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
19
- const jQuery: JQueryStatic = (<any>jQueryProxy).default || jQueryProxy;
20
-
21
17
  interface ClickTarget {
22
18
  node: Node;
23
19
  type: "button" | "label";
@@ -371,19 +367,12 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
371
367
  node.removeChildren();
372
368
 
373
369
  if (data.children.length) {
374
- node.loadFromData(data.children);
370
+ node.loadFromData(data.children as Node[]);
375
371
  }
376
372
  }
377
373
 
378
- const mustSetFocus = this.selectNodeHandler.isFocusOnTree();
379
- const mustSelect = this.isSelectedNodeInSubtree(node);
380
-
381
374
  this._refreshElements(node);
382
375
 
383
- if (mustSelect) {
384
- this.selectCurrentNode(mustSetFocus);
385
- }
386
-
387
376
  return this.element;
388
377
  }
389
378
 
@@ -519,7 +508,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
519
508
 
520
509
  public _triggerEvent(
521
510
  eventName: string,
522
- values?: DefaultRecord
511
+ values?: Record<string, unknown>
523
512
  ): JQuery.Event {
524
513
  const event = jQuery.Event(eventName, values);
525
514
  this.element.trigger(event);
@@ -533,7 +522,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
533
522
  ): void {
534
523
  const doOpenNode = (
535
524
  _node: Node,
536
- _slide: any,
525
+ _slide: boolean,
537
526
  _onFinished: OnFinishOpenNode | null
538
527
  ): void => {
539
528
  const folderElement = new FolderElement(_node, this);
@@ -569,8 +558,17 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
569
558
  from_node: redraw this subtree
570
559
  */
571
560
  public _refreshElements(fromNode: Node | null): void {
561
+ const mustSetFocus = this.selectNodeHandler.isFocusOnTree();
562
+ const mustSelect = fromNode
563
+ ? this.isSelectedNodeInSubtree(fromNode)
564
+ : false;
565
+
572
566
  this.renderer.render(fromNode);
573
567
 
568
+ if (mustSelect) {
569
+ this.selectCurrentNode(mustSetFocus);
570
+ }
571
+
574
572
  this._triggerEvent("tree.refresh");
575
573
  }
576
574
 
@@ -742,7 +740,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
742
740
  }
743
741
  }
744
742
 
745
- private initTree(data: any): void {
743
+ private initTree(data: NodeData[]): void {
746
744
  const doInit = (): void => {
747
745
  if (!this.isInitialized) {
748
746
  this.isInitialized = true;
@@ -905,7 +903,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
905
903
  }
906
904
  }
907
905
 
908
- private handleClick = (e: JQuery.ClickEvent): void => {
906
+ private handleClick = (
907
+ e: JQuery.ClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
908
+ ): void => {
909
909
  const clickTarget = this.getClickTarget(e.target);
910
910
 
911
911
  if (clickTarget) {
@@ -928,7 +928,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
928
928
  }
929
929
  };
930
930
 
931
- private handleDblclick = (e: JQuery.DoubleClickEvent): void => {
931
+ private handleDblclick = (
932
+ e: JQuery.DoubleClickEvent<HTMLElement, any, HTMLElement, HTMLElement>
933
+ ): void => {
932
934
  const clickTarget = this.getClickTarget(e.target);
933
935
 
934
936
  if (clickTarget?.type === "label") {
@@ -978,7 +980,9 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
978
980
  }
979
981
  }
980
982
 
981
- private handleContextmenu = (e: JQuery.ContextMenuEvent) => {
983
+ private handleContextmenu = (
984
+ e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>
985
+ ) => {
982
986
  const $div = jQuery(e.target).closest("ul.jqtree-tree .jqtree-element");
983
987
  if ($div.length) {
984
988
  const node = this.getNode($div);
@@ -1140,7 +1144,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
1140
1144
  }
1141
1145
  }
1142
1146
 
1143
- private loadSubtree(data: any[], parentNode: Node): void {
1147
+ private loadSubtree(data: NodeData[], parentNode: Node): void {
1144
1148
  parentNode.loadFromData(data);
1145
1149
 
1146
1150
  parentNode.load_on_demand = false;
package/src/version.ts CHANGED
@@ -1,3 +1,3 @@
1
- const version = "1.6.1";
1
+ const version = "1.6.2";
2
2
 
3
3
  export default version;
@@ -83,3 +83,16 @@ pre {
83
83
  }
84
84
  }
85
85
  }
86
+
87
+ .hidden-node {
88
+ display: none;
89
+ }
90
+
91
+ .highlight-node > .jqtree-element > .jqtree-title {
92
+ font-weight: bold;
93
+ }
94
+
95
+ #search-term {
96
+ margin-bottom: 16px;
97
+ margin-right: 8px;
98
+ }
@@ -1,4 +1,4 @@
1
- var ExampleData = {};
1
+ const ExampleData = {};
2
2
 
3
3
  ExampleData.exampleData = [
4
4
  {
@@ -24,10 +24,10 @@ ExampleData.exampleData = [
24
24
  { name: "Oviraptorosaurians", id: 12 },
25
25
  { name: "Dromaeosaurids", id: 13 },
26
26
  { name: "Troodontids", id: 14 },
27
- { name: "Avialans", id: 15 }
28
- ]
29
- }
30
- ]
27
+ { name: "Avialans", id: 15 },
28
+ ],
29
+ },
30
+ ],
31
31
  },
32
32
  {
33
33
  name: "Sauropodomorphs",
@@ -44,14 +44,14 @@ ExampleData.exampleData = [
44
44
  id: 20,
45
45
  children: [
46
46
  { name: "Brachiosaurids", id: 21 },
47
- { name: "Titanosaurians", id: 22 }
48
- ]
49
- }
50
- ]
51
- }
52
- ]
53
- }
54
- ]
47
+ { name: "Titanosaurians", id: 22 },
48
+ ],
49
+ },
50
+ ],
51
+ },
52
+ ],
53
+ },
54
+ ],
55
55
  },
56
56
  {
57
57
  name: "Ornithischians",
@@ -63,57 +63,54 @@ ExampleData.exampleData = [
63
63
  id: 25,
64
64
  children: [
65
65
  { name: "Ankylosaurians", id: 26 },
66
- { name: "Stegosaurians", id: 27 }
67
- ]
66
+ { name: "Stegosaurians", id: 27 },
67
+ ],
68
68
  },
69
69
  {
70
70
  name: "Ornithopods",
71
71
  id: 28,
72
- children: [{ name: "Hadrosaurids", id: 29 }]
72
+ children: [{ name: "Hadrosaurids", id: 29 }],
73
73
  },
74
74
  { name: "Pachycephalosaurians", id: 30 },
75
- { name: "Ceratopsians", id: 31 }
76
- ]
77
- }
75
+ { name: "Ceratopsians", id: 31 },
76
+ ],
77
+ },
78
78
  ];
79
79
 
80
- ExampleData.getFirstLevelData = function(nodes) {
80
+ ExampleData.getFirstLevelData = function (nodes) {
81
81
  if (!nodes) {
82
82
  nodes = ExampleData.exampleData;
83
83
  }
84
84
 
85
- var data = [];
85
+ const data = [];
86
86
 
87
- $.each(nodes, function() {
88
- var node = {
89
- name: this.name,
90
- id: this.id
91
- };
87
+ nodes.forEach(function (node) {
88
+ const newNode = { id: node.id, name: node.name };
92
89
 
93
- if (this.children) {
94
- node.load_on_demand = true;
90
+ if (node.children) {
91
+ newNode.load_on_demand = true;
95
92
  }
96
93
 
97
- data.push(node);
94
+ data.push(newNode);
98
95
  });
99
96
 
100
97
  return data;
101
98
  };
102
99
 
103
- ExampleData.getChildrenOfNode = function(node_id) {
104
- var result = null;
100
+ ExampleData.getChildrenOfNode = function (nodeId) {
101
+ let result = null;
105
102
 
106
103
  function iterate(nodes) {
107
- $.each(nodes, function() {
104
+ nodes.forEach(function (node) {
108
105
  if (result) {
109
106
  return;
110
107
  } else {
111
- if (this.id == node_id) {
112
- result = this;
108
+ if (node.id == nodeId) {
109
+ result = node;
113
110
  }
114
111
 
115
- if (this.children) {
116
- iterate(this.children);
112
+ if (node.children) {
113
+ iterate(node.children);
117
114
  }
118
115
  }
119
116
  });