UNPKG

element-plus

Version:

A Component Library for Vue 3

275 lines (272 loc) 7.01 kB
import { defineComponent, ref, resolveComponent, openBlock, createElementBlock, normalizeClass, withKeys, withModifiers, createBlock, withCtx, renderSlot, createElementVNode } from 'vue'; import { NOOP, hasOwn } from '@vue/shared'; import '../../../utils/index.mjs'; import '../../../hooks/index.mjs'; import upload from './ajax.mjs'; import UploadDragger from './upload-dragger.mjs'; import _export_sfc from '../../../_virtual/plugin-vue_export-helper.mjs'; import { useNamespace } from '../../../hooks/use-namespace/index.mjs'; const _sfc_main = defineComponent({ components: { UploadDragger }, props: { type: { type: String, default: "" }, action: { type: String, required: true }, name: { type: String, default: "file" }, data: { type: Object, default: () => null }, headers: { type: Object, default: () => null }, method: { type: String, default: "post" }, withCredentials: { type: Boolean, default: false }, multiple: { type: Boolean, default: null }, accept: { type: String, default: "" }, onStart: { type: Function, default: NOOP }, onProgress: { type: Function, default: NOOP }, onSuccess: { type: Function, default: NOOP }, onError: { type: Function, default: NOOP }, beforeUpload: { type: Function, default: NOOP }, drag: { type: Boolean, default: false }, onPreview: { type: Function, default: NOOP }, onRemove: { type: Function, default: NOOP }, fileList: { type: Array, default: () => [] }, autoUpload: { type: Boolean, default: true }, listType: { type: String, default: "text" }, httpRequest: { type: Function, default: () => upload }, disabled: Boolean, limit: { type: Number, default: null }, onExceed: { type: Function, default: NOOP } }, setup(props) { const reqs = ref({}); const ns = useNamespace("upload"); const mouseover = ref(false); const inputRef = ref(null); function uploadFiles(files) { if (props.limit && props.fileList.length + files.length > props.limit) { props.onExceed(files, props.fileList); return; } let postFiles = Array.from(files); if (!props.multiple) { postFiles = postFiles.slice(0, 1); } if (postFiles.length === 0) { return; } postFiles.forEach((rawFile) => { props.onStart(rawFile); if (props.autoUpload) upload(rawFile); }); } function upload(rawFile) { inputRef.value.value = null; if (!props.beforeUpload) { return post(rawFile); } const before = props.beforeUpload(rawFile); if (before instanceof Promise) { before.then((processedFile) => { const fileType = Object.prototype.toString.call(processedFile); if (fileType === "[object File]" || fileType === "[object Blob]") { if (fileType === "[object Blob]") { processedFile = new File([processedFile], rawFile.name, { type: rawFile.type }); } for (const p in rawFile) { if (hasOwn(rawFile, p)) { processedFile[p] = rawFile[p]; } } post(processedFile); } else { post(rawFile); } }).catch(() => { props.onRemove(null, rawFile); }); } else if (before !== false) { post(rawFile); } else { props.onRemove(null, rawFile); } } function abort(file) { const _reqs = reqs.value; if (file) { let uid = file; if (file.uid) uid = file.uid; if (_reqs[uid]) { ; _reqs[uid].abort(); } } else { Object.keys(_reqs).forEach((uid) => { if (_reqs[uid]) _reqs[uid].abort(); delete _reqs[uid]; }); } } function post(rawFile) { const { uid } = rawFile; const options = { headers: props.headers, withCredentials: props.withCredentials, file: rawFile, data: props.data, method: props.method, filename: props.name, action: props.action, onProgress: (e) => { props.onProgress(e, rawFile); }, onSuccess: (res) => { props.onSuccess(res, rawFile); delete reqs.value[uid]; }, onError: (err) => { props.onError(err, rawFile); delete reqs.value[uid]; } }; const req = props.httpRequest(options); reqs.value[uid] = req; if (req instanceof Promise) { req.then(options.onSuccess, options.onError); } } function handleChange(e) { const files = e.target.files; if (!files) return; uploadFiles(files); } function handleClick() { if (!props.disabled) { inputRef.value.value = null; inputRef.value.click(); } } function handleKeydown() { handleClick(); } return { ns, reqs, mouseover, inputRef, abort, post, handleChange, handleClick, handleKeydown, upload, uploadFiles }; } }); const _hoisted_1 = ["name", "multiple", "accept"]; function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) { const _component_upload_dragger = resolveComponent("upload-dragger"); return openBlock(), createElementBlock("div", { class: normalizeClass([_ctx.ns.b(), _ctx.ns.m(_ctx.listType)]), tabindex: "0", onClick: _cache[1] || (_cache[1] = (...args) => _ctx.handleClick && _ctx.handleClick(...args)), onKeydown: _cache[2] || (_cache[2] = withKeys(withModifiers((...args) => _ctx.handleKeydown && _ctx.handleKeydown(...args), ["self"]), ["enter", "space"])) }, [ _ctx.drag ? (openBlock(), createBlock(_component_upload_dragger, { key: 0, disabled: _ctx.disabled, onFile: _ctx.uploadFiles }, { default: withCtx(() => [ renderSlot(_ctx.$slots, "default") ]), _: 3 }, 8, ["disabled", "onFile"])) : renderSlot(_ctx.$slots, "default", { key: 1 }), createElementVNode("input", { ref: "inputRef", class: normalizeClass(_ctx.ns.e("input")), type: "file", name: _ctx.name, multiple: _ctx.multiple, accept: _ctx.accept, onChange: _cache[0] || (_cache[0] = (...args) => _ctx.handleChange && _ctx.handleChange(...args)) }, null, 42, _hoisted_1) ], 34); } var Upload = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]); export { Upload as default }; //# sourceMappingURL=upload.mjs.map