{"version":3,"file":"upload.vue.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-ultra/utils'\n\nimport { useNamespace } from '@element-ultra/hooks'\nimport ajax from './ajax'\nimport UploadDragger from './upload-dragger.vue'\n\nimport type { PropType } from 'vue'\nimport type { Nullable } from '@element-ultra/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: {\n      type: Boolean,\n      default: undefined\n    },\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":["_resolveComponent","_openBlock","_createElementBlock","_normalizeClass","_withKeys","_withModifiers","_createBlock","_renderSlot","_createElementVNode"],"mappings":";;;;;;oCACEA,iBAuBM,gBAAA,CAAA,CAAA;SArBJC,WAAY,EAAAC,kBAAA;AAAA,IAAA,KAAA;AAAA,IAAA;AAAA,MACX,KAAK,EAAAC,cAAA,CAAE,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,EAAA,EAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CAAA,CAAA;AAAA,MACP,QAAO,EAAA,GAAA;AAAA,MAAA,OAAA,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,OAAA,CAAA,CAAA,GAAA,CAAA,GAAA,IAAA,KAAA,IAAA,CAAA,WAAA,IAAA,IAAA,CAAA,WAAA,CAAA,GAAA,IAAA,CAAA,CAAA;AAAA,MAEY,SAAA,EAAA,MAAA,CAAA,CAAA,CAAA,KAAA,MAAA,CAAA,CAAA,CAAA,GAAAC,QAAA,CAAAC,aAAA,CAAA,CAAA,GAAA,IAAA,KAAA,IAAA,CAAA,iBAAA,IAAA,CAAA,aAAA,CAAA,GAAA,IAAA,CAAA,EAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA,OAAA,EAAA,OAAA,CAAA,CAAA,CAAA;AAAA,KAAA;AAAA;4BACS,EAAA,EAAQC,YAAA,yBAAA,EAAA;AAAA,QAAG,GAAA,EAAA,CAAA;AAAA,QAAA,UAAA,IAAA,CAAA,QAAA;AAAA;;;;;QAKtC,CAAA,EAAA,CAAA;AAAA;AAAA,OAEF,EAAA,CAAA,EAQE,CAPA,UAAA,EAAA,QAAA,CAAA,CAAA,IAAAC,UAAI,CAAA,IAAA,CAAU,MAAA,EAAA,SAAA,EAAA,EAAA,GAAA,EAAA,GAAA,CAAA;AAAA,MAAAC,mBACR,OAAE,EAAA;AAAA,QACR,GAAI,EAAA,UAAA;AAAA,QACH,OAAML,cAAI,CAAA,IAAA,CAAA,EAAA,CAAA,CAAA,CAAA,OAAA,CAAA,CAAA;AAAA,QACV,IAAA,EAAA,MAAA;AAAA,QACA,MAAM,IAAE,CAAA,IAAA;AAAA,QACR,UAAM,IAAA,CAAA,QAAA;AAAA,QAAA,QAAA,IAAA,CAAA,MAAA;AAAA;;;;;;;;;;;"}