element-plus
Version:
A Component Library for Vue 3
1 lines • 11.6 kB
Source Map (JSON)
{"version":3,"file":"upload.mjs","sources":["../../../../../../packages/components/upload/src/upload.vue"],"sourcesContent":["<template>\n <div\n :class=\"[ns.b(), ns.m(listType)]\"\n tabindex=\"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=\"ns.e('input')\"\n type=\"file\"\n :name=\"name\"\n :multiple=\"multiple\"\n :accept=\"accept\"\n @change=\"handleChange\"\n />\n </div>\n</template>\n\n<script lang=\"ts\">\nimport { defineComponent, ref } from 'vue'\nimport { NOOP } from '@vue/shared'\nimport { hasOwn } from '@element-plus/utils'\n\nimport { useNamespace } from '@element-plus/hooks'\nimport ajax from './ajax'\nimport UploadDragger from './upload-dragger.vue'\n\nimport type { PropType } from 'vue'\nimport type { Nullable } from '@element-plus/utils'\nimport type { ListType, UploadFile, ElFile } from './upload.type'\n\ntype IFileHanlder = (\n file: Nullable<ElFile[]>,\n fileList?: UploadFile[]\n) => unknown\n\ntype AjaxEventListener = (e: ProgressEvent, file: ElFile) => unknown\n\nexport default defineComponent({\n components: {\n UploadDragger,\n },\n props: {\n type: {\n type: String,\n default: '',\n },\n action: {\n type: String,\n required: true,\n },\n name: {\n type: String,\n default: 'file',\n },\n data: {\n type: Object as PropType<Record<string, any>>,\n default: () => null,\n },\n headers: {\n type: Object as PropType<Nullable<Partial<Headers>>>,\n default: () => null,\n },\n method: {\n type: String,\n default: 'post',\n },\n withCredentials: {\n type: Boolean,\n default: false,\n },\n multiple: {\n type: Boolean as PropType<Nullable<boolean>>,\n default: null,\n },\n // https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file#Unique_file_type_specifiers\n accept: {\n type: String,\n default: '',\n },\n onStart: {\n type: Function as PropType<(file: File) => void>,\n default: NOOP as (file: File) => void,\n },\n onProgress: {\n type: Function as PropType<AjaxEventListener>,\n default: NOOP as AjaxEventListener,\n },\n onSuccess: {\n type: Function as PropType<AjaxEventListener>,\n default: NOOP as AjaxEventListener,\n },\n onError: {\n type: Function as PropType<AjaxEventListener>,\n default: NOOP as AjaxEventListener,\n },\n beforeUpload: {\n type: Function as PropType<\n (file: File) => Promise<File | Blob> | boolean | unknown\n >,\n default: NOOP as (file: File) => void,\n },\n drag: {\n type: Boolean,\n default: false,\n },\n onPreview: {\n type: Function as PropType<IFileHanlder>,\n default: NOOP as IFileHanlder,\n },\n onRemove: {\n type: Function as PropType<\n (file: Nullable<FileList>, rawFile: ElFile) => void\n >,\n default: NOOP as (file: Nullable<FileList>, rawFile: ElFile) => void,\n },\n fileList: {\n type: Array as PropType<UploadFile[]>,\n default: () => [] as UploadFile[],\n },\n autoUpload: {\n type: Boolean,\n default: true,\n },\n listType: {\n type: String as PropType<ListType>,\n default: 'text',\n },\n httpRequest: {\n type: Function as\n | PropType<typeof ajax>\n | PropType<(...args: unknown[]) => Promise<unknown>>,\n default: () => ajax,\n },\n disabled: Boolean,\n limit: {\n type: Number as PropType<Nullable<number>>,\n default: null,\n },\n onExceed: {\n type: Function as PropType<\n (files: FileList, fileList: UploadFile[]) => void\n >,\n default: NOOP,\n },\n },\n setup(props) {\n const reqs = ref({} as Record<string, XMLHttpRequest | Promise<any>>)\n const ns = useNamespace('upload')\n const mouseover = ref(false)\n const inputRef = ref(null as Nullable<HTMLInputElement>)\n\n function uploadFiles(files: FileList) {\n if (props.limit && props.fileList.length + files.length > props.limit) {\n props.onExceed(files, props.fileList)\n return\n }\n let postFiles = Array.from(files)\n if (!props.multiple) {\n postFiles = postFiles.slice(0, 1)\n }\n if (postFiles.length === 0) {\n return\n }\n postFiles.forEach((rawFile) => {\n props.onStart(rawFile)\n if (props.autoUpload) upload(rawFile as ElFile)\n })\n }\n\n function upload(rawFile: ElFile) {\n inputRef.value.value = null\n if (!props.beforeUpload) {\n return post(rawFile)\n }\n const before = props.beforeUpload(rawFile)\n if (before instanceof Promise) {\n before\n .then((processedFile) => {\n const fileType = Object.prototype.toString.call(processedFile)\n if (fileType === '[object File]' || fileType === '[object Blob]') {\n if (fileType === '[object Blob]') {\n processedFile = new File([processedFile], rawFile.name, {\n type: rawFile.type,\n })\n }\n for (const p in rawFile) {\n if (hasOwn(rawFile, p)) {\n processedFile[p] = rawFile[p]\n }\n }\n post(processedFile)\n } else {\n post(rawFile)\n }\n })\n .catch(() => {\n props.onRemove(null, rawFile)\n })\n } else if (before !== false) {\n post(rawFile)\n } else {\n props.onRemove(null, rawFile)\n }\n }\n function abort(file) {\n const _reqs = reqs.value\n if (file) {\n let uid = file\n if (file.uid) uid = file.uid\n if (_reqs[uid]) {\n ;(_reqs[uid] as XMLHttpRequest).abort()\n }\n } else {\n Object.keys(_reqs).forEach((uid) => {\n if (_reqs[uid]) (_reqs[uid] as XMLHttpRequest).abort()\n delete _reqs[uid]\n })\n }\n }\n\n function post(rawFile: ElFile) {\n const { uid } = rawFile\n const options = {\n headers: props.headers,\n withCredentials: props.withCredentials,\n file: rawFile,\n data: props.data,\n method: props.method,\n filename: props.name,\n action: props.action,\n onProgress: (e) => {\n props.onProgress(e, rawFile)\n },\n onSuccess: (res) => {\n props.onSuccess(res, rawFile)\n delete reqs.value[uid]\n },\n onError: (err) => {\n props.onError(err, rawFile)\n delete reqs.value[uid]\n },\n }\n const req = props.httpRequest(options)\n reqs.value[uid] = req\n if (req instanceof Promise) {\n req.then(options.onSuccess, options.onError)\n }\n }\n\n function handleChange(e: DragEvent) {\n const files = (e.target as HTMLInputElement).files\n if (!files) return\n uploadFiles(files)\n }\n\n function handleClick() {\n if (!props.disabled) {\n inputRef.value.value = null\n inputRef.value.click()\n }\n }\n\n function handleKeydown() {\n handleClick()\n }\n\n return {\n ns,\n reqs,\n mouseover,\n inputRef,\n abort,\n post,\n handleChange,\n handleClick,\n handleKeydown,\n upload,\n uploadFiles,\n }\n },\n})\n</script>\n"],"names":["ajax","_openBlock","_withCtx","_renderSlot","_normalizeClass"],"mappings":"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"}