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,314 @@
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 TagInputProps = {
10
+ wrapperClassName?: string;
11
+ value?: string;
12
+ maxTags?: number;
13
+ label?: React.ReactNode | string;
14
+ name?: string;
15
+ maxLength?: any;
16
+ disabled?: any;
17
+ required?: any;
18
+ readOnly?: any;
19
+ placeholder?: string;
20
+ /** -- */
21
+ id?: string;
22
+ style?: React.CSSProperties;
23
+ tabIndex?: number;
24
+ [key: `data-${string}`]: string | undefined;
25
+ onChange?: (e: any, param: any) => void;
26
+ onBlur?: (e: any) => void;
27
+ onFocus?: (e: any) => void;
28
+
29
+ };
30
+
31
+
32
+ const TagInput = forwardRef((props: TagInputProps, ref: any) => {
33
+ const {
34
+ wrapperClassName,
35
+ maxTags,
36
+ disabled,
37
+ required,
38
+ placeholder,
39
+ readOnly,
40
+ value,
41
+ label,
42
+ name,
43
+ id,
44
+ maxLength,
45
+ style,
46
+ tabIndex,
47
+ onChange,
48
+ onBlur,
49
+ onFocus,
50
+ ...attributes
51
+ } = props;
52
+
53
+
54
+ const uniqueID = useId();
55
+ const idRes = id || uniqueID;
56
+ const rootRef = useRef<any>(null);
57
+ const inputRef = useRef<any>(null);
58
+ const valRef = useRef<any>(null);
59
+ const max = maxTags ? maxTags : 10;
60
+ const [lastId, setLastId] = useState<number>(-1);
61
+ const [userInput, setUserInput] = useState<string>('');
62
+ const [items, setItems] = useState<any[]>([]);
63
+ const [alreadyInItems, setAlreadyInItems] = useState<boolean>(false);
64
+ const [onComposition, setOnComposition] = useState(false);
65
+
66
+
67
+ function initDefaultValue(defaultValue: any) {
68
+
69
+ // change the value to trigger component rendering
70
+ if ( typeof defaultValue === 'undefined' || defaultValue === '' ) {
71
+ setItems([]);
72
+ } else {
73
+ setItems(defaultValue.trim().replace(/^\,|\,$/g, '').split(',').map((item: any, index: number) => {
74
+ return {
75
+ content: item,
76
+ id: index
77
+ }
78
+ }));
79
+ }
80
+ }
81
+
82
+
83
+ function handleRemove(e: any) {
84
+ e.preventDefault();
85
+
86
+ const idToRemove = Number(e.currentTarget.dataset.item);
87
+ const newArray = items!.filter((item: any) => item.id !== idToRemove);
88
+ setItems(newArray);
89
+
90
+ //
91
+ onChange?.(inputRef.current, newArray);
92
+ }
93
+
94
+ function handleKeypress(event: any) {
95
+
96
+ // Avoid adding results before when the user enters text is not complete
97
+ if ( onComposition ) return;
98
+
99
+
100
+ if (event.code == "Enter" || event.code == "Space") {
101
+ event.preventDefault();
102
+
103
+ if (alreadyInItems) return false;
104
+
105
+ //
106
+ const newArray = items;
107
+ const currentcontent = userInput!.trim();
108
+ if (!currentcontent) {
109
+ return;
110
+ }
111
+
112
+ //Limit the total number of tags added
113
+ if (max - 1 < newArray!.length) {
114
+ return;
115
+ }
116
+
117
+ newArray!.push({
118
+ content: currentcontent,
119
+ id: lastId + 1
120
+ });
121
+
122
+ setLastId((prevState) => ++prevState);
123
+ setItems(newArray);
124
+ setUserInput('');
125
+
126
+ //
127
+ onChange?.(inputRef.current, items);
128
+
129
+
130
+ }
131
+ }
132
+
133
+ function handleComposition(event: any) {
134
+ if (event.type === 'compositionstart') {
135
+ setOnComposition(true);
136
+ }
137
+ if (event.type === 'compositionend') {
138
+ setOnComposition(false);
139
+ }
140
+ }
141
+
142
+
143
+ function handleChange(event: any) {
144
+
145
+ const val = event.target.value;
146
+
147
+ //----
148
+ //remove focus style
149
+ if (val === '') {
150
+ rootRef.current.classList.remove('focus');
151
+ }
152
+
153
+ //
154
+ let _alreadyInItems = alreadyInItems;
155
+
156
+ if (items && items.length > 0) {
157
+ const alreadyIn = items.some(function (obj) {
158
+ return obj.content.toLowerCase() == val.toLowerCase();
159
+ });
160
+ if (alreadyIn) {
161
+ _alreadyInItems = true;
162
+ } else {
163
+ _alreadyInItems = false;
164
+ }
165
+
166
+ }
167
+
168
+ setAlreadyInItems(_alreadyInItems);
169
+ setUserInput(val);
170
+
171
+ }
172
+
173
+
174
+
175
+ function handleFocus(event: any) {
176
+ rootRef.current.classList.add('focus');
177
+
178
+ //
179
+ onFocus?.(event);
180
+ }
181
+
182
+
183
+ function handleBlur(event: any) {
184
+ const el = event.target;
185
+ const val = event.target.value;
186
+
187
+
188
+ //----
189
+ //remove focus style
190
+ if (val === '') {
191
+ rootRef.current.classList.remove('focus');
192
+ }
193
+
194
+ //
195
+ onBlur?.(event);
196
+ }
197
+
198
+
199
+ useEffect(() => {
200
+
201
+
202
+ // update default value
203
+ //--------------
204
+ initDefaultValue(value);
205
+
206
+
207
+ // If you use the dynamic form assignment (such as document.getElementById(xxx).value),
208
+ // you need to judge the value of the input obtained by using the macrotask "setInterval()"
209
+ let timer: any = null;
210
+ let initTimes: number = 0;
211
+ let hasValue: boolean = false;
212
+ timer = setInterval( () => {
213
+ if ( initTimes > 5 || hasValue ) {
214
+ clearInterval(timer);
215
+ } else {
216
+ if (valRef.current !== null && valRef.current.value !== '' && (typeof value === 'undefined' || value === '')) {
217
+ initDefaultValue(valRef.current.value);
218
+ hasValue = true;
219
+ }
220
+ initTimes++;
221
+
222
+ }
223
+ }, 500);
224
+
225
+ return () => {
226
+ clearInterval(timer);
227
+ }
228
+
229
+
230
+ }, [value]);
231
+
232
+
233
+ return (
234
+ <>
235
+
236
+ <div className={wrapperClassName || wrapperClassName === '' ? `tag-input__wrapper ${wrapperClassName}` : `tag-input__wrapper mb-3 position-relative`} ref={rootRef}>
237
+
238
+ {label ? <><label htmlFor={`label-${idRes}`} className="form-label">{label}</label></> : null}
239
+
240
+
241
+ <div className="tag-input__control-wrapper">
242
+ <div>
243
+ <ul className="tag-input__list">
244
+ {items ? items.map((item: any, index: number) => (
245
+ <li key={index}>
246
+ {item.content}
247
+
248
+ <a href="#" tabIndex={-1} onClick={handleRemove} data-item={item.id}><svg width="10px" height="10px" viewBox="0 0 1024 1024"><path fill="#000" d="M195.2 195.2a64 64 0 0 1 90.496 0L512 421.504 738.304 195.2a64 64 0 0 1 90.496 90.496L602.496 512 828.8 738.304a64 64 0 0 1-90.496 90.496L512 602.496 285.696 828.8a64 64 0 0 1-90.496-90.496L421.504 512 195.2 285.696a64 64 0 0 1 0-90.496z"/></svg></a>
249
+ </li>
250
+ )) : null}
251
+ </ul>
252
+
253
+
254
+ <div className={`tag-input__control ${disabled ? 'disabled' : ''}`} style={{display: max - 1 < items!.length ? 'none' : 'inherit'}}>
255
+ <input
256
+ ref={inputRef}
257
+ tabIndex={tabIndex || 0}
258
+ type="text"
259
+ id={`label-${idRes}`}
260
+
261
+ // Don't use "name", it's just a container to display the label
262
+ data-name={name?.match(/(\[.*?\])/gi) ? `${name.split('[')[0]}-label[]` : `${name}-label`}
263
+ data-tag-input
264
+ autoComplete="off"
265
+ placeholder={placeholder || ''}
266
+ value={userInput}
267
+ maxLength={maxLength || null}
268
+ disabled={disabled || null}
269
+ readOnly={readOnly || null}
270
+ onChange={handleChange}
271
+ onCompositionStart={handleComposition}
272
+ onCompositionUpdate={handleComposition}
273
+ onCompositionEnd={handleComposition}
274
+ onKeyDown={handleKeypress}
275
+ onFocus={handleFocus}
276
+ onBlur={handleBlur}
277
+ style={style}
278
+ {...attributes}
279
+ />
280
+
281
+ </div>
282
+
283
+ {required ? <><span className="position-absolute end-0 top-0 my-2 mx-2"><span className="text-danger">*</span></span></> : ''}
284
+ </div>
285
+
286
+ <input
287
+ tabIndex={-1}
288
+ ref={(node) => {
289
+ valRef.current = node;
290
+ if (typeof ref === 'function') {
291
+ ref(node);
292
+ } else if (ref) {
293
+ ref.current = node;
294
+ }
295
+ }}
296
+ type="hidden"
297
+ id={idRes}
298
+ name={name}
299
+ value={items.map((item: any) => item.content).join(',')}
300
+ required={required || null}
301
+ />
302
+
303
+
304
+ </div>
305
+
306
+
307
+ </div>
308
+
309
+
310
+ </>
311
+ )
312
+ });
313
+
314
+ export default TagInput;
@@ -0,0 +1,178 @@
1
+ import React, { useId, useState, useEffect, useRef, forwardRef } from 'react';
2
+
3
+
4
+ declare module 'react' {
5
+ interface ReactI18NextChildren<T> {
6
+ children?: any;
7
+ }
8
+ }
9
+ interface TextareaProps extends React.ComponentPropsWithoutRef<"textarea"> {
10
+ wrapperClassName?: string;
11
+ controlClassName?: string;
12
+ value?: string;
13
+ label?: React.ReactNode | string;
14
+ name?: string;
15
+ maxLength?: any;
16
+ cols?: number;
17
+ rows?: number;
18
+ disabled?: any;
19
+ required?: any;
20
+ readOnly?: any;
21
+ placeholder?: string;
22
+ /** -- */
23
+ id?: string;
24
+ style?: React.CSSProperties;
25
+ tabIndex?: number;
26
+ [key: `data-${string}`]: string | undefined;
27
+ onChange?: (e: any) => void;
28
+ onBlur?: (e: any) => void;
29
+ onFocus?: (e: any) => void;
30
+ };
31
+
32
+
33
+ const Textarea = forwardRef((props: TextareaProps, ref: any) => {
34
+ const {
35
+ wrapperClassName,
36
+ controlClassName,
37
+ cols,
38
+ rows,
39
+ disabled,
40
+ required,
41
+ placeholder,
42
+ readOnly,
43
+ value,
44
+ label,
45
+ name,
46
+ id,
47
+ maxLength,
48
+ style,
49
+ tabIndex,
50
+ onChange,
51
+ onBlur,
52
+ onFocus,
53
+ ...attributes
54
+ } = props;
55
+
56
+
57
+ const uniqueID = useId();
58
+ const idRes = id || uniqueID;
59
+ const rootRef = useRef<any>(null);
60
+ const valRef = useRef<any>(null);
61
+ const [changedVal, setChangedVal] = useState<string>(value || '');
62
+
63
+ function handleFocus(event: any) {
64
+ const el = event.target;
65
+ rootRef.current.classList.add('focus');
66
+
67
+ //
68
+ onFocus?.(event);
69
+ }
70
+
71
+ function handleChange(event: any) {
72
+ const val = event.target.value;
73
+
74
+ setChangedVal(val);
75
+
76
+ //----
77
+ //remove focus style
78
+ if (val === '') {
79
+ rootRef.current.classList.remove('focus');
80
+ }
81
+
82
+ //
83
+ onChange?.(event);
84
+ }
85
+
86
+ function handleBlur(event: any) {
87
+ const el = event.target;
88
+ const val = event.target.value;
89
+
90
+
91
+ //----
92
+ //remove focus style
93
+ if (val === '') {
94
+ rootRef.current.classList.remove('focus');
95
+ }
96
+
97
+ //
98
+ onBlur?.(event);
99
+ }
100
+
101
+ useEffect(() => {
102
+
103
+ // update default value
104
+ //--------------
105
+ setChangedVal(value || '');
106
+
107
+ // If you use the dynamic form assignment (such as document.getElementById(xxx).value),
108
+ // you need to judge the value of the input obtained by using the macrotask "setInterval()"
109
+ let timer: any = null;
110
+ let initTimes: number = 0;
111
+ let hasValue: boolean = false;
112
+ timer = setInterval( () => {
113
+ if ( initTimes > 5 || hasValue ) {
114
+ clearInterval(timer);
115
+ } else {
116
+ if ( valRef.current !== null && valRef.current.value !== '' && ( typeof value === 'undefined' || value === '' ) ) {
117
+ setChangedVal(valRef.current.value);
118
+ hasValue = true;
119
+ }
120
+ initTimes++;
121
+
122
+ }
123
+ }, 500);
124
+
125
+ return () => {
126
+ clearInterval(timer);
127
+ }
128
+
129
+ }, [value]);
130
+
131
+
132
+ return (
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
+
140
+ <textarea
141
+ ref={(node) => {
142
+ valRef.current = node;
143
+ if (typeof ref === 'function') {
144
+ ref(node);
145
+ } else if (ref) {
146
+ ref.current = node;
147
+ }
148
+ }}
149
+ tabIndex={tabIndex || 0}
150
+ className={controlClassName || controlClassName === '' ? controlClassName : "form-control"}
151
+ id={idRes}
152
+ name={name}
153
+ placeholder={placeholder || ''}
154
+ value={changedVal}
155
+ maxLength={maxLength || null}
156
+ onFocus={handleFocus}
157
+ onBlur={handleBlur}
158
+ onChange={handleChange}
159
+ disabled={disabled || null}
160
+ required={required || null}
161
+ readOnly={readOnly || null}
162
+ cols={cols || 20}
163
+ rows={rows || 2}
164
+ style={style}
165
+ {...attributes}
166
+ />
167
+ </div>
168
+ {required ? <><span className="position-absolute end-0 top-0 my-2 mx-2"><span className="text-danger">*</span></span></> : ''}
169
+
170
+ </div>
171
+
172
+
173
+ </>
174
+ )
175
+
176
+ });
177
+
178
+ export default Textarea;
@@ -0,0 +1,75 @@
1
+ import React from 'react';
2
+
3
+ interface ItemProps extends React.ComponentPropsWithoutRef<any> {
4
+ index: number;
5
+ title?: string | React.ReactNode | boolean;
6
+ note?: string | React.ReactNode | boolean;
7
+ message?: string | React.ReactNode;
8
+ depth: number;
9
+ schemeBody?: string;
10
+ schemeHeader?: string;
11
+ closeBtnColor?: string;
12
+ closeDisabled?: boolean;
13
+ lock?: boolean;
14
+ /** Handling events for close it */
15
+ closeEv?: (index: number) => void | undefined;
16
+ };
17
+
18
+ const Item = (props: ItemProps) => {
19
+
20
+ const {
21
+ index,
22
+ title,
23
+ note,
24
+ message,
25
+ depth,
26
+ lock,
27
+ schemeBody,
28
+ schemeHeader,
29
+ closeBtnColor,
30
+ closeDisabled,
31
+ closeEv
32
+ } = props;
33
+
34
+ return (
35
+ <>
36
+
37
+ <div
38
+ className={`toast-container`}
39
+ data-index={index}
40
+ style={{
41
+ transform: `perspective(100px) translateZ(-${2 * index}px) translateY(${35 * index}px)`,
42
+ zIndex: depth
43
+ }}>
44
+
45
+ {/* Bootstrap toast */}
46
+ <div className={`toast fade show ${schemeBody ? schemeBody : ''}`} role="alert">
47
+ {(title === '' || title === false) && (note === '' || note === false) ? null : <>
48
+ <div className={`toast-header ${schemeHeader ? schemeHeader : ''}`}>
49
+ <strong className="me-auto">{title === '' || title === false ? '' : <>{title}</>}</strong>
50
+ <small className="text-muted">{note === '' || note === false ? '' : <>{note}</>}</small>
51
+ {!lock ? <>{!closeDisabled ? <button data-close="1" data-index={index} tabIndex={-1} type="button" className="btn-close"><svg width="12px" height="12px" viewBox="0 0 16 16"><path fill={`${closeBtnColor ? closeBtnColor : '#000000'}`} d="M9.41 8l3.29-3.29c.19-.18.3-.43.3-.71a1.003 1.003 0 00-1.71-.71L8 6.59l-3.29-3.3a1.003 1.003 0 00-1.42 1.42L6.59 8 3.3 11.29c-.19.18-.3.43-.3.71a1.003 1.003 0 001.71.71L8 9.41l3.29 3.29c.18.19.43.3.71.3a1.003 1.003 0 00.71-1.71L9.41 8z" fillRule="evenodd"></path></svg></button> : null}</> : null}
52
+
53
+ </div>
54
+ </>}
55
+
56
+ <div className="toast-body">
57
+ {message}
58
+
59
+ {(title === '' || title === false) && (note === '' || note === false) ? <>
60
+ {!closeDisabled ? <button data-close="1" data-index={index} tabIndex={-1} type="button" className="btn-close position-absolute top-0 end-0 me-2 mt-2"><svg width="12px" height="12px" viewBox="0 0 16 16"><path fill={`${closeBtnColor ? closeBtnColor : '#000000'}`} d="M9.41 8l3.29-3.29c.19-.18.3-.43.3-.71a1.003 1.003 0 00-1.71-.71L8 6.59l-3.29-3.3a1.003 1.003 0 00-1.42 1.42L6.59 8 3.3 11.29c-.19.18-.3.43-.3.71a1.003 1.003 0 001.71.71L8 9.41l3.29 3.29c.18.19.43.3.71.3a1.003 1.003 0 00.71-1.71L9.41 8z" fillRule="evenodd"></path></svg></button> : null}
61
+ </> : null}
62
+
63
+
64
+
65
+ </div>
66
+ </div>
67
+
68
+ </div>
69
+
70
+ </>
71
+ )
72
+ }
73
+
74
+
75
+ export default Item;
@@ -0,0 +1,120 @@
1
+
2
+ /* ======================================================
3
+ <!-- Toast -->
4
+ /* ====================================================== */
5
+
6
+ .toasts__wrapper {
7
+ --bs-toast-zindex: 1090;
8
+ width: 350px;
9
+ position: fixed;
10
+ left: 50%;
11
+ bottom: 0;
12
+ z-index: var(--bs-toast-zindex);
13
+ pointer-events: none;
14
+ transition: .1s ease-in-out;
15
+
16
+ &--bottom-left {
17
+ left: 15px;
18
+ }
19
+
20
+ &--bottom-right {
21
+ left: auto;
22
+ right: 15px;
23
+ }
24
+
25
+ &--bottom-center {
26
+ left: 50%;
27
+ transform: translateX(-50%);
28
+ }
29
+
30
+ &--top-left {
31
+ left: 15px;
32
+ bottom: auto;
33
+ top: 35px;
34
+ }
35
+
36
+ &--top-right {
37
+ left: auto;
38
+ right: 15px;
39
+ top: 35px;
40
+ }
41
+
42
+ &--top-center {
43
+ left: 50%;
44
+ transform: translateX(-50%);
45
+ top: 35px;
46
+ }
47
+
48
+ &--vertical-center {
49
+ left: 50%;
50
+ transform: translate(-50%, -50%);
51
+ top: 50%;
52
+ margin-top: 5%;
53
+ }
54
+
55
+ .toasts {
56
+ position: relative;
57
+ width: 100%;
58
+ bottom: 15px;
59
+ display: flex;
60
+ flex-flow: column-reverse nowrap;
61
+
62
+
63
+ &::before {
64
+ content: '';
65
+ top: -80px;
66
+ bottom: 0;
67
+ left: -8px;
68
+ right: -8px;
69
+ position: absolute;
70
+ background-color: transparent;
71
+ pointer-events: none;
72
+ }
73
+
74
+ &:hover {
75
+ .toast-container {
76
+ transform: perspective(100px) translateZ(0) !important;
77
+ }
78
+ }
79
+ }
80
+
81
+ }
82
+
83
+ /* Bootstrap toast here */
84
+ .toast-container {
85
+ width: 100%;
86
+ height: auto;
87
+ position: relative;
88
+ transition: all .25s;
89
+ pointer-events: auto;
90
+
91
+ [data-close] {
92
+ background: none;
93
+ }
94
+
95
+ [data-close]:focus {
96
+ box-shadow: none;
97
+ }
98
+
99
+ [data-close] svg {
100
+ vertical-align: top;
101
+
102
+ path {
103
+ transition: .3s ease-in-out;
104
+ }
105
+ }
106
+
107
+ [data-close]:hover svg path {
108
+ fill: #f00;
109
+ }
110
+
111
+ &.hide-start {
112
+ opacity: 0;
113
+ }
114
+
115
+ &.hide-end {
116
+ display: none;
117
+ }
118
+
119
+ }
120
+