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,143 @@
1
+ import React, { useId, useState, useEffect, useRef, forwardRef } from 'react';
2
+
3
+ declare module 'react' {
4
+ interface ReactI18NextChildren<T> {
5
+ children?: any;
6
+ }
7
+ }
8
+
9
+ type SwitchOptionChangeFnType = (arg1: any, arg2: any) => void;
10
+
11
+
12
+ type SwitchProps = {
13
+ wrapperClassName?: string;
14
+ value: string | boolean;
15
+ label?: React.ReactNode | string;
16
+ name?: string;
17
+ disabled?: any;
18
+ required?: any;
19
+ checked?: boolean;
20
+ /** -- */
21
+ id?: string;
22
+ style?: React.CSSProperties;
23
+ tabIndex?: number;
24
+ [key: `data-${string}`]: string | undefined;
25
+ /** This function is called whenever the data is updated.
26
+ * Exposes the JSON format data about the option as an argument.
27
+ */
28
+ onChange?: SwitchOptionChangeFnType | null;
29
+ onBlur?: (e: any) => void;
30
+ onFocus?: (e: any) => void;
31
+ };
32
+
33
+ const Switch = forwardRef((props: SwitchProps, ref: any) => {
34
+ const {
35
+ wrapperClassName,
36
+ disabled,
37
+ required,
38
+ value,
39
+ label,
40
+ name,
41
+ id,
42
+ checked,
43
+ style,
44
+ tabIndex,
45
+ onChange,
46
+ onBlur,
47
+ onFocus,
48
+ ...attributes
49
+ } = props;
50
+
51
+ const uniqueID = useId();
52
+ const idRes = id || uniqueID;
53
+ const rootRef = useRef<any>(null);
54
+ const [val, setVal] = useState<any>(null);
55
+
56
+ function handleFocus(event: any) {
57
+ rootRef.current.classList.add('focus');
58
+
59
+ //
60
+ onFocus?.(event);
61
+ }
62
+
63
+
64
+ function handleChange(event: any) {
65
+ const _val = event.target.checked;
66
+
67
+ setVal(_val);
68
+
69
+ //----
70
+ //remove focus style
71
+ rootRef.current.classList.remove('focus');
72
+
73
+ //
74
+ if (typeof (onChange) === 'function') {
75
+ onChange(event, _val);
76
+ }
77
+
78
+
79
+
80
+ }
81
+
82
+
83
+ function handleBlur(event: any) {
84
+
85
+ //----
86
+ //remove focus style
87
+ rootRef.current.classList.remove('focus');
88
+
89
+ //
90
+ onBlur?.(event);
91
+ }
92
+
93
+
94
+ useEffect(() => {
95
+ setVal(checked);
96
+ }, [checked]);
97
+
98
+
99
+ return (
100
+ <>
101
+
102
+ <div className={wrapperClassName || wrapperClassName === '' ? wrapperClassName : "mb-3 position-relative"} ref={rootRef}>
103
+ <div className="form-check form-switch">
104
+ <input
105
+ ref={ref}
106
+ tabIndex={tabIndex || 0}
107
+ type="checkbox"
108
+ className="form-check-input"
109
+ id={`label-${idRes}`}
110
+
111
+ // Don't use "name", it's just a container to display the label
112
+ data-name={name?.match(/(\[.*?\])/gi) ? `${name.split('[')[0]}-label[]` : `${name}-label`}
113
+ data-checkbox
114
+ disabled={disabled || null}
115
+ required={required || null}
116
+ onChange={handleChange}
117
+ onFocus={handleFocus}
118
+ onBlur={handleBlur}
119
+ defaultValue={value as string || ''}
120
+ checked={val} // component status will not change if defaultChecked is used
121
+ style={{cursor: 'pointer', ...style}}
122
+ {...attributes}
123
+ />
124
+
125
+
126
+ <input
127
+ type="hidden"
128
+ id={idRes}
129
+ name={name}
130
+ value={val ? value as string || '' : ''} // do not use `defaultValue`
131
+ />
132
+
133
+
134
+ {label ? <><label htmlFor={`label-${idRes}`} className="form-check-label">{label}</label></> : null}
135
+ </div>
136
+ </div>
137
+
138
+
139
+ </>
140
+ )
141
+ });
142
+
143
+ export default Switch;
@@ -0,0 +1,29 @@
1
+ import React from 'react';
2
+
3
+
4
+ /* Table Colgroup
5
+ -------------------------------------------------*/
6
+ type TableColgroupProps = {
7
+ data?: any[];
8
+ };
9
+
10
+ const TableColgroup = (props: TableColgroupProps) => {
11
+
12
+ const {
13
+ data
14
+ } = props;
15
+
16
+ return (
17
+ <>
18
+ <colgroup>
19
+ <col></col>
20
+ {data ? data.map((el: any, i: number) => {
21
+ return <col key={i}></col>;
22
+ }) : null}
23
+ </colgroup>
24
+ </>
25
+ )
26
+ }
27
+
28
+ export default TableColgroup;
29
+
@@ -0,0 +1,40 @@
1
+ import React from 'react';
2
+
3
+ /* Table Field
4
+ -------------------------------------------------*/
5
+ type TableFieldProps = {
6
+ cols?: number;
7
+ content?: any;
8
+ width?: string;
9
+ className?: string;
10
+ style?: React.CSSProperties;
11
+ columnHeader?: string;
12
+ index?: React.Key;
13
+ };
14
+
15
+ const TableField = (props: TableFieldProps) => {
16
+
17
+ const {
18
+ cols,
19
+ width,
20
+ className,
21
+ style,
22
+ columnHeader,
23
+ index,
24
+ content
25
+ } = props;
26
+
27
+
28
+ function handleTbodyLeave(e: any) {
29
+ e.target.closest('table').querySelector('tbody').classList.remove('drag-trigger-mousedown');
30
+ }
31
+
32
+ return (
33
+ <>
34
+ <td colSpan={cols} data-table-text={columnHeader} data-table-col={index} onMouseEnter={handleTbodyLeave} style={style ? style : (width ? ((typeof window !== 'undefined' && window.innerWidth > 768) ? {width: width} : {}) : {})} className={className || ''}>{content}</td>
35
+ </>
36
+ )
37
+ }
38
+
39
+ export default TableField;
40
+
@@ -0,0 +1,212 @@
1
+ import React, { useRef } from 'react';
2
+
3
+ import Checkbox from 'rpb-checkbox';
4
+ import Radio from 'rpb-radio';
5
+
6
+
7
+ import { getChildren } from './utils/dom';
8
+ import { removeItemOnce, formatCheckboxControlVal, setCheckboxCheckedData } from './table-utils';
9
+
10
+ /* Table Field Row
11
+ -------------------------------------------------*/
12
+ type TableFieldRowProps = {
13
+ draggable?: boolean;
14
+ useRadio?: boolean;
15
+ cols?: number;
16
+ content?: any;
17
+ width?: string;
18
+ className?: string;
19
+ style?: React.CSSProperties;
20
+ columnHeader?: string;
21
+ index?: number;
22
+ checkboxNamePrefix?: string;
23
+ rowKey?: string;
24
+ getCheckedPrint?: any[];
25
+ updateCheckedPrint?: any;
26
+ getCheckedData?: any[];
27
+ updategetCheckedData?: any;
28
+ getCheckedRootData?: any[];
29
+ updategetCheckedRootData?: any;
30
+ onCheck?: (val: any) => void;
31
+ };
32
+
33
+ const TableFieldRow = (props: TableFieldRowProps) => {
34
+
35
+
36
+ const {
37
+ draggable,
38
+ useRadio,
39
+ cols,
40
+ width,
41
+ className,
42
+ style,
43
+ columnHeader,
44
+ index,
45
+ content,
46
+ checkboxNamePrefix,
47
+ rowKey,
48
+ getCheckedPrint,
49
+ updateCheckedPrint,
50
+ getCheckedData,
51
+ updategetCheckedData,
52
+ getCheckedRootData,
53
+ updategetCheckedRootData,
54
+ onCheck,
55
+ } = props;
56
+
57
+ const contentRef = useRef<any>(null);
58
+ const checkboxRef = useRef<any>(null);
59
+
60
+ const rowIndex = rowKey?.replace('row-', '');
61
+
62
+
63
+ function handleTbodyEnter(e: any) {
64
+ e.target.closest('table').querySelector('tbody').classList.add('drag-trigger-mousedown');
65
+ }
66
+
67
+ return (
68
+ <>
69
+ <th scope="row" colSpan={cols} data-table-text={columnHeader} data-table-col={index} style={style ? style : (width ? ((typeof window !== 'undefined' && window.innerWidth > 768) ? {width: width} : {}) : {})} className={className || ''}>
70
+ {draggable ? <span className="drag-trigger" data-id={rowIndex} onMouseEnter={handleTbodyEnter}>
71
+ <svg width="1em" height="1em" viewBox="0 0 24 24" fill="none">
72
+ <g>
73
+ <path d="M18 14C17.4477 14 17 14.4477 17 15C17 15.5523 17.4477 16 18 16C18.5523 16 19 15.5523 19 15C19 14.4477 18.5523 14 18 14Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
74
+ <path d="M12 14C11.4477 14 11 14.4477 11 15C11 15.5523 11.4477 16 12 16C12.5523 16 13 15.5523 13 15C13 14.4477 12.5523 14 12 14Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
75
+ <path d="M6 14C5.44772 14 5 14.4477 5 15C5 15.5523 5.44772 16 6 16C6.55228 16 7 15.5523 7 15C7 14.4477 6.55228 14 6 14Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
76
+ <path d="M18 8C17.4477 8 17 8.44772 17 9C17 9.55228 17.4477 10 18 10C18.5523 10 19 9.55228 19 9C19 8.44772 18.5523 8 18 8Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
77
+ <path d="M12 8C11.4477 8 11 8.44772 11 9C11 9.55228 11.4477 10 12 10C12.5523 10 13 9.55228 13 9C13 8.44772 12.5523 8 12 8Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
78
+ <path d="M6 8C5.44772 8 5 8.44772 5 9C5 9.55228 5.44772 10 6 10C6.55228 10 7 9.55228 7 9C7 8.44772 6.55228 8 6 8Z" stroke="#000000" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round" />
79
+ </g>
80
+ </svg>
81
+ </span> : null}
82
+
83
+ <span className="checkbox-trigger">
84
+ {useRadio ? <>
85
+ <Radio
86
+ wrapperClassName=""
87
+ options={`{
88
+ "":"${rowKey}"}`}
89
+ name={`checkbox-${checkboxNamePrefix}-0`}
90
+ tabIndex={-1}
91
+ data-index={`${rowIndex}`}
92
+ data-key={`${rowKey}`}
93
+ value={`${rowKey}`}
94
+ onClick={(e: any, val: any) => {
95
+
96
+ // callback
97
+ //-----------
98
+ onCheck?.(formatCheckboxControlVal(e.target));
99
+
100
+
101
+ }}
102
+
103
+ />
104
+
105
+ </> : <>
106
+ <Checkbox
107
+ ref={checkboxRef}
108
+ wrapperClassName=""
109
+ name={`checkbox-${checkboxNamePrefix}-${rowIndex}`}
110
+ tabIndex={-1}
111
+ data-index={`${rowIndex}`}
112
+ data-key={`${rowKey}`}
113
+ value={`${rowKey}`}
114
+ checked={getCheckedData!.filter((cur: any) => cur.key === rowKey)[0]?.checked}
115
+ onChange={(e: any, val: any) => {
116
+
117
+ const _curKey: string = e.target.value;
118
+ const _checkedData: any = getCheckedData;
119
+
120
+ let _res: any = getCheckedPrint;
121
+
122
+
123
+ // STEP 1:
124
+ // Current checkbox
125
+ //-----------
126
+ if ( val === true ) {
127
+ _res.push(formatCheckboxControlVal(e.target));
128
+ setCheckboxCheckedData(_checkedData, _curKey, true);
129
+ } else {
130
+ setCheckboxCheckedData(_checkedData, _curKey, false);
131
+ _res = removeItemOnce(_res, _curKey);
132
+
133
+ }
134
+
135
+ // STEP 2:
136
+ // Array deduplication
137
+ //-----------
138
+ _res = _res.filter((item: any, index: number, self: any[]) => index === self.findIndex((t) => (t.key === item.key)))
139
+
140
+
141
+
142
+
143
+ // STEP 3:
144
+ // ALl parent checkboxes
145
+ //-----------
146
+ const _headRow = e.target.closest('table').querySelectorAll('thead th')[0];
147
+ if ( typeof _headRow !== 'undefined' ) {
148
+ const _rootCheckbox = _headRow.querySelector('[type="checkbox"]');
149
+ const _checkboxes = getChildren(e.target.closest('table').querySelector('tbody'), '[type="checkbox"]');
150
+ const _checkedLength = _checkboxes.filter((el: any) => {
151
+ return el.checked === true;
152
+ }).length;
153
+
154
+ if ( _checkedLength === 0 ) {
155
+ _rootCheckbox.indeterminate = false;
156
+ updategetCheckedRootData([{
157
+ key: `row-all`,
158
+ checked: false
159
+ }]);
160
+ } else {
161
+ if ( _checkedLength === _checkboxes.length ) {
162
+ _rootCheckbox.indeterminate = false;
163
+ updategetCheckedRootData([{
164
+ key: `row-all`,
165
+ checked: true
166
+ }]);
167
+ }
168
+
169
+ if ( _checkedLength < _checkboxes.length ) {
170
+ updategetCheckedRootData([{
171
+ key: `row-all`,
172
+ checked: false
173
+ }]);
174
+ _rootCheckbox.indeterminate = true;
175
+
176
+ }
177
+ }
178
+
179
+ }
180
+
181
+
182
+ // STEP 4:
183
+ // Update checked data
184
+ //-----------
185
+ updategetCheckedData(_checkedData);
186
+
187
+
188
+ // STEP 5:
189
+ // Update checked print
190
+ //-----------
191
+ updateCheckedPrint(_res);
192
+
193
+
194
+ // STEP 6:
195
+ // callback
196
+ //-----------
197
+ onCheck?.(_res);
198
+
199
+
200
+ }}
201
+ />
202
+ </>}
203
+
204
+ </span>
205
+ <span ref={contentRef}>{content}</span>
206
+ </th>
207
+ </>
208
+ )
209
+ }
210
+
211
+ export default TableFieldRow;
212
+
@@ -0,0 +1,146 @@
1
+ import React from 'react';
2
+
3
+ import Checkbox from 'rpb-checkbox';
4
+
5
+
6
+ import { getChildren } from './utils/dom';
7
+ import { formatCheckboxControlVal, setCheckboxCheckedData } from './table-utils';
8
+
9
+ /* Table Headers
10
+ -------------------------------------------------*/
11
+ type TableHeadersProps = {
12
+ data: any[];
13
+ useRadio?: boolean;
14
+ headClassName?: string;
15
+ checkboxNamePrefix?: string;
16
+ sortable?: boolean;
17
+ getCheckedPrint?: any[];
18
+ updateCheckedPrint?: any;
19
+ getCheckedData?: any[];
20
+ updategetCheckedData?: any;
21
+ getCheckedRootData?: any[];
22
+ updategetCheckedRootData?: any;
23
+ onCheck?: (val: any) => void;
24
+ evSort?: (option: any) => void;
25
+ };
26
+
27
+ const TableHeaders = (props: TableHeadersProps) => {
28
+
29
+ const {
30
+ data,
31
+ useRadio,
32
+ headClassName,
33
+ checkboxNamePrefix,
34
+ sortable,
35
+ getCheckedPrint,
36
+ updateCheckedPrint,
37
+ getCheckedData,
38
+ updategetCheckedData,
39
+ getCheckedRootData,
40
+ updategetCheckedRootData,
41
+ onCheck,
42
+ evSort
43
+ } = props;
44
+
45
+
46
+
47
+ return data ? (
48
+ <>
49
+ <thead className={headClassName ? headClassName : ''}>
50
+ <tr>
51
+ {data.map((item: any, i: number) => {
52
+ return <th key={i} scope="col" data-sort-type={item.type} data-table-text={item.content.replace(/(<([^>]+)>)/ig, '')} data-table-col={i} style={item.style ? item.style : (item.width ? ((typeof window !== 'undefined' && window.innerWidth > 768) ? {width: item.width} : {}) : {})} className={item.className || ''}>
53
+ {i === 0 ? <span className="checkbox-trigger" style={{visibility: useRadio ? 'hidden' : 'visible'}}>
54
+ <Checkbox
55
+ wrapperClassName=""
56
+ name={`checkbox-${checkboxNamePrefix}-all`}
57
+ tabIndex={-1}
58
+ value={`row-all`}
59
+ checked={getCheckedRootData!.filter((cur: any) => cur.key === 'row-all')[0]?.checked}
60
+ onChange={(e: any, val: any) => {
61
+
62
+ const _checkedData: any = getCheckedData;
63
+ let _res: any = getCheckedPrint;
64
+
65
+
66
+ // STEP 1:
67
+ // Current checkbox
68
+ //-----------
69
+ if (val === true) {
70
+ updategetCheckedRootData([{
71
+ key: `row-all`,
72
+ checked: true
73
+ }]);
74
+ } else {
75
+ updategetCheckedRootData([{
76
+ key: `row-all`,
77
+ checked: false
78
+ }]);
79
+ }
80
+
81
+
82
+ // STEP 2:
83
+ // All child checkboxes
84
+ //-----------
85
+ const _checkboxes = getChildren(e.target.closest('table').querySelector('tbody'), '[type="checkbox"]');
86
+ [].slice.call(_checkboxes).forEach((node: any) => {
87
+ if (val === true) {
88
+ setCheckboxCheckedData(_checkedData, node.dataset.key, true);
89
+ _res.push(formatCheckboxControlVal(node));
90
+ } else {
91
+ setCheckboxCheckedData(_checkedData, node.dataset.key, false);
92
+ _res = [];
93
+
94
+ }
95
+ });
96
+
97
+
98
+ // STEP 3:
99
+ // Array deduplication
100
+ //-----------
101
+ _res = _res.filter((item: any, index: number, self: any[]) => index === self.findIndex((t) => (t.key === item.key)))
102
+
103
+
104
+ // STEP 4:
105
+ // Update checked data
106
+ //-----------
107
+ updategetCheckedData(_checkedData);
108
+
109
+ // STEP 5:
110
+ // Update checked print
111
+ //-----------
112
+ updateCheckedPrint(_res);
113
+
114
+
115
+ // STEP 6:
116
+ // callback
117
+ //-----------
118
+ onCheck?.(_res);
119
+
120
+
121
+ }}
122
+ />
123
+ </span> : null}
124
+ <span dangerouslySetInnerHTML={{ __html: `${item.content}` }}></span>
125
+ {sortable ? <span className="sort-trigger" onClick={evSort}><svg width="1em" height="1em" viewBox="0 0 18 18">
126
+ <g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
127
+ <path d="M9.5,3 L13,8 L6,8 L9.5,3 L9.5,3 Z M6,11 L13,11 L9.5,16 L6,11 L6,11 Z" id="path" fill="#000000">
128
+ </path>
129
+ </g>
130
+ </svg></span> : null}
131
+
132
+ </th>;
133
+ })}
134
+
135
+ {useRadio ? <>
136
+ <th style={{display: 'none'}}></th>
137
+ </> : null}
138
+ </tr>
139
+ </thead>
140
+ </>
141
+ ) : null;
142
+
143
+ }
144
+
145
+ export default TableHeaders;
146
+