acdr-ui/dist/dev/mp-weixin/modules/mall/sheep/components/s-uploader/s-uploader.js

595 lines
17 KiB
JavaScript
Raw Normal View History

2024-09-19 07:20:14 +08:00
"use strict";
var __defProp = Object.defineProperty;
var __defProps = Object.defineProperties;
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __propIsEnum = Object.prototype.propertyIsEnumerable;
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
var __spreadValues = (a, b) => {
for (var prop in b || (b = {}))
if (__hasOwnProp.call(b, prop))
__defNormalProp(a, prop, b[prop]);
if (__getOwnPropSymbols)
for (var prop of __getOwnPropSymbols(b)) {
if (__propIsEnum.call(b, prop))
__defNormalProp(a, prop, b[prop]);
}
return a;
};
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
var __async = (__this, __arguments, generator) => {
return new Promise((resolve, reject) => {
var fulfilled = (value) => {
try {
step(generator.next(value));
} catch (e) {
reject(e);
}
};
var rejected = (value) => {
try {
step(generator.throw(value));
} catch (e) {
reject(e);
}
};
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
step((generator = generator.apply(__this, __arguments)).next());
});
};
2024-10-01 09:15:35 +08:00
const common_vendor = require("../../../../../common/vendor.js");
const modules_mall_sheep_components_sUploader_chooseAndUploadFile = require("./choose-and-upload-file.js");
const modules_mall_sheep_components_sUploader_utils = require("./utils.js");
const modules_mall_sheep_index = require("../../index.js");
2024-09-19 07:20:14 +08:00
const uploadImage = () => "./upload-image.js";
const uploadFile = () => "./upload-file.js";
const _sfc_main = {
name: "sUploader",
components: {
uploadImage,
uploadFile
},
options: {
virtualHost: true
},
emits: ["select", "success", "fail", "progress", "delete", "update:modelValue", "update:url"],
props: {
modelValue: {
type: [Array, Object],
default() {
return [];
}
},
url: {
type: [Array, String],
default() {
return [];
}
},
disabled: {
type: Boolean,
default: false
},
disablePreview: {
type: Boolean,
default: false
},
delIcon: {
type: Boolean,
default: true
},
// 自动上传
autoUpload: {
type: Boolean,
default: true
},
// 最大选择个数 h5只能限制单选或是多选
limit: {
type: [Number, String],
default: 9
},
// 列表样式 grid | list | list-card
mode: {
type: String,
default: "grid"
},
// 选择文件类型 image/video/all
fileMediatype: {
type: String,
default: "image"
},
// 文件类型筛选
fileExtname: {
type: [Array, String],
default() {
return [];
}
},
title: {
type: String,
default: ""
},
listStyles: {
type: Object,
default() {
return {
// 是否显示边框
border: true,
// 是否显示分隔线
dividline: true,
// 线条样式
borderStyle: {}
};
}
},
imageStyles: {
type: Object,
default() {
return {
width: "auto",
height: "auto"
};
}
},
readonly: {
type: Boolean,
default: false
},
sizeType: {
type: Array,
default() {
return ["original", "compressed"];
}
},
driver: {
type: String,
default: "local"
// local=本地 | oss | unicloud
},
subtitle: {
type: String,
default: ""
}
},
data() {
return {
files: [],
localValue: [],
2024-10-01 09:15:35 +08:00
imgsrc: modules_mall_sheep_index.sheep.$url.static("/static/img/shop/upload-camera.png")
2024-09-19 07:20:14 +08:00
};
},
watch: {
modelValue: {
handler(newVal, oldVal) {
this.setValue(newVal, oldVal);
},
immediate: true
}
},
computed: {
returnType() {
if (this.limit > 1) {
return "array";
}
return "object";
},
filesList() {
let files = [];
this.files.forEach((v) => {
files.push(v);
});
return files;
},
showType() {
if (this.fileMediatype === "image") {
return this.mode;
}
return "list";
},
limitLength() {
if (this.returnType === "object") {
return 1;
}
if (!this.limit) {
return 1;
}
if (this.limit >= 9) {
return 9;
}
return this.limit;
}
},
created() {
if (this.driver === "local") {
2024-10-01 09:15:35 +08:00
common_vendor.Ws.chooseAndUploadFile = modules_mall_sheep_components_sUploader_chooseAndUploadFile.chooseAndUploadFile;
2024-09-19 07:20:14 +08:00
}
this.form = this.getForm("uniForms");
this.formItem = this.getForm("uniFormsItem");
if (this.form && this.formItem) {
if (this.formItem.name) {
this.rename = this.formItem.name;
this.form.inputChildrens.push(this);
}
}
},
methods: {
/**
* 公开用户使用清空文件
* @param {Object} index
*/
clearFiles(index) {
if (index !== 0 && !index) {
this.files = [];
this.$nextTick(() => {
this.setEmit();
});
} else {
this.files.splice(index, 1);
}
this.$nextTick(() => {
this.setEmit();
});
},
/**
* 公开用户使用继续上传
*/
upload() {
let files = [];
this.files.forEach((v, index) => {
if (v.status === "ready" || v.status === "error") {
files.push(Object.assign({}, v));
}
});
return this.uploadFiles(files);
},
setValue(newVal, oldVal) {
return __async(this, null, function* () {
const newData = (v) => __async(this, null, function* () {
const reg = /cloud:\/\/([\w.]+\/?)\S*/;
let url = "";
if (v.fileID) {
url = v.fileID;
} else {
url = v.url;
}
if (reg.test(url)) {
v.fileID = url;
v.url = yield this.getTempFileURL(url);
}
if (v.url)
v.path = v.url;
return v;
});
if (this.returnType === "object") {
if (newVal) {
yield newData(newVal);
} else {
newVal = {};
}
} else {
if (!newVal)
newVal = [];
for (let i = 0; i < newVal.length; i++) {
let v = newVal[i];
yield newData(v);
}
}
this.localValue = newVal;
if (this.form && this.formItem && !this.is_reset) {
this.is_reset = false;
this.formItem.setValue(this.localValue);
}
let filesData = Object.keys(newVal).length > 0 ? newVal : [];
this.files = [].concat(filesData);
});
},
/**
* 选择文件
*/
choose() {
if (this.disabled)
return;
if (this.files.length >= Number(this.limitLength) && this.showType !== "grid" && this.returnType === "array") {
common_vendor.index.showToast({
title: `您最多选择 ${this.limitLength} 个文件`,
icon: "none"
});
return;
}
this.chooseFiles();
},
/**
* 选择文件并上传
*/
chooseFiles() {
2024-10-01 09:15:35 +08:00
const _extname = modules_mall_sheep_components_sUploader_utils.get_extname(this.fileExtname);
2024-09-19 07:20:14 +08:00
common_vendor.Ws.chooseAndUploadFile({
type: this.fileMediatype,
compressed: false,
sizeType: this.sizeType,
// TODO 如果为空video 有问题
extension: _extname.length > 0 ? _extname : void 0,
count: this.limitLength - this.files.length,
//默认9
onChooseFile: this.chooseFileCallback,
onUploadProgress: (progressEvent) => {
this.setProgress(progressEvent, progressEvent.index);
}
}).then((result) => {
this.setSuccessAndError(result.tempFiles);
}).catch((err) => {
console.log("选择失败", err);
});
},
/**
* 选择文件回调
* @param {Object} res
*/
chooseFileCallback(res) {
return __async(this, null, function* () {
2024-10-01 09:15:35 +08:00
const _extname = modules_mall_sheep_components_sUploader_utils.get_extname(this.fileExtname);
2024-09-19 07:20:14 +08:00
const is_one = Number(this.limitLength) === 1 && this.disablePreview && !this.disabled || this.returnType === "object";
if (is_one) {
this.files = [];
}
2024-10-01 09:15:35 +08:00
let { filePaths, files } = modules_mall_sheep_components_sUploader_utils.get_files_and_is_max(res, _extname);
2024-09-19 07:20:14 +08:00
if (!(_extname && _extname.length > 0)) {
filePaths = res.tempFilePaths;
files = res.tempFiles;
}
let currentData = [];
for (let i = 0; i < files.length; i++) {
if (this.limitLength - this.files.length <= 0)
break;
files[i].uuid = Date.now();
2024-10-01 09:15:35 +08:00
let filedata = yield modules_mall_sheep_components_sUploader_utils.get_file_data(files[i], this.fileMediatype);
2024-09-19 07:20:14 +08:00
filedata.progress = 0;
filedata.status = "ready";
this.files.push(filedata);
currentData.push(__spreadProps(__spreadValues({}, filedata), {
file: files[i]
}));
}
this.$emit("select", {
tempFiles: currentData,
tempFilePaths: filePaths
});
res.tempFiles = files;
if (!this.autoUpload) {
res.tempFiles = [];
}
});
},
/**
* 批传
* @param {Object} e
*/
uploadFiles(files) {
files = [].concat(files);
2024-10-01 09:15:35 +08:00
return modules_mall_sheep_components_sUploader_chooseAndUploadFile.uploadCloudFiles.call(this, files, 5, (res) => {
2024-09-19 07:20:14 +08:00
this.setProgress(res, res.index, true);
}).then((result) => {
this.setSuccessAndError(result);
return result;
}).catch((err) => {
console.log(err);
});
},
/**
* 成功或失败
*/
setSuccessAndError(res, fn) {
return __async(this, null, function* () {
let successData = [];
let errorData = [];
let tempFilePath = [];
let errorTempFilePath = [];
for (let i = 0; i < res.length; i++) {
const item = res[i];
const index = item.uuid ? this.files.findIndex((p) => p.uuid === item.uuid) : item.index;
if (index === -1 || !this.files)
break;
if (item.errMsg === "request:fail") {
this.files[index].url = item.path;
this.files[index].status = "error";
this.files[index].errMsg = item.errMsg;
errorData.push(this.files[index]);
errorTempFilePath.push(this.files[index].url);
} else {
this.files[index].errMsg = "";
this.files[index].fileID = item.url;
const reg = /cloud:\/\/([\w.]+\/?)\S*/;
if (reg.test(item.url)) {
this.files[index].url = yield this.getTempFileURL(item.url);
} else {
this.files[index].url = item.url;
}
this.files[index].status = "success";
this.files[index].progress += 1;
successData.push(this.files[index]);
tempFilePath.push(this.files[index].fileID);
}
}
if (successData.length > 0) {
this.setEmit();
this.$emit("success", {
tempFiles: this.backObject(successData),
tempFilePaths: tempFilePath
});
}
if (errorData.length > 0) {
this.$emit("fail", {
tempFiles: this.backObject(errorData),
tempFilePaths: errorTempFilePath
});
}
});
},
/**
* 获取进度
* @param {Object} progressEvent
* @param {Object} index
* @param {Object} type
*/
setProgress(progressEvent, index, type) {
this.files.length;
const percentCompleted = Math.round(progressEvent.loaded * 100 / progressEvent.total);
let idx = index;
if (!type) {
idx = this.files.findIndex((p) => p.uuid === progressEvent.tempFile.uuid);
}
if (idx === -1 || !this.files[idx])
return;
this.files[idx].progress = percentCompleted - 1;
this.$emit("progress", {
index: idx,
progress: parseInt(percentCompleted),
tempFile: this.files[idx]
});
},
/**
* 删除文件
* @param {Object} index
*/
delFile(index) {
this.$emit("delete", {
tempFile: this.files[index],
tempFilePath: this.files[index].url
});
this.files.splice(index, 1);
this.$nextTick(() => {
this.setEmit();
});
},
/**
* 获取文件名和后缀
* @param {Object} name
*/
getFileExt(name) {
const last_len = name.lastIndexOf(".");
const len = name.length;
return {
name: name.substring(0, last_len),
ext: name.substring(last_len + 1, len)
};
},
/**
* 处理返回事件
*/
setEmit() {
let data = [];
let updateUrl = [];
if (this.returnType === "object") {
data = this.backObject(this.files)[0];
this.localValue = data ? data : null;
updateUrl = data ? data.url : "";
} else {
data = this.backObject(this.files);
if (!this.localValue) {
this.localValue = [];
}
this.localValue = [...data];
if (this.localValue.length > 0) {
this.localValue.forEach((item) => {
updateUrl.push(item.url);
});
}
}
this.$emit("update:modelValue", this.localValue);
this.$emit("update:url", updateUrl);
},
/**
* 处理返回参数
* @param {Object} files
*/
backObject(files) {
let newFilesData = [];
files.forEach((v) => {
newFilesData.push({
extname: v.extname,
fileType: v.fileType,
image: v.image,
name: v.name,
path: v.path,
size: v.size,
fileID: v.fileID,
url: v.url
});
});
return newFilesData;
},
getTempFileURL(fileList) {
return __async(this, null, function* () {
fileList = {
fileList: [].concat(fileList)
};
const urls = yield common_vendor.Ws.getTempFileURL(fileList);
return urls.fileList[0].tempFileURL || "";
});
},
/**
* 获取父元素实例
*/
getForm(name = "uniForms") {
let parent = this.$parent;
let parentName = parent.$options.name;
while (parentName !== name) {
parent = parent.$parent;
if (!parent)
return false;
parentName = parent.$options.name;
}
return parent;
}
}
};
if (!Array) {
const _component_upload_image = common_vendor.resolveComponent("upload-image");
const _component_upload_file = common_vendor.resolveComponent("upload-file");
(_component_upload_image + _component_upload_file)();
}
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
return common_vendor.e({
a: $props.title
}, $props.title ? {
b: common_vendor.t($props.title),
c: common_vendor.t($options.filesList.length),
d: common_vendor.t($options.limitLength)
} : {}, {
e: $props.subtitle
}, $props.subtitle ? {
f: common_vendor.t($props.subtitle)
} : {}, {
g: $props.fileMediatype === "image" && $options.showType === "grid"
}, $props.fileMediatype === "image" && $options.showType === "grid" ? {
h: $data.imgsrc,
i: common_vendor.o($options.uploadFiles),
j: common_vendor.o($options.choose),
k: common_vendor.o($options.delFile),
l: common_vendor.p({
readonly: $props.readonly,
["image-styles"]: $props.imageStyles,
["files-list"]: $props.url,
limit: $options.limitLength,
disablePreview: $props.disablePreview,
delIcon: $props.delIcon
})
} : {}, {
m: $props.fileMediatype !== "image" || $options.showType !== "grid"
}, $props.fileMediatype !== "image" || $options.showType !== "grid" ? {
n: common_vendor.o($options.uploadFiles),
o: common_vendor.o($options.choose),
p: common_vendor.o($options.delFile),
q: common_vendor.p({
readonly: $props.readonly,
["list-styles"]: $props.listStyles,
["files-list"]: $options.filesList,
showType: $options.showType,
delIcon: $props.delIcon
})
} : {});
}
2024-10-01 09:15:35 +08:00
const Component = /* @__PURE__ */ common_vendor._export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-b91ace17"]]);
2024-09-19 07:20:14 +08:00
wx.createComponent(Component);