@cldemo/ui-kit 1.0.10 → 1.0.11

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 (201) hide show
  1. package/buildLibs/utils/Element/ClCheckboxOne.cjs +2 -0
  2. package/buildLibs/utils/Element/ClCheckboxOne.cjs.map +1 -0
  3. package/buildLibs/utils/Element/ClCheckboxOne.js +5 -0
  4. package/buildLibs/utils/Element/ClCheckboxOne.js.map +1 -0
  5. package/buildLibs/utils/Element/ClFormValidate.cjs +2 -0
  6. package/buildLibs/utils/Element/ClFormValidate.cjs.map +1 -0
  7. package/buildLibs/utils/Element/ClFormValidate.js +5 -0
  8. package/buildLibs/utils/Element/ClFormValidate.js.map +1 -0
  9. package/buildLibs/utils/Element/ClImage.cjs +1 -1
  10. package/buildLibs/utils/Element/ClImage.js +1 -1
  11. package/buildLibs/utils/Element/ClLoadFullCenter.cjs +2 -0
  12. package/buildLibs/utils/Element/ClLoadFullCenter.cjs.map +1 -0
  13. package/buildLibs/utils/Element/ClLoadFullCenter.css +1 -0
  14. package/buildLibs/utils/Element/ClLoadFullCenter.js +45 -0
  15. package/buildLibs/utils/Element/ClLoadFullCenter.js.map +1 -0
  16. package/buildLibs/utils/Element/ClLoadIng.cjs +2 -0
  17. package/buildLibs/utils/Element/ClLoadIng.cjs.map +1 -0
  18. package/buildLibs/utils/Element/ClLoadIng.js +5 -0
  19. package/buildLibs/utils/Element/ClLoadIng.js.map +1 -0
  20. package/buildLibs/utils/Element/ClLoadWarp.cjs +2 -0
  21. package/buildLibs/utils/Element/ClLoadWarp.cjs.map +1 -0
  22. package/buildLibs/utils/Element/ClLoadWarp.css +1 -0
  23. package/buildLibs/utils/Element/ClLoadWarp.js +53 -0
  24. package/buildLibs/utils/Element/ClLoadWarp.js.map +1 -0
  25. package/buildLibs/utils/Element/ClRadioOne.cjs +2 -0
  26. package/buildLibs/utils/Element/ClRadioOne.cjs.map +1 -0
  27. package/buildLibs/utils/Element/ClRadioOne.js +5 -0
  28. package/buildLibs/utils/Element/ClRadioOne.js.map +1 -0
  29. package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs +2 -0
  30. package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs.map +1 -0
  31. package/buildLibs/utils/Element/ClTransitionSlideupdown.js +5 -0
  32. package/buildLibs/utils/Element/ClTransitionSlideupdown.js.map +1 -0
  33. package/buildLibs/utils/Element/ClWaterfallImage.cjs +2 -0
  34. package/buildLibs/utils/Element/ClWaterfallImage.cjs.map +1 -0
  35. package/buildLibs/utils/Element/ClWaterfallImage.css +1 -0
  36. package/buildLibs/utils/Element/ClWaterfallImage.js +48 -0
  37. package/buildLibs/utils/Element/ClWaterfallImage.js.map +1 -0
  38. package/buildLibs/utils/Mobile/ClBanner.cjs +1 -1
  39. package/buildLibs/utils/Mobile/ClBanner.js +1 -1
  40. package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs +1 -1
  41. package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs.map +1 -1
  42. package/buildLibs/utils/Mobile/ClDropdownMenuM.js +13 -12
  43. package/buildLibs/utils/Mobile/ClDropdownMenuM.js.map +1 -1
  44. package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs +2 -0
  45. package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs.map +1 -0
  46. package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js +160 -0
  47. package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js.map +1 -0
  48. package/buildLibs/utils/Mobile/ClPicker.cjs +1 -1
  49. package/buildLibs/utils/Mobile/ClPicker.js +1 -1
  50. package/buildLibs/utils/Mobile/ClPickerDate.cjs +1 -1
  51. package/buildLibs/utils/Mobile/ClPickerDate.js +1 -1
  52. package/buildLibs/utils/Mobile/ClPickerTime.cjs +1 -1
  53. package/buildLibs/utils/Mobile/ClPickerTime.js +1 -1
  54. package/buildLibs/utils/Mobile/ClPullToRefresh.cjs +1 -1
  55. package/buildLibs/utils/Mobile/ClPullToRefresh.js +1 -1
  56. package/buildLibs/utils/Mobile/ClScrollCard.cjs +1 -1
  57. package/buildLibs/utils/Mobile/ClScrollCard.js +1 -1
  58. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BPgunUb2.js → Index.vue_vue_type_script_setup_true_lang-6KT1IHDu.js} +1 -1
  59. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BPgunUb2.js.map → Index.vue_vue_type_script_setup_true_lang-6KT1IHDu.js.map} +1 -1
  60. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js +71 -0
  61. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js.map +1 -0
  62. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-gtDsWrhd.js → Index.vue_vue_type_script_setup_true_lang-BDPkmgGP.js} +1 -1
  63. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-gtDsWrhd.js.map → Index.vue_vue_type_script_setup_true_lang-BDPkmgGP.js.map} +1 -1
  64. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D_IwyxiV.js → Index.vue_vue_type_script_setup_true_lang-Bnjm8vi-.js} +1 -1
  65. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D_IwyxiV.js.map → Index.vue_vue_type_script_setup_true_lang-Bnjm8vi-.js.map} +1 -1
  66. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Cpb9rd-y.js → Index.vue_vue_type_script_setup_true_lang-Bs8FGIQa.js} +1 -1
  67. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Cpb9rd-y.js.map → Index.vue_vue_type_script_setup_true_lang-Bs8FGIQa.js.map} +1 -1
  68. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-hm75HKxP.js → Index.vue_vue_type_script_setup_true_lang-C7FRB7fV.js} +1 -1
  69. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-hm75HKxP.js.map → Index.vue_vue_type_script_setup_true_lang-C7FRB7fV.js.map} +1 -1
  70. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Xe4BacqD.js → Index.vue_vue_type_script_setup_true_lang-CFzimlB_.js} +1 -1
  71. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Xe4BacqD.js.map → Index.vue_vue_type_script_setup_true_lang-CFzimlB_.js.map} +1 -1
  72. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bp39ENoP.js → Index.vue_vue_type_script_setup_true_lang-CGeXNRtY.js} +1 -1
  73. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bp39ENoP.js.map → Index.vue_vue_type_script_setup_true_lang-CGeXNRtY.js.map} +1 -1
  74. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-4NloX3Qk.js → Index.vue_vue_type_script_setup_true_lang-CSV9UWJx.js} +1 -1
  75. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-4NloX3Qk.js.map → Index.vue_vue_type_script_setup_true_lang-CSV9UWJx.js.map} +1 -1
  76. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CRJ3-pTH.js → Index.vue_vue_type_script_setup_true_lang-ChE1tZwr.js} +1 -1
  77. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CRJ3-pTH.js.map → Index.vue_vue_type_script_setup_true_lang-ChE1tZwr.js.map} +1 -1
  78. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js +2 -0
  79. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js.map +1 -0
  80. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-N1GhNa1r.js → Index.vue_vue_type_script_setup_true_lang-CpuYxzDD.js} +1 -1
  81. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-N1GhNa1r.js.map → Index.vue_vue_type_script_setup_true_lang-CpuYxzDD.js.map} +1 -1
  82. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js +2 -0
  83. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js.map +1 -0
  84. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-NdqbsOrG.js → Index.vue_vue_type_script_setup_true_lang-CvF_iIQS.js} +2 -2
  85. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-NdqbsOrG.js.map → Index.vue_vue_type_script_setup_true_lang-CvF_iIQS.js.map} +1 -1
  86. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js +266 -0
  87. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js.map +1 -0
  88. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DgMvq-RQ.js → Index.vue_vue_type_script_setup_true_lang-DFKjhT_C.js} +1 -1
  89. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DgMvq-RQ.js.map → Index.vue_vue_type_script_setup_true_lang-DFKjhT_C.js.map} +1 -1
  90. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D22m4oiN.js → Index.vue_vue_type_script_setup_true_lang-DdWmaT86.js} +2 -2
  91. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-D22m4oiN.js.map → Index.vue_vue_type_script_setup_true_lang-DdWmaT86.js.map} +1 -1
  92. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BtoovAWs.js → Index.vue_vue_type_script_setup_true_lang-DxHfO8TH.js} +1 -1
  93. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BtoovAWs.js.map → Index.vue_vue_type_script_setup_true_lang-DxHfO8TH.js.map} +1 -1
  94. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CW63TdvW.js → Index.vue_vue_type_script_setup_true_lang-HwprdMv4.js} +2 -2
  95. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-CW63TdvW.js.map → Index.vue_vue_type_script_setup_true_lang-HwprdMv4.js.map} +1 -1
  96. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BLp0owhs.js → Index.vue_vue_type_script_setup_true_lang-IGgTDykL.js} +1 -1
  97. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BLp0owhs.js.map → Index.vue_vue_type_script_setup_true_lang-IGgTDykL.js.map} +1 -1
  98. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BKr3_J68.js → Index.vue_vue_type_script_setup_true_lang-Lwl-M8kR.js} +1 -1
  99. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BKr3_J68.js.map → Index.vue_vue_type_script_setup_true_lang-Lwl-M8kR.js.map} +1 -1
  100. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Dxb_K2w0.js → Index.vue_vue_type_script_setup_true_lang-gsnpWNek.js} +1 -1
  101. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Dxb_K2w0.js.map → Index.vue_vue_type_script_setup_true_lang-gsnpWNek.js.map} +1 -1
  102. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-EGKo8cIw.js → Index.vue_vue_type_script_setup_true_lang-huUkL0wY.js} +1 -1
  103. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-EGKo8cIw.js.map → Index.vue_vue_type_script_setup_true_lang-huUkL0wY.js.map} +1 -1
  104. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BFSRH9yz.js → Index.vue_vue_type_script_setup_true_lang-in1ZSapu.js} +1 -1
  105. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BFSRH9yz.js.map → Index.vue_vue_type_script_setup_true_lang-in1ZSapu.js.map} +1 -1
  106. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C8HQVerr.js → Index.vue_vue_type_script_setup_true_lang-r6RBdV4y.js} +2 -2
  107. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C8HQVerr.js.map → Index.vue_vue_type_script_setup_true_lang-r6RBdV4y.js.map} +1 -1
  108. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DvzXfKhj.js → Index.vue_vue_type_script_setup_true_lang-tTHdssVu.js} +1 -1
  109. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-DvzXfKhj.js.map → Index.vue_vue_type_script_setup_true_lang-tTHdssVu.js.map} +1 -1
  110. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BxxIDGfR.js → Index.vue_vue_type_script_setup_true_lang-tjRv0vNR.js} +1 -1
  111. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-BxxIDGfR.js.map → Index.vue_vue_type_script_setup_true_lang-tjRv0vNR.js.map} +1 -1
  112. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bk2WD0GS.js → Index.vue_vue_type_script_setup_true_lang-yahz6Ej5.js} +1 -1
  113. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-Bk2WD0GS.js.map → Index.vue_vue_type_script_setup_true_lang-yahz6Ej5.js.map} +1 -1
  114. package/buildLibs/utils/Shared/Index24.css +1 -1
  115. package/buildLibs/utils/Shared/Index25.css +1 -1
  116. package/buildLibs/utils/Shared/Index26.css +1 -1
  117. package/buildLibs/utils/Shared/Index27.css +1 -1
  118. package/buildLibs/utils/Shared/Index28.css +1 -1
  119. package/buildLibs/utils/Shared/Index29.css +1 -1
  120. package/buildLibs/utils/Shared/Index30.css +1 -1
  121. package/buildLibs/utils/Shared/Index31.css +1 -1
  122. package/buildLibs/utils/Shared/Index32.css +1 -1
  123. package/buildLibs/utils/Shared/Index33.css +1 -1
  124. package/buildLibs/utils/Shared/Index34.css +1 -1
  125. package/buildLibs/utils/Shared/Index35.css +1 -1
  126. package/buildLibs/utils/Shared/Index36.css +1 -1
  127. package/buildLibs/utils/Shared/Index37.css +1 -0
  128. package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js +2 -0
  129. package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js.map +1 -0
  130. package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js +148 -0
  131. package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js.map +1 -0
  132. package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js +406 -0
  133. package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js.map +1 -0
  134. package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js +2 -0
  135. package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js.map +1 -0
  136. package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js → use-CKNkvmW4.js} +78 -141
  137. package/buildLibs/utils/Shared/use-CKNkvmW4.js.map +1 -0
  138. package/buildLibs/utils/Shared/use-D0Yu2Dbn.js +2 -0
  139. package/buildLibs/utils/Shared/use-D0Yu2Dbn.js.map +1 -0
  140. package/buildLibs/utils/Web/ClCropperPreview.cjs +1 -1
  141. package/buildLibs/utils/Web/ClCropperPreview.js +2 -2
  142. package/buildLibs/utils/Web/ClDatetime.cjs +1 -1
  143. package/buildLibs/utils/Web/ClDatetime.js +1 -1
  144. package/buildLibs/utils/Web/ClDropdownMenuItem.cjs +2 -0
  145. package/buildLibs/utils/Web/ClDropdownMenuItem.cjs.map +1 -0
  146. package/buildLibs/utils/Web/ClDropdownMenuItem.css +1 -0
  147. package/buildLibs/utils/Web/ClDropdownMenuItem.js +72 -0
  148. package/buildLibs/utils/Web/ClDropdownMenuItem.js.map +1 -0
  149. package/buildLibs/utils/Web/ClEcharts.cjs +1 -1
  150. package/buildLibs/utils/Web/ClEcharts.js +1 -1
  151. package/buildLibs/utils/Web/ClEchartsLineAxisTag.cjs +1 -1
  152. package/buildLibs/utils/Web/ClEchartsLineAxisTag.js +1 -1
  153. package/buildLibs/utils/Web/ClFileUpload.cjs +1 -1
  154. package/buildLibs/utils/Web/ClFileUpload.js +1 -1
  155. package/buildLibs/utils/Web/ClInputTag.cjs +1 -1
  156. package/buildLibs/utils/Web/ClInputTag.js +1 -1
  157. package/buildLibs/utils/Web/ClPaginate.cjs +1 -1
  158. package/buildLibs/utils/Web/ClPaginate.js +1 -1
  159. package/buildLibs/utils/Web/ClPreviewExample.cjs +1 -1
  160. package/buildLibs/utils/Web/ClPreviewExample.js +1 -1
  161. package/buildLibs/utils/Web/ClScrollXFence.cjs +1 -1
  162. package/buildLibs/utils/Web/ClScrollXFence.js +1 -1
  163. package/buildLibs/utils/Web/ClSelect.cjs +1 -1
  164. package/buildLibs/utils/Web/ClSelect.js +1 -1
  165. package/buildLibs/utils/Web/ClSelectCascade.cjs +1 -1
  166. package/buildLibs/utils/Web/ClSelectCascade.js +1 -1
  167. package/buildLibs/utils/Web/ClSelectTag.cjs +1 -1
  168. package/buildLibs/utils/Web/ClSelectTag.js +1 -1
  169. package/buildLibs/utils/Web/ClSelectTree.cjs +1 -1
  170. package/buildLibs/utils/Web/ClSelectTree.js +1 -1
  171. package/buildLibs/utils/Web/ClTable.cjs +1 -1
  172. package/buildLibs/utils/Web/ClTable.cjs.map +1 -1
  173. package/buildLibs/utils/Web/ClTable.js +1081 -1218
  174. package/buildLibs/utils/Web/ClTable.js.map +1 -1
  175. package/buildLibs/utils/Web/ClTabs.cjs +1 -1
  176. package/buildLibs/utils/Web/ClTabs.js +1 -1
  177. package/buildLibs/utils/Web/ClTree.cjs +1 -1
  178. package/buildLibs/utils/Web/ClTree.js +1 -1
  179. package/buildLibs/utils/Web/ClXeditable.cjs +1 -1
  180. package/buildLibs/utils/Web/ClXeditable.cjs.map +1 -1
  181. package/buildLibs/utils/Web/ClXeditable.js +33 -32
  182. package/buildLibs/utils/Web/ClXeditable.js.map +1 -1
  183. package/package.json +21 -8
  184. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js +0 -663
  185. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js.map +0 -1
  186. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js.map +0 -1
  187. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js +0 -2
  188. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js.map +0 -1
  189. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js +0 -2
  190. package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js.map +0 -1
  191. package/buildLibs/utils/Shared/Video-BV0YLYT2.js +0 -114
  192. package/buildLibs/utils/Shared/Video-BV0YLYT2.js.map +0 -1
  193. package/buildLibs/utils/Shared/Video-c3jHJSxl.js +0 -2
  194. package/buildLibs/utils/Shared/Video-c3jHJSxl.js.map +0 -1
  195. package/buildLibs/utils/Shared/Video.css +0 -1
  196. package/buildLibs/utils/Web/ClDropdownMenuM.css +0 -1
  197. package/buildLibs/utils/Web/ClPreview.cjs +0 -2
  198. package/buildLibs/utils/Web/ClPreview.cjs.map +0 -1
  199. package/buildLibs/utils/Web/ClPreview.css +0 -1
  200. package/buildLibs/utils/Web/ClPreview.js +0 -353
  201. package/buildLibs/utils/Web/ClPreview.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"Index.vue_vue_type_script_setup_true_lang-gtDsWrhd.js","sources":["../../../src/libs/Web/FileUpload/useCheck.ts","../../../src/libs/Web/FileUpload/useComplete.ts","../../../src/libs/Web/FileUpload/useDownload.ts","../../../src/libs/Web/FileUpload/Default.vue","../../../src/libs/Web/FileUpload/Button.vue","../../../src/libs/Web/FileUpload/Index.vue"],"sourcesContent":["import CommonBase from '../../Common/base';\nimport { reactive } from 'vue';\n\nconst defaultFileCommon: any = {\n format: {\n img: ['jpg', 'jpe', 'jpeg', 'png', 'gif', 'bmp', 'ico'],\n video: [\n 'mp4',\n 'rmvb',\n '3gp',\n 'avi',\n 'asf',\n 'asf',\n 'dv',\n 'mov',\n 'mpg4',\n 'mpeg',\n 'mpg',\n 'wm',\n 'wmx',\n 'flv',\n 'mkv',\n 'mp4a',\n 'rm',\n 'wmv',\n 'swf',\n 'swfl',\n ],\n audio: ['mp3', 'ogg', 'wav', 'wma', 'mid', 'ra', 'ram'],\n zip: ['rar', 'zip'],\n excel: ['xls', 'xlsx', 'csv'],\n pdf: ['pdf'],\n txt: ['txt'],\n doc: ['doc', 'docx'],\n },\n icon: {\n img: 'image',\n video: 'video',\n audio: 'music',\n txt: 'text',\n zip: 'zip',\n excel: 'excel',\n pdf: 'pdf',\n doc: 'word',\n default: 'file',\n },\n suffix: {\n jpg: ['jpg', 'jpe', 'jpeg'],\n jpe: ['jpg', 'jpe', 'jpeg'],\n jpeg: ['jpg', 'jpe', 'jpeg'],\n png: ['png'],\n gif: ['gif'],\n bmp: ['bmp'],\n ico: ['ico'],\n mp4: ['mp4'],\n rmvb: ['rmvb'],\n '3gp': ['3gp'],\n avi: ['avi'],\n asf: ['asf'],\n dv: ['dv'],\n mov: ['mov'],\n mpg4: ['mpg4'],\n mpeg: ['mpeg'],\n mpg: ['mpg'],\n wm: ['wm'],\n wmx: ['wmx'],\n flv: ['flv'],\n mkv: ['mkv'],\n mp4a: ['mp4a'],\n rm: ['rm'],\n wmv: ['wmv'],\n swf: ['swf'],\n swfl: ['swfl'],\n mp3: ['mp3'],\n ogg: ['ogg'],\n wav: ['wav'],\n wma: ['wma'],\n mid: ['mid'],\n ra: ['ra'],\n ram: ['ram'],\n rar: ['rar'],\n zip: ['zip'],\n txt: ['txt'],\n xls: ['xls', 'xlsx', 'csv'],\n xlsx: ['xls', 'xlsx', 'csv'],\n csv: ['xls', 'xlsx', 'csv'],\n pdf: ['pdf'],\n doc: ['doc', 'docx'],\n } as Record<string, string[]>,\n mime: {\n jpg: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n jpe: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n jpeg: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n png: ['image/png', 'image/x-png'],\n gif: ['image/gif'],\n bmp: ['image/bmp'],\n ico: ['ico'],\n mp4: ['video/mp4'],\n rmvb: ['audio/x-pn-realaudio'],\n '3gp': ['video/3gpp'],\n avi: ['video/x-msvideo'],\n asf: ['video/x-ms-asf'],\n dv: ['video/x-dv'],\n mov: ['video/quicktime'],\n mpg4: ['video/mp4'],\n mpeg: ['video/mpeg'],\n mpg: ['video/mpeg'],\n wm: ['video/x-ms-wmv'],\n wmx: ['video/x-ms-wmx'],\n flv: ['video/x-flv'],\n mkv: ['video/x-matroska'],\n mp4a: ['audio/mp4'],\n rm: ['audio/x-pn-realaudio'],\n wmv: ['audio/x-ms-wmv'],\n swf: ['application/x-shockwave-flash'],\n swfl: ['application/x-shockwave-flash'],\n mp3: ['audio/mpeg'],\n ogg: ['audio/ogg'],\n wav: ['audio/wav'],\n wma: ['audio/x-ms-wma'],\n mid: ['audio/midi'],\n ra: ['audio/x-pn-realaudio'],\n ram: ['audio/x-pn-realaudio'],\n rar: ['application/x-rar-compressed'],\n zip: ['application/zip', 'application/x-zip-compressed'],\n txt: ['text/plain'],\n xls: ['application/vnd.ms-excel', 'application/wps-office.xls'],\n xlsx: [\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/wps-office.xlsx',\n ],\n csv: ['text/csv'],\n pdf: ['application/pdf'],\n doc: ['application/msword'],\n docx: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n } as Record<string, string[]>,\n getFormatGroup: (format: string) => {\n let group: string[] = [];\n if (CommonBase.isNonEmptyString(format)) {\n const arrType = format.split(',');\n arrType.forEach(t => {\n for (const [fk, fv] of Object.entries(defaultFileCommon.format)) {\n if (CommonBase.isExistValue(fv, t.toLocaleLowerCase())) {\n group.push(fk);\n }\n }\n });\n group = CommonBase.getArrUnique(group);\n }\n return group;\n },\n getIcon: (type: string) => {\n let icon = '';\n if (!CommonBase.isEmpty(type)) {\n icon = CommonBase.isExistJsonKey(defaultFileCommon.icon, type)\n ? defaultFileCommon.icon[type]\n : defaultFileCommon.icon.default;\n } else {\n icon = defaultFileCommon.icon.default;\n }\n return icon;\n },\n getSuffix: (arrFormat: string[]) => {\n let list: string[] = [];\n if (!CommonBase.isEmpty(arrFormat)) {\n arrFormat.forEach(t => {\n const suffix = defaultFileCommon.suffix[t.toLocaleLowerCase()];\n if (!CommonBase.isUndefined(suffix)) {\n list = list.concat(suffix);\n }\n });\n if (CommonBase.isEmpty(list)) {\n list = arrFormat;\n }\n }\n list = CommonBase.getArrUnique(list);\n return list;\n },\n getRegexBySuffix: (arrSuffix: string[]) => {\n if (CommonBase.isEmpty(arrSuffix)) {\n return null;\n }\n const reg = `\\\\.(?:${arrSuffix.join('|')})$`;\n return new RegExp(reg, 'i');\n },\n getMime: (arrSuffix: string[]) => {\n let list: string[] = [];\n if (!CommonBase.isEmpty(arrSuffix)) {\n arrSuffix.forEach(s => {\n const mime = defaultFileCommon.mime[s];\n if (!CommonBase.isUndefined(mime)) {\n list = list.concat(mime);\n }\n });\n }\n list = CommonBase.getArrUnique(list);\n return list;\n },\n getRegexByMime: (arrMime: string[]) => {\n if (CommonBase.isEmpty(arrMime)) {\n return null;\n }\n const reg = `^(?:${arrMime.join('|').replace(/\\//g, '\\\\/')})$`;\n return new RegExp(reg, 'i');\n },\n getImageThumbnail: (img: any, w: number, h: any) => {\n let dataURL = null;\n try {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const context: any = canvas.getContext('2d');\n context.drawImage(img, 0, 0, img.width, img.height, 0, 0, w, h);\n dataURL = canvas.toDataURL('image/gif');\n } catch (e) {\n dataURL = null;\n }\n return dataURL;\n },\n};\n\nconst useFileCheck = (options: any, optPageLanguage: any) => {\n let props = options;\n const optBase = reactive({\n mime: [] as string[],\n suffix: [] as string[],\n isCheckImgWH: false,\n });\n let _fileCheckInfo: any = null;\n\n const setOptions = (opts: any) => {\n props = CommonBase.getJsonMerge(props, opts);\n _initBaseInfo();\n };\n\n const _initBaseInfo = () => {\n const suffix = CommonBase.isNonEmptyString(props.checkFormat)\n ? defaultFileCommon.getSuffix(props.checkFormat.split(','))\n : [];\n const mime = defaultFileCommon.getMime(suffix);\n const isCheckImgWH =\n !CommonBase.isEmpty(props.checkWidth) && !CommonBase.isEmpty(props.checkHeight);\n\n optBase.mime = mime;\n optBase.suffix = suffix;\n optBase.isCheckImgWH = isCheckImgWH;\n };\n\n const _getTypeInfo = (type: string) => {\n const icon = defaultFileCommon.getIcon(type);\n return {\n type,\n icon,\n isImage: type === 'img',\n isVideo: type === 'video',\n isAudio: type === 'audio',\n isTxt: type === 'txt',\n isZip: type === 'zip',\n };\n };\n\n const _getTypeByFile = (name: string, mimeType?: string) => {\n if (CommonBase.isUndefined(_fileCheckInfo)) {\n _fileCheckInfo = {};\n for (const [fk, fv] of Object.entries(defaultFileCommon.format)) {\n const suffix = defaultFileCommon.getSuffix(fv as string[]);\n const mime = defaultFileCommon.getMime(suffix);\n const regSuffix = defaultFileCommon.getRegexBySuffix(suffix);\n const regMime = defaultFileCommon.getRegexByMime(mime);\n _fileCheckInfo[fk] = { suffix, mime, regSuffix, regMime };\n }\n }\n let newType = '';\n Object.keys(_fileCheckInfo).forEach((checkType: string) => {\n if (newType.length === 0) {\n const checkInfo = _fileCheckInfo[checkType];\n if (\n (checkInfo.regSuffix && checkInfo.regSuffix.test(name)) ||\n (mimeType && checkInfo.regMime && checkInfo.regMime.test(mimeType))\n ) {\n newType = checkType;\n }\n }\n });\n return _getTypeInfo(newType);\n };\n\n const getTypeByFormat = (format?: string) => {\n const formatGroup = defaultFileCommon.getFormatGroup(\n CommonBase.isEmpty(format) ? props.checkFormat : (format as string),\n );\n const type = formatGroup.length === 1 ? formatGroup[0] : '';\n return _getTypeInfo(type);\n };\n\n const getTypeByUrl = (url: string) => {\n if (!CommonBase.isString(url)) {\n return _getTypeByFile('');\n }\n if (url.startsWith('data:') || url.startsWith('blob:')) {\n // data:/blob: URL 无文件名段:按 mime 段识别类型(回显 dataURL 场景,如 data:image/png;base64)\n const mimeMatch = url.match(/^[a-z]+:([a-zA-Z0-9.+-]+\\/[a-zA-Z0-9.+-]+)/);\n return _getTypeByFile('', mimeMatch ? mimeMatch[1] : '');\n }\n const name = url\n .substring(url.lastIndexOf('/') + 1)\n .split('?')[0]\n .split('#')[0];\n return _getTypeByFile(name);\n };\n\n const createTempImg = (src: string, maxWidth?: number) => {\n return new Promise((resolve, reject) => {\n const imgTemp = document.createElement('img');\n imgTemp.onload = (e: any) => {\n const w: number = e.target.width;\n const h: number = e.target.height;\n let tw = w;\n let th = h;\n if (maxWidth && maxWidth > 0) {\n if (tw > maxWidth || th > maxWidth) {\n if (tw > th) {\n th = parseInt(((maxWidth / tw) * th).toString(), 10);\n tw = maxWidth;\n } else {\n tw = parseInt(((maxWidth / th) * tw).toString(), 10);\n th = maxWidth;\n }\n }\n }\n const showSrc = e.target.src;\n resolve({ src: showSrc, w, h, tw, th, isImage: true });\n };\n imgTemp.onerror = () => {\n reject(new Error('fail: temp create image'));\n };\n imgTemp.src = src;\n });\n };\n\n const _checkImgWH = (w: number, h: number) => {\n const cw = CommonBase.isEmpty(props.checkWidth) ? 0 : parseInt(props.checkWidth as string, 10);\n const ch = CommonBase.isEmpty(props.checkHeight)\n ? 0\n : parseInt(props.checkHeight as string, 10);\n if (!CommonBase.isFinite(cw) || !CommonBase.isFinite(ch) || cw === 0 || ch === 0) {\n return true;\n }\n let check = true;\n switch (props.checkWHType) {\n case 'greater':\n check = w >= cw && h >= ch;\n break;\n case 'less':\n check = w <= cw && h <= ch;\n break;\n case 'equal':\n check = w === cw && h === ch;\n break;\n default:\n check = true;\n break;\n }\n return check;\n };\n\n const _checkFileImage = (file: any, optionCheck: any) => {\n return new Promise((resolve, reject) => {\n if (file instanceof File) {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n createTempImg(e.target.result, optionCheck.maxWidth)\n .then((res: any) => {\n const checkWH = optBase.isCheckImgWH ? _checkImgWH(res.w, res.h) : true;\n if (checkWH) {\n resolve(res);\n } else {\n reject(new Error(optPageLanguage.value.checkImageWHLabel));\n }\n })\n .catch(error => {\n reject(error);\n });\n };\n reader.onerror = () => {\n reject(new Error('fail: new FileReader image onload()'));\n };\n reader.readAsDataURL(file);\n } else {\n reject(new Error('fail: file is not a File instance'));\n }\n });\n };\n\n const checkFile = async (files: any, optionCheck: any) => {\n let errorMsg: string[] = [];\n const passFiles: any = [];\n const passFilesInfo: any = [];\n\n const regSuffix = defaultFileCommon.getRegexBySuffix(optBase.suffix);\n const regMime = defaultFileCommon.getRegexByMime(optBase.mime);\n const parseSize = (val: any) => {\n const num = CommonBase.isEmpty(val) ? NaN : parseInt(val as string, 10);\n return CommonBase.isFinite(num) ? num * 1024 : null;\n };\n const minSize = parseSize(props.checkMinSize);\n const maxSize = parseSize(props.checkMaxSize);\n\n const len = files.length;\n for (let f = 0; f < len; f += 1) {\n const errorOneMsg = [];\n const file = files[f];\n\n const errorInfo = { suffix: false, mime: false, size: false };\n const fileName = file.name;\n if (regSuffix && !regSuffix.test(fileName)) {\n errorInfo.suffix = true;\n }\n const fileMime = file.type;\n if (!CommonBase.isEmpty(fileMime) && regMime && !regMime.test(fileMime)) {\n errorInfo.mime = true;\n }\n if (minSize && file.size < minSize) {\n errorInfo.size = true;\n }\n if (maxSize && file.size > maxSize) {\n errorInfo.size = true;\n }\n\n if (errorInfo.suffix || errorInfo.mime) {\n errorOneMsg.push(optPageLanguage.value.checkSuffixMimeLabel);\n }\n if (errorInfo.size) {\n errorOneMsg.push(optPageLanguage.value.checkSizeLabel);\n }\n const fileTypeInfo = _getTypeByFile(fileName, fileMime);\n let fileInfo: any = null;\n if (fileTypeInfo.isImage) {\n fileInfo = await _checkFileImage(file, optionCheck).catch(error => {\n errorOneMsg.push(error.message);\n });\n }\n if (CommonBase.isUndefined(fileInfo)) {\n fileInfo = {};\n }\n fileInfo = CommonBase.getJsonMerge(fileInfo, fileTypeInfo);\n fileInfo.fileName = fileName;\n fileInfo.file = file;\n if (errorOneMsg.length === 0) {\n passFiles.push(file);\n passFilesInfo.push(fileInfo);\n } else {\n if (len === 1) {\n errorMsg = errorOneMsg.map(m => `${optPageLanguage.value.uploadFile} ${m}`);\n } else {\n errorMsg.push(`${fileName}:${errorOneMsg.join(',')}`);\n }\n }\n }\n return new Promise(resolve => {\n setTimeout(() => {\n resolve({ errorMsg, passFiles, passFilesInfo, original: files });\n }, 200);\n });\n };\n\n _initBaseInfo();\n return {\n optBase,\n getTypeByFormat,\n getTypeByUrl,\n createTempImg,\n checkFile,\n setBaseOptions: setOptions,\n };\n};\nexport default useFileCheck;\n","import CommonBase from '../../Common/base';\n\nconst useFileInfo = () => {\n const setFileInfo = (fileInfo: any, saveInfo: any) => {\n const url = saveInfo && saveInfo.fileUrl ? saveInfo.fileUrl : '';\n if (!CommonBase.isString(url)) {\n return { name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 };\n }\n const isUrlEmpty = CommonBase.isEmpty(url);\n let fileName = '';\n if (isUrlEmpty || url.startsWith('blob:')) {\n fileName = fileInfo.fileName;\n } else {\n fileName = url.substr(url.lastIndexOf('/') + 1);\n }\n let imgSrc = '';\n let imgWidth = 0;\n let imgHeight = 0;\n if (fileInfo.isImage) {\n imgSrc = isUrlEmpty ? fileInfo.src : url;\n imgWidth = fileInfo.tw || 0;\n imgHeight = fileInfo.th || 0;\n }\n return { name: fileName, url, imgSrc, imgWidth, imgHeight };\n };\n\n return {\n setFileInfo,\n };\n};\nexport default useFileInfo;\n","import CommonBase from '../../Common/base';\n\nconst useDownload = () => {\n const downloadHref = (url: string, _fileName?: string) => {\n window.open(url);\n };\n const downloadBlob = (url: string) => {\n if (!CommonBase.isEmpty(url)) {\n const inx = url.lastIndexOf('/');\n const newFileName = url.substring(inx + 1);\n\n const newUrl = url.replace(/\\\\/g, '/');\n const xhr = new XMLHttpRequest();\n xhr.open('GET', newUrl, true);\n xhr.responseType = 'blob';\n\n xhr.onload = () => {\n if (xhr.status === 200) {\n const urlObject = window.URL || window.webkitURL || window;\n const exportBlob = new Blob([xhr.response]);\n const elLink: any = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');\n elLink.href = urlObject.createObjectURL(exportBlob);\n elLink.download = newFileName;\n elLink.click();\n // 1000: 等待下载启动后再释放 blob URL(立即 revoke 会中断下载,参照 Button onDownload 模式)\n setTimeout(() => URL.revokeObjectURL(elLink.href), 1000);\n } else {\n downloadHref(url, newFileName);\n }\n };\n xhr.onerror = () => {\n downloadHref(url, newFileName);\n };\n xhr.send();\n }\n };\n\n return {\n downloadHref,\n downloadBlob,\n };\n};\nexport default useDownload;\n","<template>\n <div\n :class=\"clsParent\"\n ref=\"refElTopParent\"\n >\n <div\n class=\"fileUpload-default-container\"\n @drop=\"onDrop\"\n @dragover.prevent\n >\n <label :for=\"elInputId\">\n <input\n v-if=\"optPage.isInitFileInput && !disabled\"\n type=\"file\"\n :id=\"elInputId\"\n :name=\"optElName\"\n @change=\"onFileDefault\"\n :accept=\"optBase.mime.join(',')\"\n />\n <template v-else>\n <input\n :id=\"elInputId\"\n :name=\"optElName\"\n style=\"display: none !important\"\n />\n </template>\n <span\n v-if=\"optPage.runOperateType === 'init'\"\n :class=\"clsWait\"\n >\n <cl-icon-font\n :name=\"optPage.icon\"\n class=\"fileUpload-icon\"\n ></cl-icon-font>\n <span class=\"fileUpload-label\">\n <slot name=\"label\"></slot>\n </span>\n </span>\n <span\n v-else-if=\"optPage.runOperateType === 'complete'\"\n :class=\"clsComplete\"\n >\n <span\n class=\"fileUpload-img\"\n v-if=\"optPage.isImage\"\n >\n <span class=\"fileUpload-img-container\">\n <img\n :src=\"optFileInfo.imgSrc\"\n :width=\"optFileInfo.imgWidth\"\n :height=\"optFileInfo.imgHeight\"\n />\n </span>\n <span\n v-if=\"isShowCompleteMsg\"\n class=\"file-complete-img-msg\"\n >{{ optPage.completeMsgTxt }}</span\n >\n <template v-else></template>\n <i\n v-if=\"isShowPreview && !disabled\"\n class=\"preview-icon\"\n :title=\"optPageLanguage.common.preview\"\n @click.stop=\"onPreviewImage\"\n ><cl-icon-font name=\"search-plus\"></cl-icon-font\n ></i>\n <template v-else></template>\n <i\n v-if=\"isShowDownload && !disabled\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownloadImage\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n class=\"fileUpload-video\"\n v-else-if=\"optPage.isVideo\"\n >\n <video :src=\"optFileInfo.url\"></video>\n <span\n v-if=\"isShowPreview && !disabled\"\n class=\"preview-icon\"\n @click.stop=\"onPreviewVideo\"\n ><cl-icon-font name=\"play\"></cl-icon-font\n ></span>\n <template v-else></template>\n <i\n v-if=\"isShowDownload && !disabled\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownloadFile\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n class=\"fileUpload-file\"\n v-else\n >\n <cl-icon-font\n :name=\"optPage.icon\"\n class=\"fileUpload-icon\"\n ></cl-icon-font>\n <span>{{ optFileInfo.name }}</span>\n </span>\n <a\n v-if=\"!disabled\"\n class=\"file-complete-remove\"\n href=\"javascript:\"\n :title=\"optPageLanguage.common.delete\"\n @click.stop=\"onRemove\"\n ><cl-icon-font name=\"close\"></cl-icon-font\n ></a>\n <template v-else></template>\n </span>\n <template v-else></template>\n </label>\n </div>\n <div\n class=\"fileUpload-load\"\n v-if=\"optPage.runOperateType === 'load'\"\n >\n <cl-load\n theme=\"circleBubble\"\n size=\"large\"\n ></cl-load>\n </div>\n <template v-else></template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, onMounted, onBeforeUnmount, nextTick, watch, computed, reactive, ref } from 'vue';\nimport useFileCheck from './useCheck';\nimport useComplete from './useComplete';\nimport useDownload from './useDownload';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClLoad from '../../Element/Load/Index.vue';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport useLanguage from '../../Use/language';\n\ninterface FileuploadTop {\n getFileCheckInfo: () => {\n checkFormat?: string;\n checkWidth?: string | number;\n checkHeight?: string | number;\n checkWHType?: string;\n checkMinSize?: string | number;\n checkMaxSize?: string | number;\n };\n}\n\ninterface FileInfoData {\n name: string;\n url: string;\n imgSrc: string;\n imgWidth: number;\n imgHeight: number;\n}\n\ninterface FilePassInfo {\n type: string;\n icon: string;\n isImage: boolean;\n isVideo: boolean;\n isAudio: boolean;\n isTxt: boolean;\n isZip: boolean;\n fileName: string;\n file: File;\n src?: string;\n w?: number;\n h?: number;\n tw?: number;\n th?: number;\n}\n\ndefineOptions({ name: 'ClFileUploadDefault' });\n\nconst props = defineProps({\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n defaultHoverTitle: String, // desc: 默认悬停标题\n defaultIcon: String, // desc: 自定义初始显示图标(空态上传区),未设置时按 checkFormat 自动转换\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n validator: (v: string) => ['equal', 'greater', 'less'].includes(v),\n },\n isServerCallback: Boolean, // desc: 是否服务端回调\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n isShowCompleteMsg: {\n type: Boolean,\n default: true, // desc: 是否显示上传完成后的底部信息条(黑色透明区域)\n },\n});\n\nconst emit = defineEmits<{\n (e: 'onChange', file: string | File): void; // desc: 文件变化\n (e: 'onError', msg: string[]): void; // desc: 校验错误\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onPreview', src: string, type: string): void; // desc: 预览\n (e: 'onSaveFile', file: File, extInfo: FilePassInfo): void; // desc: 服务端回调保存\n}>();\n// slots: label\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('fileUpload');\n\nconst _selfTop = inject<FileuploadTop | null>('$FileuploadTop', null);\nif (!_selfTop) {\n console.warn('[FileUpload] Default 主题缺少 $FileuploadTop 注入,使用空校验配置');\n}\nconst { setFileInfo } = useComplete();\nconst _getCheckOptions = () =>\n CommonBase.getJsonMerge(_selfTop?.getFileCheckInfo() ?? {}, {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n });\nconst { optBase, getTypeByFormat, getTypeByUrl, createTempImg, checkFile, setBaseOptions } =\n useFileCheck(_getCheckOptions(), optPageLanguage);\nconst { downloadBlob, downloadHref } = useDownload();\n\nconst refElTopParent = ref<HTMLElement | null>(null);\n\nconst optPage = reactive({\n isImage: false,\n isVideo: false,\n icon: '',\n completeMsgTxt: '',\n isInitFileInput: true,\n runOperateType: 'init',\n});\nconst optFileInfo: FileInfoData = reactive({\n name: '',\n url: '',\n imgSrc: '',\n imgWidth: 0,\n imgHeight: 0,\n});\nconst _pageData: { file: File | null } = {\n file: null,\n};\nlet _initSeq = 0;\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\n\n// 跨实例唯一 id:label :for 与 input :id 必须全局唯一(props.name 是表单字段名,可重复)\nconst elInputId = `fileUpload_${CommonBase.getRandom(8)}`;\n\nconst optElName = computed(() => {\n let name = props.name;\n if (CommonBase.isEmpty(name)) {\n name = `fileUpload_${CommonBase.getRandom(8)}`;\n }\n return name;\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'fileUpload-default': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst clsWait = computed(() => {\n return {\n 'fileUpload-wait': true,\n 'fileUpload-disabled': props.disabled,\n };\n});\n\nconst clsComplete = computed(() => {\n return {\n 'fileUpload-complete': true,\n 'fileUpload-disabled': props.disabled,\n };\n});\n\nconst _emitChange = (file: string | File) => {\n emit('onChange', file);\n};\n\nconst _emitError = (msg: string[]) => {\n emit('onError', msg);\n};\n\nconst _emitRemove = () => {\n emit('onRemove');\n};\n\nconst _emitPreview = (src: string, type: string) => {\n emit('onPreview', src, type);\n};\n\nconst _emitSaveFile = (file: any, extInfo: any) => {\n emit('onSaveFile', file, extInfo);\n};\n\nconst _setFileType = (info: any) => {\n optPage.isImage = info.isImage;\n optPage.isVideo = info.isVideo;\n optPage.icon = info.icon;\n};\n\n// init 态(空态上传区)文件类型与图标:defaultIcon 优先,未设置时按 checkFormat 自动转换\nconst _setInitFileType = () => {\n const fileType = getTypeByFormat();\n if (CommonBase.isNonEmptyString(props.defaultIcon)) {\n fileType.icon = props.defaultIcon;\n }\n _setFileType(fileType);\n};\n\nconst _setFileOperateType = (type: string) => {\n if (type !== 'load') {\n optPage.isInitFileInput = true;\n }\n let runType = '';\n switch (type) {\n case 'remove':\n case 'clean': {\n runType = 'init';\n _setInitFileType();\n break;\n }\n case 'fail': {\n let isInit = true;\n if (optPage.isImage) {\n if (!CommonBase.isEmpty(optFileInfo.url) || !CommonBase.isEmpty(optFileInfo.imgSrc)) {\n isInit = false;\n }\n } else {\n if (!CommonBase.isEmpty(optFileInfo.url)) {\n isInit = false;\n }\n }\n runType = isInit ? 'init' : 'complete';\n break;\n }\n default:\n runType = type;\n }\n optPage.runOperateType = runType;\n};\n\nconst _setFileInfo = (tempData: any) => {\n const info = optFileInfo as unknown as Record<string, unknown>;\n for (const [k, v] of Object.entries(tempData)) {\n if (!CommonBase.isUndefined(info[k])) {\n info[k] = v;\n }\n }\n _pageData.file = tempData.file ?? _pageData.file; // 保留已有本地文件(tempData 无 file 字段时不清空)\n};\n\nconst _setComplete = (fileInfo: any, saveInfo: any) => {\n _revokeFileUrl();\n _setFileType(fileInfo);\n const tempData = setFileInfo(fileInfo, saveInfo);\n _setFileInfo(tempData);\n _setFileOperateType('complete');\n};\n\nconst _getNewValue = () => {\n let value: any = null;\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n // 本地 blob URL 不可持久化(刷新即失效):优先返回 File 对象(与 Button 主题对齐)\n value = _pageData.file;\n } else if (CommonBase.isEmpty(optFileInfo.url)) {\n if (optPage.isImage && !CommonBase.isEmpty(optFileInfo.imgSrc)) {\n value = optFileInfo.imgSrc;\n } else {\n value = _pageData.file;\n }\n } else {\n value = optFileInfo.url;\n }\n if (CommonBase.isUndefined(value)) {\n value = '';\n }\n return value;\n};\n\nconst _setUploadFile = (files: any) => {\n if (files.length > 0 && optPage.runOperateType !== 'load') {\n optPage.isInitFileInput = false;\n _setFileOperateType('load');\n _initSeq += 1; // 作废挂起的回显图片加载(createTempImg 晚到不覆盖本次上传)\n const optionCheck = {\n maxWidth: refElTopParent.value ? refElTopParent.value.clientWidth - 4 : 0, // 4: 容器 1px 边框 ×2 补偿\n };\n checkFile(files, optionCheck)\n .then((resCheck: any) => {\n if (optPage.runOperateType !== 'load') {\n return;\n }\n if (resCheck.passFiles.length > 0) {\n const passFile = resCheck.passFiles[0];\n const passFileInfo = resCheck.passFilesInfo[0];\n\n if (passFileInfo.isImage) {\n if (props.isServerCallback) {\n _emitSaveFile(passFile, passFileInfo);\n _startSaveTimeout();\n } else {\n _setComplete(passFileInfo, {});\n _pageData.file = passFile;\n _emitChange(passFileInfo.src);\n }\n } else {\n if (props.isServerCallback) {\n _emitSaveFile(passFile, passFileInfo);\n _startSaveTimeout();\n } else {\n const tempInfo: any = {};\n if (passFileInfo.isVideo) {\n const url = URL.createObjectURL(passFile);\n tempInfo.fileUrl = url;\n }\n _setComplete(passFileInfo, tempInfo);\n _pageData.file = passFile;\n _emitChange(passFile);\n }\n }\n } else {\n _setFileOperateType('fail');\n if (resCheck.errorMsg.length > 0) {\n _emitError(resCheck.errorMsg as string[]);\n }\n }\n })\n .catch(() => {\n if (optPage.runOperateType !== 'load') {\n return;\n }\n _setFileOperateType('fail');\n _emitError(['文件校验失败,请重试']);\n });\n }\n};\n\nconst _initValue = (value: string) => {\n if (!CommonBase.isNonEmptyString(value)) {\n if (CommonBase.isString(value) || CommonBase.isUndefined(value)) {\n _initValueEmpty();\n }\n return;\n }\n const seq = ++_initSeq;\n const fileType = getTypeByUrl(value);\n if (optPage.isImage && fileType.isImage) {\n const imgMaxWidth = refElTopParent.value ? refElTopParent.value.clientWidth - 4 : 0; // 4: 容器 1px 边框 ×2 补偿\n createTempImg(value, imgMaxWidth)\n .then((resImg: any) => {\n if (seq !== _initSeq) {\n return;\n }\n const imgInfo = CommonBase.getJsonMerge(resImg, fileType);\n _setComplete(imgInfo, { fileUrl: value });\n })\n .catch(() => {\n if (seq !== _initSeq) {\n return;\n }\n _setFileOperateType('fail');\n _emitError(['图片加载失败,请检查图片地址']);\n });\n } else {\n _setComplete(fileType, { fileUrl: value });\n }\n};\n\nconst _revokeFileUrl = () => {\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n URL.revokeObjectURL(optFileInfo.url);\n }\n};\n\nconst _clearSaveTimeout = () => {\n if (_saveTimer) {\n clearTimeout(_saveTimer);\n _saveTimer = null;\n }\n};\n\nconst _startSaveTimeout = () => {\n _clearSaveTimeout();\n _saveTimer = setTimeout(() => {\n if (optPage.runOperateType === 'load') {\n _setFileOperateType('fail');\n _emitError(['服务端保存超时,请重试']);\n }\n }, 60000); // 60000: 服务端保存超时兜底(父组件 serverFileCallback 永不回调时恢复 UI)\n};\n\nconst _initValueEmpty = () => {\n _initSeq += 1; // 作废挂起的回显图片加载\n _pageData.file = null; // 清空回显:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('init');\n};\n\nconst _initSetFileType = () => {\n if (CommonBase.isEmpty(props.value)) {\n _setInitFileType();\n return;\n }\n _setFileType(getTypeByUrl(props.value as string));\n};\n\nconst _initCompleteMsgTxt = () => {\n let completeMsgTxt = props.defaultHoverTitle;\n if (optPage.isImage && optBase.isCheckImgWH && CommonBase.isEmpty(completeMsgTxt)) {\n completeMsgTxt = `${props.checkWidth}x${props.checkHeight}`;\n }\n optPage.completeMsgTxt = completeMsgTxt as string;\n};\n\nconst _initMain = () => {\n _initSetFileType();\n _initCompleteMsgTxt();\n _initValue(props.value as string);\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n const lastValue = _getNewValue();\n if (newValue !== lastValue) {\n _clearSaveTimeout();\n _initSetFileType();\n _initValue(newValue as string);\n }\n }\n },\n);\n\nwatch(\n [\n () => props.checkFormat,\n () => props.checkWidth,\n () => props.checkHeight,\n () => props.checkWHType,\n () => props.checkMinSize,\n () => props.checkMaxSize,\n ],\n () => {\n _clearSaveTimeout();\n setBaseOptions(_getCheckOptions());\n _initSetFileType();\n _initCompleteMsgTxt();\n if (optPage.runOperateType === 'load') {\n // load 态(上传/保存进行中):配置同步即可,不重放 value——避免打断进行中的保存\n return;\n }\n const lastValue = _getNewValue();\n if (props.value === lastValue) {\n _initValue(props.value as string);\n }\n },\n);\n\nconst onDrop = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n if (!props.disabled && e.dataTransfer) {\n _setUploadFile(e.dataTransfer.files);\n }\n};\n\nconst onFileDefault = (e: any) => {\n if (!props.disabled) {\n _setUploadFile(e.currentTarget.files);\n }\n};\n\nconst onRemove = () => {\n _clearSaveTimeout();\n _initSeq += 1; // 作废挂起的回显图片加载\n _revokeFileUrl();\n _pageData.file = null; // 用户主动移除:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('remove');\n const elInput = document.getElementById(elInputId) as HTMLInputElement | null;\n if (elInput) {\n elInput.value = ''; // 重置 input value:重选同一文件时 change 才能再次触发\n }\n _emitRemove();\n};\n\nconst onPreviewImage = (e: any) => {\n const src = CommonBase.isEmpty(optFileInfo.url) ? optFileInfo.imgSrc : optFileInfo.url;\n _emitPreview(src, 'image');\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onPreviewVideo = (e: any) => {\n if (!CommonBase.isEmpty(optFileInfo.url)) {\n _emitPreview(optFileInfo.url, 'video');\n }\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onDownloadImage = (e: any) => {\n CommonBase.isEmpty(optFileInfo.url)\n ? downloadHref(optFileInfo.imgSrc, optFileInfo.name)\n : downloadBlob(optFileInfo.url);\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onDownloadFile = (e: any) => {\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n const elLink: any = document.createElement('a');\n elLink.href = optFileInfo.url;\n elLink.download = optFileInfo.name;\n elLink.click();\n } else {\n downloadBlob(optFileInfo.url);\n }\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst saveServerCallback = (result: any) => {\n _clearSaveTimeout();\n if (optPage.runOperateType !== 'load') {\n return;\n }\n if (!result || !result.res || !CommonBase.isBoolean(result.res.success)) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n if (!result.res.success) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n if (!result.req) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n let fileUrl = '';\n if (CommonBase.isString(result.res.fileUrl)) {\n fileUrl = result.res.fileUrl;\n } else if (\n CommonBase.isArray(result.res.fileUrl) &&\n result.res.fileUrl.length > 0 &&\n CommonBase.isString(result.res.fileUrl[0])\n ) {\n fileUrl = result.res.fileUrl[0];\n }\n if (CommonBase.isEmpty(fileUrl)) {\n // 服务端确认成功但未返回 URL(callback 仅执行上传):回到 init 态(可继续上传),不报错不回显\n _pageData.file = null;\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('init');\n return;\n }\n _setComplete(result.req, { fileUrl });\n _emitChange(fileUrl);\n};\n\nconst getValue = () => {\n return _getNewValue();\n};\n\nconst cleanReduction = () => {\n _clearSaveTimeout();\n _initSeq += 1; // 作废挂起的回显图片加载\n _revokeFileUrl();\n _pageData.file = null; // 清除还原:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('clean');\n};\n\nexport interface ClFileUploadDefaultExpose {\n saveServerCallback: (result: any) => void; // desc: 服务端回调结果(req: 文件信息, res: { success, fileUrl })\n getValue: () => string | File; // desc: 获取文件值(URL 字符串或本地 File;空态 '')\n cleanReduction: () => void; // desc: 清空文件\n}\n\ndefineExpose({\n saveServerCallback,\n getValue,\n cleanReduction,\n});\n\nonBeforeUnmount(() => {\n _clearSaveTimeout();\n _revokeFileUrl();\n});\n</script>\n","<template>\n <div :class=\"clsParent\">\n <input\n v-if=\"optPage.isInitFileInput && !disabled\"\n type=\"file\"\n :id=\"optPage.elFileId\"\n :name=\"optElName\"\n :multiple=\"isMultiple\"\n :accept=\"optBase.mime.join(',')\"\n @change=\"onFileButton\"\n />\n <template v-else>\n <input\n :id=\"optPage.elFileId\"\n :name=\"optElName\"\n :disabled=\"disabled\"\n :accept=\"optBase.mime.join(',')\"\n style=\"display: none !important\"\n @change=\"onFileButton\"\n />\n </template>\n <label\n ref=\"refElLabel\"\n :for=\"optPage.elFileId\"\n >\n <cl-button\n ref=\"refElButton\"\n :className=\"buttonClass\"\n :isShowBackDrop=\"true\"\n :disabled=\"disabled\"\n :label=\"buttonLabel || optPageLanguage.common.upload\"\n :icon=\"buttonIcon\"\n :color=\"buttonColor\"\n @onClick=\"onClickLabel\"\n ></cl-button>\n </label>\n </div>\n <slot name=\"label\"></slot>\n <ul\n v-if=\"optFileCompleteList.length > 0 && isShowUploadResult\"\n class=\"fileUpload-list\"\n >\n <template v-for=\"(fileItemInfo, inx) in optFileCompleteList\">\n <transition\n name=\"fileUploadButton\"\n enter-active-class=\"fileupload-anim-in\"\n leave-active-class=\"fileupload-anim-out\"\n >\n <li\n v-if=\"optShowListKey.indexOf(fileItemInfo.rId) > -1\"\n :key=\"`${_keyIndex}-${fileItemInfo.rId}-${inx}`\"\n class=\"fileUpload-item\"\n >\n <span\n v-if=\"fileItemInfo.isImage\"\n class=\"fileUpload-item-icon fileUpload-item-img\"\n >\n <img :src=\"fileItemInfo.imgSrc\" />\n <i\n v-if=\"isShowPreview\"\n class=\"preview-icon\"\n :title=\"optPageLanguage.common.preview\"\n @click.stop=\"onPreviewImage(fileItemInfo, inx)\"\n ><cl-icon-font name=\"search-plus\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n v-else-if=\"fileItemInfo.isVideo\"\n class=\"fileUpload-item-icon fileUpload-item-video\"\n >\n <video :src=\"fileItemInfo.url\"></video>\n <span\n v-if=\"isShowPreview\"\n class=\"preview-icon\"\n @click.stop=\"onPreviewVideo(fileItemInfo, inx)\"\n ><cl-icon-font name=\"play\"></cl-icon-font\n ></span>\n <template v-else></template>\n </span>\n <cl-icon-font\n v-else\n :name=\"fileItemInfo.icon\"\n class=\"fileUpload-item-icon\"\n ></cl-icon-font>\n <span class=\"fileUpload-item-name\">{{ fileItemInfo.name }}</span>\n <span class=\"fileUpload-item-operate\">\n <i\n v-if=\"isShowDownload\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownload(fileItemInfo)\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n <a\n v-if=\"!disabled\"\n class=\"file-complete-remove\"\n href=\"javascript:\"\n :title=\"optPageLanguage.common.delete\"\n @click.stop=\"onRemove(fileItemInfo.rId)\"\n ><cl-icon-font name=\"close\"></cl-icon-font\n ></a>\n <template v-else></template>\n </span>\n </li>\n </transition>\n </template>\n </ul>\n <template v-else></template>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, watch, onMounted, onBeforeUnmount, nextTick, computed, reactive, ref } from 'vue';\nimport useFileCheck from './useCheck';\nimport useComplete from './useComplete';\nimport useDownload from './useDownload';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClButton from '../../Element/Button/Index.vue';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport useLanguage from '../../Use/language';\n\ninterface FileuploadTop {\n getFileCheckInfo: () => {\n checkFormat?: string;\n checkWidth?: string | number;\n checkHeight?: string | number;\n checkWHType?: string;\n checkMinSize?: string | number;\n checkMaxSize?: string | number;\n };\n}\n\ndefineOptions({ name: 'ClFileUploadButton' });\n\nconst props = defineProps({\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n isMultiple: Boolean, // desc: 是否多选\n buttonClass: String, // desc: 按钮自定义CSS类名\n buttonLabel: String, // desc: 按钮文案\n buttonIcon: {\n type: String,\n default: '', // desc: 按钮图标\n },\n buttonColor: {\n type: String,\n default: 'default', // desc: 按钮颜色 | enum: default, primary, success, info, warning, danger (可自定义)\n },\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n validator: (v: string) => ['equal', 'greater', 'less'].includes(v),\n },\n isServerCallback: Boolean, // desc: 是否服务端回调\n isShowUploadResult: {\n type: Boolean,\n default: true, // desc: 是否显示上传结果\n },\n isShowUploadIng: {\n type: Boolean,\n default: true, // desc: 是否显示上传中状态\n },\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n});\n\nconst emit = defineEmits<{\n (e: 'onChange', file: File | File[] | string | string[], fileExt?: any): void; // desc: 文件变化\n (e: 'onError', msg: string[]): void; // desc: 校验错误\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onPreview', src: string, type: string, inx?: number): void; // desc: 预览\n (e: 'onSaveFile', file: File | File[], extInfo: any): void; // desc: 服务端回调保存\n}>();\n// slots: label\n\nconst _keyIndex = `fileupload-${CommonBase.getRandom(5)}`;\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('fileUpload');\n\nconst _selfTop = inject<FileuploadTop | null>('$FileuploadTop', null);\nif (!_selfTop) {\n console.warn('[FileUpload] Button 主题缺少 $FileuploadTop 注入,使用空校验配置');\n}\n\n// 结构性前置:useFileCheck 初始 options 需要本函数返回值(TDZ 约束,此位置不可移动)\nconst _getCheckOptions = () => {\n return CommonBase.getJsonMerge(_selfTop?.getFileCheckInfo() ?? {}, {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n });\n};\n\nconst { setFileInfo } = useComplete();\nconst { optBase, getTypeByUrl, checkFile, setBaseOptions } = useFileCheck(\n _getCheckOptions(),\n optPageLanguage,\n);\nconst { downloadBlob, downloadHref } = useDownload();\n\nconst refElButton = ref<InstanceType<typeof ClButton> | null>(null);\nconst refElLabel = ref<HTMLElement | null>(null);\nconst ran = CommonBase.getRandom(8);\nconst optPage = reactive({\n elFileId: `btnFile${ran}`,\n isInitFileInput: true,\n});\nconst optFileCompleteList = ref<any[]>([]);\nconst optShowListKey = ref<any[]>([]);\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\nlet _removeTimer: ReturnType<typeof setTimeout> | null = null;\nlet _removingId: string | null = null;\n\nconst optElName = computed(() => {\n let name = props.name;\n if (CommonBase.isEmpty(name)) {\n name = `fileUpload_${CommonBase.getRandom(8)}`;\n }\n return name;\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'fileUpload-button': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst _emitOnChange = (file: any, fileExt?: any) => {\n emit('onChange', file, fileExt);\n};\n\nconst _emitOnError = (msg: string[]) => {\n emit('onError', msg);\n};\n\nconst _emitOnRemove = () => {\n emit('onRemove');\n};\n\nconst _emitOnPreview = (src: string, type: string, inx?: number) => {\n emit('onPreview', src, type, inx);\n};\n\nconst _emitOnSaveFile = (file: any, extInfo: any) => {\n emit('onSaveFile', file, extInfo);\n};\n\nconst _startSaveTimeout = () => {\n _clearSaveTimeout();\n // 60000: 服务端保存超时兜底(父组件 serverFileCallback 永不回调时恢复 UI)\n _saveTimer = setTimeout(() => {\n _saveTimer = null;\n if (!optPage.isInitFileInput) {\n _setFileOperateType('fail');\n _emitOnError(['服务端保存超时,请重试']);\n }\n }, 60000);\n};\n\nconst _clearSaveTimeout = () => {\n if (_saveTimer) {\n clearTimeout(_saveTimer);\n _saveTimer = null;\n }\n};\n\nconst _revokeAllBlob = () => {\n optFileCompleteList.value.forEach((info: any) => {\n if (CommonBase.isString(info.url) && info.url.startsWith('blob:')) {\n URL.revokeObjectURL(info.url);\n }\n });\n};\n\nconst _setFileOperateType = (type: string) => {\n switch (type) {\n case 'load':\n if (props.isShowUploadIng) {\n refElButton.value?.loadStart();\n }\n break;\n case 'fail':\n case 'complete':\n if (props.isShowUploadIng) {\n refElButton.value?.loadStop();\n }\n break;\n default:\n break;\n }\n optPage.isInitFileInput = type !== 'load';\n};\n\nconst _setComplete = (fileList: any, saveList: any) => {\n if (!props.isMultiple) {\n // 单选:上传/回显均替换旧列表,保证 _getNewValue 取 list[0] 恒为最新文件\n _revokeAllBlob();\n optFileCompleteList.value = [];\n }\n const list = [];\n const idKey: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n list.push(info);\n idKey.push(info.rId);\n });\n for (let i = 0; i < fileList.length; i++) {\n let saveInfo: any = saveList.length > i ? { fileUrl: saveList[i] } : {};\n if (CommonBase.isEmpty(saveInfo.fileUrl) && fileList[i].isVideo && fileList[i].file) {\n saveInfo = { fileUrl: URL.createObjectURL(fileList[i].file) };\n }\n let tempInfo: any = setFileInfo(fileList[i], saveInfo);\n tempInfo.rId = CommonBase.getRandom(9);\n tempInfo = CommonBase.getJsonMerge(fileList[i], tempInfo);\n list.push(tempInfo);\n idKey.push(tempInfo.rId);\n }\n optFileCompleteList.value = list as never[];\n _setFileOperateType('complete');\n nextTick(() => {\n optShowListKey.value = idKey;\n });\n};\n\nconst _getNewValue = () => {\n const list: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n let value: any = null;\n if (CommonBase.isString(info.url) && info.url.startsWith('blob:')) {\n // 本地 blob URL 不可持久化(刷新即失效):优先返回 File 对象\n value = info.file;\n } else if (CommonBase.isEmpty(info.url)) {\n if (info.isImage && !CommonBase.isEmpty(info.imgSrc)) {\n value = info.imgSrc;\n } else {\n value = info.file;\n }\n } else {\n value = info.url;\n }\n if (!CommonBase.isUndefined(value)) {\n list.push(value);\n }\n });\n if (list.length === 0) {\n return '';\n }\n return props.isMultiple ? list : list[0];\n};\n\nconst _initValue = (value: string | string[]) => {\n if (CommonBase.isArray(value)) {\n // 数组回显:多选场景父组件回传 URL 数组,逐个回显(与字符串逗号分隔等价)\n _revokeAllBlob();\n optFileCompleteList.value = [];\n const fileList: any[] = [];\n const saveList: any[] = [];\n (value as string[]).forEach(url => {\n if (CommonBase.isNonEmptyString(url)) {\n const fileType = getTypeByUrl(url);\n fileList.push(fileType);\n saveList.push(url);\n }\n });\n _setComplete(fileList, saveList);\n return;\n }\n if (!CommonBase.isNonEmptyString(value)) {\n if (CommonBase.isString(value)) {\n _initValueEmpty();\n }\n return;\n }\n _revokeAllBlob();\n optFileCompleteList.value = [];\n const fileList: any[] = [];\n const saveList: any[] = [];\n value\n .split(',')\n .filter(url => CommonBase.isNonEmptyString(url))\n .forEach(url => {\n const fileType = getTypeByUrl(url);\n fileList.push(fileType);\n saveList.push(url);\n });\n _setComplete(fileList, saveList);\n};\n\nconst _initValueEmpty = () => {\n _revokeAllBlob();\n _setFileOperateType('init');\n optFileCompleteList.value = [];\n};\n\nconst _initMain = () => {\n _initValue(props.value as string | string[]);\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nonBeforeUnmount(() => {\n _clearSaveTimeout();\n if (_removeTimer) {\n clearTimeout(_removeTimer);\n _removeTimer = null;\n }\n _revokeAllBlob();\n});\n\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n const lastValue = _getNewValue();\n if (newValue !== lastValue) {\n _clearSaveTimeout();\n _initValue(newValue as string | string[]);\n }\n }\n },\n);\n\nwatch(\n [\n () => props.checkFormat,\n () => props.checkWidth,\n () => props.checkHeight,\n () => props.checkWHType,\n () => props.checkMinSize,\n () => props.checkMaxSize,\n ],\n () => {\n if (optPage.isInitFileInput) {\n // 仅非 load 态清理超时:保存进行中修改 check 配置不取消超时兜底(否则服务端永不回调时 UI 永久 load)\n _clearSaveTimeout();\n }\n setBaseOptions(_getCheckOptions());\n },\n);\n\nconst onFileButton = (e: any) => {\n if (props.disabled) {\n return;\n }\n if (!optPage.isInitFileInput) {\n // load 态(上传/保存进行中):丢弃占位 input 的选择,防并发校验竞态\n return;\n }\n if (e.currentTarget.files.length > 0) {\n _setFileOperateType('load');\n checkFile(e.currentTarget.files, {})\n .then((resCheck: any) => {\n if (optPage.isInitFileInput) {\n return;\n }\n if (resCheck.passFiles.length > 0) {\n if (props.isServerCallback) {\n const files = props.isMultiple ? resCheck.passFiles : resCheck.passFiles[0];\n const filesInfo = props.isMultiple ? resCheck.passFilesInfo : resCheck.passFilesInfo[0];\n _emitOnSaveFile(files, filesInfo);\n _startSaveTimeout();\n } else if (props.isMultiple) {\n _setComplete(resCheck.passFilesInfo, []);\n _emitOnChange(resCheck.passFiles, resCheck.passFilesInfo);\n } else {\n _setComplete(resCheck.passFilesInfo, []);\n _emitOnChange(resCheck.passFiles[0], resCheck.passFilesInfo[0]);\n }\n } else if (resCheck.errorMsg.length === 0) {\n _setFileOperateType('fail');\n _emitOnError(['文件校验失败,请重试']);\n }\n if (resCheck.errorMsg.length > 0) {\n _emitOnError(resCheck.errorMsg as string[]);\n if (resCheck.passFiles.length === 0) {\n _setFileOperateType('fail');\n }\n }\n })\n .catch(() => {\n if (optPage.isInitFileInput) {\n return;\n }\n _setFileOperateType('fail');\n _emitOnError(['文件校验失败,请重试']);\n });\n }\n};\n\nconst onPreviewImage = (fileInfo: any, inx?: number) => {\n const src = CommonBase.isEmpty(fileInfo.url) ? fileInfo.src : fileInfo.url;\n _emitOnPreview(src, 'image', inx);\n};\n\nconst onPreviewVideo = (fileInfo: any, inx?: number) => {\n if (!CommonBase.isEmpty(fileInfo.url)) {\n _emitOnPreview(fileInfo.url, 'video', inx);\n }\n};\n\nconst onRemove = (id: string) => {\n if (_removingId === id) {\n return;\n }\n _removingId = id;\n _clearSaveTimeout();\n if (!optPage.isInitFileInput) {\n // 移除作废服务端保存结果(Index 侧 _removedCount 机制),同步结束 load 态恢复 input\n _setFileOperateType('complete');\n }\n const removed = optFileCompleteList.value.find((info: any) => info.rId === id);\n if (removed && CommonBase.isString(removed.url) && removed.url.startsWith('blob:')) {\n URL.revokeObjectURL(removed.url);\n }\n const list: any = [];\n const idKey: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n if (info.rId !== id) {\n list.push(info);\n idKey.push(info.rId);\n }\n });\n optShowListKey.value = idKey;\n const elInput = document.getElementById(optPage.elFileId) as HTMLInputElement | null;\n if (elInput) {\n elInput.value = ''; // 重置 input value:重选同一文件时 change 才能再次触发\n }\n nextTick(() => {\n if (list.length > 0) {\n optFileCompleteList.value = list as never[];\n _removingId = null;\n _emitOnRemove();\n } else {\n // 500: 等待列表移除动画结束(fileupload-anim-out 0.5s)再清空列表\n _removeTimer = setTimeout(() => {\n _removeTimer = null;\n optFileCompleteList.value = optFileCompleteList.value.filter(\n (info: any) => info.rId !== id,\n ) as never[];\n _removingId = null;\n _emitOnRemove();\n }, 500);\n }\n });\n};\n\nconst onDownload = (fileInfo: any) => {\n if (fileInfo.isImage && CommonBase.isEmpty(fileInfo.url)) {\n downloadHref(fileInfo.imgSrc, fileInfo.name);\n } else if (CommonBase.isString(fileInfo.url) && fileInfo.url.startsWith('blob:')) {\n const elLink: any = document.createElement('a');\n elLink.href = fileInfo.url;\n elLink.download = fileInfo.name;\n elLink.click();\n } else if (CommonBase.isEmpty(fileInfo.url) && fileInfo.file) {\n const url = URL.createObjectURL(fileInfo.file);\n const elLink: any = document.createElement('a');\n elLink.href = url;\n elLink.download = fileInfo.name;\n elLink.click();\n // 1000: 等待浏览器开始下载后再释放 blob URL,立即 revoke 会中断下载\n setTimeout(() => {\n URL.revokeObjectURL(url);\n }, 1000);\n } else {\n downloadBlob(fileInfo.url);\n }\n};\n\nconst onClickLabel = () => {\n refElLabel.value?.click();\n};\n\nconst saveServerCallback = (result: any) => {\n _clearSaveTimeout();\n if (optPage.isInitFileInput) {\n return;\n }\n if (\n CommonBase.isUndefined(result) ||\n CommonBase.isUndefined(result.res) ||\n !CommonBase.isBoolean(result.res.success) ||\n CommonBase.isUndefined(result.req)\n ) {\n _setFileOperateType('fail');\n _emitOnError(['文件保存失败,请重试']);\n return;\n }\n if (result.res.success) {\n let fileUrl: string[] = [];\n const fileUrlIdx: number[] = []; // 与 fileUrl 同序的原数组索引(reqList 对齐)\n if (CommonBase.isNonEmptyString(result.res.fileUrl)) {\n fileUrl.push(result.res.fileUrl);\n fileUrlIdx.push(0);\n } else if (CommonBase.isArray(result.res.fileUrl)) {\n // 拷贝副本:外部数组可能在保存期间被父组件改写;过滤空串时保留原索引(result.res.fileUrl 与 result.req 同源一一对应)\n result.res.fileUrl.forEach((url: string, idx: number) => {\n if (CommonBase.isNonEmptyString(url)) {\n fileUrl.push(url);\n fileUrlIdx.push(idx);\n }\n });\n }\n if (fileUrl.length === 0) {\n // 服务端确认成功但未返回 URL(callback 仅执行上传):结束 load 态,不报错不回显\n _setFileOperateType('complete');\n return;\n }\n const reqList = props.isMultiple ? result.req : [result.req];\n let newPairs: string[] = [];\n let newReqList: any[] = [];\n if (!props.isMultiple) {\n // 单选:跳过 existUrls 去重——服务端覆盖式保存复用已有 URL 时,去重会把新结果吞掉\n newPairs = fileUrl;\n newReqList = reqList;\n } else {\n const existUrls = optFileCompleteList.value\n .map((info: any) => info.url)\n .filter((url: any) => CommonBase.isNonEmptyString(url));\n fileUrl.forEach((url: string, index: number) => {\n const reqIdx = fileUrlIdx[index];\n if (existUrls.indexOf(url) > -1 || CommonBase.isUndefined(reqList[reqIdx])) {\n return;\n }\n existUrls.push(url);\n newPairs.push(url);\n newReqList.push(reqList[reqIdx]);\n });\n }\n if (newPairs.length === 0) {\n // 全部与已有列表重复:幂等完成,不重复追加\n _setFileOperateType('complete');\n return;\n }\n _setComplete(newReqList, newPairs);\n const value = props.isMultiple ? newPairs : newPairs[0];\n _emitOnChange(value);\n } else {\n _setFileOperateType('fail');\n _emitOnError(['文件保存失败,请重试']);\n }\n};\n\nconst getValue = () => {\n return _getNewValue();\n};\n\nconst cleanReduction = () => {\n _clearSaveTimeout();\n _initValueEmpty();\n};\n\nexport interface ClFileUploadButtonExpose {\n saveServerCallback: (result: any) => void; // desc: 服务端回调保存结果\n getValue: () => string | File | string[]; // desc: 获取当前文件值\n cleanReduction: () => void; // desc: 还原初始状态\n}\n\ndefineExpose({\n saveServerCallback,\n getValue,\n cleanReduction,\n});\n</script>\n","<template>\n <div\n :class=\"clsParent\"\n :id=\"elId\"\n >\n <cl-fileupload-button\n ref=\"refElFileButton\"\n v-if=\"theme === 'button'\"\n :value=\"value\"\n :name=\"name\"\n :disabled=\"disabled\"\n :isMultiple=\"isMultiple\"\n :buttonClass=\"buttonClass\"\n :buttonLabel=\"buttonLabel\"\n :buttonIcon=\"buttonIcon\"\n :buttonColor=\"buttonColor\"\n :checkFormat=\"checkFormat\"\n :checkMinSize=\"checkMinSize\"\n :checkMaxSize=\"checkMaxSize\"\n :checkWidth=\"checkWidth\"\n :checkHeight=\"checkHeight\"\n :checkWHType=\"checkWHType\"\n :isServerCallback=\"optIsServerCallback\"\n :isShowUploadResult=\"isShowUploadResult\"\n :isShowUploadIng=\"isShowUploadIng\"\n :isShowPreview=\"isShowPreview\"\n :isShowDownload=\"isShowDownload\"\n @onChange=\"onChange\"\n @onError=\"onError\"\n @onRemove=\"onRemove\"\n @onPreview=\"onPreview\"\n @onSaveFile=\"onSaveFile\"\n >\n <template v-slot:label>\n <slot name=\"label\"></slot>\n </template>\n </cl-fileupload-button>\n <cl-fileupload-default\n ref=\"refElFileDefault\"\n v-else-if=\"theme === 'default'\"\n :value=\"value\"\n :name=\"name\"\n :disabled=\"disabled\"\n :defaultHoverTitle=\"defaultHoverTitle\"\n :defaultIcon=\"defaultIcon\"\n :isShowCompleteMsg=\"isShowCompleteMsg\"\n :checkFormat=\"checkFormat\"\n :checkMinSize=\"checkMinSize\"\n :checkMaxSize=\"checkMaxSize\"\n :checkWidth=\"checkWidth\"\n :checkHeight=\"checkHeight\"\n :checkWHType=\"checkWHType\"\n :isServerCallback=\"optIsServerCallback\"\n :isShowPreview=\"isShowPreview\"\n :isShowDownload=\"isShowDownload\"\n @onChange=\"onChange\"\n @onError=\"onError\"\n @onRemove=\"onRemove\"\n @onPreview=\"onPreview\"\n @onSaveFile=\"onSaveFile\"\n >\n <template v-slot:label>\n <slot name=\"label\"></slot>\n </template>\n </cl-fileupload-default>\n <template v-else></template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, inject, computed, reactive, ref, useAttrs } from 'vue';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClFileuploadDefault from './Default.vue';\nimport ClFileuploadButton from './Button.vue';\nimport './index.css';\n\ninterface ClGlobals {\n notify: {\n error: (msg: string) => void;\n };\n preview: {\n show: (opts: { type: string; src: string | string[]; showIndex: number }) => void;\n };\n}\n\ndefineOptions({ name: 'ClFileUpload' });\n\nconst props = defineProps({\n id: String, // desc: 组件唯一标识\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n theme: {\n type: String,\n default: 'default', // desc: 主题 | enum: default, button\n validator: (v: string) => ['default', 'button'].includes(v),\n },\n isMultiple: {\n type: Boolean,\n default: false, // desc: 是否多选(仅针对 theme:button)\n },\n defaultHoverTitle: String, // desc: 默认悬停标题\n defaultIcon: String, // desc: 自定义初始显示图标(theme:default 空态上传区),未设置时按 checkFormat 自动转换\n isShowCompleteMsg: {\n type: Boolean,\n default: true, // desc: 是否显示上传完成后的底部信息条(仅针对 theme:default 图片黑色透明区域)\n },\n buttonClass: String, // desc: 按钮模式自定义CSS类名\n buttonLabel: String, // desc: 按钮模式按钮文案\n buttonIcon: String, // desc: 按钮模式按钮图标\n buttonColor: String, // desc: 按钮模式按钮颜色\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n },\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n isShowUploadResult: {\n type: Boolean,\n default: true, // desc: 是否显示上传结果(仅针对 theme:button)\n },\n isShowUploadIng: {\n type: Boolean,\n default: true, // desc: 是否显示上传中状态\n },\n serverFileCallback: Function, // desc: 服务端文件保存回调\n});\n\nconst emit = defineEmits<{\n (e: 'update:value', value: string | File | string[]): void; // desc: 值更新\n (e: 'onChange', fileValue: string | File | File[] | string[], fileExt?: any): void; // desc: 文件变化\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onError', msg: string[]): void; // desc: 文件校验错误\n}>();\n// slots: label\n\nconst _clGlobals = inject<ClGlobals | null>('$ClGlobals', null);\nconst attrs = useAttrs();\n\nconst elId = props.id; // || `fileupload-${CommonBase.getRandom(N)}`\n\nconst refElFileDefault = ref<InstanceType<typeof ClFileuploadDefault> | null>(null);\nconst refElFileButton = ref<InstanceType<typeof ClFileuploadButton> | null>(null);\nlet _saveSeq = 0;\nlet _removedCount = 0;\n\nconst optIsServerCallback = computed(() => CommonBase.isFunction(props.serverFileCallback));\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'panel-fileupload': true,\n 'box-width': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst _emitOnChange = (value: any, fileValue: any, fileExt?: any) => {\n emit('update:value', value);\n emit('onChange', fileValue, fileExt);\n};\n\nconst _emitOnRemove = () => {\n emit('onRemove');\n};\n\nconst _getValue = () => {\n let value: any = null;\n switch (props.theme) {\n case 'default':\n value = refElFileDefault.value?.getValue();\n break;\n case 'button':\n value = refElFileButton.value?.getValue();\n break;\n default:\n break;\n }\n return value;\n};\n\nconst _callSaveServerCallback = (theme: string, result: any) => {\n switch (theme) {\n case 'default':\n refElFileDefault.value?.saveServerCallback(result);\n break;\n case 'button':\n refElFileButton.value?.saveServerCallback(result);\n break;\n default:\n break;\n }\n};\n\nconst onChange = (file: any, fileExt?: any) => {\n const value = _getValue();\n const fileValue = optIsServerCallback.value ? value : file;\n _emitOnChange(value, fileValue, fileExt);\n};\n\nconst onError = (msg: string[]) => {\n if (CommonBase.isArray(msg)) {\n emit('onError', msg);\n if (_clGlobals) {\n // 逐条独立通知:ClNotify 渲染层统一 encodeHTML,'<br>' 会被转义成字面文本,不能靠拼接 HTML 换行\n msg.forEach((m: string) => _clGlobals.notify.error(m));\n }\n }\n};\n\nconst onRemove = () => {\n _removedCount += 1;\n _emitOnRemove();\n const value = _getValue();\n _emitOnChange(value, value);\n};\n\nconst onPreview = async (src: string | string[], type: string, inx?: number) => {\n if (_clGlobals) {\n // preview 为惰性代理,首次调用才会动态加载(含 video.js),故需 await 就绪后再 show\n await _clGlobals.preview.show({\n type,\n src,\n showIndex: inx ?? 0, // Preview 消费端读取的字段是 showIndex(不是 showInx),字段名必须对齐\n });\n }\n};\n\nconst onSaveFile = async (files: any, extInfo?: any) => {\n const theme = props.theme;\n const seq = ++_saveSeq;\n const removedAtStart = _removedCount;\n let temp: any = true;\n if (props.serverFileCallback) {\n try {\n const isImage: any =\n !props.isMultiple && CommonBase.isObject(extInfo) && CommonBase.isBoolean(extInfo.isImage)\n ? extInfo.isImage\n : false;\n const assistData = CommonElement.getElementData(attrs);\n temp = await props.serverFileCallback(files, isImage, assistData);\n } catch {\n if (seq === _saveSeq && _removedCount === removedAtStart && props.theme === theme) {\n _callSaveServerCallback(theme, { req: extInfo, res: { success: false } });\n }\n return;\n }\n }\n let result: any = {};\n\n if (CommonBase.isBoolean(temp)) {\n result.success = temp;\n } else if (CommonBase.isUndefined(temp)) {\n result.success = true;\n } else if (CommonBase.isString(temp) || CommonBase.isArray(temp)) {\n result.success = true;\n result.fileUrl = temp;\n } else if (CommonBase.isObject(temp)) {\n result = temp;\n } else {\n result.success = false;\n }\n if (props.theme !== theme) {\n // 保存期间主题已切换:目标子组件已卸载,结果无处写入,提示用户重试\n emit('onError', ['保存期间主题已切换,本次保存结果未写入']);\n return;\n }\n if (seq !== _saveSeq || _removedCount !== removedAtStart) {\n return;\n }\n _callSaveServerCallback(theme, { req: extInfo, res: result });\n};\n\nprovide(\n '$FileuploadTop',\n reactive({\n getFileCheckInfo: () => {\n return {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n };\n },\n }),\n);\n\nconst getValue = () => {\n return _getValue();\n};\n\nconst cleanReduction = () => {\n switch (props.theme) {\n case 'default':\n refElFileDefault.value?.cleanReduction();\n break;\n case 'button':\n refElFileButton.value?.cleanReduction();\n break;\n default:\n break;\n }\n // 程序化清空后同步通知父组件(v-model 受控场景 value 不再残留旧值)\n _emitOnChange('', '');\n};\n\nexport interface ClFileUploadExpose {\n getValue: () => string | File | string[] | undefined; // desc: 获取文件值(default 主题: string | File;button 主题: string | string[];空态 '',子组件未挂载 undefined)\n cleanReduction: () => void; // desc: 清空文件\n}\n\ndefineExpose({\n getValue,\n cleanReduction,\n});\n</script>\n"],"names":["defaultFileCommon","format","group","CommonBase","fk","fv","type","icon","arrFormat","list","t","suffix","arrSuffix","reg","s","mime","arrMime","img","w","h","dataURL","canvas","useFileCheck","options","optPageLanguage","props","optBase","reactive","_fileCheckInfo","setOptions","opts","_initBaseInfo","isCheckImgWH","_getTypeInfo","_getTypeByFile","name","mimeType","regSuffix","regMime","newType","checkType","checkInfo","getTypeByFormat","formatGroup","getTypeByUrl","url","mimeMatch","createTempImg","src","maxWidth","resolve","reject","imgTemp","e","tw","th","showSrc","_checkImgWH","cw","ch","check","_checkFileImage","file","optionCheck","reader","res","error","checkFile","files","errorMsg","passFiles","passFilesInfo","parseSize","val","num","minSize","maxSize","len","f","errorOneMsg","errorInfo","fileName","fileMime","fileTypeInfo","fileInfo","m","useFileInfo","saveInfo","isUrlEmpty","imgSrc","imgWidth","imgHeight","useDownload","downloadHref","_fileName","inx","newFileName","newUrl","xhr","urlObject","exportBlob","elLink","__props","emit","__emit","getPageLanguage","useLanguage","_selfTop","inject","setFileInfo","useComplete","_getCheckOptions","setBaseOptions","downloadBlob","refElTopParent","ref","optPage","optFileInfo","_pageData","_initSeq","_saveTimer","elInputId","optElName","computed","clsParent","cls","CommonElement","clsWait","clsComplete","_emitChange","_emitError","msg","_emitRemove","_emitPreview","_emitSaveFile","extInfo","_setFileType","info","_setInitFileType","fileType","_setFileOperateType","runType","isInit","_setFileInfo","tempData","k","v","_setComplete","_revokeFileUrl","_getNewValue","value","_setUploadFile","resCheck","passFile","passFileInfo","_startSaveTimeout","tempInfo","_initValue","_initValueEmpty","seq","imgMaxWidth","resImg","imgInfo","_clearSaveTimeout","_initSetFileType","_initCompleteMsgTxt","completeMsgTxt","_initMain","onMounted","nextTick","watch","newValue","oldValue","lastValue","onDrop","onFileDefault","onRemove","elInput","onPreviewImage","onPreviewVideo","onDownloadImage","onDownloadFile","__expose","result","fileUrl","onBeforeUnmount","_createElementBlock","_createElementVNode","_unref","_createVNode","ClIconFont","_hoisted_3","_renderSlot","_ctx","_openBlock","_hoisted_4","_hoisted_5","_hoisted_7","_toDisplayString","_Fragment","_hoisted_10","_hoisted_13","_hoisted_15","ClLoad","_keyIndex","refElButton","refElLabel","ran","optFileCompleteList","optShowListKey","_removeTimer","_removingId","_emitOnChange","fileExt","_emitOnError","_emitOnRemove","_emitOnPreview","_emitOnSaveFile","_revokeAllBlob","fileList","saveList","idKey","i","onFileButton","filesInfo","id","removed","onDownload","onClickLabel","fileUrlIdx","idx","reqList","newPairs","newReqList","existUrls","index","reqIdx","ClButton","_renderList","fileItemInfo","_createBlock","_Transition","_withModifiers","$event","_hoisted_8","_hoisted_11","_hoisted_12","_clGlobals","attrs","useAttrs","elId","refElFileDefault","refElFileButton","_saveSeq","_removedCount","optIsServerCallback","fileValue","_getValue","_callSaveServerCallback","theme","onChange","onError","onPreview","onSaveFile","removedAtStart","temp","isImage","assistData","provide","ClFileuploadButton","ClFileuploadDefault"],"mappings":"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"}
1
+ {"version":3,"file":"Index.vue_vue_type_script_setup_true_lang-BDPkmgGP.js","sources":["../../../src/libs/Web/FileUpload/useCheck.ts","../../../src/libs/Web/FileUpload/useComplete.ts","../../../src/libs/Web/FileUpload/useDownload.ts","../../../src/libs/Web/FileUpload/Default.vue","../../../src/libs/Web/FileUpload/Button.vue","../../../src/libs/Web/FileUpload/Index.vue"],"sourcesContent":["import CommonBase from '../../Common/base';\nimport { reactive } from 'vue';\n\nconst defaultFileCommon: any = {\n format: {\n img: ['jpg', 'jpe', 'jpeg', 'png', 'gif', 'bmp', 'ico'],\n video: [\n 'mp4',\n 'rmvb',\n '3gp',\n 'avi',\n 'asf',\n 'asf',\n 'dv',\n 'mov',\n 'mpg4',\n 'mpeg',\n 'mpg',\n 'wm',\n 'wmx',\n 'flv',\n 'mkv',\n 'mp4a',\n 'rm',\n 'wmv',\n 'swf',\n 'swfl',\n ],\n audio: ['mp3', 'ogg', 'wav', 'wma', 'mid', 'ra', 'ram'],\n zip: ['rar', 'zip'],\n excel: ['xls', 'xlsx', 'csv'],\n pdf: ['pdf'],\n txt: ['txt'],\n doc: ['doc', 'docx'],\n },\n icon: {\n img: 'image',\n video: 'video',\n audio: 'music',\n txt: 'text',\n zip: 'zip',\n excel: 'excel',\n pdf: 'pdf',\n doc: 'word',\n default: 'file',\n },\n suffix: {\n jpg: ['jpg', 'jpe', 'jpeg'],\n jpe: ['jpg', 'jpe', 'jpeg'],\n jpeg: ['jpg', 'jpe', 'jpeg'],\n png: ['png'],\n gif: ['gif'],\n bmp: ['bmp'],\n ico: ['ico'],\n mp4: ['mp4'],\n rmvb: ['rmvb'],\n '3gp': ['3gp'],\n avi: ['avi'],\n asf: ['asf'],\n dv: ['dv'],\n mov: ['mov'],\n mpg4: ['mpg4'],\n mpeg: ['mpeg'],\n mpg: ['mpg'],\n wm: ['wm'],\n wmx: ['wmx'],\n flv: ['flv'],\n mkv: ['mkv'],\n mp4a: ['mp4a'],\n rm: ['rm'],\n wmv: ['wmv'],\n swf: ['swf'],\n swfl: ['swfl'],\n mp3: ['mp3'],\n ogg: ['ogg'],\n wav: ['wav'],\n wma: ['wma'],\n mid: ['mid'],\n ra: ['ra'],\n ram: ['ram'],\n rar: ['rar'],\n zip: ['zip'],\n txt: ['txt'],\n xls: ['xls', 'xlsx', 'csv'],\n xlsx: ['xls', 'xlsx', 'csv'],\n csv: ['xls', 'xlsx', 'csv'],\n pdf: ['pdf'],\n doc: ['doc', 'docx'],\n } as Record<string, string[]>,\n mime: {\n jpg: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n jpe: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n jpeg: ['image/jpg', 'image/jpeg', 'image/pjpeg'],\n png: ['image/png', 'image/x-png'],\n gif: ['image/gif'],\n bmp: ['image/bmp'],\n ico: ['ico'],\n mp4: ['video/mp4'],\n rmvb: ['audio/x-pn-realaudio'],\n '3gp': ['video/3gpp'],\n avi: ['video/x-msvideo'],\n asf: ['video/x-ms-asf'],\n dv: ['video/x-dv'],\n mov: ['video/quicktime'],\n mpg4: ['video/mp4'],\n mpeg: ['video/mpeg'],\n mpg: ['video/mpeg'],\n wm: ['video/x-ms-wmv'],\n wmx: ['video/x-ms-wmx'],\n flv: ['video/x-flv'],\n mkv: ['video/x-matroska'],\n mp4a: ['audio/mp4'],\n rm: ['audio/x-pn-realaudio'],\n wmv: ['audio/x-ms-wmv'],\n swf: ['application/x-shockwave-flash'],\n swfl: ['application/x-shockwave-flash'],\n mp3: ['audio/mpeg'],\n ogg: ['audio/ogg'],\n wav: ['audio/wav'],\n wma: ['audio/x-ms-wma'],\n mid: ['audio/midi'],\n ra: ['audio/x-pn-realaudio'],\n ram: ['audio/x-pn-realaudio'],\n rar: ['application/x-rar-compressed'],\n zip: ['application/zip', 'application/x-zip-compressed'],\n txt: ['text/plain'],\n xls: ['application/vnd.ms-excel', 'application/wps-office.xls'],\n xlsx: [\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'application/wps-office.xlsx',\n ],\n csv: ['text/csv'],\n pdf: ['application/pdf'],\n doc: ['application/msword'],\n docx: ['application/vnd.openxmlformats-officedocument.wordprocessingml.document'],\n } as Record<string, string[]>,\n getFormatGroup: (format: string) => {\n let group: string[] = [];\n if (CommonBase.isNonEmptyString(format)) {\n const arrType = format.split(',');\n arrType.forEach(t => {\n for (const [fk, fv] of Object.entries(defaultFileCommon.format)) {\n if (CommonBase.isExistValue(fv, t.toLocaleLowerCase())) {\n group.push(fk);\n }\n }\n });\n group = CommonBase.getArrUnique(group);\n }\n return group;\n },\n getIcon: (type: string) => {\n let icon = '';\n if (!CommonBase.isEmpty(type)) {\n icon = CommonBase.isExistJsonKey(defaultFileCommon.icon, type)\n ? defaultFileCommon.icon[type]\n : defaultFileCommon.icon.default;\n } else {\n icon = defaultFileCommon.icon.default;\n }\n return icon;\n },\n getSuffix: (arrFormat: string[]) => {\n let list: string[] = [];\n if (!CommonBase.isEmpty(arrFormat)) {\n arrFormat.forEach(t => {\n const suffix = defaultFileCommon.suffix[t.toLocaleLowerCase()];\n if (!CommonBase.isUndefined(suffix)) {\n list = list.concat(suffix);\n }\n });\n if (CommonBase.isEmpty(list)) {\n list = arrFormat;\n }\n }\n list = CommonBase.getArrUnique(list);\n return list;\n },\n getRegexBySuffix: (arrSuffix: string[]) => {\n if (CommonBase.isEmpty(arrSuffix)) {\n return null;\n }\n const reg = `\\\\.(?:${arrSuffix.join('|')})$`;\n return new RegExp(reg, 'i');\n },\n getMime: (arrSuffix: string[]) => {\n let list: string[] = [];\n if (!CommonBase.isEmpty(arrSuffix)) {\n arrSuffix.forEach(s => {\n const mime = defaultFileCommon.mime[s];\n if (!CommonBase.isUndefined(mime)) {\n list = list.concat(mime);\n }\n });\n }\n list = CommonBase.getArrUnique(list);\n return list;\n },\n getRegexByMime: (arrMime: string[]) => {\n if (CommonBase.isEmpty(arrMime)) {\n return null;\n }\n const reg = `^(?:${arrMime.join('|').replace(/\\//g, '\\\\/')})$`;\n return new RegExp(reg, 'i');\n },\n getImageThumbnail: (img: any, w: number, h: any) => {\n let dataURL = null;\n try {\n const canvas = document.createElement('canvas');\n canvas.width = w;\n canvas.height = h;\n const context: any = canvas.getContext('2d');\n context.drawImage(img, 0, 0, img.width, img.height, 0, 0, w, h);\n dataURL = canvas.toDataURL('image/gif');\n } catch (e) {\n dataURL = null;\n }\n return dataURL;\n },\n};\n\nconst useFileCheck = (options: any, optPageLanguage: any) => {\n let props = options;\n const optBase = reactive({\n mime: [] as string[],\n suffix: [] as string[],\n isCheckImgWH: false,\n });\n let _fileCheckInfo: any = null;\n\n const setOptions = (opts: any) => {\n props = CommonBase.getJsonMerge(props, opts);\n _initBaseInfo();\n };\n\n const _initBaseInfo = () => {\n const suffix = CommonBase.isNonEmptyString(props.checkFormat)\n ? defaultFileCommon.getSuffix(props.checkFormat.split(','))\n : [];\n const mime = defaultFileCommon.getMime(suffix);\n const isCheckImgWH =\n !CommonBase.isEmpty(props.checkWidth) && !CommonBase.isEmpty(props.checkHeight);\n\n optBase.mime = mime;\n optBase.suffix = suffix;\n optBase.isCheckImgWH = isCheckImgWH;\n };\n\n const _getTypeInfo = (type: string) => {\n const icon = defaultFileCommon.getIcon(type);\n return {\n type,\n icon,\n isImage: type === 'img',\n isVideo: type === 'video',\n isAudio: type === 'audio',\n isTxt: type === 'txt',\n isZip: type === 'zip',\n };\n };\n\n const _getTypeByFile = (name: string, mimeType?: string) => {\n if (CommonBase.isUndefined(_fileCheckInfo)) {\n _fileCheckInfo = {};\n for (const [fk, fv] of Object.entries(defaultFileCommon.format)) {\n const suffix = defaultFileCommon.getSuffix(fv as string[]);\n const mime = defaultFileCommon.getMime(suffix);\n const regSuffix = defaultFileCommon.getRegexBySuffix(suffix);\n const regMime = defaultFileCommon.getRegexByMime(mime);\n _fileCheckInfo[fk] = { suffix, mime, regSuffix, regMime };\n }\n }\n let newType = '';\n Object.keys(_fileCheckInfo).forEach((checkType: string) => {\n if (newType.length === 0) {\n const checkInfo = _fileCheckInfo[checkType];\n if (\n (checkInfo.regSuffix && checkInfo.regSuffix.test(name)) ||\n (mimeType && checkInfo.regMime && checkInfo.regMime.test(mimeType))\n ) {\n newType = checkType;\n }\n }\n });\n return _getTypeInfo(newType);\n };\n\n const getTypeByFormat = (format?: string) => {\n const formatGroup = defaultFileCommon.getFormatGroup(\n CommonBase.isEmpty(format) ? props.checkFormat : (format as string),\n );\n const type = formatGroup.length === 1 ? formatGroup[0] : '';\n return _getTypeInfo(type);\n };\n\n const getTypeByUrl = (url: string) => {\n if (!CommonBase.isString(url)) {\n return _getTypeByFile('');\n }\n if (url.startsWith('data:') || url.startsWith('blob:')) {\n // data:/blob: URL 无文件名段:按 mime 段识别类型(回显 dataURL 场景,如 data:image/png;base64)\n const mimeMatch = url.match(/^[a-z]+:([a-zA-Z0-9.+-]+\\/[a-zA-Z0-9.+-]+)/);\n return _getTypeByFile('', mimeMatch ? mimeMatch[1] : '');\n }\n const name = url\n .substring(url.lastIndexOf('/') + 1)\n .split('?')[0]\n .split('#')[0];\n return _getTypeByFile(name);\n };\n\n const createTempImg = (src: string, maxWidth?: number) => {\n return new Promise((resolve, reject) => {\n const imgTemp = document.createElement('img');\n imgTemp.onload = (e: any) => {\n const w: number = e.target.width;\n const h: number = e.target.height;\n let tw = w;\n let th = h;\n if (maxWidth && maxWidth > 0) {\n if (tw > maxWidth || th > maxWidth) {\n if (tw > th) {\n th = parseInt(((maxWidth / tw) * th).toString(), 10);\n tw = maxWidth;\n } else {\n tw = parseInt(((maxWidth / th) * tw).toString(), 10);\n th = maxWidth;\n }\n }\n }\n const showSrc = e.target.src;\n resolve({ src: showSrc, w, h, tw, th, isImage: true });\n };\n imgTemp.onerror = () => {\n reject(new Error('fail: temp create image'));\n };\n imgTemp.src = src;\n });\n };\n\n const _checkImgWH = (w: number, h: number) => {\n const cw = CommonBase.isEmpty(props.checkWidth) ? 0 : parseInt(props.checkWidth as string, 10);\n const ch = CommonBase.isEmpty(props.checkHeight)\n ? 0\n : parseInt(props.checkHeight as string, 10);\n if (!CommonBase.isFinite(cw) || !CommonBase.isFinite(ch) || cw === 0 || ch === 0) {\n return true;\n }\n let check = true;\n switch (props.checkWHType) {\n case 'greater':\n check = w >= cw && h >= ch;\n break;\n case 'less':\n check = w <= cw && h <= ch;\n break;\n case 'equal':\n check = w === cw && h === ch;\n break;\n default:\n check = true;\n break;\n }\n return check;\n };\n\n const _checkFileImage = (file: any, optionCheck: any) => {\n return new Promise((resolve, reject) => {\n if (file instanceof File) {\n const reader = new FileReader();\n reader.onload = (e: any) => {\n createTempImg(e.target.result, optionCheck.maxWidth)\n .then((res: any) => {\n const checkWH = optBase.isCheckImgWH ? _checkImgWH(res.w, res.h) : true;\n if (checkWH) {\n resolve(res);\n } else {\n reject(new Error(optPageLanguage.value.checkImageWHLabel));\n }\n })\n .catch(error => {\n reject(error);\n });\n };\n reader.onerror = () => {\n reject(new Error('fail: new FileReader image onload()'));\n };\n reader.readAsDataURL(file);\n } else {\n reject(new Error('fail: file is not a File instance'));\n }\n });\n };\n\n const checkFile = async (files: any, optionCheck: any) => {\n let errorMsg: string[] = [];\n const passFiles: any = [];\n const passFilesInfo: any = [];\n\n const regSuffix = defaultFileCommon.getRegexBySuffix(optBase.suffix);\n const regMime = defaultFileCommon.getRegexByMime(optBase.mime);\n const parseSize = (val: any) => {\n const num = CommonBase.isEmpty(val) ? NaN : parseInt(val as string, 10);\n return CommonBase.isFinite(num) ? num * 1024 : null;\n };\n const minSize = parseSize(props.checkMinSize);\n const maxSize = parseSize(props.checkMaxSize);\n\n const len = files.length;\n for (let f = 0; f < len; f += 1) {\n const errorOneMsg = [];\n const file = files[f];\n\n const errorInfo = { suffix: false, mime: false, size: false };\n const fileName = file.name;\n if (regSuffix && !regSuffix.test(fileName)) {\n errorInfo.suffix = true;\n }\n const fileMime = file.type;\n if (!CommonBase.isEmpty(fileMime) && regMime && !regMime.test(fileMime)) {\n errorInfo.mime = true;\n }\n if (minSize && file.size < minSize) {\n errorInfo.size = true;\n }\n if (maxSize && file.size > maxSize) {\n errorInfo.size = true;\n }\n\n if (errorInfo.suffix || errorInfo.mime) {\n errorOneMsg.push(optPageLanguage.value.checkSuffixMimeLabel);\n }\n if (errorInfo.size) {\n errorOneMsg.push(optPageLanguage.value.checkSizeLabel);\n }\n const fileTypeInfo = _getTypeByFile(fileName, fileMime);\n let fileInfo: any = null;\n if (fileTypeInfo.isImage) {\n fileInfo = await _checkFileImage(file, optionCheck).catch(error => {\n errorOneMsg.push(error.message);\n });\n }\n if (CommonBase.isUndefined(fileInfo)) {\n fileInfo = {};\n }\n fileInfo = CommonBase.getJsonMerge(fileInfo, fileTypeInfo);\n fileInfo.fileName = fileName;\n fileInfo.file = file;\n if (errorOneMsg.length === 0) {\n passFiles.push(file);\n passFilesInfo.push(fileInfo);\n } else {\n if (len === 1) {\n errorMsg = errorOneMsg.map(m => `${optPageLanguage.value.uploadFile} ${m}`);\n } else {\n errorMsg.push(`${fileName}:${errorOneMsg.join(',')}`);\n }\n }\n }\n return new Promise(resolve => {\n setTimeout(() => {\n resolve({ errorMsg, passFiles, passFilesInfo, original: files });\n }, 200);\n });\n };\n\n _initBaseInfo();\n return {\n optBase,\n getTypeByFormat,\n getTypeByUrl,\n createTempImg,\n checkFile,\n setBaseOptions: setOptions,\n };\n};\nexport default useFileCheck;\n","import CommonBase from '../../Common/base';\n\nconst useFileInfo = () => {\n const setFileInfo = (fileInfo: any, saveInfo: any) => {\n const url = saveInfo && saveInfo.fileUrl ? saveInfo.fileUrl : '';\n if (!CommonBase.isString(url)) {\n return { name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 };\n }\n const isUrlEmpty = CommonBase.isEmpty(url);\n let fileName = '';\n if (isUrlEmpty || url.startsWith('blob:')) {\n fileName = fileInfo.fileName;\n } else {\n fileName = url.substr(url.lastIndexOf('/') + 1);\n }\n let imgSrc = '';\n let imgWidth = 0;\n let imgHeight = 0;\n if (fileInfo.isImage) {\n imgSrc = isUrlEmpty ? fileInfo.src : url;\n imgWidth = fileInfo.tw || 0;\n imgHeight = fileInfo.th || 0;\n }\n return { name: fileName, url, imgSrc, imgWidth, imgHeight };\n };\n\n return {\n setFileInfo,\n };\n};\nexport default useFileInfo;\n","import CommonBase from '../../Common/base';\n\nconst useDownload = () => {\n const downloadHref = (url: string, _fileName?: string) => {\n window.open(url);\n };\n const downloadBlob = (url: string) => {\n if (!CommonBase.isEmpty(url)) {\n const inx = url.lastIndexOf('/');\n const newFileName = url.substring(inx + 1);\n\n const newUrl = url.replace(/\\\\/g, '/');\n const xhr = new XMLHttpRequest();\n xhr.open('GET', newUrl, true);\n xhr.responseType = 'blob';\n\n xhr.onload = () => {\n if (xhr.status === 200) {\n const urlObject = window.URL || window.webkitURL || window;\n const exportBlob = new Blob([xhr.response]);\n const elLink: any = document.createElementNS('http://www.w3.org/1999/xhtml', 'a');\n elLink.href = urlObject.createObjectURL(exportBlob);\n elLink.download = newFileName;\n elLink.click();\n // 1000: 等待下载启动后再释放 blob URL(立即 revoke 会中断下载,参照 Button onDownload 模式)\n setTimeout(() => URL.revokeObjectURL(elLink.href), 1000);\n } else {\n downloadHref(url, newFileName);\n }\n };\n xhr.onerror = () => {\n downloadHref(url, newFileName);\n };\n xhr.send();\n }\n };\n\n return {\n downloadHref,\n downloadBlob,\n };\n};\nexport default useDownload;\n","<template>\n <div\n :class=\"clsParent\"\n ref=\"refElTopParent\"\n >\n <div\n class=\"fileUpload-default-container\"\n @drop=\"onDrop\"\n @dragover.prevent\n >\n <label :for=\"elInputId\">\n <input\n v-if=\"optPage.isInitFileInput && !disabled\"\n type=\"file\"\n :id=\"elInputId\"\n :name=\"optElName\"\n @change=\"onFileDefault\"\n :accept=\"optBase.mime.join(',')\"\n />\n <template v-else>\n <input\n :id=\"elInputId\"\n :name=\"optElName\"\n style=\"display: none !important\"\n />\n </template>\n <span\n v-if=\"optPage.runOperateType === 'init'\"\n :class=\"clsWait\"\n >\n <cl-icon-font\n :name=\"optPage.icon\"\n class=\"fileUpload-icon\"\n ></cl-icon-font>\n <span class=\"fileUpload-label\">\n <slot name=\"label\"></slot>\n </span>\n </span>\n <span\n v-else-if=\"optPage.runOperateType === 'complete'\"\n :class=\"clsComplete\"\n >\n <span\n class=\"fileUpload-img\"\n v-if=\"optPage.isImage\"\n >\n <span class=\"fileUpload-img-container\">\n <img\n :src=\"optFileInfo.imgSrc\"\n :width=\"optFileInfo.imgWidth\"\n :height=\"optFileInfo.imgHeight\"\n />\n </span>\n <span\n v-if=\"isShowCompleteMsg\"\n class=\"file-complete-img-msg\"\n >{{ optPage.completeMsgTxt }}</span\n >\n <template v-else></template>\n <i\n v-if=\"isShowPreview && !disabled\"\n class=\"preview-icon\"\n :title=\"optPageLanguage.common.preview\"\n @click.stop=\"onPreviewImage\"\n ><cl-icon-font name=\"search-plus\"></cl-icon-font\n ></i>\n <template v-else></template>\n <i\n v-if=\"isShowDownload && !disabled\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownloadImage\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n class=\"fileUpload-video\"\n v-else-if=\"optPage.isVideo\"\n >\n <video :src=\"optFileInfo.url\"></video>\n <span\n v-if=\"isShowPreview && !disabled\"\n class=\"preview-icon\"\n @click.stop=\"onPreviewVideo\"\n ><cl-icon-font name=\"play\"></cl-icon-font\n ></span>\n <template v-else></template>\n <i\n v-if=\"isShowDownload && !disabled\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownloadFile\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n class=\"fileUpload-file\"\n v-else\n >\n <cl-icon-font\n :name=\"optPage.icon\"\n class=\"fileUpload-icon\"\n ></cl-icon-font>\n <span>{{ optFileInfo.name }}</span>\n </span>\n <a\n v-if=\"!disabled\"\n class=\"file-complete-remove\"\n href=\"javascript:\"\n :title=\"optPageLanguage.common.delete\"\n @click.stop=\"onRemove\"\n ><cl-icon-font name=\"close\"></cl-icon-font\n ></a>\n <template v-else></template>\n </span>\n <template v-else></template>\n </label>\n </div>\n <div\n class=\"fileUpload-load\"\n v-if=\"optPage.runOperateType === 'load'\"\n >\n <cl-load\n theme=\"circleBubble\"\n size=\"large\"\n ></cl-load>\n </div>\n <template v-else></template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, onMounted, onBeforeUnmount, nextTick, watch, computed, reactive, ref } from 'vue';\nimport useFileCheck from './useCheck';\nimport useComplete from './useComplete';\nimport useDownload from './useDownload';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClLoad from '../../Element/Load/Index.vue';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport useLanguage from '../../Use/language';\n\ninterface FileuploadTop {\n getFileCheckInfo: () => {\n checkFormat?: string;\n checkWidth?: string | number;\n checkHeight?: string | number;\n checkWHType?: string;\n checkMinSize?: string | number;\n checkMaxSize?: string | number;\n };\n}\n\ninterface FileInfoData {\n name: string;\n url: string;\n imgSrc: string;\n imgWidth: number;\n imgHeight: number;\n}\n\ninterface FilePassInfo {\n type: string;\n icon: string;\n isImage: boolean;\n isVideo: boolean;\n isAudio: boolean;\n isTxt: boolean;\n isZip: boolean;\n fileName: string;\n file: File;\n src?: string;\n w?: number;\n h?: number;\n tw?: number;\n th?: number;\n}\n\ndefineOptions({ name: 'ClFileUploadDefault' });\n\nconst props = defineProps({\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n defaultHoverTitle: String, // desc: 默认悬停标题\n defaultIcon: String, // desc: 自定义初始显示图标(空态上传区),未设置时按 checkFormat 自动转换\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n validator: (v: string) => ['equal', 'greater', 'less'].includes(v),\n },\n isServerCallback: Boolean, // desc: 是否服务端回调\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n isShowCompleteMsg: {\n type: Boolean,\n default: true, // desc: 是否显示上传完成后的底部信息条(黑色透明区域)\n },\n});\n\nconst emit = defineEmits<{\n (e: 'onChange', file: string | File): void; // desc: 文件变化\n (e: 'onError', msg: string[]): void; // desc: 校验错误\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onPreview', src: string, type: string): void; // desc: 预览\n (e: 'onSaveFile', file: File, extInfo: FilePassInfo): void; // desc: 服务端回调保存\n}>();\n// slots: label\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('fileUpload');\n\nconst _selfTop = inject<FileuploadTop | null>('$FileuploadTop', null);\nif (!_selfTop) {\n console.warn('[FileUpload] Default 主题缺少 $FileuploadTop 注入,使用空校验配置');\n}\nconst { setFileInfo } = useComplete();\nconst _getCheckOptions = () =>\n CommonBase.getJsonMerge(_selfTop?.getFileCheckInfo() ?? {}, {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n });\nconst { optBase, getTypeByFormat, getTypeByUrl, createTempImg, checkFile, setBaseOptions } =\n useFileCheck(_getCheckOptions(), optPageLanguage);\nconst { downloadBlob, downloadHref } = useDownload();\n\nconst refElTopParent = ref<HTMLElement | null>(null);\n\nconst optPage = reactive({\n isImage: false,\n isVideo: false,\n icon: '',\n completeMsgTxt: '',\n isInitFileInput: true,\n runOperateType: 'init',\n});\nconst optFileInfo: FileInfoData = reactive({\n name: '',\n url: '',\n imgSrc: '',\n imgWidth: 0,\n imgHeight: 0,\n});\nconst _pageData: { file: File | null } = {\n file: null,\n};\nlet _initSeq = 0;\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\n\n// 跨实例唯一 id:label :for 与 input :id 必须全局唯一(props.name 是表单字段名,可重复)\nconst elInputId = `fileUpload_${CommonBase.getRandom(8)}`;\n\nconst optElName = computed(() => {\n let name = props.name;\n if (CommonBase.isEmpty(name)) {\n name = `fileUpload_${CommonBase.getRandom(8)}`;\n }\n return name;\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'fileUpload-default': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst clsWait = computed(() => {\n return {\n 'fileUpload-wait': true,\n 'fileUpload-disabled': props.disabled,\n };\n});\n\nconst clsComplete = computed(() => {\n return {\n 'fileUpload-complete': true,\n 'fileUpload-disabled': props.disabled,\n };\n});\n\nconst _emitChange = (file: string | File) => {\n emit('onChange', file);\n};\n\nconst _emitError = (msg: string[]) => {\n emit('onError', msg);\n};\n\nconst _emitRemove = () => {\n emit('onRemove');\n};\n\nconst _emitPreview = (src: string, type: string) => {\n emit('onPreview', src, type);\n};\n\nconst _emitSaveFile = (file: any, extInfo: any) => {\n emit('onSaveFile', file, extInfo);\n};\n\nconst _setFileType = (info: any) => {\n optPage.isImage = info.isImage;\n optPage.isVideo = info.isVideo;\n optPage.icon = info.icon;\n};\n\n// init 态(空态上传区)文件类型与图标:defaultIcon 优先,未设置时按 checkFormat 自动转换\nconst _setInitFileType = () => {\n const fileType = getTypeByFormat();\n if (CommonBase.isNonEmptyString(props.defaultIcon)) {\n fileType.icon = props.defaultIcon;\n }\n _setFileType(fileType);\n};\n\nconst _setFileOperateType = (type: string) => {\n if (type !== 'load') {\n optPage.isInitFileInput = true;\n }\n let runType = '';\n switch (type) {\n case 'remove':\n case 'clean': {\n runType = 'init';\n _setInitFileType();\n break;\n }\n case 'fail': {\n let isInit = true;\n if (optPage.isImage) {\n if (!CommonBase.isEmpty(optFileInfo.url) || !CommonBase.isEmpty(optFileInfo.imgSrc)) {\n isInit = false;\n }\n } else {\n if (!CommonBase.isEmpty(optFileInfo.url)) {\n isInit = false;\n }\n }\n runType = isInit ? 'init' : 'complete';\n break;\n }\n default:\n runType = type;\n }\n optPage.runOperateType = runType;\n};\n\nconst _setFileInfo = (tempData: any) => {\n const info = optFileInfo as unknown as Record<string, unknown>;\n for (const [k, v] of Object.entries(tempData)) {\n if (!CommonBase.isUndefined(info[k])) {\n info[k] = v;\n }\n }\n _pageData.file = tempData.file ?? _pageData.file; // 保留已有本地文件(tempData 无 file 字段时不清空)\n};\n\nconst _setComplete = (fileInfo: any, saveInfo: any) => {\n _revokeFileUrl();\n _setFileType(fileInfo);\n const tempData = setFileInfo(fileInfo, saveInfo);\n _setFileInfo(tempData);\n _setFileOperateType('complete');\n};\n\nconst _getNewValue = () => {\n let value: any = null;\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n // 本地 blob URL 不可持久化(刷新即失效):优先返回 File 对象(与 Button 主题对齐)\n value = _pageData.file;\n } else if (CommonBase.isEmpty(optFileInfo.url)) {\n if (optPage.isImage && !CommonBase.isEmpty(optFileInfo.imgSrc)) {\n value = optFileInfo.imgSrc;\n } else {\n value = _pageData.file;\n }\n } else {\n value = optFileInfo.url;\n }\n if (CommonBase.isUndefined(value)) {\n value = '';\n }\n return value;\n};\n\nconst _setUploadFile = (files: any) => {\n if (files.length > 0 && optPage.runOperateType !== 'load') {\n optPage.isInitFileInput = false;\n _setFileOperateType('load');\n _initSeq += 1; // 作废挂起的回显图片加载(createTempImg 晚到不覆盖本次上传)\n const optionCheck = {\n maxWidth: refElTopParent.value ? refElTopParent.value.clientWidth - 4 : 0, // 4: 容器 1px 边框 ×2 补偿\n };\n checkFile(files, optionCheck)\n .then((resCheck: any) => {\n if (optPage.runOperateType !== 'load') {\n return;\n }\n if (resCheck.passFiles.length > 0) {\n const passFile = resCheck.passFiles[0];\n const passFileInfo = resCheck.passFilesInfo[0];\n\n if (passFileInfo.isImage) {\n if (props.isServerCallback) {\n _emitSaveFile(passFile, passFileInfo);\n _startSaveTimeout();\n } else {\n _setComplete(passFileInfo, {});\n _pageData.file = passFile;\n _emitChange(passFileInfo.src);\n }\n } else {\n if (props.isServerCallback) {\n _emitSaveFile(passFile, passFileInfo);\n _startSaveTimeout();\n } else {\n const tempInfo: any = {};\n if (passFileInfo.isVideo) {\n const url = URL.createObjectURL(passFile);\n tempInfo.fileUrl = url;\n }\n _setComplete(passFileInfo, tempInfo);\n _pageData.file = passFile;\n _emitChange(passFile);\n }\n }\n } else {\n _setFileOperateType('fail');\n if (resCheck.errorMsg.length > 0) {\n _emitError(resCheck.errorMsg as string[]);\n }\n }\n })\n .catch(() => {\n if (optPage.runOperateType !== 'load') {\n return;\n }\n _setFileOperateType('fail');\n _emitError(['文件校验失败,请重试']);\n });\n }\n};\n\nconst _initValue = (value: string) => {\n if (!CommonBase.isNonEmptyString(value)) {\n if (CommonBase.isString(value) || CommonBase.isUndefined(value)) {\n _initValueEmpty();\n }\n return;\n }\n const seq = ++_initSeq;\n const fileType = getTypeByUrl(value);\n if (optPage.isImage && fileType.isImage) {\n const imgMaxWidth = refElTopParent.value ? refElTopParent.value.clientWidth - 4 : 0; // 4: 容器 1px 边框 ×2 补偿\n createTempImg(value, imgMaxWidth)\n .then((resImg: any) => {\n if (seq !== _initSeq) {\n return;\n }\n const imgInfo = CommonBase.getJsonMerge(resImg, fileType);\n _setComplete(imgInfo, { fileUrl: value });\n })\n .catch(() => {\n if (seq !== _initSeq) {\n return;\n }\n _setFileOperateType('fail');\n _emitError(['图片加载失败,请检查图片地址']);\n });\n } else {\n _setComplete(fileType, { fileUrl: value });\n }\n};\n\nconst _revokeFileUrl = () => {\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n URL.revokeObjectURL(optFileInfo.url);\n }\n};\n\nconst _clearSaveTimeout = () => {\n if (_saveTimer) {\n clearTimeout(_saveTimer);\n _saveTimer = null;\n }\n};\n\nconst _startSaveTimeout = () => {\n _clearSaveTimeout();\n _saveTimer = setTimeout(() => {\n if (optPage.runOperateType === 'load') {\n _setFileOperateType('fail');\n _emitError(['服务端保存超时,请重试']);\n }\n }, 60000); // 60000: 服务端保存超时兜底(父组件 serverFileCallback 永不回调时恢复 UI)\n};\n\nconst _initValueEmpty = () => {\n _initSeq += 1; // 作废挂起的回显图片加载\n _pageData.file = null; // 清空回显:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('init');\n};\n\nconst _initSetFileType = () => {\n if (CommonBase.isEmpty(props.value)) {\n _setInitFileType();\n return;\n }\n _setFileType(getTypeByUrl(props.value as string));\n};\n\nconst _initCompleteMsgTxt = () => {\n let completeMsgTxt = props.defaultHoverTitle;\n if (optPage.isImage && optBase.isCheckImgWH && CommonBase.isEmpty(completeMsgTxt)) {\n completeMsgTxt = `${props.checkWidth}x${props.checkHeight}`;\n }\n optPage.completeMsgTxt = completeMsgTxt as string;\n};\n\nconst _initMain = () => {\n _initSetFileType();\n _initCompleteMsgTxt();\n _initValue(props.value as string);\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n const lastValue = _getNewValue();\n if (newValue !== lastValue) {\n _clearSaveTimeout();\n _initSetFileType();\n _initValue(newValue as string);\n }\n }\n },\n);\n\nwatch(\n [\n () => props.checkFormat,\n () => props.checkWidth,\n () => props.checkHeight,\n () => props.checkWHType,\n () => props.checkMinSize,\n () => props.checkMaxSize,\n ],\n () => {\n _clearSaveTimeout();\n setBaseOptions(_getCheckOptions());\n _initSetFileType();\n _initCompleteMsgTxt();\n if (optPage.runOperateType === 'load') {\n // load 态(上传/保存进行中):配置同步即可,不重放 value——避免打断进行中的保存\n return;\n }\n const lastValue = _getNewValue();\n if (props.value === lastValue) {\n _initValue(props.value as string);\n }\n },\n);\n\nconst onDrop = (e: any) => {\n e.preventDefault();\n e.stopPropagation();\n if (!props.disabled && e.dataTransfer) {\n _setUploadFile(e.dataTransfer.files);\n }\n};\n\nconst onFileDefault = (e: any) => {\n if (!props.disabled) {\n _setUploadFile(e.currentTarget.files);\n }\n};\n\nconst onRemove = () => {\n _clearSaveTimeout();\n _initSeq += 1; // 作废挂起的回显图片加载\n _revokeFileUrl();\n _pageData.file = null; // 用户主动移除:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('remove');\n const elInput = document.getElementById(elInputId) as HTMLInputElement | null;\n if (elInput) {\n elInput.value = ''; // 重置 input value:重选同一文件时 change 才能再次触发\n }\n _emitRemove();\n};\n\nconst onPreviewImage = (e: any) => {\n const src = CommonBase.isEmpty(optFileInfo.url) ? optFileInfo.imgSrc : optFileInfo.url;\n _emitPreview(src, 'image');\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onPreviewVideo = (e: any) => {\n if (!CommonBase.isEmpty(optFileInfo.url)) {\n _emitPreview(optFileInfo.url, 'video');\n }\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onDownloadImage = (e: any) => {\n CommonBase.isEmpty(optFileInfo.url)\n ? downloadHref(optFileInfo.imgSrc, optFileInfo.name)\n : downloadBlob(optFileInfo.url);\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst onDownloadFile = (e: any) => {\n if (CommonBase.isString(optFileInfo.url) && optFileInfo.url.startsWith('blob:')) {\n const elLink: any = document.createElement('a');\n elLink.href = optFileInfo.url;\n elLink.download = optFileInfo.name;\n elLink.click();\n } else {\n downloadBlob(optFileInfo.url);\n }\n e.preventDefault();\n e.stopPropagation();\n};\n\nconst saveServerCallback = (result: any) => {\n _clearSaveTimeout();\n if (optPage.runOperateType !== 'load') {\n return;\n }\n if (!result || !result.res || !CommonBase.isBoolean(result.res.success)) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n if (!result.res.success) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n if (!result.req) {\n _setFileOperateType('fail');\n _emitError(['文件保存失败,请重试']);\n return;\n }\n let fileUrl = '';\n if (CommonBase.isString(result.res.fileUrl)) {\n fileUrl = result.res.fileUrl;\n } else if (\n CommonBase.isArray(result.res.fileUrl) &&\n result.res.fileUrl.length > 0 &&\n CommonBase.isString(result.res.fileUrl[0])\n ) {\n fileUrl = result.res.fileUrl[0];\n }\n if (CommonBase.isEmpty(fileUrl)) {\n // 服务端确认成功但未返回 URL(callback 仅执行上传):回到 init 态(可继续上传),不报错不回显\n _pageData.file = null;\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('init');\n return;\n }\n _setComplete(result.req, { fileUrl });\n _emitChange(fileUrl);\n};\n\nconst getValue = () => {\n return _getNewValue();\n};\n\nconst cleanReduction = () => {\n _clearSaveTimeout();\n _initSeq += 1; // 作废挂起的回显图片加载\n _revokeFileUrl();\n _pageData.file = null; // 清除还原:本地文件同步清空,getValue/update:value 不再返回旧 File\n _setFileInfo({ name: '', url: '', imgSrc: '', imgWidth: 0, imgHeight: 0 });\n _setFileOperateType('clean');\n};\n\nexport interface ClFileUploadDefaultExpose {\n saveServerCallback: (result: any) => void; // desc: 服务端回调结果(req: 文件信息, res: { success, fileUrl })\n getValue: () => string | File; // desc: 获取文件值(URL 字符串或本地 File;空态 '')\n cleanReduction: () => void; // desc: 清空文件\n}\n\ndefineExpose({\n saveServerCallback,\n getValue,\n cleanReduction,\n});\n\nonBeforeUnmount(() => {\n _clearSaveTimeout();\n _revokeFileUrl();\n});\n</script>\n","<template>\n <div :class=\"clsParent\">\n <input\n v-if=\"optPage.isInitFileInput && !disabled\"\n type=\"file\"\n :id=\"optPage.elFileId\"\n :name=\"optElName\"\n :multiple=\"isMultiple\"\n :accept=\"optBase.mime.join(',')\"\n @change=\"onFileButton\"\n />\n <template v-else>\n <input\n :id=\"optPage.elFileId\"\n :name=\"optElName\"\n :disabled=\"disabled\"\n :accept=\"optBase.mime.join(',')\"\n style=\"display: none !important\"\n @change=\"onFileButton\"\n />\n </template>\n <label\n ref=\"refElLabel\"\n :for=\"optPage.elFileId\"\n >\n <cl-button\n ref=\"refElButton\"\n :className=\"buttonClass\"\n :isShowBackDrop=\"true\"\n :disabled=\"disabled\"\n :label=\"buttonLabel || optPageLanguage.common.upload\"\n :icon=\"buttonIcon\"\n :color=\"buttonColor\"\n @onClick=\"onClickLabel\"\n ></cl-button>\n </label>\n </div>\n <slot name=\"label\"></slot>\n <ul\n v-if=\"optFileCompleteList.length > 0 && isShowUploadResult\"\n class=\"fileUpload-list\"\n >\n <template v-for=\"(fileItemInfo, inx) in optFileCompleteList\">\n <transition\n name=\"fileUploadButton\"\n enter-active-class=\"fileupload-anim-in\"\n leave-active-class=\"fileupload-anim-out\"\n >\n <li\n v-if=\"optShowListKey.indexOf(fileItemInfo.rId) > -1\"\n :key=\"`${_keyIndex}-${fileItemInfo.rId}-${inx}`\"\n class=\"fileUpload-item\"\n >\n <span\n v-if=\"fileItemInfo.isImage\"\n class=\"fileUpload-item-icon fileUpload-item-img\"\n >\n <img :src=\"fileItemInfo.imgSrc\" />\n <i\n v-if=\"isShowPreview\"\n class=\"preview-icon\"\n :title=\"optPageLanguage.common.preview\"\n @click.stop=\"onPreviewImage(fileItemInfo, inx)\"\n ><cl-icon-font name=\"search-plus\"></cl-icon-font\n ></i>\n <template v-else></template>\n </span>\n <span\n v-else-if=\"fileItemInfo.isVideo\"\n class=\"fileUpload-item-icon fileUpload-item-video\"\n >\n <video :src=\"fileItemInfo.url\"></video>\n <span\n v-if=\"isShowPreview\"\n class=\"preview-icon\"\n @click.stop=\"onPreviewVideo(fileItemInfo, inx)\"\n ><cl-icon-font name=\"play\"></cl-icon-font\n ></span>\n <template v-else></template>\n </span>\n <cl-icon-font\n v-else\n :name=\"fileItemInfo.icon\"\n class=\"fileUpload-item-icon\"\n ></cl-icon-font>\n <span class=\"fileUpload-item-name\">{{ fileItemInfo.name }}</span>\n <span class=\"fileUpload-item-operate\">\n <i\n v-if=\"isShowDownload\"\n class=\"download-icon\"\n :title=\"optPageLanguage.common.download\"\n @click.stop=\"onDownload(fileItemInfo)\"\n ><cl-icon-font name=\"download\"></cl-icon-font\n ></i>\n <template v-else></template>\n <a\n v-if=\"!disabled\"\n class=\"file-complete-remove\"\n href=\"javascript:\"\n :title=\"optPageLanguage.common.delete\"\n @click.stop=\"onRemove(fileItemInfo.rId)\"\n ><cl-icon-font name=\"close\"></cl-icon-font\n ></a>\n <template v-else></template>\n </span>\n </li>\n </transition>\n </template>\n </ul>\n <template v-else></template>\n</template>\n\n<script setup lang=\"ts\">\nimport { inject, watch, onMounted, onBeforeUnmount, nextTick, computed, reactive, ref } from 'vue';\nimport useFileCheck from './useCheck';\nimport useComplete from './useComplete';\nimport useDownload from './useDownload';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClButton from '../../Element/Button/Index.vue';\nimport ClIconFont from '../../Element/IconFont/Index.vue';\nimport useLanguage from '../../Use/language';\n\ninterface FileuploadTop {\n getFileCheckInfo: () => {\n checkFormat?: string;\n checkWidth?: string | number;\n checkHeight?: string | number;\n checkWHType?: string;\n checkMinSize?: string | number;\n checkMaxSize?: string | number;\n };\n}\n\ndefineOptions({ name: 'ClFileUploadButton' });\n\nconst props = defineProps({\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n isMultiple: Boolean, // desc: 是否多选\n buttonClass: String, // desc: 按钮自定义CSS类名\n buttonLabel: String, // desc: 按钮文案\n buttonIcon: {\n type: String,\n default: '', // desc: 按钮图标\n },\n buttonColor: {\n type: String,\n default: 'default', // desc: 按钮颜色 | enum: default, primary, success, info, warning, danger (可自定义)\n },\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n validator: (v: string) => ['equal', 'greater', 'less'].includes(v),\n },\n isServerCallback: Boolean, // desc: 是否服务端回调\n isShowUploadResult: {\n type: Boolean,\n default: true, // desc: 是否显示上传结果\n },\n isShowUploadIng: {\n type: Boolean,\n default: true, // desc: 是否显示上传中状态\n },\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n});\n\nconst emit = defineEmits<{\n (e: 'onChange', file: File | File[] | string | string[], fileExt?: any): void; // desc: 文件变化\n (e: 'onError', msg: string[]): void; // desc: 校验错误\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onPreview', src: string, type: string, inx?: number): void; // desc: 预览\n (e: 'onSaveFile', file: File | File[], extInfo: any): void; // desc: 服务端回调保存\n}>();\n// slots: label\n\nconst _keyIndex = `fileupload-${CommonBase.getRandom(5)}`;\n\nconst { optPageLanguage, getPageLanguage } = useLanguage();\ngetPageLanguage('fileUpload');\n\nconst _selfTop = inject<FileuploadTop | null>('$FileuploadTop', null);\nif (!_selfTop) {\n console.warn('[FileUpload] Button 主题缺少 $FileuploadTop 注入,使用空校验配置');\n}\n\n// 结构性前置:useFileCheck 初始 options 需要本函数返回值(TDZ 约束,此位置不可移动)\nconst _getCheckOptions = () => {\n return CommonBase.getJsonMerge(_selfTop?.getFileCheckInfo() ?? {}, {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n });\n};\n\nconst { setFileInfo } = useComplete();\nconst { optBase, getTypeByUrl, checkFile, setBaseOptions } = useFileCheck(\n _getCheckOptions(),\n optPageLanguage,\n);\nconst { downloadBlob, downloadHref } = useDownload();\n\nconst refElButton = ref<InstanceType<typeof ClButton> | null>(null);\nconst refElLabel = ref<HTMLElement | null>(null);\nconst ran = CommonBase.getRandom(8);\nconst optPage = reactive({\n elFileId: `btnFile${ran}`,\n isInitFileInput: true,\n});\nconst optFileCompleteList = ref<any[]>([]);\nconst optShowListKey = ref<any[]>([]);\nlet _saveTimer: ReturnType<typeof setTimeout> | null = null;\nlet _removeTimer: ReturnType<typeof setTimeout> | null = null;\nlet _removingId: string | null = null;\n\nconst optElName = computed(() => {\n let name = props.name;\n if (CommonBase.isEmpty(name)) {\n name = `fileUpload_${CommonBase.getRandom(8)}`;\n }\n return name;\n});\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'fileUpload-button': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst _emitOnChange = (file: any, fileExt?: any) => {\n emit('onChange', file, fileExt);\n};\n\nconst _emitOnError = (msg: string[]) => {\n emit('onError', msg);\n};\n\nconst _emitOnRemove = () => {\n emit('onRemove');\n};\n\nconst _emitOnPreview = (src: string, type: string, inx?: number) => {\n emit('onPreview', src, type, inx);\n};\n\nconst _emitOnSaveFile = (file: any, extInfo: any) => {\n emit('onSaveFile', file, extInfo);\n};\n\nconst _startSaveTimeout = () => {\n _clearSaveTimeout();\n // 60000: 服务端保存超时兜底(父组件 serverFileCallback 永不回调时恢复 UI)\n _saveTimer = setTimeout(() => {\n _saveTimer = null;\n if (!optPage.isInitFileInput) {\n _setFileOperateType('fail');\n _emitOnError(['服务端保存超时,请重试']);\n }\n }, 60000);\n};\n\nconst _clearSaveTimeout = () => {\n if (_saveTimer) {\n clearTimeout(_saveTimer);\n _saveTimer = null;\n }\n};\n\nconst _revokeAllBlob = () => {\n optFileCompleteList.value.forEach((info: any) => {\n if (CommonBase.isString(info.url) && info.url.startsWith('blob:')) {\n URL.revokeObjectURL(info.url);\n }\n });\n};\n\nconst _setFileOperateType = (type: string) => {\n switch (type) {\n case 'load':\n if (props.isShowUploadIng) {\n refElButton.value?.loadStart();\n }\n break;\n case 'fail':\n case 'complete':\n if (props.isShowUploadIng) {\n refElButton.value?.loadStop();\n }\n break;\n default:\n break;\n }\n optPage.isInitFileInput = type !== 'load';\n};\n\nconst _setComplete = (fileList: any, saveList: any) => {\n if (!props.isMultiple) {\n // 单选:上传/回显均替换旧列表,保证 _getNewValue 取 list[0] 恒为最新文件\n _revokeAllBlob();\n optFileCompleteList.value = [];\n }\n const list = [];\n const idKey: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n list.push(info);\n idKey.push(info.rId);\n });\n for (let i = 0; i < fileList.length; i++) {\n let saveInfo: any = saveList.length > i ? { fileUrl: saveList[i] } : {};\n if (CommonBase.isEmpty(saveInfo.fileUrl) && fileList[i].isVideo && fileList[i].file) {\n saveInfo = { fileUrl: URL.createObjectURL(fileList[i].file) };\n }\n let tempInfo: any = setFileInfo(fileList[i], saveInfo);\n tempInfo.rId = CommonBase.getRandom(9);\n tempInfo = CommonBase.getJsonMerge(fileList[i], tempInfo);\n list.push(tempInfo);\n idKey.push(tempInfo.rId);\n }\n optFileCompleteList.value = list as never[];\n _setFileOperateType('complete');\n nextTick(() => {\n optShowListKey.value = idKey;\n });\n};\n\nconst _getNewValue = () => {\n const list: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n let value: any = null;\n if (CommonBase.isString(info.url) && info.url.startsWith('blob:')) {\n // 本地 blob URL 不可持久化(刷新即失效):优先返回 File 对象\n value = info.file;\n } else if (CommonBase.isEmpty(info.url)) {\n if (info.isImage && !CommonBase.isEmpty(info.imgSrc)) {\n value = info.imgSrc;\n } else {\n value = info.file;\n }\n } else {\n value = info.url;\n }\n if (!CommonBase.isUndefined(value)) {\n list.push(value);\n }\n });\n if (list.length === 0) {\n return '';\n }\n return props.isMultiple ? list : list[0];\n};\n\nconst _initValue = (value: string | string[]) => {\n if (CommonBase.isArray(value)) {\n // 数组回显:多选场景父组件回传 URL 数组,逐个回显(与字符串逗号分隔等价)\n _revokeAllBlob();\n optFileCompleteList.value = [];\n const fileList: any[] = [];\n const saveList: any[] = [];\n (value as string[]).forEach(url => {\n if (CommonBase.isNonEmptyString(url)) {\n const fileType = getTypeByUrl(url);\n fileList.push(fileType);\n saveList.push(url);\n }\n });\n _setComplete(fileList, saveList);\n return;\n }\n if (!CommonBase.isNonEmptyString(value)) {\n if (CommonBase.isString(value)) {\n _initValueEmpty();\n }\n return;\n }\n _revokeAllBlob();\n optFileCompleteList.value = [];\n const fileList: any[] = [];\n const saveList: any[] = [];\n value\n .split(',')\n .filter(url => CommonBase.isNonEmptyString(url))\n .forEach(url => {\n const fileType = getTypeByUrl(url);\n fileList.push(fileType);\n saveList.push(url);\n });\n _setComplete(fileList, saveList);\n};\n\nconst _initValueEmpty = () => {\n _revokeAllBlob();\n _setFileOperateType('init');\n optFileCompleteList.value = [];\n};\n\nconst _initMain = () => {\n _initValue(props.value as string | string[]);\n};\n\nonMounted(() => {\n nextTick(() => {\n _initMain();\n });\n});\n\nonBeforeUnmount(() => {\n _clearSaveTimeout();\n if (_removeTimer) {\n clearTimeout(_removeTimer);\n _removeTimer = null;\n }\n _revokeAllBlob();\n});\n\nwatch(\n () => props.value,\n (newValue, oldValue) => {\n if (newValue !== oldValue) {\n const lastValue = _getNewValue();\n if (newValue !== lastValue) {\n _clearSaveTimeout();\n _initValue(newValue as string | string[]);\n }\n }\n },\n);\n\nwatch(\n [\n () => props.checkFormat,\n () => props.checkWidth,\n () => props.checkHeight,\n () => props.checkWHType,\n () => props.checkMinSize,\n () => props.checkMaxSize,\n ],\n () => {\n if (optPage.isInitFileInput) {\n // 仅非 load 态清理超时:保存进行中修改 check 配置不取消超时兜底(否则服务端永不回调时 UI 永久 load)\n _clearSaveTimeout();\n }\n setBaseOptions(_getCheckOptions());\n },\n);\n\nconst onFileButton = (e: any) => {\n if (props.disabled) {\n return;\n }\n if (!optPage.isInitFileInput) {\n // load 态(上传/保存进行中):丢弃占位 input 的选择,防并发校验竞态\n return;\n }\n if (e.currentTarget.files.length > 0) {\n _setFileOperateType('load');\n checkFile(e.currentTarget.files, {})\n .then((resCheck: any) => {\n if (optPage.isInitFileInput) {\n return;\n }\n if (resCheck.passFiles.length > 0) {\n if (props.isServerCallback) {\n const files = props.isMultiple ? resCheck.passFiles : resCheck.passFiles[0];\n const filesInfo = props.isMultiple ? resCheck.passFilesInfo : resCheck.passFilesInfo[0];\n _emitOnSaveFile(files, filesInfo);\n _startSaveTimeout();\n } else if (props.isMultiple) {\n _setComplete(resCheck.passFilesInfo, []);\n _emitOnChange(resCheck.passFiles, resCheck.passFilesInfo);\n } else {\n _setComplete(resCheck.passFilesInfo, []);\n _emitOnChange(resCheck.passFiles[0], resCheck.passFilesInfo[0]);\n }\n } else if (resCheck.errorMsg.length === 0) {\n _setFileOperateType('fail');\n _emitOnError(['文件校验失败,请重试']);\n }\n if (resCheck.errorMsg.length > 0) {\n _emitOnError(resCheck.errorMsg as string[]);\n if (resCheck.passFiles.length === 0) {\n _setFileOperateType('fail');\n }\n }\n })\n .catch(() => {\n if (optPage.isInitFileInput) {\n return;\n }\n _setFileOperateType('fail');\n _emitOnError(['文件校验失败,请重试']);\n });\n }\n};\n\nconst onPreviewImage = (fileInfo: any, inx?: number) => {\n const src = CommonBase.isEmpty(fileInfo.url) ? fileInfo.src : fileInfo.url;\n _emitOnPreview(src, 'image', inx);\n};\n\nconst onPreviewVideo = (fileInfo: any, inx?: number) => {\n if (!CommonBase.isEmpty(fileInfo.url)) {\n _emitOnPreview(fileInfo.url, 'video', inx);\n }\n};\n\nconst onRemove = (id: string) => {\n if (_removingId === id) {\n return;\n }\n _removingId = id;\n _clearSaveTimeout();\n if (!optPage.isInitFileInput) {\n // 移除作废服务端保存结果(Index 侧 _removedCount 机制),同步结束 load 态恢复 input\n _setFileOperateType('complete');\n }\n const removed = optFileCompleteList.value.find((info: any) => info.rId === id);\n if (removed && CommonBase.isString(removed.url) && removed.url.startsWith('blob:')) {\n URL.revokeObjectURL(removed.url);\n }\n const list: any = [];\n const idKey: any[] = [];\n optFileCompleteList.value.forEach((info: any) => {\n if (info.rId !== id) {\n list.push(info);\n idKey.push(info.rId);\n }\n });\n optShowListKey.value = idKey;\n const elInput = document.getElementById(optPage.elFileId) as HTMLInputElement | null;\n if (elInput) {\n elInput.value = ''; // 重置 input value:重选同一文件时 change 才能再次触发\n }\n nextTick(() => {\n if (list.length > 0) {\n optFileCompleteList.value = list as never[];\n _removingId = null;\n _emitOnRemove();\n } else {\n // 500: 等待列表移除动画结束(fileupload-anim-out 0.5s)再清空列表\n _removeTimer = setTimeout(() => {\n _removeTimer = null;\n optFileCompleteList.value = optFileCompleteList.value.filter(\n (info: any) => info.rId !== id,\n ) as never[];\n _removingId = null;\n _emitOnRemove();\n }, 500);\n }\n });\n};\n\nconst onDownload = (fileInfo: any) => {\n if (fileInfo.isImage && CommonBase.isEmpty(fileInfo.url)) {\n downloadHref(fileInfo.imgSrc, fileInfo.name);\n } else if (CommonBase.isString(fileInfo.url) && fileInfo.url.startsWith('blob:')) {\n const elLink: any = document.createElement('a');\n elLink.href = fileInfo.url;\n elLink.download = fileInfo.name;\n elLink.click();\n } else if (CommonBase.isEmpty(fileInfo.url) && fileInfo.file) {\n const url = URL.createObjectURL(fileInfo.file);\n const elLink: any = document.createElement('a');\n elLink.href = url;\n elLink.download = fileInfo.name;\n elLink.click();\n // 1000: 等待浏览器开始下载后再释放 blob URL,立即 revoke 会中断下载\n setTimeout(() => {\n URL.revokeObjectURL(url);\n }, 1000);\n } else {\n downloadBlob(fileInfo.url);\n }\n};\n\nconst onClickLabel = () => {\n refElLabel.value?.click();\n};\n\nconst saveServerCallback = (result: any) => {\n _clearSaveTimeout();\n if (optPage.isInitFileInput) {\n return;\n }\n if (\n CommonBase.isUndefined(result) ||\n CommonBase.isUndefined(result.res) ||\n !CommonBase.isBoolean(result.res.success) ||\n CommonBase.isUndefined(result.req)\n ) {\n _setFileOperateType('fail');\n _emitOnError(['文件保存失败,请重试']);\n return;\n }\n if (result.res.success) {\n let fileUrl: string[] = [];\n const fileUrlIdx: number[] = []; // 与 fileUrl 同序的原数组索引(reqList 对齐)\n if (CommonBase.isNonEmptyString(result.res.fileUrl)) {\n fileUrl.push(result.res.fileUrl);\n fileUrlIdx.push(0);\n } else if (CommonBase.isArray(result.res.fileUrl)) {\n // 拷贝副本:外部数组可能在保存期间被父组件改写;过滤空串时保留原索引(result.res.fileUrl 与 result.req 同源一一对应)\n result.res.fileUrl.forEach((url: string, idx: number) => {\n if (CommonBase.isNonEmptyString(url)) {\n fileUrl.push(url);\n fileUrlIdx.push(idx);\n }\n });\n }\n if (fileUrl.length === 0) {\n // 服务端确认成功但未返回 URL(callback 仅执行上传):结束 load 态,不报错不回显\n _setFileOperateType('complete');\n return;\n }\n const reqList = props.isMultiple ? result.req : [result.req];\n let newPairs: string[] = [];\n let newReqList: any[] = [];\n if (!props.isMultiple) {\n // 单选:跳过 existUrls 去重——服务端覆盖式保存复用已有 URL 时,去重会把新结果吞掉\n newPairs = fileUrl;\n newReqList = reqList;\n } else {\n const existUrls = optFileCompleteList.value\n .map((info: any) => info.url)\n .filter((url: any) => CommonBase.isNonEmptyString(url));\n fileUrl.forEach((url: string, index: number) => {\n const reqIdx = fileUrlIdx[index];\n if (existUrls.indexOf(url) > -1 || CommonBase.isUndefined(reqList[reqIdx])) {\n return;\n }\n existUrls.push(url);\n newPairs.push(url);\n newReqList.push(reqList[reqIdx]);\n });\n }\n if (newPairs.length === 0) {\n // 全部与已有列表重复:幂等完成,不重复追加\n _setFileOperateType('complete');\n return;\n }\n _setComplete(newReqList, newPairs);\n const value = props.isMultiple ? newPairs : newPairs[0];\n _emitOnChange(value);\n } else {\n _setFileOperateType('fail');\n _emitOnError(['文件保存失败,请重试']);\n }\n};\n\nconst getValue = () => {\n return _getNewValue();\n};\n\nconst cleanReduction = () => {\n _clearSaveTimeout();\n _initValueEmpty();\n};\n\nexport interface ClFileUploadButtonExpose {\n saveServerCallback: (result: any) => void; // desc: 服务端回调保存结果\n getValue: () => string | File | string[]; // desc: 获取当前文件值\n cleanReduction: () => void; // desc: 还原初始状态\n}\n\ndefineExpose({\n saveServerCallback,\n getValue,\n cleanReduction,\n});\n</script>\n","<template>\n <div\n :class=\"clsParent\"\n :id=\"elId\"\n >\n <cl-fileupload-button\n ref=\"refElFileButton\"\n v-if=\"theme === 'button'\"\n :value=\"value\"\n :name=\"name\"\n :disabled=\"disabled\"\n :isMultiple=\"isMultiple\"\n :buttonClass=\"buttonClass\"\n :buttonLabel=\"buttonLabel\"\n :buttonIcon=\"buttonIcon\"\n :buttonColor=\"buttonColor\"\n :checkFormat=\"checkFormat\"\n :checkMinSize=\"checkMinSize\"\n :checkMaxSize=\"checkMaxSize\"\n :checkWidth=\"checkWidth\"\n :checkHeight=\"checkHeight\"\n :checkWHType=\"checkWHType\"\n :isServerCallback=\"optIsServerCallback\"\n :isShowUploadResult=\"isShowUploadResult\"\n :isShowUploadIng=\"isShowUploadIng\"\n :isShowPreview=\"isShowPreview\"\n :isShowDownload=\"isShowDownload\"\n @onChange=\"onChange\"\n @onError=\"onError\"\n @onRemove=\"onRemove\"\n @onPreview=\"onPreview\"\n @onSaveFile=\"onSaveFile\"\n >\n <template v-slot:label>\n <slot name=\"label\"></slot>\n </template>\n </cl-fileupload-button>\n <cl-fileupload-default\n ref=\"refElFileDefault\"\n v-else-if=\"theme === 'default'\"\n :value=\"value\"\n :name=\"name\"\n :disabled=\"disabled\"\n :defaultHoverTitle=\"defaultHoverTitle\"\n :defaultIcon=\"defaultIcon\"\n :isShowCompleteMsg=\"isShowCompleteMsg\"\n :checkFormat=\"checkFormat\"\n :checkMinSize=\"checkMinSize\"\n :checkMaxSize=\"checkMaxSize\"\n :checkWidth=\"checkWidth\"\n :checkHeight=\"checkHeight\"\n :checkWHType=\"checkWHType\"\n :isServerCallback=\"optIsServerCallback\"\n :isShowPreview=\"isShowPreview\"\n :isShowDownload=\"isShowDownload\"\n @onChange=\"onChange\"\n @onError=\"onError\"\n @onRemove=\"onRemove\"\n @onPreview=\"onPreview\"\n @onSaveFile=\"onSaveFile\"\n >\n <template v-slot:label>\n <slot name=\"label\"></slot>\n </template>\n </cl-fileupload-default>\n <template v-else></template>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { provide, inject, computed, reactive, ref, useAttrs } from 'vue';\nimport CommonBase from '../../Common/base';\nimport CommonElement from '../../Common/Element/index';\nimport ClFileuploadDefault from './Default.vue';\nimport ClFileuploadButton from './Button.vue';\nimport './index.css';\n\ninterface ClGlobals {\n notify: {\n error: (msg: string) => void;\n };\n preview: {\n show: (opts: { type: string; src: string | string[]; showIndex: number }) => void;\n };\n}\n\ndefineOptions({ name: 'ClFileUpload' });\n\nconst props = defineProps({\n id: String, // desc: 组件唯一标识\n name: String, // desc: 文件上传 input 的 name\n value: [String, Array, Object], // desc: 文件值(回显 URL 或本地 File 对象;多选回传可为数组)\n className: String, // desc: 自定义CSS类名\n disabled: {\n type: Boolean,\n default: false, // desc: 是否禁用\n },\n theme: {\n type: String,\n default: 'default', // desc: 主题 | enum: default, button\n validator: (v: string) => ['default', 'button'].includes(v),\n },\n isMultiple: {\n type: Boolean,\n default: false, // desc: 是否多选(仅针对 theme:button)\n },\n defaultHoverTitle: String, // desc: 默认悬停标题\n defaultIcon: String, // desc: 自定义初始显示图标(theme:default 空态上传区),未设置时按 checkFormat 自动转换\n isShowCompleteMsg: {\n type: Boolean,\n default: true, // desc: 是否显示上传完成后的底部信息条(仅针对 theme:default 图片黑色透明区域)\n },\n buttonClass: String, // desc: 按钮模式自定义CSS类名\n buttonLabel: String, // desc: 按钮模式按钮文案\n buttonIcon: String, // desc: 按钮模式按钮图标\n buttonColor: String, // desc: 按钮模式按钮颜色\n checkFormat: String, // desc: 允许的文件格式(逗号分隔扩展名)\n checkMinSize: [String, Number], // desc: 允许的最小文件大小\n checkMaxSize: [String, Number], // desc: 允许的最大文件大小\n checkWidth: [String, Number], // desc: 图片校验宽度\n checkHeight: [String, Number], // desc: 图片校验高度\n checkWHType: {\n type: String,\n default: 'equal', // desc: 宽高比判定 | enum: equal, greater, less\n },\n isShowPreview: {\n type: Boolean,\n default: true, // desc: 是否显示预览\n },\n isShowDownload: {\n type: Boolean,\n default: true, // desc: 是否显示下载\n },\n isShowUploadResult: {\n type: Boolean,\n default: true, // desc: 是否显示上传结果(仅针对 theme:button)\n },\n isShowUploadIng: {\n type: Boolean,\n default: true, // desc: 是否显示上传中状态\n },\n serverFileCallback: Function, // desc: 服务端文件保存回调\n});\n\nconst emit = defineEmits<{\n (e: 'update:value', value: string | File | string[]): void; // desc: 值更新\n (e: 'onChange', fileValue: string | File | File[] | string[], fileExt?: any): void; // desc: 文件变化\n (e: 'onRemove'): void; // desc: 移除文件\n (e: 'onError', msg: string[]): void; // desc: 文件校验错误\n}>();\n// slots: label\n\nconst _clGlobals = inject<ClGlobals | null>('$ClGlobals', null);\nconst attrs = useAttrs();\n\nconst elId = props.id; // || `fileupload-${CommonBase.getRandom(N)}`\n\nconst refElFileDefault = ref<InstanceType<typeof ClFileuploadDefault> | null>(null);\nconst refElFileButton = ref<InstanceType<typeof ClFileuploadButton> | null>(null);\nlet _saveSeq = 0;\nlet _removedCount = 0;\n\nconst optIsServerCallback = computed(() => CommonBase.isFunction(props.serverFileCallback));\n\nconst clsParent = computed(() => {\n let cls: Record<string, boolean> = {\n 'panel-fileupload': true,\n 'box-width': true,\n };\n cls = CommonBase.getJsonMerge(cls, CommonElement.getClassNameJson(props.className));\n return cls;\n});\n\nconst _emitOnChange = (value: any, fileValue: any, fileExt?: any) => {\n emit('update:value', value);\n emit('onChange', fileValue, fileExt);\n};\n\nconst _emitOnRemove = () => {\n emit('onRemove');\n};\n\nconst _getValue = () => {\n let value: any = null;\n switch (props.theme) {\n case 'default':\n value = refElFileDefault.value?.getValue();\n break;\n case 'button':\n value = refElFileButton.value?.getValue();\n break;\n default:\n break;\n }\n return value;\n};\n\nconst _callSaveServerCallback = (theme: string, result: any) => {\n switch (theme) {\n case 'default':\n refElFileDefault.value?.saveServerCallback(result);\n break;\n case 'button':\n refElFileButton.value?.saveServerCallback(result);\n break;\n default:\n break;\n }\n};\n\nconst onChange = (file: any, fileExt?: any) => {\n const value = _getValue();\n const fileValue = optIsServerCallback.value ? value : file;\n _emitOnChange(value, fileValue, fileExt);\n};\n\nconst onError = (msg: string[]) => {\n if (CommonBase.isArray(msg)) {\n emit('onError', msg);\n if (_clGlobals) {\n // 逐条独立通知:ClNotify 渲染层统一 encodeHTML,'<br>' 会被转义成字面文本,不能靠拼接 HTML 换行\n msg.forEach((m: string) => _clGlobals.notify.error(m));\n }\n }\n};\n\nconst onRemove = () => {\n _removedCount += 1;\n _emitOnRemove();\n const value = _getValue();\n _emitOnChange(value, value);\n};\n\nconst onPreview = async (src: string | string[], type: string, inx?: number) => {\n if (_clGlobals) {\n // preview 为惰性代理,首次调用才会动态加载(含 video.js),故需 await 就绪后再 show\n await _clGlobals.preview.show({\n type,\n src,\n showIndex: inx ?? 0, // Preview 消费端读取的字段是 showIndex(不是 showInx),字段名必须对齐\n });\n }\n};\n\nconst onSaveFile = async (files: any, extInfo?: any) => {\n const theme = props.theme;\n const seq = ++_saveSeq;\n const removedAtStart = _removedCount;\n let temp: any = true;\n if (props.serverFileCallback) {\n try {\n const isImage: any =\n !props.isMultiple && CommonBase.isObject(extInfo) && CommonBase.isBoolean(extInfo.isImage)\n ? extInfo.isImage\n : false;\n const assistData = CommonElement.getElementData(attrs);\n temp = await props.serverFileCallback(files, isImage, assistData);\n } catch {\n if (seq === _saveSeq && _removedCount === removedAtStart && props.theme === theme) {\n _callSaveServerCallback(theme, { req: extInfo, res: { success: false } });\n }\n return;\n }\n }\n let result: any = {};\n\n if (CommonBase.isBoolean(temp)) {\n result.success = temp;\n } else if (CommonBase.isUndefined(temp)) {\n result.success = true;\n } else if (CommonBase.isString(temp) || CommonBase.isArray(temp)) {\n result.success = true;\n result.fileUrl = temp;\n } else if (CommonBase.isObject(temp)) {\n result = temp;\n } else {\n result.success = false;\n }\n if (props.theme !== theme) {\n // 保存期间主题已切换:目标子组件已卸载,结果无处写入,提示用户重试\n emit('onError', ['保存期间主题已切换,本次保存结果未写入']);\n return;\n }\n if (seq !== _saveSeq || _removedCount !== removedAtStart) {\n return;\n }\n _callSaveServerCallback(theme, { req: extInfo, res: result });\n};\n\nprovide(\n '$FileuploadTop',\n reactive({\n getFileCheckInfo: () => {\n return {\n checkFormat: props.checkFormat,\n checkWidth: props.checkWidth,\n checkHeight: props.checkHeight,\n checkWHType: props.checkWHType,\n checkMinSize: props.checkMinSize,\n checkMaxSize: props.checkMaxSize,\n };\n },\n }),\n);\n\nconst getValue = () => {\n return _getValue();\n};\n\nconst cleanReduction = () => {\n switch (props.theme) {\n case 'default':\n refElFileDefault.value?.cleanReduction();\n break;\n case 'button':\n refElFileButton.value?.cleanReduction();\n break;\n default:\n break;\n }\n // 程序化清空后同步通知父组件(v-model 受控场景 value 不再残留旧值)\n _emitOnChange('', '');\n};\n\nexport interface ClFileUploadExpose {\n getValue: () => string | File | string[] | undefined; // desc: 获取文件值(default 主题: string | File;button 主题: string | string[];空态 '',子组件未挂载 undefined)\n cleanReduction: () => void; // desc: 清空文件\n}\n\ndefineExpose({\n getValue,\n cleanReduction,\n});\n</script>\n"],"names":["defaultFileCommon","format","group","CommonBase","fk","fv","type","icon","arrFormat","list","t","suffix","arrSuffix","reg","s","mime","arrMime","img","w","h","dataURL","canvas","useFileCheck","options","optPageLanguage","props","optBase","reactive","_fileCheckInfo","setOptions","opts","_initBaseInfo","isCheckImgWH","_getTypeInfo","_getTypeByFile","name","mimeType","regSuffix","regMime","newType","checkType","checkInfo","getTypeByFormat","formatGroup","getTypeByUrl","url","mimeMatch","createTempImg","src","maxWidth","resolve","reject","imgTemp","e","tw","th","showSrc","_checkImgWH","cw","ch","check","_checkFileImage","file","optionCheck","reader","res","error","checkFile","files","errorMsg","passFiles","passFilesInfo","parseSize","val","num","minSize","maxSize","len","f","errorOneMsg","errorInfo","fileName","fileMime","fileTypeInfo","fileInfo","m","useFileInfo","saveInfo","isUrlEmpty","imgSrc","imgWidth","imgHeight","useDownload","downloadHref","_fileName","inx","newFileName","newUrl","xhr","urlObject","exportBlob","elLink","__props","emit","__emit","getPageLanguage","useLanguage","_selfTop","inject","setFileInfo","useComplete","_getCheckOptions","setBaseOptions","downloadBlob","refElTopParent","ref","optPage","optFileInfo","_pageData","_initSeq","_saveTimer","elInputId","optElName","computed","clsParent","cls","CommonElement","clsWait","clsComplete","_emitChange","_emitError","msg","_emitRemove","_emitPreview","_emitSaveFile","extInfo","_setFileType","info","_setInitFileType","fileType","_setFileOperateType","runType","isInit","_setFileInfo","tempData","k","v","_setComplete","_revokeFileUrl","_getNewValue","value","_setUploadFile","resCheck","passFile","passFileInfo","_startSaveTimeout","tempInfo","_initValue","_initValueEmpty","seq","imgMaxWidth","resImg","imgInfo","_clearSaveTimeout","_initSetFileType","_initCompleteMsgTxt","completeMsgTxt","_initMain","onMounted","nextTick","watch","newValue","oldValue","lastValue","onDrop","onFileDefault","onRemove","elInput","onPreviewImage","onPreviewVideo","onDownloadImage","onDownloadFile","__expose","result","fileUrl","onBeforeUnmount","_createElementBlock","_createElementVNode","_unref","_createVNode","ClIconFont","_hoisted_3","_renderSlot","_ctx","_openBlock","_hoisted_4","_hoisted_5","_hoisted_7","_toDisplayString","_Fragment","_hoisted_10","_hoisted_13","_hoisted_15","ClLoad","_keyIndex","refElButton","refElLabel","ran","optFileCompleteList","optShowListKey","_removeTimer","_removingId","_emitOnChange","fileExt","_emitOnError","_emitOnRemove","_emitOnPreview","_emitOnSaveFile","_revokeAllBlob","fileList","saveList","idKey","i","onFileButton","filesInfo","id","removed","onDownload","onClickLabel","fileUrlIdx","idx","reqList","newPairs","newReqList","existUrls","index","reqIdx","ClButton","_renderList","fileItemInfo","_createBlock","_Transition","_withModifiers","$event","_hoisted_8","_hoisted_11","_hoisted_12","_clGlobals","attrs","useAttrs","elId","refElFileDefault","refElFileButton","_saveSeq","_removedCount","optIsServerCallback","fileValue","_getValue","_callSaveServerCallback","theme","onChange","onError","onPreview","onSaveFile","removedAtStart","temp","isImage","assistData","provide","ClFileuploadButton","ClFileuploadDefault"],"mappings":"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"}