feffery_antd_components 0.4.3-rc6 → 0.4.3

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 (462) hide show
  1. package/CONTRIBUTING.md +4 -4
  2. package/DESCRIPTION +1 -1
  3. package/LICENSE +21 -21
  4. package/MANIFEST.in +6 -6
  5. package/Project.toml +1 -1
  6. package/README-en_US.md +73 -73
  7. package/README.md +87 -87
  8. package/bug_fix.py +21 -36
  9. package/fac-logo.svg +151 -151
  10. package/feffery_antd_components/AntdAccordion.py +7 -7
  11. package/feffery_antd_components/AntdAffix.py +2 -2
  12. package/feffery_antd_components/AntdAlert.py +5 -5
  13. package/feffery_antd_components/AntdAnchor.py +5 -5
  14. package/feffery_antd_components/AntdAvatar.py +4 -4
  15. package/feffery_antd_components/AntdAvatarGroup.py +1 -1
  16. package/feffery_antd_components/AntdBackTop.py +4 -4
  17. package/feffery_antd_components/AntdBadge.py +5 -5
  18. package/feffery_antd_components/AntdBreadcrumb.py +4 -4
  19. package/feffery_antd_components/AntdButton.py +14 -14
  20. package/feffery_antd_components/AntdCalendar.py +4 -4
  21. package/feffery_antd_components/AntdCard.py +5 -5
  22. package/feffery_antd_components/AntdCardGrid.py +3 -3
  23. package/feffery_antd_components/AntdCardMeta.py +1 -1
  24. package/feffery_antd_components/AntdCarousel.py +13 -13
  25. package/feffery_antd_components/AntdCascader.py +16 -17
  26. package/feffery_antd_components/AntdCenter.py +3 -3
  27. package/feffery_antd_components/AntdCheckCard.py +7 -7
  28. package/feffery_antd_components/AntdCheckCardGroup.py +9 -9
  29. package/feffery_antd_components/AntdCheckableTag.py +2 -2
  30. package/feffery_antd_components/AntdCheckbox.py +8 -8
  31. package/feffery_antd_components/AntdCheckboxGroup.py +6 -6
  32. package/feffery_antd_components/AntdCol.py +5 -5
  33. package/feffery_antd_components/AntdCollapse.py +8 -8
  34. package/feffery_antd_components/AntdColorPicker.py +13 -13
  35. package/feffery_antd_components/AntdComment.py +7 -7
  36. package/feffery_antd_components/AntdCompact.py +3 -3
  37. package/feffery_antd_components/AntdConfigProvider.py +6 -6
  38. package/feffery_antd_components/AntdContent.py +1 -1
  39. package/feffery_antd_components/AntdCopyText.py +2 -2
  40. package/feffery_antd_components/AntdCountdown.py +1 -1
  41. package/feffery_antd_components/AntdCountup.py +1 -1
  42. package/feffery_antd_components/AntdCustomSkeleton.py +5 -5
  43. package/feffery_antd_components/AntdDatePicker.py +13 -13
  44. package/feffery_antd_components/AntdDateRangePicker.py +12 -12
  45. package/feffery_antd_components/AntdDescriptionItem.py +2 -2
  46. package/feffery_antd_components/AntdDescriptions.py +6 -6
  47. package/feffery_antd_components/AntdDivider.py +5 -5
  48. package/feffery_antd_components/AntdDraggerUpload.py +15 -15
  49. package/feffery_antd_components/AntdDrawer.py +12 -12
  50. package/feffery_antd_components/AntdDropdown.py +18 -18
  51. package/feffery_antd_components/AntdEmpty.py +2 -2
  52. package/feffery_antd_components/AntdFlex.py +6 -6
  53. package/feffery_antd_components/AntdFloatButton.py +5 -5
  54. package/feffery_antd_components/AntdFloatButtonGroup.py +3 -3
  55. package/feffery_antd_components/AntdFooter.py +1 -1
  56. package/feffery_antd_components/AntdForm.py +10 -6
  57. package/feffery_antd_components/AntdFormItem.py +4 -4
  58. package/feffery_antd_components/AntdFormRender.py +2 -2
  59. package/feffery_antd_components/AntdHappyProvider.py +2 -2
  60. package/feffery_antd_components/AntdHeader.py +1 -1
  61. package/feffery_antd_components/AntdIcon.py +3 -3
  62. package/feffery_antd_components/AntdImage.py +6 -6
  63. package/feffery_antd_components/AntdImageGroup.py +6 -6
  64. package/feffery_antd_components/AntdInput.py +17 -17
  65. package/feffery_antd_components/AntdInputNumber.py +12 -12
  66. package/feffery_antd_components/AntdLayout.py +1 -1
  67. package/feffery_antd_components/AntdMentions.py +9 -9
  68. package/feffery_antd_components/AntdMenu.py +9 -9
  69. package/feffery_antd_components/AntdMessage.py +3 -3
  70. package/feffery_antd_components/AntdModal.py +28 -28
  71. package/feffery_antd_components/AntdNotification.py +9 -9
  72. package/feffery_antd_components/AntdOTP.py +7 -7
  73. package/feffery_antd_components/AntdPageHeader.py +5 -5
  74. package/feffery_antd_components/AntdPagination.py +15 -15
  75. package/feffery_antd_components/AntdParagraph.py +2 -2
  76. package/feffery_antd_components/AntdPictureUpload.py +28 -28
  77. package/feffery_antd_components/AntdPopconfirm.py +21 -21
  78. package/feffery_antd_components/AntdPopover.py +9 -9
  79. package/feffery_antd_components/AntdPopupCard.py +9 -9
  80. package/feffery_antd_components/AntdProgress.py +9 -9
  81. package/feffery_antd_components/AntdQRCode.py +10 -10
  82. package/feffery_antd_components/AntdRadioGroup.py +9 -9
  83. package/feffery_antd_components/AntdRate.py +9 -9
  84. package/feffery_antd_components/AntdResult.py +1 -1
  85. package/feffery_antd_components/AntdRibbon.py +2 -2
  86. package/feffery_antd_components/AntdRow.py +3 -3
  87. package/feffery_antd_components/AntdSegmented.py +9 -9
  88. package/feffery_antd_components/AntdSegmentedColoring.py +11 -11
  89. package/feffery_antd_components/AntdSelect.py +19 -19
  90. package/feffery_antd_components/AntdSider.py +6 -6
  91. package/feffery_antd_components/AntdSkeleton.py +11 -11
  92. package/feffery_antd_components/AntdSkeletonAvatar.py +3 -3
  93. package/feffery_antd_components/AntdSkeletonButton.py +5 -5
  94. package/feffery_antd_components/AntdSkeletonImage.py +1 -1
  95. package/feffery_antd_components/AntdSkeletonInput.py +3 -3
  96. package/feffery_antd_components/AntdSlider.py +10 -10
  97. package/feffery_antd_components/AntdSpace.py +4 -4
  98. package/feffery_antd_components/AntdSpin.py +7 -8
  99. package/feffery_antd_components/AntdSplitter.py +5 -5
  100. package/feffery_antd_components/AntdSpoiler.py +5 -5
  101. package/feffery_antd_components/AntdStatistic.py +2 -2
  102. package/feffery_antd_components/AntdSteps.py +8 -8
  103. package/feffery_antd_components/AntdSwitch.py +8 -8
  104. package/feffery_antd_components/AntdTable.py +64 -63
  105. package/feffery_antd_components/AntdTabs.py +13 -14
  106. package/feffery_antd_components/AntdTag.py +4 -4
  107. package/feffery_antd_components/AntdText.py +2 -2
  108. package/feffery_antd_components/AntdTimePicker.py +16 -16
  109. package/feffery_antd_components/AntdTimeRangePicker.py +15 -15
  110. package/feffery_antd_components/AntdTimeline.py +2 -2
  111. package/feffery_antd_components/AntdTitle.py +2 -2
  112. package/feffery_antd_components/AntdTooltip.py +9 -9
  113. package/feffery_antd_components/AntdTour.py +9 -9
  114. package/feffery_antd_components/AntdTransfer.py +11 -11
  115. package/feffery_antd_components/AntdTree.py +17 -17
  116. package/feffery_antd_components/AntdTreeSelect.py +18 -18
  117. package/feffery_antd_components/AntdUpload.py +18 -18
  118. package/feffery_antd_components/AntdWatermark.py +6 -6
  119. package/feffery_antd_components/Fragment.py +1 -1
  120. package/feffery_antd_components/__init__.py +88 -88
  121. package/feffery_antd_components/_icons.py +559 -559
  122. package/feffery_antd_components/alias.py +222 -222
  123. package/feffery_antd_components/async-antd_table.js +2 -2
  124. package/feffery_antd_components/async-data_display.js +1 -1
  125. package/feffery_antd_components/async-data_entry.js +3 -3
  126. package/feffery_antd_components/async-upload.js +2 -2
  127. package/feffery_antd_components/feffery_antd_components.min.js +8 -8
  128. package/feffery_antd_components/metadata.json +1 -1
  129. package/feffery_antd_components/package-info.json +111 -96
  130. package/feffery_antd_components/utils.py +262 -262
  131. package/package.json +111 -96
  132. package/pytest.ini +5 -5
  133. package/release-to-test-pypi.sh +1 -1
  134. package/requirements.txt +2 -2
  135. package/review_checklist.md +47 -47
  136. package/ruff.toml +4 -4
  137. package/setup.py +33 -33
  138. package/src/jl/'feffery'_antdform.jl +2 -1
  139. package/src/jl/'feffery'_antdtable.jl +7 -6
  140. package/src/lib/components/dataDisplay/AntdAccordion.react.js +232 -232
  141. package/src/lib/components/dataDisplay/AntdAvatar.react.js +177 -177
  142. package/src/lib/components/dataDisplay/AntdAvatarGroup.react.js +133 -133
  143. package/src/lib/components/dataDisplay/AntdBadge.react.js +196 -196
  144. package/src/lib/components/dataDisplay/AntdCarousel.react.js +187 -187
  145. package/src/lib/components/dataDisplay/AntdCheckableTag.react.js +105 -105
  146. package/src/lib/components/dataDisplay/AntdCollapse.react.js +239 -239
  147. package/src/lib/components/dataDisplay/AntdComment.react.js +251 -251
  148. package/src/lib/components/dataDisplay/AntdCountdown.react.js +143 -143
  149. package/src/lib/components/dataDisplay/AntdCountup.react.js +133 -133
  150. package/src/lib/components/dataDisplay/AntdEmpty.react.js +162 -162
  151. package/src/lib/components/dataDisplay/AntdImage.react.js +202 -202
  152. package/src/lib/components/dataDisplay/AntdImageGroup.react.js +181 -181
  153. package/src/lib/components/dataDisplay/AntdPopover.react.js +220 -220
  154. package/src/lib/components/dataDisplay/AntdQRCode.react.js +191 -191
  155. package/src/lib/components/dataDisplay/AntdRibbon.react.js +105 -105
  156. package/src/lib/components/dataDisplay/AntdSegmented.react.js +234 -234
  157. package/src/lib/components/dataDisplay/AntdSpoiler.react.js +154 -154
  158. package/src/lib/components/dataDisplay/AntdStatistic.react.js +168 -168
  159. package/src/lib/components/dataDisplay/AntdTable.react.js +1859 -1858
  160. package/src/lib/components/dataDisplay/AntdTabs.react.js +352 -352
  161. package/src/lib/components/dataDisplay/AntdTag.react.js +135 -135
  162. package/src/lib/components/dataDisplay/AntdTimeline.react.js +136 -136
  163. package/src/lib/components/dataDisplay/AntdTooltip.react.js +230 -230
  164. package/src/lib/components/dataDisplay/AntdTree.react.js +641 -641
  165. package/src/lib/components/dataDisplay/card/AntdCard.react.js +249 -249
  166. package/src/lib/components/dataDisplay/card/AntdCardGrid.react.js +99 -99
  167. package/src/lib/components/dataDisplay/card/AntdCardMeta.react.js +97 -97
  168. package/src/lib/components/dataDisplay/descriptions/AntdDescriptionItem.react.js +130 -130
  169. package/src/lib/components/dataDisplay/descriptions/AntdDescriptions.react.js +237 -237
  170. package/src/lib/components/dataEntry/AntdCalendar.react.js +205 -205
  171. package/src/lib/components/dataEntry/AntdCascader.react.js +435 -435
  172. package/src/lib/components/dataEntry/AntdCheckbox.react.js +182 -182
  173. package/src/lib/components/dataEntry/AntdCheckboxGroup.react.js +193 -193
  174. package/src/lib/components/dataEntry/AntdColorPicker.react.js +240 -240
  175. package/src/lib/components/dataEntry/AntdDatePicker.react.js +432 -432
  176. package/src/lib/components/dataEntry/AntdDateRangePicker.react.js +439 -439
  177. package/src/lib/components/dataEntry/AntdInput.react.js +423 -423
  178. package/src/lib/components/dataEntry/AntdInputNumber.react.js +329 -329
  179. package/src/lib/components/dataEntry/AntdMentions.react.js +236 -236
  180. package/src/lib/components/dataEntry/AntdOTP.react.js +186 -186
  181. package/src/lib/components/dataEntry/AntdRadioGroup.react.js +241 -241
  182. package/src/lib/components/dataEntry/AntdRate.react.js +199 -199
  183. package/src/lib/components/dataEntry/AntdSegmentedColoring.react.js +251 -251
  184. package/src/lib/components/dataEntry/AntdSelect.react.js +492 -492
  185. package/src/lib/components/dataEntry/AntdSlider.react.js +325 -325
  186. package/src/lib/components/dataEntry/AntdSwitch.react.js +210 -210
  187. package/src/lib/components/dataEntry/AntdTimePicker.react.js +344 -344
  188. package/src/lib/components/dataEntry/AntdTimeRangePicker.react.js +325 -325
  189. package/src/lib/components/dataEntry/AntdTransfer.react.js +317 -317
  190. package/src/lib/components/dataEntry/AntdTreeSelect.react.js +573 -573
  191. package/src/lib/components/dataEntry/check-card/AntdCheckCard.react.js +186 -186
  192. package/src/lib/components/dataEntry/check-card/AntdCheckCardGroup.react.js +214 -214
  193. package/src/lib/components/dataEntry/form/AntdForm.react.js +201 -194
  194. package/src/lib/components/dataEntry/form/AntdFormItem.react.js +210 -210
  195. package/src/lib/components/dataEntry/upload/AntdDraggerUpload.react.js +504 -504
  196. package/src/lib/components/dataEntry/upload/AntdPictureUpload.react.js +530 -530
  197. package/src/lib/components/dataEntry/upload/AntdUpload.react.js +537 -537
  198. package/src/lib/components/feedback/AntdAlert.react.js +185 -185
  199. package/src/lib/components/feedback/AntdDrawer.react.js +306 -306
  200. package/src/lib/components/feedback/AntdMessage.react.js +143 -143
  201. package/src/lib/components/feedback/AntdModal.react.js +530 -530
  202. package/src/lib/components/feedback/AntdNotification.react.js +211 -211
  203. package/src/lib/components/feedback/AntdPopconfirm.react.js +433 -433
  204. package/src/lib/components/feedback/AntdPopupCard.react.js +362 -362
  205. package/src/lib/components/feedback/AntdProgress.react.js +300 -300
  206. package/src/lib/components/feedback/AntdResult.react.js +125 -125
  207. package/src/lib/components/feedback/AntdSpin.react.js +273 -273
  208. package/src/lib/components/feedback/skeleton/AntdCustomSkeleton.react.js +197 -197
  209. package/src/lib/components/feedback/skeleton/AntdSkeleton.react.js +291 -291
  210. package/src/lib/components/feedback/skeleton/AntdSkeletonAvatar.react.js +109 -109
  211. package/src/lib/components/feedback/skeleton/AntdSkeletonButton.react.js +114 -114
  212. package/src/lib/components/feedback/skeleton/AntdSkeletonImage.react.js +82 -82
  213. package/src/lib/components/feedback/skeleton/AntdSkeletonInput.react.js +98 -98
  214. package/src/lib/components/formRender/AntdFormRender.react.js +945 -945
  215. package/src/lib/components/general/AntdButton.react.js +328 -328
  216. package/src/lib/components/general/AntdFloatButton.react.js +157 -157
  217. package/src/lib/components/general/AntdFloatButtonGroup.react.js +162 -162
  218. package/src/lib/components/general/AntdIcon.react.js +176 -176
  219. package/src/lib/components/general/typography/AntdParagraph.react.js +202 -202
  220. package/src/lib/components/general/typography/AntdText.react.js +194 -194
  221. package/src/lib/components/general/typography/AntdTitle.react.js +186 -186
  222. package/src/lib/components/icons.react.js +1136 -1136
  223. package/src/lib/components/layout/AntdCenter.react.js +122 -122
  224. package/src/lib/components/layout/AntdCompact.react.js +108 -108
  225. package/src/lib/components/layout/AntdContent.react.js +92 -92
  226. package/src/lib/components/layout/AntdDivider.react.js +219 -219
  227. package/src/lib/components/layout/AntdFlex.react.js +143 -143
  228. package/src/lib/components/layout/AntdFooter.react.js +92 -92
  229. package/src/lib/components/layout/AntdHeader.react.js +92 -92
  230. package/src/lib/components/layout/AntdLayout.react.js +90 -90
  231. package/src/lib/components/layout/AntdSider.react.js +162 -162
  232. package/src/lib/components/layout/AntdSpace.react.js +213 -213
  233. package/src/lib/components/layout/AntdSplitter.react.js +173 -173
  234. package/src/lib/components/layout/grid/AntdCol.react.js +349 -349
  235. package/src/lib/components/layout/grid/AntdRow.react.js +152 -152
  236. package/src/lib/components/locales.react.js +197 -197
  237. package/src/lib/components/navigation/AntdAnchor.react.js +208 -208
  238. package/src/lib/components/navigation/AntdBreadcrumb.react.js +270 -270
  239. package/src/lib/components/navigation/AntdDropdown.react.js +469 -469
  240. package/src/lib/components/navigation/AntdMenu.react.js +573 -649
  241. package/src/lib/components/navigation/AntdPageHeader.react.js +139 -139
  242. package/src/lib/components/navigation/AntdPagination.react.js +303 -303
  243. package/src/lib/components/navigation/AntdSteps.react.js +199 -199
  244. package/src/lib/components/other/AntdAffix.react.js +120 -120
  245. package/src/lib/components/other/AntdBackTop.react.js +128 -128
  246. package/src/lib/components/other/AntdConfigProvider.react.js +246 -246
  247. package/src/lib/components/other/AntdCopyText.react.js +138 -138
  248. package/src/lib/components/other/AntdHappyProvider.react.js +50 -50
  249. package/src/lib/components/other/AntdTour.react.js +277 -277
  250. package/src/lib/components/other/AntdWatermark.react.js +179 -179
  251. package/src/lib/components/other/Fragment.react.js +50 -50
  252. package/src/lib/components/styles.css +513 -513
  253. package/src/lib/components/utils.js +51 -51
  254. package/src/lib/contexts/FormContext.js +4 -4
  255. package/src/lib/contexts/FormItemContext.js +4 -4
  256. package/src/lib/contexts/PropsContext.js +4 -4
  257. package/src/lib/fragments/AntdTable.react.js +2215 -2200
  258. package/src/lib/fragments/dataDisplay/AntdAccordion.react.js +101 -101
  259. package/src/lib/fragments/dataDisplay/AntdAvatar.react.js +127 -127
  260. package/src/lib/fragments/dataDisplay/AntdAvatarGroup.react.js +51 -51
  261. package/src/lib/fragments/dataDisplay/AntdBadge.react.js +73 -73
  262. package/src/lib/fragments/dataDisplay/AntdCarousel.react.js +71 -71
  263. package/src/lib/fragments/dataDisplay/AntdCheckableTag.react.js +57 -57
  264. package/src/lib/fragments/dataDisplay/AntdComment.react.js +178 -178
  265. package/src/lib/fragments/dataDisplay/AntdCountdown.react.js +83 -83
  266. package/src/lib/fragments/dataDisplay/AntdCountup.react.js +70 -70
  267. package/src/lib/fragments/dataDisplay/AntdEmpty.react.js +71 -71
  268. package/src/lib/fragments/dataDisplay/AntdImage.react.js +206 -206
  269. package/src/lib/fragments/dataDisplay/AntdImageGroup.react.js +91 -91
  270. package/src/lib/fragments/dataDisplay/AntdPopover.react.js +106 -106
  271. package/src/lib/fragments/dataDisplay/AntdQRCode.react.js +93 -93
  272. package/src/lib/fragments/dataDisplay/AntdRibbon.react.js +53 -53
  273. package/src/lib/fragments/dataDisplay/AntdSegmented.react.js +129 -129
  274. package/src/lib/fragments/dataDisplay/AntdSpoiler.react.js +96 -96
  275. package/src/lib/fragments/dataDisplay/AntdTabs.react.js +211 -211
  276. package/src/lib/fragments/dataDisplay/AntdTag.react.js +66 -66
  277. package/src/lib/fragments/dataDisplay/AntdTimeline.react.js +67 -67
  278. package/src/lib/fragments/dataDisplay/AntdTooltip.react.js +98 -98
  279. package/src/lib/fragments/dataDisplay/AntdTree.react.js +581 -581
  280. package/src/lib/fragments/dataDisplay/card/AntdCard.react.js +104 -104
  281. package/src/lib/fragments/dataDisplay/card/AntdCardGrid.react.js +54 -54
  282. package/src/lib/fragments/dataDisplay/card/AntdCardMeta.react.js +54 -54
  283. package/src/lib/fragments/dataDisplay/descriptions/AntdDescriptionItem.react.js +56 -56
  284. package/src/lib/fragments/dataDisplay/descriptions/AntdDescriptions.react.js +139 -139
  285. package/src/lib/fragments/dataEntry/AntdCalendar.react.js +178 -178
  286. package/src/lib/fragments/dataEntry/AntdCascader.react.js +319 -319
  287. package/src/lib/fragments/dataEntry/AntdCheckbox.react.js +119 -119
  288. package/src/lib/fragments/dataEntry/AntdCheckboxGroup.react.js +122 -122
  289. package/src/lib/fragments/dataEntry/AntdColorPicker.react.js +244 -244
  290. package/src/lib/fragments/dataEntry/AntdDatePicker.react.js +586 -586
  291. package/src/lib/fragments/dataEntry/AntdDateRangePicker.react.js +628 -628
  292. package/src/lib/fragments/dataEntry/AntdInput.react.js +450 -450
  293. package/src/lib/fragments/dataEntry/AntdInputNumber.react.js +194 -194
  294. package/src/lib/fragments/dataEntry/AntdMentions.react.js +180 -180
  295. package/src/lib/fragments/dataEntry/AntdOTP.react.js +127 -127
  296. package/src/lib/fragments/dataEntry/AntdRadioGroup.react.js +203 -203
  297. package/src/lib/fragments/dataEntry/AntdRate.react.js +131 -131
  298. package/src/lib/fragments/dataEntry/AntdSegmentedColoring.react.js +246 -246
  299. package/src/lib/fragments/dataEntry/AntdSelect.react.js +373 -373
  300. package/src/lib/fragments/dataEntry/AntdSlider.react.js +177 -177
  301. package/src/lib/fragments/dataEntry/AntdSwitch.react.js +132 -132
  302. package/src/lib/fragments/dataEntry/AntdTimePicker.react.js +191 -191
  303. package/src/lib/fragments/dataEntry/AntdTimeRangePicker.react.js +213 -213
  304. package/src/lib/fragments/dataEntry/AntdTransfer.react.js +183 -183
  305. package/src/lib/fragments/dataEntry/AntdTreeSelect.react.js +355 -355
  306. package/src/lib/fragments/dataEntry/check-card/AntdCheckCard.react.js +111 -111
  307. package/src/lib/fragments/dataEntry/check-card/AntdCheckCardGroup.react.js +122 -122
  308. package/src/lib/fragments/dataEntry/form/AntdForm.react.js +126 -120
  309. package/src/lib/fragments/dataEntry/form/AntdFormItem.react.js +85 -84
  310. package/src/lib/fragments/formRender/AntdFormRender.react.js +179 -179
  311. package/src/lib/fragments/upload/AntdDraggerUpload.react.js +622 -622
  312. package/src/lib/fragments/upload/AntdPictureUpload.react.js +577 -577
  313. package/src/lib/fragments/upload/AntdUpload.react.js +613 -613
  314. package/src/lib/hooks/useCss.js +28 -28
  315. package/src/lib/hooks/useStickyOffset.js +115 -115
  316. package/src/lib/index.js +240 -240
  317. package/src/lib/internal_components/UtilsLink.react.js +82 -0
  318. package/src/lib/store/formStore.js +54 -47
  319. package/tests/dash3.0tests/AntdQRCode/347/273/204/344/273/266loading/347/212/266/346/200/201/351/207/215/346/236/204/test.py +51 -51
  320. package/tests/dash3.0tests/AntdTable/345/207/275/346/225/260/345/274/217/346/224/271/351/200/240/test.py +62 -62
  321. package/tests/dash3.0tests/_dashprivate_layout/346/224/271/345/212/250/346/265/213/350/257/225/test.py +50 -50
  322. package/tests/dash3.0tests/loading_state/346/224/271/345/212/250/346/265/213/350/257/225/test.py +38 -38
  323. package/tests/dash3.0tests//345/207/275/346/225/260/345/274/217/347/273/204/344/273/266/351/273/230/350/256/244/345/200/274/351/207/215/346/236/204/test.py +30 -30
  324. package/tests/dash3.0tests//345/212/240/350/275/275/345/212/250/347/224/273/347/261/273/347/273/204/344/273/266/351/207/215/346/236/204/346/265/213/350/257/225/test.py +62 -62
  325. package/tests/dash3.0tests//347/273/204/344/273/266/345/261/236/346/200/247/345/237/272/347/241/200/346/214/201/344/271/205/345/214/226/351/207/215/346/236/204/346/265/213/350/257/225/test.py +25 -25
  326. package/tests/dataDisplay/AntdAccordion/feat_size.py +36 -36
  327. package/tests/dataDisplay/AntdAccordion/feat_styles.py +35 -35
  328. package/tests/dataDisplay/AntdCard/refactor_delete_props.py +83 -83
  329. package/tests/dataDisplay/AntdCarousel/feat_auto_play_dot_duration.py +34 -34
  330. package/tests/dataDisplay/AntdCollapse/feat_size.py +30 -30
  331. package/tests/dataDisplay/AntdCollapse/feat_styles.py +29 -29
  332. package/tests/dataDisplay/AntdCountdown/feat_finish_event.py +41 -41
  333. package/tests/dataDisplay/AntdCountdown/refactor_to_timer.py +57 -57
  334. package/tests/dataDisplay/AntdCountup/refactor_to_timer.py +57 -57
  335. package/tests/dataDisplay/AntdDescriptions/feat_span_filled.py +42 -42
  336. package/tests/dataDisplay/AntdImage/debug_preview_toolbar.py +23 -23
  337. package/tests/dataDisplay/AntdSegmented/feat_shape.py +39 -39
  338. package/tests/dataDisplay/AntdSegmented/feat_simple_options.py +43 -43
  339. package/tests/dataDisplay/AntdSegmented/feat_vertical.py +32 -32
  340. package/tests/dataDisplay/AntdTable/feat_button_mode_like_dcc_link.py +125 -0
  341. package/tests/dataDisplay/AntdTable/feat_button_mode_refactor.py +143 -143
  342. package/tests/dataDisplay/AntdTable/feat_button_mode_tooltip.py +47 -47
  343. package/tests/dataDisplay/AntdTable/feat_columns_fixed_bool.py +40 -40
  344. package/tests/dataDisplay/AntdTable/feat_columns_min_width.py +51 -51
  345. package/tests/dataDisplay/AntdTable/feat_columns_sort_order.py +131 -131
  346. package/tests/dataDisplay/AntdTable/feat_editable_disabled_keys.py +71 -71
  347. package/tests/dataDisplay/AntdTable/feat_header_align.py +38 -38
  348. package/tests/dataDisplay/AntdTable/feat_link_mode_like_dcc_link.py +49 -0
  349. package/tests/dataDisplay/AntdTable/feat_loading.py +76 -76
  350. package/tests/dataDisplay/AntdTable/feat_mini_chart_color.py +139 -139
  351. package/tests/dataDisplay/AntdTable/feat_row_class_name.py +39 -39
  352. package/tests/dataDisplay/AntdTable/feat_row_class_name_func.py +41 -41
  353. package/tests/dataDisplay/AntdTable/feat_select_mode_show_search.py +70 -70
  354. package/tests/dataDisplay/AntdTable/feat_sticky_header.py +81 -81
  355. package/tests/dataDisplay/AntdTable/feat_table_scroll.py +54 -54
  356. package/tests/dataDisplay/AntdTable/feat_tag_mode_tooltip.py +88 -88
  357. package/tests/dataDisplay/AntdTable/feat_title_popover_nodes.py +94 -79
  358. package/tests/dataDisplay/AntdTable/fix_context_locale.py +37 -37
  359. package/tests/dataDisplay/AntdTable/fix_field_bool.py +50 -50
  360. package/tests/dataDisplay/AntdTable/fix_nested_editable.py +115 -115
  361. package/tests/dataDisplay/AntdTable/fix_select_with_editable.py +84 -84
  362. package/tests/dataDisplay/AntdTable/fix_server_side_mode_filter_search.py +194 -194
  363. package/tests/dataDisplay/AntdTable/fix_summary.py +474 -474
  364. package/tests/dataDisplay/AntdTable/fix_summary_multi_level_header.py +85 -85
  365. package/tests/dataDisplay/AntdTable/fix_zero_value_filter.py +34 -34
  366. package/tests/dataDisplay/AntdTable/perf_button_mode_auto_wrap.py +39 -39
  367. package/tests/dataDisplay/AntdTable/perf_editable_column_format_constrait_message.py +65 -65
  368. package/tests/dataDisplay/AntdTable/refactor_mini_progress_mode.py +134 -134
  369. package/tests/dataDisplay/AntdTable/rollback_title_popover_info.py +46 -0
  370. package/tests/dataDisplay/AntdTabs/feat_item_icon.py +39 -39
  371. package/tests/dataDisplay/AntdTabs/feat_placeholder.py +124 -124
  372. package/tests/dataDisplay/AntdTabs/feat_tab_bar_style.py +40 -40
  373. package/tests/dataDisplay/AntdTree/feat_async_data_load.py +71 -71
  374. package/tests/dataDisplay/descriptions/AntdDescriptions/feat_extra.py +83 -83
  375. package/tests/dataEntry/AntdCalendar/feat_custom_cells.py +52 -52
  376. package/tests/dataEntry/AntdCascader/feat_prefix.py +62 -62
  377. package/tests/dataEntry/AntdCascader/feat_suffix_icon.py +62 -62
  378. package/tests/dataEntry/AntdCascader/fix_read_only.py +74 -74
  379. package/tests/dataEntry/AntdDatePicker/feat_custom_cells.py +79 -79
  380. package/tests/dataEntry/AntdDatePicker/feat_picker_value.py +38 -38
  381. package/tests/dataEntry/AntdDatePicker/feat_prefix.py +21 -21
  382. package/tests/dataEntry/AntdDatePicker/feat_suffix_icon.py +21 -21
  383. package/tests/dataEntry/AntdDateRangePicker/feat_custom_cells.py +79 -79
  384. package/tests/dataEntry/AntdDateRangePicker/feat_picker_value.py +38 -38
  385. package/tests/dataEntry/AntdDateRangePicker/feat_prefix.py +21 -21
  386. package/tests/dataEntry/AntdDateRangePicker/feat_suffix_icon.py +21 -21
  387. package/tests/dataEntry/AntdForm/feat_batch_control_tooltips.py +35 -0
  388. package/tests/dataEntry/AntdForm/feat_optional_batch_control.py +62 -62
  389. package/tests/dataEntry/AntdForm/fix_checkbox.py +65 -65
  390. package/tests/dataEntry/AntdRadioGroup/feat_block.py +40 -40
  391. package/tests/dataEntry/AntdSelect/feat_locale_ru.py +24 -24
  392. package/tests/dataEntry/AntdSelect/feat_max_count.py +28 -28
  393. package/tests/dataEntry/AntdSelect/feat_prefix.py +26 -26
  394. package/tests/dataEntry/AntdSelect/feat_show_search.py +32 -32
  395. package/tests/dataEntry/AntdSelect/feat_suffix_icon.py +46 -46
  396. package/tests/dataEntry/AntdSelect/fix_read_only.py +50 -50
  397. package/tests/dataEntry/AntdSelect/fix_read_only_with_allow_clear.py +29 -29
  398. package/tests/dataEntry/AntdSlider/feat_range_editable.py +49 -49
  399. package/tests/dataEntry/AntdTimePicker/feat_prefix.py +21 -21
  400. package/tests/dataEntry/AntdTimePicker/feat_suffix_icon.py +21 -21
  401. package/tests/dataEntry/AntdTimeRangePicker/feat_prefix.py +21 -21
  402. package/tests/dataEntry/AntdTimeRangePicker/feat_suffix_icon.py +21 -21
  403. package/tests/dataEntry/AntdTreeSelect/feat_async_data_load.py +69 -69
  404. package/tests/dataEntry/AntdTreeSelect/feat_max_count.py +71 -71
  405. package/tests/dataEntry/AntdTreeSelect/feat_prefix.py +43 -43
  406. package/tests/dataEntry/AntdTreeSelect/fix_read_only.py +50 -50
  407. package/tests/dataEntry/AntdUpload/feat_pastable.py +22 -22
  408. package/tests/dataEntry/AntdUpload/fix_follow_theme.py +28 -28
  409. package/tests/feat_variant_underlined.py +100 -100
  410. package/tests/feedback/AntdAlert/feat_icon.py +35 -35
  411. package/tests/feedback/AntdMessage/fix_follow_config_provider.py +44 -44
  412. package/tests/feedback/AntdModal/feat_force_render.py +57 -57
  413. package/tests/feedback/AntdModal/feat_loading_title.py +92 -92
  414. package/tests/feedback/AntdModal/feat_prevent_close.py +54 -54
  415. package/tests/feedback/AntdModal/feat_responsive_width.py +31 -31
  416. package/tests/feedback/AntdNotification/feat_component_content.py +64 -64
  417. package/tests/feedback/AntdNotification/feat_number_of_stack.py +40 -40
  418. package/tests/feedback/AntdNotification/feat_show_progress.py +40 -40
  419. package/tests/feedback/AntdNotification/fix_follow_config_provider.py +46 -46
  420. package/tests/feedback/AntdPopupCard/feat_force_render.py +61 -61
  421. package/tests/feedback/AntdProgress/feat_percent_position.py +39 -39
  422. package/tests/feedback/AntdProgress/perf_size.py +26 -26
  423. package/tests/feedback/AntdProgress/perf_steps.py +37 -37
  424. package/tests/feedback/AntdProgress/perf_stroke_color.py +58 -58
  425. package/tests/feedback/AntdResult/feat_extra.py +26 -26
  426. package/tests/feedback/AntdSkeleton/fix_dash3.py +43 -43
  427. package/tests/general/AntdButton/feat_color_and_variant.py +40 -40
  428. package/tests/general/AntdButton/feat_preset_color.py +46 -46
  429. package/tests/general/AntdFloatButtonGroup/feat_placement.py +83 -83
  430. package/tests/general/AntdFloatButtonGroup/feat_tooltip.py +34 -34
  431. package/tests/general/AntdIcon/feat_iconfont.py +41 -41
  432. package/tests/layout/AntdCenter/feat_use_token.py +41 -41
  433. package/tests/layout/AntdDivider/feat_plain.py +21 -21
  434. package/tests/layout/AntdDivider/feat_size.py +36 -36
  435. package/tests/layout/AntdSplitter/feat_AntdSplitter.py +210 -210
  436. package/tests/layout/AntdSplitter/feat_lazy.py +56 -56
  437. package/tests/layout/AntdSplitter/refactor.py +303 -303
  438. package/tests/navigation/AntdAnchor/feat_current_anchor.py +43 -43
  439. package/tests/navigation/AntdAnchor/feat_direction.py +43 -43
  440. package/tests/navigation/AntdAnchor/feat_replace.py +43 -43
  441. package/tests/navigation/AntdBreadcrumb/feat_menu_item_event.py +64 -64
  442. package/tests/navigation/AntdBreadcrumb/refactor_items.py +140 -140
  443. package/tests/navigation/AntdDropdown/feat_extra.py +29 -29
  444. package/tests/navigation/AntdMenu/feat_currentItem.py +85 -85
  445. package/tests/navigation/AntdMenu/feat_currentItemPath.py +85 -85
  446. package/tests/navigation/AntdMenu/feat_currentKeyPath.py +85 -85
  447. package/tests/navigation/AntdMenu/feat_custom_icon.py +57 -57
  448. package/tests/navigation/AntdMenu/feat_expandIcon.py +70 -70
  449. package/tests/navigation/AntdMenu/feat_triggerSubMenuAction.py +67 -67
  450. package/tests/navigation/AntdMenu/fix_onlyExpandCurrentSubMenu.py +57 -57
  451. package/tests/navigation/AntdMenu/fix_with_sider.py +71 -71
  452. package/tests/navigation/AntdPagination/feat_align.py +31 -31
  453. package/tests/other/AntdAffix/feat_listen_affixed.py +41 -41
  454. package/tests/other/AntdBackTop/refactor.py +18 -18
  455. package/tests/other/AntdConfigProvider/feat_use_css.py +67 -67
  456. package/tests/other/AntdCopyText/feat_copy_table.py +67 -67
  457. package/tests/other/AntdCopyText/feat_tooltips.py +61 -61
  458. package/tests/other/AntdHappyProvider/feat_component.py +60 -60
  459. package/tests/other/Fragment/feat_use_token.py +32 -32
  460. package/usage.py +34 -34
  461. package/webpack.config.js +181 -181
  462. package/webpack.serve.config.js +12 -12
@@ -1,623 +1,623 @@
1
- // react核心
2
- import React, { useState, useEffect, useContext } from 'react';
3
- // antd核心
4
- import { Upload, message, Modal, ConfigProvider } from 'antd';
5
- import AntdIcon from '../../components/general/AntdIcon.react';
6
- // 辅助库
7
- import { isString, isUndefined } from 'lodash';
8
- import { v4 as uuidv4 } from 'uuid';
9
- import { pickBy } from 'ramda';
10
- import { pick } from 'ramda';
11
- import { str2Locale, locale2text } from '../../components/locales.react';
12
- import { useLoading } from '../../components/utils';
13
- // 自定义hooks
14
- import useCss from '../../hooks/useCss';
15
- // 上下文
16
- import PropsContext from '../../contexts/PropsContext';
17
- import FormContext from '../../contexts/FormContext';
18
- // 状态管理
19
- import useFormStore from '../../store/formStore';
20
- // 参数类型
21
- import { propTypes, defaultProps } from '../../components/dataEntry/upload/AntdDraggerUpload.react';
22
-
23
- const { Dragger } = Upload;
24
-
25
- // 解析历史任务完成时间信息
26
- const parseHistoryTaskCompleteTime = (e) => {
27
- let uid2CompleteTime = new Map()
28
- e.forEach((item) => {
29
- uid2CompleteTime.set(item.uid, item.completeTimestamp)
30
- })
31
- return uid2CompleteTime
32
- }
33
-
34
- const draggerUploadStatus2Style = new Map([
35
- ['warning', {
36
- border: "1px solid #faad14",
37
- borderRadius: "2px",
38
- padding: "6px 10px",
39
- transition: "border 0.3s"
40
- }],
41
- ['error', {
42
- border: "1px solid #ff4d4f",
43
- borderRadius: "2px",
44
- padding: "6px 10px",
45
- transition: "border 0.3s"
46
- }]
47
- ])
48
-
49
- /**
50
- * 文件拖拽上传组件AntdDraggerUpload
51
- */
52
- const AntdDraggerUpload = (props) => {
53
- let {
54
- id,
55
- className,
56
- style,
57
- draggerClassName,
58
- draggerStyle,
59
- key,
60
- name,
61
- enableBatchControl,
62
- locale,
63
- apiUrl,
64
- apiUrlExtraParams,
65
- headers,
66
- withCredentials,
67
- withOriginFileObj,
68
- downloadUrl,
69
- downloadUrlExtraParams,
70
- downloadUrlFromBackend,
71
- icon,
72
- text,
73
- hint,
74
- uploadId,
75
- fileListMaxLength,
76
- fileTypes,
77
- fileMaxSize,
78
- showUploadList,
79
- multiple,
80
- directory,
81
- failedTooltipInfo,
82
- confirmBeforeDelete,
83
- showPercent,
84
- progressProps,
85
- showSuccessMessage,
86
- showErrorMessage,
87
- pastable,
88
- listUploadTaskRecord,
89
- defaultFileList,
90
- disabled,
91
- status,
92
- setProps,
93
- ...others
94
- } = props;
95
-
96
- const [messageApi, messageContextHolder] = message.useMessage();
97
- const [modalApi, modalContextHolder] = Modal.useModal();
98
-
99
- const context = useContext(PropsContext)
100
- const formId = useContext(FormContext)
101
-
102
- const updateItemValue = useFormStore((state) => state.updateItemValue)
103
- const deleteItemValue = useFormStore((state) => state.deleteItemValue)
104
-
105
- locale = (context && context.locale) || locale
106
- downloadUrlFromBackend = downloadUrl ? false : downloadUrlFromBackend
107
-
108
- // 收集当前组件相关表单值
109
- const currentFormValue = useFormStore(state => state.values?.[formId]?.[name || id])
110
-
111
- // 针对上传类组件,特殊处理由表单值控制上传列表的清空
112
- useEffect(() => {
113
- // 若上文中存在有效表单id
114
- if (formId && (name || id) && enableBatchControl) {
115
- if (!currentFormValue || currentFormValue.length === 0) {
116
- // 清空上传列表
117
- updateFileList([])
118
- setProps({
119
- listUploadTaskRecord: [],
120
- lastUploadTaskRecord: null
121
- })
122
- }
123
- }
124
- }, [currentFormValue])
125
-
126
- // 处理组件卸载后,对应表单项值的清除
127
- useEffect(() => {
128
- return () => {
129
- // 若上文中存在有效表单id
130
- if (formId && (name || id) && enableBatchControl) {
131
- // 表单值更新
132
- deleteItemValue(formId, name || id)
133
- }
134
- }
135
- }, [name, id])
136
-
137
- // 更新已上传文件 -> 上传完成时间映射字典
138
- const uploadedFile2CompleteTime = parseHistoryTaskCompleteTime(listUploadTaskRecord || [])
139
-
140
- useEffect(() => {
141
- // 初始化uploadId
142
- if (!uploadId) {
143
- if (defaultFileList && defaultFileList.length > 0) {
144
- setProps({ uploadId: defaultFileList[0].taskId || uuidv4() })
145
- } else {
146
- setProps({ uploadId: uuidv4() })
147
- }
148
- }
149
- }, [])
150
-
151
- const [fileList, updateFileList] = useState(defaultFileList || listUploadTaskRecord.map((item) => {
152
- return {
153
- name: item.fileName,
154
- status: item.taskStatus,
155
- uid: item.uid,
156
- url: item.url,
157
- uploadResponse: item.uploadResponse,
158
- fileSize: item.fileSize
159
- };
160
- }));
161
-
162
- let uploadProps = {
163
- name: 'file',
164
- action: (file) => {
165
- if (withOriginFileObj) {
166
- return apiUrl + `?uploadId=${uploadId}&webkitRelativePath=${encodeURI(file.webkitRelativePath)}`;
167
- } return apiUrl + `?uploadId=${uploadId}`;
168
- },
169
- headers: headers,
170
- data: {
171
- uploadId: uploadId,
172
- ...apiUrlExtraParams
173
- },
174
- withCredentials: withCredentials,
175
- beforeUpload: (file) => {
176
- const sizeCheck = file.size / 1024 / 1024 < fileMaxSize;
177
- if (!sizeCheck) {
178
- messageApi.error(`${file.name}${locale2text.Upload[locale].sizeError[0]}${fileMaxSize}${locale2text.Upload[locale].sizeError[1]}`);
179
- }
180
-
181
- if (fileTypes) {
182
- if (fileTypes.indexOf(file.name.split('.')[file.name.split('.').length - 1]) === -1) {
183
- messageApi.error(`${locale2text.Upload[locale].typeError[0]}${file.name}${locale2text.Upload[locale].typeError[1]}`);
184
- }
185
-
186
- return sizeCheck && fileTypes.indexOf(file.name.split('.')[file.name.split('.').length - 1]) !== -1;
187
- }
188
-
189
- return sizeCheck;
190
- },
191
- onChange(info) {
192
-
193
- // 计算最近一次任务的子任务数量
194
- let lastTaskCount
195
- if (info.file.status === 'removed') {
196
- lastTaskCount = 0
197
- } else {
198
- lastTaskCount = info.fileList.length - listUploadTaskRecord.length;
199
- }
200
-
201
- // 当上传模式为multiple或directory时
202
- if (multiple || directory) {
203
- // 若当前事件为removed
204
- if (info.file.status === 'removed') {
205
-
206
- let _listUploadTaskRecord = info.fileList.map(
207
- (file) => {
208
- // 配置已完成上传文件下载链接
209
- let urlInfo = downloadUrlFromBackend ?
210
- (file.response ? { url: file.response.url } : {}) :
211
- (
212
- downloadUrl && (file.status === 'done' || file.status === 'success') ?
213
- {
214
- url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
215
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
216
- )
217
- } :
218
- {}
219
- )
220
- // 配置已完成上传文件接口响应信息
221
- let responseInfo = file.response ? { uploadResponse: file.response } : {}
222
- return {
223
- fileName: file.name,
224
- fileSize: file.size,
225
- completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
226
- taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
227
- taskId: uploadId,
228
- uid: file.uid,
229
- ...urlInfo,
230
- ...responseInfo,
231
- // 处理originFileObj信息携带
232
- ...(
233
- withOriginFileObj ?
234
- {
235
- originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
236
- } :
237
- {}
238
- )
239
- }
240
- }
241
- )
242
-
243
- // AntdForm表单批量控制
244
- if (formId && (name || id) && enableBatchControl) {
245
- // 表单值更新
246
- updateItemValue(formId, name || id, _listUploadTaskRecord)
247
- }
248
- // 更新任务记录
249
- setProps({
250
- listUploadTaskRecord: _listUploadTaskRecord
251
- })
252
- } else {
253
- // 其他常规事件
254
- // 判断此次任务所有文件是否已上传结束(done或error)
255
- if (info.fileList.slice(-lastTaskCount).every(file => file.status !== 'uploading')) {
256
-
257
- if (info.fileList.slice(-lastTaskCount).every(file => !file.status)) {
258
-
259
- } else {
260
- if (lastTaskCount > 0) {
261
- let _listUploadTaskRecord = info.fileList.map(
262
- (file) => {
263
- // 配置已完成上传文件下载链接
264
- let urlInfo = downloadUrlFromBackend ?
265
- (file.response ? { url: file.response.url } : {}) :
266
- (
267
- downloadUrl && (file.status === 'done' || file.status === 'success') ?
268
- {
269
- url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
270
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
271
- )
272
- } :
273
- {}
274
- )
275
- // 配置已完成上传文件接口响应信息
276
- let responseInfo = file.response ? { uploadResponse: file.response } : {}
277
- return {
278
- fileName: file.name,
279
- fileSize: file.size,
280
- completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
281
- taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
282
- taskId: uploadId,
283
- uid: file.uid,
284
- ...urlInfo,
285
- ...responseInfo,
286
- // 处理originFileObj信息携带
287
- ...(
288
- withOriginFileObj ?
289
- {
290
- originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
291
- } :
292
- {}
293
- )
294
- }
295
- }
296
- )
297
-
298
- // AntdForm表单批量控制
299
- if (formId && (name || id) && enableBatchControl) {
300
- // 表单值更新
301
- updateItemValue(formId, name || id, _listUploadTaskRecord)
302
- }
303
- // 更新任务记录
304
- setProps({
305
- lastUploadTaskRecord: info.fileList.slice(-lastTaskCount).map(
306
- (file) => {
307
- // 配置已完成上传文件下载链接
308
- let urlInfo = downloadUrlFromBackend ?
309
- (file.response ? { url: file.response.url } : {}) :
310
- (
311
- downloadUrl && (file.status === 'done' || file.status === 'success') ?
312
- {
313
- url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
314
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
315
- )
316
- } :
317
- {}
318
- )
319
- // 配置已完成上传文件接口响应信息
320
- let responseInfo = file.response ? { uploadResponse: file.response } : {}
321
- return {
322
- fileName: file.name,
323
- fileSize: file.size,
324
- completeTimestamp: new Date().getTime(),
325
- taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
326
- taskId: uploadId,
327
- ...urlInfo,
328
- ...responseInfo
329
- }
330
- }
331
- ),
332
- listUploadTaskRecord: _listUploadTaskRecord
333
- })
334
- }
335
- }
336
-
337
- }
338
-
339
- }
340
-
341
- } else {
342
- // 单文件上传模式
343
- // 若当前事件为removed
344
- if (info.file.status === 'removed') {
345
-
346
- let _listUploadTaskRecord = info.fileList.map(
347
- (file) => {
348
- // 配置已完成上传文件下载链接
349
- let urlInfo = downloadUrlFromBackend ?
350
- (file.response ? { url: file.response.url } : {}) :
351
- (
352
- downloadUrl && (file.status === 'done' || file.status === 'success') ?
353
- {
354
- url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
355
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
356
- )
357
- } :
358
- {}
359
- )
360
- // 配置已完成上传文件接口响应信息
361
- let responseInfo = file.response ? { uploadResponse: file.response } : {}
362
- return {
363
- fileName: file.name,
364
- fileSize: file.size,
365
- completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
366
- taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
367
- taskId: uploadId,
368
- uid: file.uid,
369
- ...urlInfo,
370
- ...responseInfo,
371
- // 处理originFileObj信息携带
372
- ...(
373
- withOriginFileObj ?
374
- {
375
- originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
376
- } :
377
- {}
378
- )
379
- }
380
- }
381
- )
382
-
383
- // AntdForm表单批量控制
384
- if (formId && (name || id) && enableBatchControl) {
385
- // 表单值更新
386
- updateItemValue(formId, name || id, _listUploadTaskRecord)
387
- }
388
- // 更新任务记录
389
- setProps({
390
- listUploadTaskRecord: _listUploadTaskRecord
391
- })
392
- } else if (info.file.status === 'done' || info.file.status === 'success' || info.file.status === 'error' || !info.file.status) {
393
- let _listUploadTaskRecord = info.fileList.map(
394
- (file) => {
395
- // 配置已完成上传文件下载链接
396
- let urlInfo = downloadUrlFromBackend ?
397
- (file.response ? { url: file.response.url } : {}) :
398
- (
399
- downloadUrl && (file.status === 'done' || file.status === 'success') ?
400
- {
401
- url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
402
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
403
- )
404
- } :
405
- {}
406
- )
407
- // 配置已完成上传文件接口响应信息
408
- let responseInfo = file.response ? { uploadResponse: file.response } : {}
409
- return {
410
- fileName: file.name,
411
- fileSize: file.size,
412
- completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
413
- taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
414
- taskId: uploadId,
415
- uid: file.uid,
416
- ...urlInfo,
417
- ...responseInfo,
418
- // 处理originFileObj信息携带
419
- ...(
420
- withOriginFileObj ?
421
- {
422
- originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
423
- } :
424
- {}
425
- )
426
- }
427
- }
428
- )
429
-
430
- // AntdForm表单批量控制
431
- if (formId && (name || id) && enableBatchControl) {
432
- // 表单值更新
433
- updateItemValue(formId, name || id, _listUploadTaskRecord)
434
- }
435
- setProps({
436
- lastUploadTaskRecord: {
437
- fileName: info.file.name,
438
- fileSize: info.file.size,
439
- completeTimestamp: new Date().getTime(),
440
- taskStatus: (info.file.status === 'done' || info.file.status === 'success') ? 'success' : 'failed',
441
- taskId: uploadId,
442
- ...(
443
- downloadUrlFromBackend ?
444
- (info.file.response ? { url: info.file.response.url } : {}) :
445
- (
446
- downloadUrl && (info.file.status === 'done' || info.file.status === 'success') ?
447
- {
448
- url: downloadUrl + `?taskId=${uploadId}&filename=${info.file.name}` + (
449
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
450
- )
451
- } :
452
- {}
453
- )
454
- ),
455
- ...(
456
- info.file.response ? { uploadResponse: info.file.response } : {}
457
- )
458
- },
459
- listUploadTaskRecord: _listUploadTaskRecord
460
- })
461
- }
462
- }
463
-
464
- if ((info.file.status === 'done' || info.file.status === 'success') && showSuccessMessage) {
465
- messageApi.success(`${info.file.name} ${locale2text.Upload[locale].uploadSuccess}`);
466
- } else if (info.file.status === 'error' && showErrorMessage) {
467
- messageApi.error(`${info.file.name} ${locale2text.Upload[locale].uploadFailed}`);
468
- }
469
-
470
- // 获取当前上传文件列表
471
- let _fileList = [...info.fileList];
472
-
473
- // 是否限制上传记录列表最大数量
474
- if (fileListMaxLength) {
475
- _fileList = _fileList.slice(-fileListMaxLength);
476
- }
477
-
478
- if (lastTaskCount !== 0) {
479
- _fileList = _fileList.slice(0, _fileList.length - lastTaskCount)
480
- .concat(
481
- _fileList.slice(-lastTaskCount).map(
482
- item => {
483
- if (item.status === 'error' || !item.status) {
484
-
485
- item.status = 'error'
486
- item.response = failedTooltipInfo ? failedTooltipInfo : '上传失败'
487
- }
488
- return item
489
- }
490
- )
491
- )
492
- }
493
-
494
- if (downloadUrl) {
495
- updateFileList(
496
- _fileList.map(
497
- item => {
498
- // 配置已完成上传文件接口响应信息
499
- let responseInfo = item.response ? { uploadResponse: item.response } : {}
500
- return {
501
- ...item,
502
- url: downloadUrl + `?taskId=${uploadId}&filename=${item.name}` + (
503
- Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
504
- ),
505
- ...responseInfo
506
- }
507
- }
508
- )
509
- )
510
- } else if (downloadUrlFromBackend) {
511
- updateFileList(
512
- _fileList.map(
513
- item => {
514
- if (item.response) {
515
- return {
516
- ...item,
517
- url: item.response.url,
518
- uploadResponse: item.response
519
- }
520
- }
521
- return {
522
- ...item
523
- }
524
- }
525
- )
526
- )
527
- } else {
528
- updateFileList(_fileList)
529
- }
530
- }
531
- };
532
-
533
- // 添加accept参数
534
- if (fileTypes && fileTypes.length != 0) {
535
- Object.assign(uploadProps, { accept: '.' + fileTypes.join(',.') })
536
- }
537
-
538
- return (
539
- <ConfigProvider locale={str2Locale.get(locale)}>
540
- <div
541
- // 提取具有data-*或aria-*通配格式的属性
542
- {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
543
- id={id}
544
- className={
545
- isString(className) ?
546
- className :
547
- (className ? useCss(className) : undefined)
548
- }
549
- style={{
550
- border: "1px solid transparent",
551
- transition: "border 0.3s",
552
- ...draggerUploadStatus2Style.get(status),
553
- ...style
554
- }}
555
- key={key}
556
- data-dash-is-loading={useLoading()}>
557
- {messageContextHolder}
558
- {modalContextHolder}
559
- <Dragger
560
- draggerStyle={draggerStyle}
561
- draggerClassName={
562
- isString(draggerClassName) ?
563
- draggerClassName :
564
- (draggerClassName ? useCss(draggerClassName) : undefined)
565
- }
566
- fileList={fileList}
567
- showUploadList={showUploadList}
568
- multiple={multiple}
569
- directory={directory}
570
- pastable={pastable}
571
- disabled={
572
- context && !isUndefined(context.componentDisabled) ?
573
- context.componentDisabled :
574
- disabled
575
- }
576
- progress={
577
- progressProps || showPercent ?
578
- {
579
- strokeColor: progressProps && progressProps.strokeColor,
580
- strokeWidth: (progressProps && progressProps.strokeWidth) || 2,
581
- format: (
582
- showPercent ? (
583
- (percent) => percent && `${(progressProps && progressProps.prefix) || ''}${parseFloat(percent.toFixed(1))}${(progressProps && progressProps.suffix) || '%'}`
584
- ) :
585
- undefined
586
- )
587
- } :
588
- undefined
589
- }
590
- onRemove={
591
- confirmBeforeDelete ?
592
- () => {
593
- return new Promise((resolve, reject) => {
594
- modalApi.confirm({
595
- title: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteTitle,
596
- okText: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteOkText,
597
- cancelText: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteCancelText,
598
- onOk: () => {
599
- resolve(true);
600
- }
601
- });
602
- });
603
- } :
604
- undefined
605
- }
606
- {...uploadProps}>
607
- <p className="ant-upload-drag-icon">
608
- {icon || <AntdIcon icon={'antd-cloud-upload'} />}
609
- </p>
610
- <p className="ant-upload-text">{text}</p>
611
- <p className="ant-upload-hint">
612
- {hint}
613
- </p>
614
- </Dragger>
615
- </div>
616
- </ConfigProvider>
617
- );
618
- }
619
-
620
- export default AntdDraggerUpload;
621
-
622
- AntdDraggerUpload.defaultProps = defaultProps;
1
+ // react核心
2
+ import React, { useState, useEffect, useContext } from 'react';
3
+ // antd核心
4
+ import { Upload, message, Modal, ConfigProvider } from 'antd';
5
+ import AntdIcon from '../../components/general/AntdIcon.react';
6
+ // 辅助库
7
+ import { isString, isUndefined } from 'lodash';
8
+ import { v4 as uuidv4 } from 'uuid';
9
+ import { pickBy } from 'ramda';
10
+ import { pick } from 'ramda';
11
+ import { str2Locale, locale2text } from '../../components/locales.react';
12
+ import { useLoading } from '../../components/utils';
13
+ // 自定义hooks
14
+ import useCss from '../../hooks/useCss';
15
+ // 上下文
16
+ import PropsContext from '../../contexts/PropsContext';
17
+ import FormContext from '../../contexts/FormContext';
18
+ // 状态管理
19
+ import useFormStore from '../../store/formStore';
20
+ // 参数类型
21
+ import { propTypes, defaultProps } from '../../components/dataEntry/upload/AntdDraggerUpload.react';
22
+
23
+ const { Dragger } = Upload;
24
+
25
+ // 解析历史任务完成时间信息
26
+ const parseHistoryTaskCompleteTime = (e) => {
27
+ let uid2CompleteTime = new Map()
28
+ e.forEach((item) => {
29
+ uid2CompleteTime.set(item.uid, item.completeTimestamp)
30
+ })
31
+ return uid2CompleteTime
32
+ }
33
+
34
+ const draggerUploadStatus2Style = new Map([
35
+ ['warning', {
36
+ border: "1px solid #faad14",
37
+ borderRadius: "2px",
38
+ padding: "6px 10px",
39
+ transition: "border 0.3s"
40
+ }],
41
+ ['error', {
42
+ border: "1px solid #ff4d4f",
43
+ borderRadius: "2px",
44
+ padding: "6px 10px",
45
+ transition: "border 0.3s"
46
+ }]
47
+ ])
48
+
49
+ /**
50
+ * 文件拖拽上传组件AntdDraggerUpload
51
+ */
52
+ const AntdDraggerUpload = (props) => {
53
+ let {
54
+ id,
55
+ className,
56
+ style,
57
+ draggerClassName,
58
+ draggerStyle,
59
+ key,
60
+ name,
61
+ enableBatchControl,
62
+ locale,
63
+ apiUrl,
64
+ apiUrlExtraParams,
65
+ headers,
66
+ withCredentials,
67
+ withOriginFileObj,
68
+ downloadUrl,
69
+ downloadUrlExtraParams,
70
+ downloadUrlFromBackend,
71
+ icon,
72
+ text,
73
+ hint,
74
+ uploadId,
75
+ fileListMaxLength,
76
+ fileTypes,
77
+ fileMaxSize,
78
+ showUploadList,
79
+ multiple,
80
+ directory,
81
+ failedTooltipInfo,
82
+ confirmBeforeDelete,
83
+ showPercent,
84
+ progressProps,
85
+ showSuccessMessage,
86
+ showErrorMessage,
87
+ pastable,
88
+ listUploadTaskRecord,
89
+ defaultFileList,
90
+ disabled,
91
+ status,
92
+ setProps,
93
+ ...others
94
+ } = props;
95
+
96
+ const [messageApi, messageContextHolder] = message.useMessage();
97
+ const [modalApi, modalContextHolder] = Modal.useModal();
98
+
99
+ const context = useContext(PropsContext)
100
+ const formId = useContext(FormContext)
101
+
102
+ const updateItemValue = useFormStore((state) => state.updateItemValue)
103
+ const deleteItemValue = useFormStore((state) => state.deleteItemValue)
104
+
105
+ locale = (context && context.locale) || locale
106
+ downloadUrlFromBackend = downloadUrl ? false : downloadUrlFromBackend
107
+
108
+ // 收集当前组件相关表单值
109
+ const currentFormValue = useFormStore(state => state.values?.[formId]?.[name || id])
110
+
111
+ // 针对上传类组件,特殊处理由表单值控制上传列表的清空
112
+ useEffect(() => {
113
+ // 若上文中存在有效表单id
114
+ if (formId && (name || id) && enableBatchControl) {
115
+ if (!currentFormValue || currentFormValue.length === 0) {
116
+ // 清空上传列表
117
+ updateFileList([])
118
+ setProps({
119
+ listUploadTaskRecord: [],
120
+ lastUploadTaskRecord: null
121
+ })
122
+ }
123
+ }
124
+ }, [currentFormValue])
125
+
126
+ // 处理组件卸载后,对应表单项值的清除
127
+ useEffect(() => {
128
+ return () => {
129
+ // 若上文中存在有效表单id
130
+ if (formId && (name || id) && enableBatchControl) {
131
+ // 表单值更新
132
+ deleteItemValue(formId, name || id)
133
+ }
134
+ }
135
+ }, [name, id])
136
+
137
+ // 更新已上传文件 -> 上传完成时间映射字典
138
+ const uploadedFile2CompleteTime = parseHistoryTaskCompleteTime(listUploadTaskRecord || [])
139
+
140
+ useEffect(() => {
141
+ // 初始化uploadId
142
+ if (!uploadId) {
143
+ if (defaultFileList && defaultFileList.length > 0) {
144
+ setProps({ uploadId: defaultFileList[0].taskId || uuidv4() })
145
+ } else {
146
+ setProps({ uploadId: uuidv4() })
147
+ }
148
+ }
149
+ }, [])
150
+
151
+ const [fileList, updateFileList] = useState(defaultFileList || listUploadTaskRecord.map((item) => {
152
+ return {
153
+ name: item.fileName,
154
+ status: item.taskStatus,
155
+ uid: item.uid,
156
+ url: item.url,
157
+ uploadResponse: item.uploadResponse,
158
+ fileSize: item.fileSize
159
+ };
160
+ }));
161
+
162
+ let uploadProps = {
163
+ name: 'file',
164
+ action: (file) => {
165
+ if (withOriginFileObj) {
166
+ return apiUrl + `?uploadId=${uploadId}&webkitRelativePath=${encodeURI(file.webkitRelativePath)}`;
167
+ } return apiUrl + `?uploadId=${uploadId}`;
168
+ },
169
+ headers: headers,
170
+ data: {
171
+ uploadId: uploadId,
172
+ ...apiUrlExtraParams
173
+ },
174
+ withCredentials: withCredentials,
175
+ beforeUpload: (file) => {
176
+ const sizeCheck = file.size / 1024 / 1024 < fileMaxSize;
177
+ if (!sizeCheck) {
178
+ messageApi.error(`${file.name}${locale2text.Upload[locale].sizeError[0]}${fileMaxSize}${locale2text.Upload[locale].sizeError[1]}`);
179
+ }
180
+
181
+ if (fileTypes) {
182
+ if (fileTypes.indexOf(file.name.split('.')[file.name.split('.').length - 1]) === -1) {
183
+ messageApi.error(`${locale2text.Upload[locale].typeError[0]}${file.name}${locale2text.Upload[locale].typeError[1]}`);
184
+ }
185
+
186
+ return sizeCheck && fileTypes.indexOf(file.name.split('.')[file.name.split('.').length - 1]) !== -1;
187
+ }
188
+
189
+ return sizeCheck;
190
+ },
191
+ onChange(info) {
192
+
193
+ // 计算最近一次任务的子任务数量
194
+ let lastTaskCount
195
+ if (info.file.status === 'removed') {
196
+ lastTaskCount = 0
197
+ } else {
198
+ lastTaskCount = info.fileList.length - listUploadTaskRecord.length;
199
+ }
200
+
201
+ // 当上传模式为multiple或directory时
202
+ if (multiple || directory) {
203
+ // 若当前事件为removed
204
+ if (info.file.status === 'removed') {
205
+
206
+ let _listUploadTaskRecord = info.fileList.map(
207
+ (file) => {
208
+ // 配置已完成上传文件下载链接
209
+ let urlInfo = downloadUrlFromBackend ?
210
+ (file.response ? { url: file.response.url } : {}) :
211
+ (
212
+ downloadUrl && (file.status === 'done' || file.status === 'success') ?
213
+ {
214
+ url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
215
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
216
+ )
217
+ } :
218
+ {}
219
+ )
220
+ // 配置已完成上传文件接口响应信息
221
+ let responseInfo = file.response ? { uploadResponse: file.response } : {}
222
+ return {
223
+ fileName: file.name,
224
+ fileSize: file.size,
225
+ completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
226
+ taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
227
+ taskId: uploadId,
228
+ uid: file.uid,
229
+ ...urlInfo,
230
+ ...responseInfo,
231
+ // 处理originFileObj信息携带
232
+ ...(
233
+ withOriginFileObj ?
234
+ {
235
+ originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
236
+ } :
237
+ {}
238
+ )
239
+ }
240
+ }
241
+ )
242
+
243
+ // AntdForm表单批量控制
244
+ if (formId && (name || id) && enableBatchControl) {
245
+ // 表单值更新
246
+ updateItemValue(formId, name || id, _listUploadTaskRecord)
247
+ }
248
+ // 更新任务记录
249
+ setProps({
250
+ listUploadTaskRecord: _listUploadTaskRecord
251
+ })
252
+ } else {
253
+ // 其他常规事件
254
+ // 判断此次任务所有文件是否已上传结束(done或error)
255
+ if (info.fileList.slice(-lastTaskCount).every(file => file.status !== 'uploading')) {
256
+
257
+ if (info.fileList.slice(-lastTaskCount).every(file => !file.status)) {
258
+
259
+ } else {
260
+ if (lastTaskCount > 0) {
261
+ let _listUploadTaskRecord = info.fileList.map(
262
+ (file) => {
263
+ // 配置已完成上传文件下载链接
264
+ let urlInfo = downloadUrlFromBackend ?
265
+ (file.response ? { url: file.response.url } : {}) :
266
+ (
267
+ downloadUrl && (file.status === 'done' || file.status === 'success') ?
268
+ {
269
+ url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
270
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
271
+ )
272
+ } :
273
+ {}
274
+ )
275
+ // 配置已完成上传文件接口响应信息
276
+ let responseInfo = file.response ? { uploadResponse: file.response } : {}
277
+ return {
278
+ fileName: file.name,
279
+ fileSize: file.size,
280
+ completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
281
+ taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
282
+ taskId: uploadId,
283
+ uid: file.uid,
284
+ ...urlInfo,
285
+ ...responseInfo,
286
+ // 处理originFileObj信息携带
287
+ ...(
288
+ withOriginFileObj ?
289
+ {
290
+ originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
291
+ } :
292
+ {}
293
+ )
294
+ }
295
+ }
296
+ )
297
+
298
+ // AntdForm表单批量控制
299
+ if (formId && (name || id) && enableBatchControl) {
300
+ // 表单值更新
301
+ updateItemValue(formId, name || id, _listUploadTaskRecord)
302
+ }
303
+ // 更新任务记录
304
+ setProps({
305
+ lastUploadTaskRecord: info.fileList.slice(-lastTaskCount).map(
306
+ (file) => {
307
+ // 配置已完成上传文件下载链接
308
+ let urlInfo = downloadUrlFromBackend ?
309
+ (file.response ? { url: file.response.url } : {}) :
310
+ (
311
+ downloadUrl && (file.status === 'done' || file.status === 'success') ?
312
+ {
313
+ url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
314
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
315
+ )
316
+ } :
317
+ {}
318
+ )
319
+ // 配置已完成上传文件接口响应信息
320
+ let responseInfo = file.response ? { uploadResponse: file.response } : {}
321
+ return {
322
+ fileName: file.name,
323
+ fileSize: file.size,
324
+ completeTimestamp: new Date().getTime(),
325
+ taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
326
+ taskId: uploadId,
327
+ ...urlInfo,
328
+ ...responseInfo
329
+ }
330
+ }
331
+ ),
332
+ listUploadTaskRecord: _listUploadTaskRecord
333
+ })
334
+ }
335
+ }
336
+
337
+ }
338
+
339
+ }
340
+
341
+ } else {
342
+ // 单文件上传模式
343
+ // 若当前事件为removed
344
+ if (info.file.status === 'removed') {
345
+
346
+ let _listUploadTaskRecord = info.fileList.map(
347
+ (file) => {
348
+ // 配置已完成上传文件下载链接
349
+ let urlInfo = downloadUrlFromBackend ?
350
+ (file.response ? { url: file.response.url } : {}) :
351
+ (
352
+ downloadUrl && (file.status === 'done' || file.status === 'success') ?
353
+ {
354
+ url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
355
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
356
+ )
357
+ } :
358
+ {}
359
+ )
360
+ // 配置已完成上传文件接口响应信息
361
+ let responseInfo = file.response ? { uploadResponse: file.response } : {}
362
+ return {
363
+ fileName: file.name,
364
+ fileSize: file.size,
365
+ completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
366
+ taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
367
+ taskId: uploadId,
368
+ uid: file.uid,
369
+ ...urlInfo,
370
+ ...responseInfo,
371
+ // 处理originFileObj信息携带
372
+ ...(
373
+ withOriginFileObj ?
374
+ {
375
+ originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
376
+ } :
377
+ {}
378
+ )
379
+ }
380
+ }
381
+ )
382
+
383
+ // AntdForm表单批量控制
384
+ if (formId && (name || id) && enableBatchControl) {
385
+ // 表单值更新
386
+ updateItemValue(formId, name || id, _listUploadTaskRecord)
387
+ }
388
+ // 更新任务记录
389
+ setProps({
390
+ listUploadTaskRecord: _listUploadTaskRecord
391
+ })
392
+ } else if (info.file.status === 'done' || info.file.status === 'success' || info.file.status === 'error' || !info.file.status) {
393
+ let _listUploadTaskRecord = info.fileList.map(
394
+ (file) => {
395
+ // 配置已完成上传文件下载链接
396
+ let urlInfo = downloadUrlFromBackend ?
397
+ (file.response ? { url: file.response.url } : {}) :
398
+ (
399
+ downloadUrl && (file.status === 'done' || file.status === 'success') ?
400
+ {
401
+ url: downloadUrl + `?taskId=${uploadId}&filename=${file.name}` + (
402
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
403
+ )
404
+ } :
405
+ {}
406
+ )
407
+ // 配置已完成上传文件接口响应信息
408
+ let responseInfo = file.response ? { uploadResponse: file.response } : {}
409
+ return {
410
+ fileName: file.name,
411
+ fileSize: file.size,
412
+ completeTimestamp: uploadedFile2CompleteTime.get(file.uid) || new Date().getTime(),
413
+ taskStatus: (file.status === 'done' || file.status === 'success') ? 'success' : 'failed',
414
+ taskId: uploadId,
415
+ uid: file.uid,
416
+ ...urlInfo,
417
+ ...responseInfo,
418
+ // 处理originFileObj信息携带
419
+ ...(
420
+ withOriginFileObj ?
421
+ {
422
+ originFileObj: pick(['name', 'size', 'type', 'webkitRelativePath'], file.originFileObj)
423
+ } :
424
+ {}
425
+ )
426
+ }
427
+ }
428
+ )
429
+
430
+ // AntdForm表单批量控制
431
+ if (formId && (name || id) && enableBatchControl) {
432
+ // 表单值更新
433
+ updateItemValue(formId, name || id, _listUploadTaskRecord)
434
+ }
435
+ setProps({
436
+ lastUploadTaskRecord: {
437
+ fileName: info.file.name,
438
+ fileSize: info.file.size,
439
+ completeTimestamp: new Date().getTime(),
440
+ taskStatus: (info.file.status === 'done' || info.file.status === 'success') ? 'success' : 'failed',
441
+ taskId: uploadId,
442
+ ...(
443
+ downloadUrlFromBackend ?
444
+ (info.file.response ? { url: info.file.response.url } : {}) :
445
+ (
446
+ downloadUrl && (info.file.status === 'done' || info.file.status === 'success') ?
447
+ {
448
+ url: downloadUrl + `?taskId=${uploadId}&filename=${info.file.name}` + (
449
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
450
+ )
451
+ } :
452
+ {}
453
+ )
454
+ ),
455
+ ...(
456
+ info.file.response ? { uploadResponse: info.file.response } : {}
457
+ )
458
+ },
459
+ listUploadTaskRecord: _listUploadTaskRecord
460
+ })
461
+ }
462
+ }
463
+
464
+ if ((info.file.status === 'done' || info.file.status === 'success') && showSuccessMessage) {
465
+ messageApi.success(`${info.file.name} ${locale2text.Upload[locale].uploadSuccess}`);
466
+ } else if (info.file.status === 'error' && showErrorMessage) {
467
+ messageApi.error(`${info.file.name} ${locale2text.Upload[locale].uploadFailed}`);
468
+ }
469
+
470
+ // 获取当前上传文件列表
471
+ let _fileList = [...info.fileList];
472
+
473
+ // 是否限制上传记录列表最大数量
474
+ if (fileListMaxLength) {
475
+ _fileList = _fileList.slice(-fileListMaxLength);
476
+ }
477
+
478
+ if (lastTaskCount !== 0) {
479
+ _fileList = _fileList.slice(0, _fileList.length - lastTaskCount)
480
+ .concat(
481
+ _fileList.slice(-lastTaskCount).map(
482
+ item => {
483
+ if (item.status === 'error' || !item.status) {
484
+
485
+ item.status = 'error'
486
+ item.response = failedTooltipInfo ? failedTooltipInfo : '上传失败'
487
+ }
488
+ return item
489
+ }
490
+ )
491
+ )
492
+ }
493
+
494
+ if (downloadUrl) {
495
+ updateFileList(
496
+ _fileList.map(
497
+ item => {
498
+ // 配置已完成上传文件接口响应信息
499
+ let responseInfo = item.response ? { uploadResponse: item.response } : {}
500
+ return {
501
+ ...item,
502
+ url: downloadUrl + `?taskId=${uploadId}&filename=${item.name}` + (
503
+ Object.keys(downloadUrlExtraParams).map(key => `&${key}=${downloadUrlExtraParams[key]}`).join('')
504
+ ),
505
+ ...responseInfo
506
+ }
507
+ }
508
+ )
509
+ )
510
+ } else if (downloadUrlFromBackend) {
511
+ updateFileList(
512
+ _fileList.map(
513
+ item => {
514
+ if (item.response) {
515
+ return {
516
+ ...item,
517
+ url: item.response.url,
518
+ uploadResponse: item.response
519
+ }
520
+ }
521
+ return {
522
+ ...item
523
+ }
524
+ }
525
+ )
526
+ )
527
+ } else {
528
+ updateFileList(_fileList)
529
+ }
530
+ }
531
+ };
532
+
533
+ // 添加accept参数
534
+ if (fileTypes && fileTypes.length != 0) {
535
+ Object.assign(uploadProps, { accept: '.' + fileTypes.join(',.') })
536
+ }
537
+
538
+ return (
539
+ <ConfigProvider locale={str2Locale.get(locale)}>
540
+ <div
541
+ // 提取具有data-*或aria-*通配格式的属性
542
+ {...pickBy((_, k) => k.startsWith('data-') || k.startsWith('aria-'), others)}
543
+ id={id}
544
+ className={
545
+ isString(className) ?
546
+ className :
547
+ (className ? useCss(className) : undefined)
548
+ }
549
+ style={{
550
+ border: "1px solid transparent",
551
+ transition: "border 0.3s",
552
+ ...draggerUploadStatus2Style.get(status),
553
+ ...style
554
+ }}
555
+ key={key}
556
+ data-dash-is-loading={useLoading()}>
557
+ {messageContextHolder}
558
+ {modalContextHolder}
559
+ <Dragger
560
+ draggerStyle={draggerStyle}
561
+ draggerClassName={
562
+ isString(draggerClassName) ?
563
+ draggerClassName :
564
+ (draggerClassName ? useCss(draggerClassName) : undefined)
565
+ }
566
+ fileList={fileList}
567
+ showUploadList={showUploadList}
568
+ multiple={multiple}
569
+ directory={directory}
570
+ pastable={pastable}
571
+ disabled={
572
+ context && !isUndefined(context.componentDisabled) ?
573
+ context.componentDisabled :
574
+ disabled
575
+ }
576
+ progress={
577
+ progressProps || showPercent ?
578
+ {
579
+ strokeColor: progressProps && progressProps.strokeColor,
580
+ strokeWidth: (progressProps && progressProps.strokeWidth) || 2,
581
+ format: (
582
+ showPercent ? (
583
+ (percent) => percent && `${(progressProps && progressProps.prefix) || ''}${parseFloat(percent.toFixed(1))}${(progressProps && progressProps.suffix) || '%'}`
584
+ ) :
585
+ undefined
586
+ )
587
+ } :
588
+ undefined
589
+ }
590
+ onRemove={
591
+ confirmBeforeDelete ?
592
+ () => {
593
+ return new Promise((resolve, reject) => {
594
+ modalApi.confirm({
595
+ title: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteTitle,
596
+ okText: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteOkText,
597
+ cancelText: locale2text.AntdPictureUpload[locale].confirmBeforeDeleteCancelText,
598
+ onOk: () => {
599
+ resolve(true);
600
+ }
601
+ });
602
+ });
603
+ } :
604
+ undefined
605
+ }
606
+ {...uploadProps}>
607
+ <p className="ant-upload-drag-icon">
608
+ {icon || <AntdIcon icon={'antd-cloud-upload'} />}
609
+ </p>
610
+ <p className="ant-upload-text">{text}</p>
611
+ <p className="ant-upload-hint">
612
+ {hint}
613
+ </p>
614
+ </Dragger>
615
+ </div>
616
+ </ConfigProvider>
617
+ );
618
+ }
619
+
620
+ export default AntdDraggerUpload;
621
+
622
+ AntdDraggerUpload.defaultProps = defaultProps;
623
623
  AntdDraggerUpload.propTypes = propTypes;