jqtree 1.7.5 → 1.8.0
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/bower.json +1 -1
- package/config/babel.config.json +1 -1
- package/config/production +2 -0
- package/devserver/devserver_scroll.js +8 -0
- package/devserver/test_scroll.html +28 -0
- package/devserver/test_scroll_container.html +39 -0
- package/docs/_config.yml +1 -1
- package/docs/_entries/general/changelog.md +7 -0
- package/package.json +5 -1
- package/src/dataLoader.ts +44 -19
- package/src/dragAndDropHandler/dragElement.ts +42 -0
- package/src/dragAndDropHandler/hitAreasGenerator.ts +175 -0
- package/src/dragAndDropHandler/index.ts +470 -0
- package/src/dragAndDropHandler/types.ts +12 -0
- package/src/dragAndDropHandler/visibleNodeIterator.ts +97 -0
- package/src/elementsRenderer.ts +75 -40
- package/src/jqtreeMethodTypes.ts +40 -0
- package/src/jqtreeOptions.ts +43 -25
- package/src/keyHandler.ts +59 -30
- package/src/mouse.widget.ts +3 -3
- package/src/mouseWidgetTypes.ts +6 -0
- package/src/nodeElement/borderDropHint.ts +32 -0
- package/src/nodeElement/folderElement.ts +133 -0
- package/src/nodeElement/ghostDropHint.ts +68 -0
- package/src/nodeElement/index.ts +101 -0
- package/src/playwright/coverage.ts +1 -4
- package/src/playwright/playwright.test.ts +0 -4
- package/src/saveStateHandler.ts +75 -26
- package/src/scrollHandler.ts +13 -7
- package/src/selectNodeHandler.ts +10 -16
- package/src/test/jqTree/keyboard.test.ts +18 -23
- package/src/test/jqTree/methods.test.ts +32 -3
- package/src/test/jqTree/options.test.ts +15 -4
- package/src/test/node.test.ts +1 -1
- package/src/tree.jquery.ts +239 -57
- package/src/util.ts +3 -0
- package/src/version.ts +1 -1
- package/tree.jquery.debug.js +1728 -2576
- package/tree.jquery.debug.js.map +1 -1
- package/tree.jquery.js +2 -2
- package/tree.jquery.js.map +1 -1
- package/lib/dataLoader.js +0 -123
- package/lib/dragAndDropHandler.js +0 -588
- package/lib/elementsRenderer.js +0 -267
- package/lib/jqtreeOptions.js +0 -1
- package/lib/keyHandler.js +0 -111
- package/lib/mouse.widget.js +0 -255
- package/lib/node.js +0 -708
- package/lib/nodeElement.js +0 -274
- package/lib/nodeUtils.js +0 -10
- package/lib/playwright/coverage.js +0 -99
- package/lib/playwright/playwright.test.js +0 -606
- package/lib/playwright/testUtils.js +0 -210
- package/lib/saveStateHandler.js +0 -277
- package/lib/scrollHandler/containerScrollParent.js +0 -160
- package/lib/scrollHandler/createScrollParent.js +0 -57
- package/lib/scrollHandler/documentScrollParent.js +0 -169
- package/lib/scrollHandler/scrollParent.js +0 -58
- package/lib/scrollHandler/types.js +0 -1
- package/lib/scrollHandler.js +0 -71
- package/lib/selectNodeHandler.js +0 -128
- package/lib/simple.widget.js +0 -158
- package/lib/test/global.d.js +0 -3
- package/lib/test/jqTree/accessibility.test.js +0 -37
- package/lib/test/jqTree/create.test.js +0 -48
- package/lib/test/jqTree/events.test.js +0 -210
- package/lib/test/jqTree/keyboard.test.js +0 -225
- package/lib/test/jqTree/loadOnDemand.test.js +0 -218
- package/lib/test/jqTree/methods.test.js +0 -1348
- package/lib/test/jqTree/options.test.js +0 -548
- package/lib/test/jqTree/scrollHandler/containerScrollParent.test.js +0 -94
- package/lib/test/node.test.js +0 -1202
- package/lib/test/nodeUtil.test.js +0 -27
- package/lib/test/nodeUtils.test.js +0 -20
- package/lib/test/support/exampleData.js +0 -35
- package/lib/test/support/jqTreeMatchers.js +0 -70
- package/lib/test/support/matchers.d.js +0 -1
- package/lib/test/support/setupTests.js +0 -7
- package/lib/test/support/testUtil.js +0 -29
- package/lib/test/support/treeStructure.js +0 -38
- package/lib/test/util.test.js +0 -26
- package/lib/tree.jquery.d.js +0 -1
- package/lib/tree.jquery.js +0 -1105
- package/lib/types.js +0 -1
- package/lib/typings.d.js +0 -2
- package/lib/util.js +0 -15
- package/lib/version.js +0 -8
- package/src/dragAndDropHandler.ts +0 -713
- package/src/nodeElement.ts +0 -272
- package/src/types.ts +0 -19
|
@@ -134,7 +134,7 @@ describe("addToSelection", () => {
|
|
|
134
134
|
given("child1", () => given.$tree.tree("getNodeByNameMustExist", "child1"));
|
|
135
135
|
given("child2", () => given.$tree.tree("getNodeByNameMustExist", "child2"));
|
|
136
136
|
|
|
137
|
-
|
|
137
|
+
it("selects the nodes", () => {
|
|
138
138
|
given.$tree.tree({
|
|
139
139
|
autoOpen: true,
|
|
140
140
|
data: exampleData,
|
|
@@ -142,15 +142,21 @@ describe("addToSelection", () => {
|
|
|
142
142
|
|
|
143
143
|
given.$tree.tree("addToSelection", given.child1);
|
|
144
144
|
given.$tree.tree("addToSelection", given.child2);
|
|
145
|
-
});
|
|
146
145
|
|
|
147
|
-
it("selects the nodes", () => {
|
|
148
146
|
expect(given.$tree.tree("getSelectedNodes")).toEqual(
|
|
149
147
|
expect.arrayContaining([given.child1, given.child2]),
|
|
150
148
|
);
|
|
151
149
|
});
|
|
152
150
|
|
|
153
151
|
it("renders the nodes correctly", () => {
|
|
152
|
+
given.$tree.tree({
|
|
153
|
+
autoOpen: true,
|
|
154
|
+
data: exampleData,
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
given.$tree.tree("addToSelection", given.child1);
|
|
158
|
+
given.$tree.tree("addToSelection", given.child2);
|
|
159
|
+
|
|
154
160
|
expect(given.$tree).toHaveTreeStructure([
|
|
155
161
|
expect.objectContaining({
|
|
156
162
|
name: "node1",
|
|
@@ -172,6 +178,20 @@ describe("addToSelection", () => {
|
|
|
172
178
|
}),
|
|
173
179
|
]);
|
|
174
180
|
});
|
|
181
|
+
|
|
182
|
+
it("opens the parent node when it's closed", () => {
|
|
183
|
+
given.$tree.tree({
|
|
184
|
+
autoOpen: false,
|
|
185
|
+
data: exampleData,
|
|
186
|
+
});
|
|
187
|
+
|
|
188
|
+
const node1 = given.$tree.tree("getNodeByNameMustExist", "node1");
|
|
189
|
+
expect(node1.is_open).toBeFalsy();
|
|
190
|
+
|
|
191
|
+
given.$tree.tree("addToSelection", given.child1);
|
|
192
|
+
|
|
193
|
+
expect(node1.is_open).toBe(true);
|
|
194
|
+
});
|
|
175
195
|
});
|
|
176
196
|
|
|
177
197
|
describe("appendNode", () => {
|
|
@@ -1207,6 +1227,15 @@ describe("selectNode", () => {
|
|
|
1207
1227
|
expect(given.$tree.tree("getSelectedNode")).toBeFalse();
|
|
1208
1228
|
});
|
|
1209
1229
|
});
|
|
1230
|
+
|
|
1231
|
+
it("opens the parent node when it's closed", () => {
|
|
1232
|
+
expect(given.node1.is_open).toBeFalsy();
|
|
1233
|
+
|
|
1234
|
+
const child1 = given.$tree.tree("getNodeByNameMustExist", "child1");
|
|
1235
|
+
given.$tree.tree("selectNode", child1);
|
|
1236
|
+
|
|
1237
|
+
expect(given.node1.is_open).toBe(true);
|
|
1238
|
+
});
|
|
1210
1239
|
});
|
|
1211
1240
|
|
|
1212
1241
|
describe("setOption", () => {
|
|
@@ -199,19 +199,30 @@ describe("closedIcon", () => {
|
|
|
199
199
|
});
|
|
200
200
|
|
|
201
201
|
it("renders a html element", () => {
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
202
|
+
const icon = document.createElement("span");
|
|
203
|
+
icon.className = "abc";
|
|
204
|
+
icon.textContent = "test";
|
|
205
205
|
|
|
206
206
|
const $tree = $("#tree1");
|
|
207
207
|
$tree.tree({
|
|
208
|
-
closedIcon,
|
|
208
|
+
closedIcon: icon,
|
|
209
209
|
data: exampleData,
|
|
210
210
|
});
|
|
211
211
|
|
|
212
212
|
const $span = $tree.find("a.jqtree-toggler:first span.abc");
|
|
213
213
|
expect($span.text()).toBe("test");
|
|
214
214
|
});
|
|
215
|
+
|
|
216
|
+
it("renders a default when the option is empty", () => {
|
|
217
|
+
const $tree = $("#tree1");
|
|
218
|
+
$tree.tree({
|
|
219
|
+
closedIcon: undefined,
|
|
220
|
+
data: exampleData,
|
|
221
|
+
});
|
|
222
|
+
|
|
223
|
+
const $span = $tree.find("a.jqtree-toggler:first");
|
|
224
|
+
expect($span.text()).toBe("►");
|
|
225
|
+
});
|
|
215
226
|
});
|
|
216
227
|
|
|
217
228
|
describe("dataUrl", () => {
|
package/src/test/node.test.ts
CHANGED
package/src/tree.jquery.ts
CHANGED
|
@@ -4,14 +4,16 @@ import ElementsRenderer from "./elementsRenderer";
|
|
|
4
4
|
import DataLoader, { HandleFinishedLoading } from "./dataLoader";
|
|
5
5
|
import KeyHandler from "./keyHandler";
|
|
6
6
|
import MouseWidget from "./mouse.widget";
|
|
7
|
-
import { PositionInfo } from "./
|
|
7
|
+
import { PositionInfo } from "./mouseWidgetTypes";
|
|
8
8
|
import SaveStateHandler, { SavedState } from "./saveStateHandler";
|
|
9
9
|
import ScrollHandler from "./scrollHandler";
|
|
10
10
|
import SelectNodeHandler from "./selectNodeHandler";
|
|
11
11
|
import SimpleWidget from "./simple.widget";
|
|
12
12
|
import { Node, getPosition } from "./node";
|
|
13
13
|
import { isFunction } from "./util";
|
|
14
|
-
import
|
|
14
|
+
import NodeElement from "./nodeElement";
|
|
15
|
+
import FolderElement from "./nodeElement/folderElement";
|
|
16
|
+
import { OnFinishOpenNode } from "./jqtreeMethodTypes";
|
|
15
17
|
import { JQTreeOptions } from "./jqtreeOptions";
|
|
16
18
|
|
|
17
19
|
interface ClickTarget {
|
|
@@ -185,9 +187,18 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
185
187
|
}
|
|
186
188
|
|
|
187
189
|
public getNodeByHtmlElement(
|
|
188
|
-
|
|
190
|
+
inputElement: HTMLElement | JQuery<HTMLElement>,
|
|
189
191
|
): Node | null {
|
|
190
|
-
|
|
192
|
+
const element =
|
|
193
|
+
inputElement instanceof HTMLElement
|
|
194
|
+
? inputElement
|
|
195
|
+
: inputElement[0];
|
|
196
|
+
|
|
197
|
+
if (!element) {
|
|
198
|
+
return null;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return this.getNode(element);
|
|
191
202
|
}
|
|
192
203
|
|
|
193
204
|
public getNodeByCallback(callback: (node: Node) => boolean): Node | null {
|
|
@@ -203,12 +214,12 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
203
214
|
throw Error(NODE_PARAM_IS_EMPTY);
|
|
204
215
|
}
|
|
205
216
|
|
|
206
|
-
const parseParams = (): [boolean, OnFinishOpenNode |
|
|
217
|
+
const parseParams = (): [boolean, OnFinishOpenNode | undefined] => {
|
|
207
218
|
let onFinished: OnFinishOpenNode | null;
|
|
208
219
|
let slide: boolean | null;
|
|
209
220
|
|
|
210
221
|
if (isFunction(param1)) {
|
|
211
|
-
onFinished = param1 as OnFinishOpenNode
|
|
222
|
+
onFinished = param1 as OnFinishOpenNode;
|
|
212
223
|
slide = null;
|
|
213
224
|
} else {
|
|
214
225
|
slide = param1 as boolean;
|
|
@@ -236,7 +247,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
236
247
|
const slide = slideParam ?? this.options.slide;
|
|
237
248
|
|
|
238
249
|
if (node.isFolder() || node.isEmptyFolder) {
|
|
239
|
-
|
|
250
|
+
this.createFolderElement(node).close(
|
|
240
251
|
slide,
|
|
241
252
|
this.options.animationSpeed,
|
|
242
253
|
);
|
|
@@ -415,6 +426,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
415
426
|
}
|
|
416
427
|
|
|
417
428
|
this.selectNodeHandler.addToSelection(node);
|
|
429
|
+
this.openParents(node);
|
|
418
430
|
|
|
419
431
|
this._getNodeElementForNode(node).select(
|
|
420
432
|
mustSetFocus === undefined ? true : mustSetFocus,
|
|
@@ -514,14 +526,14 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
514
526
|
public _openNode(
|
|
515
527
|
node: Node,
|
|
516
528
|
slide = true,
|
|
517
|
-
onFinished
|
|
529
|
+
onFinished?: OnFinishOpenNode,
|
|
518
530
|
): void {
|
|
519
531
|
const doOpenNode = (
|
|
520
532
|
_node: Node,
|
|
521
533
|
_slide: boolean,
|
|
522
|
-
_onFinished
|
|
534
|
+
_onFinished?: OnFinishOpenNode,
|
|
523
535
|
): void => {
|
|
524
|
-
const folderElement =
|
|
536
|
+
const folderElement = this.createFolderElement(_node);
|
|
525
537
|
folderElement.open(
|
|
526
538
|
_onFinished,
|
|
527
539
|
_slide,
|
|
@@ -538,7 +550,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
538
550
|
while (parent) {
|
|
539
551
|
// nb: do not open root element
|
|
540
552
|
if (parent.parent) {
|
|
541
|
-
doOpenNode(parent, false
|
|
553
|
+
doOpenNode(parent, false);
|
|
542
554
|
}
|
|
543
555
|
parent = parent.parent;
|
|
544
556
|
}
|
|
@@ -554,7 +566,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
554
566
|
from_node: redraw this subtree
|
|
555
567
|
*/
|
|
556
568
|
public _refreshElements(fromNode: Node | null): void {
|
|
557
|
-
const mustSetFocus = this.
|
|
569
|
+
const mustSetFocus = this.isFocusOnTree();
|
|
558
570
|
const mustSelect = fromNode
|
|
559
571
|
? this.isSelectedNodeInSubtree(fromNode)
|
|
560
572
|
: false;
|
|
@@ -570,14 +582,14 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
570
582
|
|
|
571
583
|
public _getNodeElementForNode(node: Node): NodeElement {
|
|
572
584
|
if (node.isFolder()) {
|
|
573
|
-
return
|
|
585
|
+
return this.createFolderElement(node);
|
|
574
586
|
} else {
|
|
575
|
-
return
|
|
587
|
+
return this.createNodeElement(node);
|
|
576
588
|
}
|
|
577
589
|
}
|
|
578
590
|
|
|
579
|
-
public _getNodeElement(
|
|
580
|
-
const node = this.getNode(
|
|
591
|
+
public _getNodeElement(element: HTMLElement): NodeElement | null {
|
|
592
|
+
const node = this.getNode(element);
|
|
581
593
|
if (node) {
|
|
582
594
|
return this._getNodeElementForNode(node);
|
|
583
595
|
} else {
|
|
@@ -585,12 +597,6 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
585
597
|
}
|
|
586
598
|
}
|
|
587
599
|
|
|
588
|
-
public _containsElement(element: HTMLElement): boolean {
|
|
589
|
-
const node = this.getNode(jQuery(element));
|
|
590
|
-
|
|
591
|
-
return node != null && node.tree === this.tree;
|
|
592
|
-
}
|
|
593
|
-
|
|
594
600
|
public _getScrollLeft(): number {
|
|
595
601
|
return this.scrollHandler.getScrollLeft();
|
|
596
602
|
}
|
|
@@ -607,13 +613,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
607
613
|
this.options.closedIcon = this.getDefaultClosedIcon();
|
|
608
614
|
}
|
|
609
615
|
|
|
610
|
-
this.
|
|
611
|
-
this.dataLoader = new DataLoader(this);
|
|
612
|
-
this.saveStateHandler = new SaveStateHandler(this);
|
|
613
|
-
this.selectNodeHandler = new SelectNodeHandler(this);
|
|
614
|
-
this.dndHandler = new DragAndDropHandler(this);
|
|
615
|
-
this.scrollHandler = new ScrollHandler(this);
|
|
616
|
-
this.keyHandler = new KeyHandler(this);
|
|
616
|
+
this.connectHandlers();
|
|
617
617
|
|
|
618
618
|
this.initData();
|
|
619
619
|
|
|
@@ -869,7 +869,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
869
869
|
|
|
870
870
|
return false;
|
|
871
871
|
} else {
|
|
872
|
-
this._openNode(node, false
|
|
872
|
+
this._openNode(node, false);
|
|
873
873
|
|
|
874
874
|
return level !== maxLevel;
|
|
875
875
|
}
|
|
@@ -938,13 +938,11 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
938
938
|
}
|
|
939
939
|
};
|
|
940
940
|
|
|
941
|
-
private getClickTarget(element:
|
|
942
|
-
const
|
|
943
|
-
|
|
944
|
-
const $button = $target.closest(".jqtree-toggler");
|
|
941
|
+
private getClickTarget(element: HTMLElement): ClickTarget | null {
|
|
942
|
+
const button = element.closest(".jqtree-toggler");
|
|
945
943
|
|
|
946
|
-
if (
|
|
947
|
-
const node = this.getNode(
|
|
944
|
+
if (button) {
|
|
945
|
+
const node = this.getNode(button as HTMLElement);
|
|
948
946
|
|
|
949
947
|
if (node) {
|
|
950
948
|
return {
|
|
@@ -953,9 +951,10 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
953
951
|
};
|
|
954
952
|
}
|
|
955
953
|
} else {
|
|
956
|
-
const
|
|
957
|
-
|
|
958
|
-
|
|
954
|
+
const jqTreeElement = element.closest(".jqtree-element");
|
|
955
|
+
|
|
956
|
+
if (jqTreeElement) {
|
|
957
|
+
const node = this.getNode(jqTreeElement as HTMLElement);
|
|
959
958
|
if (node) {
|
|
960
959
|
return {
|
|
961
960
|
type: "label",
|
|
@@ -968,21 +967,23 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
968
967
|
return null;
|
|
969
968
|
}
|
|
970
969
|
|
|
971
|
-
private getNode(
|
|
972
|
-
const
|
|
973
|
-
|
|
974
|
-
|
|
970
|
+
private getNode(element: HTMLElement): null | Node {
|
|
971
|
+
const liElement = element.closest("li.jqtree_common");
|
|
972
|
+
|
|
973
|
+
if (liElement) {
|
|
974
|
+
return jQuery(liElement).data("node") as Node;
|
|
975
975
|
} else {
|
|
976
|
-
return
|
|
976
|
+
return null;
|
|
977
977
|
}
|
|
978
978
|
}
|
|
979
979
|
|
|
980
980
|
private handleContextmenu = (
|
|
981
981
|
e: JQuery.ContextMenuEvent<HTMLElement, any, HTMLElement, HTMLElement>,
|
|
982
982
|
) => {
|
|
983
|
-
const
|
|
984
|
-
|
|
985
|
-
|
|
983
|
+
const div = e.target.closest("ul.jqtree-tree .jqtree-element");
|
|
984
|
+
|
|
985
|
+
if (div) {
|
|
986
|
+
const node = this.getNode(div as HTMLElement);
|
|
986
987
|
if (node) {
|
|
987
988
|
e.preventDefault();
|
|
988
989
|
e.stopPropagation();
|
|
@@ -1079,14 +1080,6 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1079
1080
|
}
|
|
1080
1081
|
};
|
|
1081
1082
|
|
|
1082
|
-
const openParents = (): void => {
|
|
1083
|
-
const parent = node.parent;
|
|
1084
|
-
|
|
1085
|
-
if (parent && parent.parent && !parent.is_open) {
|
|
1086
|
-
this.openNode(parent, false);
|
|
1087
|
-
}
|
|
1088
|
-
};
|
|
1089
|
-
|
|
1090
1083
|
if (!canSelect()) {
|
|
1091
1084
|
return;
|
|
1092
1085
|
}
|
|
@@ -1108,7 +1101,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1108
1101
|
node,
|
|
1109
1102
|
deselected_node: deselectedNode,
|
|
1110
1103
|
});
|
|
1111
|
-
openParents();
|
|
1104
|
+
this.openParents(node);
|
|
1112
1105
|
}
|
|
1113
1106
|
|
|
1114
1107
|
saveState();
|
|
@@ -1164,7 +1157,7 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1164
1157
|
private loadFolderOnDemand(
|
|
1165
1158
|
node: Node,
|
|
1166
1159
|
slide = true,
|
|
1167
|
-
onFinished
|
|
1160
|
+
onFinished?: OnFinishOpenNode,
|
|
1168
1161
|
): void {
|
|
1169
1162
|
node.is_loading = true;
|
|
1170
1163
|
|
|
@@ -1172,6 +1165,195 @@ export class JqTreeWidget extends MouseWidget<JQTreeOptions> {
|
|
|
1172
1165
|
this._openNode(node, slide, onFinished);
|
|
1173
1166
|
});
|
|
1174
1167
|
}
|
|
1168
|
+
|
|
1169
|
+
private containsElement(element: HTMLElement): boolean {
|
|
1170
|
+
const node = this.getNode(element);
|
|
1171
|
+
|
|
1172
|
+
return node != null && node.tree === this.tree;
|
|
1173
|
+
}
|
|
1174
|
+
|
|
1175
|
+
private isFocusOnTree(): boolean {
|
|
1176
|
+
const activeElement = document.activeElement;
|
|
1177
|
+
|
|
1178
|
+
return Boolean(
|
|
1179
|
+
activeElement &&
|
|
1180
|
+
activeElement.tagName === "SPAN" &&
|
|
1181
|
+
this.containsElement(activeElement as HTMLElement),
|
|
1182
|
+
);
|
|
1183
|
+
}
|
|
1184
|
+
|
|
1185
|
+
private connectHandlers() {
|
|
1186
|
+
const {
|
|
1187
|
+
autoEscape,
|
|
1188
|
+
buttonLeft,
|
|
1189
|
+
closedIcon,
|
|
1190
|
+
dataFilter,
|
|
1191
|
+
dragAndDrop,
|
|
1192
|
+
keyboardSupport,
|
|
1193
|
+
onCanMove,
|
|
1194
|
+
onCreateLi,
|
|
1195
|
+
onDragMove,
|
|
1196
|
+
onDragStop,
|
|
1197
|
+
onGetStateFromStorage,
|
|
1198
|
+
onIsMoveHandle,
|
|
1199
|
+
onLoadFailed,
|
|
1200
|
+
onLoading,
|
|
1201
|
+
onSetStateFromStorage,
|
|
1202
|
+
openedIcon,
|
|
1203
|
+
openFolderDelay,
|
|
1204
|
+
rtl,
|
|
1205
|
+
saveState,
|
|
1206
|
+
showEmptyFolder,
|
|
1207
|
+
slide,
|
|
1208
|
+
tabIndex,
|
|
1209
|
+
} = this.options;
|
|
1210
|
+
|
|
1211
|
+
const closeNode = this.closeNode.bind(this);
|
|
1212
|
+
const getNodeElement = this._getNodeElement.bind(this);
|
|
1213
|
+
const getNodeElementForNode = this._getNodeElementForNode.bind(this);
|
|
1214
|
+
const getNodeById = this.getNodeById.bind(this);
|
|
1215
|
+
const getScrollLeft = this._getScrollLeft.bind(this);
|
|
1216
|
+
const getSelectedNode = this.getSelectedNode.bind(this);
|
|
1217
|
+
const getTree = this.getTree.bind(this);
|
|
1218
|
+
const isFocusOnTree = this.isFocusOnTree.bind(this);
|
|
1219
|
+
const loadData = this.loadData.bind(this);
|
|
1220
|
+
const openNode = this._openNode.bind(this);
|
|
1221
|
+
const refreshElements = this._refreshElements.bind(this);
|
|
1222
|
+
const refreshHitAreas = this.refreshHitAreas.bind(this);
|
|
1223
|
+
const selectNode = this.selectNode.bind(this);
|
|
1224
|
+
const $treeElement = this.element;
|
|
1225
|
+
const triggerEvent = this._triggerEvent.bind(this);
|
|
1226
|
+
|
|
1227
|
+
const selectNodeHandler = new SelectNodeHandler({
|
|
1228
|
+
getNodeById,
|
|
1229
|
+
});
|
|
1230
|
+
|
|
1231
|
+
const addToSelection =
|
|
1232
|
+
selectNodeHandler.addToSelection.bind(selectNodeHandler);
|
|
1233
|
+
const getSelectedNodes =
|
|
1234
|
+
selectNodeHandler.getSelectedNodes.bind(selectNodeHandler);
|
|
1235
|
+
const isNodeSelected =
|
|
1236
|
+
selectNodeHandler.isNodeSelected.bind(selectNodeHandler);
|
|
1237
|
+
const removeFromSelection =
|
|
1238
|
+
selectNodeHandler.removeFromSelection.bind(selectNodeHandler);
|
|
1239
|
+
|
|
1240
|
+
const dataLoader = new DataLoader({
|
|
1241
|
+
dataFilter,
|
|
1242
|
+
loadData,
|
|
1243
|
+
onLoadFailed,
|
|
1244
|
+
onLoading,
|
|
1245
|
+
$treeElement,
|
|
1246
|
+
triggerEvent,
|
|
1247
|
+
});
|
|
1248
|
+
|
|
1249
|
+
const saveStateHandler = new SaveStateHandler({
|
|
1250
|
+
addToSelection,
|
|
1251
|
+
getNodeById,
|
|
1252
|
+
getSelectedNodes,
|
|
1253
|
+
getTree,
|
|
1254
|
+
onGetStateFromStorage,
|
|
1255
|
+
onSetStateFromStorage,
|
|
1256
|
+
openNode,
|
|
1257
|
+
refreshElements,
|
|
1258
|
+
removeFromSelection,
|
|
1259
|
+
saveState,
|
|
1260
|
+
});
|
|
1261
|
+
|
|
1262
|
+
const dndHandler = new DragAndDropHandler({
|
|
1263
|
+
autoEscape,
|
|
1264
|
+
getNodeElement,
|
|
1265
|
+
getNodeElementForNode,
|
|
1266
|
+
getScrollLeft,
|
|
1267
|
+
getTree,
|
|
1268
|
+
onCanMove,
|
|
1269
|
+
onDragMove,
|
|
1270
|
+
onDragStop,
|
|
1271
|
+
onIsMoveHandle,
|
|
1272
|
+
openFolderDelay,
|
|
1273
|
+
openNode,
|
|
1274
|
+
refreshElements,
|
|
1275
|
+
slide,
|
|
1276
|
+
$treeElement,
|
|
1277
|
+
triggerEvent,
|
|
1278
|
+
});
|
|
1279
|
+
|
|
1280
|
+
const scrollHandler = new ScrollHandler({
|
|
1281
|
+
refreshHitAreas,
|
|
1282
|
+
$treeElement,
|
|
1283
|
+
});
|
|
1284
|
+
|
|
1285
|
+
const keyHandler = new KeyHandler({
|
|
1286
|
+
closeNode,
|
|
1287
|
+
getSelectedNode,
|
|
1288
|
+
isFocusOnTree,
|
|
1289
|
+
keyboardSupport,
|
|
1290
|
+
openNode,
|
|
1291
|
+
selectNode,
|
|
1292
|
+
});
|
|
1293
|
+
|
|
1294
|
+
const renderer = new ElementsRenderer({
|
|
1295
|
+
autoEscape,
|
|
1296
|
+
buttonLeft,
|
|
1297
|
+
closedIcon,
|
|
1298
|
+
dragAndDrop,
|
|
1299
|
+
$element: $treeElement,
|
|
1300
|
+
getTree,
|
|
1301
|
+
isNodeSelected,
|
|
1302
|
+
onCreateLi,
|
|
1303
|
+
openedIcon,
|
|
1304
|
+
rtl,
|
|
1305
|
+
showEmptyFolder,
|
|
1306
|
+
tabIndex,
|
|
1307
|
+
});
|
|
1308
|
+
|
|
1309
|
+
this.dataLoader = dataLoader;
|
|
1310
|
+
this.dndHandler = dndHandler;
|
|
1311
|
+
this.keyHandler = keyHandler;
|
|
1312
|
+
this.renderer = renderer;
|
|
1313
|
+
this.saveStateHandler = saveStateHandler;
|
|
1314
|
+
this.scrollHandler = scrollHandler;
|
|
1315
|
+
this.selectNodeHandler = selectNodeHandler;
|
|
1316
|
+
}
|
|
1317
|
+
|
|
1318
|
+
private createFolderElement(node: Node) {
|
|
1319
|
+
const closedIconElement = this.renderer.closedIconElement;
|
|
1320
|
+
const getScrollLeft = this._getScrollLeft.bind(this);
|
|
1321
|
+
const openedIconElement = this.renderer.openedIconElement;
|
|
1322
|
+
const tabIndex = this.options.tabIndex;
|
|
1323
|
+
const $treeElement = this.element;
|
|
1324
|
+
const triggerEvent = this._triggerEvent.bind(this);
|
|
1325
|
+
|
|
1326
|
+
return new FolderElement({
|
|
1327
|
+
closedIconElement,
|
|
1328
|
+
getScrollLeft,
|
|
1329
|
+
node,
|
|
1330
|
+
openedIconElement,
|
|
1331
|
+
tabIndex,
|
|
1332
|
+
$treeElement,
|
|
1333
|
+
triggerEvent,
|
|
1334
|
+
});
|
|
1335
|
+
}
|
|
1336
|
+
|
|
1337
|
+
private createNodeElement(node: Node) {
|
|
1338
|
+
const getScrollLeft = this._getScrollLeft.bind(this);
|
|
1339
|
+
const tabIndex = this.options.tabIndex;
|
|
1340
|
+
const $treeElement = this.element;
|
|
1341
|
+
|
|
1342
|
+
return new NodeElement({
|
|
1343
|
+
getScrollLeft,
|
|
1344
|
+
node,
|
|
1345
|
+
tabIndex,
|
|
1346
|
+
$treeElement,
|
|
1347
|
+
});
|
|
1348
|
+
}
|
|
1349
|
+
|
|
1350
|
+
private openParents(node: Node) {
|
|
1351
|
+
const parent = node.parent;
|
|
1352
|
+
|
|
1353
|
+
if (parent && parent.parent && !parent.is_open) {
|
|
1354
|
+
this.openNode(parent, false);
|
|
1355
|
+
}
|
|
1356
|
+
}
|
|
1175
1357
|
}
|
|
1176
1358
|
|
|
1177
1359
|
SimpleWidget.register(JqTreeWidget, "tree");
|
package/src/util.ts
CHANGED
|
@@ -5,3 +5,6 @@ export const isFunction = (v: unknown): boolean => typeof v === "function";
|
|
|
5
5
|
|
|
6
6
|
export const getBoolString = (value: unknown): string =>
|
|
7
7
|
value ? "true" : "false";
|
|
8
|
+
|
|
9
|
+
export const getOffsetTop = (element: HTMLElement) =>
|
|
10
|
+
element.getBoundingClientRect().y + window.scrollY;
|
package/src/version.ts
CHANGED