@cldemo/ui-kit 1.0.9 → 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.
- package/COMPONENT_CATALOG.md +2 -2
- package/buildLibs/all/index.cjs +2 -5
- package/buildLibs/all/index.css +1 -0
- package/buildLibs/all/index.js +82 -6
- package/buildLibs/mobile/index.cjs +2 -5
- package/buildLibs/mobile/index.css +1 -0
- package/buildLibs/mobile/index.js +50 -6
- package/buildLibs/utils/Element/ClBadge.d.ts +3 -0
- package/buildLibs/utils/Element/ClBreadcrumb.d.ts +3 -0
- package/buildLibs/utils/Element/ClButton.d.ts +3 -0
- package/buildLibs/utils/Element/ClCallout.d.ts +3 -0
- package/buildLibs/utils/Element/ClCard.d.ts +3 -0
- package/buildLibs/utils/Element/ClCardColor.d.ts +3 -0
- package/buildLibs/utils/Element/ClCheckbox.d.ts +3 -0
- package/buildLibs/utils/Element/ClCheckboxOne.cjs +2 -0
- package/buildLibs/utils/Element/ClCheckboxOne.cjs.map +1 -0
- package/buildLibs/utils/Element/ClCheckboxOne.d.ts +3 -0
- package/buildLibs/utils/Element/ClCheckboxOne.js +5 -0
- package/buildLibs/utils/Element/ClCheckboxOne.js.map +1 -0
- package/buildLibs/utils/Element/ClClipboard.d.ts +3 -0
- package/buildLibs/utils/Element/ClCollapse.d.ts +3 -0
- package/buildLibs/utils/Element/ClCountDown.d.ts +3 -0
- package/buildLibs/utils/Element/ClCountUp.d.ts +3 -0
- package/buildLibs/utils/Element/ClCropper.d.ts +3 -0
- package/buildLibs/utils/Element/ClDarg.d.ts +3 -0
- package/buildLibs/utils/Element/ClDivider.d.ts +3 -0
- package/buildLibs/utils/Element/ClEllipsis.d.ts +3 -0
- package/buildLibs/utils/Element/ClEmpty.d.ts +3 -0
- package/buildLibs/utils/Element/ClForm.d.ts +3 -0
- package/buildLibs/utils/Element/ClFormGroup.d.ts +3 -0
- package/buildLibs/utils/Element/ClFormValidate.cjs +2 -0
- package/buildLibs/utils/Element/ClFormValidate.cjs.map +1 -0
- package/buildLibs/utils/Element/ClFormValidate.d.ts +3 -0
- package/buildLibs/utils/Element/ClFormValidate.js +5 -0
- package/buildLibs/utils/Element/ClFormValidate.js.map +1 -0
- package/buildLibs/utils/Element/ClIconFont.d.ts +3 -0
- package/buildLibs/utils/Element/ClImage.cjs +1 -1
- package/buildLibs/utils/Element/ClImage.d.ts +3 -0
- package/buildLibs/utils/Element/ClImage.js +1 -1
- package/buildLibs/utils/Element/ClInput.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputCaptcha.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputNumber.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputNumberStepper.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputPassword.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputSearch.d.ts +3 -0
- package/buildLibs/utils/Element/ClInputTextarea.d.ts +3 -0
- package/buildLibs/utils/Element/ClLink.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoad.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.css +1 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.js +45 -0
- package/buildLibs/utils/Element/ClLoadFullCenter.js.map +1 -0
- package/buildLibs/utils/Element/ClLoadIng.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadIng.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadIng.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoadIng.js +5 -0
- package/buildLibs/utils/Element/ClLoadIng.js.map +1 -0
- package/buildLibs/utils/Element/ClLoadScreen.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoadWarp.cjs +2 -0
- package/buildLibs/utils/Element/ClLoadWarp.cjs.map +1 -0
- package/buildLibs/utils/Element/ClLoadWarp.css +1 -0
- package/buildLibs/utils/Element/ClLoadWarp.d.ts +3 -0
- package/buildLibs/utils/Element/ClLoadWarp.js +53 -0
- package/buildLibs/utils/Element/ClLoadWarp.js.map +1 -0
- package/buildLibs/utils/Element/ClModal.d.ts +3 -0
- package/buildLibs/utils/Element/ClOverlay.d.ts +3 -0
- package/buildLibs/utils/Element/ClProgress.d.ts +3 -0
- package/buildLibs/utils/Element/ClRadio.d.ts +3 -0
- package/buildLibs/utils/Element/ClRadioOne.cjs +2 -0
- package/buildLibs/utils/Element/ClRadioOne.cjs.map +1 -0
- package/buildLibs/utils/Element/ClRadioOne.d.ts +3 -0
- package/buildLibs/utils/Element/ClRadioOne.js +5 -0
- package/buildLibs/utils/Element/ClRadioOne.js.map +1 -0
- package/buildLibs/utils/Element/ClSlider.d.ts +3 -0
- package/buildLibs/utils/Element/ClSwitchery.d.ts +3 -0
- package/buildLibs/utils/Element/ClTags.d.ts +3 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs +2 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.cjs.map +1 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.d.ts +3 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.js +5 -0
- package/buildLibs/utils/Element/ClTransitionSlideupdown.js.map +1 -0
- package/buildLibs/utils/Element/ClWaterfall.d.ts +3 -0
- package/buildLibs/utils/Element/ClWaterfallImage.cjs +2 -0
- package/buildLibs/utils/Element/ClWaterfallImage.cjs.map +1 -0
- package/buildLibs/utils/Element/ClWaterfallImage.css +1 -0
- package/buildLibs/utils/Element/ClWaterfallImage.d.ts +3 -0
- package/buildLibs/utils/Element/ClWaterfallImage.js +48 -0
- package/buildLibs/utils/Element/ClWaterfallImage.js.map +1 -0
- package/buildLibs/utils/Mobile/ClActionBar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClActionSheet.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClAreaM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClBackTop.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClBanner.cjs +1 -1
- package/buildLibs/utils/Mobile/ClBanner.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClBanner.js +1 -1
- package/buildLibs/utils/Mobile/ClCalendarM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClCell.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClCellSwipe.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClCodeLegendM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuM.cjs.map +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuM.js +13 -12
- package/buildLibs/utils/Mobile/ClDropdownMenuM.js.map +1 -1
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs +2 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.cjs.map +1 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js +160 -0
- package/buildLibs/utils/Mobile/ClDropdownMenuMItem.js.map +1 -0
- package/buildLibs/utils/Mobile/ClFloatingBubble.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClFloatingPanel.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClGrid.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClHighlightM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClIndexBar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClInputOtp.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClNavBar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClNoticeBar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClNotifyM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClNumberKeyboard.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPicker.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPicker.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPicker.js +1 -1
- package/buildLibs/utils/Mobile/ClPickerCascader.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPickerDate.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPickerDate.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPickerDate.js +1 -1
- package/buildLibs/utils/Mobile/ClPickerTime.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPickerTime.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPickerTime.js +1 -1
- package/buildLibs/utils/Mobile/ClPopup.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPullToRefresh.cjs +1 -1
- package/buildLibs/utils/Mobile/ClPullToRefresh.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClPullToRefresh.js +1 -1
- package/buildLibs/utils/Mobile/ClRate.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClScrollCard.cjs +1 -1
- package/buildLibs/utils/Mobile/ClScrollCard.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClScrollCard.js +1 -1
- package/buildLibs/utils/Mobile/ClShareSheet.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClSidebar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClSidebarSelect.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClSignature.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClSteps.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClSwipe.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClTabM.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClTabbar.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClToast.d.ts +3 -0
- package/buildLibs/utils/Mobile/ClWatermark.d.ts +3 -0
- 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
- 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
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js +71 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yZtW91.js.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js +2 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CjgtxJ6a.js.map +1 -0
- 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
- 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
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js +2 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CumTbPny.js.map +1 -0
- 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
- 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
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js +266 -0
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CxVAWr6w.js.map +1 -0
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- package/buildLibs/utils/Shared/Index24.css +1 -1
- package/buildLibs/utils/Shared/Index25.css +1 -1
- package/buildLibs/utils/Shared/Index26.css +1 -1
- package/buildLibs/utils/Shared/Index27.css +1 -1
- package/buildLibs/utils/Shared/Index28.css +1 -1
- package/buildLibs/utils/Shared/Index29.css +1 -1
- package/buildLibs/utils/Shared/Index30.css +1 -1
- package/buildLibs/utils/Shared/Index31.css +1 -1
- package/buildLibs/utils/Shared/Index32.css +1 -1
- package/buildLibs/utils/Shared/Index33.css +1 -1
- package/buildLibs/utils/Shared/Index34.css +1 -1
- package/buildLibs/utils/Shared/Index35.css +1 -1
- package/buildLibs/utils/Shared/Index36.css +1 -1
- package/buildLibs/utils/Shared/Index37.css +1 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js +2 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-CR1t8XZl.js.map +1 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js +148 -0
- package/buildLibs/utils/Shared/One.vue_vue_type_script_setup_true_lang-oBeFlRzi.js.map +1 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js +406 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-Bquk40ES.js.map +1 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js +2 -0
- package/buildLibs/utils/Shared/Validate.vue_vue_type_script_setup_true_lang-CAmKX5pn.js.map +1 -0
- package/buildLibs/utils/Shared/{Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js → use-CKNkvmW4.js} +78 -141
- package/buildLibs/utils/Shared/use-CKNkvmW4.js.map +1 -0
- package/buildLibs/utils/Shared/use-D0Yu2Dbn.js +2 -0
- package/buildLibs/utils/Shared/use-D0Yu2Dbn.js.map +1 -0
- package/buildLibs/utils/Web/ClAnchorNav.d.ts +3 -0
- package/buildLibs/utils/Web/ClCalendar.d.ts +3 -0
- package/buildLibs/utils/Web/ClCodeLegend.d.ts +3 -0
- package/buildLibs/utils/Web/ClColorpicker.d.ts +3 -0
- package/buildLibs/utils/Web/ClCropperPreview.cjs +1 -1
- package/buildLibs/utils/Web/ClCropperPreview.d.ts +3 -0
- package/buildLibs/utils/Web/ClCropperPreview.js +2 -2
- package/buildLibs/utils/Web/ClDatetime.cjs +1 -1
- package/buildLibs/utils/Web/ClDatetime.d.ts +3 -0
- package/buildLibs/utils/Web/ClDatetime.js +1 -1
- package/buildLibs/utils/Web/ClDropdownMenu.d.ts +3 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.cjs +2 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.cjs.map +1 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.css +1 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.d.ts +3 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.js +72 -0
- package/buildLibs/utils/Web/ClDropdownMenuItem.js.map +1 -0
- package/buildLibs/utils/Web/ClDropdownPopup.d.ts +3 -0
- package/buildLibs/utils/Web/ClEcharts.cjs +1 -1
- package/buildLibs/utils/Web/ClEcharts.d.ts +3 -0
- package/buildLibs/utils/Web/ClEcharts.js +1 -1
- package/buildLibs/utils/Web/ClEchartsLineAxisTag.cjs +1 -1
- package/buildLibs/utils/Web/ClEchartsLineAxisTag.d.ts +3 -0
- package/buildLibs/utils/Web/ClEchartsLineAxisTag.js +1 -1
- package/buildLibs/utils/Web/ClFileUpload.cjs +1 -1
- package/buildLibs/utils/Web/ClFileUpload.d.ts +3 -0
- package/buildLibs/utils/Web/ClFileUpload.js +1 -1
- package/buildLibs/utils/Web/ClFramePhone.d.ts +3 -0
- package/buildLibs/utils/Web/ClInputTag.cjs +1 -1
- package/buildLibs/utils/Web/ClInputTag.d.ts +3 -0
- package/buildLibs/utils/Web/ClInputTag.js +1 -1
- package/buildLibs/utils/Web/ClPaginate.cjs +1 -1
- package/buildLibs/utils/Web/ClPaginate.d.ts +3 -0
- package/buildLibs/utils/Web/ClPaginate.js +1 -1
- package/buildLibs/utils/Web/ClPortlet.d.ts +3 -0
- package/buildLibs/utils/Web/ClPreviewExample.cjs +1 -1
- package/buildLibs/utils/Web/ClPreviewExample.d.ts +3 -0
- package/buildLibs/utils/Web/ClPreviewExample.js +1 -1
- package/buildLibs/utils/Web/ClScrollXFence.cjs +1 -1
- package/buildLibs/utils/Web/ClScrollXFence.d.ts +3 -0
- package/buildLibs/utils/Web/ClScrollXFence.js +1 -1
- package/buildLibs/utils/Web/ClSelect.cjs +1 -1
- package/buildLibs/utils/Web/ClSelect.d.ts +3 -0
- package/buildLibs/utils/Web/ClSelect.js +1 -1
- package/buildLibs/utils/Web/ClSelectCascade.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectCascade.d.ts +3 -0
- package/buildLibs/utils/Web/ClSelectCascade.js +1 -1
- package/buildLibs/utils/Web/ClSelectTag.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectTag.d.ts +3 -0
- package/buildLibs/utils/Web/ClSelectTag.js +1 -1
- package/buildLibs/utils/Web/ClSelectTree.cjs +1 -1
- package/buildLibs/utils/Web/ClSelectTree.d.ts +3 -0
- package/buildLibs/utils/Web/ClSelectTree.js +1 -1
- package/buildLibs/utils/Web/ClSelectmove.d.ts +3 -0
- package/buildLibs/utils/Web/ClSidemenu.d.ts +3 -0
- package/buildLibs/utils/Web/ClTable.cjs +1 -1
- package/buildLibs/utils/Web/ClTable.cjs.map +1 -1
- package/buildLibs/utils/Web/ClTable.d.ts +3 -0
- package/buildLibs/utils/Web/ClTable.js +1081 -1218
- package/buildLibs/utils/Web/ClTable.js.map +1 -1
- package/buildLibs/utils/Web/ClTableEdit.d.ts +3 -0
- package/buildLibs/utils/Web/ClTableSimple.d.ts +3 -0
- package/buildLibs/utils/Web/ClTabs.cjs +1 -1
- package/buildLibs/utils/Web/ClTabs.d.ts +3 -0
- package/buildLibs/utils/Web/ClTabs.js +1 -1
- package/buildLibs/utils/Web/ClTree.cjs +1 -1
- package/buildLibs/utils/Web/ClTree.d.ts +3 -0
- package/buildLibs/utils/Web/ClTree.js +1 -1
- package/buildLibs/utils/Web/ClWeekhour.d.ts +3 -0
- package/buildLibs/utils/Web/ClXeditable.cjs +1 -1
- package/buildLibs/utils/Web/ClXeditable.cjs.map +1 -1
- package/buildLibs/utils/Web/ClXeditable.d.ts +3 -0
- package/buildLibs/utils/Web/ClXeditable.js +33 -32
- package/buildLibs/utils/Web/ClXeditable.js.map +1 -1
- package/buildLibs/web/index.cjs +2 -5
- package/buildLibs/web/index.css +1 -0
- package/buildLibs/web/index.js +76 -6
- package/docs/components/Element/Input.md +1 -1
- package/docs/components/Element/InputNumber.md +1 -1
- package/package.json +21 -8
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js +0 -663
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-B-yxIx8F.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-C9mOHVoE.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js +0 -2
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-CcOk4kyd.js.map +0 -1
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js +0 -2
- package/buildLibs/utils/Shared/Index.vue_vue_type_script_setup_true_lang-DtZgYjSl.js.map +0 -1
- package/buildLibs/utils/Shared/Video-BV0YLYT2.js +0 -114
- package/buildLibs/utils/Shared/Video-BV0YLYT2.js.map +0 -1
- package/buildLibs/utils/Shared/Video-c3jHJSxl.js +0 -2
- package/buildLibs/utils/Shared/Video-c3jHJSxl.js.map +0 -1
- package/buildLibs/utils/Shared/Video.css +0 -1
- package/buildLibs/utils/Web/ClDropdownMenuM.css +0 -1
- package/buildLibs/utils/Web/ClPreview.cjs +0 -2
- package/buildLibs/utils/Web/ClPreview.cjs.map +0 -1
- package/buildLibs/utils/Web/ClPreview.css +0 -1
- package/buildLibs/utils/Web/ClPreview.js +0 -353
- package/buildLibs/utils/Web/ClPreview.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Index.vue_vue_type_script_setup_true_lang-Dxb_K2w0.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","t","fk","fv","type","icon","arrFormat","list","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-gsnpWNek.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","t","fk","fv","type","icon","arrFormat","list","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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"}
|