tav-ui
Version:
1 lines • 32.1 kB
Source Map (JSON)
{"version":3,"file":"main2.mjs","sources":["../../../../../../../packages/components/upload/src/main.ts"],"sourcesContent":["import { computed, nextTick, ref, watch } from 'vue'\nimport { tavI18n } from '@tav-ui/locales'\nimport { useGlobalConfig } from '@tav-ui/hooks/global/useGlobalConfig'\nimport { useMessage } from '@tav-ui/hooks/web/useMessage'\nimport { isFunction } from '@tav-ui/utils'\nimport { useFileFormatter } from './hooks'\nimport type { Ref } from 'vue'\nimport type { FormActionType } from '../../form'\nimport type {\n BasicPropsType,\n ChangeType,\n FileItemType,\n Fn,\n ProvideDataType,\n Recordable,\n} from './types'\n\n// global variable beginRegion\nconst { createMessage } = useMessage()\n// global variable endRegion\n\nclass Handler {\n private emit: Fn\n\n private _hyperlinkFormMethods: Partial<FormActionType> = {}\n\n private _props!: BasicPropsType\n\n private _provide = computed<undefined | ProvideDataType>(\n () => (useGlobalConfig('components') as Ref<Record<string, any>>).value?.TaUpload\n )\n\n private set props(v: BasicPropsType) {\n this._props = v\n\n const { params, /* maxSize */ controlInOuter } = v\n\n // this._fileMaxSize = maxSize;\n this._controlInOuter = controlInOuter\n this._typeCode.value = params.typeCode\n watch(\n () => this._props.uploadResponse,\n (v) => {\n this.uploadResponse = v\n\n if (!this._props.showTable) return\n this.throwResponse(v!, 'init')\n },\n {\n immediate: true,\n }\n )\n\n // 千万不要干扰🙏\n for (const key in params) {\n this._params[key] = params[key]\n }\n }\n\n private _params: BasicPropsType['params'] = {}\n private _showTable = true\n // private _fileMaxSize;\n private _refFileList: File[] = []\n private _uploadResponse: FileItemType[] = []\n private _refFileListPushEnd = false\n private _immediate = false\n private _controlInOuter = false\n private _fileFormatter = useFileFormatter()\n\n /**\n * newest typeCode\n */\n private _typeCode = ref<string>()\n private _isLoading = ref(false)\n private _dataSource = ref<FileItemType[]>([])\n public currentTypeCodeIsHyperlink = ref(false)\n private _paramsName: string | undefined\n private _paramsAddress: string | undefined\n private _apis: ProvideDataType = {}\n public currentUpload = null as null | Promise<any> | FileItemType[]\n\n //// getter begin\n get dataSource() {\n return this._dataSource\n }\n get typeCode() {\n return this._typeCode\n }\n get loading() {\n return this._isLoading\n }\n\n get typeCodeRecord() {\n return this._props.typeCodeRecord ?? this._provide.value?.typeCodeRecord ?? {}\n }\n\n get apis() {\n if (!this._apis.queryFile) {\n const apis: Partial<ProvideDataType> = {\n queryFile: (this._props.queryFile ??\n this._provide.value?.queryFile) as ProvideDataType['queryFile'],\n removeFile: (this._props.removeFile ??\n this._provide.value?.removeFile) as ProvideDataType['removeFile'],\n uploadFile: (this._props.uploadFile ??\n this._provide.value?.uploadFile) as ProvideDataType['uploadFile'],\n updateFile: (this._props.updateFile ??\n this._provide.value?.updateFile) as ProvideDataType['updateFile'],\n uploadHyperlink: (this._props.uploadHyperlink ??\n this._provide.value?.uploadHyperlink) as ProvideDataType['uploadHyperlink'],\n download: (this._props.download ??\n this._provide.value?.download) as ProvideDataType['download'],\n updateFileNameAndAddress: (this._props.updateFileNameAndAddress ??\n this._provide.value\n ?.updateFileNameAndAddress) as ProvideDataType['updateFileNameAndAddress'],\n updateFileType: (this._props.updateFileType ??\n this._provide.value?.updateFileType) as ProvideDataType['updateFileType'],\n queryFileType: (this._props.queryFileType ??\n this._provide.value?.queryFileType) as ProvideDataType['queryFileType'],\n }\n for (const key in apis) {\n this._apis[key] =\n apis[key] && isFunction(apis[key])\n ? (...args: any[]) => apis[key](...args, this._props.AppId)\n : undefined\n }\n if (\n !(isFunction(apis.queryFile) &&\n // 当使用 false === immediate 时不需要传removeFile\n (this._immediate ? isFunction(apis.removeFile) : true) &&\n isFunction(apis.uploadFile) &&\n (this._props.showUploadHyperlinkBtn === 'unset' ||\n false === this._props.showUploadHyperlinkBtn)\n ? true\n : isFunction(apis.uploadHyperlink))\n ) {\n throw new Error(\n '<queryFile, uploadFile, uploadHyperlink,typeCodeRecord, [removeFile]> 必须在TaUpload挂载前从app.vue注入, 或者传入同名props'\n )\n }\n }\n return this._apis\n }\n\n get getFileFormatter() {\n return this._fileFormatter\n }\n\n //// getter end\n\n //// setter begin\n public set paramsName(v: string) {\n this._paramsName = v\n }\n public set paramsAddress(v: string) {\n this._paramsAddress = v\n }\n\n public set uploadResponse(v: FileItemType[] | undefined) {\n this._uploadResponse = v ?? []\n this.fillDataSource()\n }\n\n //// setter begin\n\n /**\n * 构造函数.\n * @param props BasicPropsType\n */\n constructor(props: BasicPropsType, instanceEmit) {\n this.emit = instanceEmit\n this.props = props\n\n // 动态控制默认的表格显示与否\n watch(\n () => this._props.showTable,\n (val) => {\n this._showTable = val\n },\n {\n immediate: true,\n }\n )\n\n // 动态控制上传同时携带businessId\n watch(\n () => this._props.immediate,\n (val) => {\n this._immediate = val\n },\n {\n immediate: true,\n }\n )\n\n // 用businessId控制回填与清空\n watch(\n () => this._props.params.businessId,\n (val) => {\n this._params.businessId = val\n // 外部控制 -> 不请求,不自动清除\n if (this._controlInOuter) return\n if (undefined === val) {\n this.clearResponse()\n return\n }\n // 传入文件列表 -> 不请求\n if (this._props.uploadResponse) return\n this.backfill()\n },\n {\n immediate: true,\n }\n )\n\n // 用 businessKey 控制回填与清空\n watch(\n () => this._props.params.businessKey,\n (val) => {\n this._params.businessKey = val\n // 外部控制 -> 不请求,不自动清除\n if (this._controlInOuter) return\n if (undefined === val) {\n this.clearResponse()\n return\n }\n // 传入文件列表 -> 不请求\n if (this._props.uploadResponse) return\n this.backfill()\n },\n {\n immediate: true,\n flush: 'pre',\n }\n )\n\n // 一些请求的参数\n watch(\n () =>\n [\n this._props.params.id,\n this._props.params.endTime,\n this._props.params.typeCode,\n this._props.params.startTime,\n this._props.params.moduleCode,\n this._props.params.businessKey,\n this._props.params.searchValue,\n ] as const,\n (\n [\n idVal,\n endTimeVal,\n typeCodeVal,\n startTimeVal,\n moduleCodeVal,\n businessKeyVal,\n searchValueVal,\n ],\n [\n idPrev,\n endTimePrev,\n typeCodePrev,\n startTimePrev,\n moduleCodePrev,\n businessKeyPrev,\n searchValuePrev,\n ]\n ) => {\n idVal !== idPrev && (this._params.id = idVal)\n\n endTimeVal !== endTimePrev && (this._params.endTime = endTimeVal)\n\n typeCodeVal !== typeCodePrev && (this._typeCode.value = typeCodeVal)\n\n startTimeVal !== startTimePrev && (this._params.startTime = startTimeVal)\n\n businessKeyVal !== businessKeyPrev && (this._params.businessKey = businessKeyVal)\n\n moduleCodeVal !== moduleCodePrev && (this._params.moduleCode = moduleCodeVal)\n\n searchValueVal !== searchValuePrev && (this._params.searchValue = searchValueVal)\n },\n {\n flush: 'pre',\n }\n )\n }\n\n /**\n * 如多个文件正在上传或上传列表(变量)已清空 -> 不发请求\n */\n private isInvalidRequest = () => this._refFileListPushEnd || this._refFileList.length === 0\n /**\n * 提取文件真实id\n */\n private getFileActualIds = () => this._uploadResponse.map((el) => el.actualId)\n\n /**\n * 返回编辑后的文件列表数据格式\n * ```js\n * [\n * {\n * moduleCode: \"...\",\n * versionList: [\n * file1,...\n * ]\n * }\n * ]\n * ```\n * @returns\n */\n getResult = () => this._fileFormatter.formatToApi(this._uploadResponse)\n\n getPropsOrProvide<T extends keyof BasicPropsType>(propName: T): BasicPropsType[T] {\n // @ts-ignore\n return this._props[propName] ?? this._provide.value?.[propName]\n }\n\n /**\n * 将列表数据填到表格上\n */\n fillDataSource = () => {\n if (!this._showTable) {\n return\n }\n this._dataSource.value = []\n this._dataSource.value.push(...this._uploadResponse)\n // this._dataSource.value = !this._typeCode.value\n // ? this._uploadResponse\n // : this._uploadResponse.filter((a) => a.typeCode == this._typeCode.value);\n }\n\n /**\n * 请求文件列表成功和上传成功时触发\n * @param newRecord 新上传成功的文件\n */\n private throwResponse(newRecord: Recordable[], type: ChangeType): void {\n this.emit(\n 'update:fileActualIds',\n !this._props.immediate && (this._params.businessId || this._params.businessKey)\n ? this.getResult()\n : this.getFileActualIds()\n )\n this.emit('change', newRecord, this._uploadResponse, type)\n }\n /**\n * 更新一条数据\n * @param {Recordable} record\n * @memberof Handler\n **/\n updateItem = (record: FileItemType, oldFileActualIds: string) => {\n // const { actualId } = record\n const index = this._uploadResponse.findIndex((el) => el.actualId === oldFileActualIds)\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const oldRecord = this._uploadResponse.splice(index, 1, record)[0]\n // this._fileFormatter.upadteVersion(oldRecord)\n this._fileFormatter.upadteVersion(record)\n this.fillDataSource()\n this.throwResponse([{ ...record, version: oldRecord.version + 1 }], 'update')\n }\n /**\n * 删除一条数据\n * @param {Recordable} record 需要删除的文件信息\n * @memberof Handler\n */\n deleteItem = (record: Recordable) => {\n const { actualId } = record\n const index = this._uploadResponse.findIndex((el) => el.actualId === actualId)\n const newRecord = this._uploadResponse[index]\n\n const spliceData = () => {\n this._uploadResponse.splice(index, 1)\n this.fillDataSource()\n this.throwResponse([newRecord], 'delete')\n }\n\n this._isLoading.value = true\n if (!this._immediate) {\n spliceData()\n setTimeout(() => {\n this._isLoading.value = false\n }, 300)\n return\n }\n this.apis.removeFile!(actualId)\n .then(() => {\n spliceData()\n })\n .catch(() => {\n createMessage.warn(tavI18n('Tav.file.message.1'))\n })\n .finally(() => (this._isLoading.value = false))\n }\n\n // 根据params请求数据\n async backfill() {\n if (!this._showTable) return\n\n if (this._params.businessId || this._params.businessKey) {\n // 回填||切换select 清空\n this.clearResponse()\n this._isLoading.value = true\n\n const response = await this.apis.queryFile!({\n filter: {\n ...this._params,\n typeCode: undefined, // 本地切换类型\n },\n model: {\n page: 1,\n limit: 50,\n },\n }).finally(() => (this._isLoading.value = false))\n this._uploadResponse.push(...response.data.result)\n this._fileFormatter.formatToApi(this._uploadResponse)\n\n this.throwResponse(response.data.result, 'init')\n }\n this.fillDataSource()\n }\n\n /**\n * 在弹窗关闭时调用\n */\n clearResponse(): void {\n this.uploadResponse = []\n this._props.params.typeCode && (this._typeCode.value = this._props.params.typeCode)\n this.throwResponse([], 'delete')\n }\n\n /**\n * 多个文件依次push到文件列表(变量)\n * @param file 一个文件\n */\n antBeforeUpload = (file: File) => {\n const regexpStr = `[\\\\\\\\/:*?\"<>|]`\n const fileRegexp = new RegExp(regexpStr, 'g')\n if (fileRegexp.test(file.name)) {\n createMessage.warn(`${file.name} ${tavI18n('Tav.file.upload.5')}${regexpStr}`)\n return false\n } else {\n this._refFileList.push(file)\n }\n }\n\n /**\n * 将多个文件组合在一起发送上传请求\n */\n customRequest = () => {\n if (this.isInvalidRequest()) return\n const sizeOverflowFiles = this._refFileList.filter((file) => file.size / 1024 / 1024 > 1024)\n if (sizeOverflowFiles.length > 0) {\n createMessage.warn(\n `${tavI18n('Tav.file.upload.4')} ${sizeOverflowFiles\n .map((file) => `${file.name}:${Math.floor(file.size / 1024 / 1024)}MB`)\n .join()}${tavI18n('Tav.common.greater')}1GB`\n )\n this.resetFileList()\n return\n }\n if (\n this._props.maxCount &&\n this._uploadResponse.length + this._refFileList.length > this._props.maxCount\n ) {\n createMessage.warn(`${tavI18n('Tav.file.message.4')} ${this._props.maxCount}个`)\n this.resetFileList()\n return\n }\n this._refFileListPushEnd = true\n this.realUpload()\n }\n\n private resetFileList = () => {\n this._refFileList = []\n this._refFileListPushEnd = false\n this._isLoading.value = false\n }\n\n /**\n * 真正的上传请求\n */\n private realUpload = async () => {\n // 非更新时候 typecode必传\n if (!this._typeCode.value) {\n createMessage.warn(tavI18n('Tav.file.message.5'))\n this.resetFileList()\n return\n }\n const { beforeUpload } = this._props\n if (beforeUpload && !(await beforeUpload(this._refFileList, this._typeCode.value))) {\n this.resetFileList()\n return\n }\n\n // fillFormData begin\n const formData = new FormData()\n this._refFileList.forEach((el) => {\n formData.append('files', el)\n })\n this._params.typeCode = this._typeCode.value\n // 将参数塞到formData里面去\n for (const k in this._params) {\n if (!this._immediate && ['businessId', 'businessKey'].includes(k)) continue\n if (!this._params[k]) continue\n this._params[k] != undefined && formData.append(k, this._params[k])\n }\n // fillFormData end\n\n this._isLoading.value = true\n this.currentUpload = this.apis.uploadFile!(formData)\n .then(({ data: r }) => {\n this._uploadResponse.unshift(...r)\n this.throwResponse(r, 'upload')\n nextTick(() => this.fillDataSource())\n r.forEach((el) => {\n this._fileFormatter.upadteVersion(el)\n })\n\n createMessage.success(tavI18n('Tav.file.message.6'))\n })\n .catch(() => {\n // createMessage.error(\"上传失败\");\n })\n .finally(() => {\n this.resetFileList()\n })\n }\n\n hyperlinkFormRegister = (methods: Partial<FormActionType>) => {\n this._hyperlinkFormMethods = methods\n }\n\n /**\n * 超链接上传\n */\n hyperlinkUpload() {\n if (!this._typeCode.value) {\n createMessage.warn(tavI18n('Tav.file.message.5'))\n this.resetFileList()\n return\n }\n const payload = {\n ...this._params,\n typeCode: this._typeCode.value,\n name: this._paramsName,\n address: this._paramsAddress,\n }\n if (!this._immediate) {\n Reflect.deleteProperty(payload, 'businessId')\n Reflect.deleteProperty(payload, 'businessKey')\n }\n this._isLoading.value = true\n this.apis.uploadHyperlink!(payload)\n .then(({ data: r }) => {\n this._uploadResponse.unshift(r)\n this._fileFormatter.upadteVersion(r)\n this.throwResponse([r], 'upload')\n nextTick(() => this.fillDataSource())\n createMessage.success(tavI18n('Tav.file.message.6'))\n })\n .catch(() => {\n // createMessage.error(\"上传失败\");\n })\n .finally(() => {\n this._hyperlinkFormMethods.resetFields?.()\n this._isLoading.value = false\n })\n }\n\n preOpenChooseFile = (e: MouseEvent) => {\n if (!this._typeCode.value) {\n createMessage.warn(tavI18n('Tav.file.message.5'))\n e.stopPropagation()\n }\n }\n}\n\nexport { Handler }\n"],"names":[],"mappings":"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"}