@smallwei/avue 3.8.2 → 3.8.4

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 (374) hide show
  1. package/README.md +206 -86
  2. package/dist/avue.js +37302 -0
  3. package/dist/avue.js.map +1 -0
  4. package/dist/avue.min.js +6 -0
  5. package/dist/avue.min.mjs +2 -0
  6. package/dist/avue.mjs +2 -0
  7. package/dist/index.css +1 -0
  8. package/es/avue.min.mjs +2 -0
  9. package/es/avue.min.ts +2 -0
  10. package/es/avue.mjs +2 -0
  11. package/es/avue.ts +2 -0
  12. package/es/core/create.mjs +8 -0
  13. package/es/core/create.ts +16 -0
  14. package/es/core/dataformat.mjs +184 -0
  15. package/es/core/dataformat.ts +190 -0
  16. package/es/core/detail.mjs +74 -0
  17. package/es/core/detail.ts +81 -0
  18. package/es/core/dic.mjs +213 -0
  19. package/es/core/dic.ts +235 -0
  20. package/es/core/locale.mjs +8 -0
  21. package/es/core/locale.ts +9 -0
  22. package/es/core/packages.mjs +61 -0
  23. package/es/core/packages.ts +62 -0
  24. package/es/core/slot.mjs +32 -0
  25. package/es/core/slot.ts +30 -0
  26. package/es/global/variable.mjs +80 -0
  27. package/es/global/variable.ts +84 -0
  28. package/es/icon.mjs +9 -0
  29. package/es/icon.ts +11 -0
  30. package/es/index.mjs +127 -0
  31. package/es/index.ts +177 -0
  32. package/es/locale/browser/en.mjs +288 -0
  33. package/es/locale/browser/zh-cn.mjs +288 -0
  34. package/es/locale/browser/zh.mjs +288 -0
  35. package/es/locale/index.mjs +141 -0
  36. package/es/locale/index.ts +196 -0
  37. package/es/locale/lang/en.mjs +282 -0
  38. package/es/locale/lang/en.ts +282 -0
  39. package/es/locale/lang/zh-cn.mjs +282 -0
  40. package/es/locale/lang/zh-cn.ts +282 -0
  41. package/es/locale/lang/zh.mjs +282 -0
  42. package/es/locale/lang/zh.ts +282 -0
  43. package/es/packages/core/common/event.mjs +58 -0
  44. package/es/packages/core/common/event.ts +56 -0
  45. package/es/packages/core/common/init.mjs +134 -0
  46. package/es/packages/core/common/init.ts +133 -0
  47. package/es/packages/core/common/props.mjs +239 -0
  48. package/es/packages/core/common/props.ts +240 -0
  49. package/es/packages/core/components/dialog-form/index.mjs +29 -0
  50. package/es/packages/core/components/dialog-form/index.ts +29 -0
  51. package/es/packages/core/components/dialog-form/index.vue +108 -0
  52. package/es/packages/core/components/form/custom.mjs +41 -0
  53. package/es/packages/core/components/form/custom.ts +41 -0
  54. package/es/packages/core/components/form/index.vue +176 -0
  55. package/es/packages/core/components/icon/index.vue +37 -0
  56. package/es/packages/core/components/image-preview/index.mjs +34 -0
  57. package/es/packages/core/components/image-preview/index.ts +37 -0
  58. package/es/packages/core/components/image-preview/index.vue +215 -0
  59. package/es/packages/core/directive/contextmenu.mjs +92 -0
  60. package/es/packages/core/directive/contextmenu.ts +103 -0
  61. package/es/packages/core/directive/permission.mjs +19 -0
  62. package/es/packages/core/directive/permission.ts +18 -0
  63. package/es/packages/data/box/index.vue +66 -0
  64. package/es/packages/data/card/index.vue +62 -0
  65. package/es/packages/data/cardText/index.vue +56 -0
  66. package/es/packages/data/countdown/index.vue +81 -0
  67. package/es/packages/data/dashboard/index.vue +72 -0
  68. package/es/packages/data/display/index.vue +63 -0
  69. package/es/packages/data/icons/index.vue +68 -0
  70. package/es/packages/data/imgText/index.vue +72 -0
  71. package/es/packages/data/list/index.vue +69 -0
  72. package/es/packages/data/notice/index.vue +63 -0
  73. package/es/packages/data/operaText/index.vue +62 -0
  74. package/es/packages/data/panel/index.vue +62 -0
  75. package/es/packages/data/pay/index.vue +92 -0
  76. package/es/packages/data/price/index.vue +55 -0
  77. package/es/packages/data/product/index.vue +106 -0
  78. package/es/packages/data/profile/index.vue +91 -0
  79. package/es/packages/data/progress/index.vue +64 -0
  80. package/es/packages/data/rank/index.vue +92 -0
  81. package/es/packages/data/rotate/index.vue +69 -0
  82. package/es/packages/data/statistic/index.vue +71 -0
  83. package/es/packages/data/tabs/index.vue +64 -0
  84. package/es/packages/data/task/index.vue +82 -0
  85. package/es/packages/data/weather/index.vue +103 -0
  86. package/es/packages/element-plus/array/index.vue +115 -0
  87. package/es/packages/element-plus/article/index.vue +73 -0
  88. package/es/packages/element-plus/card/index.vue +103 -0
  89. package/es/packages/element-plus/cascader/index.vue +132 -0
  90. package/es/packages/element-plus/chat/index.vue +513 -0
  91. package/es/packages/element-plus/checkbox/index.vue +84 -0
  92. package/es/packages/element-plus/comment/index.vue +76 -0
  93. package/es/packages/element-plus/count-up/index.vue +109 -0
  94. package/es/packages/element-plus/crud/column/column-default.vue +128 -0
  95. package/es/packages/element-plus/crud/column/column-dynamic.vue +86 -0
  96. package/es/packages/element-plus/crud/column/column-menu.vue +267 -0
  97. package/es/packages/element-plus/crud/column/column-slot.vue +348 -0
  98. package/es/packages/element-plus/crud/column/column.vue +119 -0
  99. package/es/packages/element-plus/crud/column/menu.vue +78 -0
  100. package/es/packages/element-plus/crud/config.mjs +74 -0
  101. package/es/packages/element-plus/crud/config.ts +74 -0
  102. package/es/packages/element-plus/crud/dialog/dialog-column.vue +102 -0
  103. package/es/packages/element-plus/crud/dialog/dialog-excel.vue +204 -0
  104. package/es/packages/element-plus/crud/dialog/dialog-filter.vue +159 -0
  105. package/es/packages/element-plus/crud/dialog/dialog-form.vue +352 -0
  106. package/es/packages/element-plus/crud/grid/index.vue +271 -0
  107. package/es/packages/element-plus/crud/grid/item.vue +39 -0
  108. package/es/packages/element-plus/crud/index.vue +1018 -0
  109. package/es/packages/element-plus/crud/menu/header-menu.vue +175 -0
  110. package/es/packages/element-plus/crud/menu/header-search.vue +228 -0
  111. package/es/packages/element-plus/crud/menu/table-page.vue +108 -0
  112. package/es/packages/element-plus/date/index.vue +81 -0
  113. package/es/packages/element-plus/draggable/index.vue +444 -0
  114. package/es/packages/element-plus/dynamic/index.vue +353 -0
  115. package/es/packages/element-plus/flow/index.vue +339 -0
  116. package/es/packages/element-plus/flow/node.vue +84 -0
  117. package/es/packages/element-plus/form/config.mjs +6 -0
  118. package/es/packages/element-plus/form/config.ts +6 -0
  119. package/es/packages/element-plus/form/index.vue +954 -0
  120. package/es/packages/element-plus/form/menu.vue +63 -0
  121. package/es/packages/element-plus/group/index.vue +90 -0
  122. package/es/packages/element-plus/input/index.vue +1264 -0
  123. package/es/packages/element-plus/input-color/index.vue +70 -0
  124. package/es/packages/element-plus/input-cron/index.vue +363 -0
  125. package/es/packages/element-plus/input-icon/index.vue +143 -0
  126. package/es/packages/element-plus/input-map/index.vue +311 -0
  127. package/es/packages/element-plus/input-number/index.vue +91 -0
  128. package/es/packages/element-plus/input-table/index.vue +279 -0
  129. package/es/packages/element-plus/input-tag/index.vue +79 -0
  130. package/es/packages/element-plus/input-tree/index.vue +194 -0
  131. package/es/packages/element-plus/license/index.vue +155 -0
  132. package/es/packages/element-plus/login/index.vue +203 -0
  133. package/es/packages/element-plus/mention/index.vue +117 -0
  134. package/es/packages/element-plus/radio/index.vue +38 -0
  135. package/es/packages/element-plus/rate/index.vue +51 -0
  136. package/es/packages/element-plus/search/index.vue +129 -0
  137. package/es/packages/element-plus/select/index.vue +292 -0
  138. package/es/packages/element-plus/sign/index.vue +230 -0
  139. package/es/packages/element-plus/slider/index.vue +66 -0
  140. package/es/packages/element-plus/switch/index.vue +72 -0
  141. package/es/packages/element-plus/tabs/index.vue +62 -0
  142. package/es/packages/element-plus/text-ellipsis/index.vue +104 -0
  143. package/es/packages/element-plus/time/index.vue +81 -0
  144. package/es/packages/element-plus/title/index.vue +30 -0
  145. package/es/packages/element-plus/tree/index.vue +460 -0
  146. package/es/packages/element-plus/upload/index.vue +728 -0
  147. package/es/packages/element-plus/verify/index.vue +62 -0
  148. package/es/packages/element-plus/video/index.vue +90 -0
  149. package/es/plugin/ali/index.mjs +4 -0
  150. package/es/plugin/ali/index.ts +6 -0
  151. package/es/plugin/clipboard/index.mjs +61 -0
  152. package/es/plugin/clipboard/index.ts +67 -0
  153. package/es/plugin/export/_blob.mjs +151 -0
  154. package/es/plugin/export/_blob.ts +176 -0
  155. package/es/plugin/export/_export2Excel.mjs +141 -0
  156. package/es/plugin/export/_export2Excel.ts +166 -0
  157. package/es/plugin/export/index.mjs +263 -0
  158. package/es/plugin/export/index.ts +274 -0
  159. package/es/plugin/logs/index.mjs +46 -0
  160. package/es/plugin/logs/index.ts +66 -0
  161. package/es/plugin/print/index.mjs +145 -0
  162. package/es/plugin/print/index.ts +155 -0
  163. package/es/plugin/qiniu/index.mjs +78 -0
  164. package/es/plugin/qiniu/index.ts +88 -0
  165. package/es/plugin/screenshot/index.mjs +8 -0
  166. package/es/plugin/screenshot/index.ts +9 -0
  167. package/es/plugin/video/index.mjs +52 -0
  168. package/es/plugin/video/index.ts +60 -0
  169. package/es/plugin/watermark/index.mjs +114 -0
  170. package/es/plugin/watermark/index.ts +127 -0
  171. package/es/plugin/watermark/watermark.mjs +109 -0
  172. package/es/plugin/watermark/watermark.ts +121 -0
  173. package/es/ui/data/index.mjs +49 -0
  174. package/es/ui/data/index.ts +51 -0
  175. package/es/ui/element-plus/index.mjs +87 -0
  176. package/es/ui/element-plus/index.ts +89 -0
  177. package/es/ui/index.mjs +4 -0
  178. package/es/ui/index.ts +6 -0
  179. package/es/utils/bem.mjs +29 -0
  180. package/es/utils/bem.ts +36 -0
  181. package/es/utils/mock.mjs +137 -0
  182. package/es/utils/mock.ts +151 -0
  183. package/es/utils/util.mjs +370 -0
  184. package/es/utils/util.ts +392 -0
  185. package/es/utils/validate.mjs +18 -0
  186. package/es/utils/validate.ts +23 -0
  187. package/es/version.mjs +1 -0
  188. package/es/version.ts +1 -0
  189. package/lib/avue.js +11 -35880
  190. package/lib/avue.min.js +11 -6
  191. package/lib/avue.min.ts +2 -0
  192. package/lib/avue.ts +2 -0
  193. package/lib/core/create.js +14 -0
  194. package/lib/core/create.ts +16 -0
  195. package/lib/core/dataformat.js +194 -0
  196. package/lib/core/dataformat.ts +190 -0
  197. package/lib/core/detail.js +81 -0
  198. package/lib/core/detail.ts +81 -0
  199. package/lib/core/dic.js +220 -0
  200. package/lib/core/dic.ts +235 -0
  201. package/lib/core/locale.js +10 -0
  202. package/lib/core/locale.ts +9 -0
  203. package/lib/core/packages.js +66 -0
  204. package/lib/core/packages.ts +62 -0
  205. package/lib/core/slot.js +34 -0
  206. package/lib/core/slot.ts +30 -0
  207. package/lib/global/variable.js +83 -0
  208. package/lib/global/variable.ts +84 -0
  209. package/lib/icon.js +44 -0
  210. package/lib/icon.ts +11 -0
  211. package/lib/index.js +134 -0
  212. package/lib/index.ts +177 -0
  213. package/lib/locale/browser/en.js +288 -0
  214. package/lib/locale/browser/zh-cn.js +288 -0
  215. package/lib/locale/browser/zh.js +288 -0
  216. package/lib/locale/index.js +153 -47
  217. package/lib/locale/index.ts +196 -0
  218. package/lib/locale/lang/en.js +284 -100
  219. package/lib/locale/lang/en.ts +282 -0
  220. package/lib/locale/lang/zh-cn.js +284 -0
  221. package/lib/locale/lang/zh-cn.ts +282 -0
  222. package/lib/locale/lang/zh.js +284 -100
  223. package/lib/locale/lang/zh.ts +282 -0
  224. package/lib/packages/core/common/event.js +61 -0
  225. package/lib/packages/core/common/event.ts +56 -0
  226. package/lib/packages/core/common/init.js +140 -0
  227. package/lib/packages/core/common/init.ts +133 -0
  228. package/lib/packages/core/common/props.js +245 -0
  229. package/lib/packages/core/common/props.ts +240 -0
  230. package/lib/packages/core/components/dialog-form/index.js +35 -0
  231. package/lib/packages/core/components/dialog-form/index.ts +29 -0
  232. package/lib/packages/core/components/dialog-form/index.vue +108 -0
  233. package/lib/packages/core/components/form/custom.js +43 -0
  234. package/lib/packages/core/components/form/custom.ts +41 -0
  235. package/lib/packages/core/components/form/index.vue +176 -0
  236. package/lib/packages/core/components/icon/index.vue +37 -0
  237. package/lib/packages/core/components/image-preview/index.js +40 -0
  238. package/lib/packages/core/components/image-preview/index.ts +37 -0
  239. package/lib/packages/core/components/image-preview/index.vue +215 -0
  240. package/lib/packages/core/directive/contextmenu.js +94 -0
  241. package/lib/packages/core/directive/contextmenu.ts +103 -0
  242. package/lib/packages/core/directive/permission.js +21 -0
  243. package/lib/packages/core/directive/permission.ts +18 -0
  244. package/lib/packages/data/box/index.vue +66 -0
  245. package/lib/packages/data/card/index.vue +62 -0
  246. package/lib/packages/data/cardText/index.vue +56 -0
  247. package/lib/packages/data/countdown/index.vue +81 -0
  248. package/lib/packages/data/dashboard/index.vue +72 -0
  249. package/lib/packages/data/display/index.vue +63 -0
  250. package/lib/packages/data/icons/index.vue +68 -0
  251. package/lib/packages/data/imgText/index.vue +72 -0
  252. package/lib/packages/data/list/index.vue +69 -0
  253. package/lib/packages/data/notice/index.vue +63 -0
  254. package/lib/packages/data/operaText/index.vue +62 -0
  255. package/lib/packages/data/panel/index.vue +62 -0
  256. package/lib/packages/data/pay/index.vue +92 -0
  257. package/lib/packages/data/price/index.vue +55 -0
  258. package/lib/packages/data/product/index.vue +106 -0
  259. package/lib/packages/data/profile/index.vue +91 -0
  260. package/lib/packages/data/progress/index.vue +64 -0
  261. package/lib/packages/data/rank/index.vue +92 -0
  262. package/lib/packages/data/rotate/index.vue +69 -0
  263. package/lib/packages/data/statistic/index.vue +71 -0
  264. package/lib/packages/data/tabs/index.vue +64 -0
  265. package/lib/packages/data/task/index.vue +82 -0
  266. package/lib/packages/data/weather/index.vue +103 -0
  267. package/lib/packages/element-plus/array/index.vue +115 -0
  268. package/lib/packages/element-plus/article/index.vue +73 -0
  269. package/lib/packages/element-plus/card/index.vue +103 -0
  270. package/lib/packages/element-plus/cascader/index.vue +132 -0
  271. package/lib/packages/element-plus/chat/index.vue +513 -0
  272. package/lib/packages/element-plus/checkbox/index.vue +84 -0
  273. package/lib/packages/element-plus/comment/index.vue +76 -0
  274. package/lib/packages/element-plus/count-up/index.vue +109 -0
  275. package/lib/packages/element-plus/crud/column/column-default.vue +128 -0
  276. package/lib/packages/element-plus/crud/column/column-dynamic.vue +86 -0
  277. package/lib/packages/element-plus/crud/column/column-menu.vue +267 -0
  278. package/lib/packages/element-plus/crud/column/column-slot.vue +348 -0
  279. package/lib/packages/element-plus/crud/column/column.vue +119 -0
  280. package/lib/packages/element-plus/crud/column/menu.vue +78 -0
  281. package/lib/packages/element-plus/crud/config.js +76 -0
  282. package/lib/packages/element-plus/crud/config.ts +74 -0
  283. package/lib/packages/element-plus/crud/dialog/dialog-column.vue +102 -0
  284. package/lib/packages/element-plus/crud/dialog/dialog-excel.vue +204 -0
  285. package/lib/packages/element-plus/crud/dialog/dialog-filter.vue +159 -0
  286. package/lib/packages/element-plus/crud/dialog/dialog-form.vue +352 -0
  287. package/lib/packages/element-plus/crud/grid/index.vue +271 -0
  288. package/lib/packages/element-plus/crud/grid/item.vue +39 -0
  289. package/lib/packages/element-plus/crud/index.vue +1018 -0
  290. package/lib/packages/element-plus/crud/menu/header-menu.vue +175 -0
  291. package/lib/packages/element-plus/crud/menu/header-search.vue +228 -0
  292. package/lib/packages/element-plus/crud/menu/table-page.vue +108 -0
  293. package/lib/packages/element-plus/date/index.vue +81 -0
  294. package/lib/packages/element-plus/draggable/index.vue +444 -0
  295. package/lib/packages/element-plus/dynamic/index.vue +353 -0
  296. package/lib/packages/element-plus/flow/index.vue +339 -0
  297. package/lib/packages/element-plus/flow/node.vue +84 -0
  298. package/lib/packages/element-plus/form/config.js +8 -0
  299. package/lib/packages/element-plus/form/config.ts +6 -0
  300. package/lib/packages/element-plus/form/index.vue +954 -0
  301. package/lib/packages/element-plus/form/menu.vue +63 -0
  302. package/lib/packages/element-plus/group/index.vue +90 -0
  303. package/lib/packages/element-plus/input/index.vue +1264 -0
  304. package/lib/packages/element-plus/input-color/index.vue +70 -0
  305. package/lib/packages/element-plus/input-cron/index.vue +363 -0
  306. package/lib/packages/element-plus/input-icon/index.vue +143 -0
  307. package/lib/packages/element-plus/input-map/index.vue +311 -0
  308. package/lib/packages/element-plus/input-number/index.vue +91 -0
  309. package/lib/packages/element-plus/input-table/index.vue +279 -0
  310. package/lib/packages/element-plus/input-tag/index.vue +79 -0
  311. package/lib/packages/element-plus/input-tree/index.vue +194 -0
  312. package/lib/packages/element-plus/license/index.vue +155 -0
  313. package/lib/packages/element-plus/login/index.vue +203 -0
  314. package/lib/packages/element-plus/mention/index.vue +117 -0
  315. package/lib/packages/element-plus/radio/index.vue +38 -0
  316. package/lib/packages/element-plus/rate/index.vue +51 -0
  317. package/lib/packages/element-plus/search/index.vue +129 -0
  318. package/lib/packages/element-plus/select/index.vue +292 -0
  319. package/lib/packages/element-plus/sign/index.vue +230 -0
  320. package/lib/packages/element-plus/slider/index.vue +66 -0
  321. package/lib/packages/element-plus/switch/index.vue +72 -0
  322. package/lib/packages/element-plus/tabs/index.vue +62 -0
  323. package/lib/packages/element-plus/text-ellipsis/index.vue +104 -0
  324. package/lib/packages/element-plus/time/index.vue +81 -0
  325. package/lib/packages/element-plus/title/index.vue +30 -0
  326. package/lib/packages/element-plus/tree/index.vue +460 -0
  327. package/lib/packages/element-plus/upload/index.vue +728 -0
  328. package/lib/packages/element-plus/verify/index.vue +62 -0
  329. package/lib/packages/element-plus/video/index.vue +90 -0
  330. package/lib/plugin/ali/index.js +8 -0
  331. package/lib/plugin/ali/index.ts +6 -0
  332. package/lib/plugin/clipboard/index.js +64 -0
  333. package/lib/plugin/clipboard/index.ts +67 -0
  334. package/lib/plugin/export/_blob.js +151 -0
  335. package/lib/plugin/export/_blob.ts +176 -0
  336. package/lib/plugin/export/_export2Excel.js +145 -0
  337. package/lib/plugin/export/_export2Excel.ts +166 -0
  338. package/lib/plugin/export/index.js +268 -0
  339. package/lib/plugin/export/index.ts +274 -0
  340. package/lib/plugin/logs/index.js +48 -0
  341. package/lib/plugin/logs/index.ts +66 -0
  342. package/lib/plugin/print/index.js +147 -0
  343. package/lib/plugin/print/index.ts +155 -0
  344. package/lib/plugin/qiniu/index.js +82 -0
  345. package/lib/plugin/qiniu/index.ts +88 -0
  346. package/lib/plugin/screenshot/index.js +14 -0
  347. package/lib/plugin/screenshot/index.ts +9 -0
  348. package/lib/plugin/video/index.js +55 -0
  349. package/lib/plugin/video/index.ts +60 -0
  350. package/lib/plugin/watermark/index.js +121 -0
  351. package/lib/plugin/watermark/index.ts +127 -0
  352. package/lib/plugin/watermark/watermark.js +111 -0
  353. package/lib/plugin/watermark/watermark.ts +121 -0
  354. package/lib/ui/data/index.js +54 -0
  355. package/lib/ui/data/index.ts +51 -0
  356. package/lib/ui/element-plus/index.js +92 -0
  357. package/lib/ui/element-plus/index.ts +89 -0
  358. package/lib/ui/index.js +9 -0
  359. package/lib/ui/index.ts +6 -0
  360. package/lib/utils/bem.js +31 -0
  361. package/lib/utils/bem.ts +36 -0
  362. package/lib/utils/mock.js +142 -0
  363. package/lib/utils/mock.ts +151 -0
  364. package/lib/utils/util.js +403 -0
  365. package/lib/utils/util.ts +392 -0
  366. package/lib/utils/validate.js +21 -0
  367. package/lib/utils/validate.ts +23 -0
  368. package/lib/version.js +4 -0
  369. package/lib/version.ts +1 -0
  370. package/package.json +20 -10
  371. package/types/index.d.ts +139 -47
  372. package/types/shims-aliases.d.ts +4 -0
  373. package/lib/avue.js.map +0 -1
  374. package/lib/locale/format.js +0 -44
@@ -0,0 +1,954 @@
1
+ <template>
2
+ <div
3
+ :class="[b(), { 'avue--detail': isDetail }]"
4
+ :style="{ width: setPx(tableOption.formWidth, '100%') }"
5
+ >
6
+ <el-form
7
+ ref="form"
8
+ :status-icon="tableOption.statusIcon"
9
+ @submit.prevent
10
+ :model="form"
11
+ :scroll-to-error="tableOption.scrollToError"
12
+ :hide-required-asterisk="tableOption.hideRequiredAsterisk"
13
+ :require-asterisk-position="tableOption.requireAsteriskPosition"
14
+ :scroll-into-view-options="tableOption.scrollIntoViewOptions"
15
+ :label-suffix="labelSuffix"
16
+ :size="size"
17
+ :label-position="tableOption.labelPosition"
18
+ :label-width="setPx(tableOption.labelWidth, config.labelWidth)"
19
+ >
20
+ <el-row
21
+ :span="24"
22
+ :gutter="tableOption.gutter"
23
+ :class="{ 'avue-form__tabs': isTabs }"
24
+ >
25
+ <avue-group
26
+ v-for="(item, index) in columnOption"
27
+ @change="handleGroupClick"
28
+ :key="item.prop"
29
+ :tabs="isTabs"
30
+ :arrow="item.arrow"
31
+ :collapse="item.collapse"
32
+ :display="vaildDisplay(item)"
33
+ :icon="item.icon"
34
+ :index="index"
35
+ :header="!isTabs"
36
+ :active="activeName"
37
+ :label="item.label"
38
+ >
39
+ <template #tabs>
40
+ <el-tabs
41
+ v-model="activeName"
42
+ @tab-click="handleTabClick"
43
+ :class="b('tabs')"
44
+ :type="tabsType"
45
+ v-if="isTabs && index == 1"
46
+ >
47
+ <template v-for="(tabs, index) in columnOption">
48
+ <el-tab-pane
49
+ v-if="vaildDisplay(tabs) && index != 0"
50
+ :key="index"
51
+ :name="index + ''"
52
+ >
53
+ <template #label>
54
+ <span>
55
+ <slot
56
+ :name="getSlotName(tabs, 'H')"
57
+ :column="tabs"
58
+ v-if="getSlotName(tabs, 'H', $slots)"
59
+ ></slot>
60
+ <template v-else>
61
+ <i :class="tabs.icon">&nbsp;</i>
62
+ {{ tabs.label }}
63
+ </template>
64
+ </span>
65
+ </template>
66
+ </el-tab-pane>
67
+ </template>
68
+ </el-tabs>
69
+ </template>
70
+ <template #header v-if="getSlotName(item, 'H', $slots)">
71
+ <slot :name="getSlotName(item, 'H')" :column="item"></slot>
72
+ </template>
73
+ <div
74
+ :class="b('group', { flex: validData(item.flex, true) })"
75
+ v-if="isGroupShow(item, index, isVerifyAll)"
76
+ v-show="isGroupShow(item, index)"
77
+ >
78
+ <template v-for="(column, cindex) in item.column">
79
+ <el-col
80
+ v-if="vaildDisplay(column)"
81
+ :key="cindex"
82
+ :span="getItemParams(column, item, 'span')"
83
+ :md="getItemParams(column, item, 'span')"
84
+ :sm="getItemParams(column, item, 'span')"
85
+ :xs="getItemParams(column, item, 'xsSpan')"
86
+ :offset="getItemParams(column, item, 'offset')"
87
+ :push="getItemParams(column, item, 'push')"
88
+ :pull="getItemParams(column, item, 'pull')"
89
+ :class="[
90
+ b('row'),
91
+ { 'avue--detail avue--detail__column': vaildDetail(column) },
92
+ column.className,
93
+ ]"
94
+ >
95
+ <el-form-item
96
+ :prop="column.prop"
97
+ :label="column.label"
98
+ :rules="column.rules"
99
+ :class="
100
+ b(
101
+ 'item--' +
102
+ (column.labelPosition ||
103
+ item.labelPosition ||
104
+ tableOption.labelPosition ||
105
+ '')
106
+ )
107
+ "
108
+ :label-position="
109
+ column.labelPosition ||
110
+ item.labelPosition ||
111
+ tableOption.labelPosition
112
+ "
113
+ :label-width="getItemParams(column, item, 'labelWidth', true)"
114
+ >
115
+ <template #label v-if="getSlotName(column, 'L', $slots)">
116
+ <slot
117
+ :name="getSlotName(column, 'L')"
118
+ :column="column"
119
+ :value="form[column.prop]"
120
+ :readonly="column.readonly || readonly"
121
+ :disabled="getDisabled(column)"
122
+ :size="column.size || size"
123
+ :dic="DIC[column.prop]"
124
+ ></slot>
125
+ </template>
126
+ <template #label v-else-if="column.labelTip">
127
+ <el-tooltip
128
+ class="item"
129
+ effect="dark"
130
+ :placement="column.labelTipPlacement || 'top-start'"
131
+ >
132
+ <template #content>
133
+ <div v-html="column.labelTip"></div>
134
+ </template>
135
+ <el-icon>
136
+ <el-icon-info-filled />
137
+ </el-icon>
138
+ </el-tooltip>
139
+ <span> {{ column.label }}{{ labelSuffix }}</span>
140
+ </template>
141
+ <template #error="scope" v-if="getSlotName(column, 'E')">
142
+ <slot
143
+ :name="getSlotName(column, 'E')"
144
+ v-bind="
145
+ Object.assign(scope, {
146
+ column,
147
+ value: form[column.prop],
148
+ readonly: column.readonly || readonly,
149
+ disabled: getDisabled(column),
150
+ size: column.size || size,
151
+ dic: DIC[column.prop],
152
+ })
153
+ "
154
+ ></slot>
155
+ </template>
156
+ <component
157
+ :is="validTip(column) ? 'div' : 'elTooltip'"
158
+ :disabled="validTip(column)"
159
+ :content="validData(column.tip, getPlaceholder(column))"
160
+ :placement="column.tipPlacement"
161
+ >
162
+ <div>
163
+ <slot
164
+ :value="form[column.prop]"
165
+ :column="column"
166
+ :label="form['$' + column.prop]"
167
+ :size="column.size || size"
168
+ :readonly="column.readonly || readonly"
169
+ :disabled="getDisabled(column)"
170
+ :dic="DIC[column.prop]"
171
+ :name="column.prop"
172
+ v-if="$slots[column.prop]"
173
+ ></slot>
174
+ <form-temp
175
+ :column="column"
176
+ v-else
177
+ :box-type="boxType"
178
+ :ref="column.prop"
179
+ :dic="DIC[column.prop]"
180
+ :props="tableOption.props"
181
+ :propsHttp="tableOption.propsHttp"
182
+ :render="column.render"
183
+ :row="form"
184
+ :clearValidate="clearValidate"
185
+ :table-data="tableData"
186
+ :readonly="column.readonly || readonly"
187
+ v-bind="$uploadFun(column)"
188
+ :disabled="getDisabled(column)"
189
+ :enter="tableOption.enter"
190
+ :size="size"
191
+ v-model="form[column.prop]"
192
+ @enter="submit"
193
+ :column-slot="columnSlot"
194
+ @change="propChange(item.column, column)"
195
+ >
196
+ <template
197
+ #="scope"
198
+ v-if="getSlotName(column, 'T', $slots)"
199
+ >
200
+ <slot
201
+ :name="getSlotName(column, 'T')"
202
+ v-bind="scope"
203
+ ></slot>
204
+ </template>
205
+ <template v-for="item in columnSlot" #[item]="scope">
206
+ <slot v-bind="scope" :name="item"></slot>
207
+ </template>
208
+ </form-temp>
209
+ </div>
210
+ </component>
211
+ </el-form-item>
212
+ </el-col>
213
+ <div
214
+ :class="b('line')"
215
+ v-if="shouldShowDivider(column)"
216
+ :key="`line${cindex}`"
217
+ :style="{ width: (column.count / 24) * 100 + '%' }"
218
+ ></div>
219
+ </template>
220
+ <form-menu v-if="!isMenu">
221
+ <template #menu-form-before="scope">
222
+ <slot name="menu-form-before" v-bind="scope"></slot>
223
+ </template>
224
+ <template #menu-form="scope">
225
+ <slot name="menu-form" v-bind="scope"></slot>
226
+ </template>
227
+ </form-menu>
228
+ </div>
229
+ </avue-group>
230
+ <form-menu v-if="isMenu">
231
+ <template #menu-form="scope">
232
+ <slot name="menu-form" v-bind="scope"></slot>
233
+ </template>
234
+ </form-menu>
235
+ </el-row>
236
+ </el-form>
237
+ </div>
238
+ </template>
239
+
240
+ <script>
241
+ // 移除全局变量,避免内存泄露
242
+ import { detail } from "../../../core/detail.mjs";
243
+ import create from "../../../core/create.mjs";
244
+ import init from "../../core/common/init.mjs";
245
+ import formTemp from "../../core/components/form/index.vue";
246
+ import formMenu from "./menu.vue";
247
+ import { DIC_PROPS } from "../../../global/variable.mjs";
248
+ import {
249
+ getComponent,
250
+ getPlaceholder,
251
+ formInitVal,
252
+ calcCount,
253
+ calcCascader,
254
+ } from "../../../core/dataformat.mjs";
255
+ import { sendDic } from "../../../core/dic.mjs";
256
+ import {
257
+ getColumn,
258
+ filterParams,
259
+ clearVal,
260
+ getAsVal,
261
+ blankVal,
262
+ setAsVal,
263
+ } from "../../../utils/util.mjs";
264
+ import mock from "../../../utils/mock.mjs";
265
+ import config from "./config.mjs";
266
+ export default create({
267
+ name: "form",
268
+ mixins: [init("form")],
269
+ emits: [
270
+ "update:modelValue",
271
+ "update:status",
272
+ "reset-change",
273
+ "mock-change",
274
+ "tab-click",
275
+ "submit",
276
+ "error",
277
+ ],
278
+ components: {
279
+ formTemp,
280
+ formMenu,
281
+ },
282
+ data() {
283
+ return {
284
+ config,
285
+ activeName: "",
286
+ allDisabled: false,
287
+ tableOption: {},
288
+ form: {},
289
+ formCreate: false,
290
+ formList: [],
291
+ formBind: {},
292
+ // 防止内存泄露的计数器,移到组件实例中
293
+ count: {},
294
+ // 保存定时器ID,用于清理
295
+ timers: [],
296
+ };
297
+ },
298
+ provide() {
299
+ return {
300
+ formSafe: this,
301
+ };
302
+ },
303
+ watch: {
304
+ modelValue: {
305
+ handler(val) {
306
+ if (this.formCreate) {
307
+ this.setForm();
308
+ }
309
+ },
310
+ deep: true,
311
+ },
312
+ form: {
313
+ handler(val) {
314
+ if (this.formCreate) {
315
+ this.setLabel();
316
+ this.setVal();
317
+ }
318
+ },
319
+ deep: true,
320
+ },
321
+ tabsActive: {
322
+ handler(val) {
323
+ this.activeName = this.tabsActive;
324
+ },
325
+ immediate: true,
326
+ },
327
+ DIC: {
328
+ handler() {
329
+ this.setLabel();
330
+ },
331
+ deep: true,
332
+ immediate: true,
333
+ },
334
+ allDisabled: {
335
+ handler(val) {
336
+ this.$emit("update:status", val);
337
+ },
338
+ deep: true,
339
+ immediate: true,
340
+ },
341
+ },
342
+ computed: {
343
+ size() {
344
+ return this.tableOption.size || this.$AVUE.formSize || this.$AVUE.size;
345
+ },
346
+ columnSlot() {
347
+ return Object.keys(this.$slots).filter(
348
+ (item) => !this.propOption.map((ele) => ele.prop).includes(item)
349
+ );
350
+ },
351
+ labelSuffix() {
352
+ return this.tableOption.labelSuffix || ":";
353
+ },
354
+ isMenu() {
355
+ return this.columnOption.length != 1;
356
+ },
357
+ isDetail() {
358
+ return this.detail === true;
359
+ },
360
+ isAdd() {
361
+ return ["parentAdd", "add"].includes(this.boxType);
362
+ },
363
+ isTabs() {
364
+ return this.tableOption.tabs === true;
365
+ },
366
+ isEdit() {
367
+ return this.boxType === "edit";
368
+ },
369
+ isView() {
370
+ return this.boxType === "view";
371
+ },
372
+ detail() {
373
+ return this.tableOption.detail;
374
+ },
375
+ disabled() {
376
+ return this.tableOption.disabled;
377
+ },
378
+ readonly() {
379
+ return this.tableOption.readonly;
380
+ },
381
+ tabsType() {
382
+ return this.tableOption.tabsType;
383
+ },
384
+ columnLen() {
385
+ return this.columnOption.length;
386
+ },
387
+ dynamicOption() {
388
+ let list = [];
389
+ this.propOption.forEach((ele) => {
390
+ if (ele.type == "dynamic" && this.vaildDisplay(ele)) {
391
+ list.push(ele);
392
+ }
393
+ });
394
+ return list;
395
+ },
396
+ propOption() {
397
+ let list = [];
398
+ this.columnOption.forEach((option) => {
399
+ if (option.display !== false) {
400
+ option.column.forEach((column) => list.push(column));
401
+ }
402
+ });
403
+ return list;
404
+ },
405
+ columnOption() {
406
+ const processColumnDetails = (list) => {
407
+ list.forEach((groupItem, groupIndex) => {
408
+ groupItem.column = getColumn(groupItem.column) || [];
409
+
410
+ groupItem.column.forEach((column, columnIndex) => {
411
+ if (column.display !== false && !this.isMobile) {
412
+ column = calcCount(
413
+ column,
414
+ this.tableOption.span || this.config.span,
415
+ columnIndex === 0
416
+ );
417
+ }
418
+ });
419
+
420
+ groupItem.column = calcCascader(groupItem.column);
421
+
422
+ groupItem.column = groupItem.column.sort(
423
+ (a, b) => (b.order || 0) - (a.order || 0)
424
+ );
425
+ });
426
+ };
427
+
428
+ const { tableOption } = this;
429
+
430
+ const mainColumn = getColumn(tableOption.column);
431
+
432
+ // 处理分组配置
433
+ const processedGroups = (tableOption.group || []).map((groupItem) => ({
434
+ ...groupItem,
435
+ column: getColumn(groupItem.column),
436
+ }));
437
+
438
+ const footerColumns = tableOption.footer || [];
439
+
440
+ // 添加主列组
441
+ const mainGroup = [
442
+ {
443
+ header: false,
444
+ column: mainColumn,
445
+ },
446
+ ];
447
+
448
+ const footerGroup =
449
+ footerColumns.length > 0
450
+ ? [
451
+ {
452
+ header: false,
453
+ column: footerColumns,
454
+ },
455
+ ]
456
+ : [];
457
+
458
+ // 处理所有组的详细信息
459
+ processColumnDetails(mainGroup);
460
+ processColumnDetails(processedGroups);
461
+ if (footerColumns.length > 0) {
462
+ processColumnDetails(footerGroup);
463
+ }
464
+ return [...mainGroup, ...processedGroups, ...footerGroup];
465
+ },
466
+ menuPosition: function () {
467
+ if (this.tableOption.menuPosition) {
468
+ return this.tableOption.menuPosition;
469
+ } else {
470
+ return "center";
471
+ }
472
+ },
473
+ boxType: function () {
474
+ return this.tableOption.boxType;
475
+ },
476
+ isPrint() {
477
+ return this.validData(this.tableOption.printBtn, false);
478
+ },
479
+ tabsActive() {
480
+ return this.validData(this.tableOption.tabsActive + "", "1");
481
+ },
482
+ isMock() {
483
+ return this.validData(this.tableOption.mockBtn, false);
484
+ },
485
+ isVerifyAll() {
486
+ return this.validData(this.tableOption.tabsVerifyAll, true);
487
+ },
488
+ menuSpan() {
489
+ return this.tableOption.menuSpan || 24;
490
+ },
491
+ },
492
+ props: {
493
+ uploadSized: Function,
494
+ uploadBefore: Function,
495
+ uploadAfter: Function,
496
+ uploadDelete: Function,
497
+ uploadPreview: Function,
498
+ uploadError: Function,
499
+ uploadExceed: Function,
500
+ status: {
501
+ type: Boolean,
502
+ default: false,
503
+ },
504
+ modelValue: {
505
+ type: Object,
506
+ required: true,
507
+ default: () => {
508
+ return {};
509
+ },
510
+ },
511
+ },
512
+ mounted() {
513
+ this.initFun();
514
+ // 保存定时器ID,用于清理
515
+ const timerId = setTimeout(() => {
516
+ this.dataFormat();
517
+ });
518
+ this.timers.push(timerId);
519
+ },
520
+ methods: {
521
+ getComponent,
522
+ getPlaceholder,
523
+ initFun() {
524
+ this.initFormMethods([
525
+ "validateField",
526
+ "scrollToField",
527
+ "clearValidate",
528
+ "resetFields",
529
+ "getField",
530
+ "fields",
531
+ ]);
532
+ },
533
+ initFormMethods(methods) {
534
+ methods.forEach((ele) => {
535
+ this[ele] = (...args) => {
536
+ const formRef = this.$refs.form;
537
+ if (formRef && typeof formRef[ele] === "function") {
538
+ return formRef[ele](...args);
539
+ }
540
+ };
541
+ });
542
+ },
543
+ getDisabled(column) {
544
+ return (
545
+ this.vaildDetail(column) ||
546
+ this.isDetail ||
547
+ this.vaildDisabled(column) ||
548
+ this.allDisabled
549
+ );
550
+ },
551
+ isGroupShow(item, index, verifyAll) {
552
+ if (verifyAll) return true;
553
+ else if (this.isTabs) {
554
+ return index == this.activeName || index == 0;
555
+ } else {
556
+ return true;
557
+ }
558
+ },
559
+
560
+ dataFormat() {
561
+ let formDefault = formInitVal(this.propOption);
562
+ let formValue = this.modelValue;
563
+ let form = {};
564
+ Object.entries(Object.assign(formDefault, formValue)).forEach((ele) => {
565
+ let key = ele[0],
566
+ value = ele[1];
567
+ if (this.validatenull(formValue[key])) {
568
+ form[key] = value;
569
+ } else {
570
+ form[key] = formValue[key];
571
+ }
572
+ });
573
+ this.form = form;
574
+ this.setLabel();
575
+ this.setControl();
576
+ this.setVal();
577
+ // 保存定时器ID,用于清理
578
+ const timerId = setTimeout(() => {
579
+ this.formCreate = true;
580
+ this.clearValidate();
581
+ });
582
+ this.timers.push(timerId);
583
+ },
584
+ setControl() {
585
+ this.propOption.forEach((column) => {
586
+ let prop = column.prop;
587
+ let bind = column.bind;
588
+ let control = column.control;
589
+ // 防止重复创建watcher,如果已存在则先清理
590
+ if (this.formBind[prop]) {
591
+ this.formBind[prop].forEach((unWatch) => {
592
+ if (typeof unWatch === "function") {
593
+ unWatch();
594
+ }
595
+ });
596
+ delete this.formBind[prop];
597
+ }
598
+
599
+ let bindList = [];
600
+ if (bind) {
601
+ let formProp = this.$watch("form." + prop, (n, o) => {
602
+ setAsVal(this.form, bind, n);
603
+ });
604
+ let formDeep = this.$watch("form." + bind, (n, o) => {
605
+ this.form[prop] = n;
606
+ });
607
+ bindList.push(formProp);
608
+ bindList.push(formDeep);
609
+ this.form[prop] = getAsVal(this.form, bind);
610
+ }
611
+ if (control) {
612
+ const callback = () => {
613
+ const controlResolve = (list) => {
614
+ Object.keys(list).forEach((item) => {
615
+ let ele = Object.assign(
616
+ this.objectOption[item] || {},
617
+ list[item]
618
+ );
619
+ this.objectOption[item] = ele;
620
+ if (list[item].dicData) this.DIC[item] = list[item].dicData;
621
+ });
622
+ };
623
+ let result = this.form["$" + column.prop] || this.form[column.prop];
624
+ let controlList =
625
+ control(this.form[column.prop], this.form, result, column) || {};
626
+ if (controlList instanceof Promise) {
627
+ controlList.then((res) => {
628
+ controlResolve(res);
629
+ });
630
+ } else {
631
+ controlResolve(controlList);
632
+ }
633
+ };
634
+ let formControl = this.$watch("form." + prop, (n, o) => {
635
+ callback();
636
+ });
637
+ bindList.push(formControl);
638
+ callback();
639
+ }
640
+ if (bindList.length > 0) {
641
+ this.formBind[prop] = bindList;
642
+ }
643
+ });
644
+ },
645
+ setForm() {
646
+ Object.keys(this.modelValue).forEach((ele) => {
647
+ this.form[ele] = this.modelValue[ele];
648
+ });
649
+ },
650
+ setVal() {
651
+ this.$emit("update:modelValue", this.form);
652
+ this.$emit("change", this.form);
653
+ },
654
+ setLabel() {
655
+ if (this.tableOption.filterNull === true) {
656
+ this.form = filterParams(this.form, [""], false);
657
+ }
658
+ if (this.tableOption.filterDic == true) {
659
+ this.form = filterParams(this.form, ["$"], false);
660
+ } else {
661
+ this.propOption.forEach((column) => {
662
+ let result;
663
+ let DIC = this.DIC[column.prop];
664
+ if (this.validatenull(DIC)) return;
665
+ result = detail(this.form, column, this.tableOption, DIC);
666
+ if (result) {
667
+ this.form[`$${column.prop}`] = result;
668
+ } else {
669
+ delete this.form[`$${column.prop}`];
670
+ }
671
+ });
672
+ }
673
+ },
674
+ handleGroupClick(activeNames) {
675
+ this.$emit("tab-click", activeNames);
676
+ },
677
+ handleTabClick(tab, event) {
678
+ this.$emit("tab-click", tab, event);
679
+ },
680
+ getItemParams(column, item, type, isPx) {
681
+ let result;
682
+ if (!this.validatenull(column[type])) {
683
+ result = column[type];
684
+ } else if (!this.validatenull(item[type])) {
685
+ result = item[type];
686
+ } else {
687
+ result = this.tableOption[type];
688
+ }
689
+ result = this.validData(result, this.config[type]);
690
+ return isPx ? this.setPx(result) : result;
691
+ },
692
+ validTip(column) {
693
+ return !column.tip || column.type === "upload";
694
+ },
695
+ getPropRef(prop) {
696
+ return this.$refs[prop][0];
697
+ },
698
+ handleChange(list, column) {
699
+ this.$nextTick(() => {
700
+ const cascader = column.cascader;
701
+ const str = cascader.join(",");
702
+ cascader.forEach((item) => {
703
+ const columnNextProp = item;
704
+ const value = this.form[column.prop];
705
+ // 下一个节点
706
+ const columnNext = this.findObject(list, columnNextProp);
707
+ if (this.validatenull(columnNext)) return;
708
+ // 如果不是首次加载则清空全部关联节点的属性值和字典值
709
+ if (this.formList.includes(str)) {
710
+ //清空子类字典列表和值
711
+ cascader.forEach((ele) => {
712
+ this.form[ele] = blankVal(this.form[ele]);
713
+ this.DIC[ele] = [];
714
+ });
715
+ }
716
+ /**
717
+ * 1.判断当前节点是否有下级节点
718
+ * 2.判断当前节点是否有值
719
+ */
720
+ if (
721
+ this.validatenull(cascader) ||
722
+ this.validatenull(value) ||
723
+ this.validatenull(columnNext)
724
+ ) {
725
+ return;
726
+ }
727
+ // 根据当前节点值获取下一个节点的字典
728
+ sendDic(
729
+ {
730
+ column: columnNext,
731
+ value: value,
732
+ form: this.form,
733
+ },
734
+ this
735
+ ).then((res) => {
736
+ //首次加载的放入队列记录
737
+ if (!this.formList.includes(str)) this.formList.push(str);
738
+ // 修改字典
739
+ const dic = res || [];
740
+ this.DIC[columnNextProp] = dic;
741
+ if (
742
+ !this.validatenull(dic) &&
743
+ !this.validatenull(dic) &&
744
+ !this.validatenull(columnNext.cascaderIndex) &&
745
+ this.validatenull(this.form[columnNextProp])
746
+ ) {
747
+ this.form[columnNextProp] =
748
+ dic[columnNext.cascaderIndex][
749
+ (columnNext.props || {}).value || DIC_PROPS.value
750
+ ];
751
+ }
752
+ });
753
+ });
754
+ });
755
+ },
756
+ handlePrint() {
757
+ this.$Print(this.$el);
758
+ },
759
+ propChange(option, column) {
760
+ let key = column.prop;
761
+ // 使用组件实例的count而不是全局变量
762
+ // 当字段类型为 cascader 或 upload 时,值发生变化需要进行字段验证
763
+ if (column.type === "cascader" || column.type === "upload") {
764
+ this.$nextTick(() => {
765
+ // 调用validateField方法验证当前字段
766
+ this.validateField(key).catch((error) => {});
767
+ });
768
+ }
769
+ if (!this.count[key]) {
770
+ if (column.cascader) this.handleChange(option, column);
771
+ }
772
+ this.count[key] = true;
773
+ this.$nextTick(() => (this.count[key] = false));
774
+ },
775
+ handleMock() {
776
+ if (!this.isMock) return;
777
+ this.columnOption.forEach((column) => {
778
+ const form = mock(column.column, this.DIC, this.form, this.isMock);
779
+ if (!this.validatenull(form)) {
780
+ Object.keys(form).forEach((ele) => {
781
+ this.form[ele] = form[ele];
782
+ });
783
+ }
784
+ });
785
+ // 保存定时器ID,用于清理
786
+ this.$nextTick(() => {
787
+ this.clearValidate();
788
+ this.$emit("mock-change", this.form);
789
+ });
790
+ },
791
+ vaildDetail(column) {
792
+ let key;
793
+ if (this.detail) return false;
794
+ if (!this.validatenull(column.detail)) {
795
+ key = "detail";
796
+ } else if (this.isAdd) {
797
+ key = "addDetail";
798
+ } else if (this.isEdit) {
799
+ key = "editDetail";
800
+ } else if (this.isView) {
801
+ return false;
802
+ }
803
+ return this.validData(column[key], false);
804
+ },
805
+ // 验证表单是否禁止
806
+ vaildDisabled(column) {
807
+ let key;
808
+ if (this.disabled) return true;
809
+ if (!this.validatenull(column.disabled)) {
810
+ key = "disabled";
811
+ } else if (this.isAdd) {
812
+ key = "addDisabled";
813
+ } else if (this.isEdit) {
814
+ key = "editDisabled";
815
+ } else if (this.isView) {
816
+ return true;
817
+ }
818
+ return this.validData(column[key], false);
819
+ },
820
+ // 验证表单是否显隐
821
+ vaildDisplay(column) {
822
+ let key;
823
+ if (!this.validatenull(column.display)) {
824
+ key = "display";
825
+ } else if (this.isAdd) {
826
+ key = "addDisplay";
827
+ } else if (this.isEdit) {
828
+ key = "editDisplay";
829
+ } else if (this.isView) {
830
+ key = "viewDisplay";
831
+ } else {
832
+ return true;
833
+ }
834
+ return this.validData(column[key], true);
835
+ },
836
+ validateCellForm() {
837
+ return new Promise((resolve) => {
838
+ this.$refs.form.validate((valid, msg) => {
839
+ resolve(msg);
840
+ });
841
+ });
842
+ },
843
+ validate(callback) {
844
+ this.$refs.form.validate((valid, msg) => {
845
+ let dynamicList = [];
846
+ let dynamicName = [];
847
+ let dynamicError = {};
848
+ this.dynamicOption.forEach((ele) => {
849
+ let isForm = ele.children.type === "form";
850
+ dynamicName.push(ele.prop);
851
+ if (isForm) {
852
+ if (
853
+ !this.validatenull(this.$refs[ele.prop][0].$refs.temp.$refs.main)
854
+ ) {
855
+ this.$refs[ele.prop][0].$refs.temp.$refs.main.forEach((ele) => {
856
+ dynamicList.push(ele.validateCellForm());
857
+ });
858
+ }
859
+ } else {
860
+ dynamicList.push(
861
+ this.$refs[ele.prop][0].$refs.temp.$refs.main.validateCellForm()
862
+ );
863
+ }
864
+ });
865
+ Promise.all(dynamicList).then((res) => {
866
+ res.forEach((error, index) => {
867
+ if (!this.validatenull(error)) {
868
+ dynamicError[dynamicName[index]] = error;
869
+ }
870
+ });
871
+ let result = Object.assign(dynamicError, msg);
872
+ if (this.validatenull(result)) {
873
+ this.show();
874
+ callback && callback(true, this.hide, result);
875
+ } else {
876
+ callback && callback(false, this.hide, result);
877
+ }
878
+ });
879
+ });
880
+ },
881
+ resetForm(reset = true) {
882
+ if (reset) {
883
+ let propList = this.propOption.map((ele) => ele.prop);
884
+ this.form = clearVal(
885
+ this.form,
886
+ propList,
887
+ (this.tableOption.filterParams || []).concat([this.rowKey])
888
+ );
889
+ }
890
+ this.$nextTick(() => {
891
+ this.clearValidate();
892
+ this.$emit("reset-change");
893
+ });
894
+ },
895
+ show() {
896
+ this.allDisabled = true;
897
+ },
898
+ hide() {
899
+ this.allDisabled = false;
900
+ },
901
+ submit() {
902
+ this.validate((valid, hide, msg) => {
903
+ if (valid) {
904
+ this.$emit("submit", filterParams(this.form, ["$"]), this.hide);
905
+ } else {
906
+ this.$emit("error", msg);
907
+ }
908
+ });
909
+ },
910
+ shouldShowDivider(column) {
911
+ return (
912
+ this.vaildDisplay(column) && // 列是否显示
913
+ column.row && // 是否需要换行
914
+ column.span !== 24 && // 不是全宽
915
+ column.count // 有剩余空间需要填充
916
+ );
917
+ },
918
+ },
919
+ beforeUnmount() {
920
+ // 清理所有定时器,防止内存泄露
921
+ this.timers.forEach((timerId) => {
922
+ if (timerId) {
923
+ clearTimeout(timerId);
924
+ }
925
+ });
926
+ this.timers = [];
927
+
928
+ // 清理所有watcher
929
+ Object.keys(this.formBind).forEach((ele) => {
930
+ this.formBind[ele].forEach((unWatch) => {
931
+ if (typeof unWatch === "function") {
932
+ unWatch();
933
+ }
934
+ });
935
+ });
936
+
937
+ // 清理formBind对象
938
+ this.formBind = {};
939
+
940
+ // 清理formList数组
941
+ this.formList = [];
942
+
943
+ // 清理count对象
944
+ this.count = {};
945
+
946
+ // 清理form对象的引用
947
+ this.form = {};
948
+ },
949
+
950
+ unmounted() {
951
+ // 保留原有的unmounted钩子以确保兼容性
952
+ },
953
+ });
954
+ </script>