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,181 @@
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 SearchBarProps = {
10
+ wrapperClassName?: string;
11
+ controlClassName?: string;
12
+ appearance?: string;
13
+ value?: string;
14
+ label?: React.ReactNode | string;
15
+ name?: string;
16
+ maxLength?: any;
17
+ disabled?: any;
18
+ required?: any;
19
+ placeholder?: string;
20
+ icon?: React.ReactNode | string;
21
+ btnId?: string;
22
+ /** -- */
23
+ id?: string;
24
+ style?: React.CSSProperties;
25
+ autoComplete?: string;
26
+ tabIndex?: number;
27
+ [key: `data-${string}`]: string | undefined;
28
+ onClick?: (e: any) => void;
29
+ onChange?: (e: any, param: any) => void;
30
+ onBlur?: (e: any, param: any) => void;
31
+ onFocus?: (e: any, param: any) => void;
32
+ };
33
+
34
+ const SearchBar = forwardRef((props: SearchBarProps, ref: any) => {
35
+ const {
36
+ wrapperClassName,
37
+ controlClassName,
38
+ appearance,
39
+ disabled,
40
+ required,
41
+ placeholder,
42
+ value,
43
+ label,
44
+ name,
45
+ btnId,
46
+ id,
47
+ maxLength,
48
+ icon,
49
+ autoComplete,
50
+ style,
51
+ tabIndex,
52
+ onClick,
53
+ onChange,
54
+ onBlur,
55
+ onFocus,
56
+ ...attributes
57
+ } = props;
58
+
59
+
60
+ const uniqueID = useId();
61
+ const idRes = id || uniqueID;
62
+ const rootRef = useRef<any>(null);
63
+ const [changedVal, setChangedVal] = useState<string>(value || '');
64
+
65
+
66
+ const [onComposition, setOnComposition] = useState(false);
67
+
68
+ function handleComposition(event: any) {
69
+ if (event.type === 'compositionstart') {
70
+ setOnComposition(true);
71
+ }
72
+ if (event.type === 'compositionend') {
73
+ setOnComposition(false);
74
+ }
75
+ }
76
+
77
+
78
+ function handleSubmit(event: any) {
79
+
80
+ //
81
+ onClick?.(event);
82
+ }
83
+
84
+ function handleFocus(event: any) {
85
+ rootRef.current.classList.add('focus');
86
+
87
+ //
88
+ onFocus?.(event, onComposition);
89
+ }
90
+
91
+ function handleChange(event: any) {
92
+ const val = event.target.value;
93
+
94
+ setChangedVal(val);
95
+
96
+ //----
97
+ //remove focus style
98
+ if (val === '') {
99
+ rootRef.current.classList.remove('focus');
100
+ }
101
+
102
+ //
103
+ onChange?.(event, onComposition);
104
+ }
105
+
106
+ function handleBlur(event: any) {
107
+ const el = event.target;
108
+ const val = event.target.value;
109
+
110
+
111
+ //----
112
+ //remove focus style
113
+ if (val === '') {
114
+ rootRef.current.classList.remove('focus');
115
+ }
116
+
117
+ //
118
+ onBlur?.(event, onComposition);
119
+ }
120
+
121
+
122
+ useEffect(() => {
123
+
124
+ // update default value
125
+ //--------------
126
+ setChangedVal(value || '');
127
+
128
+ }, [value]);
129
+
130
+
131
+ return (
132
+ <>
133
+
134
+
135
+ <div className={wrapperClassName || wrapperClassName === '' ? wrapperClassName : "mb-3 position-relative"} ref={rootRef}>
136
+ {label ? <><label htmlFor={idRes} className="form-label">{label}</label></> : null}
137
+
138
+ <div className="input-group">
139
+ <input
140
+ ref={ref}
141
+ tabIndex={tabIndex || 0}
142
+ type={appearance === 'pill' ? 'input' : 'search'}
143
+ className={appearance === 'pill' ? `${(controlClassName || controlClassName === '' ? controlClassName : "form-control")} border rounded-pill` : (controlClassName || controlClassName === '' ? controlClassName : "form-control")}
144
+ id={idRes}
145
+ name={name}
146
+ placeholder={placeholder || ''}
147
+ value={changedVal}
148
+ maxLength={maxLength || null}
149
+ autoComplete={autoComplete ? 'on' : 'off'}
150
+ onFocus={handleFocus}
151
+ onBlur={handleBlur}
152
+ onChange={handleChange}
153
+ onCompositionStart={handleComposition}
154
+ onCompositionUpdate={handleComposition}
155
+ onCompositionEnd={handleComposition}
156
+ disabled={disabled || null}
157
+ required={required || null}
158
+ style={style}
159
+ {...attributes}
160
+ />
161
+
162
+ {icon || icon !== '' ? <>
163
+ <span className={appearance === 'pill' ? 'position-absolute end-0' : 'input-group-text m-0 p-0 border-start-0'} style={appearance === 'pill' ? { zIndex: 5 } : {}}>
164
+ <button id={btnId} type="button" className={appearance === 'pill' ? 'btn border-end-0 rounded-pill' : 'btn btn-sm'} onClick={handleSubmit}>
165
+ {icon ? <>{icon}</> : <><svg width="1.2em" height="1.2em" fill="#333" viewBox="0 0 16 16">
166
+ <path d="M12.027 9.92L16 13.95 14 16l-4.075-3.976A6.465 6.465 0 0 1 6.5 13C2.91 13 0 10.083 0 6.5 0 2.91 2.917 0 6.5 0 10.09 0 13 2.917 13 6.5a6.463 6.463 0 0 1-.973 3.42zM1.997 6.452c0 2.48 2.014 4.5 4.5 4.5 2.48 0 4.5-2.015 4.5-4.5 0-2.48-2.015-4.5-4.5-4.5-2.48 0-4.5 2.014-4.5 4.5z" fillRule="evenodd" />
167
+ </svg></>}
168
+ </button>
169
+
170
+ </span>
171
+ </> : null}
172
+
173
+ </div>
174
+ </div>
175
+
176
+
177
+ </>
178
+ )
179
+ });
180
+
181
+ export default SearchBar;
@@ -0,0 +1,276 @@
1
+ import React, { useId, useEffect, useState, useRef, forwardRef } from 'react';
2
+
3
+ declare module 'react' {
4
+ interface ReactI18NextChildren<T> {
5
+ children?: any;
6
+ }
7
+ }
8
+
9
+ interface OptionConfig {
10
+ [propName: string]: string | number;
11
+ }
12
+
13
+
14
+
15
+ type SelectOptionChangeFnType = (arg1: any, arg2: any) => void;
16
+
17
+
18
+ type SelectProps = {
19
+ wrapperClassName?: string;
20
+ value?: string;
21
+ label?: React.ReactNode | string;
22
+ name?: string;
23
+ disabled?: any;
24
+ required?: any;
25
+ options?: OptionConfig[] | string;
26
+ /** -- */
27
+ id?: string;
28
+ style?: React.CSSProperties;
29
+ tabIndex?: number;
30
+ [key: `data-${string}`]: string | undefined;
31
+ fetchFuncAsync?: any;
32
+ fetchFuncMethod?: string;
33
+ fetchFuncMethodParams?: any[];
34
+ fetchCallback?: (data: any) => void;
35
+ onFetch?: (data: any) => void;
36
+ onChange?: SelectOptionChangeFnType | null;
37
+ onBlur?: (e: any) => void;
38
+ onFocus?: (e: any) => void;
39
+ };
40
+
41
+ const Select = forwardRef((props: SelectProps, ref: any) => {
42
+ const {
43
+ wrapperClassName,
44
+ disabled,
45
+ required,
46
+ value,
47
+ label,
48
+ name,
49
+ id,
50
+ options,
51
+ style,
52
+ tabIndex,
53
+ fetchFuncAsync,
54
+ fetchFuncMethod,
55
+ fetchFuncMethodParams,
56
+ fetchCallback,
57
+ onFetch,
58
+ onChange,
59
+ onBlur,
60
+ onFocus,
61
+ ...attributes
62
+ } = props;
63
+
64
+
65
+ const uniqueID = useId();
66
+ const idRes = id || uniqueID;
67
+ const rootRef = useRef<any>(null);
68
+ const selectRef = useRef<any>(null);
69
+ const optionsRes = options ? isJSON( options ) ? JSON.parse( options as string ) : options : '';
70
+
71
+ // return a array of options
72
+ let optionsDataInit: OptionConfig[] = [];
73
+ const optionKeys = Object.keys(optionsRes);
74
+ const optionValues = Object.values(optionsRes).map((item: any) => item.toString() );
75
+
76
+ optionsDataInit = optionKeys.map((item: any, index: number) => {
77
+ return {
78
+ label: optionKeys[index],
79
+ value: optionValues[index]
80
+ }
81
+ });
82
+
83
+
84
+ //
85
+ const [dataInit, setDataInit] = useState<OptionConfig[]>(optionsDataInit);
86
+ const [hasErr, setHasErr] = useState<boolean>(false);
87
+ const [controlValue, setControlValue] = useState<string | undefined>('');
88
+
89
+
90
+ async function fetchData(params: any) {
91
+
92
+ // set default value
93
+ if (typeof value !== 'undefined' && value !== '') selectRef.current.dataset.value = value;
94
+
95
+ //
96
+ if ( typeof fetchFuncAsync === 'object' ) {
97
+
98
+ const response: any = await fetchFuncAsync[`${fetchFuncMethod}`](...params.split(','));
99
+ let _ORGIN_DATA = response.data;
100
+
101
+ // reset data structure
102
+ if (typeof (fetchCallback) === 'function') {
103
+ _ORGIN_DATA = fetchCallback(_ORGIN_DATA);
104
+ }
105
+
106
+ // Determine whether the data structure matches
107
+ if ( _ORGIN_DATA.length > 0 && typeof _ORGIN_DATA[0].value === 'undefined' ) {
108
+ console.warn( 'The data structure does not match, please refer to the example in the component documentation.' );
109
+ setHasErr(true);
110
+ _ORGIN_DATA = [];
111
+ }
112
+
113
+ //
114
+ setControlValue(value); // value must be initialized
115
+
116
+
117
+ //
118
+ setDataInit(_ORGIN_DATA); // data must be initialized
119
+
120
+ //
121
+ onFetch?.(_ORGIN_DATA);
122
+
123
+ return _ORGIN_DATA;
124
+ } else {
125
+
126
+ //
127
+ setControlValue(value); // value must be initialized
128
+
129
+ //
130
+ setDataInit(optionsDataInit); // data must be initialized
131
+
132
+ //
133
+ onFetch?.(optionsDataInit);
134
+
135
+ return optionsDataInit;
136
+ }
137
+
138
+
139
+ }
140
+
141
+
142
+ // Determine whether it is in JSON format
143
+ function isJSON( str: any ){
144
+
145
+ if ( typeof(str) === 'string' && str.length > 0 ) {
146
+
147
+ if ( str.replace( /\"\"/g, '' ).replace( /\,/g, '' ) == '[{}]' ) {
148
+ return false;
149
+ } else {
150
+
151
+ if (/^[\],:{}\s]*$/.test( str.replace(/\\["\\\/bfnrtu]/g, '@' ).
152
+ replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
153
+ replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) {
154
+
155
+ return true;
156
+
157
+ }else{
158
+ return false;
159
+ }
160
+
161
+ }
162
+
163
+ } else {
164
+
165
+ if (
166
+ typeof(str) === 'object' &&
167
+ Object.prototype.toString.call(str) === '[object Object]' &&
168
+ ! str.length
169
+ ) {
170
+ return true;
171
+ } else {
172
+ return false;
173
+ }
174
+
175
+ }
176
+
177
+ }
178
+
179
+
180
+ //
181
+ function handleFocus(event: any) {
182
+ rootRef.current.classList.add('focus');
183
+
184
+ //
185
+ onFocus?.(event);
186
+ }
187
+
188
+ function handleChange(event: any) {
189
+ const val = event.target.value;
190
+
191
+
192
+ //----
193
+ // update value
194
+ setControlValue(val);
195
+
196
+
197
+ //----
198
+ //remove focus style
199
+ rootRef.current.classList.remove('focus');
200
+
201
+ //
202
+ if ( typeof(onChange) === 'function' ) {
203
+ onChange(event, dataInit[event.target.selectedIndex]);
204
+
205
+ event.target.blur();
206
+ }
207
+
208
+ }
209
+
210
+ function handleBlur(event: any) {
211
+
212
+ //----
213
+ //remove focus style
214
+ rootRef.current.classList.remove('focus');
215
+
216
+ //
217
+ onBlur?.(event);
218
+ }
219
+
220
+
221
+ // Generate list of options
222
+ const selectOptionsList = dataInit.map((item: any, index: number) => {
223
+ return <option key={index} value={item.value as string}>{item.label}</option>;
224
+
225
+ });
226
+
227
+
228
+
229
+ useEffect(() => {
230
+
231
+ // data init
232
+ //--------------
233
+ const _params: any[] = fetchFuncMethodParams || [];
234
+ fetchData((_params).join(','));
235
+
236
+ }, [value, options]);
237
+
238
+
239
+ return (
240
+ <>
241
+
242
+ <div className={wrapperClassName || wrapperClassName === '' ? wrapperClassName : "mb-3 position-relative"} ref={rootRef}>
243
+ {label ? <><label htmlFor={idRes} className="form-label">{label}</label></> : null}
244
+ <select
245
+ ref={(node) => {
246
+ selectRef.current = node;
247
+ if (typeof ref === 'function') {
248
+ ref(node);
249
+ } else if (ref) {
250
+ ref.current = node;
251
+ }
252
+ }}
253
+ tabIndex={tabIndex || 0}
254
+ className="form-select"
255
+ id={idRes}
256
+ name={name}
257
+ value={controlValue} // do not use `defaultValue`
258
+ onFocus={handleFocus}
259
+ onBlur={handleBlur}
260
+ onChange={handleChange}
261
+ disabled={disabled || null}
262
+ required={required || null}
263
+ style={style}
264
+ {...attributes}
265
+ >
266
+ {!hasErr ? selectOptionsList : null}
267
+ </select>
268
+
269
+ </div>
270
+
271
+
272
+ </>
273
+ )
274
+ });
275
+
276
+ export default Select;
@@ -0,0 +1,27 @@
1
+ /* ======================================================
2
+ <!-- Show More Less -->
3
+ /* ====================================================== */
4
+
5
+ .show-more-less__wrapper {
6
+ position: relative;
7
+ height: 8.5rem;
8
+ overflow: hidden;
9
+
10
+ .show-more-less__mask {
11
+ display: block;
12
+ content: "...";
13
+ text-align: right;
14
+ position: absolute;
15
+ bottom: 0;
16
+ left: 0;
17
+ width: 100%;
18
+ height: 2em;
19
+ overflow: hidden;
20
+ }
21
+
22
+
23
+ /* Actived status */
24
+ &.active .show-more-less__mask {
25
+ display: none;
26
+ }
27
+ }
@@ -0,0 +1,144 @@
1
+ import React, { useId, useState, useRef, useCallback } from 'react';
2
+
3
+
4
+ // Adapt the easing parameters of CSS3
5
+ enum EasingList {
6
+ linear = 'linear',
7
+ easeIn = 'ease-in',
8
+ easeOut = 'ease-out',
9
+ easeInOut = 'ease-in-out'
10
+ }
11
+
12
+
13
+ type ShowMoreLessProps = {
14
+ /** Speed of scrolling up. Amount of time measured in milliseconds. */
15
+ speed?: number;
16
+ /** Types of easing animation */
17
+ easing: string;
18
+ /** Set a default height to hide the remaining content. Please include the length unit, such as `em`, `px` */
19
+ defaultHeight?: string;
20
+ /** ///// */
21
+ /** Specify a class for the show trigger. */
22
+ triggerShowClassName?: string;
23
+ /** Specify a class for the hide trigger. */
24
+ triggerHideClassName?: string;
25
+ /** Set a piece of text or HTML code for the show trigger */
26
+ triggerShowContent?: React.ReactNode;
27
+ /** Set a piece of text or HTML code for the hide trigger */
28
+ triggerHideContent?: React.ReactNode;
29
+ /** Specifies the color effect of the mask */
30
+ maskColor?: string;
31
+ /** Set the opacity of the mask */
32
+ maskOpacity?: number;
33
+ /** Specifies the height of the mask */
34
+ maskHeight?: string;
35
+ /** -- */
36
+ id?: string;
37
+ tabIndex?: number;
38
+ children: React.ReactNode;
39
+ };
40
+
41
+
42
+ const ShowMoreLess = (props: ShowMoreLessProps) => {
43
+ const {
44
+ speed,
45
+ easing,
46
+ defaultHeight,
47
+ triggerShowClassName,
48
+ triggerHideClassName,
49
+ triggerShowContent,
50
+ triggerHideContent,
51
+ maskColor,
52
+ maskOpacity,
53
+ maskHeight,
54
+ id,
55
+ tabIndex,
56
+ children
57
+ } = props;
58
+
59
+
60
+ const uniqueID = useId();
61
+ const idRes = id || uniqueID;
62
+ const rootRef = useRef<any>(null);
63
+
64
+ const color: string = maskColor ? maskColor.replace(/\,/g, ''): '255 255 255';
65
+ const opacity: number = maskOpacity ? parseFloat(maskOpacity as never): 100;
66
+ const duration: number = speed ? speed / 1000 : 0.5;
67
+ const ease: string = EasingList[easing as never];
68
+ const initHeight: number | string = defaultHeight ? defaultHeight : '8.5rem';
69
+
70
+ const [displayEnabled, setDisplayEnabled] = useState<boolean>(false);
71
+ const [height, setHeight] = useState<number | string>(initHeight);
72
+
73
+
74
+ const handleChange = useCallback((e: any) => {
75
+ e.preventDefault();
76
+
77
+ setDisplayEnabled(!displayEnabled);
78
+
79
+ if (height !== "auto") {
80
+ setHeight(rootRef.current!.scrollHeight);
81
+ } else {
82
+
83
+ // If the height value is `auto` when hiding the content, there needs to be a delay
84
+ // (at least 1 millisecond), otherwise, the transition effect of translate cannot be presented
85
+ setHeight(rootRef.current!.scrollHeight);
86
+ setTimeout(() => setHeight(initHeight), 1);
87
+
88
+ }
89
+
90
+ }, [height]);
91
+
92
+
93
+ // Handling events when the animation execution is complete
94
+ function updateAfterTransition() {
95
+ if (displayEnabled) {
96
+ setHeight('auto');
97
+ }
98
+ }
99
+
100
+
101
+ return (
102
+ <>
103
+
104
+ <div
105
+ ref={rootRef}
106
+ id={idRes}
107
+ onTransitionEnd={() => updateAfterTransition()}
108
+ className={`show-more-less__wrapper ${displayEnabled ? 'active' : ''}`}
109
+ style={{
110
+ height: height,
111
+ overflow: "hidden",
112
+ transition: `all ${duration}s ${ease} 0s`,
113
+ }}
114
+ >
115
+ {children}
116
+
117
+
118
+ {maskOpacity !== 0 ? <span className="show-more-less__mask" style={{ background: `linear-gradient(to bottom, rgb(${color} / 0%), rgb(${color} / ${opacity}%))`, height: maskHeight ? maskHeight : '2em' }}></span> : null}
119
+
120
+ </div>
121
+
122
+
123
+ {!displayEnabled ? <>
124
+ {triggerShowContent ? <>
125
+ <a tabIndex={tabIndex || 0} href="#" className={triggerShowClassName ? `${triggerShowClassName}` : `d-inline w-auto`} onClick={handleChange}>{triggerShowContent}</a>
126
+ </> : null}
127
+
128
+ </> : <>
129
+ {triggerHideContent ? <>
130
+ <a tabIndex={tabIndex || 0} href="#" className={triggerHideClassName ? `${triggerHideClassName}` : `d-inline w-auto`} onClick={handleChange}>{triggerHideContent}</a>
131
+ </> : null}
132
+ </>}
133
+
134
+
135
+
136
+
137
+
138
+
139
+ </>
140
+ )
141
+ };
142
+
143
+
144
+ export default ShowMoreLess;