@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.
Files changed (161) hide show
  1. package/{assets → MediaAndStyles}/css/tree-animated-expand-button.css +2 -2
  2. package/{assets → MediaAndStyles}/css/tree.css +2 -2
  3. package/MediaAndStyles/themes/theme-base/fonts-webpack.css +35 -0
  4. package/MediaAndStyles/themes/theme-base/theme-base-media-webpack.css +43 -0
  5. package/MediaAndStyles/themes/theme-funny/fonts-webpack.css +7 -0
  6. package/MediaAndStyles/themes/theme-funny/theme-funny-webpack.css +22 -0
  7. package/MediaAndStyles/tree-styles-main-webpack.css +5 -0
  8. package/{assets → MediaAndStyles}/tree-styles-main.css +1 -1
  9. package/README.md +22 -22
  10. package/README_WEBPACK.md +31 -31
  11. package/package.json +16 -16
  12. package/{build → transpiled}/CommonJS/index.js.map +1 -1
  13. package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.js +3 -3
  14. package/{build → transpiled}/CommonJS/typescript/Tree.d.ts +7 -7
  15. package/transpiled/CommonJS/typescript/Tree.d.ts.map +1 -0
  16. package/{build → transpiled}/CommonJS/typescript/Tree.js +30 -30
  17. package/transpiled/CommonJS/typescript/Tree.js.map +1 -0
  18. package/{build/ESNext → transpiled/CommonJS}/typescript/TreeAdapterModeConf.d.ts +4 -4
  19. package/transpiled/CommonJS/typescript/TreeAdapterModeConf.d.ts.map +1 -0
  20. package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeConf.js +9 -9
  21. package/transpiled/CommonJS/typescript/TreeAdapterModeConf.js.map +1 -0
  22. package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.d.ts +4 -4
  23. package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.d.ts.map +1 -1
  24. package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.js +8 -8
  25. package/{build → transpiled}/CommonJS/typescript/TreeAdapterModeEase.js.map +1 -1
  26. package/{build → transpiled}/CommonJS/typescript/TreeConstants.js +5 -5
  27. package/{build → transpiled}/CommonJS/webpackAliases.d.ts.map +1 -1
  28. package/{build → transpiled}/CommonJS/webpackAliases.js.map +1 -1
  29. package/{build → transpiled}/ESNext/index.js.map +1 -1
  30. package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.js +3 -3
  31. package/{build → transpiled}/ESNext/typescript/Tree.d.ts +7 -7
  32. package/transpiled/ESNext/typescript/Tree.d.ts.map +1 -0
  33. package/{build → transpiled}/ESNext/typescript/Tree.js +31 -31
  34. package/transpiled/ESNext/typescript/Tree.js.map +1 -0
  35. package/{build/CommonJS → transpiled/ESNext}/typescript/TreeAdapterModeConf.d.ts +4 -4
  36. package/transpiled/ESNext/typescript/TreeAdapterModeConf.d.ts.map +1 -0
  37. package/{build → transpiled}/ESNext/typescript/TreeAdapterModeConf.js +9 -9
  38. package/transpiled/ESNext/typescript/TreeAdapterModeConf.js.map +1 -0
  39. package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.d.ts +4 -4
  40. package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.d.ts.map +1 -1
  41. package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.js +8 -8
  42. package/{build → transpiled}/ESNext/typescript/TreeAdapterModeEase.js.map +1 -1
  43. package/{build → transpiled}/ESNext/typescript/TreeConstants.js +5 -5
  44. package/{build → transpiled}/ESNext/webpackAliases.d.ts.map +1 -1
  45. package/{build → transpiled}/ESNext/webpackAliases.js.map +1 -1
  46. package/transpiled/Simple/typescript/ArrayOrObjectPackage.js +133 -0
  47. package/transpiled/Simple/typescript/Tree.js +869 -0
  48. package/transpiled/Simple/typescript/TreeAdapter.js +16 -0
  49. package/transpiled/Simple/typescript/TreeAdapterModeConf.js +91 -0
  50. package/transpiled/Simple/typescript/TreeAdapterModeEase.js +80 -0
  51. package/transpiled/Simple/typescript/TreeConf.js +30 -0
  52. package/transpiled/Simple/typescript/TreeConstants.js +66 -0
  53. package/transpiled/Simple/typescript/Types.js +4 -0
  54. package/transpiled/Simple/webpack.aliases.cjs +18 -0
  55. package/transpiled/Simple/webpack.aliases.mjs +13 -0
  56. package/transpiled/Simple/webpackAliases.js +43 -0
  57. package/webpack.aliases.json +1 -1
  58. package/assets/themes/theme-base/fonts-webpack.css +0 -35
  59. package/assets/themes/theme-base/theme-base-assets-webpack.css +0 -43
  60. package/assets/themes/theme-funny/fonts-webpack.css +0 -7
  61. package/assets/themes/theme-funny/theme-funny-webpack.css +0 -22
  62. package/assets/tree-styles-main-webpack.css +0 -5
  63. package/build/CommonJS/typescript/Tree.d.ts.map +0 -1
  64. package/build/CommonJS/typescript/Tree.js.map +0 -1
  65. package/build/CommonJS/typescript/TreeAdapterModeConf.d.ts.map +0 -1
  66. package/build/CommonJS/typescript/TreeAdapterModeConf.js.map +0 -1
  67. package/build/ESNext/typescript/Tree.d.ts.map +0 -1
  68. package/build/ESNext/typescript/Tree.js.map +0 -1
  69. package/build/ESNext/typescript/TreeAdapterModeConf.d.ts.map +0 -1
  70. package/build/ESNext/typescript/TreeAdapterModeConf.js.map +0 -1
  71. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/BalooPaaji2-VariableFont_wght.ttf +0 -0
  72. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/OFL.txt +0 -0
  73. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/README.txt +0 -0
  74. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Bold.ttf +0 -0
  75. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-ExtraBold.ttf +0 -0
  76. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Medium.ttf +0 -0
  77. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-Regular.ttf +0 -0
  78. /package/{assets → MediaAndStyles}/themes/theme-base/fonts/Baloo_Paaji_2/static/BalooPaaji2-SemiBold.ttf +0 -0
  79. /package/{assets → MediaAndStyles}/themes/theme-base/fonts.css +0 -0
  80. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-animated.gif +0 -0
  81. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-opened.png +0 -0
  82. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/button-open/button-without-subtree.svg +0 -0
  83. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-3-100.png +0 -0
  84. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-font-style-formatting-96.png +0 -0
  85. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-json-96.png +0 -0
  86. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-static-view-level2-80.png +0 -0
  87. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-true-false-96.png +0 -0
  88. /package/{assets → MediaAndStyles}/themes/theme-base/mini-images/data-types/icons8-view-array-96.png +0 -0
  89. /package/{assets/themes/theme-base/theme-base-assets.css → MediaAndStyles/themes/theme-base/theme-base-media.css} +0 -0
  90. /package/{assets → MediaAndStyles}/themes/theme-base/theme-base.css +0 -0
  91. /package/{assets → MediaAndStyles}/themes/theme-funny/fonts/Niconne/Niconne-Regular.ttf +0 -0
  92. /package/{assets → MediaAndStyles}/themes/theme-funny/fonts/Niconne/OFL.txt +0 -0
  93. /package/{assets → MediaAndStyles}/themes/theme-funny/fonts.css +0 -0
  94. /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/house.png +0 -0
  95. /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/html-intence.png +0 -0
  96. /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/html.png +0 -0
  97. /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/money-transfer.png +0 -0
  98. /package/{assets → MediaAndStyles}/themes/theme-funny/mini-images/data-types/track.png +0 -0
  99. /package/{assets → MediaAndStyles}/themes/theme-funny/theme-funny.css +0 -0
  100. /package/{build → transpiled}/CommonJS/index.d.ts +0 -0
  101. /package/{build → transpiled}/CommonJS/index.d.ts.map +0 -0
  102. /package/{build → transpiled}/CommonJS/index.js +0 -0
  103. /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.d.ts +0 -0
  104. /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.d.ts.map +0 -0
  105. /package/{build → transpiled}/CommonJS/typescript/ArrayOrObjectPackage.js.map +0 -0
  106. /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.d.ts +0 -0
  107. /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.d.ts.map +0 -0
  108. /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.js +0 -0
  109. /package/{build → transpiled}/CommonJS/typescript/TreeAdapter.js.map +0 -0
  110. /package/{build → transpiled}/CommonJS/typescript/TreeConf.d.ts +0 -0
  111. /package/{build → transpiled}/CommonJS/typescript/TreeConf.d.ts.map +0 -0
  112. /package/{build → transpiled}/CommonJS/typescript/TreeConf.js +0 -0
  113. /package/{build → transpiled}/CommonJS/typescript/TreeConf.js.map +0 -0
  114. /package/{build → transpiled}/CommonJS/typescript/TreeConstants.d.ts +0 -0
  115. /package/{build → transpiled}/CommonJS/typescript/TreeConstants.d.ts.map +0 -0
  116. /package/{build → transpiled}/CommonJS/typescript/TreeConstants.js.map +0 -0
  117. /package/{build → transpiled}/CommonJS/typescript/Types.d.ts +0 -0
  118. /package/{build → transpiled}/CommonJS/typescript/Types.d.ts.map +0 -0
  119. /package/{build → transpiled}/CommonJS/typescript/Types.js +0 -0
  120. /package/{build → transpiled}/CommonJS/typescript/Types.js.map +0 -0
  121. /package/{build → transpiled}/CommonJS/webpack.aliases.cjs +0 -0
  122. /package/{build → transpiled}/CommonJS/webpack.aliases.cjs.map +0 -0
  123. /package/{build → transpiled}/CommonJS/webpack.aliases.d.cts +0 -0
  124. /package/{build → transpiled}/CommonJS/webpack.aliases.d.cts.map +0 -0
  125. /package/{build → transpiled}/CommonJS/webpack.aliases.d.mts +0 -0
  126. /package/{build → transpiled}/CommonJS/webpack.aliases.d.mts.map +0 -0
  127. /package/{build → transpiled}/CommonJS/webpack.aliases.mjs +0 -0
  128. /package/{build → transpiled}/CommonJS/webpack.aliases.mjs.map +0 -0
  129. /package/{build → transpiled}/CommonJS/webpackAliases.d.ts +0 -0
  130. /package/{build → transpiled}/CommonJS/webpackAliases.js +0 -0
  131. /package/{build → transpiled}/ESNext/index.d.ts +0 -0
  132. /package/{build → transpiled}/ESNext/index.d.ts.map +0 -0
  133. /package/{build → transpiled}/ESNext/index.js +0 -0
  134. /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.d.ts +0 -0
  135. /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.d.ts.map +0 -0
  136. /package/{build → transpiled}/ESNext/typescript/ArrayOrObjectPackage.js.map +0 -0
  137. /package/{build → transpiled}/ESNext/typescript/TreeAdapter.d.ts +0 -0
  138. /package/{build → transpiled}/ESNext/typescript/TreeAdapter.d.ts.map +0 -0
  139. /package/{build → transpiled}/ESNext/typescript/TreeAdapter.js +0 -0
  140. /package/{build → transpiled}/ESNext/typescript/TreeAdapter.js.map +0 -0
  141. /package/{build → transpiled}/ESNext/typescript/TreeConf.d.ts +0 -0
  142. /package/{build → transpiled}/ESNext/typescript/TreeConf.d.ts.map +0 -0
  143. /package/{build → transpiled}/ESNext/typescript/TreeConf.js +0 -0
  144. /package/{build → transpiled}/ESNext/typescript/TreeConf.js.map +0 -0
  145. /package/{build → transpiled}/ESNext/typescript/TreeConstants.d.ts +0 -0
  146. /package/{build → transpiled}/ESNext/typescript/TreeConstants.d.ts.map +0 -0
  147. /package/{build → transpiled}/ESNext/typescript/TreeConstants.js.map +0 -0
  148. /package/{build → transpiled}/ESNext/typescript/Types.d.ts +0 -0
  149. /package/{build → transpiled}/ESNext/typescript/Types.d.ts.map +0 -0
  150. /package/{build → transpiled}/ESNext/typescript/Types.js +0 -0
  151. /package/{build → transpiled}/ESNext/typescript/Types.js.map +0 -0
  152. /package/{build → transpiled}/ESNext/webpack.aliases.cjs +0 -0
  153. /package/{build → transpiled}/ESNext/webpack.aliases.cjs.map +0 -0
  154. /package/{build → transpiled}/ESNext/webpack.aliases.d.cts +0 -0
  155. /package/{build → transpiled}/ESNext/webpack.aliases.d.cts.map +0 -0
  156. /package/{build → transpiled}/ESNext/webpack.aliases.d.mts +0 -0
  157. /package/{build → transpiled}/ESNext/webpack.aliases.d.mts.map +0 -0
  158. /package/{build → transpiled}/ESNext/webpack.aliases.mjs +0 -0
  159. /package/{build → transpiled}/ESNext/webpack.aliases.mjs.map +0 -0
  160. /package/{build → transpiled}/ESNext/webpackAliases.d.ts +0 -0
  161. /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, "&quot;")
815
+
816
+
817
+ // Replace double quotes
818
+ .replace(/'/g, "&#39;")
819
+
820
+
821
+ // Replace single quotes
822
+ .replace(/</g, "&lt;")
823
+
824
+
825
+ // Replace <
826
+ .replace(/>/g, "&gt;");
827
+
828
+
829
+ // Replace >
830
+ }
831
+
832
+
833
+ unescapeHTMLFromAttribute(str) {
834
+
835
+ if (!str) {
836
+ return "";
837
+ }
838
+
839
+ return str
840
+ .replace(/&quot;/g, "\"")
841
+
842
+
843
+ // Replace double quotes
844
+ .replace(/&#39;/g, "'")
845
+
846
+
847
+ // Replace single quotes
848
+ .replace(/&lt;/g, "<")
849
+
850
+
851
+ // Replace <
852
+ .replace(/&gt;/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
+