vxe-pc-ui 4.14.4 → 4.14.6

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 (480) hide show
  1. package/LICENSE +21 -21
  2. package/README.en.md +72 -72
  3. package/README.ja-JP.md +72 -72
  4. package/README.md +364 -364
  5. package/README.zh-TW.md +73 -73
  6. package/es/tree/src/tree.js +31 -2
  7. package/es/tree-select/src/tree-select.js +2 -0
  8. package/es/ui/index.js +1 -1
  9. package/es/ui/src/log.js +1 -1
  10. package/lib/index.umd.js +2359 -2257
  11. package/lib/index.umd.min.js +1 -1
  12. package/lib/tree/src/tree.js +27 -2
  13. package/lib/tree/src/tree.min.js +1 -1
  14. package/lib/tree-select/src/tree-select.js +2 -0
  15. package/lib/tree-select/src/tree-select.min.js +1 -1
  16. package/lib/ui/index.js +1 -1
  17. package/lib/ui/index.min.js +1 -1
  18. package/lib/ui/src/log.js +1 -1
  19. package/lib/ui/src/log.min.js +1 -1
  20. package/package.json +88 -88
  21. package/packages/alert/index.ts +16 -16
  22. package/packages/alert/src/alert.ts +124 -124
  23. package/packages/anchor/index.ts +16 -16
  24. package/packages/anchor/src/anchor-link.ts +121 -121
  25. package/packages/anchor/src/anchor.ts +237 -237
  26. package/packages/anchor/src/util.ts +23 -23
  27. package/packages/anchor-link/index.ts +16 -16
  28. package/packages/avatar/index.ts +16 -16
  29. package/packages/avatar/src/avatar.ts +149 -149
  30. package/packages/backtop/index.ts +16 -16
  31. package/packages/backtop/src/backtop.ts +314 -314
  32. package/packages/badge/index.ts +16 -16
  33. package/packages/badge/src/badge.ts +100 -100
  34. package/packages/breadcrumb/index.ts +16 -16
  35. package/packages/breadcrumb/src/breadcrumb-item.ts +106 -106
  36. package/packages/breadcrumb/src/breadcrumb.ts +92 -92
  37. package/packages/breadcrumb-item/index.ts +16 -16
  38. package/packages/button/index.ts +16 -16
  39. package/packages/button/src/button-group.ts +110 -110
  40. package/packages/button/src/button.ts +841 -841
  41. package/packages/button-group/index.ts +16 -16
  42. package/packages/calendar/index.ts +16 -16
  43. package/packages/calendar/src/calendar.ts +1351 -1351
  44. package/packages/card/index.ts +16 -16
  45. package/packages/card/src/card.ts +175 -175
  46. package/packages/carousel/index.ts +16 -16
  47. package/packages/carousel/src/carousel-item.ts +102 -102
  48. package/packages/carousel/src/carousel.ts +414 -414
  49. package/packages/carousel/src/util.ts +21 -21
  50. package/packages/carousel-item/index.ts +16 -16
  51. package/packages/cascader/index.ts +16 -16
  52. package/packages/cascader/src/cascader.ts +741 -741
  53. package/packages/checkbox/index.ts +16 -16
  54. package/packages/checkbox/src/button.ts +144 -144
  55. package/packages/checkbox/src/checkbox.ts +154 -154
  56. package/packages/checkbox/src/group.ts +222 -222
  57. package/packages/checkbox-button/index.ts +16 -16
  58. package/packages/checkbox-group/index.ts +16 -16
  59. package/packages/col/index.ts +16 -16
  60. package/packages/collapse/index.ts +16 -16
  61. package/packages/collapse/src/collapse-pane.ts +114 -114
  62. package/packages/collapse/src/collapse.ts +284 -284
  63. package/packages/collapse/src/util.ts +21 -21
  64. package/packages/collapse-pane/index.ts +16 -16
  65. package/packages/color-picker/index.ts +16 -16
  66. package/packages/color-picker/src/color-picker.ts +1109 -1109
  67. package/packages/color-picker/src/util.ts +198 -198
  68. package/packages/components.ts +307 -307
  69. package/packages/context-menu/index.ts +54 -54
  70. package/packages/context-menu/src/context-menu.ts +681 -681
  71. package/packages/countdown/index.ts +16 -16
  72. package/packages/countdown/src/countdown.ts +262 -262
  73. package/packages/date-panel/index.ts +16 -16
  74. package/packages/date-panel/src/date-panel.ts +1809 -1809
  75. package/packages/date-panel/src/util.ts +244 -244
  76. package/packages/date-picker/index.ts +16 -16
  77. package/packages/date-picker/src/date-picker.ts +1071 -1071
  78. package/packages/date-range-picker/index.ts +16 -16
  79. package/packages/date-range-picker/src/date-range-picker.ts +1280 -1280
  80. package/packages/drawer/index.ts +77 -77
  81. package/packages/drawer/src/drawer.ts +657 -657
  82. package/packages/dynamics/index.ts +89 -89
  83. package/packages/empty/index.ts +16 -16
  84. package/packages/empty/src/empty.ts +100 -100
  85. package/packages/form/index.ts +16 -16
  86. package/packages/form/render/index.ts +598 -598
  87. package/packages/form/src/form-config-item.ts +72 -72
  88. package/packages/form/src/form-group.ts +86 -86
  89. package/packages/form/src/form-item.ts +174 -174
  90. package/packages/form/src/form.ts +987 -987
  91. package/packages/form/src/itemInfo.ts +80 -80
  92. package/packages/form/src/render.ts +387 -387
  93. package/packages/form/src/util.ts +93 -93
  94. package/packages/form-gather/index.ts +26 -26
  95. package/packages/form-group/index.ts +16 -16
  96. package/packages/form-item/index.ts +16 -16
  97. package/packages/icon/index.ts +16 -16
  98. package/packages/icon/src/icon.ts +75 -75
  99. package/packages/icon-picker/index.ts +16 -16
  100. package/packages/icon-picker/src/icon-picker.ts +626 -626
  101. package/packages/image/index.ts +16 -16
  102. package/packages/image/src/group.ts +153 -153
  103. package/packages/image/src/image.ts +298 -298
  104. package/packages/image/src/preview.ts +672 -672
  105. package/packages/image/src/util.ts +59 -59
  106. package/packages/image-group/index.ts +16 -16
  107. package/packages/image-preview/index.ts +19 -19
  108. package/packages/index.ts +4 -4
  109. package/packages/input/index.ts +16 -16
  110. package/packages/input/src/input.ts +2788 -2788
  111. package/packages/language/ar-EG.ts +840 -840
  112. package/packages/language/de-DE.ts +840 -840
  113. package/packages/language/en-US.ts +840 -840
  114. package/packages/language/es-ES.ts +840 -840
  115. package/packages/language/fr-FR.ts +840 -840
  116. package/packages/language/hu-HU.ts +840 -840
  117. package/packages/language/hy-AM.ts +840 -840
  118. package/packages/language/id-ID.ts +840 -840
  119. package/packages/language/it-IT.ts +840 -840
  120. package/packages/language/ja-JP.ts +840 -840
  121. package/packages/language/ko-KR.ts +840 -840
  122. package/packages/language/ms-MY.ts +840 -840
  123. package/packages/language/nb-NO.ts +840 -840
  124. package/packages/language/pt-BR.ts +840 -840
  125. package/packages/language/ru-RU.ts +840 -840
  126. package/packages/language/th-TH.ts +840 -840
  127. package/packages/language/ug-CN.ts +840 -840
  128. package/packages/language/uk-UA.ts +840 -840
  129. package/packages/language/uz-UZ.ts +840 -840
  130. package/packages/language/vi-VN.ts +840 -840
  131. package/packages/language/zh-CHT.ts +840 -840
  132. package/packages/language/zh-CN.ts +840 -840
  133. package/packages/language/zh-HK.ts +3 -3
  134. package/packages/language/zh-MO.ts +3 -3
  135. package/packages/language/zh-TC.ts +3 -3
  136. package/packages/language/zh-TW.ts +3 -3
  137. package/packages/layout-aside/index.ts +16 -16
  138. package/packages/layout-aside/src/layout-aside.ts +123 -123
  139. package/packages/layout-body/index.ts +16 -16
  140. package/packages/layout-body/src/layout-body.ts +142 -142
  141. package/packages/layout-container/index.ts +16 -16
  142. package/packages/layout-container/src/layout-container.ts +82 -82
  143. package/packages/layout-footer/index.ts +16 -16
  144. package/packages/layout-footer/src/layout-footer.ts +74 -74
  145. package/packages/layout-header/index.ts +16 -16
  146. package/packages/layout-header/src/layout-header.ts +73 -73
  147. package/packages/link/index.ts +16 -16
  148. package/packages/link/src/link.ts +161 -161
  149. package/packages/list/index.ts +16 -16
  150. package/packages/list/src/list.ts +442 -442
  151. package/packages/loading/index.ts +34 -34
  152. package/packages/loading/src/loading.ts +152 -152
  153. package/packages/mention/index.ts +16 -16
  154. package/packages/mention/src/mention.ts +71 -71
  155. package/packages/menu/index.ts +16 -16
  156. package/packages/menu/src/menu.ts +581 -581
  157. package/packages/modal/index.ts +136 -136
  158. package/packages/modal/src/modal.ts +1494 -1494
  159. package/packages/notice-bar/index.ts +16 -16
  160. package/packages/notice-bar/src/notice-bar.ts +181 -181
  161. package/packages/number-input/index.ts +16 -16
  162. package/packages/number-input/src/number-input.ts +1096 -1096
  163. package/packages/number-input/src/util.ts +12 -12
  164. package/packages/optgroup/index.ts +16 -16
  165. package/packages/option/index.ts +16 -16
  166. package/packages/pager/index.ts +16 -16
  167. package/packages/pager/src/pager.ts +769 -769
  168. package/packages/password-input/index.ts +16 -16
  169. package/packages/password-input/src/password-input.ts +378 -378
  170. package/packages/print/index.ts +18 -18
  171. package/packages/print/src/page-break.ts +92 -92
  172. package/packages/print/src/print.ts +272 -272
  173. package/packages/print/src/util.ts +284 -284
  174. package/packages/print-page-break/index.ts +16 -16
  175. package/packages/pulldown/index.ts +16 -16
  176. package/packages/pulldown/src/pulldown.ts +457 -457
  177. package/packages/radio/index.ts +16 -16
  178. package/packages/radio/src/button.ts +173 -173
  179. package/packages/radio/src/group.ts +213 -213
  180. package/packages/radio/src/radio.ts +180 -180
  181. package/packages/radio-button/index.ts +16 -16
  182. package/packages/radio-group/index.ts +16 -16
  183. package/packages/rate/index.ts +16 -16
  184. package/packages/rate/src/rate.ts +192 -192
  185. package/packages/result/index.ts +16 -16
  186. package/packages/result/src/result.ts +112 -112
  187. package/packages/row/index.ts +16 -16
  188. package/packages/row/src/col.ts +136 -136
  189. package/packages/row/src/row.ts +119 -119
  190. package/packages/segmented/index.ts +16 -16
  191. package/packages/segmented/src/segmented.ts +264 -264
  192. package/packages/select/index.ts +16 -16
  193. package/packages/select/src/optgroup.ts +49 -49
  194. package/packages/select/src/option-info.ts +20 -20
  195. package/packages/select/src/option.ts +47 -47
  196. package/packages/select/src/select.ts +1699 -1699
  197. package/packages/select/src/util.ts +47 -47
  198. package/packages/slider/index.ts +16 -16
  199. package/packages/slider/src/slider.ts +304 -304
  200. package/packages/split/index.ts +16 -16
  201. package/packages/split-pane/index.ts +17 -17
  202. package/packages/splitter/index.ts +16 -16
  203. package/packages/splitter/src/splitter-panel.ts +145 -145
  204. package/packages/splitter/src/splitter.ts +1009 -1009
  205. package/packages/splitter/src/util.ts +21 -21
  206. package/packages/splitter-panel/index.ts +16 -16
  207. package/packages/steps/index.ts +16 -16
  208. package/packages/steps/src/steps.ts +68 -68
  209. package/packages/switch/index.ts +16 -16
  210. package/packages/switch/src/switch.ts +237 -237
  211. package/packages/tab-pane/index.ts +16 -16
  212. package/packages/table-select/index.ts +16 -16
  213. package/packages/table-select/src/table-select.ts +800 -800
  214. package/packages/tabs/index.ts +16 -16
  215. package/packages/tabs/src/tab-pane.ts +117 -117
  216. package/packages/tabs/src/tabs.ts +940 -940
  217. package/packages/tabs/src/util.ts +21 -21
  218. package/packages/tag/index.ts +16 -16
  219. package/packages/tag/src/tag.ts +187 -187
  220. package/packages/text/index.ts +16 -16
  221. package/packages/text/src/text.ts +260 -260
  222. package/packages/text-ellipsis/index.ts +16 -16
  223. package/packages/text-ellipsis/src/text-ellipsis.ts +282 -282
  224. package/packages/textarea/index.ts +16 -16
  225. package/packages/textarea/src/textarea.ts +373 -373
  226. package/packages/timeline/index.ts +16 -16
  227. package/packages/timeline/src/timeline-item.ts +67 -67
  228. package/packages/timeline/src/timeline.ts +71 -71
  229. package/packages/timeline-item/index.ts +16 -16
  230. package/packages/tip/index.ts +19 -19
  231. package/packages/tip/src/tip.ts +129 -129
  232. package/packages/tooltip/index.ts +16 -16
  233. package/packages/tooltip/src/tooltip.ts +589 -589
  234. package/packages/tour/index.ts +16 -16
  235. package/packages/tour/src/tour.ts +71 -71
  236. package/packages/tree/index.ts +16 -16
  237. package/packages/tree/src/store.ts +14 -14
  238. package/packages/tree/src/tree.ts +2825 -2795
  239. package/packages/tree/src/util.ts +45 -45
  240. package/packages/tree-select/index.ts +16 -16
  241. package/packages/tree-select/src/tree-select.ts +979 -977
  242. package/packages/ui/index.ts +697 -697
  243. package/packages/ui/src/anime.ts +52 -52
  244. package/packages/ui/src/comp.ts +3 -3
  245. package/packages/ui/src/dom.ts +279 -279
  246. package/packages/ui/src/log.ts +6 -6
  247. package/packages/ui/src/utils.ts +49 -49
  248. package/packages/ui/src/vn.ts +39 -39
  249. package/packages/upload/index.ts +20 -20
  250. package/packages/upload/src/upload.ts +1919 -1919
  251. package/packages/upload/src/util.ts +109 -109
  252. package/packages/watermark/index.ts +31 -31
  253. package/packages/watermark/src/util.ts +176 -176
  254. package/packages/watermark/src/watermark.ts +168 -168
  255. package/styles/all.scss +90 -90
  256. package/styles/base.scss +16 -16
  257. package/styles/components/alert.scss +101 -101
  258. package/styles/components/anchor.scss +44 -44
  259. package/styles/components/avatar.scss +115 -115
  260. package/styles/components/backtop.scss +82 -82
  261. package/styles/components/badge.scss +45 -45
  262. package/styles/components/breadcrumb.scss +29 -29
  263. package/styles/components/button-group.scss +30 -30
  264. package/styles/components/button.scss +415 -415
  265. package/styles/components/calendar.scss +471 -471
  266. package/styles/components/card.scss +121 -121
  267. package/styles/components/carousel.scss +184 -184
  268. package/styles/components/cascader.scss +140 -140
  269. package/styles/components/checkbox-button.scss +57 -57
  270. package/styles/components/checkbox.scss +81 -81
  271. package/styles/components/collapse.scss +56 -56
  272. package/styles/components/color-picker.scss +409 -409
  273. package/styles/components/context-menu.scss +102 -102
  274. package/styles/components/countdown.scss +35 -35
  275. package/styles/components/date-panel.scss +505 -505
  276. package/styles/components/date-picker.scss +247 -247
  277. package/styles/components/date-range-picker.scss +252 -252
  278. package/styles/components/drawer.scss +298 -298
  279. package/styles/components/empty.scss +79 -79
  280. package/styles/components/form.scss +668 -668
  281. package/styles/components/icon-picker.scss +211 -211
  282. package/styles/components/icon.scss +1048 -1048
  283. package/styles/components/image-group.scss +2 -2
  284. package/styles/components/image-preview.scss +215 -215
  285. package/styles/components/image.scss +16 -16
  286. package/styles/components/input.scss +846 -846
  287. package/styles/components/layout-aside.scss +22 -22
  288. package/styles/components/layout-body.scss +14 -14
  289. package/styles/components/layout-container.scss +13 -13
  290. package/styles/components/layout-footer.scss +14 -14
  291. package/styles/components/layout-header.scss +11 -11
  292. package/styles/components/link.scss +115 -115
  293. package/styles/components/list.scss +40 -40
  294. package/styles/components/loading.scss +137 -137
  295. package/styles/components/menu.scss +150 -150
  296. package/styles/components/modal.scss +480 -480
  297. package/styles/components/notice-bar.scss +91 -91
  298. package/styles/components/number-input.scss +283 -283
  299. package/styles/components/old-icon.scss +4 -4
  300. package/styles/components/pager.scss +282 -282
  301. package/styles/components/password-input.scss +374 -374
  302. package/styles/components/print.scss +3 -3
  303. package/styles/components/pulldown.scss +75 -75
  304. package/styles/components/radio-button.scss +57 -57
  305. package/styles/components/radio.scss +79 -79
  306. package/styles/components/rate.scss +76 -76
  307. package/styles/components/result.scss +91 -91
  308. package/styles/components/row.scss +69 -69
  309. package/styles/components/segmented.scss +215 -215
  310. package/styles/components/select.scss +244 -244
  311. package/styles/components/slider.scss +139 -139
  312. package/styles/components/split.scss +1 -1
  313. package/styles/components/splitter.scss +318 -318
  314. package/styles/components/switch.scss +128 -128
  315. package/styles/components/table-select.scss +105 -105
  316. package/styles/components/tabs.scss +745 -745
  317. package/styles/components/tag.scss +184 -184
  318. package/styles/components/text-ellipsis.scss +130 -130
  319. package/styles/components/text.scss +123 -123
  320. package/styles/components/textarea.scss +106 -106
  321. package/styles/components/tip.scss +97 -97
  322. package/styles/components/tooltip.scss +141 -141
  323. package/styles/components/tree-select.scss +166 -166
  324. package/styles/components/tree.scss +294 -294
  325. package/styles/components/upload.scss +497 -497
  326. package/styles/components/watermark.scss +26 -26
  327. package/styles/helpers/baseMixin.scss +95 -95
  328. package/styles/helpers/baseVar.scss +3 -3
  329. package/styles/helpers/placement.scss +38 -38
  330. package/styles/theme/base.scss +214 -214
  331. package/styles/theme/dark.scss +119 -119
  332. package/styles/theme/light.scss +118 -118
  333. package/styles/variable.scss +111 -111
  334. package/types/all.d.ts +327 -327
  335. package/types/components/alert.d.ts +87 -87
  336. package/types/components/anchor-link.d.ts +91 -91
  337. package/types/components/anchor.d.ts +104 -104
  338. package/types/components/avatar.d.ts +88 -88
  339. package/types/components/backtop.d.ts +122 -122
  340. package/types/components/badge.d.ts +76 -76
  341. package/types/components/breadcrumb-item.d.ts +80 -80
  342. package/types/components/breadcrumb.d.ts +87 -87
  343. package/types/components/button-group.d.ts +120 -120
  344. package/types/components/button.d.ts +323 -323
  345. package/types/components/calendar.d.ts +264 -264
  346. package/types/components/card.d.ts +93 -93
  347. package/types/components/carousel-item.d.ts +75 -75
  348. package/types/components/carousel.d.ts +134 -134
  349. package/types/components/cascader.d.ts +263 -263
  350. package/types/components/checkbox-button.d.ts +103 -103
  351. package/types/components/checkbox-group.d.ts +143 -143
  352. package/types/components/checkbox.d.ts +123 -123
  353. package/types/components/col.d.ts +80 -80
  354. package/types/components/colgroup.d.ts +137 -137
  355. package/types/components/collapse-pane.d.ts +89 -89
  356. package/types/components/collapse.d.ts +121 -121
  357. package/types/components/color-picker.d.ts +176 -176
  358. package/types/components/column.d.ts +841 -841
  359. package/types/components/context-menu.d.ts +289 -289
  360. package/types/components/countdown.d.ts +112 -112
  361. package/types/components/date-panel.d.ts +280 -280
  362. package/types/components/date-picker.d.ts +332 -332
  363. package/types/components/date-range-picker.d.ts +352 -352
  364. package/types/components/drawer.d.ts +299 -299
  365. package/types/components/empty.d.ts +78 -78
  366. package/types/components/flow-design.d.ts +85 -85
  367. package/types/components/flow-view.d.ts +85 -85
  368. package/types/components/form-design.d.ts +376 -376
  369. package/types/components/form-gather.d.ts +124 -124
  370. package/types/components/form-group.d.ts +77 -77
  371. package/types/components/form-item.d.ts +411 -411
  372. package/types/components/form-view.d.ts +183 -183
  373. package/types/components/form.d.ts +468 -468
  374. package/types/components/gantt-module/gantt-view.d.ts +177 -177
  375. package/types/components/gantt-module/index.d.ts +1 -1
  376. package/types/components/gantt-plugins/extend-gantt-chart.d.ts +131 -131
  377. package/types/components/gantt-plugins/index.d.ts +1 -1
  378. package/types/components/gantt.d.ts +1194 -1185
  379. package/types/components/grid.d.ts +1040 -1040
  380. package/types/components/icon-picker.d.ts +196 -196
  381. package/types/components/icon.d.ts +87 -87
  382. package/types/components/image-group.d.ts +127 -127
  383. package/types/components/image-preview.d.ts +167 -167
  384. package/types/components/image.d.ts +173 -173
  385. package/types/components/input.d.ts +435 -435
  386. package/types/components/layout-aside.d.ts +80 -80
  387. package/types/components/layout-body.d.ts +91 -91
  388. package/types/components/layout-container.d.ts +73 -73
  389. package/types/components/layout-footer.d.ts +73 -73
  390. package/types/components/layout-header.d.ts +69 -69
  391. package/types/components/link.d.ts +111 -111
  392. package/types/components/list-design.d.ts +190 -190
  393. package/types/components/list-view.d.ts +199 -199
  394. package/types/components/list.d.ts +204 -204
  395. package/types/components/loading.d.ts +103 -103
  396. package/types/components/mention.d.ts +77 -77
  397. package/types/components/menu.d.ts +211 -211
  398. package/types/components/modal.d.ts +542 -542
  399. package/types/components/notice-bar.d.ts +102 -102
  400. package/types/components/number-input.d.ts +309 -309
  401. package/types/components/optgroup.d.ts +88 -88
  402. package/types/components/option.d.ts +103 -103
  403. package/types/components/pager.d.ts +335 -335
  404. package/types/components/password-input.d.ts +142 -142
  405. package/types/components/print-page-break.d.ts +69 -69
  406. package/types/components/print.d.ts +206 -206
  407. package/types/components/pulldown.d.ts +231 -231
  408. package/types/components/radio-button.d.ts +114 -114
  409. package/types/components/radio-group.d.ts +144 -144
  410. package/types/components/radio.d.ts +129 -129
  411. package/types/components/rate.d.ts +88 -88
  412. package/types/components/result.d.ts +84 -84
  413. package/types/components/row.d.ts +79 -79
  414. package/types/components/segmented.d.ts +123 -123
  415. package/types/components/select.d.ts +527 -527
  416. package/types/components/slider.d.ts +126 -126
  417. package/types/components/split-pane.d.ts +133 -133
  418. package/types/components/split.d.ts +312 -312
  419. package/types/components/splitter-panel.d.ts +105 -105
  420. package/types/components/splitter.d.ts +288 -288
  421. package/types/components/steps.d.ts +68 -68
  422. package/types/components/switch.d.ts +133 -133
  423. package/types/components/tab-pane.d.ts +114 -114
  424. package/types/components/table-module/custom.d.ts +123 -123
  425. package/types/components/table-module/edit.d.ts +243 -243
  426. package/types/components/table-module/export.d.ts +96 -96
  427. package/types/components/table-module/filter.d.ts +140 -140
  428. package/types/components/table-module/index.d.ts +7 -7
  429. package/types/components/table-module/keyboard.d.ts +26 -26
  430. package/types/components/table-module/menu.d.ts +28 -28
  431. package/types/components/table-module/validator.d.ts +53 -53
  432. package/types/components/table-plugins/extend-cell-area.d.ts +770 -770
  433. package/types/components/table-plugins/extend-pivot-table.d.ts +58 -58
  434. package/types/components/table-plugins/filters-combination.d.ts +15 -15
  435. package/types/components/table-plugins/filters-complex-input.d.ts +9 -9
  436. package/types/components/table-plugins/index.d.ts +4 -4
  437. package/types/components/table-select.d.ts +219 -219
  438. package/types/components/table.d.ts +7465 -7465
  439. package/types/components/tabs.d.ts +332 -332
  440. package/types/components/tag.d.ts +114 -114
  441. package/types/components/text-ellipsis.d.ts +112 -112
  442. package/types/components/text.d.ts +122 -122
  443. package/types/components/textarea.d.ts +247 -247
  444. package/types/components/timeline-item.d.ts +75 -75
  445. package/types/components/timeline.d.ts +77 -77
  446. package/types/components/tip.d.ts +83 -83
  447. package/types/components/toolbar.d.ts +336 -336
  448. package/types/components/tooltip.d.ts +180 -180
  449. package/types/components/tour.d.ts +77 -77
  450. package/types/components/tree-select.d.ts +310 -310
  451. package/types/components/tree.d.ts +843 -833
  452. package/types/components/upload.d.ts +437 -437
  453. package/types/components/watermark.d.ts +120 -120
  454. package/types/handles/form-design.d.ts +50 -50
  455. package/types/handles/index.d.ts +3 -3
  456. package/types/handles/list-design.d.ts +2 -2
  457. package/types/handles/table.d.ts +15 -15
  458. package/types/index.d.ts +8 -8
  459. package/types/ui/commands.d.ts +57 -57
  460. package/types/ui/formats.d.ts +62 -62
  461. package/types/ui/global-config.d.ts +254 -254
  462. package/types/ui/global-icon.d.ts +292 -292
  463. package/types/ui/hooks.d.ts +13 -13
  464. package/types/ui/index.d.ts +96 -96
  465. package/types/ui/interceptor.d.ts +52 -52
  466. package/types/ui/menus.d.ts +77 -77
  467. package/types/ui/renderer.d.ts +1041 -1041
  468. package/types/ui/validators.d.ts +38 -38
  469. /package/es/icon/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  470. /package/es/icon/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  471. /package/es/icon/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  472. /package/es/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  473. /package/es/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  474. /package/es/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  475. /package/lib/icon/style/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  476. /package/lib/icon/style/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  477. /package/lib/icon/style/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
  478. /package/lib/{iconfont.1778169084473.ttf → iconfont.1778317220469.ttf} +0 -0
  479. /package/lib/{iconfont.1778169084473.woff → iconfont.1778317220469.woff} +0 -0
  480. /package/lib/{iconfont.1778169084473.woff2 → iconfont.1778317220469.woff2} +0 -0
@@ -1,987 +1,987 @@
1
- import { h, ref, Ref, provide, computed, inject, reactive, watch, nextTick, PropType, onMounted, onUnmounted } from 'vue'
2
- import { defineVxeComponent } from '../../ui/src/comp'
3
- import XEUtils from 'xe-utils'
4
- import { getConfig, validators, renderer, createEvent, useSize, globalEvents } from '../../ui'
5
- import { eqEmptyValue, getFuncText, isEnableConf } from '../../ui/src/utils'
6
- import { scrollToView } from '../../ui/src/dom'
7
- import { createItem, handleFieldOrItem, isHiddenItem, isActiveItem } from './util'
8
- import VxeTooltipComponent from '../../tooltip'
9
- import VxeFormConfigItem from './form-config-item'
10
- import VxeLoadingComponent from '../../loading'
11
- import { getSlotVNs } from '../../ui/src/vn'
12
- import { warnLog, errLog } from '../../ui/src/log'
13
-
14
- import '../render'
15
-
16
- import type { VxeFormConstructor, VxeFormPropTypes, VxeFormEmits, FormReactData, FormMethods, FormPrivateRef, VxeFormPrivateMethods, VxeFormDefines, VxeFormItemPropTypes, VxeTooltipInstance, FormInternalData, VxeFormPrivateComputed } from '../../../types'
17
- import type { VxeGridConstructor, VxeGridPrivateMethods } from '../../../types/components/grid'
18
-
19
- class Rule {
20
- constructor (rule: any) {
21
- Object.assign(this, {
22
- $options: rule,
23
- required: rule.required,
24
- min: rule.min,
25
- max: rule.min,
26
- type: rule.type,
27
- pattern: rule.pattern,
28
- validator: rule.validator,
29
- trigger: rule.trigger,
30
- maxWidth: rule.maxWidth
31
- })
32
- }
33
-
34
- get content () {
35
- return getFuncText(this.$options.content || this.$options.message)
36
- }
37
-
38
- get message () {
39
- return this.content
40
- }
41
-
42
- [key: string]: any
43
- }
44
-
45
- // 如果存在 pattern,判断正则
46
- function validREValue (pattern: string | RegExp | undefined, val: string) {
47
- if (pattern && !(XEUtils.isRegExp(pattern) ? pattern : new RegExp(pattern)).test(val)) {
48
- return false
49
- }
50
- return true
51
- }
52
-
53
- // 如果存在 max,判断最大值
54
- function validMaxValue (max: string | number | undefined, num: number) {
55
- if (!XEUtils.eqNull(max) && num > XEUtils.toNumber(max)) {
56
- return false
57
- }
58
- return true
59
- }
60
-
61
- // 如果存在 min,判断最小值
62
- function validMinValue (min: string | number | undefined, num: number) {
63
- if (!XEUtils.eqNull(min) && num < XEUtils.toNumber(min)) {
64
- return false
65
- }
66
- return true
67
- }
68
-
69
- function validRuleValue (rule: VxeFormDefines.FormRule, val: any, required: boolean | undefined) {
70
- const { type, min, max, pattern } = rule
71
- const isArrType = type === 'array'
72
- const isNumType = type === 'number'
73
- const isStrType = type === 'string'
74
- const strVal = `${val}`
75
- if (!validREValue(pattern, strVal)) {
76
- return false
77
- }
78
- if (isArrType) {
79
- if (!XEUtils.isArray(val)) {
80
- return false
81
- }
82
- if (required) {
83
- if (!val.length) {
84
- return false
85
- }
86
- }
87
- if (!validMinValue(min, val.length)) {
88
- return false
89
- }
90
- if (!validMaxValue(max, val.length)) {
91
- return false
92
- }
93
- } else if (isNumType) {
94
- const numVal = Number(val)
95
- if (isNaN(numVal)) {
96
- return false
97
- }
98
- if (!validMinValue(min, numVal)) {
99
- return false
100
- }
101
- if (!validMaxValue(max, numVal)) {
102
- return false
103
- }
104
- } else {
105
- if (isStrType) {
106
- if (!XEUtils.isString(val)) {
107
- return false
108
- }
109
- }
110
- if (required) {
111
- if (!strVal) {
112
- return false
113
- }
114
- }
115
- if (!validMinValue(min, strVal.length)) {
116
- return false
117
- }
118
- if (!validMaxValue(max, strVal.length)) {
119
- return false
120
- }
121
- }
122
- return true
123
- }
124
-
125
- function checkRuleStatus (rule: VxeFormDefines.FormRule, data: any, val: any) {
126
- const { required, field } = rule
127
- const currVal = field ? XEUtils.get(data, field) : val
128
- const isEmptyVal = XEUtils.isArray(currVal) ? !currVal.length : eqEmptyValue(currVal)
129
- if (required) {
130
- if (isEmptyVal) {
131
- return false
132
- }
133
- if (!validRuleValue(rule, currVal, required)) {
134
- return false
135
- }
136
- } else {
137
- if (!isEmptyVal) {
138
- if (!validRuleValue(rule, currVal, required)) {
139
- return false
140
- }
141
- }
142
- }
143
- return true
144
- }
145
-
146
- function createInternalData (): FormInternalData {
147
- return {
148
- meTimeout: undefined,
149
- stTimeout: undefined,
150
- tooltipStore: {
151
- item: null,
152
- visible: false
153
- },
154
- itemFormatCache: {}
155
- }
156
- }
157
-
158
- export default defineVxeComponent({
159
- name: 'VxeForm',
160
- props: {
161
- collapseStatus: {
162
- type: Boolean as PropType<VxeFormPropTypes.CollapseStatus>,
163
- default: true
164
- },
165
- loading: Boolean as PropType<VxeFormPropTypes.Loading>,
166
- data: Object as PropType<VxeFormPropTypes.Data>,
167
- size: {
168
- type: String as PropType<VxeFormPropTypes.Size>,
169
- default: () => getConfig().form.size || getConfig().size
170
- },
171
- span: {
172
- type: [String, Number] as PropType<VxeFormPropTypes.Span>,
173
- default: () => getConfig().form.span
174
- },
175
- align: {
176
- type: String as PropType<VxeFormPropTypes.Align>,
177
- default: () => getConfig().form.align
178
- },
179
- verticalAlign: {
180
- type: String as PropType<VxeFormPropTypes.VerticalAlign>,
181
- default: () => getConfig().form.verticalAlign
182
- },
183
- border: {
184
- type: Boolean as PropType<VxeFormPropTypes.Border>,
185
- default: () => getConfig().form.border
186
- },
187
- titleBackground: {
188
- type: Boolean as PropType<VxeFormPropTypes.TitleBackground>,
189
- default: () => getConfig().form.titleBackground
190
- },
191
- titleBold: {
192
- type: Boolean as PropType<VxeFormPropTypes.TitleBold>,
193
- default: () => getConfig().form.titleBold
194
- },
195
- titleAlign: {
196
- type: String as PropType<VxeFormPropTypes.TitleAlign>,
197
- default: () => getConfig().form.titleAlign
198
- },
199
- titleWidth: {
200
- type: [String, Number] as PropType<VxeFormPropTypes.TitleWidth>,
201
- default: () => getConfig().form.titleWidth
202
- },
203
- titleColon: {
204
- type: Boolean as PropType<VxeFormPropTypes.TitleColon>,
205
- default: () => getConfig().form.titleColon
206
- },
207
- titleAsterisk: {
208
- type: Boolean as PropType<VxeFormPropTypes.TitleAsterisk>,
209
- default: () => getConfig().form.titleAsterisk
210
- },
211
- titleOverflow: {
212
- type: [Boolean, String] as PropType<VxeFormPropTypes.TitleOverflow>,
213
- default: () => getConfig().form.titleOverflow
214
- },
215
- vertical: {
216
- type: Boolean as PropType<VxeFormPropTypes.Vertical>,
217
- default: () => getConfig().form.vertical
218
- },
219
- padding: {
220
- type: Boolean as PropType<VxeFormPropTypes.Padding>,
221
- default: () => getConfig().form.padding
222
- },
223
- className: [String, Function] as PropType<VxeFormPropTypes.ClassName>,
224
- readonly: Boolean as PropType<VxeFormPropTypes.Readonly>,
225
- disabled: Boolean as PropType<VxeFormPropTypes.Disabled>,
226
- items: Array as PropType<VxeFormPropTypes.Items>,
227
- rules: Object as PropType<VxeFormPropTypes.Rules>,
228
- preventSubmit: {
229
- type: Boolean as PropType<VxeFormPropTypes.PreventSubmit>,
230
- default: () => getConfig().form.preventSubmit
231
- },
232
- validConfig: Object as PropType<VxeFormPropTypes.ValidConfig>,
233
- tooltipConfig: Object as PropType<VxeFormPropTypes.TooltipConfig>,
234
- collapseConfig: Object as PropType<VxeFormPropTypes.CollapseConfig>,
235
- customLayout: {
236
- type: Boolean as PropType<VxeFormPropTypes.CustomLayout>,
237
- default: () => getConfig().form.customLayout
238
- },
239
- params: Object as PropType<VxeFormPropTypes.Params>
240
- },
241
- emits: [
242
- 'update:collapseStatus',
243
- 'collapse',
244
- 'toggle-collapse',
245
- 'submit',
246
- 'submit-invalid',
247
- 'reset'
248
- ] as VxeFormEmits,
249
- setup (props, context) {
250
- const { slots, emit } = context
251
-
252
- const $xeGrid = inject<(VxeGridConstructor & VxeGridPrivateMethods) | null>('$xeGrid', null)
253
-
254
- const xID = XEUtils.uniqueId()
255
-
256
- const { computeSize } = useSize(props)
257
-
258
- const reactData = reactive<FormReactData>({
259
- collapseAll: props.collapseStatus,
260
- staticItems: [],
261
- formItems: [],
262
- itemWidth: 0
263
- })
264
-
265
- const internalData = createInternalData()
266
-
267
- const refElem = ref<HTMLFormElement>()
268
- const refTooltip = ref() as Ref<VxeTooltipInstance>
269
-
270
- let formMethods = {} as FormMethods
271
-
272
- const computeValidOpts = computed(() => {
273
- return Object.assign({}, getConfig().form.validConfig, props.validConfig)
274
- })
275
-
276
- const computeTooltipOpts = computed(() => {
277
- return Object.assign({}, getConfig().tooltip, getConfig().form.tooltipConfig, props.tooltipConfig)
278
- })
279
-
280
- const computeCollapseOpts = computed(() => {
281
- return Object.assign({}, getConfig().form.collapseConfig, props.collapseConfig)
282
- })
283
-
284
- const computeAutoItemWidthList = computed(() => {
285
- const { titleWidth: allTitleWidth, vertical: allVertical } = props
286
- const { formItems } = reactData
287
- const itemList: VxeFormDefines.ItemInfo[] = []
288
- XEUtils.eachTree(formItems, (item) => {
289
- const { titleWidth, vertical } = item
290
- if (titleWidth === 'auto') {
291
- itemList.push(item)
292
- } else {
293
- const itemVertical = XEUtils.eqNull(vertical) ? allVertical : vertical
294
- const itemTitleWidth = itemVertical ? null : (XEUtils.eqNull(titleWidth) ? allTitleWidth : titleWidth)
295
- if (itemTitleWidth === 'auto' && (!item.children || !item.children.length)) {
296
- itemList.push(item)
297
- }
298
- }
299
- }, { children: 'children' })
300
- return itemList
301
- })
302
-
303
- const refMaps: FormPrivateRef = {
304
- refElem
305
- }
306
-
307
- const computeMaps: VxeFormPrivateComputed = {
308
- computeSize,
309
- computeValidOpts,
310
- computeTooltipOpts,
311
- computeCollapseOpts,
312
- computeAutoItemWidthList
313
- }
314
-
315
- const $xeForm = {
316
- xID,
317
- props,
318
- context,
319
- reactData,
320
- internalData,
321
-
322
- xeGrid: $xeGrid,
323
- getRefMaps: () => refMaps,
324
- getComputeMaps: () => computeMaps
325
- } as unknown as VxeFormConstructor & VxeFormPrivateMethods
326
-
327
- const callSlot = (slotFunc: ((params: any) => any) | string | null, params: any) => {
328
- if (slotFunc) {
329
- if (XEUtils.isString(slotFunc)) {
330
- slotFunc = slots[slotFunc] || null
331
- }
332
- if (XEUtils.isFunction(slotFunc)) {
333
- return getSlotVNs(slotFunc(params))
334
- }
335
- }
336
- return []
337
- }
338
-
339
- const loadItem = (list: VxeFormPropTypes.Items) => {
340
- if (list.length) {
341
- list.forEach((item) => {
342
- if (item.slots) {
343
- XEUtils.each(item.slots, (func) => {
344
- if (!XEUtils.isFunction(func)) {
345
- if (!slots[func]) {
346
- errLog('vxe.error.notSlot', [`[form] ${func}`])
347
- }
348
- }
349
- })
350
- }
351
- })
352
- }
353
- reactData.staticItems = XEUtils.mapTree(list, item => createItem($xeForm, item), { children: 'children' })
354
- internalData.itemFormatCache = {}
355
- return nextTick().then(() => {
356
- return recalculate()
357
- })
358
- }
359
-
360
- const getItems = () => {
361
- const itemList: VxeFormDefines.ItemInfo[] = []
362
- XEUtils.eachTree(reactData.formItems, item => {
363
- itemList.push(item)
364
- }, { children: 'children' })
365
- return itemList
366
- }
367
-
368
- const getItemByField = (field: string) => {
369
- const rest = XEUtils.findTree(reactData.formItems, item => item.field === field, { children: 'children' })
370
- return rest ? rest.item : null
371
- }
372
-
373
- const getCollapseStatus = () => {
374
- return reactData.collapseAll
375
- }
376
-
377
- const toggleCollapse = () => {
378
- const status = !getCollapseStatus()
379
- reactData.collapseAll = status
380
- emit('update:collapseStatus', status)
381
- return nextTick()
382
- }
383
-
384
- const toggleCollapseEvent = (evnt: Event) => {
385
- const actionRest = toggleCollapse()
386
- const status = getCollapseStatus()
387
- formMethods.dispatchEvent('toggle-collapse', { status, collapse: status, data: props.data }, evnt)
388
- formMethods.dispatchEvent('collapse', { status, collapse: status, data: props.data }, evnt)
389
- actionRest.then(() => {
390
- recalculate().then(() => {
391
- if ($xeGrid) {
392
- $xeGrid.recalculate(true)
393
- }
394
- })
395
- if ($xeGrid) {
396
- $xeGrid.recalculate()
397
- }
398
- })
399
- }
400
-
401
- const clearValidate = (fieldOrItem?: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[]) => {
402
- if (fieldOrItem) {
403
- let fields: any = fieldOrItem
404
- if (!XEUtils.isArray(fieldOrItem)) {
405
- fields = [fieldOrItem]
406
- }
407
- fields.forEach((field: any) => {
408
- if (field) {
409
- const item = handleFieldOrItem($xeForm, field)
410
- if (item) {
411
- item.showError = false
412
- item.showIconMsg = false
413
- }
414
- }
415
- })
416
- } else {
417
- getItems().forEach((item) => {
418
- item.showError = false
419
- item.showIconMsg = false
420
- })
421
- }
422
- return nextTick()
423
- }
424
-
425
- const getResetValue = (item: VxeFormDefines.ItemInfo, data: any, itemValue: any) => {
426
- const { field, resetValue } = item
427
- if (XEUtils.isFunction(resetValue)) {
428
- return resetValue({ field, item, data, $form: $xeForm, $grid: $xeGrid })
429
- } else if (XEUtils.eqNull(resetValue)) {
430
- // 默认
431
- if (XEUtils.isArray(itemValue)) {
432
- return []
433
- }
434
- }
435
- return resetValue
436
- }
437
-
438
- const reset = () => {
439
- const { data } = props
440
- const itemList = getItems()
441
- if (data) {
442
- itemList.forEach((item) => {
443
- const { field, itemRender } = item
444
- if (isEnableConf(itemRender)) {
445
- const { name, startField, endField } = itemRender
446
- const compConf = renderer.get(name)
447
- const fiResetMethod = compConf ? (compConf.formItemResetMethod || compConf.itemResetMethod) : null
448
- if (compConf && fiResetMethod) {
449
- fiResetMethod({ data, field, property: field, item, $form: $xeForm, $grid: $xeGrid })
450
- } else if (field) {
451
- const itemValue = XEUtils.get(data, field)
452
- XEUtils.set(data, field, getResetValue(item, data, itemValue))
453
- }
454
- if (startField && endField) {
455
- XEUtils.set(data, startField, getResetValue(item, data, XEUtils.get(data, startField)))
456
- XEUtils.set(data, endField, getResetValue(item, data, XEUtils.get(data, endField)))
457
- }
458
- }
459
- })
460
- }
461
- internalData.itemFormatCache = {}
462
- clearValidate()
463
- return recalculate()
464
- }
465
-
466
- const resetEvent = (evnt: Event) => {
467
- evnt.preventDefault()
468
- reset()
469
- formMethods.dispatchEvent('reset', { data: props.data }, evnt)
470
- }
471
-
472
- const handleFocus = (fields: string[]) => {
473
- const el = refElem.value
474
- if (el) {
475
- for (let i = 0; i < fields.length; i++) {
476
- const field = fields[i]
477
- const item = getItemByField(field)
478
- if (item && isEnableConf(item.itemRender)) {
479
- const { itemRender } = item
480
- const compConf = renderer.get(itemRender.name)
481
- // 定位到第一个
482
- if (!i) {
483
- scrollToView(el.querySelector(`.${item.id}`))
484
- }
485
- let inputElem: HTMLElement | null = null
486
- const autoFocus = itemRender.autoFocus || itemRender.autofocus || (compConf ? compConf.formItemAutoFocus : null)
487
- // 如果指定了聚焦 class
488
- if (XEUtils.isFunction(autoFocus)) {
489
- inputElem = autoFocus({ $form: $xeForm, $grid: $xeGrid, item, data: props.data, field })
490
- } else {
491
- if (autoFocus === true) {
492
- // 自动匹配模式,会自动匹配第一个可输入元素
493
- inputElem = el.querySelector(`.${item.id} input,textarea`)
494
- } else if (autoFocus) {
495
- inputElem = el.querySelector(`.${item.id} ${autoFocus}`) as HTMLInputElement
496
- }
497
- }
498
- if (inputElem) {
499
- inputElem.focus()
500
- break
501
- }
502
- }
503
- }
504
- }
505
- }
506
-
507
- /**
508
- * 校验数据
509
- * 按表格行、列顺序依次校验(同步或异步)
510
- * 校验规则根据索引顺序依次校验,如果是异步则会等待校验完成才会继续校验下一列
511
- * 如果校验失败则,触发回调或者 Promise<(ErrMap 校验不通过列的信息)>
512
- * 如果是传回调方式这返回一个 (ErrMap 校验不通过列的信息)
513
- *
514
- * rule 配置:
515
- * required=Boolean 是否必填
516
- * min=Number 最小长度
517
- * max=Number 最大长度
518
- * validator=Function({ itemValue, rule, rules, data, property }) 自定义校验,接收一个 Promise
519
- * trigger=change 触发方式
520
- */
521
- const validItemRules = (validType: string, fields: string | string[], val?: any): Promise<VxeFormDefines.ValidateErrorMapParams | undefined> => {
522
- const { data, rules: formRules } = props
523
- const errorMaps: VxeFormDefines.ValidateErrorMapParams = {}
524
- if (!XEUtils.isArray(fields)) {
525
- fields = [fields]
526
- }
527
- return Promise.all(
528
- fields.map((property) => {
529
- const errorRules: Rule[] = []
530
- const syncVailds: Promise<any>[] = []
531
- if (property && formRules) {
532
- const rules = XEUtils.get(formRules, property)
533
- if (rules) {
534
- const itemValue = XEUtils.isUndefined(val) ? XEUtils.get(data, property) : val
535
- rules.forEach((rule) => {
536
- const { trigger, validator } = rule
537
- if (validType === 'all' || !trigger || validType === trigger) {
538
- if (validator) {
539
- const validParams = {
540
- itemValue,
541
- rule,
542
- rules,
543
- data,
544
- field: property,
545
- property,
546
- $form: $xeForm
547
- }
548
- let customValid: any
549
- if (XEUtils.isString(validator)) {
550
- const gvItem = validators.get(validator)
551
- if (gvItem) {
552
- const validatorMethod = gvItem.formItemValidatorMethod || gvItem.itemValidatorMethod
553
- if (validatorMethod) {
554
- customValid = validatorMethod(validParams)
555
- } else {
556
- warnLog('vxe.error.notValidators', [`[form] ${validator}`])
557
- }
558
- } else {
559
- errLog('vxe.error.notValidators', [`[form] ${validator}`])
560
- }
561
- } else {
562
- customValid = validator(validParams)
563
- }
564
- if (customValid) {
565
- if (XEUtils.isError(customValid)) {
566
- errorRules.push(new Rule({ type: 'custom', trigger, content: customValid.message, rule: new Rule(rule) }))
567
- } else if (customValid.catch) {
568
- // 如果为异步校验(注:异步校验是并发无序的)
569
- syncVailds.push(
570
- customValid.catch((e: any) => {
571
- errorRules.push(new Rule({ type: 'custom', trigger, content: e ? e.message : (rule.content || rule.message), rule: new Rule(rule) }))
572
- })
573
- )
574
- }
575
- }
576
- } else {
577
- if (!checkRuleStatus(rule, data, itemValue)) {
578
- errorRules.push(new Rule(rule))
579
- }
580
- }
581
- }
582
- })
583
- }
584
- }
585
- return Promise.all(syncVailds).then(() => {
586
- if (errorRules.length) {
587
- errorMaps[property] = errorRules.map(rule => {
588
- return {
589
- $form: $xeForm,
590
- rule,
591
- data,
592
- field: property,
593
- property
594
- }
595
- })
596
- }
597
- })
598
- })
599
- ).then(() => {
600
- if (!XEUtils.isEmpty(errorMaps)) {
601
- return Promise.reject(errorMaps)
602
- }
603
- })
604
- }
605
-
606
- const beginValidate = (itemList: VxeFormDefines.ItemInfo[], type?: string, callback?: any): Promise<VxeFormDefines.ValidateErrorMapParams | void> => {
607
- const { data, rules: formRules } = props
608
- const validOpts = computeValidOpts.value
609
- const validRest: any = {}
610
- const validFields: string[] = []
611
- const itemValids: any[] = []
612
- clearTimeout(internalData.meTimeout)
613
- if (data && formRules) {
614
- itemList.forEach((item) => {
615
- const { field } = item
616
- if (field && !isHiddenItem($xeForm, item) && isActiveItem($xeForm, item)) {
617
- itemValids.push(
618
- validItemRules(type || 'all', field).then(() => {
619
- item.errRule = null
620
- }).catch((errorMaps: VxeFormDefines.ValidateErrorMapParams) => {
621
- const rest = errorMaps[field]
622
- if (!validRest[field]) {
623
- validRest[field] = []
624
- }
625
- validRest[field].push(rest)
626
- validFields.push(field)
627
- item.errRule = rest[0].rule
628
- return Promise.reject(rest)
629
- })
630
- )
631
- }
632
- })
633
- return Promise.all(itemValids).then(() => {
634
- if (callback) {
635
- callback()
636
- }
637
- }).catch(() => {
638
- return new Promise<void>((resolve) => {
639
- internalData.meTimeout = setTimeout(() => {
640
- itemList.forEach((item) => {
641
- if (item.errRule) {
642
- item.showError = true
643
- }
644
- })
645
- }, 20)
646
- if (validOpts.autoPos !== false) {
647
- nextTick(() => {
648
- handleFocus(validFields)
649
- })
650
- }
651
- if (callback) {
652
- callback(validRest)
653
- resolve()
654
- } else {
655
- resolve(validRest)
656
- }
657
- })
658
- })
659
- }
660
- if (callback) {
661
- callback()
662
- }
663
- return Promise.resolve()
664
- }
665
-
666
- const validate = (callback: any): Promise<any> => {
667
- const { readonly } = props
668
- clearValidate()
669
- if (readonly) {
670
- return nextTick()
671
- }
672
- return beginValidate(getItems(), '', callback).then((params) => {
673
- recalculate()
674
- return params
675
- })
676
- }
677
-
678
- const validateField = (fieldOrItem: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[], callback: any) => {
679
- const { readonly } = props
680
- if (readonly) {
681
- return nextTick()
682
- }
683
- let fields: any[] = []
684
- if (fieldOrItem) {
685
- if (XEUtils.isArray(fieldOrItem)) {
686
- fields = fieldOrItem
687
- } else {
688
- fields = [fieldOrItem]
689
- }
690
- }
691
- const itemList = fields.map(field => handleFieldOrItem($xeForm, field)) as VxeFormDefines.ItemInfo[]
692
- return beginValidate(itemList, '', callback).then((params) => {
693
- recalculate()
694
- return params
695
- })
696
- }
697
-
698
- const handleSubmitEvent = (evnt: Event) => {
699
- const { readonly } = props
700
- clearValidate()
701
- if (readonly) {
702
- $xeForm.dispatchEvent('submit', { data: props.data }, evnt)
703
- recalculate()
704
- return
705
- }
706
- beginValidate(getItems()).then((errMap) => {
707
- if (errMap) {
708
- $xeForm.dispatchEvent('submit-invalid', { data: props.data, errMap }, evnt)
709
- } else {
710
- $xeForm.dispatchEvent('submit', { data: props.data }, evnt)
711
- }
712
- recalculate()
713
- })
714
- }
715
-
716
- const submitEvent = (evnt: Event) => {
717
- evnt.preventDefault()
718
- if (!props.preventSubmit) {
719
- handleSubmitEvent(evnt)
720
- }
721
- }
722
-
723
- const closeTooltip = () => {
724
- const { tooltipStore } = internalData
725
- const $tooltip = refTooltip.value
726
- if (tooltipStore.visible) {
727
- Object.assign(tooltipStore, {
728
- item: null,
729
- visible: false
730
- })
731
- if ($tooltip) {
732
- $tooltip.close()
733
- }
734
- }
735
- return nextTick()
736
- }
737
-
738
- const triggerTitleTipEvent = (evnt: MouseEvent, params: {
739
- item: VxeFormDefines.ItemInfo;
740
- }) => {
741
- const { item } = params
742
- const { tooltipStore } = internalData
743
- const $tooltip = refTooltip.value
744
- const overflowElem = (evnt.currentTarget as HTMLDivElement).children[0]
745
- const content = (overflowElem.textContent || '').trim()
746
- const isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth
747
- clearTimeout(internalData.stTimeout)
748
- if (tooltipStore.item !== item) {
749
- closeTooltip()
750
- }
751
- if (content && isCellOverflow) {
752
- Object.assign(tooltipStore, {
753
- item,
754
- visible: true
755
- })
756
- if ($tooltip) {
757
- $tooltip.open(overflowElem, content)
758
- }
759
- }
760
- }
761
-
762
- const handleTitleTipLeaveEvent = () => {
763
- const tooltipOpts = computeTooltipOpts.value
764
- let $tooltip = refTooltip.value
765
- if ($tooltip) {
766
- $tooltip.setActived(false)
767
- }
768
- if (tooltipOpts.enterable) {
769
- internalData.stTimeout = setTimeout(() => {
770
- $tooltip = refTooltip.value
771
- if ($tooltip && !$tooltip.isActived()) {
772
- closeTooltip()
773
- }
774
- }, tooltipOpts.leaveDelay)
775
- } else {
776
- closeTooltip()
777
- }
778
- }
779
-
780
- const triggerItemEvent = (evnt: Event, field: string, itemValue?: any) => {
781
- if (field) {
782
- return validItemRules(evnt ? (['blur'].includes(evnt.type) ? 'blur' : 'change') : 'all', field, itemValue)
783
- .then(() => {
784
- clearValidate(field)
785
- })
786
- .catch((errorMaps: VxeFormDefines.ValidateErrorMapParams) => {
787
- const rest = errorMaps[field]
788
- const item = getItemByField(field)
789
- if (rest && item) {
790
- item.showError = true
791
- item.errRule = rest[0].rule
792
- }
793
- })
794
- }
795
- return nextTick()
796
- }
797
-
798
- /**
799
- * 更新项状态
800
- * 如果组件值 v-model 发生 change 时,调用改函数用于更新某一项编辑状态
801
- * 如果单元格配置了校验规则,则会进行校验
802
- */
803
- const updateStatus = (scope: any, itemValue?: any) => {
804
- const { field } = scope
805
- return triggerItemEvent(new Event('change'), field, itemValue)
806
- }
807
-
808
- const recalculate = () => {
809
- const autoItemWidthList = computeAutoItemWidthList.value
810
- const el = refElem.value
811
- if (el && autoItemWidthList.length) {
812
- const itemElList = el.querySelectorAll<HTMLElement>(autoItemWidthList.map(item => `.vxe-form--item-title[itemid="${item.id}"]`).join(','))
813
- let maxItemWidth = 0
814
- XEUtils.arrayEach(itemElList, itemEl => {
815
- itemEl.style.width = ''
816
- maxItemWidth = Math.max(maxItemWidth, Math.ceil(itemEl.clientWidth + 2))
817
- })
818
- XEUtils.arrayEach(itemElList, itemEl => {
819
- itemEl.style.width = `${maxItemWidth}px`
820
- })
821
- }
822
- return nextTick()
823
- }
824
-
825
- const handleGlobalResizeEvent = () => {
826
- recalculate()
827
- }
828
-
829
- formMethods = {
830
- dispatchEvent (type, params, evnt) {
831
- emit(type, createEvent(evnt, { $form: $xeForm, $grid: $xeGrid }, params))
832
- },
833
- reset,
834
- validate,
835
- validateField,
836
- clearValidate,
837
- updateStatus,
838
- toggleCollapse,
839
- getItems,
840
- getItemByField,
841
- closeTooltip,
842
- recalculate
843
- }
844
-
845
- const formPrivateMethods: VxeFormPrivateMethods = {
846
- callSlot,
847
- triggerItemEvent,
848
- toggleCollapseEvent,
849
- triggerTitleTipEvent,
850
- handleTitleTipLeaveEvent,
851
- handleValidIconEvent (evnt, params) {
852
- const { item } = params
853
- item.showIconMsg = !item.showIconMsg
854
- },
855
- handleSubmitEvent
856
- }
857
-
858
- Object.assign($xeForm, formMethods, formPrivateMethods)
859
-
860
- const renderVN = () => {
861
- const { loading, border, className, data, customLayout } = props
862
- const { formItems } = reactData
863
- const vSize = computeSize.value
864
- const tooltipOpts = computeTooltipOpts.value
865
- const defaultSlot = slots.default
866
- return h('form', {
867
- ref: refElem,
868
- class: ['vxe-form', className ? (XEUtils.isFunction(className) ? className({ items: formItems, data, $form: $xeForm }) : className) : '', {
869
- [`size--${vSize}`]: vSize,
870
- 'is--border': border,
871
- 'custom--layout': customLayout,
872
- 'is--loading': loading
873
- }],
874
- onSubmit: submitEvent,
875
- onReset: resetEvent
876
- }, [
877
- h('div', {
878
- class: 'vxe-form--wrapper vxe-form--item-row'
879
- }, customLayout
880
- ? (defaultSlot ? defaultSlot({}) : [])
881
- : formItems.map((item, index) => {
882
- return h(VxeFormConfigItem, {
883
- key: index,
884
- itemConfig: item
885
- })
886
- })),
887
- h('div', {
888
- class: 'vxe-form-slots',
889
- ref: 'hideItem'
890
- }, customLayout ? [] : (defaultSlot ? defaultSlot({}) : [])),
891
- /**
892
- * 加载中
893
- */
894
- h(VxeLoadingComponent, {
895
- class: 'vxe-form--loading',
896
- modelValue: loading
897
- }),
898
- /**
899
- * 工具提示
900
- */
901
- h(VxeTooltipComponent, {
902
- ref: refTooltip,
903
- ...tooltipOpts
904
- })
905
- ])
906
- }
907
-
908
- const recalcFlag = ref(0)
909
- watch(() => props.vertical, () => {
910
- recalcFlag.value++
911
- })
912
- watch(() => props.titleWidth, () => {
913
- recalcFlag.value++
914
- })
915
- watch(recalcFlag, () => {
916
- nextTick().then(() => {
917
- recalculate()
918
- })
919
- })
920
-
921
- const staticItemFlag = ref(0)
922
- watch(() => reactData.staticItems.length, () => {
923
- staticItemFlag.value++
924
- })
925
- watch(() => reactData.staticItems, () => {
926
- staticItemFlag.value++
927
- })
928
- watch(staticItemFlag, () => {
929
- reactData.formItems = reactData.staticItems
930
- recalcFlag.value++
931
- })
932
-
933
- const itemFlag = ref(0)
934
- watch(() => props.items ? props.items.length : -1, () => {
935
- itemFlag.value++
936
- })
937
- watch(() => props.items, () => {
938
- itemFlag.value++
939
- })
940
- watch(itemFlag, () => {
941
- loadItem(props.items || [])
942
- })
943
-
944
- watch(() => props.collapseStatus, (value) => {
945
- reactData.collapseAll = !!value
946
- })
947
-
948
- watch(() => props.readonly, () => {
949
- clearValidate()
950
- })
951
-
952
- watch(() => props.disabled, () => {
953
- clearValidate()
954
- })
955
-
956
- onMounted(() => {
957
- nextTick(() => {
958
- if (props.customLayout && props.items) {
959
- errLog('vxe.error.errConflicts', ['[form] custom-layout', 'items'])
960
- }
961
- })
962
- globalEvents.on($xeForm, 'resize', handleGlobalResizeEvent)
963
- })
964
-
965
- onUnmounted(() => {
966
- globalEvents.off($xeForm, 'resize')
967
- XEUtils.assign(internalData, createInternalData())
968
- })
969
-
970
- if (props.items) {
971
- loadItem(props.items)
972
- }
973
-
974
- provide('xeFormItemInfo', null)
975
-
976
- provide('$xeForm', $xeForm)
977
- provide('$xeFormGroup', null)
978
- provide('$xeFormItem', null)
979
-
980
- $xeForm.renderVN = renderVN
981
-
982
- return $xeForm
983
- },
984
- render () {
985
- return this.renderVN()
986
- }
987
- })
1
+ import { h, ref, Ref, provide, computed, inject, reactive, watch, nextTick, PropType, onMounted, onUnmounted } from 'vue'
2
+ import { defineVxeComponent } from '../../ui/src/comp'
3
+ import XEUtils from 'xe-utils'
4
+ import { getConfig, validators, renderer, createEvent, useSize, globalEvents } from '../../ui'
5
+ import { eqEmptyValue, getFuncText, isEnableConf } from '../../ui/src/utils'
6
+ import { scrollToView } from '../../ui/src/dom'
7
+ import { createItem, handleFieldOrItem, isHiddenItem, isActiveItem } from './util'
8
+ import VxeTooltipComponent from '../../tooltip'
9
+ import VxeFormConfigItem from './form-config-item'
10
+ import VxeLoadingComponent from '../../loading'
11
+ import { getSlotVNs } from '../../ui/src/vn'
12
+ import { warnLog, errLog } from '../../ui/src/log'
13
+
14
+ import '../render'
15
+
16
+ import type { VxeFormConstructor, VxeFormPropTypes, VxeFormEmits, FormReactData, FormMethods, FormPrivateRef, VxeFormPrivateMethods, VxeFormDefines, VxeFormItemPropTypes, VxeTooltipInstance, FormInternalData, VxeFormPrivateComputed } from '../../../types'
17
+ import type { VxeGridConstructor, VxeGridPrivateMethods } from '../../../types/components/grid'
18
+
19
+ class Rule {
20
+ constructor (rule: any) {
21
+ Object.assign(this, {
22
+ $options: rule,
23
+ required: rule.required,
24
+ min: rule.min,
25
+ max: rule.min,
26
+ type: rule.type,
27
+ pattern: rule.pattern,
28
+ validator: rule.validator,
29
+ trigger: rule.trigger,
30
+ maxWidth: rule.maxWidth
31
+ })
32
+ }
33
+
34
+ get content () {
35
+ return getFuncText(this.$options.content || this.$options.message)
36
+ }
37
+
38
+ get message () {
39
+ return this.content
40
+ }
41
+
42
+ [key: string]: any
43
+ }
44
+
45
+ // 如果存在 pattern,判断正则
46
+ function validREValue (pattern: string | RegExp | undefined, val: string) {
47
+ if (pattern && !(XEUtils.isRegExp(pattern) ? pattern : new RegExp(pattern)).test(val)) {
48
+ return false
49
+ }
50
+ return true
51
+ }
52
+
53
+ // 如果存在 max,判断最大值
54
+ function validMaxValue (max: string | number | undefined, num: number) {
55
+ if (!XEUtils.eqNull(max) && num > XEUtils.toNumber(max)) {
56
+ return false
57
+ }
58
+ return true
59
+ }
60
+
61
+ // 如果存在 min,判断最小值
62
+ function validMinValue (min: string | number | undefined, num: number) {
63
+ if (!XEUtils.eqNull(min) && num < XEUtils.toNumber(min)) {
64
+ return false
65
+ }
66
+ return true
67
+ }
68
+
69
+ function validRuleValue (rule: VxeFormDefines.FormRule, val: any, required: boolean | undefined) {
70
+ const { type, min, max, pattern } = rule
71
+ const isArrType = type === 'array'
72
+ const isNumType = type === 'number'
73
+ const isStrType = type === 'string'
74
+ const strVal = `${val}`
75
+ if (!validREValue(pattern, strVal)) {
76
+ return false
77
+ }
78
+ if (isArrType) {
79
+ if (!XEUtils.isArray(val)) {
80
+ return false
81
+ }
82
+ if (required) {
83
+ if (!val.length) {
84
+ return false
85
+ }
86
+ }
87
+ if (!validMinValue(min, val.length)) {
88
+ return false
89
+ }
90
+ if (!validMaxValue(max, val.length)) {
91
+ return false
92
+ }
93
+ } else if (isNumType) {
94
+ const numVal = Number(val)
95
+ if (isNaN(numVal)) {
96
+ return false
97
+ }
98
+ if (!validMinValue(min, numVal)) {
99
+ return false
100
+ }
101
+ if (!validMaxValue(max, numVal)) {
102
+ return false
103
+ }
104
+ } else {
105
+ if (isStrType) {
106
+ if (!XEUtils.isString(val)) {
107
+ return false
108
+ }
109
+ }
110
+ if (required) {
111
+ if (!strVal) {
112
+ return false
113
+ }
114
+ }
115
+ if (!validMinValue(min, strVal.length)) {
116
+ return false
117
+ }
118
+ if (!validMaxValue(max, strVal.length)) {
119
+ return false
120
+ }
121
+ }
122
+ return true
123
+ }
124
+
125
+ function checkRuleStatus (rule: VxeFormDefines.FormRule, data: any, val: any) {
126
+ const { required, field } = rule
127
+ const currVal = field ? XEUtils.get(data, field) : val
128
+ const isEmptyVal = XEUtils.isArray(currVal) ? !currVal.length : eqEmptyValue(currVal)
129
+ if (required) {
130
+ if (isEmptyVal) {
131
+ return false
132
+ }
133
+ if (!validRuleValue(rule, currVal, required)) {
134
+ return false
135
+ }
136
+ } else {
137
+ if (!isEmptyVal) {
138
+ if (!validRuleValue(rule, currVal, required)) {
139
+ return false
140
+ }
141
+ }
142
+ }
143
+ return true
144
+ }
145
+
146
+ function createInternalData (): FormInternalData {
147
+ return {
148
+ meTimeout: undefined,
149
+ stTimeout: undefined,
150
+ tooltipStore: {
151
+ item: null,
152
+ visible: false
153
+ },
154
+ itemFormatCache: {}
155
+ }
156
+ }
157
+
158
+ export default defineVxeComponent({
159
+ name: 'VxeForm',
160
+ props: {
161
+ collapseStatus: {
162
+ type: Boolean as PropType<VxeFormPropTypes.CollapseStatus>,
163
+ default: true
164
+ },
165
+ loading: Boolean as PropType<VxeFormPropTypes.Loading>,
166
+ data: Object as PropType<VxeFormPropTypes.Data>,
167
+ size: {
168
+ type: String as PropType<VxeFormPropTypes.Size>,
169
+ default: () => getConfig().form.size || getConfig().size
170
+ },
171
+ span: {
172
+ type: [String, Number] as PropType<VxeFormPropTypes.Span>,
173
+ default: () => getConfig().form.span
174
+ },
175
+ align: {
176
+ type: String as PropType<VxeFormPropTypes.Align>,
177
+ default: () => getConfig().form.align
178
+ },
179
+ verticalAlign: {
180
+ type: String as PropType<VxeFormPropTypes.VerticalAlign>,
181
+ default: () => getConfig().form.verticalAlign
182
+ },
183
+ border: {
184
+ type: Boolean as PropType<VxeFormPropTypes.Border>,
185
+ default: () => getConfig().form.border
186
+ },
187
+ titleBackground: {
188
+ type: Boolean as PropType<VxeFormPropTypes.TitleBackground>,
189
+ default: () => getConfig().form.titleBackground
190
+ },
191
+ titleBold: {
192
+ type: Boolean as PropType<VxeFormPropTypes.TitleBold>,
193
+ default: () => getConfig().form.titleBold
194
+ },
195
+ titleAlign: {
196
+ type: String as PropType<VxeFormPropTypes.TitleAlign>,
197
+ default: () => getConfig().form.titleAlign
198
+ },
199
+ titleWidth: {
200
+ type: [String, Number] as PropType<VxeFormPropTypes.TitleWidth>,
201
+ default: () => getConfig().form.titleWidth
202
+ },
203
+ titleColon: {
204
+ type: Boolean as PropType<VxeFormPropTypes.TitleColon>,
205
+ default: () => getConfig().form.titleColon
206
+ },
207
+ titleAsterisk: {
208
+ type: Boolean as PropType<VxeFormPropTypes.TitleAsterisk>,
209
+ default: () => getConfig().form.titleAsterisk
210
+ },
211
+ titleOverflow: {
212
+ type: [Boolean, String] as PropType<VxeFormPropTypes.TitleOverflow>,
213
+ default: () => getConfig().form.titleOverflow
214
+ },
215
+ vertical: {
216
+ type: Boolean as PropType<VxeFormPropTypes.Vertical>,
217
+ default: () => getConfig().form.vertical
218
+ },
219
+ padding: {
220
+ type: Boolean as PropType<VxeFormPropTypes.Padding>,
221
+ default: () => getConfig().form.padding
222
+ },
223
+ className: [String, Function] as PropType<VxeFormPropTypes.ClassName>,
224
+ readonly: Boolean as PropType<VxeFormPropTypes.Readonly>,
225
+ disabled: Boolean as PropType<VxeFormPropTypes.Disabled>,
226
+ items: Array as PropType<VxeFormPropTypes.Items>,
227
+ rules: Object as PropType<VxeFormPropTypes.Rules>,
228
+ preventSubmit: {
229
+ type: Boolean as PropType<VxeFormPropTypes.PreventSubmit>,
230
+ default: () => getConfig().form.preventSubmit
231
+ },
232
+ validConfig: Object as PropType<VxeFormPropTypes.ValidConfig>,
233
+ tooltipConfig: Object as PropType<VxeFormPropTypes.TooltipConfig>,
234
+ collapseConfig: Object as PropType<VxeFormPropTypes.CollapseConfig>,
235
+ customLayout: {
236
+ type: Boolean as PropType<VxeFormPropTypes.CustomLayout>,
237
+ default: () => getConfig().form.customLayout
238
+ },
239
+ params: Object as PropType<VxeFormPropTypes.Params>
240
+ },
241
+ emits: [
242
+ 'update:collapseStatus',
243
+ 'collapse',
244
+ 'toggle-collapse',
245
+ 'submit',
246
+ 'submit-invalid',
247
+ 'reset'
248
+ ] as VxeFormEmits,
249
+ setup (props, context) {
250
+ const { slots, emit } = context
251
+
252
+ const $xeGrid = inject<(VxeGridConstructor & VxeGridPrivateMethods) | null>('$xeGrid', null)
253
+
254
+ const xID = XEUtils.uniqueId()
255
+
256
+ const { computeSize } = useSize(props)
257
+
258
+ const reactData = reactive<FormReactData>({
259
+ collapseAll: props.collapseStatus,
260
+ staticItems: [],
261
+ formItems: [],
262
+ itemWidth: 0
263
+ })
264
+
265
+ const internalData = createInternalData()
266
+
267
+ const refElem = ref<HTMLFormElement>()
268
+ const refTooltip = ref() as Ref<VxeTooltipInstance>
269
+
270
+ let formMethods = {} as FormMethods
271
+
272
+ const computeValidOpts = computed(() => {
273
+ return Object.assign({}, getConfig().form.validConfig, props.validConfig)
274
+ })
275
+
276
+ const computeTooltipOpts = computed(() => {
277
+ return Object.assign({}, getConfig().tooltip, getConfig().form.tooltipConfig, props.tooltipConfig)
278
+ })
279
+
280
+ const computeCollapseOpts = computed(() => {
281
+ return Object.assign({}, getConfig().form.collapseConfig, props.collapseConfig)
282
+ })
283
+
284
+ const computeAutoItemWidthList = computed(() => {
285
+ const { titleWidth: allTitleWidth, vertical: allVertical } = props
286
+ const { formItems } = reactData
287
+ const itemList: VxeFormDefines.ItemInfo[] = []
288
+ XEUtils.eachTree(formItems, (item) => {
289
+ const { titleWidth, vertical } = item
290
+ if (titleWidth === 'auto') {
291
+ itemList.push(item)
292
+ } else {
293
+ const itemVertical = XEUtils.eqNull(vertical) ? allVertical : vertical
294
+ const itemTitleWidth = itemVertical ? null : (XEUtils.eqNull(titleWidth) ? allTitleWidth : titleWidth)
295
+ if (itemTitleWidth === 'auto' && (!item.children || !item.children.length)) {
296
+ itemList.push(item)
297
+ }
298
+ }
299
+ }, { children: 'children' })
300
+ return itemList
301
+ })
302
+
303
+ const refMaps: FormPrivateRef = {
304
+ refElem
305
+ }
306
+
307
+ const computeMaps: VxeFormPrivateComputed = {
308
+ computeSize,
309
+ computeValidOpts,
310
+ computeTooltipOpts,
311
+ computeCollapseOpts,
312
+ computeAutoItemWidthList
313
+ }
314
+
315
+ const $xeForm = {
316
+ xID,
317
+ props,
318
+ context,
319
+ reactData,
320
+ internalData,
321
+
322
+ xeGrid: $xeGrid,
323
+ getRefMaps: () => refMaps,
324
+ getComputeMaps: () => computeMaps
325
+ } as unknown as VxeFormConstructor & VxeFormPrivateMethods
326
+
327
+ const callSlot = (slotFunc: ((params: any) => any) | string | null, params: any) => {
328
+ if (slotFunc) {
329
+ if (XEUtils.isString(slotFunc)) {
330
+ slotFunc = slots[slotFunc] || null
331
+ }
332
+ if (XEUtils.isFunction(slotFunc)) {
333
+ return getSlotVNs(slotFunc(params))
334
+ }
335
+ }
336
+ return []
337
+ }
338
+
339
+ const loadItem = (list: VxeFormPropTypes.Items) => {
340
+ if (list.length) {
341
+ list.forEach((item) => {
342
+ if (item.slots) {
343
+ XEUtils.each(item.slots, (func) => {
344
+ if (!XEUtils.isFunction(func)) {
345
+ if (!slots[func]) {
346
+ errLog('vxe.error.notSlot', [`[form] ${func}`])
347
+ }
348
+ }
349
+ })
350
+ }
351
+ })
352
+ }
353
+ reactData.staticItems = XEUtils.mapTree(list, item => createItem($xeForm, item), { children: 'children' })
354
+ internalData.itemFormatCache = {}
355
+ return nextTick().then(() => {
356
+ return recalculate()
357
+ })
358
+ }
359
+
360
+ const getItems = () => {
361
+ const itemList: VxeFormDefines.ItemInfo[] = []
362
+ XEUtils.eachTree(reactData.formItems, item => {
363
+ itemList.push(item)
364
+ }, { children: 'children' })
365
+ return itemList
366
+ }
367
+
368
+ const getItemByField = (field: string) => {
369
+ const rest = XEUtils.findTree(reactData.formItems, item => item.field === field, { children: 'children' })
370
+ return rest ? rest.item : null
371
+ }
372
+
373
+ const getCollapseStatus = () => {
374
+ return reactData.collapseAll
375
+ }
376
+
377
+ const toggleCollapse = () => {
378
+ const status = !getCollapseStatus()
379
+ reactData.collapseAll = status
380
+ emit('update:collapseStatus', status)
381
+ return nextTick()
382
+ }
383
+
384
+ const toggleCollapseEvent = (evnt: Event) => {
385
+ const actionRest = toggleCollapse()
386
+ const status = getCollapseStatus()
387
+ formMethods.dispatchEvent('toggle-collapse', { status, collapse: status, data: props.data }, evnt)
388
+ formMethods.dispatchEvent('collapse', { status, collapse: status, data: props.data }, evnt)
389
+ actionRest.then(() => {
390
+ recalculate().then(() => {
391
+ if ($xeGrid) {
392
+ $xeGrid.recalculate(true)
393
+ }
394
+ })
395
+ if ($xeGrid) {
396
+ $xeGrid.recalculate()
397
+ }
398
+ })
399
+ }
400
+
401
+ const clearValidate = (fieldOrItem?: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[]) => {
402
+ if (fieldOrItem) {
403
+ let fields: any = fieldOrItem
404
+ if (!XEUtils.isArray(fieldOrItem)) {
405
+ fields = [fieldOrItem]
406
+ }
407
+ fields.forEach((field: any) => {
408
+ if (field) {
409
+ const item = handleFieldOrItem($xeForm, field)
410
+ if (item) {
411
+ item.showError = false
412
+ item.showIconMsg = false
413
+ }
414
+ }
415
+ })
416
+ } else {
417
+ getItems().forEach((item) => {
418
+ item.showError = false
419
+ item.showIconMsg = false
420
+ })
421
+ }
422
+ return nextTick()
423
+ }
424
+
425
+ const getResetValue = (item: VxeFormDefines.ItemInfo, data: any, itemValue: any) => {
426
+ const { field, resetValue } = item
427
+ if (XEUtils.isFunction(resetValue)) {
428
+ return resetValue({ field, item, data, $form: $xeForm, $grid: $xeGrid })
429
+ } else if (XEUtils.eqNull(resetValue)) {
430
+ // 默认
431
+ if (XEUtils.isArray(itemValue)) {
432
+ return []
433
+ }
434
+ }
435
+ return resetValue
436
+ }
437
+
438
+ const reset = () => {
439
+ const { data } = props
440
+ const itemList = getItems()
441
+ if (data) {
442
+ itemList.forEach((item) => {
443
+ const { field, itemRender } = item
444
+ if (isEnableConf(itemRender)) {
445
+ const { name, startField, endField } = itemRender
446
+ const compConf = renderer.get(name)
447
+ const fiResetMethod = compConf ? (compConf.formItemResetMethod || compConf.itemResetMethod) : null
448
+ if (compConf && fiResetMethod) {
449
+ fiResetMethod({ data, field, property: field, item, $form: $xeForm, $grid: $xeGrid })
450
+ } else if (field) {
451
+ const itemValue = XEUtils.get(data, field)
452
+ XEUtils.set(data, field, getResetValue(item, data, itemValue))
453
+ }
454
+ if (startField && endField) {
455
+ XEUtils.set(data, startField, getResetValue(item, data, XEUtils.get(data, startField)))
456
+ XEUtils.set(data, endField, getResetValue(item, data, XEUtils.get(data, endField)))
457
+ }
458
+ }
459
+ })
460
+ }
461
+ internalData.itemFormatCache = {}
462
+ clearValidate()
463
+ return recalculate()
464
+ }
465
+
466
+ const resetEvent = (evnt: Event) => {
467
+ evnt.preventDefault()
468
+ reset()
469
+ formMethods.dispatchEvent('reset', { data: props.data }, evnt)
470
+ }
471
+
472
+ const handleFocus = (fields: string[]) => {
473
+ const el = refElem.value
474
+ if (el) {
475
+ for (let i = 0; i < fields.length; i++) {
476
+ const field = fields[i]
477
+ const item = getItemByField(field)
478
+ if (item && isEnableConf(item.itemRender)) {
479
+ const { itemRender } = item
480
+ const compConf = renderer.get(itemRender.name)
481
+ // 定位到第一个
482
+ if (!i) {
483
+ scrollToView(el.querySelector(`.${item.id}`))
484
+ }
485
+ let inputElem: HTMLElement | null = null
486
+ const autoFocus = itemRender.autoFocus || itemRender.autofocus || (compConf ? compConf.formItemAutoFocus : null)
487
+ // 如果指定了聚焦 class
488
+ if (XEUtils.isFunction(autoFocus)) {
489
+ inputElem = autoFocus({ $form: $xeForm, $grid: $xeGrid, item, data: props.data, field })
490
+ } else {
491
+ if (autoFocus === true) {
492
+ // 自动匹配模式,会自动匹配第一个可输入元素
493
+ inputElem = el.querySelector(`.${item.id} input,textarea`)
494
+ } else if (autoFocus) {
495
+ inputElem = el.querySelector(`.${item.id} ${autoFocus}`) as HTMLInputElement
496
+ }
497
+ }
498
+ if (inputElem) {
499
+ inputElem.focus()
500
+ break
501
+ }
502
+ }
503
+ }
504
+ }
505
+ }
506
+
507
+ /**
508
+ * 校验数据
509
+ * 按表格行、列顺序依次校验(同步或异步)
510
+ * 校验规则根据索引顺序依次校验,如果是异步则会等待校验完成才会继续校验下一列
511
+ * 如果校验失败则,触发回调或者 Promise<(ErrMap 校验不通过列的信息)>
512
+ * 如果是传回调方式这返回一个 (ErrMap 校验不通过列的信息)
513
+ *
514
+ * rule 配置:
515
+ * required=Boolean 是否必填
516
+ * min=Number 最小长度
517
+ * max=Number 最大长度
518
+ * validator=Function({ itemValue, rule, rules, data, property }) 自定义校验,接收一个 Promise
519
+ * trigger=change 触发方式
520
+ */
521
+ const validItemRules = (validType: string, fields: string | string[], val?: any): Promise<VxeFormDefines.ValidateErrorMapParams | undefined> => {
522
+ const { data, rules: formRules } = props
523
+ const errorMaps: VxeFormDefines.ValidateErrorMapParams = {}
524
+ if (!XEUtils.isArray(fields)) {
525
+ fields = [fields]
526
+ }
527
+ return Promise.all(
528
+ fields.map((property) => {
529
+ const errorRules: Rule[] = []
530
+ const syncVailds: Promise<any>[] = []
531
+ if (property && formRules) {
532
+ const rules = XEUtils.get(formRules, property)
533
+ if (rules) {
534
+ const itemValue = XEUtils.isUndefined(val) ? XEUtils.get(data, property) : val
535
+ rules.forEach((rule) => {
536
+ const { trigger, validator } = rule
537
+ if (validType === 'all' || !trigger || validType === trigger) {
538
+ if (validator) {
539
+ const validParams = {
540
+ itemValue,
541
+ rule,
542
+ rules,
543
+ data,
544
+ field: property,
545
+ property,
546
+ $form: $xeForm
547
+ }
548
+ let customValid: any
549
+ if (XEUtils.isString(validator)) {
550
+ const gvItem = validators.get(validator)
551
+ if (gvItem) {
552
+ const validatorMethod = gvItem.formItemValidatorMethod || gvItem.itemValidatorMethod
553
+ if (validatorMethod) {
554
+ customValid = validatorMethod(validParams)
555
+ } else {
556
+ warnLog('vxe.error.notValidators', [`[form] ${validator}`])
557
+ }
558
+ } else {
559
+ errLog('vxe.error.notValidators', [`[form] ${validator}`])
560
+ }
561
+ } else {
562
+ customValid = validator(validParams)
563
+ }
564
+ if (customValid) {
565
+ if (XEUtils.isError(customValid)) {
566
+ errorRules.push(new Rule({ type: 'custom', trigger, content: customValid.message, rule: new Rule(rule) }))
567
+ } else if (customValid.catch) {
568
+ // 如果为异步校验(注:异步校验是并发无序的)
569
+ syncVailds.push(
570
+ customValid.catch((e: any) => {
571
+ errorRules.push(new Rule({ type: 'custom', trigger, content: e ? e.message : (rule.content || rule.message), rule: new Rule(rule) }))
572
+ })
573
+ )
574
+ }
575
+ }
576
+ } else {
577
+ if (!checkRuleStatus(rule, data, itemValue)) {
578
+ errorRules.push(new Rule(rule))
579
+ }
580
+ }
581
+ }
582
+ })
583
+ }
584
+ }
585
+ return Promise.all(syncVailds).then(() => {
586
+ if (errorRules.length) {
587
+ errorMaps[property] = errorRules.map(rule => {
588
+ return {
589
+ $form: $xeForm,
590
+ rule,
591
+ data,
592
+ field: property,
593
+ property
594
+ }
595
+ })
596
+ }
597
+ })
598
+ })
599
+ ).then(() => {
600
+ if (!XEUtils.isEmpty(errorMaps)) {
601
+ return Promise.reject(errorMaps)
602
+ }
603
+ })
604
+ }
605
+
606
+ const beginValidate = (itemList: VxeFormDefines.ItemInfo[], type?: string, callback?: any): Promise<VxeFormDefines.ValidateErrorMapParams | void> => {
607
+ const { data, rules: formRules } = props
608
+ const validOpts = computeValidOpts.value
609
+ const validRest: any = {}
610
+ const validFields: string[] = []
611
+ const itemValids: any[] = []
612
+ clearTimeout(internalData.meTimeout)
613
+ if (data && formRules) {
614
+ itemList.forEach((item) => {
615
+ const { field } = item
616
+ if (field && !isHiddenItem($xeForm, item) && isActiveItem($xeForm, item)) {
617
+ itemValids.push(
618
+ validItemRules(type || 'all', field).then(() => {
619
+ item.errRule = null
620
+ }).catch((errorMaps: VxeFormDefines.ValidateErrorMapParams) => {
621
+ const rest = errorMaps[field]
622
+ if (!validRest[field]) {
623
+ validRest[field] = []
624
+ }
625
+ validRest[field].push(rest)
626
+ validFields.push(field)
627
+ item.errRule = rest[0].rule
628
+ return Promise.reject(rest)
629
+ })
630
+ )
631
+ }
632
+ })
633
+ return Promise.all(itemValids).then(() => {
634
+ if (callback) {
635
+ callback()
636
+ }
637
+ }).catch(() => {
638
+ return new Promise<void>((resolve) => {
639
+ internalData.meTimeout = setTimeout(() => {
640
+ itemList.forEach((item) => {
641
+ if (item.errRule) {
642
+ item.showError = true
643
+ }
644
+ })
645
+ }, 20)
646
+ if (validOpts.autoPos !== false) {
647
+ nextTick(() => {
648
+ handleFocus(validFields)
649
+ })
650
+ }
651
+ if (callback) {
652
+ callback(validRest)
653
+ resolve()
654
+ } else {
655
+ resolve(validRest)
656
+ }
657
+ })
658
+ })
659
+ }
660
+ if (callback) {
661
+ callback()
662
+ }
663
+ return Promise.resolve()
664
+ }
665
+
666
+ const validate = (callback: any): Promise<any> => {
667
+ const { readonly } = props
668
+ clearValidate()
669
+ if (readonly) {
670
+ return nextTick()
671
+ }
672
+ return beginValidate(getItems(), '', callback).then((params) => {
673
+ recalculate()
674
+ return params
675
+ })
676
+ }
677
+
678
+ const validateField = (fieldOrItem: VxeFormItemPropTypes.Field | VxeFormItemPropTypes.Field[] | VxeFormDefines.ItemInfo | VxeFormDefines.ItemInfo[], callback: any) => {
679
+ const { readonly } = props
680
+ if (readonly) {
681
+ return nextTick()
682
+ }
683
+ let fields: any[] = []
684
+ if (fieldOrItem) {
685
+ if (XEUtils.isArray(fieldOrItem)) {
686
+ fields = fieldOrItem
687
+ } else {
688
+ fields = [fieldOrItem]
689
+ }
690
+ }
691
+ const itemList = fields.map(field => handleFieldOrItem($xeForm, field)) as VxeFormDefines.ItemInfo[]
692
+ return beginValidate(itemList, '', callback).then((params) => {
693
+ recalculate()
694
+ return params
695
+ })
696
+ }
697
+
698
+ const handleSubmitEvent = (evnt: Event) => {
699
+ const { readonly } = props
700
+ clearValidate()
701
+ if (readonly) {
702
+ $xeForm.dispatchEvent('submit', { data: props.data }, evnt)
703
+ recalculate()
704
+ return
705
+ }
706
+ beginValidate(getItems()).then((errMap) => {
707
+ if (errMap) {
708
+ $xeForm.dispatchEvent('submit-invalid', { data: props.data, errMap }, evnt)
709
+ } else {
710
+ $xeForm.dispatchEvent('submit', { data: props.data }, evnt)
711
+ }
712
+ recalculate()
713
+ })
714
+ }
715
+
716
+ const submitEvent = (evnt: Event) => {
717
+ evnt.preventDefault()
718
+ if (!props.preventSubmit) {
719
+ handleSubmitEvent(evnt)
720
+ }
721
+ }
722
+
723
+ const closeTooltip = () => {
724
+ const { tooltipStore } = internalData
725
+ const $tooltip = refTooltip.value
726
+ if (tooltipStore.visible) {
727
+ Object.assign(tooltipStore, {
728
+ item: null,
729
+ visible: false
730
+ })
731
+ if ($tooltip) {
732
+ $tooltip.close()
733
+ }
734
+ }
735
+ return nextTick()
736
+ }
737
+
738
+ const triggerTitleTipEvent = (evnt: MouseEvent, params: {
739
+ item: VxeFormDefines.ItemInfo;
740
+ }) => {
741
+ const { item } = params
742
+ const { tooltipStore } = internalData
743
+ const $tooltip = refTooltip.value
744
+ const overflowElem = (evnt.currentTarget as HTMLDivElement).children[0]
745
+ const content = (overflowElem.textContent || '').trim()
746
+ const isCellOverflow = overflowElem.scrollWidth > overflowElem.clientWidth
747
+ clearTimeout(internalData.stTimeout)
748
+ if (tooltipStore.item !== item) {
749
+ closeTooltip()
750
+ }
751
+ if (content && isCellOverflow) {
752
+ Object.assign(tooltipStore, {
753
+ item,
754
+ visible: true
755
+ })
756
+ if ($tooltip) {
757
+ $tooltip.open(overflowElem, content)
758
+ }
759
+ }
760
+ }
761
+
762
+ const handleTitleTipLeaveEvent = () => {
763
+ const tooltipOpts = computeTooltipOpts.value
764
+ let $tooltip = refTooltip.value
765
+ if ($tooltip) {
766
+ $tooltip.setActived(false)
767
+ }
768
+ if (tooltipOpts.enterable) {
769
+ internalData.stTimeout = setTimeout(() => {
770
+ $tooltip = refTooltip.value
771
+ if ($tooltip && !$tooltip.isActived()) {
772
+ closeTooltip()
773
+ }
774
+ }, tooltipOpts.leaveDelay)
775
+ } else {
776
+ closeTooltip()
777
+ }
778
+ }
779
+
780
+ const triggerItemEvent = (evnt: Event, field: string, itemValue?: any) => {
781
+ if (field) {
782
+ return validItemRules(evnt ? (['blur'].includes(evnt.type) ? 'blur' : 'change') : 'all', field, itemValue)
783
+ .then(() => {
784
+ clearValidate(field)
785
+ })
786
+ .catch((errorMaps: VxeFormDefines.ValidateErrorMapParams) => {
787
+ const rest = errorMaps[field]
788
+ const item = getItemByField(field)
789
+ if (rest && item) {
790
+ item.showError = true
791
+ item.errRule = rest[0].rule
792
+ }
793
+ })
794
+ }
795
+ return nextTick()
796
+ }
797
+
798
+ /**
799
+ * 更新项状态
800
+ * 如果组件值 v-model 发生 change 时,调用改函数用于更新某一项编辑状态
801
+ * 如果单元格配置了校验规则,则会进行校验
802
+ */
803
+ const updateStatus = (scope: any, itemValue?: any) => {
804
+ const { field } = scope
805
+ return triggerItemEvent(new Event('change'), field, itemValue)
806
+ }
807
+
808
+ const recalculate = () => {
809
+ const autoItemWidthList = computeAutoItemWidthList.value
810
+ const el = refElem.value
811
+ if (el && autoItemWidthList.length) {
812
+ const itemElList = el.querySelectorAll<HTMLElement>(autoItemWidthList.map(item => `.vxe-form--item-title[itemid="${item.id}"]`).join(','))
813
+ let maxItemWidth = 0
814
+ XEUtils.arrayEach(itemElList, itemEl => {
815
+ itemEl.style.width = ''
816
+ maxItemWidth = Math.max(maxItemWidth, Math.ceil(itemEl.clientWidth + 2))
817
+ })
818
+ XEUtils.arrayEach(itemElList, itemEl => {
819
+ itemEl.style.width = `${maxItemWidth}px`
820
+ })
821
+ }
822
+ return nextTick()
823
+ }
824
+
825
+ const handleGlobalResizeEvent = () => {
826
+ recalculate()
827
+ }
828
+
829
+ formMethods = {
830
+ dispatchEvent (type, params, evnt) {
831
+ emit(type, createEvent(evnt, { $form: $xeForm, $grid: $xeGrid }, params))
832
+ },
833
+ reset,
834
+ validate,
835
+ validateField,
836
+ clearValidate,
837
+ updateStatus,
838
+ toggleCollapse,
839
+ getItems,
840
+ getItemByField,
841
+ closeTooltip,
842
+ recalculate
843
+ }
844
+
845
+ const formPrivateMethods: VxeFormPrivateMethods = {
846
+ callSlot,
847
+ triggerItemEvent,
848
+ toggleCollapseEvent,
849
+ triggerTitleTipEvent,
850
+ handleTitleTipLeaveEvent,
851
+ handleValidIconEvent (evnt, params) {
852
+ const { item } = params
853
+ item.showIconMsg = !item.showIconMsg
854
+ },
855
+ handleSubmitEvent
856
+ }
857
+
858
+ Object.assign($xeForm, formMethods, formPrivateMethods)
859
+
860
+ const renderVN = () => {
861
+ const { loading, border, className, data, customLayout } = props
862
+ const { formItems } = reactData
863
+ const vSize = computeSize.value
864
+ const tooltipOpts = computeTooltipOpts.value
865
+ const defaultSlot = slots.default
866
+ return h('form', {
867
+ ref: refElem,
868
+ class: ['vxe-form', className ? (XEUtils.isFunction(className) ? className({ items: formItems, data, $form: $xeForm }) : className) : '', {
869
+ [`size--${vSize}`]: vSize,
870
+ 'is--border': border,
871
+ 'custom--layout': customLayout,
872
+ 'is--loading': loading
873
+ }],
874
+ onSubmit: submitEvent,
875
+ onReset: resetEvent
876
+ }, [
877
+ h('div', {
878
+ class: 'vxe-form--wrapper vxe-form--item-row'
879
+ }, customLayout
880
+ ? (defaultSlot ? defaultSlot({}) : [])
881
+ : formItems.map((item, index) => {
882
+ return h(VxeFormConfigItem, {
883
+ key: index,
884
+ itemConfig: item
885
+ })
886
+ })),
887
+ h('div', {
888
+ class: 'vxe-form-slots',
889
+ ref: 'hideItem'
890
+ }, customLayout ? [] : (defaultSlot ? defaultSlot({}) : [])),
891
+ /**
892
+ * 加载中
893
+ */
894
+ h(VxeLoadingComponent, {
895
+ class: 'vxe-form--loading',
896
+ modelValue: loading
897
+ }),
898
+ /**
899
+ * 工具提示
900
+ */
901
+ h(VxeTooltipComponent, {
902
+ ref: refTooltip,
903
+ ...tooltipOpts
904
+ })
905
+ ])
906
+ }
907
+
908
+ const recalcFlag = ref(0)
909
+ watch(() => props.vertical, () => {
910
+ recalcFlag.value++
911
+ })
912
+ watch(() => props.titleWidth, () => {
913
+ recalcFlag.value++
914
+ })
915
+ watch(recalcFlag, () => {
916
+ nextTick().then(() => {
917
+ recalculate()
918
+ })
919
+ })
920
+
921
+ const staticItemFlag = ref(0)
922
+ watch(() => reactData.staticItems.length, () => {
923
+ staticItemFlag.value++
924
+ })
925
+ watch(() => reactData.staticItems, () => {
926
+ staticItemFlag.value++
927
+ })
928
+ watch(staticItemFlag, () => {
929
+ reactData.formItems = reactData.staticItems
930
+ recalcFlag.value++
931
+ })
932
+
933
+ const itemFlag = ref(0)
934
+ watch(() => props.items ? props.items.length : -1, () => {
935
+ itemFlag.value++
936
+ })
937
+ watch(() => props.items, () => {
938
+ itemFlag.value++
939
+ })
940
+ watch(itemFlag, () => {
941
+ loadItem(props.items || [])
942
+ })
943
+
944
+ watch(() => props.collapseStatus, (value) => {
945
+ reactData.collapseAll = !!value
946
+ })
947
+
948
+ watch(() => props.readonly, () => {
949
+ clearValidate()
950
+ })
951
+
952
+ watch(() => props.disabled, () => {
953
+ clearValidate()
954
+ })
955
+
956
+ onMounted(() => {
957
+ nextTick(() => {
958
+ if (props.customLayout && props.items) {
959
+ errLog('vxe.error.errConflicts', ['[form] custom-layout', 'items'])
960
+ }
961
+ })
962
+ globalEvents.on($xeForm, 'resize', handleGlobalResizeEvent)
963
+ })
964
+
965
+ onUnmounted(() => {
966
+ globalEvents.off($xeForm, 'resize')
967
+ XEUtils.assign(internalData, createInternalData())
968
+ })
969
+
970
+ if (props.items) {
971
+ loadItem(props.items)
972
+ }
973
+
974
+ provide('xeFormItemInfo', null)
975
+
976
+ provide('$xeForm', $xeForm)
977
+ provide('$xeFormGroup', null)
978
+ provide('$xeFormItem', null)
979
+
980
+ $xeForm.renderVN = renderVN
981
+
982
+ return $xeForm
983
+ },
984
+ render () {
985
+ return this.renderVN()
986
+ }
987
+ })