@jaisocx/tree 1.5.36 → 1.5.37
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/{assets → MediaAndStyles}/css/tree-animated-expand-button.css +2 -2
- package/{assets → MediaAndStyles}/css/tree.css +2 -2
- package/MediaAndStyles/themes/theme-base/fonts-webpack.css +35 -0
- package/MediaAndStyles/themes/theme-base/theme-base-media-webpack.css +43 -0
- package/MediaAndStyles/themes/theme-funny/fonts-webpack.css +7 -0
- package/MediaAndStyles/themes/theme-funny/theme-funny-webpack.css +22 -0
- package/MediaAndStyles/tree-styles-main-webpack.css +5 -0
- package/{assets → MediaAndStyles}/tree-styles-main.css +1 -1
- package/README.md +22 -22
- package/README_WEBPACK.md +31 -31
- package/package.json +16 -16
- package/{build → transpiled}/CommonJS/index.js.map +1 -1
- package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.js +3 -3
- package/{build → transpiled}/CommonJS/typescript/Tree.d.ts +7 -7
- package/transpiled/CommonJS/typescript/Tree.d.ts.map +1 -0
- package/{build → transpiled}/CommonJS/typescript/Tree.js +30 -30
- package/transpiled/CommonJS/typescript/Tree.js.map +1 -0
- package/{build/ESNext → transpiled/CommonJS}/typescript/TreeAdapterModeConf.d.ts +4 -4
- package/transpiled/CommonJS/typescript/TreeAdapterModeConf.d.ts.map +1 -0
- package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeConf.js +9 -9
- package/transpiled/CommonJS/typescript/TreeAdapterModeConf.js.map +1 -0
- package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.d.ts +4 -4
- package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.d.ts.map +1 -1
- package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.js +8 -8
- package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.js.map +1 -1
- package/{build → transpiled}/CommonJS/typescript/TreeConstants.js +5 -5
- package/{build → transpiled}/CommonJS/webpackAliases.d.ts.map +1 -1
- package/{build → transpiled}/CommonJS/webpackAliases.js.map +1 -1
- package/{build → transpiled}/ESNext/index.js.map +1 -1
- package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.js +3 -3
- package/{build → transpiled}/ESNext/typescript/Tree.d.ts +7 -7
- package/transpiled/ESNext/typescript/Tree.d.ts.map +1 -0
- package/{build → transpiled}/ESNext/typescript/Tree.js +31 -31
- package/transpiled/ESNext/typescript/Tree.js.map +1 -0
- package/{build/CommonJS → transpiled/ESNext}/typescript/TreeAdapterModeConf.d.ts +4 -4
- package/transpiled/ESNext/typescript/TreeAdapterModeConf.d.ts.map +1 -0
- package/{build → transpiled}/ESNext/typescript/TreeAdapterModeConf.js +9 -9
- package/transpiled/ESNext/typescript/TreeAdapterModeConf.js.map +1 -0
- package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.d.ts +4 -4
- package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.d.ts.map +1 -1
- package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.js +8 -8
- package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.js.map +1 -1
- package/{build → transpiled}/ESNext/typescript/TreeConstants.js +5 -5
- package/{build → transpiled}/ESNext/webpackAliases.d.ts.map +1 -1
- package/{build → transpiled}/ESNext/webpackAliases.js.map +1 -1
- package/transpiled/Simple/typescript/ArrayOrObjectPackage.js +133 -0
- package/transpiled/Simple/typescript/Tree.js +869 -0
- package/transpiled/Simple/typescript/TreeAdapter.js +16 -0
- package/transpiled/Simple/typescript/TreeAdapterModeConf.js +91 -0
- package/transpiled/Simple/typescript/TreeAdapterModeEase.js +80 -0
- package/transpiled/Simple/typescript/TreeConf.js +30 -0
- package/transpiled/Simple/typescript/TreeConstants.js +66 -0
- package/transpiled/Simple/typescript/Types.js +4 -0
- package/transpiled/Simple/webpack.aliases.cjs +18 -0
- package/transpiled/Simple/webpack.aliases.mjs +13 -0
- package/transpiled/Simple/webpackAliases.js +43 -0
- package/webpack.aliases.json +1 -1
- package/assets/themes/theme-base/fonts-webpack.css +0 -35
- package/assets/themes/theme-base/theme-base-assets-webpack.css +0 -43
- package/assets/themes/theme-funny/fonts-webpack.css +0 -7
- package/assets/themes/theme-funny/theme-funny-webpack.css +0 -22
- package/assets/tree-styles-main-webpack.css +0 -5
- package/build/CommonJS/typescript/Tree.d.ts.map +0 -1
- package/build/CommonJS/typescript/Tree.js.map +0 -1
- package/build/CommonJS/typescript/TreeAdapterModeConf.d.ts.map +0 -1
- package/build/CommonJS/typescript/TreeAdapterModeConf.js.map +0 -1
- package/build/ESNext/typescript/Tree.d.ts.map +0 -1
- package/build/ESNext/typescript/Tree.js.map +0 -1
- package/build/ESNext/typescript/TreeAdapterModeConf.d.ts.map +0 -1
- package/build/ESNext/typescript/TreeAdapterModeConf.js.map +0 -1
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/BalooPaaji2-VariableFont_wght.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/OFL.txt +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/README.txt +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Bold.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-ExtraBold.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Medium.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Regular.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-SemiBold.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/fonts.css +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-animated.gif +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-opened.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-without-subtree.svg +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-3-100.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-font-style-formatting-96.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-json-96.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-static-view-level2-80.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-true-false-96.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-view-array-96.png +0 -0
- /package/{assets/themes/theme-base/theme-base-assets.css → MediaAndStyles/themes/theme-base/theme-base-media.css} +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-base/theme-base.css +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/fonts/Niconne/Niconne-Regular.ttf +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/fonts/Niconne/OFL.txt +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/fonts.css +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/house.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/html-intence.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/html.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/money-transfer.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/track.png +0 -0
- /package/{assets → MediaAndStyles}/themes/theme-funny/theme-funny.css +0 -0
- /package/{build → transpiled}/CommonJS/index.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/index.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/index.js +0 -0
- /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.js.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.js +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.js.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConf.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConf.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConf.js +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConf.js.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConstants.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConstants.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/TreeConstants.js.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/Types.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/typescript/Types.d.ts.map +0 -0
- /package/{build → transpiled}/CommonJS/typescript/Types.js +0 -0
- /package/{build → transpiled}/CommonJS/typescript/Types.js.map +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.cjs +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.cjs.map +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.d.cts +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.d.cts.map +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.d.mts +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.d.mts.map +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.mjs +0 -0
- /package/{build → transpiled}/CommonJS/webpack.aliases.mjs.map +0 -0
- /package/{build → transpiled}/CommonJS/webpackAliases.d.ts +0 -0
- /package/{build → transpiled}/CommonJS/webpackAliases.js +0 -0
- /package/{build → transpiled}/ESNext/index.d.ts +0 -0
- /package/{build → transpiled}/ESNext/index.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/index.js +0 -0
- /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.d.ts +0 -0
- /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.js.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeAdapter.d.ts +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeAdapter.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeAdapter.js +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeAdapter.js.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConf.d.ts +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConf.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConf.js +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConf.js.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConstants.d.ts +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConstants.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/TreeConstants.js.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/Types.d.ts +0 -0
- /package/{build → transpiled}/ESNext/typescript/Types.d.ts.map +0 -0
- /package/{build → transpiled}/ESNext/typescript/Types.js +0 -0
- /package/{build → transpiled}/ESNext/typescript/Types.js.map +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.cjs +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.cjs.map +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.d.cts +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.d.cts.map +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.d.mts +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.d.mts.map +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.mjs +0 -0
- /package/{build → transpiled}/ESNext/webpack.aliases.mjs.map +0 -0
- /package/{build → transpiled}/ESNext/webpackAliases.d.ts +0 -0
- /package/{build → transpiled}/ESNext/webpackAliases.js +0 -0
|
@@ -0,0 +1,869 @@
|
|
|
1
|
+
class Tree extends ImprovedRenderEventEmitter {
|
|
2
|
+
debug;
|
|
3
|
+
mainHtmlNodeId;
|
|
4
|
+
mainHolderHtmlNode;
|
|
5
|
+
url;
|
|
6
|
+
data;
|
|
7
|
+
conf;
|
|
8
|
+
subtreeLength;
|
|
9
|
+
subtreeLengthDeep;
|
|
10
|
+
templateRenderer;
|
|
11
|
+
contextMenuJSClass;
|
|
12
|
+
renderingMode;
|
|
13
|
+
nodesWithIcons;
|
|
14
|
+
nodesOpenedMode;
|
|
15
|
+
isModifiable;
|
|
16
|
+
dataTypesCssClassesEnabled;
|
|
17
|
+
adapter;
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
super();
|
|
22
|
+
this.debug = TreeConstants.Defaults.debug;
|
|
23
|
+
this.mainHtmlNodeId = "";
|
|
24
|
+
this.mainHolderHtmlNode = null;
|
|
25
|
+
this.url = "";
|
|
26
|
+
this.data = null;
|
|
27
|
+
this.conf = new TreeConf();
|
|
28
|
+
this.subtreeLength = 0;
|
|
29
|
+
this.subtreeLengthDeep = 0;
|
|
30
|
+
this.templateRenderer = new TemplateRenderer();
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* this.templateRenderer
|
|
34
|
+
.addThisClassEventListener (
|
|
35
|
+
this.templateRenderer.EVENT_NAME__AFTER_RENDER,
|
|
36
|
+
// @ts-ignore
|
|
37
|
+
(payload: {html, data}) => {
|
|
38
|
+
let renderedHtml: any = payload.html;
|
|
39
|
+
let value: any = null;
|
|
40
|
+
|
|
41
|
+
if (!payload.data.hasSubtree) {
|
|
42
|
+
renderedHtml = payload.html.replace('<ul></ul>', '');
|
|
43
|
+
value = 'html modified';
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
const payloadReturned: any = {...payload, html: renderedHtml};
|
|
47
|
+
return {payloadReturned, value};
|
|
48
|
+
}
|
|
49
|
+
); */
|
|
50
|
+
this.contextMenuJSClass = null;
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
// DEFAULT VALUES ARE FROM CONSTANTS CLASS
|
|
54
|
+
this.setDebug(TreeConstants.Defaults.debug);
|
|
55
|
+
this.renderingMode = TreeConstants.Defaults.renderingMode;
|
|
56
|
+
this.nodesWithIcons = TreeConstants.Defaults.nodesWithIcons;
|
|
57
|
+
this.nodesOpenedMode = TreeConstants.Defaults.nodesOpenedMode;
|
|
58
|
+
this.isModifiable = TreeConstants.Defaults.isModifiable;
|
|
59
|
+
this.dataTypesCssClassesEnabled = TreeConstants.Defaults.dataTypesCssClassesEnabled;
|
|
60
|
+
this.adapter = new TreeAdapterModeEase();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
setDebug(debug) {
|
|
65
|
+
|
|
66
|
+
// optional method
|
|
67
|
+
super.setDebug(debug);
|
|
68
|
+
this.templateRenderer.setDebug(debug);
|
|
69
|
+
this.debug = debug;
|
|
70
|
+
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
setNodesWithIcons(withIcons) {
|
|
76
|
+
|
|
77
|
+
// optional method
|
|
78
|
+
this.nodesWithIcons = withIcons;
|
|
79
|
+
|
|
80
|
+
return this;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
setNodesOpenedMode(openedMode) {
|
|
85
|
+
|
|
86
|
+
// optional method
|
|
87
|
+
this.nodesOpenedMode = openedMode;
|
|
88
|
+
|
|
89
|
+
return this;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
setUrl(url) {
|
|
94
|
+
|
|
95
|
+
// optional method
|
|
96
|
+
this.url = url;
|
|
97
|
+
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
setMainHtmlNodeId(mainHtmlNodeId) {
|
|
103
|
+
|
|
104
|
+
// required method
|
|
105
|
+
this.mainHtmlNodeId = mainHtmlNodeId;
|
|
106
|
+
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
setConf(conf) {
|
|
112
|
+
|
|
113
|
+
// optional method
|
|
114
|
+
this.conf = conf;
|
|
115
|
+
|
|
116
|
+
return this;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
setModifiable(isModifiable) {
|
|
121
|
+
|
|
122
|
+
// optional method
|
|
123
|
+
this.isModifiable = isModifiable;
|
|
124
|
+
|
|
125
|
+
return this;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
setRenderingMode(mode) {
|
|
130
|
+
|
|
131
|
+
// optional method
|
|
132
|
+
this.renderingMode = mode;
|
|
133
|
+
|
|
134
|
+
return this;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
setDataTypesCssClassesEnabled(dataTypesCssEnabled) {
|
|
139
|
+
this.dataTypesCssClassesEnabled = dataTypesCssEnabled;
|
|
140
|
+
|
|
141
|
+
return this;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
load(url) {
|
|
146
|
+
|
|
147
|
+
if (url && url.length) {
|
|
148
|
+
this.url = url;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
if (!this.url || !this.mainHtmlNodeId) {
|
|
152
|
+
throw new Error("No url set");
|
|
153
|
+
}
|
|
154
|
+
fetch(this.url)
|
|
155
|
+
.then((response) => response.json())
|
|
156
|
+
.then((json) => {
|
|
157
|
+
this.render(json);
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
return this;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
adaptRenderingModeSubcalls() {
|
|
165
|
+
|
|
166
|
+
if (this.renderingMode === TreeConstants.RenderingMode.Conf) {
|
|
167
|
+
this.adapter = new TreeAdapterModeConf();
|
|
168
|
+
|
|
169
|
+
if (this.dataTypesCssClassesEnabled === true) {
|
|
170
|
+
this.getTreeNodeCssClasses = this.adapter.getTreeNodeCssClasses__dataTypesCssClassesEnabled.bind(this);
|
|
171
|
+
}
|
|
172
|
+
else {
|
|
173
|
+
this.getTreeNodeCssClasses = this.adapter.getTreeNodeCssClasses__dataTypesCssClassesDisabled.bind(this);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
else if (this.renderingMode === TreeConstants.RenderingMode.Ease) {
|
|
177
|
+
this.adapter = new TreeAdapterModeEase();
|
|
178
|
+
|
|
179
|
+
if (this.dataTypesCssClassesEnabled === true) {
|
|
180
|
+
this.getTreeNodeCssClasses = this.adapter.getTreeNodeCssClasses__dataTypesCssClassesEnabled.bind(this);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
|
|
184
|
+
// this.getTreeNodeCssClasses = this.getTreeNodeCssClasses__dataTypesCssClassesDisabled__renderingModeConf.bind(this);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
this.getSubtreeNodeToRender = this.adapter.getSubtreeNodeToRender.bind(this);
|
|
188
|
+
this.getDataForRendering = this.adapter.getDataForRendering.bind(this);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
reRender() {
|
|
193
|
+
this.render(this.data);
|
|
194
|
+
|
|
195
|
+
return this;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
render(nodes) {
|
|
200
|
+
|
|
201
|
+
if (nodes) {
|
|
202
|
+
this.data = nodes;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
if (!this.data
|
|
206
|
+
|| !this.conf) {
|
|
207
|
+
throw new Error(`Empty: data ${this.data} or conf ${this.conf}`);
|
|
208
|
+
}
|
|
209
|
+
this.mainHolderHtmlNode = document.getElementById(this.mainHtmlNodeId);
|
|
210
|
+
|
|
211
|
+
if (!this.mainHolderHtmlNode) {
|
|
212
|
+
throw new Error("Tree holder html node ID did not match any html node in this html doc.");
|
|
213
|
+
}
|
|
214
|
+
this.adaptRenderingModeSubcalls();
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
// set main css class name to the main tree holder html node
|
|
218
|
+
if (this.mainHolderHtmlNode.classList
|
|
219
|
+
&& !this.mainHolderHtmlNode.classList.contains(TreeConstants.TreeCssClassNames.MAIN_CLASS_NAME)) {
|
|
220
|
+
this.mainHolderHtmlNode.classList.add(TreeConstants.TreeCssClassNames.MAIN_CLASS_NAME);
|
|
221
|
+
}
|
|
222
|
+
else if (!this.mainHolderHtmlNode.classList) {
|
|
223
|
+
this.mainHolderHtmlNode.className = (TreeConstants.TreeCssClassNames.MAIN_CLASS_NAME);
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
if (this.nodesWithIcons === true) {
|
|
227
|
+
this.mainHolderHtmlNode.classList.add(TreeConstants.TreeCssClassNames.CLASS_NAME_WITH_ICONS);
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
this.mainHolderHtmlNode.classList.remove(TreeConstants.TreeCssClassNames.CLASS_NAME_WITH_ICONS);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
// add an html holder node for subtree html nodes
|
|
235
|
+
const ul = document.createElement("UL");
|
|
236
|
+
this.mainHolderHtmlNode.append(ul);
|
|
237
|
+
|
|
238
|
+
|
|
239
|
+
// get datatype of the main json data node
|
|
240
|
+
const dataType = ArrayOrObjectPackage.getDataType(nodes);
|
|
241
|
+
let isArray = 0;
|
|
242
|
+
|
|
243
|
+
if (dataType === ArrayOrObjectPackage.JsonDataType.ARRAY) {
|
|
244
|
+
isArray = 1;
|
|
245
|
+
}
|
|
246
|
+
else if (dataType !== ArrayOrObjectPackage.JsonDataType.OBJECT) {
|
|
247
|
+
throw new Error("Arrays or Objects supported. This JSON Data is not iterable.");
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
// get info on subtree nodes amount
|
|
252
|
+
const { itemsAmount, objectKeys } = ArrayOrObjectPackage.getArrayOrObjectItemsAmount(isArray, this.data);
|
|
253
|
+
const subtreeNodesCount = itemsAmount;
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
// exit throwing exception, if the tree json data is empty
|
|
257
|
+
if (subtreeNodesCount === 0) {
|
|
258
|
+
throw new Error("Tree json data is empty.");
|
|
259
|
+
}
|
|
260
|
+
const flatNodeHolderClone = { _pathArray: ["this.data"] };
|
|
261
|
+
let subtreeRenderResult;
|
|
262
|
+
|
|
263
|
+
if (this.renderingMode === TreeConstants.RenderingMode.Conf) {
|
|
264
|
+
|
|
265
|
+
if (isArray === 1) {
|
|
266
|
+
subtreeRenderResult = this.renderSubtree(
|
|
267
|
+
isArray,
|
|
268
|
+
this.data,
|
|
269
|
+
flatNodeHolderClone,
|
|
270
|
+
objectKeys,
|
|
271
|
+
ul
|
|
272
|
+
);
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
// @ts-ignore
|
|
276
|
+
this.subtreeLength = subtreeNodesCount;
|
|
277
|
+
|
|
278
|
+
|
|
279
|
+
// @ts-ignore
|
|
280
|
+
this.subtreeLengthDeep = subtreeRenderResult;
|
|
281
|
+
}
|
|
282
|
+
else if (isArray === 0) {
|
|
283
|
+
const isTreeItem = this.getInModeConfDataNodeIsTreeItem(this.data);
|
|
284
|
+
|
|
285
|
+
|
|
286
|
+
// the root json data node is the tree item data node
|
|
287
|
+
if (isTreeItem) {
|
|
288
|
+
const renderResult = this.renderOneTreeNode(
|
|
289
|
+
this.data,
|
|
290
|
+
0,
|
|
291
|
+
"Top",
|
|
292
|
+
{ _pathArray: ["this.data"] },
|
|
293
|
+
ul
|
|
294
|
+
);
|
|
295
|
+
const { currentNodeSubtreeLength } = renderResult;
|
|
296
|
+
this.data = renderResult.node;
|
|
297
|
+
|
|
298
|
+
|
|
299
|
+
// @ts-ignore
|
|
300
|
+
this.subtreeLength = subtreeNodesCount;
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
// @ts-ignore
|
|
304
|
+
this.subtreeLengthDeep = currentNodeSubtreeLength;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
|
|
308
|
+
// the root json data node is the associative array of tree item data nodes, suggested, if not so, then will not be rendered.
|
|
309
|
+
subtreeRenderResult = this.renderSubtree(
|
|
310
|
+
isArray,
|
|
311
|
+
this.data,
|
|
312
|
+
flatNodeHolderClone,
|
|
313
|
+
objectKeys,
|
|
314
|
+
ul
|
|
315
|
+
);
|
|
316
|
+
|
|
317
|
+
|
|
318
|
+
// @ts-ignore
|
|
319
|
+
this.subtreeLength = subtreeNodesCount;
|
|
320
|
+
|
|
321
|
+
|
|
322
|
+
// @ts-ignore
|
|
323
|
+
this.subtreeLengthDeep = subtreeRenderResult;
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
else if (this.renderingMode === TreeConstants.RenderingMode.Ease) {
|
|
328
|
+
const renderResult = this.renderOneTreeNode(
|
|
329
|
+
{ "Json Root": this.data },
|
|
330
|
+
0,
|
|
331
|
+
"Top",
|
|
332
|
+
{ _pathArray: ["this.data"] },
|
|
333
|
+
ul
|
|
334
|
+
);
|
|
335
|
+
const { currentNodeSubtreeLength } = renderResult;
|
|
336
|
+
|
|
337
|
+
|
|
338
|
+
// this.data = renderResult.node[0];
|
|
339
|
+
// @ts-ignore
|
|
340
|
+
this.subtreeLength = subtreeNodesCount;
|
|
341
|
+
|
|
342
|
+
|
|
343
|
+
// @ts-ignore
|
|
344
|
+
this.subtreeLengthDeep = currentNodeSubtreeLength;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
if (this.debug) {
|
|
348
|
+
console.log("Tree.data", this.data);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
|
|
352
|
+
// all eventsHandlers, assigned with addJSTreeEventListener,
|
|
353
|
+
// here will be attached to one DOM event listener
|
|
354
|
+
this.addJSTreeEventListeners();
|
|
355
|
+
|
|
356
|
+
return this;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
|
|
360
|
+
checkDataNodeSubtree(node) {
|
|
361
|
+
let hasSubtree = false;
|
|
362
|
+
let subtreeJsonNodes = null;
|
|
363
|
+
|
|
364
|
+
if (this.renderingMode === TreeConstants.RenderingMode.Conf) {
|
|
365
|
+
subtreeJsonNodes = node[this.conf.SUBTREE];
|
|
366
|
+
}
|
|
367
|
+
else if (this.renderingMode === TreeConstants.RenderingMode.Ease) {
|
|
368
|
+
subtreeJsonNodes = Object.values(node)[0];
|
|
369
|
+
}
|
|
370
|
+
const { dataTypeString, dataType } = ArrayOrObjectPackage.getDataTypeStringAndConst(subtreeJsonNodes);
|
|
371
|
+
const isArray = ((dataType === ArrayOrObjectPackage.JsonDataType.ARRAY) ? 1 : 0);
|
|
372
|
+
|
|
373
|
+
if ((!subtreeJsonNodes)
|
|
374
|
+
|| (subtreeJsonNodes.length === 0)
|
|
375
|
+
|| ((dataType !== ArrayOrObjectPackage.JsonDataType.ARRAY)
|
|
376
|
+
&& (dataType !== ArrayOrObjectPackage.JsonDataType.OBJECT))) {
|
|
377
|
+
return {
|
|
378
|
+
isArray,
|
|
379
|
+
subtreeNodeDataType: dataType,
|
|
380
|
+
subtreeNodeDataTypeString: dataTypeString,
|
|
381
|
+
hasSubtree,
|
|
382
|
+
subtreeJsonNodes,
|
|
383
|
+
objectKeys: null
|
|
384
|
+
};
|
|
385
|
+
}
|
|
386
|
+
const { itemsAmount, objectKeys } = ArrayOrObjectPackage.getArrayOrObjectItemsAmount(isArray, subtreeJsonNodes);
|
|
387
|
+
hasSubtree = (itemsAmount !== 0);
|
|
388
|
+
|
|
389
|
+
return {
|
|
390
|
+
isArray,
|
|
391
|
+
subtreeNodeDataType: dataType,
|
|
392
|
+
subtreeNodeDataTypeString: dataTypeString,
|
|
393
|
+
hasSubtree,
|
|
394
|
+
subtreeJsonNodes,
|
|
395
|
+
objectKeys
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
|
|
400
|
+
renderSubtree(
|
|
401
|
+
isArray,
|
|
402
|
+
subtreeNodes,
|
|
403
|
+
flatNodeHolderClone,
|
|
404
|
+
objectKeys,
|
|
405
|
+
subtreeHtmlHolder
|
|
406
|
+
) {
|
|
407
|
+
const renderSubtreeResult = ArrayOrObjectPackage.iterateOverArrayOrObjectDefined(
|
|
408
|
+
isArray,
|
|
409
|
+
subtreeNodes,
|
|
410
|
+
this.renderSubtreeCallback.bind(this),
|
|
411
|
+
{
|
|
412
|
+
subtreeHtmlHolder,
|
|
413
|
+
flatNodeHolderClone
|
|
414
|
+
},
|
|
415
|
+
objectKeys
|
|
416
|
+
);
|
|
417
|
+
|
|
418
|
+
return renderSubtreeResult;
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
|
|
422
|
+
renderSubtreeCallback(
|
|
423
|
+
_isArray,
|
|
424
|
+
loopCounter,
|
|
425
|
+
loopPropertyValue,
|
|
426
|
+
loopPropertyKey,
|
|
427
|
+
_arrayOrObject,
|
|
428
|
+
previousCallbackResult,
|
|
429
|
+
callbackPayload
|
|
430
|
+
) {
|
|
431
|
+
let currentNodeSubtreeLength = (previousCallbackResult) || 0;
|
|
432
|
+
const { subtreeHtmlHolder, flatNodeHolderClone } = callbackPayload;
|
|
433
|
+
const subtreeJsonNode = this.getSubtreeNodeToRender(
|
|
434
|
+
loopPropertyValue,
|
|
435
|
+
loopPropertyKey
|
|
436
|
+
);
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
// RENDERING ONE TREE NODE
|
|
440
|
+
const renderResult = this.renderOneTreeNode(
|
|
441
|
+
subtreeJsonNode,
|
|
442
|
+
loopCounter,
|
|
443
|
+
loopPropertyKey,
|
|
444
|
+
flatNodeHolderClone,
|
|
445
|
+
subtreeHtmlHolder
|
|
446
|
+
);
|
|
447
|
+
currentNodeSubtreeLength += renderResult.currentNodeSubtreeLength;
|
|
448
|
+
|
|
449
|
+
return currentNodeSubtreeLength;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
|
|
453
|
+
renderOneTreeNode(
|
|
454
|
+
node,
|
|
455
|
+
nodePosition,
|
|
456
|
+
nodeKey,
|
|
457
|
+
flatNodeHolderClone,
|
|
458
|
+
holder
|
|
459
|
+
) {
|
|
460
|
+
|
|
461
|
+
if (this.debug) {
|
|
462
|
+
console.log(node);
|
|
463
|
+
}
|
|
464
|
+
const nodeClone = this.updateDataNodeIdAndPath(
|
|
465
|
+
node,
|
|
466
|
+
nodePosition,
|
|
467
|
+
nodeKey,
|
|
468
|
+
flatNodeHolderClone,
|
|
469
|
+
holder
|
|
470
|
+
);
|
|
471
|
+
const { isArray, subtreeNodeDataTypeString, hasSubtree, subtreeJsonNodes, objectKeys } = this.checkDataNodeSubtree(node);
|
|
472
|
+
|
|
473
|
+
|
|
474
|
+
// TODO: EXTENSIBILITY FEATURE
|
|
475
|
+
const dataForRendering = this.getDataForRendering(
|
|
476
|
+
node,
|
|
477
|
+
nodeClone,
|
|
478
|
+
subtreeNodeDataTypeString,
|
|
479
|
+
hasSubtree
|
|
480
|
+
);
|
|
481
|
+
const nodeHtml = this.templateRenderer
|
|
482
|
+
.setTemplate(TreeConstants.TEMPLATE__TREE_HTML_NODE)
|
|
483
|
+
|
|
484
|
+
|
|
485
|
+
// @ts-ignore
|
|
486
|
+
.setData(dataForRendering)
|
|
487
|
+
.render();
|
|
488
|
+
holder.insertAdjacentHTML("beforeend", nodeHtml);
|
|
489
|
+
|
|
490
|
+
|
|
491
|
+
// @ts-ignore
|
|
492
|
+
const holderLiItems = holder.getElementsByTagName("LI");
|
|
493
|
+
const li = holderLiItems.item(holderLiItems.length - 1);
|
|
494
|
+
|
|
495
|
+
if (li === null) {
|
|
496
|
+
throw new Error("Rendiring broken, wrong html structure built.");
|
|
497
|
+
}
|
|
498
|
+
const eventAfterRenderOneNodePayload = {
|
|
499
|
+
eventName: TreeConstants.TreeEventsNames.EVENT_NAME__AFTER_RENDER_ONE_NODE,
|
|
500
|
+
treeHtmlNode: li,
|
|
501
|
+
treeItemJson: nodeClone
|
|
502
|
+
};
|
|
503
|
+
|
|
504
|
+
if (!hasSubtree) {
|
|
505
|
+
this.emitEvent(
|
|
506
|
+
TreeConstants.TreeEventsNames.EVENT_NAME__AFTER_RENDER_ONE_NODE,
|
|
507
|
+
eventAfterRenderOneNodePayload
|
|
508
|
+
);
|
|
509
|
+
|
|
510
|
+
return {
|
|
511
|
+
currentNodeSubtreeLength: 0,
|
|
512
|
+
node: nodeClone
|
|
513
|
+
};
|
|
514
|
+
}
|
|
515
|
+
const ul = li.getElementsByTagName("UL")[0];
|
|
516
|
+
|
|
517
|
+
|
|
518
|
+
// @ts-ignore
|
|
519
|
+
if (this.nodesOpenedMode === TreeConstants.NodesOpenedMode.ALL_HIDE) {
|
|
520
|
+
ul.style.display = "none";
|
|
521
|
+
}
|
|
522
|
+
else if ((!node[this.conf.NODE__OPENED])
|
|
523
|
+
&& (this.nodesOpenedMode === TreeConstants.NodesOpenedMode.JSON_DATA_DEFINED)) {
|
|
524
|
+
ul.style.display = "none";
|
|
525
|
+
}
|
|
526
|
+
else if ((node[this.conf.NODE__OPENED] === true)
|
|
527
|
+
&& (this.nodesOpenedMode === TreeConstants.NodesOpenedMode.JSON_DATA_DEFINED)) {
|
|
528
|
+
ul.style.display = "block";
|
|
529
|
+
}
|
|
530
|
+
else if (this.nodesOpenedMode === TreeConstants.NodesOpenedMode.ALL_SHOWN) {
|
|
531
|
+
ul.style.display = "block";
|
|
532
|
+
}
|
|
533
|
+
const subtreeRenderResult = this.renderSubtree(
|
|
534
|
+
isArray,
|
|
535
|
+
subtreeJsonNodes,
|
|
536
|
+
nodeClone,
|
|
537
|
+
objectKeys,
|
|
538
|
+
ul
|
|
539
|
+
);
|
|
540
|
+
this.emitEvent(
|
|
541
|
+
TreeConstants.TreeEventsNames.EVENT_NAME__AFTER_RENDER_ONE_NODE,
|
|
542
|
+
eventAfterRenderOneNodePayload
|
|
543
|
+
);
|
|
544
|
+
|
|
545
|
+
return {
|
|
546
|
+
currentNodeSubtreeLength: subtreeRenderResult.currentNodeSubtreeLength,
|
|
547
|
+
node: null
|
|
548
|
+
|
|
549
|
+
|
|
550
|
+
// CHECK OUT WHETHER BOKEN WHEN NOW NULL
|
|
551
|
+
};
|
|
552
|
+
}
|
|
553
|
+
|
|
554
|
+
|
|
555
|
+
// TEMPORARY IMPL TO KEEP POINTERS TO JSON DATA NODES IN HTML TREE NODES IN HTML NODE DATA ATTRIBUTES
|
|
556
|
+
updateDataNodeIdAndPath(
|
|
557
|
+
node,
|
|
558
|
+
nodePosition,
|
|
559
|
+
nodeKey,
|
|
560
|
+
flatNodeHolderClone,
|
|
561
|
+
_holder
|
|
562
|
+
) {
|
|
563
|
+
const id = node[this.conf.NODE__ID] ?? null;
|
|
564
|
+
const holderId = node[this.conf.NODE__HOLDER_ID] ?? null;
|
|
565
|
+
const flatCloneHolderId = flatNodeHolderClone._flatClone ? flatNodeHolderClone._flatClone[this.conf.NODE__ID] : null;
|
|
566
|
+
const pathInJsonOfNodeHolder = flatNodeHolderClone._pathArray ?? ["ROOT-unhandled"];
|
|
567
|
+
|
|
568
|
+
|
|
569
|
+
// let pathKeyInNodeHolder = JSON.stringify(nodeKey);
|
|
570
|
+
let pathInJsonArray = [
|
|
571
|
+
...pathInJsonOfNodeHolder
|
|
572
|
+
];
|
|
573
|
+
|
|
574
|
+
if ((pathInJsonOfNodeHolder.length > 1) && this.renderingMode === TreeConstants.RenderingMode.Conf) {
|
|
575
|
+
|
|
576
|
+
// const subtreePropName: any = JSON.stringify(this.conf.SUBTREE);
|
|
577
|
+
pathInJsonArray.push(this.conf.SUBTREE);
|
|
578
|
+
pathInJsonArray.push(nodeKey);
|
|
579
|
+
|
|
580
|
+
|
|
581
|
+
//pathKeyInNodeHolder = `[${subtreePropName}][${pathKeyInNodeHolder}]`;
|
|
582
|
+
}
|
|
583
|
+
else if (this.renderingMode === TreeConstants.RenderingMode.Ease) {
|
|
584
|
+
|
|
585
|
+
//pathKeyInNodeHolder = `[${pathKeyInNodeHolder}]`;
|
|
586
|
+
pathInJsonArray.push(nodeKey);
|
|
587
|
+
}
|
|
588
|
+
else {
|
|
589
|
+
|
|
590
|
+
//pathKeyInNodeHolder = `[${pathKeyInNodeHolder}]`;
|
|
591
|
+
pathInJsonArray.push(nodeKey);
|
|
592
|
+
}
|
|
593
|
+
const pathInJsonString = pathInJsonArray
|
|
594
|
+
.map((jPathIndex, index) => {
|
|
595
|
+
const jPathIndexText = JSON.stringify(jPathIndex);
|
|
596
|
+
|
|
597
|
+
return (index === 0) ? jPathIndex : `[${jPathIndexText}]`;
|
|
598
|
+
})
|
|
599
|
+
.join("");
|
|
600
|
+
const flatNodeClone = {};
|
|
601
|
+
|
|
602
|
+
for (const propName in node) {
|
|
603
|
+
const propValue = node[propName];
|
|
604
|
+
const dataType = (typeof propValue);
|
|
605
|
+
|
|
606
|
+
if (dataType === "object") {
|
|
607
|
+
continue;
|
|
608
|
+
}
|
|
609
|
+
flatNodeClone[propName] = propValue;
|
|
610
|
+
}
|
|
611
|
+
const nodeClone = {
|
|
612
|
+
[this.conf.NODE__ID]: id,
|
|
613
|
+
[this.conf.NODE__HOLDER_ID]: holderId,
|
|
614
|
+
_flatCloneHolderId: flatCloneHolderId,
|
|
615
|
+
_id: nodePosition,
|
|
616
|
+
_key: nodeKey,
|
|
617
|
+
_flatClone: flatNodeClone,
|
|
618
|
+
_pathArray: pathInJsonArray,
|
|
619
|
+
_path: pathInJsonString
|
|
620
|
+
};
|
|
621
|
+
|
|
622
|
+
return nodeClone;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
|
|
626
|
+
getTreeDataNodeByJsonnodePathArray(jPathArray) {
|
|
627
|
+
|
|
628
|
+
// since complexity of building jPath array in modeEase and modeConf, the JPathArray is not the same,
|
|
629
|
+
// and modeEase was built from item at index 2, since it has array item at index 1 "Top": this.data["Top"], and modeConf does not have this array item.
|
|
630
|
+
// modeConf was built recursively already from item at index 1.
|
|
631
|
+
const startingIndexValidJpath = (this.renderingMode === TreeConstants.RenderingMode.Conf) ? 1 : 2;
|
|
632
|
+
|
|
633
|
+
return jPathArray
|
|
634
|
+
.reduce(
|
|
635
|
+
(reducedRetValue, arrayItem, arrayItemIndex) => {
|
|
636
|
+
return (arrayItemIndex < startingIndexValidJpath) ? reducedRetValue : reducedRetValue[arrayItem];
|
|
637
|
+
},
|
|
638
|
+
this.data
|
|
639
|
+
);
|
|
640
|
+
}
|
|
641
|
+
|
|
642
|
+
|
|
643
|
+
getByJPath(data, jPathArray) {
|
|
644
|
+
return jPathArray
|
|
645
|
+
.reduce(
|
|
646
|
+
(reducedRetValue, arrayItem) => {
|
|
647
|
+
return reducedRetValue[arrayItem];
|
|
648
|
+
},
|
|
649
|
+
data
|
|
650
|
+
);
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
|
|
654
|
+
// ADAPTIVE PLACEHOLDERS
|
|
655
|
+
getSubtreeNodeToRender(
|
|
656
|
+
_loopPropertyValue,
|
|
657
|
+
_loopPropertyKey
|
|
658
|
+
) {
|
|
659
|
+
return null;
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
|
|
663
|
+
getDataForRendering(
|
|
664
|
+
_node,
|
|
665
|
+
_flatNodeClone,
|
|
666
|
+
_dataTypeString,
|
|
667
|
+
_hasSubtree
|
|
668
|
+
) {
|
|
669
|
+
return {
|
|
670
|
+
iconSrc: "",
|
|
671
|
+
iconShowClassName: "",
|
|
672
|
+
labelText: "",
|
|
673
|
+
hyperlink: "",
|
|
674
|
+
cssClasses: "",
|
|
675
|
+
dataId: "",
|
|
676
|
+
dataHolderId: "",
|
|
677
|
+
dataOrder: "",
|
|
678
|
+
dataJson: "",
|
|
679
|
+
openButtonStateClassName: "",
|
|
680
|
+
hasSubtree: true
|
|
681
|
+
};
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
|
|
685
|
+
getTreeNodeCssClasses(_dataType, _node) {
|
|
686
|
+
return "";
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
|
|
690
|
+
// FINISH BLOCK ADAPTIVE PLACEHOLDERS
|
|
691
|
+
// EVENTS BLOCK
|
|
692
|
+
addJSTreeEventListener(eventName, eventHandler) {
|
|
693
|
+
|
|
694
|
+
// the holder class LargeDomEventListenersOverheadOptimizer method call
|
|
695
|
+
this.addThisClassEventListener(eventName, eventHandler);
|
|
696
|
+
|
|
697
|
+
return this;
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
|
|
701
|
+
// the predefined events handlers
|
|
702
|
+
addJSTreeEventListeners() {
|
|
703
|
+
|
|
704
|
+
// the holder class LargeDomEventListenersOverheadOptimizer method call
|
|
705
|
+
// Here is the predefined open button handler,
|
|
706
|
+
// In Your custom code, this way You can define event handlers for heavy tree json data,
|
|
707
|
+
// and the tree will not be overloaded of large number of events listeners on many html nodes.
|
|
708
|
+
this.addDomEventListener(
|
|
709
|
+
"click",
|
|
710
|
+
".open-button",
|
|
711
|
+
this.initializeCustomJsTreeImprovedEventHandler(
|
|
712
|
+
TreeConstants.TreeEventsNames.EVENT_NAME__TREE_NODE_EXPAND_BUTTON__CLICK,
|
|
713
|
+
this.openButtonClickHandler.bind(this)
|
|
714
|
+
)
|
|
715
|
+
);
|
|
716
|
+
this.addDomEventListener(
|
|
717
|
+
"click",
|
|
718
|
+
".jstree-html-node-label",
|
|
719
|
+
this.initializeCustomJsTreeImprovedEventHandler(
|
|
720
|
+
TreeConstants.TreeEventsNames.EVENT_NAME__TREE_NODE_LABEL__CLICK,
|
|
721
|
+
this.treeNodeLableClickHandler.bind(this)
|
|
722
|
+
)
|
|
723
|
+
);
|
|
724
|
+
|
|
725
|
+
|
|
726
|
+
/* if (this.isModifiable) {
|
|
727
|
+
this.addDomEventListener(
|
|
728
|
+
"dblclick",
|
|
729
|
+
".jstree-html-node-holder-icon",
|
|
730
|
+
this.contextMenuRender
|
|
731
|
+
);
|
|
732
|
+
} */
|
|
733
|
+
|
|
734
|
+
|
|
735
|
+
// the holder class LargeDomEventListenersOverheadOptimizer method call
|
|
736
|
+
this.addDomEventListeners();
|
|
737
|
+
|
|
738
|
+
return this;
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
|
|
742
|
+
// here are set the JsTree event handlers actions, always needed, to reuse always in every JsTreeDomEventHndler.
|
|
743
|
+
initializeCustomJsTreeImprovedEventHandler(
|
|
744
|
+
jsTreeEventName,
|
|
745
|
+
customEventHandler
|
|
746
|
+
) {
|
|
747
|
+
return (eventPayload) => {
|
|
748
|
+
const treeHtmlNode = eventPayload.eventTarget.closest(".jstree-html-node");
|
|
749
|
+
const jsonNode = JSON.parse(this.unescapeHTMLFromAttribute(treeHtmlNode.dataset.json));
|
|
750
|
+
|
|
751
|
+
if (this.debug === true) {
|
|
752
|
+
console.log(
|
|
753
|
+
eventPayload.event.type,
|
|
754
|
+
treeHtmlNode,
|
|
755
|
+
jsonNode
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
eventPayload = {
|
|
759
|
+
...eventPayload,
|
|
760
|
+
jsonNode,
|
|
761
|
+
treeHtmlNode,
|
|
762
|
+
treeHtmlNodeHolder: treeHtmlNode.closest("li")
|
|
763
|
+
};
|
|
764
|
+
customEventHandler.call(this, eventPayload);
|
|
765
|
+
this.emitEvent(jsTreeEventName, eventPayload);
|
|
766
|
+
};
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
|
|
770
|
+
// the predefined events handlers
|
|
771
|
+
openButtonClickHandler(eventPayload) {
|
|
772
|
+
const toggleButton = eventPayload.eventTarget;
|
|
773
|
+
|
|
774
|
+
if (toggleButton.classList.contains(TreeConstants.TreeCssClassNames.CLASS_WITHOUT_SUBTREE)) {
|
|
775
|
+
return;
|
|
776
|
+
}
|
|
777
|
+
const subtreeContainer = toggleButton.closest("li").getElementsByTagName("ul")[0];
|
|
778
|
+
const isOpened = toggleButton.classList.contains(TreeConstants.TreeCssClassNames.CLASS_OPENED);
|
|
779
|
+
|
|
780
|
+
if (isOpened) {
|
|
781
|
+
toggleButton.classList.remove(TreeConstants.TreeCssClassNames.CLASS_OPENED);
|
|
782
|
+
subtreeContainer.style.display = "none";
|
|
783
|
+
}
|
|
784
|
+
else {
|
|
785
|
+
toggleButton.classList.add(TreeConstants.TreeCssClassNames.CLASS_OPENED);
|
|
786
|
+
subtreeContainer.style.display = "block";
|
|
787
|
+
}
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
|
|
791
|
+
// the predefined events handlers
|
|
792
|
+
treeNodeLableClickHandler(_eventPayload) {
|
|
793
|
+
|
|
794
|
+
// example for custom event handler, the placeholder
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
|
|
798
|
+
// END EVENTS BLOCK
|
|
799
|
+
getInModeConfDataNodeIsTreeItem(node) {
|
|
800
|
+
|
|
801
|
+
// @ts-ignore
|
|
802
|
+
const nodeLabelTextPropertyValue = node[this.conf.NODE_LABEL__TEXT];
|
|
803
|
+
|
|
804
|
+
|
|
805
|
+
// the main conf required dsts json field is label text. and it cannot be an object, but a string or number.
|
|
806
|
+
const isTreeItem = (nodeLabelTextPropertyValue && ((nodeLabelTextPropertyValue) !== "object"));
|
|
807
|
+
|
|
808
|
+
return isTreeItem;
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
|
|
812
|
+
escapeHTMLForAttribute(str) {
|
|
813
|
+
return str
|
|
814
|
+
.replace(/"/g, """)
|
|
815
|
+
|
|
816
|
+
|
|
817
|
+
// Replace double quotes
|
|
818
|
+
.replace(/'/g, "'")
|
|
819
|
+
|
|
820
|
+
|
|
821
|
+
// Replace single quotes
|
|
822
|
+
.replace(/</g, "<")
|
|
823
|
+
|
|
824
|
+
|
|
825
|
+
// Replace <
|
|
826
|
+
.replace(/>/g, ">");
|
|
827
|
+
|
|
828
|
+
|
|
829
|
+
// Replace >
|
|
830
|
+
}
|
|
831
|
+
|
|
832
|
+
|
|
833
|
+
unescapeHTMLFromAttribute(str) {
|
|
834
|
+
|
|
835
|
+
if (!str) {
|
|
836
|
+
return "";
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
return str
|
|
840
|
+
.replace(/"/g, "\"")
|
|
841
|
+
|
|
842
|
+
|
|
843
|
+
// Replace double quotes
|
|
844
|
+
.replace(/'/g, "'")
|
|
845
|
+
|
|
846
|
+
|
|
847
|
+
// Replace single quotes
|
|
848
|
+
.replace(/</g, "<")
|
|
849
|
+
|
|
850
|
+
|
|
851
|
+
// Replace <
|
|
852
|
+
.replace(/>/g, ">");
|
|
853
|
+
|
|
854
|
+
|
|
855
|
+
// Replace >
|
|
856
|
+
}
|
|
857
|
+
|
|
858
|
+
|
|
859
|
+
getTreeHtmlNodeDatasetJson(htmlNode) {
|
|
860
|
+
|
|
861
|
+
if (htmlNode === null) {
|
|
862
|
+
return "";
|
|
863
|
+
}
|
|
864
|
+
|
|
865
|
+
return JSON.parse(this.unescapeHTMLFromAttribute(htmlNode.dataset.json));
|
|
866
|
+
}
|
|
867
|
+
}
|
|
868
|
+
|
|
869
|
+
|