{"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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"}