funda-ui 1.0.272

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 (246) hide show
  1. package/BackToTop/index.css +34 -0
  2. package/BackToTop/index.d.ts +11 -0
  3. package/BackToTop/index.js +458 -0
  4. package/CascadingSelect/index.css +159 -0
  5. package/CascadingSelect/index.d.ts +56 -0
  6. package/CascadingSelect/index.js +958 -0
  7. package/CascadingSelectE2E/index.css +159 -0
  8. package/CascadingSelectE2E/index.d.ts +60 -0
  9. package/CascadingSelectE2E/index.js +1126 -0
  10. package/Checkbox/index.d.ts +30 -0
  11. package/Checkbox/index.js +226 -0
  12. package/ColorPicker/index.css +38 -0
  13. package/ColorPicker/index.d.ts +27 -0
  14. package/ColorPicker/index.js +246 -0
  15. package/DigitalClock/index.d.ts +7 -0
  16. package/DigitalClock/index.js +208 -0
  17. package/DropdownMenu/index.css +127 -0
  18. package/DropdownMenu/index.d.ts +37 -0
  19. package/DropdownMenu/index.js +237 -0
  20. package/DynamicFields/index.d.ts +26 -0
  21. package/DynamicFields/index.js +412 -0
  22. package/File/index.d.ts +36 -0
  23. package/File/index.js +473 -0
  24. package/Input/index.d.ts +42 -0
  25. package/Input/index.js +286 -0
  26. package/LiveSearch/index.d.ts +37 -0
  27. package/LiveSearch/index.js +1195 -0
  28. package/ModalDialog/index.d.ts +60 -0
  29. package/ModalDialog/index.js +725 -0
  30. package/ModeSwitch/index.d.ts +17 -0
  31. package/ModeSwitch/index.js +202 -0
  32. package/MultiFuncSelect/index.css +178 -0
  33. package/MultiFuncSelect/index.d.ts +67 -0
  34. package/MultiFuncSelect/index.js +1826 -0
  35. package/MultilevelDropdownMenu/index.css +35 -0
  36. package/MultilevelDropdownMenu/index.d.ts +25 -0
  37. package/MultilevelDropdownMenu/index.js +464 -0
  38. package/Pagination/index.d.ts +49 -0
  39. package/Pagination/index.js +341 -0
  40. package/README.md +108 -0
  41. package/Radio/index.d.ts +31 -0
  42. package/Radio/index.js +246 -0
  43. package/RangeSlider/index.css +149 -0
  44. package/RangeSlider/index.d.ts +21 -0
  45. package/RangeSlider/index.js +730 -0
  46. package/ScrollReveal/index.css +23 -0
  47. package/ScrollReveal/index.d.ts +21 -0
  48. package/ScrollReveal/index.js +216 -0
  49. package/Scrollbar/index.css +168 -0
  50. package/Scrollbar/index.d.ts +15 -0
  51. package/Scrollbar/index.js +605 -0
  52. package/SearchBar/index.d.ts +32 -0
  53. package/SearchBar/index.js +246 -0
  54. package/Select/index.d.ts +34 -0
  55. package/Select/index.js +331 -0
  56. package/ShowMoreLess/index.css +23 -0
  57. package/ShowMoreLess/index.d.ts +30 -0
  58. package/ShowMoreLess/index.js +202 -0
  59. package/Switch/index.d.ts +29 -0
  60. package/Switch/index.js +211 -0
  61. package/Table/index.css +533 -0
  62. package/Table/index.d.ts +25 -0
  63. package/Table/index.js +2113 -0
  64. package/Tabs/index.d.ts +3 -0
  65. package/Tabs/index.js +323 -0
  66. package/TagInput/index.css +90 -0
  67. package/TagInput/index.d.ts +28 -0
  68. package/TagInput/index.js +370 -0
  69. package/Textarea/index.d.ts +30 -0
  70. package/Textarea/index.js +242 -0
  71. package/Toast/index.css +95 -0
  72. package/Toast/index.d.ts +35 -0
  73. package/Toast/index.js +340 -0
  74. package/Tooltip/index.css +240 -0
  75. package/Tooltip/index.d.ts +19 -0
  76. package/Tooltip/index.js +200 -0
  77. package/Tree/index.css +225 -0
  78. package/Tree/index.d.ts +37 -0
  79. package/Tree/index.js +1406 -0
  80. package/all.d.ts +33 -0
  81. package/all.js +35 -0
  82. package/lib/cjs/BackToTop/index.d.ts +11 -0
  83. package/lib/cjs/BackToTop/index.js +458 -0
  84. package/lib/cjs/CascadingSelect/index.d.ts +56 -0
  85. package/lib/cjs/CascadingSelect/index.js +958 -0
  86. package/lib/cjs/CascadingSelectE2E/index.d.ts +60 -0
  87. package/lib/cjs/CascadingSelectE2E/index.js +1126 -0
  88. package/lib/cjs/Checkbox/index.d.ts +30 -0
  89. package/lib/cjs/Checkbox/index.js +226 -0
  90. package/lib/cjs/ColorPicker/index.d.ts +27 -0
  91. package/lib/cjs/ColorPicker/index.js +246 -0
  92. package/lib/cjs/DigitalClock/index.d.ts +7 -0
  93. package/lib/cjs/DigitalClock/index.js +208 -0
  94. package/lib/cjs/DropdownMenu/index.d.ts +37 -0
  95. package/lib/cjs/DropdownMenu/index.js +237 -0
  96. package/lib/cjs/DynamicFields/index.d.ts +26 -0
  97. package/lib/cjs/DynamicFields/index.js +412 -0
  98. package/lib/cjs/File/index.d.ts +36 -0
  99. package/lib/cjs/File/index.js +473 -0
  100. package/lib/cjs/Input/index.d.ts +42 -0
  101. package/lib/cjs/Input/index.js +286 -0
  102. package/lib/cjs/LiveSearch/index.d.ts +37 -0
  103. package/lib/cjs/LiveSearch/index.js +1195 -0
  104. package/lib/cjs/ModalDialog/index.d.ts +60 -0
  105. package/lib/cjs/ModalDialog/index.js +725 -0
  106. package/lib/cjs/ModeSwitch/index.d.ts +17 -0
  107. package/lib/cjs/ModeSwitch/index.js +202 -0
  108. package/lib/cjs/MultiFuncSelect/index.d.ts +67 -0
  109. package/lib/cjs/MultiFuncSelect/index.js +1826 -0
  110. package/lib/cjs/MultilevelDropdownMenu/index.d.ts +25 -0
  111. package/lib/cjs/MultilevelDropdownMenu/index.js +464 -0
  112. package/lib/cjs/Pagination/index.d.ts +49 -0
  113. package/lib/cjs/Pagination/index.js +341 -0
  114. package/lib/cjs/Radio/index.d.ts +31 -0
  115. package/lib/cjs/Radio/index.js +246 -0
  116. package/lib/cjs/RangeSlider/index.d.ts +21 -0
  117. package/lib/cjs/RangeSlider/index.js +730 -0
  118. package/lib/cjs/ScrollReveal/index.d.ts +21 -0
  119. package/lib/cjs/ScrollReveal/index.js +216 -0
  120. package/lib/cjs/Scrollbar/index.d.ts +15 -0
  121. package/lib/cjs/Scrollbar/index.js +605 -0
  122. package/lib/cjs/SearchBar/index.d.ts +32 -0
  123. package/lib/cjs/SearchBar/index.js +246 -0
  124. package/lib/cjs/Select/index.d.ts +34 -0
  125. package/lib/cjs/Select/index.js +331 -0
  126. package/lib/cjs/ShowMoreLess/index.d.ts +30 -0
  127. package/lib/cjs/ShowMoreLess/index.js +202 -0
  128. package/lib/cjs/Switch/index.d.ts +29 -0
  129. package/lib/cjs/Switch/index.js +211 -0
  130. package/lib/cjs/Table/index.d.ts +25 -0
  131. package/lib/cjs/Table/index.js +2113 -0
  132. package/lib/cjs/Tabs/index.d.ts +3 -0
  133. package/lib/cjs/Tabs/index.js +323 -0
  134. package/lib/cjs/TagInput/index.d.ts +28 -0
  135. package/lib/cjs/TagInput/index.js +370 -0
  136. package/lib/cjs/Textarea/index.d.ts +30 -0
  137. package/lib/cjs/Textarea/index.js +242 -0
  138. package/lib/cjs/Toast/index.d.ts +35 -0
  139. package/lib/cjs/Toast/index.js +340 -0
  140. package/lib/cjs/Tooltip/index.d.ts +19 -0
  141. package/lib/cjs/Tooltip/index.js +200 -0
  142. package/lib/cjs/Tree/index.d.ts +37 -0
  143. package/lib/cjs/Tree/index.js +1406 -0
  144. package/lib/cjs/index.d.ts +33 -0
  145. package/lib/cjs/index.js +35 -0
  146. package/lib/css/BackToTop/index.css +34 -0
  147. package/lib/css/CascadingSelect/index.css +159 -0
  148. package/lib/css/CascadingSelectE2E/index.css +159 -0
  149. package/lib/css/ColorPicker/index.css +38 -0
  150. package/lib/css/DropdownMenu/index.css +127 -0
  151. package/lib/css/MultiFuncSelect/index.css +178 -0
  152. package/lib/css/MultilevelDropdownMenu/index.css +35 -0
  153. package/lib/css/RangeSlider/index.css +149 -0
  154. package/lib/css/ScrollReveal/index.css +23 -0
  155. package/lib/css/Scrollbar/index.css +168 -0
  156. package/lib/css/ShowMoreLess/index.css +23 -0
  157. package/lib/css/Table/index.css +533 -0
  158. package/lib/css/TagInput/index.css +90 -0
  159. package/lib/css/Toast/index.css +95 -0
  160. package/lib/css/Tooltip/index.css +240 -0
  161. package/lib/css/Tree/index.css +225 -0
  162. package/lib/esm/BackToTop/index.scss +47 -0
  163. package/lib/esm/BackToTop/index.tsx +182 -0
  164. package/lib/esm/BackToTop/utils/easing.js +200 -0
  165. package/lib/esm/BackToTop/utils/performance.js +52 -0
  166. package/lib/esm/CascadingSelect/Group.tsx +39 -0
  167. package/lib/esm/CascadingSelect/index.scss +214 -0
  168. package/lib/esm/CascadingSelect/index.tsx +922 -0
  169. package/lib/esm/CascadingSelect/utils/performance.js +52 -0
  170. package/lib/esm/CascadingSelectE2E/Group.tsx +39 -0
  171. package/lib/esm/CascadingSelectE2E/index.scss +214 -0
  172. package/lib/esm/CascadingSelectE2E/index.tsx +1091 -0
  173. package/lib/esm/CascadingSelectE2E/utils/performance.js +52 -0
  174. package/lib/esm/Checkbox/index.tsx +160 -0
  175. package/lib/esm/ColorPicker/index.scss +48 -0
  176. package/lib/esm/ColorPicker/index.tsx +187 -0
  177. package/lib/esm/DigitalClock/index.tsx +72 -0
  178. package/lib/esm/DigitalClock/utils/useInterval.js +43 -0
  179. package/lib/esm/DropdownMenu/Option.tsx +27 -0
  180. package/lib/esm/DropdownMenu/index.scss +180 -0
  181. package/lib/esm/DropdownMenu/index.tsx +148 -0
  182. package/lib/esm/DynamicFields/index.tsx +386 -0
  183. package/lib/esm/File/index.tsx +302 -0
  184. package/lib/esm/Input/index.tsx +233 -0
  185. package/lib/esm/LiveSearch/index.tsx +582 -0
  186. package/lib/esm/LiveSearch/utils/performance.js +52 -0
  187. package/lib/esm/LiveSearch/utils/useThrottle.js +36 -0
  188. package/lib/esm/ModalDialog/index.tsx +479 -0
  189. package/lib/esm/ModalDialog/plugins/BSL/bodyScrollLock.es6.js +262 -0
  190. package/lib/esm/ModalDialog/plugins/BSL/index.ts +2 -0
  191. package/lib/esm/ModeSwitch/index.tsx +82 -0
  192. package/lib/esm/MultiFuncSelect/index.scss +269 -0
  193. package/lib/esm/MultiFuncSelect/index.tsx +1597 -0
  194. package/lib/esm/MultiFuncSelect/utils/performance.js +52 -0
  195. package/lib/esm/MultiFuncSelect/utils/tree.js +103 -0
  196. package/lib/esm/MultiFuncSelect/utils/useThrottle.js +36 -0
  197. package/lib/esm/MultilevelDropdownMenu/MenuList.tsx +230 -0
  198. package/lib/esm/MultilevelDropdownMenu/index.scss +75 -0
  199. package/lib/esm/MultilevelDropdownMenu/index.tsx +71 -0
  200. package/lib/esm/MultilevelDropdownMenu/utils/dom.js +81 -0
  201. package/lib/esm/Pagination/index.tsx +230 -0
  202. package/lib/esm/Pagination/pagination-navigators.tsx +60 -0
  203. package/lib/esm/Radio/index.tsx +201 -0
  204. package/lib/esm/RangeSlider/index.scss +184 -0
  205. package/lib/esm/RangeSlider/index.tsx +223 -0
  206. package/lib/esm/ScrollReveal/index.scss +27 -0
  207. package/lib/esm/ScrollReveal/index.tsx +146 -0
  208. package/lib/esm/Scrollbar/index.scss +217 -0
  209. package/lib/esm/Scrollbar/index.tsx +497 -0
  210. package/lib/esm/Scrollbar/utils/performance.js +52 -0
  211. package/lib/esm/SearchBar/index.tsx +181 -0
  212. package/lib/esm/Select/index.tsx +276 -0
  213. package/lib/esm/ShowMoreLess/index.scss +27 -0
  214. package/lib/esm/ShowMoreLess/index.tsx +144 -0
  215. package/lib/esm/Switch/index.tsx +143 -0
  216. package/lib/esm/Table/TableColgroup.tsx +29 -0
  217. package/lib/esm/Table/TableField.tsx +40 -0
  218. package/lib/esm/Table/TableFieldRow.tsx +212 -0
  219. package/lib/esm/Table/TableHeaders.tsx +146 -0
  220. package/lib/esm/Table/TableRow.tsx +127 -0
  221. package/lib/esm/Table/TableSummaries.tsx +36 -0
  222. package/lib/esm/Table/index.scss +364 -0
  223. package/lib/esm/Table/index.tsx +576 -0
  224. package/lib/esm/Table/table-utils.ts +65 -0
  225. package/lib/esm/Table/utils/dom.js +81 -0
  226. package/lib/esm/Table/utils/performance.js +52 -0
  227. package/lib/esm/Tabs/TabList.tsx +42 -0
  228. package/lib/esm/Tabs/TabPanel.tsx +34 -0
  229. package/lib/esm/Tabs/Tabs.tsx +232 -0
  230. package/lib/esm/Tabs/index.tsx +3 -0
  231. package/lib/esm/TagInput/index.scss +125 -0
  232. package/lib/esm/TagInput/index.tsx +314 -0
  233. package/lib/esm/Textarea/index.tsx +178 -0
  234. package/lib/esm/Toast/Item.tsx +75 -0
  235. package/lib/esm/Toast/index.scss +120 -0
  236. package/lib/esm/Toast/index.tsx +249 -0
  237. package/lib/esm/Tooltip/index.scss +327 -0
  238. package/lib/esm/Tooltip/index.tsx +142 -0
  239. package/lib/esm/Tree/TreeList.tsx +503 -0
  240. package/lib/esm/Tree/index.scss +375 -0
  241. package/lib/esm/Tree/index.tsx +301 -0
  242. package/lib/esm/Tree/init-height.tsx +27 -0
  243. package/lib/esm/Tree/utils/convert-tree.js +29 -0
  244. package/lib/esm/Tree/utils/dom.js +81 -0
  245. package/lib/esm/index.js +31 -0
  246. package/package.json +40 -0
@@ -0,0 +1,503 @@
1
+ import React, { useEffect, useRef, useCallback } from 'react';
2
+
3
+ import Checkbox from 'rpb-checkbox';
4
+
5
+
6
+ import { getNextSiblings, getParents, getChildren } from './utils/dom';
7
+
8
+ import { initUlHeight } from './init-height';
9
+
10
+ interface fetchConfig {
11
+ fetchFuncAsync?: any | undefined;
12
+ fetchFuncMethod?: string | undefined;
13
+ fetchFuncMethodParams?: any[] | undefined;
14
+ fetchCallback?: (data: any) => void;
15
+ }
16
+
17
+
18
+ /* Recursively nested components to traverse nodes
19
+ -------------------------------------------------*/
20
+ type TreeListProps = {
21
+ rootNode: React.RefObject<HTMLDivElement>;
22
+ checkboxNamePrefix?: string;
23
+ alternateCollapse?: boolean;
24
+ first?: boolean;
25
+ disableArrow?: boolean;
26
+ disableCollapse?: boolean;
27
+ arrow?: React.ReactNode;
28
+ arrowIcons?: React.ReactNode[];
29
+ childClassName?: string;
30
+ data: any[any];
31
+ getCheckedPrint?: any[];
32
+ updateCheckedPrint?: any;
33
+ getCheckedData?: any[];
34
+ updategetCheckedData?: any;
35
+ onSelect?: (e: any, val: any, func: Function) => void;
36
+ onCollapse?: (e: any, val: any, func: Function) => void;
37
+ onCheck?: (val: any) => void;
38
+ evInitValue?: (key: React.Key | null, fetch: fetchConfig | null, firstRender: boolean) => void;
39
+ };
40
+
41
+ export default function TreeList(props: TreeListProps) {
42
+
43
+ const {
44
+ rootNode,
45
+ checkboxNamePrefix,
46
+ alternateCollapse,
47
+ first,
48
+ disableArrow,
49
+ disableCollapse,
50
+ arrow,
51
+ arrowIcons,
52
+ childClassName,
53
+ data,
54
+ getCheckedPrint,
55
+ updateCheckedPrint,
56
+ getCheckedData,
57
+ updategetCheckedData,
58
+ onSelect,
59
+ onCollapse,
60
+ onCheck,
61
+ evInitValue
62
+
63
+ } = props;
64
+
65
+ const rootRef = useRef<any>(null);
66
+
67
+ const customIcon: React.ReactNode = <var className="default-icon"><svg width="0.75em" height="0.75em" viewBox="0 0 20 20" fill="none"><path d="M15.795 11.272L7.795 16.272C6.79593 16.8964 5.5 16.1782 5.5 15L5.5 5.00002C5.5 3.82186 6.79593 3.1036 7.795 3.72802L15.795 8.72802C16.735 9.31552 16.735 10.6845 15.795 11.272Z" fill="currentColor"/></svg></var>;
68
+
69
+ const loadingIcon: React.ReactNode = <var className="loading-icon"><svg width="1em" height="1em" viewBox="0 0 512 512"><g><path fill="currentColor" d="M256,0c-23.357,0-42.297,18.932-42.297,42.288c0,23.358,18.94,42.288,42.297,42.288c23.357,0,42.279-18.93,42.279-42.288C298.279,18.932,279.357,0,256,0z"/><path fill="currentColor" d="M256,427.424c-23.357,0-42.297,18.931-42.297,42.288C213.703,493.07,232.643,512,256,512c23.357,0,42.279-18.93,42.279-42.288C298.279,446.355,279.357,427.424,256,427.424z"/><path fill="currentColor" d="M74.974,74.983c-16.52,16.511-16.52,43.286,0,59.806c16.52,16.52,43.287,16.52,59.806,0c16.52-16.511,16.52-43.286,0-59.806C118.261,58.463,91.494,58.463,74.974,74.983z"/><path fill="currentColor" d="M377.203,377.211c-16.503,16.52-16.503,43.296,0,59.815c16.519,16.52,43.304,16.52,59.806,0c16.52-16.51,16.52-43.295,0-59.815C420.489,360.692,393.722,360.7,377.203,377.211z"/><path fill="currentColor" d="M84.567,256c0.018-23.348-18.922-42.279-42.279-42.279c-23.357-0.009-42.297,18.932-42.279,42.288c-0.018,23.348,18.904,42.279,42.279,42.279C65.645,298.288,84.567,279.358,84.567,256z"/><path fill="currentColor" d="M469.712,213.712c-23.357,0-42.279,18.941-42.297,42.288c0,23.358,18.94,42.288,42.297,42.297c23.357,0,42.297-18.94,42.279-42.297C512.009,232.652,493.069,213.712,469.712,213.712z"/><path fill="currentColor" d="M74.991,377.22c-16.519,16.511-16.519,43.296,0,59.806c16.503,16.52,43.27,16.52,59.789,0c16.52-16.519,16.52-43.295,0-59.815C118.278,360.692,91.511,360.692,74.991,377.22z"/><path fill="currentColor" d="M437.026,134.798c16.52-16.52,16.52-43.304,0-59.824c-16.519-16.511-43.304-16.52-59.823,0c-16.52,16.52-16.503,43.295,0,59.815C393.722,151.309,420.507,151.309,437.026,134.798z"/></g></svg></var>;
70
+
71
+
72
+ const removeItemOnce = (arr: any[], key: string) => {
73
+ return arr.filter((item: any) => {
74
+ return item.key !== key;
75
+ });
76
+ };
77
+
78
+
79
+ const formatCheckboxControlVal = (el: HTMLFormElement) => {
80
+ return {
81
+ name: el.dataset.name?.replace(/-label$/, ''),
82
+ key: el.dataset.key,
83
+ slug: el.value,
84
+ link: el.dataset.link
85
+ }
86
+ };
87
+
88
+ const setCheckboxCheckedData = (arr: any[], key: string, val: boolean) => {
89
+ arr.forEach((item: any, index: number) => {
90
+ if (item.key === key) arr[index].checked = val;
91
+ });
92
+ };
93
+
94
+ const setCheckboxIndeterminateData = (arr: any[], key: string, val: boolean) => {
95
+ arr.forEach((item: any, index: number) => {
96
+ if (item.key === key) arr[index].indeterminate = val;
97
+ });
98
+ };
99
+
100
+
101
+
102
+ const setCheckboxIndeterminateStatus = (checkedData: any[], printData: any[], el: HTMLFormElement | null) => {
103
+ let _parentsLi: any = [];
104
+
105
+ if ( el !== null ) {
106
+ _parentsLi = [].slice.call(getParents(el,'li'));
107
+ _parentsLi.splice(0, 1);
108
+ } else {
109
+ _parentsLi = [].slice.call(document.querySelectorAll(`#${checkboxNamePrefix} li`));
110
+ }
111
+
112
+
113
+ //---
114
+ _parentsLi.forEach((node: any) => {
115
+ const _checkboxes = getChildren(node, '[type="checkbox"]');
116
+ const parentKey = _checkboxes[0].dataset.key;
117
+
118
+
119
+ //
120
+ let _checkedLengthCalcArr: any[] = [];
121
+ checkedData.forEach((oitem: any, oindex: number) => {
122
+ _checkboxes.forEach((el: any) => {
123
+ if (el.dataset.key === oitem.key) _checkedLengthCalcArr.push(oitem);
124
+ });
125
+ });
126
+ _checkedLengthCalcArr = _checkedLengthCalcArr.filter((el: any) => {
127
+ return el.key !== parentKey;
128
+ })
129
+
130
+ //
131
+ const _checkedLength = _checkedLengthCalcArr.filter((el: any) => {
132
+ return el.checked === true;
133
+ }).length;
134
+
135
+ if ( _checkedLength === 0 ) {
136
+ setCheckboxIndeterminateData(checkedData, parentKey, false);
137
+ } else {
138
+
139
+ if ( _checkedLength === _checkboxes.length-1 ) {
140
+ setCheckboxIndeterminateData(checkedData, parentKey, false);
141
+ setCheckboxCheckedData(checkedData, parentKey, true);
142
+ printData.push(formatCheckboxControlVal(_checkboxes[0]));
143
+ }
144
+
145
+ if ( _checkedLength < _checkboxes.length-1 ) {
146
+ setCheckboxIndeterminateData(checkedData, parentKey, true);
147
+ setCheckboxCheckedData(checkedData, parentKey, false);
148
+ printData = removeItemOnce(printData, parentKey);
149
+ }
150
+
151
+ }
152
+
153
+ });
154
+
155
+ return [checkedData, printData];
156
+
157
+ };
158
+
159
+ const activeClass = (el: any, mode: string, classname: string = 'active') => {
160
+ if ( mode === 'add' ) {
161
+ el.classList.add(classname);
162
+ } else {
163
+ el.classList.remove(classname);
164
+ }
165
+ };
166
+
167
+ const closeChild = (hyperlink: HTMLElement, ul: HTMLAllCollection) => {
168
+ if ( ul.length === 0 ) return;
169
+
170
+ activeClass(hyperlink, 'remove');
171
+ hyperlink.setAttribute('aria-expanded', 'false');
172
+ activeClass(hyperlink.parentNode, 'remove');
173
+
174
+ //to close
175
+ [].slice.call(ul).forEach(function(element: any){
176
+ element.style.maxHeight = 0;
177
+ });
178
+ };
179
+
180
+ const openChild = (hyperlink: HTMLElement, ul: HTMLAllCollection) => {
181
+ if ( ul.length === 0 ) return;
182
+
183
+ activeClass(hyperlink, 'add');
184
+ hyperlink.setAttribute('aria-expanded', 'true');
185
+ activeClass(hyperlink.parentNode, 'add');
186
+
187
+ // init <ul> height
188
+ initUlHeight(ul);
189
+
190
+ };
191
+
192
+ function handleCollapse(e: any) {
193
+ if ( disableCollapse ) return;
194
+
195
+
196
+ e.preventDefault();
197
+ const hyperlink = e.currentTarget;
198
+ const url = hyperlink.getAttribute('href');
199
+ const subElement = getNextSiblings(hyperlink, 'ul');
200
+
201
+ // loading
202
+ //=====================
203
+ if ( hyperlink.classList.contains('async-ready') ) {
204
+ activeClass(hyperlink, 'add', 'loading');
205
+ }
206
+
207
+ // calback
208
+ //=====================
209
+ const fetchFunc: Function = hyperlink.classList.contains('async-ready') ? (typeof evInitValue !== 'function' ? ()=>void(0) : evInitValue) : ()=>void(0);
210
+ onCollapse?.(e, {
211
+ key: hyperlink.dataset.key,
212
+ slug: hyperlink.dataset.slug,
213
+ link: hyperlink.dataset.link
214
+ }, fetchFunc);
215
+
216
+
217
+
218
+ // hide child if expandedLink doesn't exist, on the contrary
219
+ //=====================
220
+ if ( hyperlink.classList.contains('loading') ) return;
221
+
222
+ if ( hyperlink.getAttribute('aria-expanded') === 'false' || hyperlink.getAttribute('aria-expanded') === null ) {
223
+
224
+
225
+ //Hide all other siblings of the selected <ul>
226
+ if ( alternateCollapse ) {
227
+ [].slice.call(rootRef.current.children).forEach(function(li: any){
228
+
229
+ activeClass(li, 'remove');
230
+
231
+ const _li = li.firstChild;
232
+ activeClass(_li, 'remove');
233
+ _li.setAttribute('aria-expanded', false);
234
+
235
+ [].slice.call(getNextSiblings(_li, 'ul')).forEach(function(element: any){
236
+ element.style.maxHeight = 0;
237
+ });
238
+ });
239
+ }
240
+
241
+ //open current
242
+ openChild(hyperlink, subElement as never);
243
+
244
+
245
+
246
+ } else {
247
+
248
+ //close current
249
+ closeChild(hyperlink, subElement as never);
250
+
251
+ }
252
+
253
+
254
+ }
255
+
256
+ function handleSelect(e: any) {
257
+ e.preventDefault();
258
+ const hyperlink = e.currentTarget;
259
+
260
+ if ( hyperlink.classList.contains('selected') ) {
261
+ activeClass(hyperlink, 'remove', 'selected');
262
+ } else {
263
+ [].slice.call(hyperlink.closest('.tree-diagram__wrapper').querySelectorAll('li > a')).forEach((node: any) => {
264
+ activeClass(node, 'remove', 'selected');
265
+ });
266
+ activeClass(hyperlink, 'add', 'selected');
267
+ }
268
+
269
+
270
+ // Note: that component re-rendering (such as routing changes) will cause collapsing problems
271
+ // with `onSelect()`, please use `useMemo()` to wrap `<Tree />`, like this:
272
+ /*
273
+ function TreeMemo(props: any) {
274
+ const {t, callback, data} = props;
275
+ const dependencies = props.data !== null && props.data.length === 0 ? props.data : '';
276
+ return useMemo(() => {
277
+ return <Tree
278
+ data={data}
279
+ showLine={true}
280
+ onSelect={callback}
281
+ />
282
+ }, [dependencies]);
283
+ }
284
+ */
285
+ onSelect?.(e, {
286
+ key: hyperlink.dataset.key,
287
+ slug: hyperlink.dataset.slug,
288
+ link: hyperlink.dataset.link
289
+ }, typeof evInitValue !== 'function' ? ()=>void(0) : evInitValue);
290
+
291
+ if ( disableArrow ) {
292
+ handleCollapse(e);
293
+ }
294
+ }
295
+
296
+
297
+ function titleArrowGenerator() {
298
+ return disableArrow ? loadingIcon : null;
299
+ }
300
+
301
+
302
+ function arrowGenerator() {
303
+ if ( arrowIcons && Array.isArray(arrowIcons) ) {
304
+ return arrowIcons.length > 1 ? <><var className="default-icon"><span>{arrowIcons[0]}</span><span>{arrowIcons[1]}</span></var>{loadingIcon}</> : <><var className="default-icon"><span>{arrowIcons[0]}</span><span>{arrowIcons[0]}</span></var>{loadingIcon}</>;
305
+ } else {
306
+ return arrow ? arrow : <>{customIcon}{loadingIcon}</>;
307
+ }
308
+
309
+ }
310
+
311
+
312
+ useEffect(() => {
313
+
314
+ // Activate current item
315
+ //=====================
316
+ const allItems = rootRef.current ? [].slice.call(document.querySelectorAll(`.${childClassName} a`)).map( (item: any) => {
317
+ return {
318
+ href: item.getAttribute('href'),
319
+ el: item,
320
+ actived: item.parentNode.classList?.contains('active') ? true : false,
321
+ expandedLink: document.body.contains(item.parentNode.parentNode.previousSibling) ? item.parentNode.parentNode.previousSibling : false
322
+ }
323
+ } ) : [];
324
+
325
+
326
+ allItems.forEach( (hyperlink: any) => {
327
+
328
+ // Expand the currently active item by default
329
+ if ( hyperlink.actived ) {
330
+
331
+ hyperlink.el.setAttribute('aria-expanded', 'true');
332
+
333
+ if ( hyperlink.expandedLink ) {
334
+ const expandedLink: any = hyperlink.expandedLink; // <a>
335
+ activeClass(expandedLink.parentNode, 'add');
336
+ expandedLink.setAttribute('aria-expanded', true);
337
+ }
338
+
339
+
340
+ // init <ul> height
341
+ const ul: any = getNextSiblings(hyperlink.el, 'ul');
342
+ initUlHeight(ul);
343
+ }
344
+
345
+ });
346
+
347
+
348
+ // Initialize indeterminate status of all checkboxes
349
+ //=====================
350
+ setCheckboxIndeterminateStatus(getCheckedData as never, getCheckedPrint as never, null);
351
+
352
+
353
+ }, [data]);
354
+
355
+
356
+ if ( data ) {
357
+
358
+ return (
359
+ <>
360
+ <ul className={childClassName} ref={rootRef} style={!first ? {maxHeight: '0px'} : {}}>
361
+
362
+ {data.map((item: any, i: number) => {
363
+
364
+ const _async = item.childrenAsync ? 'async-ready' : '';
365
+ const _cusIcons = arrowIcons ? 'custom-icons' : '';
366
+
367
+
368
+ if ( item.heading ) return (
369
+ <li className="nav-item" key={item.key}>
370
+ <a tabIndex={-1} className="nav-link disabled" href="#" aria-disabled="true" data-link={item.link} data-slug={item.slug} data-key={item.key}>
371
+ <span>{item.icon ? item.icon.indexOf('</svg>') < 0 ? <><i className={item.icon}></i> </> : <var dangerouslySetInnerHTML={{ __html: `${item.icon}` }} /> : null}<i dangerouslySetInnerHTML={{ __html: `${item.title}` }}></i></span>
372
+ </a>
373
+ </li>
374
+ );
375
+ return (
376
+ <li className={item.active ? 'nav-item active' : 'nav-item'} key={item.key} >
377
+
378
+ {(item.children && item.children.length) || item.childrenAsync ? <span aria-expanded={item.active ? 'true' : 'false'} className={item.active ? `arrow active ${_async} ${_cusIcons}` : `arrow ${_async} ${_cusIcons}`} onClick={handleCollapse} data-link={item.link} data-slug={item.slug} data-key={item.key}>{arrowGenerator()}</span> : ''}
379
+
380
+ <span className="checkbox-trigger">
381
+ <Checkbox
382
+ wrapperClassName=""
383
+ name={`checkbox-${checkboxNamePrefix}-${item.key}`}
384
+ tabIndex={-1}
385
+ data-key={item.key}
386
+ data-link={item.link}
387
+ value={item.slug}
388
+ indeterminate={getCheckedData!.filter((cur: any) => cur.key === item.key)[0]?.indeterminate}
389
+ checked={getCheckedData!.filter((cur: any) => cur.key === item.key)[0]?.checked}
390
+ onChange={(e: any, val: any) => {
391
+
392
+ const _curKey: string = e.target.dataset.key;
393
+ const _checkedData: any = getCheckedData;
394
+
395
+ let _res: any = getCheckedPrint;
396
+
397
+ // STEP 1:
398
+ // Current checkbox
399
+ //-----------
400
+ if ( val === true ) {
401
+ _res.push(formatCheckboxControlVal(e.target));
402
+ setCheckboxIndeterminateData(_checkedData, _curKey, false);
403
+ setCheckboxCheckedData(_checkedData, _curKey, true);
404
+
405
+ } else {
406
+ setCheckboxCheckedData(_checkedData, _curKey, false);
407
+ _res = removeItemOnce(_res, _curKey);
408
+
409
+ }
410
+
411
+
412
+ // STEP 2:
413
+ // All child checkboxes
414
+ //-----------
415
+ [].slice.call(getChildren(e.target.closest('li'), '[type="checkbox"]')).forEach((node: any) => {
416
+ if ( val === true ) {
417
+ if ( node.dataset.key !== _curKey ) {
418
+ setCheckboxIndeterminateData(_checkedData, node.dataset.key, false);
419
+ setCheckboxCheckedData(_checkedData, node.dataset.key, true);
420
+ _res.push(formatCheckboxControlVal(node));
421
+ }
422
+ } else {
423
+ setCheckboxCheckedData(_checkedData, node.dataset.key, false);
424
+ _res = removeItemOnce(_res, node.dataset.key);
425
+
426
+ }
427
+
428
+ });
429
+
430
+
431
+ // STEP 3:
432
+ // ALl parent checkboxes
433
+ //-----------
434
+ const [updatedCheckedData, updatedPrintData] = setCheckboxIndeterminateStatus(_checkedData, _res, e.target);
435
+ let _updatedCheckedData: any[] = updatedCheckedData;
436
+ let _updatedPrintData: any[] = updatedPrintData;
437
+
438
+
439
+ // STEP 4:
440
+ // Update checked data
441
+ //-----------
442
+ updategetCheckedData(_updatedCheckedData);
443
+
444
+
445
+ // STEP 5:
446
+ // Array deduplication
447
+ //-----------
448
+ _updatedPrintData = _updatedPrintData.filter((item: any, index: number, self: any[]) => index === self.findIndex((t) => (t.key === item.key)))
449
+
450
+
451
+ // STEP 6:
452
+ // Update checked print
453
+ //-----------
454
+ updateCheckedPrint(_updatedPrintData);
455
+
456
+
457
+ // STEP 7:
458
+ // callback
459
+ //-----------
460
+ onCheck?.(_updatedPrintData);
461
+ }}
462
+ />
463
+ </span>
464
+
465
+ <a tabIndex={-1} className={item.active ? `nav-link active ${_async}` : `nav-link ${_async}`} href={item.link === '#' ? `${item.link}-${i}` : item.link} aria-expanded="false" onClick={handleSelect} data-link={item.link} data-slug={item.slug} data-key={item.key}>
466
+ <span>{item.icon ? item.icon.indexOf('</svg>') < 0 ? <><i className={item.icon}></i> </> : <var dangerouslySetInnerHTML={{ __html: `${item.icon}` }} /> : null}<i dangerouslySetInnerHTML={{ __html: `${item.title}` }}></i>{titleArrowGenerator()}</span>
467
+ </a>
468
+ {item.children && item.children.length > 0 && <TreeList
469
+ rootNode={rootNode}
470
+ checkboxNamePrefix={checkboxNamePrefix}
471
+ data={item.children}
472
+ first={false}
473
+ arrow={arrow}
474
+ onSelect={onSelect}
475
+ onCollapse={onCollapse}
476
+ onCheck={onCheck}
477
+ disableArrow={disableArrow}
478
+ disableCollapse={disableCollapse}
479
+ arrowIcons={arrowIcons}
480
+ evInitValue={evInitValue}
481
+ getCheckedPrint={getCheckedPrint}
482
+ updateCheckedPrint={updateCheckedPrint}
483
+ getCheckedData={getCheckedData}
484
+ updategetCheckedData={updategetCheckedData}
485
+
486
+ />}
487
+ </li>
488
+ );
489
+
490
+
491
+ })}
492
+ </ul>
493
+
494
+ </>
495
+ )
496
+ } else {
497
+ return (
498
+ <></>
499
+ )
500
+ }
501
+
502
+ }
503
+