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.
- package/.eslintrc +1 -0
- package/_config.yml +1 -1
- package/_entries/10_changelog.md +5 -0
- package/_layouts/base.html +0 -22
- package/babel.config.json +11 -0
- package/babel.coverage.config.json +4 -0
- package/bower.json +1 -1
- package/jest-browser.config.js +0 -3
- package/jest-jsdom.config.js +1 -2
- package/jqtree.css +4 -1
- package/jqtree.postcss +3 -0
- package/lib/dataLoader.js +146 -98
- package/lib/dragAndDropHandler.js +668 -472
- package/lib/elementsRenderer.js +282 -197
- package/lib/jqtreeOptions.js +1 -2
- package/lib/keyHandler.js +134 -87
- package/lib/mouse.widget.js +285 -186
- package/lib/node.js +691 -505
- package/lib/nodeElement.js +329 -207
- package/lib/playwright/playwright.test.js +216 -189
- package/lib/playwright/testUtil.js +429 -193
- package/lib/playwright/visualRegression.js +182 -117
- package/lib/saveStateHandler.js +311 -204
- package/lib/scrollHandler.js +293 -199
- package/lib/selectNodeHandler.js +140 -100
- package/lib/simple.widget.js +184 -109
- package/lib/test/global.d.js +3 -0
- package/lib/test/jqTree/create.test.js +44 -40
- package/lib/test/jqTree/events.test.js +185 -138
- package/lib/test/jqTree/keyboard.test.js +216 -199
- package/lib/test/jqTree/loadOnDemand.test.js +233 -157
- package/lib/test/jqTree/methods.test.js +1269 -1019
- package/lib/test/jqTree/options.test.js +467 -398
- package/lib/test/node.test.js +1036 -873
- package/lib/test/nodeUtil.test.js +21 -20
- package/lib/test/support/exampleData.js +35 -23
- package/lib/test/support/jqTreeMatchers.js +72 -54
- package/lib/test/support/matchers.d.js +1 -0
- package/lib/test/support/setupTests.js +9 -3
- package/lib/test/support/testUtil.js +35 -15
- package/lib/test/support/treeStructure.js +41 -32
- package/lib/test/util.test.js +21 -20
- package/lib/tree.jquery.d.js +1 -0
- package/lib/tree.jquery.js +1264 -892
- package/lib/types.js +1 -2
- package/lib/typings.d.js +2 -0
- package/lib/util.js +19 -8
- package/lib/version.js +8 -3
- package/package.json +42 -34
- package/production +4 -4
- package/rollup.config.js +16 -11
- package/src/dataLoader.ts +6 -6
- package/src/dragAndDropHandler.ts +0 -4
- package/src/elementsRenderer.ts +4 -0
- package/src/jqtreeOptions.ts +1 -1
- package/src/mouse.widget.ts +19 -15
- package/src/node.ts +27 -41
- package/src/nodeElement.ts +17 -9
- package/src/playwright/.eslintrc +5 -0
- package/src/playwright/playwright.test.ts +29 -29
- package/src/saveStateHandler.ts +11 -6
- package/src/selectNodeHandler.ts +1 -1
- package/src/simple.widget.ts +1 -1
- package/src/test/.eslintrc +4 -0
- package/src/test/jqTree/create.test.ts +0 -1
- package/src/test/jqTree/events.test.ts +0 -1
- package/src/test/jqTree/keyboard.test.ts +0 -1
- package/src/test/jqTree/loadOnDemand.test.ts +46 -1
- package/src/test/jqTree/methods.test.ts +35 -10
- package/src/test/jqTree/options.test.ts +4 -5
- package/src/test/node.test.ts +2 -2
- package/src/test/support/jqTreeMatchers.ts +8 -9
- package/src/test/support/matchers.d.ts +2 -4
- package/src/test/support/setupTests.ts +2 -1
- package/src/tree.jquery.d.ts +18 -12
- package/src/tree.jquery.ts +25 -21
- package/src/version.ts +1 -1
- package/static/example.postcss +13 -0
- package/static/example_data.js +33 -36
- package/tree.jquery.debug.js +4806 -3325
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/tsconfig.json +1 -0
package/src/saveStateHandler.ts
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
import { isInt } from "./util";
|
|
2
2
|
import { JqTreeWidget } from "./tree.jquery";
|
|
3
|
-
import { 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
|
|
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
|
|
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:
|
|
142
|
+
private openInitialNodes(nodeIds: NodeId[]): boolean {
|
|
138
143
|
let mustLoadOnDemand = false;
|
|
139
144
|
|
|
140
|
-
for (const
|
|
141
|
-
const node = this.treeWidget.getNodeById(
|
|
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) {
|
package/src/selectNodeHandler.ts
CHANGED
package/src/simple.widget.ts
CHANGED
|
@@ -109,7 +109,7 @@ export default class SimpleWidget<WidgetOptions> {
|
|
|
109
109
|
|
|
110
110
|
public options: WidgetOptions;
|
|
111
111
|
|
|
112
|
-
|
|
112
|
+
public $el: JQuery<HTMLElement>;
|
|
113
113
|
|
|
114
114
|
constructor(el: HTMLElement, options: WidgetOptions) {
|
|
115
115
|
this.$el = jQuery(el);
|
|
@@ -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).
|
|
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).
|
|
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(
|
|
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()).
|
|
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()).
|
|
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")).
|
|
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")).
|
|
446
|
+
expect(localStorage.getItem("my-state")).toBe(
|
|
448
447
|
'{"open_nodes":[123],"selected_node":[123]}'
|
|
449
448
|
);
|
|
450
449
|
});
|
package/src/test/node.test.ts
CHANGED
|
@@ -855,13 +855,13 @@ describe("hasChildren", () => {
|
|
|
855
855
|
});
|
|
856
856
|
|
|
857
857
|
it("returns true", () => {
|
|
858
|
-
expect(given.node.hasChildren()).
|
|
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()).
|
|
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
|
|
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
|
package/src/tree.jquery.d.ts
CHANGED
|
@@ -1,21 +1,26 @@
|
|
|
1
1
|
type NodeId = number | string;
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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;
|
package/src/tree.jquery.ts
CHANGED
|
@@ -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,
|
|
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?:
|
|
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:
|
|
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:
|
|
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 = (
|
|
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 = (
|
|
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 = (
|
|
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:
|
|
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
package/static/example.postcss
CHANGED
package/static/example_data.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
|
|
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
|
-
|
|
85
|
+
const data = [];
|
|
86
86
|
|
|
87
|
-
|
|
88
|
-
|
|
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 (
|
|
94
|
-
|
|
90
|
+
if (node.children) {
|
|
91
|
+
newNode.load_on_demand = true;
|
|
95
92
|
}
|
|
96
93
|
|
|
97
|
-
data.push(
|
|
94
|
+
data.push(newNode);
|
|
98
95
|
});
|
|
99
96
|
|
|
100
97
|
return data;
|
|
101
98
|
};
|
|
102
99
|
|
|
103
|
-
ExampleData.getChildrenOfNode = function(
|
|
104
|
-
|
|
100
|
+
ExampleData.getChildrenOfNode = function (nodeId) {
|
|
101
|
+
let result = null;
|
|
105
102
|
|
|
106
103
|
function iterate(nodes) {
|
|
107
|
-
|
|
104
|
+
nodes.forEach(function (node) {
|
|
108
105
|
if (result) {
|
|
109
106
|
return;
|
|
110
107
|
} else {
|
|
111
|
-
if (
|
|
112
|
-
result =
|
|
108
|
+
if (node.id == nodeId) {
|
|
109
|
+
result = node;
|
|
113
110
|
}
|
|
114
111
|
|
|
115
|
-
if (
|
|
116
|
-
iterate(
|
|
112
|
+
if (node.children) {
|
|
113
|
+
iterate(node.children);
|
|
117
114
|
}
|
|
118
115
|
}
|
|
119
116
|
});
|