UNPKG

@opensig/opendesign

Version:

393 lines (392 loc) 14.3 kB
"use strict"; const vue = require("vue"); const types = require("./types.js"); const is = require("../_utils/is.js"); const vueUtils = require("../_utils/vue-utils.js"); const UploadItem_vue_vue_type_script_setup_true_lang = require("./UploadItem.vue.js"); const slot = require("./slot.js"); const util = require("./util.js"); const UploadSelect_vue_vue_type_script_setup_true_lang = require("./UploadSelect.vue.js"); const icons = require("../_utils/icons.js"); const InputSelect_vue_vue_type_script_setup_true_lang = require("./InputSelect.vue.js"); const provide = require("../form/provide.js"); const index = require("../locale/index.js"); const log = require("../_utils/log.js"); const _hoisted_1 = { key: 0, class: "o-upload-select-wrap" }; const _hoisted_2 = { key: 0, class: "o-upload-select-extra" }; const _hoisted_3 = { class: "o-upload-card-label" }; const _sfc_main = /* @__PURE__ */ vue.defineComponent({ __name: "OUpload", props: types.uploadProps, emits: ["progress", "success", "error", "change", "select", "update:modelValue", "itemRemove", "itemRetry", "itemReplace", "itemPreview", "itemClick", "download"], setup(__props, { expose: __expose, emit: __emit }) { const props = __props; const slots = vue.useSlots(); const emits = __emit; const emitUpdateValue = (value) => { emits("update:modelValue", value); }; const { t } = index.useI18n(); const fileList = vue.ref(props.modelValue ?? props.defaultFileList ?? []); vue.watch( () => props.modelValue, (v) => { if (fileList.value === v) { return; } if (is.isArray(v)) { fileList.value = [...v]; } else { fileList.value = []; } } ); const formItemInjection = vue.inject(provide.formItemInjectKey, null); let fileId = 1; const uploadOption = vue.computed(() => { return { uploadRequest: props.uploadRequest, onBeforeUpload: props.onBeforeUpload, onProgress: (file) => { emits("progress", file); }, onSuccess: (file) => { emits("success", file); emitUpdateValue(fileList.value); emits("change", fileList.value); }, onError: (file) => { emits("error", file); emitUpdateValue(fileList.value); emits("change", fileList.value); } }; }); const selectRef = vue.ref(null); let replaceId = ""; const uploadAll = () => { return util.doUploadFileList(fileList.value, uploadOption.value); }; const afterSelected = (files) => { var _a, _b, _c, _d, _e, _f, _g; if (replaceId) { const idx = fileList.value.findIndex((item) => item.id === replaceId); if (idx > -1) { const f = fileList.value[idx]; (_a = f.request) == null ? void 0 : _a.abort(); fileList.value[idx] = files[0]; replaceId = ""; emitUpdateValue(fileList.value); emits("select", fileList.value); (_c = formItemInjection == null ? void 0 : (_b = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _c.call(_b); if (!props.lazyUpload) { util.doUploadFile(fileList.value[idx], uploadOption.value); } } } else { let s = fileList.value.length; let l = files.length; if (props.multiple) { fileList.value = fileList.value.concat(files); } else { (_e = (_d = fileList.value[0]) == null ? void 0 : _d.request) == null ? void 0 : _e.abort(); fileList.value = files; s = 0; l = 1; } emitUpdateValue(fileList.value); emits("select", fileList.value); (_g = formItemInjection == null ? void 0 : (_f = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _g.call(_f); if (!props.lazyUpload) { util.doUploadFileList(fileList.value.slice(s, s + l), uploadOption.value); } } }; const onFileSelected = async (files) => { let list = []; const isPicture = util.isPictureType(props.listType); if (is.isFunction(props.onAfterSelect)) { list = await props.onAfterSelect(files); if (isPicture) { list.forEach((item) => { if (!item.imgUrl && item.file) { item.imgUrl = util.generateImageDataUrl(item.file); } }); } } else { list = Array.from(files).map((item) => { return { id: `${fileId++}`, name: item.name, file: item, imgUrl: isPicture ? util.generateImageDataUrl(item) : "" }; }); } afterSelected(list); }; const doRemoveFile = async (file) => { var _a, _b, _c; if (is.isFunction(props.onBeforeRemove)) { const sure = await props.onBeforeRemove(file); if (sure === false) { return false; } } (_a = file.request) == null ? void 0 : _a.abort(); const index2 = fileList.value.findIndex((item) => item.id === file.id); fileList.value.splice(index2, 1); (_c = formItemInjection == null ? void 0 : (_b = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _c.call(_b); emitUpdateValue(fileList.value); return true; }; const removeFileByIndex = (index2) => { if (index2 < 0 && index2 >= fileList.value.length) { return; } doRemoveFile(fileList.value[index2]); }; const removeById = (id) => { const index2 = fileList.value.findIndex((item) => item.id === id); removeFileByIndex(index2); }; const removeAllFiles = () => { return new Promise((resolve) => { Promise.allSettled(fileList.value.map((f) => doRemoveFile(f))).then((res) => { resolve(res); fileList.value = []; emitUpdateValue(fileList.value); emits("change", fileList.value); }); }); }; const onRemoveFile = (file, e) => { doRemoveFile(file).then(() => { emits("itemRemove", file, e); emits("change", fileList.value); }); }; const doRetryUpload = (file, force) => { var _a, _b; if (!file.file) { log.log.warn("retry file not found!"); return; } if (!file.retry && !force) { return; } util.doUploadFile(file, uploadOption.value); (_b = formItemInjection == null ? void 0 : (_a = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _b.call(_a); }; const onFileUploadRetry = (file, e) => { doRetryUpload(file); emits("itemRetry", file, e); }; const doReplaceFile = (file) => { var _a; replaceId = file.id; (_a = selectRef.value) == null ? void 0 : _a.select(false); }; const replaceByIndex = (index2, newFile) => { var _a, _b, _c; const file = fileList.value[index2]; if (!file) { log.log.warn("file not found!"); } (_a = file.request) == null ? void 0 : _a.abort(); if (newFile) { fileList.value.splice(index2, 1, newFile); emits("change", fileList.value); (_c = formItemInjection == null ? void 0 : (_b = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _c.call(_b); } else { doReplaceFile(file); } }; const replaceById = (id, newFile) => { const index2 = fileList.value.findIndex((item) => item.id === id); replaceByIndex(index2, newFile); }; const onFileReplace = (file, e) => { var _a, _b; doReplaceFile(file); emits("itemReplace", file, e); (_b = formItemInjection == null ? void 0 : (_a = formItemInjection.fieldHandlers).onChange) == null ? void 0 : _b.call(_a); }; const doSelect = async () => { var _a; if (is.isFunction(props.beforeSelect)) { const goon = await props.beforeSelect(fileList.value); if (goon === false) { return; } } (_a = selectRef.value) == null ? void 0 : _a.select(props.multiple); }; const onUploadItemLabelClick = (file, e) => { emits("itemClick", file, e); }; const onFilePreview = (file, e) => { emits("itemPreview", file, e); }; const uploadItems = vue.useTemplateRef("uploadItems"); const previewItemByIndex = (index2) => { var _a; const item = (_a = uploadItems.value) == null ? void 0 : _a[index2]; item == null ? void 0 : item.preview(); }; const previewItemById = (id) => { const idx = fileList.value.findIndex((item) => item.id === id); previewItemByIndex(idx); }; const onFileDownload = (file, e) => { if (is.isFunction(props.downloadFile)) { if (file.file) { props.downloadFile(file.file); } } emits("download", file, e); }; __expose({ upload: uploadAll, select: doSelect, retry: doRetryUpload, replace: doReplaceFile, replaceById, replaceByIndex, removeById, removeByIndex: removeFileByIndex, removeAll: removeAllFiles, previewItemByIndex, previewItemById }); return (_ctx, _cache) => { return vue.openBlock(), vue.createElementBlock( "div", { class: vue.normalizeClass(["o-upload", { "o-upload-draggable": _ctx.draggable }]) }, [ vue.createVNode(InputSelect_vue_vue_type_script_setup_true_lang, { ref_key: "selectRef", ref: selectRef, accept: props.accept, disabled: props.disabled, onSelected: onFileSelected }, null, 8, ["accept", "disabled"]), ["text", "picture"].includes(props.listType) ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [ vue.createVNode(UploadSelect_vue_vue_type_script_setup_true_lang, { disabled: props.disabled, draggable: props.draggable, "btn-label": props.btnLabel, "drag-label": props.dragLabel, "drag-hover-label": props.dragHoverLabel, onToSelect: doSelect, onSelected: onFileSelected }, vue.createSlots({ _: 2 /* DYNAMIC */ }, [ vue.renderList(vue.unref(vueUtils.filterSlots)(slots, vue.unref(slot).names), (name) => { return { name, fn: vue.withCtx((slotData) => [ vue.renderSlot(_ctx.$slots, name, vue.normalizeProps(vue.guardReactiveProps(slotData))) ]) }; }) ]), 1032, ["disabled", "draggable", "btn-label", "drag-label", "drag-hover-label"]), slots["select-extra"] ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [ vue.renderSlot(_ctx.$slots, "select-extra") ])) : vue.createCommentVNode("v-if", true) ])) : vue.createCommentVNode("v-if", true), vue.createElementVNode( "div", { class: vue.normalizeClass(["o-upload-list", { "o-upload-card-list": props.listType === "picture-card" }]) }, [ (vue.openBlock(true), vue.createElementBlock( vue.Fragment, null, vue.renderList(fileList.value, (item) => { return vue.openBlock(), vue.createBlock(UploadItem_vue_vue_type_script_setup_true_lang, { ref_for: true, ref_key: "uploadItems", ref: uploadItems, key: item.id, file: item, "list-type": props.listType, "show-progress": props.showProgress, draggable: props.draggable, onRemove: onRemoveFile, onRetry: onFileUploadRetry, onReplace: onFileReplace, onPreview: onFilePreview, onItemClick: onUploadItemLabelClick, onDownload: onFileDownload }, vue.createSlots({ _: 2 /* DYNAMIC */ }, [ vue.renderList(vue.unref(vueUtils.filterSlots)(slots, vue.unref(slot).names), (name) => { return { name, fn: vue.withCtx((slotData) => [ vue.renderSlot(_ctx.$slots, name, vue.mergeProps({ ref_for: true }, slotData)) ]) }; }) ]), 1032, ["file", "list-type", "show-progress", "draggable"]); }), 128 /* KEYED_FRAGMENT */ )), props.listType === "picture-card" ? (vue.openBlock(), vue.createElementBlock( "div", { key: 0, class: vue.normalizeClass(["o-upload-card-add", { "is-disabled": props.disabled }]), onClick: doSelect }, [ vue.createElementVNode("div", null, [ vue.renderSlot(_ctx.$slots, "select-add", {}, () => [ vue.createVNode(vue.unref(icons.IconAdd), { class: "o-upload-card-add-icon" }), vue.createElementVNode("div", _hoisted_3, [ vue.renderSlot(_ctx.$slots, "select-add-label", {}, () => [ vue.createTextVNode( vue.toDisplayString(props.btnLabel ?? vue.unref(t)("upload.buttonLabel")), 1 /* TEXT */ ) ]) ]) ]) ]) ], 2 /* CLASS */ )) : vue.createCommentVNode("v-if", true) ], 2 /* CLASS */ ) ], 2 /* CLASS */ ); }; } }); module.exports = _sfc_main;