tntd 2.0.18 → 2.0.19

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 (219) hide show
  1. package/es/index.js +2 -1
  2. package/es/index.js.map +1 -1
  3. package/es/tntd-cascader/AntdCascader/index.less +18 -14
  4. package/es/tntd-form/CustomForm/components/Item.js +40 -0
  5. package/es/tntd-form/CustomForm/components/Item.js.map +1 -0
  6. package/es/tntd-form/CustomForm/components/ItemComp.js +149 -0
  7. package/es/tntd-form/CustomForm/components/ItemComp.js.map +1 -0
  8. package/es/tntd-form/CustomForm/components/List.js +75 -0
  9. package/es/tntd-form/CustomForm/components/List.js.map +1 -0
  10. package/es/tntd-form/CustomForm/index.js +48 -0
  11. package/es/tntd-form/CustomForm/index.js.map +1 -0
  12. package/es/tntd-form/CustomForm/interface.js +1 -0
  13. package/es/tntd-form/CustomForm/interface.js.map +1 -0
  14. package/es/tntd-form/CustomForm/store.js +2 -0
  15. package/es/tntd-form/CustomForm/store.js.map +1 -0
  16. package/es/tntd-form/CustomForm/utils.js +215 -0
  17. package/es/tntd-form/CustomForm/utils.js.map +1 -0
  18. package/es/tntd-form/TntdForm/components/Item.js +40 -0
  19. package/es/tntd-form/TntdForm/components/Item.js.map +1 -0
  20. package/es/tntd-form/TntdForm/components/ItemComp.js +149 -0
  21. package/es/tntd-form/TntdForm/components/ItemComp.js.map +1 -0
  22. package/es/tntd-form/TntdForm/components/List.js +75 -0
  23. package/es/tntd-form/TntdForm/components/List.js.map +1 -0
  24. package/es/tntd-form/TntdForm/index.js +52 -0
  25. package/es/tntd-form/TntdForm/index.js.map +1 -0
  26. package/es/tntd-form/TntdForm/interface.js +1 -0
  27. package/es/tntd-form/TntdForm/interface.js.map +1 -0
  28. package/es/tntd-form/TntdForm/store.js +2 -0
  29. package/es/tntd-form/TntdForm/store.js.map +1 -0
  30. package/es/tntd-form/TntdForm/utils.js +219 -0
  31. package/es/tntd-form/TntdForm/utils.js.map +1 -0
  32. package/es/tntd-form/index.js +1 -0
  33. package/es/tntd-form/index.js.map +1 -0
  34. package/lib/index.d.ts +1 -0
  35. package/lib/index.d.ts.map +1 -1
  36. package/lib/index.js +7 -0
  37. package/lib/index.js.map +1 -1
  38. package/lib/tntd-cascader/AntdCascader/index.less +18 -14
  39. package/lib/tntd-form/CustomForm/components/Item.d.ts +5 -0
  40. package/lib/tntd-form/CustomForm/components/Item.d.ts.map +1 -0
  41. package/lib/tntd-form/CustomForm/components/Item.js +50 -0
  42. package/lib/tntd-form/CustomForm/components/Item.js.map +1 -0
  43. package/lib/tntd-form/CustomForm/components/ItemComp.d.ts +5 -0
  44. package/lib/tntd-form/CustomForm/components/ItemComp.d.ts.map +1 -0
  45. package/lib/tntd-form/CustomForm/components/ItemComp.js +169 -0
  46. package/lib/tntd-form/CustomForm/components/ItemComp.js.map +1 -0
  47. package/lib/tntd-form/CustomForm/components/List.d.ts +5 -0
  48. package/lib/tntd-form/CustomForm/components/List.d.ts.map +1 -0
  49. package/lib/tntd-form/CustomForm/components/List.js +96 -0
  50. package/lib/tntd-form/CustomForm/components/List.js.map +1 -0
  51. package/lib/tntd-form/CustomForm/index.d.ts +10 -0
  52. package/lib/tntd-form/CustomForm/index.d.ts.map +1 -0
  53. package/lib/tntd-form/CustomForm/index.js +66 -0
  54. package/lib/tntd-form/CustomForm/index.js.map +1 -0
  55. package/lib/tntd-form/CustomForm/interface.d.ts +88 -0
  56. package/lib/tntd-form/CustomForm/interface.d.ts.map +1 -0
  57. package/lib/tntd-form/CustomForm/interface.js +5 -0
  58. package/lib/tntd-form/CustomForm/interface.js.map +1 -0
  59. package/lib/tntd-form/CustomForm/store.d.ts +4 -0
  60. package/lib/tntd-form/CustomForm/store.d.ts.map +1 -0
  61. package/lib/tntd-form/CustomForm/store.js +10 -0
  62. package/lib/tntd-form/CustomForm/store.js.map +1 -0
  63. package/lib/tntd-form/CustomForm/utils.d.ts +48 -0
  64. package/lib/tntd-form/CustomForm/utils.d.ts.map +1 -0
  65. package/lib/tntd-form/CustomForm/utils.js +235 -0
  66. package/lib/tntd-form/CustomForm/utils.js.map +1 -0
  67. package/lib/tntd-form/TntdForm/components/Item.d.ts +5 -0
  68. package/lib/tntd-form/TntdForm/components/Item.d.ts.map +1 -0
  69. package/lib/tntd-form/TntdForm/components/Item.js +50 -0
  70. package/lib/tntd-form/TntdForm/components/Item.js.map +1 -0
  71. package/lib/tntd-form/TntdForm/components/ItemComp.d.ts +5 -0
  72. package/lib/tntd-form/TntdForm/components/ItemComp.d.ts.map +1 -0
  73. package/lib/tntd-form/TntdForm/components/ItemComp.js +169 -0
  74. package/lib/tntd-form/TntdForm/components/ItemComp.js.map +1 -0
  75. package/lib/tntd-form/TntdForm/components/List.d.ts +5 -0
  76. package/lib/tntd-form/TntdForm/components/List.d.ts.map +1 -0
  77. package/lib/tntd-form/TntdForm/components/List.js +96 -0
  78. package/lib/tntd-form/TntdForm/components/List.js.map +1 -0
  79. package/lib/tntd-form/TntdForm/index.d.ts +10 -0
  80. package/lib/tntd-form/TntdForm/index.d.ts.map +1 -0
  81. package/lib/tntd-form/TntdForm/index.js +70 -0
  82. package/lib/tntd-form/TntdForm/index.js.map +1 -0
  83. package/lib/tntd-form/TntdForm/interface.d.ts +91 -0
  84. package/lib/tntd-form/TntdForm/interface.d.ts.map +1 -0
  85. package/lib/tntd-form/TntdForm/interface.js +5 -0
  86. package/lib/tntd-form/TntdForm/interface.js.map +1 -0
  87. package/lib/tntd-form/TntdForm/store.d.ts +4 -0
  88. package/lib/tntd-form/TntdForm/store.d.ts.map +1 -0
  89. package/lib/tntd-form/TntdForm/store.js +10 -0
  90. package/lib/tntd-form/TntdForm/store.js.map +1 -0
  91. package/lib/tntd-form/TntdForm/utils.d.ts +48 -0
  92. package/lib/tntd-form/TntdForm/utils.d.ts.map +1 -0
  93. package/lib/tntd-form/TntdForm/utils.js +239 -0
  94. package/lib/tntd-form/TntdForm/utils.js.map +1 -0
  95. package/lib/tntd-form/index.d.ts +2 -0
  96. package/lib/tntd-form/index.d.ts.map +1 -0
  97. package/lib/tntd-form/index.js +13 -0
  98. package/lib/tntd-form/index.js.map +1 -0
  99. package/package.json +1 -1
  100. package/es/array-input/style/index.js +0 -1
  101. package/es/array-input/style/index.js.map +0 -1
  102. package/es/auth-context/style/index.js +0 -1
  103. package/es/auth-context/style/index.js.map +0 -1
  104. package/es/development-login/style/index.js +0 -1
  105. package/es/development-login/style/index.js.map +0 -1
  106. package/es/ellipsis/style/index.js +0 -1
  107. package/es/ellipsis/style/index.js.map +0 -1
  108. package/es/empty/render-empty.js +0 -22
  109. package/es/empty/render-empty.js.map +0 -1
  110. package/es/empty/style/index.js +0 -2
  111. package/es/empty/style/index.js.map +0 -1
  112. package/es/handle/style/index.js +0 -1
  113. package/es/handle/style/index.js.map +0 -1
  114. package/es/icon-list/style/index.js +0 -1
  115. package/es/icon-list/style/index.js.map +0 -1
  116. package/es/img/style/index.js +0 -1
  117. package/es/img/style/index.js.map +0 -1
  118. package/es/loading-button/style/index.js +0 -1
  119. package/es/loading-button/style/index.js.map +0 -1
  120. package/es/page/style/index.js +0 -1
  121. package/es/page/style/index.js.map +0 -1
  122. package/es/query-form/style/index.js +0 -1
  123. package/es/query-form/style/index.js.map +0 -1
  124. package/es/query-list-scene/style/index.js +0 -1
  125. package/es/query-list-scene/style/index.js.map +0 -1
  126. package/es/render-empty/style/index.js +0 -1
  127. package/es/render-empty/style/index.js.map +0 -1
  128. package/es/table/style/index.js +0 -2
  129. package/es/table/style/index.js.map +0 -1
  130. package/es/title/style/index.js +0 -1
  131. package/es/title/style/index.js.map +0 -1
  132. package/es/tntd-icon/style/index.js +0 -1
  133. package/es/tntd-icon/style/index.js.map +0 -1
  134. package/es/tntd-layout/style/index.js +0 -1
  135. package/es/tntd-layout/style/index.js.map +0 -1
  136. package/es/tntd-modal/style/index.js +0 -1
  137. package/es/tntd-modal/style/index.js.map +0 -1
  138. package/es/tntd-select/style/index.js +0 -1
  139. package/es/tntd-select/style/index.js.map +0 -1
  140. package/lib/array-input/style/index.d.ts +0 -1
  141. package/lib/array-input/style/index.d.ts.map +0 -1
  142. package/lib/array-input/style/index.js +0 -1
  143. package/lib/array-input/style/index.js.map +0 -1
  144. package/lib/auth-context/style/index.d.ts +0 -1
  145. package/lib/auth-context/style/index.d.ts.map +0 -1
  146. package/lib/auth-context/style/index.js +0 -1
  147. package/lib/auth-context/style/index.js.map +0 -1
  148. package/lib/development-login/style/index.d.ts +0 -1
  149. package/lib/development-login/style/index.d.ts.map +0 -1
  150. package/lib/development-login/style/index.js +0 -1
  151. package/lib/development-login/style/index.js.map +0 -1
  152. package/lib/ellipsis/style/index.d.ts +0 -1
  153. package/lib/ellipsis/style/index.d.ts.map +0 -1
  154. package/lib/ellipsis/style/index.js +0 -1
  155. package/lib/ellipsis/style/index.js.map +0 -1
  156. package/lib/empty/render-empty.d.ts +0 -3
  157. package/lib/empty/render-empty.d.ts.map +0 -1
  158. package/lib/empty/render-empty.js +0 -32
  159. package/lib/empty/render-empty.js.map +0 -1
  160. package/lib/empty/style/index.d.ts +0 -3
  161. package/lib/empty/style/index.d.ts.map +0 -1
  162. package/lib/empty/style/index.js +0 -4
  163. package/lib/empty/style/index.js.map +0 -1
  164. package/lib/handle/style/index.d.ts +0 -1
  165. package/lib/handle/style/index.d.ts.map +0 -1
  166. package/lib/handle/style/index.js +0 -1
  167. package/lib/handle/style/index.js.map +0 -1
  168. package/lib/icon-list/style/index.d.ts +0 -3
  169. package/lib/icon-list/style/index.d.ts.map +0 -1
  170. package/lib/icon-list/style/index.js +0 -8
  171. package/lib/icon-list/style/index.js.map +0 -1
  172. package/lib/img/style/index.d.ts +0 -1
  173. package/lib/img/style/index.d.ts.map +0 -1
  174. package/lib/img/style/index.js +0 -1
  175. package/lib/img/style/index.js.map +0 -1
  176. package/lib/loading-button/style/index.d.ts +0 -1
  177. package/lib/loading-button/style/index.d.ts.map +0 -1
  178. package/lib/loading-button/style/index.js +0 -1
  179. package/lib/loading-button/style/index.js.map +0 -1
  180. package/lib/page/style/index.d.ts +0 -1
  181. package/lib/page/style/index.d.ts.map +0 -1
  182. package/lib/page/style/index.js +0 -1
  183. package/lib/page/style/index.js.map +0 -1
  184. package/lib/query-form/style/index.d.ts +0 -1
  185. package/lib/query-form/style/index.d.ts.map +0 -1
  186. package/lib/query-form/style/index.js +0 -1
  187. package/lib/query-form/style/index.js.map +0 -1
  188. package/lib/query-list-scene/style/index.d.ts +0 -1
  189. package/lib/query-list-scene/style/index.d.ts.map +0 -1
  190. package/lib/query-list-scene/style/index.js +0 -1
  191. package/lib/query-list-scene/style/index.js.map +0 -1
  192. package/lib/render-empty/style/index.d.ts +0 -2
  193. package/lib/render-empty/style/index.d.ts.map +0 -1
  194. package/lib/render-empty/style/index.js +0 -3
  195. package/lib/render-empty/style/index.js.map +0 -1
  196. package/lib/table/style/index.d.ts +0 -3
  197. package/lib/table/style/index.d.ts.map +0 -1
  198. package/lib/table/style/index.js +0 -4
  199. package/lib/table/style/index.js.map +0 -1
  200. package/lib/title/style/index.d.ts +0 -1
  201. package/lib/title/style/index.d.ts.map +0 -1
  202. package/lib/title/style/index.js +0 -1
  203. package/lib/title/style/index.js.map +0 -1
  204. package/lib/tntd-icon/style/index.d.ts +0 -1
  205. package/lib/tntd-icon/style/index.d.ts.map +0 -1
  206. package/lib/tntd-icon/style/index.js +0 -1
  207. package/lib/tntd-icon/style/index.js.map +0 -1
  208. package/lib/tntd-layout/style/index.d.ts +0 -1
  209. package/lib/tntd-layout/style/index.d.ts.map +0 -1
  210. package/lib/tntd-layout/style/index.js +0 -1
  211. package/lib/tntd-layout/style/index.js.map +0 -1
  212. package/lib/tntd-modal/style/index.d.ts +0 -1
  213. package/lib/tntd-modal/style/index.d.ts.map +0 -1
  214. package/lib/tntd-modal/style/index.js +0 -1
  215. package/lib/tntd-modal/style/index.js.map +0 -1
  216. package/lib/tntd-select/style/index.d.ts +0 -1
  217. package/lib/tntd-select/style/index.d.ts.map +0 -1
  218. package/lib/tntd-select/style/index.js +0 -1
  219. package/lib/tntd-select/style/index.js.map +0 -1
@@ -0,0 +1,215 @@
1
+ /**
2
+ * 将xx.xx.xx 转换为数组
3
+ * @param {*} name
4
+ * @returns
5
+ */
6
+ export const getNames = name => {
7
+ let attrs = [];
8
+ if (Array.isArray(name)) {
9
+ const [str, ...rest] = name;
10
+ attrs = str.split('.').concat(rest);
11
+ } else {
12
+ attrs = typeof name === 'string' ? name.split('.') : [];
13
+ }
14
+ return attrs;
15
+ };
16
+ /**
17
+ * 对数据进行校验
18
+ * @param {*} list
19
+ * @param {*} dataLevel
20
+ * @param {*} formData
21
+ * @returns
22
+ */
23
+ export const recursionCheck = (list, dataLevel, formData, errorList = []) => {
24
+ try {
25
+ if (Array.isArray(list)) {
26
+ list.forEach(item => {
27
+ const key = item.name;
28
+ const attrs = Object.keys(formData[key]);
29
+ attrs.forEach(attr => {
30
+ var _a;
31
+ const error = (_a = formData[item.name][attr]) === null || _a === void 0 ? void 0 : _a.checkItem();
32
+ if (error) {
33
+ errorList.push(`${[item.name + '.' + attr]}:`, error);
34
+ }
35
+ });
36
+ if (dataLevel[key]) {
37
+ recursionCheck(dataLevel[key], dataLevel, formData, errorList);
38
+ }
39
+ });
40
+ }
41
+ return errorList;
42
+ } catch (e) {
43
+ if (typeof e === 'string') {
44
+ throw e.toUpperCase();
45
+ } else if (e instanceof Error) {
46
+ throw e.message;
47
+ }
48
+ throw e;
49
+ }
50
+ };
51
+ /**
52
+ * 将数据进行排序
53
+ * @param {*} list
54
+ * @param {*} dataLevel
55
+ * @param {*} formData
56
+ * @param {*} errorList
57
+ * @returns
58
+ */
59
+ export const recursionSort = (list, dataLevel, formData) => {
60
+ try {
61
+ if (Array.isArray(list)) {
62
+ const values = list.reduce((total, item, index) => {
63
+ const attrObj = {};
64
+ const key = item.name;
65
+ const prefixs = key.split('.');
66
+ const attrs = Object.keys(formData[key]);
67
+ attrs.forEach(attr => {
68
+ var _a;
69
+ attrObj[attr] = (_a = formData[key][attr]) === null || _a === void 0 ? void 0 : _a.value;
70
+ });
71
+ let children = [];
72
+ if (dataLevel[key]) {
73
+ children = recursionSort(dataLevel[key], dataLevel, formData);
74
+ }
75
+ const len = prefixs.length - 2;
76
+ if (total[prefixs[len]]) {
77
+ total[prefixs[len]][index] = Object.assign(Object.assign({}, attrObj), children || []);
78
+ } else {
79
+ total[prefixs[len]] = [Object.assign(Object.assign({}, attrObj), children || [])];
80
+ }
81
+ return total;
82
+ }, {});
83
+ return values;
84
+ }
85
+ } catch (e) {
86
+ if (typeof e === 'string') {
87
+ console.error(e.toUpperCase());
88
+ throw e.toUpperCase();
89
+ } else if (e instanceof Error) {
90
+ console.error(e.message);
91
+ throw e.message;
92
+ }
93
+ throw e;
94
+ }
95
+ };
96
+ /**
97
+ * 获取form表单的value
98
+ * @param {*} formCurrent
99
+ * @returns
100
+ */
101
+ export const getFieldsValue = formCurrent => {
102
+ try {
103
+ const {
104
+ formData,
105
+ dataLevel
106
+ } = formCurrent;
107
+ let firstKey = '';
108
+ // 这里不直接用Object.keys的原因是Object.keys并不能保证一定是按照属性顺序
109
+ for (const i in dataLevel) {
110
+ firstKey = i;
111
+ break;
112
+ }
113
+ const recursionStart = dataLevel[firstKey];
114
+ const values = recursionSort(recursionStart, dataLevel, formData);
115
+ return values;
116
+ } catch (e) {
117
+ if (typeof e === 'string') {
118
+ console.error(e.toUpperCase());
119
+ return e.toUpperCase();
120
+ } else if (e instanceof Error) {
121
+ console.error(e.message);
122
+ return e.message;
123
+ }
124
+ return e;
125
+ }
126
+ };
127
+ /**
128
+ * 获取form表单的value
129
+ * @param {*} formCurrent
130
+ * @returns
131
+ */
132
+ export const getFieldValue = (formCurrent, field) => {
133
+ var _a, _b;
134
+ try {
135
+ const {
136
+ formData
137
+ } = formCurrent;
138
+ return formData && ((_b = (_a = formData === null || formData === void 0 ? void 0 : formData[field[0]]) === null || _a === void 0 ? void 0 : _a[field[1]]) === null || _b === void 0 ? void 0 : _b.value);
139
+ } catch (e) {
140
+ if (typeof e === 'string') {
141
+ return e.toUpperCase();
142
+ } else if (e instanceof Error) {
143
+ return e.message;
144
+ }
145
+ return e;
146
+ }
147
+ };
148
+ /**
149
+ * 提交时候校验的方法
150
+ * @param {*} formCurrent
151
+ * @returns
152
+ */
153
+ export const validateFields = formCurrent => {
154
+ return new Promise(resolve => {
155
+ const {
156
+ formData,
157
+ dataLevel
158
+ } = formCurrent;
159
+ let firstKey = '';
160
+ // 这里不直接用Object.keys的原因是Object.keys并不能保证一定是按照属性顺序
161
+ for (const i in dataLevel) {
162
+ firstKey = i;
163
+ break;
164
+ }
165
+ const recursionStart = dataLevel[firstKey];
166
+ const errorList = recursionCheck(recursionStart, dataLevel, formData);
167
+ if (Array.isArray(errorList) && errorList.length) {
168
+ console.error(JSON.stringify(errorList));
169
+ } else {
170
+ resolve(recursionSort(recursionStart, dataLevel, formData));
171
+ }
172
+ });
173
+ };
174
+ /** 获取初始化的值 */
175
+ export const getInitValue = (initialValues, names) => {
176
+ let keys;
177
+ if (Array.isArray(names)) {
178
+ const [str, ...rest] = names;
179
+ keys = str.split('.').concat(rest);
180
+ }
181
+ if (Array.isArray(keys)) {
182
+ keys.forEach(i => {
183
+ initialValues = ['', null, undefined].includes(initialValues === null || initialValues === void 0 ? void 0 : initialValues[i]) ? undefined : initialValues === null || initialValues === void 0 ? void 0 : initialValues[i];
184
+ });
185
+ }
186
+ return initialValues;
187
+ };
188
+ /** 校验表单是否正确的方法 */
189
+ export const handleCheckItem = (value, rules) => {
190
+ try {
191
+ if (Array.isArray(rules)) {
192
+ rules.forEach(i => {
193
+ // @ts-ignore
194
+ if (i.required && ['', null, undefined].includes(value)) {
195
+ throw new Error((i === null || i === void 0 ? void 0 : i.message) || 'error');
196
+ }
197
+ if (i === null || i === void 0 ? void 0 : i.validator) {
198
+ i.validator(rules, value, function (_errorMsg) {
199
+ throw new Error(_errorMsg);
200
+ });
201
+ }
202
+ });
203
+ }
204
+ return;
205
+ } catch (e) {
206
+ if (typeof e === 'string') {
207
+ return e.toUpperCase();
208
+ } else if (e instanceof Error) {
209
+ return e.message;
210
+ }
211
+ }
212
+ };
213
+ export const isValidKey = (key, object) => {
214
+ return key in object;
215
+ };
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/tntd-form/CustomForm/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import type { TinitialValueType, ValidationRule, IForm, ILevel, IFormData } from './interface';\n\n/**\n * 将xx.xx.xx 转换为数组\n * @param {*} name\n * @returns\n */\nexport const getNames = (name: string[] | string) => {\n let attrs = [];\n if (Array.isArray(name)) {\n const [str, ...rest] = name;\n attrs = str.split('.').concat(rest);\n } else {\n attrs = typeof name === 'string' ? name.split('.') : [];\n }\n return attrs;\n};\n\n/**\n * 对数据进行校验\n * @param {*} list\n * @param {*} dataLevel\n * @param {*} formData\n * @returns\n */\nexport const recursionCheck = (\n list: any,\n dataLevel: ILevel[],\n formData: IFormData,\n errorList: string[] = [],\n) => {\n try {\n if (Array.isArray(list)) {\n list.forEach((item) => {\n const key = item.name;\n const attrs = Object.keys(formData[key]);\n\n attrs.forEach((attr) => {\n const error = formData[item.name][attr]?.checkItem();\n if (error) {\n errorList.push(`${[item.name + '.' + attr]}:`, error);\n }\n });\n if (dataLevel[key]) {\n recursionCheck(dataLevel[key], dataLevel, formData, errorList);\n }\n });\n }\n return errorList;\n } catch (e) {\n if (typeof e === 'string') {\n throw e.toUpperCase();\n } else if (e instanceof Error) {\n throw e.message;\n }\n throw e;\n }\n};\n\n/**\n * 将数据进行排序\n * @param {*} list\n * @param {*} dataLevel\n * @param {*} formData\n * @param {*} errorList\n * @returns\n */\nexport const recursionSort = (list: any, dataLevel: ILevel[], formData: IFormData) => {\n try {\n if (Array.isArray(list)) {\n const values = list.reduce((total, item, index) => {\n const attrObj = {};\n const key = item.name;\n const prefixs = key.split('.');\n const attrs = Object.keys(formData[key]);\n\n attrs.forEach((attr) => {\n attrObj[attr] = formData[key][attr]?.value;\n });\n let children = [];\n if (dataLevel[key]) {\n children = recursionSort(dataLevel[key], dataLevel, formData);\n }\n\n const len = prefixs.length - 2;\n if (total[prefixs[len]]) {\n total[prefixs[len]][index] = {\n ...attrObj,\n ...(children || []),\n };\n } else {\n total[prefixs[len]] = [\n {\n ...attrObj,\n ...(children || []),\n },\n ];\n }\n return total;\n }, {});\n return values;\n }\n } catch (e) {\n if (typeof e === 'string') {\n console.error(e.toUpperCase());\n throw e.toUpperCase();\n } else if (e instanceof Error) {\n console.error(e.message);\n throw e.message;\n }\n throw e;\n }\n};\n\n/**\n * 获取form表单的value\n * @param {*} formCurrent\n * @returns\n */\nexport const getFieldsValue = (formCurrent: IForm) => {\n try {\n const { formData, dataLevel } = formCurrent;\n let firstKey = '';\n // 这里不直接用Object.keys的原因是Object.keys并不能保证一定是按照属性顺序\n for (const i in dataLevel) {\n firstKey = i;\n break;\n }\n const recursionStart = dataLevel[firstKey];\n const values = recursionSort(recursionStart, dataLevel, formData);\n return values;\n } catch (e) {\n if (typeof e === 'string') {\n console.error(e.toUpperCase());\n return e.toUpperCase();\n } else if (e instanceof Error) {\n console.error(e.message);\n return e.message;\n }\n return e;\n }\n};\n\n/**\n * 获取form表单的value\n * @param {*} formCurrent\n * @returns\n */\nexport const getFieldValue = (formCurrent: IForm, field: string[]) => {\n try {\n const { formData } = formCurrent;\n return formData && formData?.[field[0]]?.[field[1]]?.value;\n } catch (e) {\n if (typeof e === 'string') {\n return e.toUpperCase();\n } else if (e instanceof Error) {\n return e.message;\n }\n return e;\n }\n};\n\n/**\n * 提交时候校验的方法\n * @param {*} formCurrent\n * @returns\n */\nexport const validateFields = (formCurrent: IForm) => {\n return new Promise((resolve) => {\n const { formData, dataLevel } = formCurrent;\n let firstKey = '';\n // 这里不直接用Object.keys的原因是Object.keys并不能保证一定是按照属性顺序\n for (const i in dataLevel) {\n firstKey = i;\n break;\n }\n const recursionStart = dataLevel[firstKey];\n const errorList = recursionCheck(recursionStart, dataLevel, formData);\n if (Array.isArray(errorList) && errorList.length) {\n console.error(JSON.stringify(errorList));\n } else {\n resolve(recursionSort(recursionStart, dataLevel, formData));\n }\n });\n};\n\n/** 获取初始化的值 */\nexport const getInitValue = (initialValues: object | undefined, names: string[] | string) => {\n let keys;\n if (Array.isArray(names)) {\n const [str, ...rest] = names;\n keys = str.split('.').concat(rest);\n }\n\n if (Array.isArray(keys)) {\n keys.forEach((i) => {\n initialValues = ['', null, undefined].includes(initialValues?.[i])\n ? undefined\n : initialValues?.[i];\n });\n }\n\n return initialValues;\n};\n\n/** 校验表单是否正确的方法 */\nexport const handleCheckItem = (value: TinitialValueType, rules: ValidationRule) => {\n try {\n if (Array.isArray(rules)) {\n rules.forEach((i) => {\n // @ts-ignore\n if (i.required && ['', null, undefined].includes(value)) {\n throw new Error(i?.message || 'error');\n }\n if (i?.validator) {\n i.validator(rules, value, function (_errorMsg: string) {\n throw new Error(_errorMsg);\n });\n }\n });\n }\n return;\n } catch (e) {\n if (typeof e === 'string') {\n return e.toUpperCase();\n } else if (e instanceof Error) {\n return e.message;\n }\n }\n};\n\nexport const isValidKey = (\n key: string | number | symbol,\n object: object,\n): key is keyof typeof object => {\n return key in object;\n};\n"]}
@@ -0,0 +1,40 @@
1
+ /*
2
+ * @Descripttion: TntdForm.Item
3
+ * @Author: 郑泳健
4
+ * @Date: 2023-02-22 23:25:24
5
+ * @LastEditors: 郑泳健
6
+ * @LastEditTime: 2023-03-17 17:17:00
7
+ */
8
+ import React, { useContext, memo } from 'react';
9
+ import ItemComp from './ItemComp';
10
+ import { FormContext } from '../store';
11
+ const Item = ({
12
+ name,
13
+ children,
14
+ style,
15
+ rules,
16
+ shouldUpdate,
17
+ initialValue,
18
+ dependencies
19
+ }) => {
20
+ const {
21
+ form,
22
+ initialValues,
23
+ currentChangeKeys,
24
+ setCurrentChangeKeys
25
+ } = useContext(FormContext);
26
+ return React.createElement(ItemComp, Object.assign({}, {
27
+ style,
28
+ rules,
29
+ name,
30
+ children,
31
+ form,
32
+ currentChangeKeys,
33
+ setCurrentChangeKeys,
34
+ initialValues,
35
+ initialValue,
36
+ shouldUpdate,
37
+ dependencies
38
+ }));
39
+ };
40
+ export default memo(Item);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Item.js","sourceRoot":"","sources":["../../../../src/tntd-form/TntdForm/components/Item.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,OAAO,CAAA;AAC/C,OAAO,QAAQ,MAAM,YAAY,CAAA;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAA;AAGtC,MAAM,IAAI,GAAwB,CAAC,EACjC,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,KAAK,EACL,YAAY,EACZ,YAAY,EACZ,YAAY,GACb,EAAE,EAAE;IACH,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,GACpE,UAAU,CAAe,WAAW,CAAC,CAAA;IAEvC,OAAO,CACL,oBAAC,QAAQ,oBACH;QACF,KAAK;QACL,KAAK;QACL,IAAI;QACJ,QAAQ;QACR,IAAI;QACJ,iBAAiB;QACjB,oBAAoB;QACpB,aAAa;QACb,YAAY;QACZ,YAAY;QACZ,YAAY;KACb,EACD,CACH,CAAA;AACH,CAAC,CAAA;AAED,eAAe,IAAI,CAAC,IAAI,CAAC,CAAA","sourcesContent":["/*\n * @Descripttion: TntdForm.Item\n * @Author: 郑泳健\n * @Date: 2023-02-22 23:25:24\n * @LastEditors: 郑泳健\n * @LastEditTime: 2023-03-17 17:17:00\n */\n\nimport React, { useContext, memo } from 'react'\nimport ItemComp from './ItemComp'\nimport { FormContext } from '../store'\nimport type { IFormItem, IFormContext } from '../interface'\n\nconst Item: React.FC<IFormItem> = ({\n name,\n children,\n style,\n rules,\n shouldUpdate,\n initialValue,\n dependencies,\n}) => {\n const { form, initialValues, currentChangeKeys, setCurrentChangeKeys } =\n useContext<IFormContext>(FormContext)\n\n return (\n <ItemComp\n {...{\n style,\n rules,\n name,\n children,\n form,\n currentChangeKeys,\n setCurrentChangeKeys,\n initialValues,\n initialValue,\n shouldUpdate,\n dependencies,\n }}\n />\n )\n}\n\nexport default memo(Item)\n"]}
@@ -0,0 +1,149 @@
1
+ import _isEqual from "lodash/isEqual";
2
+ /*
3
+ * @Descripttion: TntdForm.Item进行性能优化
4
+ * @Author: 郑泳健
5
+ * @Date: 2023-02-23 12:47:28
6
+ * @LastEditors: 郑泳健
7
+ * @LastEditTime: 2023-03-17 18:27:03
8
+ */
9
+ import React, { useState, memo, useEffect } from 'react';
10
+ import { getNames, handleCheckItem, getInitValue } from '../utils';
11
+ const ItemComp = ({
12
+ form,
13
+ name,
14
+ children,
15
+ style,
16
+ initialValues,
17
+ initialValue,
18
+ rules,
19
+ setCurrentChangeKeys
20
+ }) => {
21
+ const [value, setValue] = useState(undefined);
22
+ const [errorMsg, setErrorMsg] = useState(undefined);
23
+ /**
24
+ * 动态修改form内部的值,为啥不在useEffect里面处理的原因是子组件的useEffect会比父组件useEffect先执行,需要保证在子组件useEffect监听value变化的时候获取到的formData永远是最新的
25
+ * @param name
26
+ * @param value
27
+ * @returns
28
+ */
29
+ const generateFormData = (name, value) => {
30
+ if (!name || !form) return;
31
+ const [str, ...rest] = name;
32
+ rest.forEach(i => {
33
+ if (form.formData[str]) {
34
+ form.formData[str][i].value = value;
35
+ form.formData[str][i].checkItem = () => {
36
+ const error = handleCheckItem(value, rules);
37
+ setErrorMsg(error);
38
+ return error;
39
+ };
40
+ } else {
41
+ form.formData[str] = {
42
+ [i]: {
43
+ value,
44
+ checkItem: () => {
45
+ const error = handleCheckItem(value, rules);
46
+ setErrorMsg(error);
47
+ return error;
48
+ },
49
+ setItemValue: () => {},
50
+ errorMsg: undefined
51
+ }
52
+ };
53
+ }
54
+ });
55
+ };
56
+ // 为了给最外层提供方法去校验,比如保存的时候.
57
+ // 这里依赖不要添加value,因为子组件的useEffect会比父组件useEffect先执行,如果添加了依赖value会导致子组件获取到的formData永远是上一次的
58
+ useEffect(() => {
59
+ if (!name || !form) return;
60
+ const [str, ...rest] = name;
61
+ const addItem = {
62
+ setItemValue: (_val, callback) => {
63
+ const error = handleCheckItem(_val, rules);
64
+ setValue(_val);
65
+ setErrorMsg(error);
66
+ callback === null || callback === void 0 ? void 0 : callback();
67
+ },
68
+ checkItem: () => {
69
+ const error = handleCheckItem(value, rules);
70
+ setErrorMsg(error);
71
+ return error;
72
+ },
73
+ value,
74
+ errorMsg
75
+ };
76
+ rest.forEach(i => {
77
+ if (form.formData[str]) {
78
+ form.formData[str][i] = addItem;
79
+ } else {
80
+ form.formData[str] = {
81
+ [i]: addItem
82
+ };
83
+ }
84
+ });
85
+ }, [rules, name, errorMsg, form]);
86
+ /** 这段代码不能删除,当增加/删除列的时候有些默认值需要更新 */
87
+ useEffect(() => {
88
+ if (initialValue) {
89
+ setValue(initialValue);
90
+ generateFormData(name, initialValue);
91
+ }
92
+ }, [initialValue]);
93
+ // 初始化设置默认值,
94
+ useEffect(() => {
95
+ var _a;
96
+ const initValue = getInitValue(initialValues, name);
97
+ // @ts-ignore
98
+ const _value = ['', null, undefined].includes(initValue) ? initialValue : initValue;
99
+ setValue(_value);
100
+ generateFormData(name, _value);
101
+ if (name) {
102
+ setCurrentChangeKeys([(_a = getNames(name)) === null || _a === void 0 ? void 0 : _a.join('.')]);
103
+ }
104
+ }, []);
105
+ // 默认方法
106
+ const handleChange = e => {
107
+ var _a, _b;
108
+ let val;
109
+ if (typeof e === 'object') {
110
+ val = (_a = e === null || e === void 0 ? void 0 : e.target) === null || _a === void 0 ? void 0 : _a.value;
111
+ } else {
112
+ val = e;
113
+ }
114
+ setValue(val);
115
+ generateFormData(name, val);
116
+ const error = handleCheckItem(val, rules);
117
+ setErrorMsg(error);
118
+ if (name) {
119
+ setCurrentChangeKeys([(_b = getNames(name)) === null || _b === void 0 ? void 0 : _b.join('.')]);
120
+ }
121
+ };
122
+ return React.createElement("div", {
123
+ className: errorMsg ? 'has-error custom-form-item-wrapper' : 'custom-form-item-wrapper',
124
+ style: style
125
+ }, React.Children.map(children, child => {
126
+ var _a;
127
+ if (React.isValidElement(child)) {
128
+ return React.cloneElement(child, Object.assign({
129
+ value,
130
+ form,
131
+ onChange: handleChange,
132
+ 'data-key': (_a = getNames(name)) === null || _a === void 0 ? void 0 : _a.join('.')
133
+ }, child.props));
134
+ }
135
+ return null;
136
+ }), errorMsg && React.createElement("div", {
137
+ className: "ant-form-explain ant-form-item-explain-error"
138
+ }, errorMsg));
139
+ };
140
+ function arePropsEqual(prevProps, nextProps) {
141
+ if (Array.isArray(nextProps.currentChangeKeys) && nextProps.currentChangeKeys.length && _isEqual(prevProps.initialValues, nextProps.initialValues) && !nextProps.currentChangeKeys.includes(getNames(nextProps.name).join('.')) && !nextProps.shouldUpdate && Array.isArray(nextProps.dependencies) && nextProps.dependencies.every(i => {
142
+ var _a;
143
+ return !((_a = nextProps.currentChangeKeys) === null || _a === void 0 ? void 0 : _a.includes(getNames(i).join('.')));
144
+ })) {
145
+ return true;
146
+ }
147
+ return false;
148
+ }
149
+ export default memo(ItemComp, arePropsEqual);
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ItemComp.js","sourceRoot":"","sources":["../../../../src/tntd-form/TntdForm/components/ItemComp.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * @Descripttion: TntdForm.Item进行性能优化\n * @Author: 郑泳健\n * @Date: 2023-02-23 12:47:28\n * @LastEditors: 郑泳健\n * @LastEditTime: 2023-03-17 18:27:03\n */\n\nimport React, { useState, memo, useEffect } from 'react'\nimport { isEqual } from 'lodash'\nimport { getNames, handleCheckItem, getInitValue } from '../utils'\nimport type { IFormItem, IFormItemData, TinitialValueType } from '../interface'\n\nconst ItemComp: React.FC<IFormItem> = ({\n form,\n name,\n children,\n style,\n initialValues,\n initialValue,\n rules,\n setCurrentChangeKeys,\n}) => {\n const [value, setValue] = useState<TinitialValueType>(undefined)\n const [errorMsg, setErrorMsg] = useState<string | undefined>(undefined)\n\n /**\n * 动态修改form内部的值,为啥不在useEffect里面处理的原因是子组件的useEffect会比父组件useEffect先执行,需要保证在子组件useEffect监听value变化的时候获取到的formData永远是最新的\n * @param name\n * @param value\n * @returns\n */\n const generateFormData = (name: string[] | string, value: TinitialValueType) => {\n if (!name || !form) return\n const [str, ...rest] = name\n\n rest.forEach((i) => {\n if (form.formData[str]) {\n form.formData[str][i].value = value\n form.formData[str][i].checkItem = () => {\n const error = handleCheckItem(value, rules)\n setErrorMsg(error)\n return error\n }\n } else {\n form.formData[str] = {\n [i]: {\n value,\n checkItem: () => {\n const error = handleCheckItem(value, rules)\n setErrorMsg(error)\n return error\n },\n setItemValue: () => {},\n errorMsg: undefined,\n },\n }\n }\n })\n }\n\n // 为了给最外层提供方法去校验,比如保存的时候.\n // 这里依赖不要添加value,因为子组件的useEffect会比父组件useEffect先执行,如果添加了依赖value会导致子组件获取到的formData永远是上一次的\n useEffect(() => {\n if (!name || !form) return\n const [str, ...rest] = name\n\n const addItem: IFormItemData = {\n setItemValue: (_val, callback) => {\n const error = handleCheckItem(_val, rules)\n setValue(_val)\n setErrorMsg(error)\n callback?.()\n },\n checkItem: () => {\n const error = handleCheckItem(value, rules)\n setErrorMsg(error)\n return error\n },\n value,\n errorMsg,\n }\n rest.forEach((i) => {\n if (form.formData[str]) {\n form.formData[str][i] = addItem\n } else {\n form.formData[str] = {\n [i]: addItem,\n }\n }\n })\n }, [rules, name, errorMsg, form])\n\n /** 这段代码不能删除,当增加/删除列的时候有些默认值需要更新 */\n useEffect(() => {\n if (initialValue) {\n setValue(initialValue)\n generateFormData(name, initialValue)\n }\n }, [initialValue])\n\n // 初始化设置默认值,\n useEffect(() => {\n const initValue = getInitValue(initialValues, name)\n // @ts-ignore\n const _value = ['', null, undefined].includes(initValue) ? initialValue : initValue\n\n setValue(_value)\n generateFormData(name, _value)\n if (name) {\n setCurrentChangeKeys([getNames(name)?.join('.')])\n }\n }, [])\n\n // 默认方法\n const handleChange = (\n e:\n | React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>\n | string\n | number\n | undefined\n ) => {\n let val\n if (typeof e === 'object') {\n val = (e as React.ChangeEvent<HTMLInputElement | HTMLTextAreaElement | HTMLSelectElement>)\n ?.target?.value\n } else {\n val = e\n }\n setValue(val)\n generateFormData(name, val)\n const error = handleCheckItem(val, rules)\n setErrorMsg(error)\n if (name) {\n setCurrentChangeKeys([getNames(name)?.join('.')])\n }\n }\n\n return (\n <div\n className={errorMsg ? 'has-error custom-form-item-wrapper' : 'custom-form-item-wrapper'}\n style={style}\n >\n {React.Children.map(children, (child) => {\n if (React.isValidElement(child)) {\n return React.cloneElement(child, {\n value,\n form,\n onChange: handleChange,\n 'data-key': getNames(name)?.join('.'),\n ...child.props,\n })\n }\n return null\n })}\n {errorMsg && <div className=\"ant-form-explain ant-form-item-explain-error\">{errorMsg}</div>}\n </div>\n )\n}\n\nfunction arePropsEqual(prevProps: IFormItem, nextProps: IFormItem) {\n if (\n Array.isArray(nextProps.currentChangeKeys) &&\n nextProps.currentChangeKeys.length &&\n isEqual(prevProps.initialValues, nextProps.initialValues) &&\n !nextProps.currentChangeKeys.includes(getNames(nextProps.name).join('.')) &&\n !nextProps.shouldUpdate &&\n Array.isArray(nextProps.dependencies) &&\n nextProps.dependencies.every(\n (i) => !nextProps.currentChangeKeys?.includes(getNames(i).join('.'))\n )\n ) {\n return true\n }\n return false\n}\n\nexport default memo(ItemComp, arePropsEqual)\n"]}
@@ -0,0 +1,75 @@
1
+ import _isEqual from "lodash/isEqual";
2
+ import _cloneDeep from "lodash/cloneDeep";
3
+ /*
4
+ * @Descripttion: FormList
5
+ * @Author: 郑泳健
6
+ * @Date: 2023-03-06 18:42:08
7
+ * @LastEditors: 郑泳健
8
+ * @LastEditTime: 2023-03-17 18:47:05
9
+ */
10
+ import React, { useState, useEffect, useRef, useContext, memo } from 'react';
11
+ import { getNames } from '../utils';
12
+ import { FormContext } from '../store';
13
+ const List = ({
14
+ name,
15
+ children
16
+ }) => {
17
+ const maxRef = useRef(-1);
18
+ const {
19
+ form,
20
+ initialValues
21
+ } = useContext(FormContext);
22
+ const [dataLevel, setDataLevel] = useState([]);
23
+ useEffect(() => {
24
+ const key = Array.isArray(name) ? name === null || name === void 0 ? void 0 : name[0] : name;
25
+ if (form && form.dataLevel) {
26
+ form.dataLevel[key] = dataLevel;
27
+ }
28
+ }, [form, dataLevel, name]);
29
+ /** 根据默认数值自动生成dataLevel */
30
+ useEffect(() => {
31
+ let dataSource = initialValues;
32
+ const attrs = getNames(name);
33
+ for (const key of attrs) {
34
+ dataSource = (dataSource === null || dataSource === void 0 ? void 0 : dataSource[key]) || [{}];
35
+ }
36
+ if (Array.isArray(dataSource)) {
37
+ const _level = dataSource.map((i, index) => {
38
+ return {
39
+ key: index,
40
+ name: `${attrs.join('.')}.${index}`
41
+ };
42
+ });
43
+ setDataLevel(_level);
44
+ maxRef.current = dataSource.length - 1;
45
+ }
46
+ }, [initialValues, name]);
47
+ /** 新增一列 */
48
+ const handleAdd = index => {
49
+ const tempDataLevel = _cloneDeep(dataLevel);
50
+ maxRef.current++;
51
+ const attrs = getNames(name);
52
+ tempDataLevel.splice(index + 1, 0, {
53
+ key: maxRef.current,
54
+ name: `${attrs === null || attrs === void 0 ? void 0 : attrs.join('.')}.${maxRef.current}`
55
+ });
56
+ setDataLevel(tempDataLevel);
57
+ };
58
+ /** 删除一列 */
59
+ const handleDel = index => {
60
+ const temp = _cloneDeep(dataLevel);
61
+ temp.splice(index, 1);
62
+ setDataLevel(temp);
63
+ };
64
+ return React.createElement(React.Fragment, null, children === null || children === void 0 ? void 0 : children(dataLevel, {
65
+ add: handleAdd,
66
+ remove: handleDel
67
+ }));
68
+ };
69
+ // name 没有改变就不需要重复render
70
+ export default memo(List, (nextProps, prevProps) => {
71
+ if (_isEqual(nextProps.name, prevProps.name) && !!prevProps.name) {
72
+ return true;
73
+ }
74
+ return false;
75
+ });
@@ -0,0 +1 @@
1
+ {"version":3,"file":"List.js","sourceRoot":"","sources":["../../../../src/tntd-form/TntdForm/components/List.tsx"],"names":[],"mappings":"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","sourcesContent":["/*\n * @Descripttion: FormList\n * @Author: 郑泳健\n * @Date: 2023-03-06 18:42:08\n * @LastEditors: 郑泳健\n * @LastEditTime: 2023-03-17 18:47:05\n */\n\nimport React, { useState, useEffect, useRef, useContext, memo } from 'react'\nimport { cloneDeep, isEqual } from 'lodash'\nimport { getNames } from '../utils'\nimport { FormContext } from '../store'\nimport type { IFormListProps, IFormContext, ILevel, TAddOrRemove, IObject } from '../interface'\n\nconst List: React.FC<IFormListProps> = ({ name, children }) => {\n const maxRef = useRef(-1)\n const { form, initialValues } = useContext<IFormContext>(FormContext)\n const [dataLevel, setDataLevel] = useState<ILevel[]>([])\n\n useEffect(() => {\n const key: string = Array.isArray(name) ? name?.[0] : name\n if (form && form.dataLevel) {\n form.dataLevel[key] = dataLevel\n }\n }, [form, dataLevel, name])\n\n /** 根据默认数值自动生成dataLevel */\n useEffect(() => {\n let dataSource = initialValues\n const attrs = getNames(name)\n\n for (const key of attrs) {\n dataSource = dataSource?.[key] || [{}]\n }\n\n if (Array.isArray(dataSource)) {\n const _level = dataSource.map((i, index) => {\n return {\n key: index,\n name: `${attrs.join('.')}.${index}`,\n }\n })\n setDataLevel(_level)\n maxRef.current = dataSource.length - 1\n }\n }, [initialValues, name])\n\n /** 新增一列 */\n const handleAdd: TAddOrRemove = (index) => {\n const tempDataLevel = cloneDeep(dataLevel)\n maxRef.current++\n const attrs = getNames(name)\n tempDataLevel.splice(index + 1, 0, {\n key: maxRef.current,\n name: `${attrs?.join('.')}.${maxRef.current}`,\n })\n setDataLevel(tempDataLevel)\n }\n\n /** 删除一列 */\n const handleDel: TAddOrRemove = (index) => {\n const temp = cloneDeep(dataLevel)\n temp.splice(index, 1)\n setDataLevel(temp)\n }\n\n return <>{children?.(dataLevel, { add: handleAdd, remove: handleDel })}</>\n}\n\n// name 没有改变就不需要重复render\nexport default memo(List, (nextProps, prevProps) => {\n if (isEqual(nextProps.name, prevProps.name) && !!prevProps.name) {\n return true\n }\n return false\n})\n"]}
@@ -0,0 +1,52 @@
1
+ /*
2
+ * @Descripttion: 高性能动态增删form表单
3
+ * @Author: 郑泳健
4
+ * @Date: 2023-02-16 10:43:03
5
+ * @LastEditors: 郑泳健
6
+ * @LastEditTime: 2023-03-20 10:27:35
7
+ */
8
+ import React, { useState, useRef } from 'react';
9
+ import { validateFields, getFieldsValue, getFieldValue } from './utils';
10
+ import { FormContext } from './store';
11
+ import List from './components/List';
12
+ import Item from './components/Item';
13
+ const TntdForm = ({
14
+ form,
15
+ initialValues,
16
+ children
17
+ }) => {
18
+ // 这个是为了获取当前是哪一个单元格在输入
19
+ const [currentChangeKeys, setCurrentChangeKeys] = useState([]);
20
+ return React.createElement(FormContext.Provider, {
21
+ value: {
22
+ form,
23
+ initialValues,
24
+ currentChangeKeys,
25
+ setCurrentChangeKeys
26
+ }
27
+ }, children);
28
+ };
29
+ TntdForm.useForm = () => {
30
+ const form = useRef({
31
+ dataLevel: {},
32
+ formData: {},
33
+ validateFields: () => validateFields(form.current),
34
+ getFieldsValue: () => getFieldsValue(form.current),
35
+ getFieldValue: field => getFieldValue(form.current, field),
36
+ setFieldsValue: obj => {
37
+ for (const i in obj) {
38
+ if (Object.prototype.hasOwnProperty.call(obj, i)) {
39
+ const prefix = (i === null || i === void 0 ? void 0 : i.split('.')) || [];
40
+ const attr = prefix.pop();
41
+ if (attr && form.current.formData[prefix.join('.')][attr]) {
42
+ form.current.formData[prefix.join('.')][attr].setItemValue(obj[i]);
43
+ }
44
+ }
45
+ }
46
+ }
47
+ });
48
+ return [form.current];
49
+ };
50
+ TntdForm.List = List;
51
+ TntdForm.Item = Item;
52
+ export default TntdForm;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tntd-form/TntdForm/index.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,OAAO,CAAA;AAC/C,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAA;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAA;AAErC,OAAO,IAAI,MAAM,mBAAmB,CAAA;AACpC,OAAO,IAAI,MAAM,mBAAmB,CAAA;AAEpC,MAAM,QAAQ,GAAG,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAkB,EAAE,EAAE;IACrE,sBAAsB;IACtB,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CAAW,EAAE,CAAC,CAAA;IAExE,OAAO,CACL,oBAAC,WAAW,CAAC,QAAQ,IACnB,KAAK,EAAE;YACL,IAAI;YACJ,aAAa;YACb,iBAAiB;YACjB,oBAAoB;SACrB,IAEA,QAAQ,CACY,CACxB,CAAA;AACH,CAAC,CAAA;AAED,QAAQ,CAAC,OAAO,GAAG,GAAG,EAAE;IACtB,MAAM,IAAI,GAAuB,MAAM,CAAQ;QAC7C,SAAS,EAAE,EAAE;QACb,QAAQ,EAAE,EAAE;QACZ,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAClD,cAAc,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;QAClD,aAAa,EAAE,CAAC,KAAoB,EAAE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC;QAC3E,cAAc,EAAE,CAAC,GAA+B,EAAE,EAAE;YAClD,KAAK,MAAM,CAAC,IAAI,GAAG,EAAE;gBACnB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE;oBAChD,MAAM,MAAM,GAAG,CAAA,CAAC,aAAD,CAAC,uBAAD,CAAC,CAAE,KAAK,CAAC,GAAG,CAAC,KAAI,EAAE,CAAA;oBAClC,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,EAAE,CAAA;oBACzB,IAAI,IAAI,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE;wBACzD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;qBACnE;iBACF;aACF;QACH,CAAC;KACF,CAAC,CAAA;IAEF,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;AACvB,CAAC,CAAA;AAED,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAA;AACpB,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAA;AAEpB,eAAe,QAAQ,CAAA","sourcesContent":["/*\n * @Descripttion: 高性能动态增删form表单\n * @Author: 郑泳健\n * @Date: 2023-02-16 10:43:03\n * @LastEditors: 郑泳健\n * @LastEditTime: 2023-03-20 10:27:35\n */\nimport React, { useState, useRef } from 'react'\nimport { validateFields, getFieldsValue, getFieldValue } from './utils'\nimport { FormContext } from './store'\nimport type { IForm, ITntdFormProps, IObject, TinitialValueType } from './interface'\nimport List from './components/List'\nimport Item from './components/Item'\n\nconst TntdForm = ({ form, initialValues, children }: ITntdFormProps) => {\n // 这个是为了获取当前是哪一个单元格在输入\n const [currentChangeKeys, setCurrentChangeKeys] = useState<string[]>([])\n\n return (\n <FormContext.Provider\n value={{\n form,\n initialValues,\n currentChangeKeys,\n setCurrentChangeKeys,\n }}\n >\n {children}\n </FormContext.Provider>\n )\n}\n\nTntdForm.useForm = () => {\n const form: { current: IForm } = useRef<IForm>({\n dataLevel: {},\n formData: {},\n validateFields: () => validateFields(form.current),\n getFieldsValue: () => getFieldsValue(form.current),\n getFieldValue: (field: Array<string>) => getFieldValue(form.current, field),\n setFieldsValue: (obj: IObject<TinitialValueType>) => {\n for (const i in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, i)) {\n const prefix = i?.split('.') || []\n const attr = prefix.pop()\n if (attr && form.current.formData[prefix.join('.')][attr]) {\n form.current.formData[prefix.join('.')][attr].setItemValue(obj[i])\n }\n }\n }\n },\n })\n\n return [form.current]\n}\n\nTntdForm.List = List\nTntdForm.Item = Item\n\nexport default TntdForm\n"]}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"interface.js","sourceRoot":"","sources":["../../../src/tntd-form/TntdForm/interface.ts"],"names":[],"mappings":"","sourcesContent":["/**\n * 层级\n */\nexport interface ILevel {\n key?: number\n name?: string\n}\n\nexport interface IObject<T> {\n [key: string]: T\n}\n\nexport type TinitialValueType = null | undefined | string | number | boolean\n\n/**\n * 每一个单元格的信息\n */\nexport interface IFormItemData {\n /** 每个formItem的值 */\n value: TinitialValueType\n /** 每个formItem的错误信息 */\n errorMsg: string | undefined\n /** 每个formItem的校验方法, 返回值为该formItem的错误信息,同时会在formItem下面显示错误信息 */\n checkItem: () => string | undefined\n /** 给某个formItem设置值 */\n setItemValue: (value: TinitialValueType, callback?: () => void) => void\n}\n\nexport interface IForm {\n /** 记录每一层级的顺序 */\n dataLevel: IObject<ILevel[]>\n /** 整个form的数据,{content.0: { id: IFormItemData, value: IFormItemData }} */\n formData: IFormData\n /** 先校验,并将结果返回 */\n validateFields: () => Promise<any>\n /** 获取form表单的数据 */\n getFieldsValue: () => object\n /** 获取formItem的数据 */\n getFieldValue: (field: Array<string>) => any\n /** 给某些formItem设置数据 */\n setFieldsValue: (fileds: IObject<TinitialValueType>) => void\n}\n\n/**\n * TntdForm的props\n */\nexport interface ITntdFormProps {\n form: IForm\n initialValues: object\n children: React.ReactNode\n}\n\nexport interface IFormContext {\n form?: IForm\n initialValues?: IObject<any>\n currentChangeKeys?: Array<string>\n setCurrentChangeKeys: React.Dispatch<React.SetStateAction<Array<string>>>\n}\n\n/** formList的props */\nexport interface IFormListProps {\n name: string[] | string\n children: (\n dataLevel: ILevel[],\n { add, remove }: { add: TAddOrRemove; remove: TAddOrRemove }\n ) => void\n}\n\n/** 增删事件 */\nexport type TAddOrRemove = (index: number) => void\n\nexport type IFormItem = {\n name: string[] | string\n children: React.ReactChild | React.ReactChild[]\n style: React.CSSProperties\n rules: ValidationRule\n shouldUpdate: boolean\n initialValue: TinitialValueType\n dependencies?: Array<string[] | string>\n} & CustomRequired<IFormContext, 'setCurrentChangeKeys'>\n\n/** 将某个不可选属性变成必选 */\ntype CustomRequired<T, K extends keyof T> = {\n [P in K]-?: T[P]\n} & Omit<T, K>\n\nexport interface ValidationRule {\n /** validation error message */\n message?: React.ReactNode\n /** indicates whether field is required */\n required?: boolean\n /** custom validate function (Note: callback must be called) */\n validator?: (rule: any, value: any, callback: any) => any\n}\n\nexport interface IFormData {\n [name: string]: {\n [attr: string]: IFormItemData\n }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ import React from 'react';
2
+ export const FormContext = React.createContext({});
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../../src/tntd-form/TntdForm/store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAe,EAAkB,CAAC,CAAA","sourcesContent":["import React from 'react'\nimport type { IFormContext } from './interface'\n\nexport const FormContext = React.createContext<IFormContext>({} as IFormContext)\n"]}