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,576 @@
1
+ import React, { useId, useEffect, useState, useRef, useCallback } from 'react';
2
+
3
+
4
+ import { debounce } from './utils/performance';
5
+
6
+ import TableRow from './TableRow';
7
+ import TableHeaders from './TableHeaders';
8
+ import TableSummaries from './TableSummaries';
9
+ import TableColgroup from './TableColgroup';
10
+
11
+
12
+ import { getChildren } from './utils/dom';
13
+ import { formatRowControlVal } from './table-utils';
14
+
15
+
16
+ type TableProps = {
17
+ wrapperClassName?: string;
18
+ tableClassName?: string;
19
+ bodyClassName?: string;
20
+ headClassName?: string;
21
+ footClassName?: string;
22
+ checkable?: boolean;
23
+ useRadio?: boolean;
24
+ draggable?: boolean;
25
+ sortable?: boolean;
26
+ data: any;
27
+ bordered?: boolean;
28
+ colGroup?: boolean;
29
+ responsive?: boolean;
30
+ enhancedResponsive?: boolean;
31
+ enhancedResponsiveWithScrollBar?: boolean;
32
+ /** -- */
33
+ id?: string;
34
+ onClick?: (el: any, val: any) => void;
35
+ onCheck?: (val: any) => void;
36
+ onDrag?: (dragStart: any, dragEnd: any ) => void;
37
+ };
38
+
39
+
40
+ const Table = (props: TableProps) => {
41
+ const {
42
+ wrapperClassName,
43
+ tableClassName,
44
+ bodyClassName,
45
+ headClassName,
46
+ footClassName,
47
+ checkable,
48
+ useRadio,
49
+ draggable,
50
+ sortable,
51
+ data,
52
+ bordered,
53
+ colGroup,
54
+ responsive,
55
+ enhancedResponsive,
56
+ enhancedResponsiveWithScrollBar,
57
+ id,
58
+ onClick,
59
+ onCheck,
60
+ onDrag
61
+ } = props;
62
+
63
+
64
+ const uniqueID = useId().replace(/\:/g, "-");
65
+ const idRes = id || uniqueID;
66
+ const rootRef = useRef<any>(null);
67
+ const tbodyRef = useRef<any>(null);
68
+
69
+ const [checkedPrint, setCheckedPrint] = useState<any[]>([]);
70
+ const [checkedData, setCheckedData] = useState<any[]>([]);
71
+ const [checkedRootData, setCheckedRootData] = useState<any[]>([]);
72
+ const [sortData, setSortData] = useState<any[] | undefined>([]);
73
+ const [mainUpdate, setMainUpdate] = useState<boolean>(false);
74
+
75
+ const windowResizeUpdate = debounce(handleWindowUpdate, 50);
76
+
77
+ const _headers = data.hasOwnProperty('headers') ? data.headers : false;
78
+ const _summaries = data.hasOwnProperty('summaries') ? data.summaries : false;
79
+ let windowWidth = typeof window !== 'undefined' ? window.innerWidth : 0;
80
+
81
+
82
+ //Set the class names of different styles
83
+ //
84
+ let tableClasses = '';
85
+ if (bordered) tableClasses += ' table-bordered';
86
+ if (colGroup) tableClasses += ' table-colgroup';
87
+
88
+
89
+ //
90
+ let responsiveClasses = '';
91
+ if (responsive) tableClasses += ' table-responsive';
92
+
93
+ //
94
+ let enhancedResponsiveClasses = '';
95
+ if (enhancedResponsive && !enhancedResponsiveWithScrollBar) enhancedResponsiveClasses += ' table-enhanced-responsive';
96
+ if (enhancedResponsiveWithScrollBar && !enhancedResponsive) enhancedResponsiveClasses += ' table-enhanced-responsive-scrolled';
97
+
98
+ //
99
+ let checkableClasses = '';
100
+ if (checkable) checkableClasses += ' has-checkbox';
101
+
102
+ //
103
+ let radioClasses = '';
104
+ if (useRadio) radioClasses += ' use-radio';
105
+
106
+
107
+
108
+ //
109
+ let draggableClasses = '';
110
+ if (draggable) draggableClasses += ' allow-dragdrop';
111
+
112
+ //
113
+ let sortableClasses = '';
114
+ if (sortable) sortableClasses += ' enable-sort';
115
+
116
+
117
+
118
+ // ================================================================
119
+ // generic
120
+ // ================================================================
121
+ const insertAfter = (newNode: any, existingNode: any) => {
122
+ existingNode.parentNode.insertBefore(newNode, existingNode.nextSibling);
123
+ };
124
+
125
+ const allRows = () => {
126
+ return [].slice.call(tbodyRef.current.children);
127
+ };
128
+
129
+ const printData = (data: number[]) => {
130
+ const _res: any[] = [];
131
+ data.forEach( (v: number) => {
132
+ _res.push(formatRowControlVal(rootRef.current.querySelector('table').querySelector(`tbody [data-key="row-${v}"]`), idRes));
133
+ });
134
+ return _res;
135
+ };
136
+
137
+
138
+
139
+ // ================================================================
140
+ // responsive table initialization
141
+ // ================================================================
142
+ function handleWindowUpdate() {
143
+
144
+ // Check window width has actually changed and it's not just iOS triggering a resize event on scroll
145
+ if (window.innerWidth != windowWidth) {
146
+
147
+ // Update the window width for next time
148
+ windowWidth = window.innerWidth;
149
+
150
+ // Do stuff here
151
+ tableDataScrolledInit(windowWidth);
152
+
153
+ }
154
+ }
155
+
156
+ function maxDimension(elements: any) {
157
+ let res = {
158
+ 'height': 0,
159
+ 'width': 0
160
+ };
161
+ const elementHeights: any[] = Array.prototype.map.call(elements, function (el) {
162
+ return el.clientHeight;
163
+ });
164
+
165
+ const elementWidths: any[] = Array.prototype.map.call(elements, function (el) {
166
+ return el.clientWidth;
167
+ });
168
+
169
+ const maxHeight = Math.max.apply(null, elementHeights);
170
+ const maxWidth = Math.max.apply(null, elementWidths);
171
+
172
+ res = {
173
+ 'height': maxHeight,
174
+ 'width': maxWidth
175
+ };
176
+ return res;
177
+ };
178
+
179
+
180
+ function tableDataScrolledInit(w: number) {
181
+
182
+ if (w <= 768) {
183
+ //get maxHeight of per row
184
+ for (let i = 0; i < tbodyRef.current.querySelector('tr').children.length; i++ ) {
185
+ const tbodyRows = rootRef.current.querySelectorAll(`tbody tr [data-table-col="${i}"]`);
186
+ const maxHeight = maxDimension(tbodyRows).height;
187
+ [].slice.call(tbodyRows).forEach((row: any) => {
188
+ row.style.height = maxHeight + 'px';
189
+ });
190
+
191
+ //
192
+ const theadRows = rootRef.current.querySelectorAll(`thead tr [data-table-col="${i}"]`);
193
+ [].slice.call(theadRows).forEach((row: any) => {
194
+ row.style.height = maxHeight + 'px';
195
+ });
196
+ }
197
+
198
+ } else {
199
+ [].slice.call(rootRef.current.querySelectorAll('tbody td, tbody th, thead th')).forEach((node: any, i: number) => {
200
+ node.removeAttribute('style');
201
+ });
202
+ }
203
+
204
+ }
205
+
206
+
207
+
208
+ // ================================================================
209
+ // checkboxes data
210
+ // ================================================================
211
+ function initCheckboxesData() {
212
+
213
+ const _checkboxes = getChildren(rootRef.current.querySelector('table').querySelector('tbody'), '[type="checkbox"]');
214
+ const _data: any[] = [];
215
+ [].slice.call(_checkboxes).forEach((node: any, i: number) => {
216
+ _data.push({
217
+ key: `row-${i}`,
218
+ checked: false
219
+ });
220
+ });
221
+ setCheckedData(_data);
222
+ setCheckedRootData([{
223
+ key: `row-all`,
224
+ checked: false
225
+ }]);
226
+
227
+ }
228
+
229
+
230
+ // ================================================================
231
+ // sort with headers
232
+ // ================================================================
233
+ let inverse = false;
234
+ function handleSortList(e: any) {
235
+ const el = e.currentTarget.parentNode;
236
+ const filterType = el.dataset.sortType;
237
+ const curIndex = el.dataset.tableCol;
238
+ const targetComparator = [].slice.call(tbodyRef.current.querySelectorAll(`[data-table-col="${curIndex}"]`));
239
+
240
+ if ( filterType === false ) return false;
241
+
242
+
243
+ //sort of HTML elements
244
+ const sortBy = function(a: any, b: any) {
245
+
246
+ let txt1 = a.innerHTML.replace(/(<([^>]+)>)/ig, '').toLowerCase(),
247
+ txt2 = b.innerHTML.replace(/(<([^>]+)>)/ig, '').toLowerCase();
248
+
249
+ //type of number
250
+ if ( filterType == 'number' ) {
251
+ txt1 = Number( txt1.replace(/[^0-9.-]+/g, '' ) );
252
+ txt2 = Number( txt2.replace(/[^0-9.-]+/g, '' ) );
253
+ }
254
+
255
+ //type of date
256
+ if ( filterType == 'date' ) {
257
+ txt1 = new Date( txt1 );
258
+ txt2 = new Date( txt2 );
259
+ }
260
+
261
+ //add filter class
262
+ allRows().forEach((node: any) => {
263
+ node.classList.add('newsort');
264
+ });
265
+
266
+ inverse = !inverse;
267
+
268
+ return txt2<txt1 ? -1 : txt2>txt1 ? 1 : 0;
269
+ }
270
+
271
+ targetComparator.sort(sortBy);
272
+
273
+ //console.log( 'targetComparator:', targetComparator );
274
+ //console.log( 'inverse:', self.inverse );
275
+
276
+ if ( !inverse ) targetComparator.reverse();
277
+
278
+ allRows().forEach((node: any) => {
279
+ node.remove();
280
+ });
281
+
282
+ for (let i = 0; i < targetComparator.length; i++) {
283
+ const curRow = (targetComparator[i] as any).parentNode;
284
+ tbodyRef.current.appendChild(curRow);
285
+ }
286
+
287
+ }
288
+
289
+
290
+
291
+
292
+ // ================================================================
293
+ //drag & drop
294
+ // ================================================================
295
+ let draggedObj: any = null;
296
+ let overObj: any = null;
297
+
298
+ const placeholderGenerator = (trHeight: number) => {
299
+
300
+ // Insert a row at the "index" of the table
301
+ const newRow = document.createElement('tr');
302
+ newRow.className = 'row-placeholder';
303
+ newRow.dataset.placeholder = 'true';
304
+ newRow.style.height = trHeight + 'px';
305
+
306
+ // Insert a cell in the row at index
307
+ const newCell = newRow.insertCell(0);
308
+ newCell.colSpan = tbodyRef.current.querySelector('tr').children.length;
309
+
310
+ // Append a text node to the cell
311
+ const newText = document.createTextNode(' ');
312
+ newCell.appendChild(newText);
313
+
314
+ return newRow;
315
+ };
316
+
317
+ const lastRowGenerator = (trHeight: number) => {
318
+
319
+ // Insert a row at the "index" of the table
320
+ const newRow = document.createElement('tr');
321
+ newRow.className = 'row-obj row-obj-clonelast';
322
+ newRow.dataset.id = allRows().length.toString();
323
+ newRow.style.height = trHeight + 'px';
324
+ newRow.style.display = 'none';
325
+
326
+ // Insert a cell in the row at index
327
+ const newCell = newRow.insertCell(0);
328
+ newCell.colSpan = tbodyRef.current.querySelector('tr').children.length;
329
+
330
+ // Append a text node to the cell
331
+ const newText = document.createTextNode(' ');
332
+ newCell.appendChild(newText);
333
+
334
+ return newRow;
335
+ };
336
+
337
+
338
+ const removePlaceholder = () => {
339
+ // Delete row at the "index" of the table
340
+ const placeholder = [].slice.call(tbodyRef.current.querySelectorAll(`[data-placeholder]`));
341
+ placeholder.forEach((node: any) => {
342
+ tbodyRef.current.removeChild(node);
343
+ });
344
+
345
+ };
346
+
347
+ function handleTbodyLeave(e: any) {
348
+ tbodyRef.current.classList.remove('drag-trigger-mousedown');
349
+ }
350
+
351
+ // events fired on the drop targets
352
+ const handledragOver = useCallback((e: any) => {
353
+ e.preventDefault();
354
+
355
+ draggedObj.style.display = 'none';
356
+
357
+
358
+ if (e.target.classList.contains('row-placeholder')) return;
359
+
360
+ const itemsWrapper = e.target.parentNode;
361
+ if (itemsWrapper.classList.contains('row-obj')) {
362
+ overObj = itemsWrapper;
363
+ removePlaceholder();
364
+
365
+ if ( Number(overObj.dataset.id) === allRows().length - 1) {
366
+ tbodyRef.current.insertBefore(placeholderGenerator((allRows().at(-2) as any).clientHeight), overObj);
367
+ } else {
368
+ tbodyRef.current.insertBefore(placeholderGenerator(overObj.clientHeight), overObj);
369
+ }
370
+
371
+
372
+ }
373
+
374
+ }, [sortData]);
375
+
376
+
377
+ const handleDragStart = useCallback((e: any) => {
378
+ draggedObj = e.currentTarget;
379
+ e.dataTransfer.effectAllowed = 'move';
380
+ e.dataTransfer.setData('text/html', draggedObj);
381
+
382
+ draggedObj.classList.add( 'dragging' );
383
+ (allRows().at(-1) as any).style.setProperty('display', 'table-row', "important");
384
+
385
+
386
+ // callback
387
+ const dragStart: Function = (callback: Function) => {
388
+ callback.call(null, draggedObj, sortData, printData(sortData as never));
389
+ };
390
+ onDrag?.(dragStart, null);
391
+
392
+ }, [handledragOver]);
393
+
394
+ const handleDragEnd = useCallback((e: any) => {
395
+ draggedObj.style.display = 'table-row';
396
+ removePlaceholder();
397
+
398
+ draggedObj.classList.remove( 'dragging' );
399
+ (allRows().at(-1) as any).style.setProperty('display', 'none', "important");
400
+ tbodyRef.current.classList.remove('drag-trigger-mousedown');
401
+
402
+
403
+ if ( overObj === null ) return;
404
+
405
+ // update state
406
+ let curData: number[] = [];
407
+ curData = JSON.parse(JSON.stringify(sortData));
408
+ let from = Number(draggedObj.dataset.id);
409
+ let to = Number(overObj.dataset.id);
410
+ if (from < to) to--;
411
+
412
+ //sort data
413
+ const newData: number[] = [];
414
+
415
+ //console.log('--> data1:', curData);
416
+
417
+ curData.splice(to, 0, curData.splice(from, 1)[0]);
418
+
419
+ for (let i = 0; i < curData.length; i++) {
420
+ for (let j = 0; j < curData.length; j++) {
421
+
422
+ if (curData[i] === curData[j]) {
423
+ newData.push(curData[j] as never);
424
+ }
425
+ }
426
+ }
427
+
428
+
429
+ //console.log("--> data2: ", newData);
430
+ setSortData(newData);
431
+
432
+ // reset data-id in order to sort data
433
+ newData.forEach((curId: any, order: number) => {
434
+ rootRef.current.querySelector('table').querySelector(`tbody [data-key="row-${curId}"]`).dataset.id = order;
435
+ });
436
+
437
+
438
+ // sort elements
439
+ const categoryItemsArray = allRows();
440
+ const sorter = (a: any, b: any) => {
441
+ return a.dataset.id.localeCompare(b.dataset.id); // sorts based on alphabetical order
442
+ }
443
+ const sorted = categoryItemsArray.sort(sorter);
444
+ sorted.forEach(e => rootRef.current.querySelector('table').querySelector('tbody').appendChild(e));
445
+
446
+
447
+ // callback
448
+ const dragEnd: Function = (callback: Function) => {
449
+ callback.call(null, draggedObj, newData, printData(newData as never));
450
+ };
451
+ onDrag?.(null, dragEnd);
452
+
453
+
454
+
455
+ }, [sortData]);
456
+
457
+
458
+
459
+ useEffect(() => {
460
+
461
+
462
+ // Update status of children components
463
+ //--------------
464
+ setMainUpdate((prevState) => !prevState);
465
+
466
+
467
+ // Initialize sort list data
468
+ //--------------
469
+ const listIndexes: any[] | undefined = allRows().map((node: any, i: number) => i);
470
+ setSortData(listIndexes);
471
+
472
+ // Initialize checkboxes data
473
+ //--------------
474
+ initCheckboxesData();
475
+
476
+
477
+ // With scroll bars
478
+ //--------------
479
+ if (enhancedResponsiveWithScrollBar) {
480
+ let windowWidth = window.innerWidth;
481
+ tableDataScrolledInit(windowWidth);
482
+ }
483
+
484
+
485
+ //drag & drop
486
+ //--------------
487
+ if ( draggable ) {
488
+ insertAfter(lastRowGenerator((allRows().at(-1) as any).clientHeight), allRows().at(-1));
489
+ }
490
+
491
+
492
+ // Add function to the element that should be used as the scrollable area.
493
+ //--------------
494
+ window.removeEventListener('resize', windowResizeUpdate);
495
+ window.addEventListener('resize', windowResizeUpdate);
496
+
497
+
498
+ // Remove the global list of events, especially as scroll and interval.
499
+ //--------------
500
+ return () => {
501
+ window.removeEventListener('resize', windowResizeUpdate);
502
+ };
503
+
504
+ }, [data]);
505
+
506
+
507
+ return (
508
+ <>
509
+
510
+ <div ref={rootRef} id={idRes} className={`table__wrapper ${wrapperClassName || wrapperClassName === '' ? wrapperClassName : `mb-3 position-relative`} ${responsiveClasses} ${enhancedResponsiveClasses} ${checkableClasses} ${radioClasses} ${draggableClasses} ${sortableClasses}`}>
511
+
512
+ <table className={`${tableClassName || tableClassName === '' ? tableClassName : "table"} ${tableClasses}`}>
513
+
514
+ <TableHeaders
515
+ data={_headers}
516
+ useRadio={useRadio || false}
517
+ headClassName={headClassName}
518
+ checkboxNamePrefix={idRes}
519
+ sortable={sortable}
520
+ updateCheckedPrint={setCheckedPrint}
521
+ getCheckedPrint={checkedPrint}
522
+ updategetCheckedData={setCheckedData}
523
+ getCheckedData={checkedData}
524
+ updategetCheckedRootData={setCheckedRootData}
525
+ getCheckedRootData={checkedRootData}
526
+ onCheck={onCheck}
527
+ evSort={handleSortList}
528
+ />
529
+
530
+ <TableSummaries
531
+ data={_summaries}
532
+ footClassName={footClassName}
533
+ />
534
+
535
+ {data.hasOwnProperty('fields') && colGroup ? <TableColgroup
536
+ data={data.fields}
537
+ /> : null}
538
+
539
+
540
+ <tbody ref={tbodyRef} className={bodyClassName ? bodyClassName : ''} onDragOver={handledragOver} onMouseLeave={handleTbodyLeave}>
541
+
542
+ {data.hasOwnProperty('fields') ? data.fields.map((item: any, i: number) => {
543
+ return <TableRow
544
+ key={i + String(mainUpdate)} // Trigger child component update when prop of parent changes
545
+ index={i}
546
+ rowKey={`row-${i}`}
547
+ headerLabel={_headers}
548
+ data={item}
549
+ checkboxNamePrefix={idRes}
550
+ updateCheckedPrint={setCheckedPrint}
551
+ getCheckedPrint={checkedPrint}
552
+ updategetCheckedData={setCheckedData}
553
+ getCheckedData={checkedData}
554
+ updategetCheckedRootData={setCheckedRootData}
555
+ getCheckedRootData={checkedRootData}
556
+ onClick={onClick}
557
+ onCheck={onCheck}
558
+ draggable={draggable || false}
559
+ useRadio={useRadio || false}
560
+ evDragEnd={handleDragEnd}
561
+ evDragStart={handleDragStart}
562
+ />;
563
+ }) : ""
564
+ }
565
+
566
+ </tbody>
567
+
568
+ </table>
569
+ </div>
570
+
571
+ </>
572
+ )
573
+ };
574
+
575
+
576
+ export default Table;
@@ -0,0 +1,65 @@
1
+
2
+ export const removeItemOnce = (arr: any[], key: string) => {
3
+ return arr.filter((item: any) => {
4
+ return item.key !== key;
5
+ });
6
+ };
7
+
8
+
9
+ export const formatCheckboxControlVal = (el: HTMLFormElement) => {
10
+ const _curContent: any = ([].slice.call(el.closest('th')?.children).at(-1) as any).innerHTML;
11
+ const $row: any = el.closest('tr[data-key]');
12
+ const _restContent: any[] = [].slice.call($row.children).map((node: any, i: number) => {
13
+ if ( i > 0 ) return node.innerHTML;
14
+ }).filter((item: any) => item !== undefined);
15
+
16
+ _restContent.unshift(_curContent);
17
+
18
+ return {
19
+ index: Number(el.dataset.index),
20
+ key: el.dataset.key,
21
+ name: el.dataset.name?.replace(/-label$/, ''),
22
+ content: _restContent
23
+ }
24
+ };
25
+
26
+ export const formatRowControlVal = (el: HTMLFormElement, checkboxNamePrefix: string) => {
27
+ const _curContent: any = ([].slice.call(el.querySelector('th')?.children).at(-1) as any).innerHTML;
28
+ const $row: any = el.closest('tr[data-key]');
29
+ const _restContent: any[] = [].slice.call($row.children).map((node: any, i: number) => {
30
+ if ( i > 0 ) return node.innerHTML;
31
+ }).filter((item: any) => item !== undefined);
32
+
33
+ _restContent.unshift(_curContent);
34
+
35
+ return {
36
+ index: Number(el.dataset.id),
37
+ key: el.dataset.key,
38
+ name: `checkbox-${checkboxNamePrefix}-${el.dataset.key}`,
39
+ content: _restContent
40
+ }
41
+ };
42
+
43
+
44
+
45
+ export const formatPerlineControlVal = (el: HTMLFormElement) => {
46
+ const $row: any = el;
47
+ const _restContent: any[] = [].slice.call($row.children).map((node: any, i: number) => {
48
+ return node.innerHTML;
49
+ }).filter((item: any) => item !== undefined);
50
+
51
+ return {
52
+ index: Number(el.dataset.id),
53
+ key: el.dataset.key,
54
+ content: _restContent
55
+ }
56
+ };
57
+
58
+
59
+
60
+ export const setCheckboxCheckedData = (arr: any[], key: string, val: boolean) => {
61
+ arr.forEach((item: any, index: number) => {
62
+ if (item.key === key) arr[index].checked = val;
63
+ });
64
+ };
65
+