UNPKG

hongluan-ui

Version:
1 lines 7.99 kB
{"version":3,"file":"upload-content.mjs","sources":["../../../../../../packages/components/upload/src/upload-content.vue"],"sourcesContent":["<template>\n <div\n :class=\"\n [\n `handle-${listType}`,\n {\n 'is-drag': drag,\n 'is-disabled': disabled,\n }\n ]\"\n :tabindex=\"disabled ? '-1' : '0'\"\n @click=\"handleClick\"\n @keydown.self.enter.space=\"handleKeydown\"\n >\n <template v-if=\"drag\">\n <upload-dragger :disabled=\"disabled\" @file=\"uploadFiles\">\n <slot></slot>\n </upload-dragger>\n </template>\n <template v-else>\n <slot></slot>\n </template>\n <input\n ref=\"inputRef\"\n class=\"upload-input\"\n :name=\"name\"\n :multiple=\"multiple\"\n :accept=\"accept\"\n :disabled=\"disabled\"\n type=\"file\"\n @change=\"handleChange\"\n @click.stop\n >\n </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { shallowRef } from 'vue'\nimport { isPlainObject, isPromise } from '@vue/shared'\nimport { cloneDeep, isEqual } from 'lodash-unified'\nimport { entriesOf, isFunction } from '@hongluan-ui/utils'\nimport { useConsistentProp } from '@hongluan-ui/hooks'\nimport UploadDragger from './upload-dragger.vue'\nimport { uploadContentProps } from './upload-content'\nimport { genFileId } from './upload'\n\nimport type { UploadContentProps } from './upload-content'\n\nimport type {\n UploadRequestOptions,\n UploadRawFile,\n UploadFile,\n UploadHooks,\n} from './upload'\n\ndefineOptions({\n name: 'UploadContent',\n inheritAttrs: false,\n})\n\nconst props = defineProps(uploadContentProps)\n\nconst { disabled } = useConsistentProp()\n\nconst requests = shallowRef<Record<string, XMLHttpRequest | Promise<unknown>>>(\n {},\n)\nconst inputRef = shallowRef<HTMLInputElement>()\n\nconst uploadFiles = (files: File[]) => {\n if (files.length === 0) return\n\n const { autoUpload, limit, fileList, multiple, onStart, onExceed } = props\n\n if (limit && fileList.length + files.length > limit) {\n onExceed(files, fileList)\n return\n }\n\n if (!multiple) {\n files = files.slice(0, 1)\n }\n\n for (const file of files) {\n const rawFile = file as UploadRawFile\n rawFile.uid = genFileId()\n onStart(rawFile)\n if (autoUpload) upload(rawFile)\n }\n}\n\nconst upload = async (rawFile: UploadRawFile): Promise<void> => {\n inputRef.value.value = ''\n\n if (!props.beforeUpload) {\n return doUpload(rawFile)\n }\n\n let hookResult: Exclude<ReturnType<UploadHooks['beforeUpload']>, Promise<any>>\n let beforeData: UploadContentProps['data'] = {}\n\n try {\n // origin data: Handle data changes after synchronization tasks are executed\n const originData = props.data\n const beforeUploadPromise = props.beforeUpload(rawFile)\n beforeData = isPlainObject(props.data) ? cloneDeep(props.data) : props.data\n hookResult = await beforeUploadPromise\n if (isPlainObject(props.data) && isEqual(originData, beforeData)) {\n beforeData = cloneDeep(props.data)\n }\n } catch {\n hookResult = false\n }\n\n if (hookResult === false) {\n props.onRemove(rawFile)\n return\n }\n\n let file: File = rawFile\n if (hookResult instanceof Blob) {\n if (hookResult instanceof File) {\n file = hookResult\n } else {\n file = new File([hookResult], rawFile.name, {\n type: rawFile.type,\n })\n }\n }\n\n doUpload(\n Object.assign(file, {\n uid: rawFile.uid,\n }),\n beforeData,\n )\n}\n\nconst resolveData = async (\n data: UploadContentProps['data'],\n rawFile: UploadRawFile,\n): Promise<Record<string, any>> => {\n if (isFunction(data)) {\n return data(rawFile)\n }\n\n return data\n}\n\nconst doUpload = async (\n rawFile: UploadRawFile,\n beforeData?: UploadContentProps['data'],\n) => {\n const {\n headers,\n data,\n method,\n withCredentials,\n name: filename,\n action,\n onProgress,\n onSuccess,\n onError,\n httpRequest,\n } = props\n\n try {\n beforeData = await resolveData(beforeData ?? data, rawFile)\n } catch {\n props.onRemove(rawFile)\n return\n }\n\n const { uid } = rawFile\n const options: UploadRequestOptions = {\n headers: (headers || {}) as Record<string, any>,\n withCredentials,\n file: rawFile,\n data: beforeData,\n method,\n filename,\n action,\n onProgress: evt => {\n onProgress(evt, rawFile)\n },\n onSuccess: res => {\n onSuccess(res, rawFile)\n delete requests.value[uid]\n },\n onError: err => {\n onError(err, rawFile)\n delete requests.value[uid]\n },\n }\n const request = httpRequest(options)\n requests.value[uid] = request\n if (request instanceof Promise) {\n request.then(options.onSuccess, options.onError)\n }\n}\n\nconst handleChange = (e: Event) => {\n const files = (e.target as HTMLInputElement).files\n if (!files) return\n uploadFiles(Array.from(files))\n}\n\nconst handleClick = () => {\n if (!disabled.value) {\n inputRef.value.value = ''\n inputRef.value.click()\n }\n}\n\nconst handleKeydown = () => {\n handleClick()\n}\n\nconst abort = (file?: UploadFile) => {\n const _reqs = entriesOf(requests.value).filter(\n file ? ([uid]) => String(file.uid) === uid : () => true,\n )\n _reqs.forEach(([uid, req]) => {\n if (req instanceof XMLHttpRequest) req.abort()\n delete requests.value[uid]\n })\n}\n\ndefineExpose({\n abort,\n upload,\n})\n</script>\n"],"names":[],"mappings":"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"}