import { ge, gt } from "./chunk-O6L55DMN.js"; import "./chunk-FNDTTSSL.js"; import { lt } from "./chunk-KE6WE6IM.js"; import "./chunk-KRMUJIEJ.js"; import "./chunk-YFT6OQ5R.js"; import { B } from "./chunk-USOO7D3G.js"; import "./chunk-F73GDDKZ.js"; import { cloneDeep_default, merge_default } from "./chunk-LK7GAOJV.js"; import "./chunk-GCDLWRBO.js"; import { computed, createBaseVNode, createBlock, createCommentVNode, createElementBlock, defineComponent, guardReactiveProps, mergeProps, nextTick, normalizeClass, normalizeProps, openBlock, ref, resolveDynamicComponent, watch, withCtx } from "./chunk-YI6SOFIT.js"; import "./chunk-PLDDJCW6.js"; // node_modules/@fast-crud/fast-extends/dist/fs-file-uploader-506e96b9.mjs var Ve = defineComponent({ name: "FsFileUploader", inheritAttrs: false, props: { /** * value */ modelValue: {}, /** * 限制文件数量 * 当限制数量>1时,返回值为数组 */ limit: { type: Number }, /** * 文件大小限制,单位:字节 * 可以直接传一个数字,也可以传 `{limit:number,tip:'自定义提示文本'}` */ sizeLimit: { type: [Number, Object] }, /** * 限制上传图片的像素尺寸 * 可以传数组会对象{ width?: number, height?: number, tip?: string } | [number, number?, string?] */ pixelLimit: { type: Object, required: false }, /** * 是否显示限制提示 */ showLimitTip: { type: Boolean, default: true }, /** * 构建url的方法 * 后台返回key之后,将其build成一个可访问的url,用于反显 * 如果successHandle返回的object中已包含url,此配置将不会执行 */ buildUrl: { default() { return (n) => n; } }, /** * 多个value值构建多个url * 如果successHandle 返回的object中已包含url,此方法将不会执行 */ buildUrls: {}, /** * 上传按钮配置,参考FsButton参数 */ button: { type: Object }, /** * 展示模式,对应[x]-uploader组件的 listType参数 */ listType: { type: String }, /** * 上传前的判断操作 */ beforeUpload: { type: Function }, /** * 上传请求前的操作,可以压缩图片等,替换掉context中的file * type: `async (context)=>void` */ beforeUploadRequest: { type: Function }, /** * FsUploaderXXX的配置 * 可以覆盖全局配置里各个上传类型对应的配置 * 例如: `{action:'xxx',bucket:'xxx',...}` */ uploader: { type: Object }, /** * 预览配置 */ preview: { type: Object }, /** * 上传成功后从结果中取值类型 * 支持:`[object,url,key,其他(successHandle返回的object内要有该字段,不要用'id')]` * 如果配置了非url,则需要配置buildUrl用于反显 */ valueType: { type: String, // url ,key, object default: "url" }, /** * 根据value获取文件名,用于显示在fileList里面 */ getFileName: {} }, emits: ["change", "update:modelValue", "success", "exceed", "remove"], setup(n, r) { const { ui: o } = B(), { t: d } = lt(), s = ref([]), v = ref(), c = ref(), H = computed(() => n.getFileName || (async (e) => { if (typeof e != "string") return console.warn("获取文件名失败,请配置getFileName"), e; const t = e.substring(e.lastIndexOf("/") + 1), i = t.indexOf("?"); return i >= 0 ? t.substring(0, i) : t; })); function h(e) { return n.valueType === "object" ? e : e[n.valueType]; } function K(e) { const t = []; for (let i of e) t.push(h(i)); return t; } async function W(e) { const t = []; for (let i of e) { let l; typeof i == "string" || typeof i == "number" || typeof i == "boolean" || i instanceof Date ? (l = { url: void 0, key: i, value: i }, n.valueType !== "object" && (l[n.valueType] = i)) : l = i, l[o.upload.id] || (l[o.upload.id] = Math.random() + ""), l.status || (l.status = o.upload.status.success), t.push(l); } await z(t); for (const i of t) if (!i.name) { const l = i.url || i.value; i.name = await H.value(l, i); } return t; } async function B2(e) { const t = []; for (let i of e) { const l = i.response || i.fsRes, a = { size: i.size, name: i.name, uid: i.uid, ...l ?? i }; t.push(a); } return await z(t), K(t); } async function b(e) { const t = []; if (e == null || e.length === 0) { s.value = t; return; } if (e instanceof Array) for (let l of e) t.push(l); else t.push(e); const i = await W(t); N(i); } async function J() { await S.onChange(), await S.onBlur(); } async function R(e) { let t = await Q(e); k(t), nextTick(async () => { await J(); }); } async function Q(e) { if (e == null || e.length === 0) return n.limit === 1 ? null : []; if (n.limit === 1) return (await B2(e))[0]; const t = []; for (let i of e) o.upload.isSuccess(i) && t.push(i); return await B2(t); } async function z(e) { let t = e.filter((i) => i.url == null); if (n.buildUrls) { const i = t.map((a) => h(a)), l = await n.buildUrls(i); for (let a = 0; a < t.length; a++) t[a].url = l[a]; } else if (n.buildUrl) for (let i of t) i.url = await n.buildUrl(h(i)); else for (let i of t) i.url = i.value || i.key; } function E(e) { r.emit("change", e); } function k(e) { v.value = e, r.emit("update:modelValue", e); } const S = o.formItem.injectFormItemContext(); watch( () => n.modelValue, async (e) => { E(e), e !== v.value && await b(e); } ), b(n.modelValue); function X() { return s.value.filter((t) => t.status === o.upload.status.uploading).length > 0; } function m(e, t) { N(t), R(t); } function L(e, t, i) { r.emit("success", { res: e, file: t, fileList: i }), m(t, i); } function O(e) { let t; return e > 1024 * 1024 * 1024 ? t = (e / (1024 * 1024 * 1024)).toFixed(2) + "G" : e > 1024 * 1024 ? t = (e / (1024 * 1024)).toFixed(2) + "M" : t = Math.round(e / 1024) + "K", t; } const j = (e = false) => { const t = e ? o.upload.limitAdd : 0; return n.limit > 0 && s.value.length >= n.limit + t; }; function Y() { n.showLimitTip && o.message.warn(d("fs.extends.fileUploader.limitTip", [n.limit])); } function Z() { if (j(true)) throw Y(), r.emit("exceed", { fileList: s.value, limit: n.limit }), new Error("文件数量超限"); } function ee(e) { if (n.sizeLimit != null) { let t = n.sizeLimit, i = null; if (typeof n.sizeLimit == "number" ? i = (l, a) => { const f = O(a), u = O(e.size); o.message.warn(d("fs.extends.fileUploader.sizeLimitTip", [f, u])); } : (t = n.sizeLimit.limit, i = n.sizeLimit.tip), e.size > t) { let l = "文件大小超过限制,当前文件大小:" + e.size / 1024 + "k"; throw i(e.size, t), new Error(l); } } } const te = (e) => { let t = 0, i = 0, l = ""; if (n.pixelLimit) Array.isArray(n.pixelLimit) ? (t = n.pixelLimit[0], i = n.pixelLimit[1] || n.pixelLimit[0] || 0, l = n.pixelLimit[2] || "") : typeof n.pixelLimit == "object" && (t = n.pixelLimit.width || 0, i = n.pixelLimit.height || 0, l = n.pixelLimit.tip || ""); else return Promise.resolve(true); let a = l || d("fs.extends.fileUploader.pixelLimitTip", [t, i]); return new Promise((f, u) => { let M = new FileReader(); M.onload = (fe) => { var $; let D = ($ = fe.target) == null ? void 0 : $.result, y = new Image(); y.onload = function() { t && y.width > t || i && y.height > i ? (o.message.warn(a), u(a)) : f(true); }, y.onerror = function(Pe) { o.message.warn(d("fs.extends.fileUploader.loadError")), u(d("fs.extends.fileUploader.loadError")); }, D && (y.src = D); }, M.readAsDataURL(e); }); }, U = async (e, t = s.value) => { if (n.beforeUpload && await n.beforeUpload({ file: e, fileList: s.value }) === false) return false; try { Z(), ee(e), F() && await te(e); } catch { return false; } }; function N(e) { s.value = e; } async function ie(e) { e.options = n.uploader || {}; const { getUploaderImpl: t } = gt(); let i = await t(e.options.type); if (i == null) throw o.message.warn("Sorry,The uploader component is not ready yet"), new Error("Sorry,The component is not ready yet"); return await (i == null ? void 0 : i.upload(e)); } async function T(e) { n.beforeUploadRequest && await n.beforeUploadRequest(e); const { file: t, onProgress: i, onSuccess: l, onError: a } = e, f = { file: t, fileName: t.name, onProgress: i }; try { const u = await ie(f); l(u); } catch (u) { console.error("上传失败", u), a(u); } } const ne = computed(() => oe() ? { is: "FsIcon", icon: o.icons.plus } : { is: "FsButton", icon: o.icons.upload, text: d("fs.extends.fileUploader.text"), ...n.button }), A = ref(false), q = ref(), le = computed(() => ({ ...o.dialog.footer(), ...n.preview })); function ae(e) { return new Promise((t, i) => { const l = new FileReader(); l.readAsDataURL(e), l.onload = () => t(l.result), l.onerror = (a) => i(a); }); } function F() { return n.listType === o.upload.typeImageCard || n.listType === o.upload.typeImage; } function oe() { return n.listType === o.upload.typeImageCard; } const x = async (e) => { var t, i; if (!F()) { let l; e.url ? l = e.url : o.type === "antdv" ? l = (t = e.response) == null ? void 0 : t.url : o.type === "element" ? l = (i = e.fsRes) == null ? void 0 : i.url : l = e.url, window.open(l, "_blank"); } !e.url && !e.preview && e.originFileObj && (e.preview = await ae(e.originFileObj)), q.value = e.url || e.preview, A.value = true; }; function re() { const e = { customRequest: T, beforeUpload: U, limit: n.limit, listType: n.listType, onChange: (t) => { const { file: i, fileList: l } = t; m(i, l), i.status === "done" && L(i.response, i, l); }, onPreview: x }; return n.limit != null && r.attrs.maxCount == null && (e.maxCount = n.limit), e; } function se() { return { action: "", listType: n.listType, limit: n.limit, beforeUpload: U, httpRequest: T, onExceed: (e) => { r.emit("exceed", e, s); }, onRemove: (e, t) => { m(e, t), r.emit("remove", e, t); }, onChange: (e, t) => { m(e, t); }, onSuccess: (e, t, i) => { e != null && (t.response = e, t.fsRes = e, L(e, t, i)); }, // "on-error": "handleUploadFileError", // "on-progress": "handleUploadProgress" onPreview: x }; } const V = {}; function ue() { function e(t) { let i = t.value || t; i = cloneDeep_default(i); for (let l of i) { const a = V[l.id]; a && merge_default(l, a); } return i; } return { action: "", limit: n.limit, listType: n.listType, onBeforeUpload: async ({ file: t, fileList: i }) => U(t, i), customRequest: (t) => { const i = t.file; T({ ...t, file: i.file, onSuccess: async (l) => { const a = n.valueType === "object" ? l : l[n.valueType]; l.url = await n.buildUrl(a), merge_default(i, l), V[i.id] = { ...l, fsRes: l }, t.onFinish(i); }, onProgress: (l) => { t.onProgress(l); } }); }, onExceed: (t) => { r.emit("exceed", t); }, onRemove: (t) => { r.emit("remove", t); }, onChange: (t) => { const { event: i, file: l, fileList: a } = t, f = e(a); m(l, [...f]); }, onFinish: (t) => { const i = V[t.id]; i && merge_default(t, i); const l = e(s); L(i, t, l); }, onPreview: x }; } const de = computed(() => { let e = null; return o.type === "antdv" ? e = re() : o.type === "element" ? e = se() : e = ue(), { ...e, ...r.attrs }; }); return { ui: o, fileList: s, fileUploaderRef: c, initValue: b, onChange: E, onInput: k, hasUploading: X, isPicture: F, computedFileSelectBtn: ne, previewVisible: A, previewImage: q, computedPreview: le, computedOnLimit: j, computedBinding: de, emitValue: R }; } }); var Ce = ["src"]; function Ie(n, r, o, d, s, v) { return openBlock(), createElementBlock("div", { class: normalizeClass(["fs-file-uploader", { "fs-file-uploader-limit": n.computedOnLimit() }]) }, [ (openBlock(), createBlock(resolveDynamicComponent(n.ui.upload.name), mergeProps({ ref: "fileUploaderRef", "file-list": n.fileList, "onUpdate:fileList": r[0] || (r[0] = (c) => n.fileList = c) }, n.computedBinding), { default: withCtx(() => [ (openBlock(), createBlock(resolveDynamicComponent(n.computedFileSelectBtn.is), normalizeProps(guardReactiveProps(n.computedFileSelectBtn)), null, 16)) ]), _: 1 }, 16, ["file-list"])), n.isPicture() ? (openBlock(), createBlock(resolveDynamicComponent(n.ui.dialog.name), mergeProps({ key: 0, [n.ui.dialog.visible]: n.previewVisible, ["onUpdate:" + n.ui.dialog.visible]: r[1] || (r[1] = (c) => n.previewVisible = c) }, n.computedPreview), { default: withCtx(() => [ createBaseVNode("img", { style: { "max-width": "100%", "max-height": "100%" }, src: n.previewImage }, null, 8, Ce) ]), _: 1 }, 16)) : createCommentVNode("", true) ], 2); } var ke = ge(Ve, [["render", Ie]]); export { ke as default }; //# sourceMappingURL=fs-file-uploader-506e96b9-RGNPV737.js.map