UNPKG

yanzhen-design-vue

Version:

278 lines (277 loc) 9.78 kB
"use strict"; Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" }); const vue = require("vue"); const iconsVue = require("@ant-design/icons-vue"); const core = require("@vueuse/core"); const utils = require("@yanzhen-libs/utils"); const utilsVue = require("@yanzhen-libs/utils-vue"); const antDesignVue = require("ant-design-vue"); const utils$1 = require("ant-design-vue/es/upload/utils"); const lodashEs = require("lodash-es"); require("./hooks/index.cjs"); const useFileListConfig = require("./hooks/use-file-list-config.cjs"); const useUploadApis = require("./hooks/use-upload-apis.cjs"); const upload = require("./upload.cjs"); const useUploadPreview = require("./use-upload-preview.cjs"); const useUploadRules = require("./hooks/use-upload-rules.cjs"); function useUpload(props, emit) { const _ref = vue.ref(null); const attrs = vue.useAttrs(); const slots = vue.useSlots(); const [DefineUploadIconRender, ReusableUploadIconRender] = core.createReusableTemplate(); const [DefineUploadPreview, ReusableUploadPreview] = core.createReusableTemplate(); const isEditTable = vue.computed( () => lodashEs.isString(props.nativeTag) && props.nativeTag.startsWith("edit-table") ); const { customUploadRequest } = useUploadApis.provideUploadApi(props); const { fileListRef, isImageType } = useFileListConfig.useFileListConfig(props, emit); const { imagePreviewRef, filePreviewRef, handleOpenPreview, ctx: previewCtx } = useUploadPreview.useUploadPreview(props, emit); const description = vue.computed(() => { if (utils.isEmptyValue(props.uploadDesc)) return; return `${props.uploadDesc || ""}文件类型:${props.accept || ""}`; }); const progressProps = vue.computed(() => { return utils.mergeWith( { strokeColor: { "0%": "#108ee9", "100%": "#87d068" } }, props.progress ?? {} ); }); const { acceptRef, maxCountRef, maxCountRemainderRef, maxSizeRef, validate: handleValidate } = useUploadRules.useUploadRules(fileListRef, props); const imageUploadErrCollect = vue.ref([]); const imageUploadTotalCount = vue.ref(0); const imageUploadHasError = vue.ref(false); const curBeforeImageUploads = vue.ref(0); const currentImageUploads = vue.ref(0); console.log( "图片最大数量", props, maxSizeRef, vue.unref(imageUploadErrCollect), vue.unref(maxCountRef), vue.unref(maxCountRemainderRef) ); const multipleRef = vue.computed(() => { const maxCount = vue.unref(maxCountRef); const maxCountRemainder = vue.unref(maxCountRemainderRef); switch (true) { case (maxCount === 1 || maxCountRemainder <= 1): return false; default: return props.multiple; } }); const handleBeforeUpload = async (file, fileList) => { if (vue.unref(isImageType)) curBeforeImageUploads.value++; if (lodashEs.isFunction(props.beforeUpload)) { const flag2 = await props.beforeUpload(file, fileList); return flag2 || antDesignVue.Upload.LIST_IGNORE; } let flag = true; if (vue.unref(isImageType)) imageUploadTotalCount.value = fileList.length; const valid = handleValidate({ file, selectFileList: fileList, fileList: vue.unref(fileListRef).concat(fileList), isImageType: vue.unref(isImageType) }); if (valid) { if (vue.unref(isImageType)) { imageUploadErrCollect.value.push(valid[0]); imageUploadHasError.value = true; } else antDesignVue.message.error(valid[0].message); flag = false; } if (vue.unref(isImageType)) { curBeforeImageUploads.value--; console.log("上传的图片-都不满足", curBeforeImageUploads.value); if (curBeforeImageUploads.value === 0) { handleImageUploadComplete(true); } } console.log( "1、BeforeUpload-图片校验", file, fileList, valid, fileList.length, imageUploadErrCollect ); return flag || antDesignVue.Upload.LIST_IGNORE; }; const handleCustomRequest = async (options) => { if (vue.unref(isImageType)) currentImageUploads.value++; const { file, onError, onProgress, onSuccess } = options; if (lodashEs.isFunction(props.customRequest)) { return props.customRequest(options); } if (typeof file === "string") { onSuccess == null ? void 0 : onSuccess(file); return; } const valid = handleValidate({ file }); console.log("2、CustomRequest-上传图片", currentImageUploads.value, options, file, valid); if (valid) { antDesignVue.message.error(valid == null ? void 0 : valid[0].message); onError == null ? void 0 : onError(new Error(valid == null ? void 0 : valid[0].message)); return; } const progress = { percent: 0 }; onProgress == null ? void 0 : onProgress(progress); const timer = setInterval(() => { if (progress.percent < 80) { progress.percent = progress.percent + 5; onProgress == null ? void 0 : onProgress(progress); } else { clearInterval(timer); } }, 500); try { const result = await customUploadRequest({ ...options, data: { uploadType: props.uploadType, ...options.data ?? {} } }); if ((result == null ? void 0 : result.code) !== 0) { onProgress == null ? void 0 : onProgress({ percent: 80 }); onError == null ? void 0 : onError(new Error(result == null ? void 0 : result.message)); imageUploadHasError.value = true; } else { onProgress == null ? void 0 : onProgress({ percent: 100 }); onSuccess == null ? void 0 : onSuccess(result.data); } } catch (e) { onProgress == null ? void 0 : onProgress({ percent: 80 }); onError == null ? void 0 : onError(e); imageUploadHasError.value = true; } finally { if (vue.unref(isImageType)) { currentImageUploads.value--; console.log("最后一次", currentImageUploads.value); if (currentImageUploads.value === 0) { handleImageUploadComplete(); } } clearInterval(timer); } }; const handleImageUploadComplete = (beforeUploadFlag = false) => { console.log("汇总提示!!!-end", imageUploadHasError.value, imageUploadErrCollect.value); if (imageUploadHasError.value) { const imageUploadErrCollectValue = vue.unref(imageUploadErrCollect); const imageUploadErrCollectLen = imageUploadErrCollectValue.length; if (beforeUploadFlag && imageUploadErrCollectLen !== vue.unref(imageUploadTotalCount)) return; const maxSizeErrData = imageUploadErrCollectValue.filter( (el) => typeof el.type === "object" && el.type !== null && "useDocMsg" in el.type ); const otherErrData = imageUploadErrCollectValue.filter((el) => typeof el.type === "string"); const uniqueErrorTypes = Array.from(new Set(otherErrData.map((el) => el.type))); const uniqueErrData = uniqueErrorTypes.map( (type) => { var _a; return (_a = otherErrData.find((el) => el.type === type)) == null ? void 0 : _a.message; } ); const maxSizeErrDataLen = maxSizeErrData.length; if (maxSizeErrDataLen) { const firstError = maxSizeErrData[0]; let maxSizeErrMsg = firstError.message; if (typeof firstError.type === "object" && firstError.type !== null) { const { useDocMsg, maxSize } = firstError.type; if (useDocMsg) maxSizeErrMsg = `有${maxSizeErrDataLen}张图片大小超过${maxSize}兆,无法上传成功,请重新选择图片上传`; } uniqueErrData.push(maxSizeErrMsg); } uniqueErrData.length && uniqueErrData.forEach((msg) => { antDesignVue.message.error(msg); }); imageUploadErrCollect.value = []; imageUploadHasError.value = false; } }; const config = vue.computed(() => lodashEs.pick(props, ...Object.keys(upload.AntUpload.props))); const proxyProps = utilsVue.useProxyProps(config, upload.AntUpload.emits, { emit, exclude: [ "value", "fileList", "onUpdate:fileList", "multiple", "accept", "progress", "onPreview" ], filter: true }); const propsRef = vue.computed(() => { return vue.mergeProps(vue.unref(attrs), vue.unref(proxyProps)); }); function UploadIconRender({ file, listType }) { var _a; const isLoading = file.status === "uploading"; const isImageUrl = props.isImageUrl ?? utils$1.isImageUrl; const uploading = (_a = props.locale) == null ? void 0 : _a.uploading; const fileIcon = isImageUrl && isImageUrl(file) ? vue.h(iconsVue.PictureTwoTone) : vue.h(iconsVue.FileTwoTone); switch (true) { case listType === "picture": return isLoading ? vue.h(iconsVue.LoadingOutlined) : fileIcon; case listType === "picture-card": return isLoading && !!uploading ? uploading : fileIcon; default: return isLoading ? vue.h(iconsVue.LoadingOutlined) : vue.h(iconsVue.PaperClipOutlined); } } const ctx = { ...previewCtx, _ref }; const exposeCtx = vue.reactive(ctx); return { ...ctx, slots, isEditTable, isImageType, multipleRef, fileListRef, acceptRef, progressProps, propsRef, description, maxCountRef, handleCustomRequest, handleBeforeUpload, UploadIconRender, DefineUploadIconRender, ReusableUploadIconRender, DefineUploadPreview, ReusableUploadPreview, // Preview imagePreviewRef, filePreviewRef, handleOpenPreview, // expose ctx, exposeCtx }; } exports.useUpload = useUpload;