You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
458 lines
11 KiB
458 lines
11 KiB
"use strict";
|
|
|
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
|
|
exports.__esModule = true;
|
|
exports.default = void 0;
|
|
|
|
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
|
|
|
|
var _utils = require("../utils");
|
|
|
|
var _utils2 = require("./utils");
|
|
|
|
var _field = require("../mixins/field");
|
|
|
|
var _icon = _interopRequireDefault(require("../icon"));
|
|
|
|
var _image = _interopRequireDefault(require("../image"));
|
|
|
|
var _loading = _interopRequireDefault(require("../loading"));
|
|
|
|
var _imagePreview = _interopRequireDefault(require("../image-preview"));
|
|
|
|
// Utils
|
|
// Mixins
|
|
// Components
|
|
var _createNamespace = (0, _utils.createNamespace)('uploader'),
|
|
createComponent = _createNamespace[0],
|
|
bem = _createNamespace[1];
|
|
|
|
var _default2 = createComponent({
|
|
inheritAttrs: false,
|
|
mixins: [_field.FieldMixin],
|
|
model: {
|
|
prop: 'fileList'
|
|
},
|
|
props: {
|
|
disabled: Boolean,
|
|
lazyLoad: Boolean,
|
|
uploadText: String,
|
|
afterRead: Function,
|
|
beforeRead: Function,
|
|
beforeDelete: Function,
|
|
previewSize: [Number, String],
|
|
previewOptions: Object,
|
|
name: {
|
|
type: [Number, String],
|
|
default: ''
|
|
},
|
|
accept: {
|
|
type: String,
|
|
default: 'image/*'
|
|
},
|
|
fileList: {
|
|
type: Array,
|
|
default: function _default() {
|
|
return [];
|
|
}
|
|
},
|
|
maxSize: {
|
|
type: [Number, String],
|
|
default: Number.MAX_VALUE
|
|
},
|
|
maxCount: {
|
|
type: [Number, String],
|
|
default: Number.MAX_VALUE
|
|
},
|
|
deletable: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
showUpload: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
previewImage: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
previewFullImage: {
|
|
type: Boolean,
|
|
default: true
|
|
},
|
|
imageFit: {
|
|
type: String,
|
|
default: 'cover'
|
|
},
|
|
resultType: {
|
|
type: String,
|
|
default: 'dataUrl'
|
|
},
|
|
uploadIcon: {
|
|
type: String,
|
|
default: 'photograph'
|
|
}
|
|
},
|
|
computed: {
|
|
previewSizeWithUnit: function previewSizeWithUnit() {
|
|
return (0, _utils.addUnit)(this.previewSize);
|
|
},
|
|
// for form
|
|
value: function value() {
|
|
return this.fileList;
|
|
}
|
|
},
|
|
methods: {
|
|
getDetail: function getDetail(index) {
|
|
if (index === void 0) {
|
|
index = this.fileList.length;
|
|
}
|
|
|
|
return {
|
|
name: this.name,
|
|
index: index
|
|
};
|
|
},
|
|
onChange: function onChange(event) {
|
|
var _this = this;
|
|
|
|
var files = event.target.files;
|
|
|
|
if (this.disabled || !files.length) {
|
|
return;
|
|
}
|
|
|
|
files = files.length === 1 ? files[0] : [].slice.call(files);
|
|
|
|
if (this.beforeRead) {
|
|
var response = this.beforeRead(files, this.getDetail());
|
|
|
|
if (!response) {
|
|
this.resetInput();
|
|
return;
|
|
}
|
|
|
|
if ((0, _utils.isPromise)(response)) {
|
|
response.then(function (data) {
|
|
if (data) {
|
|
_this.readFile(data);
|
|
} else {
|
|
_this.readFile(files);
|
|
}
|
|
}).catch(this.resetInput);
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.readFile(files);
|
|
},
|
|
readFile: function readFile(files) {
|
|
var _this2 = this;
|
|
|
|
var oversize = (0, _utils2.isOversize)(files, this.maxSize);
|
|
|
|
if (Array.isArray(files)) {
|
|
var maxCount = this.maxCount - this.fileList.length;
|
|
|
|
if (files.length > maxCount) {
|
|
files = files.slice(0, maxCount);
|
|
}
|
|
|
|
Promise.all(files.map(function (file) {
|
|
return (0, _utils2.readFile)(file, _this2.resultType);
|
|
})).then(function (contents) {
|
|
var fileList = files.map(function (file, index) {
|
|
var result = {
|
|
file: file,
|
|
status: '',
|
|
message: ''
|
|
};
|
|
|
|
if (contents[index]) {
|
|
result.content = contents[index];
|
|
}
|
|
|
|
return result;
|
|
});
|
|
|
|
_this2.onAfterRead(fileList, oversize);
|
|
});
|
|
} else {
|
|
(0, _utils2.readFile)(files, this.resultType).then(function (content) {
|
|
var result = {
|
|
file: files,
|
|
status: '',
|
|
message: ''
|
|
};
|
|
|
|
if (content) {
|
|
result.content = content;
|
|
}
|
|
|
|
_this2.onAfterRead(result, oversize);
|
|
});
|
|
}
|
|
},
|
|
onAfterRead: function onAfterRead(files, oversize) {
|
|
var _this3 = this;
|
|
|
|
this.resetInput();
|
|
var validFiles = files;
|
|
|
|
if (oversize) {
|
|
var oversizeFiles = files;
|
|
|
|
if (Array.isArray(files)) {
|
|
oversizeFiles = [];
|
|
validFiles = [];
|
|
files.forEach(function (item) {
|
|
if (item.file) {
|
|
if (item.file.size > _this3.maxSize) {
|
|
oversizeFiles.push(item);
|
|
} else {
|
|
validFiles.push(item);
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
validFiles = null;
|
|
}
|
|
|
|
this.$emit('oversize', oversizeFiles, this.getDetail());
|
|
}
|
|
|
|
var isValidFiles = Array.isArray(validFiles) ? Boolean(validFiles.length) : Boolean(validFiles);
|
|
|
|
if (isValidFiles) {
|
|
this.$emit('input', [].concat(this.fileList, (0, _utils2.toArray)(validFiles)));
|
|
|
|
if (this.afterRead) {
|
|
this.afterRead(validFiles, this.getDetail());
|
|
}
|
|
}
|
|
},
|
|
onDelete: function onDelete(file, index) {
|
|
var _this4 = this;
|
|
|
|
if (this.beforeDelete) {
|
|
var response = this.beforeDelete(file, this.getDetail(index));
|
|
|
|
if (!response) {
|
|
return;
|
|
}
|
|
|
|
if ((0, _utils.isPromise)(response)) {
|
|
response.then(function () {
|
|
_this4.deleteFile(file, index);
|
|
}).catch(_utils.noop);
|
|
return;
|
|
}
|
|
}
|
|
|
|
this.deleteFile(file, index);
|
|
},
|
|
deleteFile: function deleteFile(file, index) {
|
|
var fileList = this.fileList.slice(0);
|
|
fileList.splice(index, 1);
|
|
this.$emit('input', fileList);
|
|
this.$emit('delete', file, this.getDetail(index));
|
|
},
|
|
resetInput: function resetInput() {
|
|
/* istanbul ignore else */
|
|
if (this.$refs.input) {
|
|
this.$refs.input.value = '';
|
|
}
|
|
},
|
|
onPreviewImage: function onPreviewImage(item) {
|
|
var _this5 = this;
|
|
|
|
if (!this.previewFullImage) {
|
|
return;
|
|
}
|
|
|
|
var imageFiles = this.fileList.filter(function (item) {
|
|
return (0, _utils2.isImageFile)(item);
|
|
});
|
|
var imageContents = imageFiles.map(function (item) {
|
|
return item.content || item.url;
|
|
});
|
|
this.imagePreview = (0, _imagePreview.default)((0, _extends2.default)({
|
|
images: imageContents,
|
|
startPosition: imageFiles.indexOf(item),
|
|
onClose: function onClose() {
|
|
_this5.$emit('close-preview');
|
|
}
|
|
}, this.previewOptions));
|
|
},
|
|
// @exposed-api
|
|
closeImagePreview: function closeImagePreview() {
|
|
if (this.imagePreview) {
|
|
this.imagePreview.close();
|
|
}
|
|
},
|
|
// @exposed-api
|
|
chooseFile: function chooseFile() {
|
|
if (this.disabled) {
|
|
return;
|
|
}
|
|
/* istanbul ignore else */
|
|
|
|
|
|
if (this.$refs.input) {
|
|
this.$refs.input.click();
|
|
}
|
|
},
|
|
genPreviewMask: function genPreviewMask(item) {
|
|
var h = this.$createElement;
|
|
var status = item.status,
|
|
message = item.message;
|
|
|
|
if (status === 'uploading' || status === 'failed') {
|
|
var MaskIcon = status === 'failed' ? h(_icon.default, {
|
|
"attrs": {
|
|
"name": "close"
|
|
},
|
|
"class": bem('mask-icon')
|
|
}) : h(_loading.default, {
|
|
"class": bem('loading')
|
|
});
|
|
var showMessage = (0, _utils.isDef)(message) && message !== '';
|
|
return h("div", {
|
|
"class": bem('mask')
|
|
}, [MaskIcon, showMessage && h("div", {
|
|
"class": bem('mask-message')
|
|
}, [message])]);
|
|
}
|
|
},
|
|
genPreviewItem: function genPreviewItem(item, index) {
|
|
var _this6 = this;
|
|
|
|
var h = this.$createElement;
|
|
var showDelete = item.status !== 'uploading' && this.deletable;
|
|
var DeleteIcon = showDelete && h("div", {
|
|
"class": bem('preview-delete'),
|
|
"on": {
|
|
"click": function click(event) {
|
|
event.stopPropagation();
|
|
|
|
_this6.onDelete(item, index);
|
|
}
|
|
}
|
|
}, [h(_icon.default, {
|
|
"attrs": {
|
|
"name": "cross"
|
|
},
|
|
"class": bem('preview-delete-icon')
|
|
})]);
|
|
var PreviewCoverContent = this.slots('preview-cover', (0, _extends2.default)({
|
|
index: index
|
|
}, item));
|
|
var PreviewCover = PreviewCoverContent && h("div", {
|
|
"class": bem('preview-cover')
|
|
}, [PreviewCoverContent]);
|
|
var Preview = (0, _utils2.isImageFile)(item) ? h(_image.default, {
|
|
"attrs": {
|
|
"fit": this.imageFit,
|
|
"src": item.content || item.url,
|
|
"width": this.previewSize,
|
|
"height": this.previewSize,
|
|
"lazyLoad": this.lazyLoad
|
|
},
|
|
"class": bem('preview-image'),
|
|
"on": {
|
|
"click": function click() {
|
|
_this6.onPreviewImage(item);
|
|
}
|
|
}
|
|
}, [PreviewCover]) : h("div", {
|
|
"class": bem('file'),
|
|
"style": {
|
|
width: this.previewSizeWithUnit,
|
|
height: this.previewSizeWithUnit
|
|
}
|
|
}, [h(_icon.default, {
|
|
"class": bem('file-icon'),
|
|
"attrs": {
|
|
"name": "description"
|
|
}
|
|
}), h("div", {
|
|
"class": [bem('file-name'), 'van-ellipsis']
|
|
}, [item.file ? item.file.name : item.url]), PreviewCover]);
|
|
return h("div", {
|
|
"class": bem('preview'),
|
|
"on": {
|
|
"click": function click() {
|
|
_this6.$emit('click-preview', item, _this6.getDetail(index));
|
|
}
|
|
}
|
|
}, [Preview, this.genPreviewMask(item), DeleteIcon]);
|
|
},
|
|
genPreviewList: function genPreviewList() {
|
|
if (this.previewImage) {
|
|
return this.fileList.map(this.genPreviewItem);
|
|
}
|
|
},
|
|
genUpload: function genUpload() {
|
|
var h = this.$createElement;
|
|
|
|
if (this.fileList.length >= this.maxCount || !this.showUpload) {
|
|
return;
|
|
}
|
|
|
|
var slot = this.slots();
|
|
var Input = h("input", {
|
|
"attrs": (0, _extends2.default)({}, this.$attrs, {
|
|
"type": "file",
|
|
"accept": this.accept,
|
|
"disabled": this.disabled
|
|
}),
|
|
"ref": "input",
|
|
"class": bem('input'),
|
|
"on": {
|
|
"change": this.onChange
|
|
}
|
|
});
|
|
|
|
if (slot) {
|
|
return h("div", {
|
|
"class": bem('input-wrapper')
|
|
}, [slot, Input]);
|
|
}
|
|
|
|
var style;
|
|
|
|
if (this.previewSize) {
|
|
var size = this.previewSizeWithUnit;
|
|
style = {
|
|
width: size,
|
|
height: size
|
|
};
|
|
}
|
|
|
|
return h("div", {
|
|
"class": bem('upload'),
|
|
"style": style
|
|
}, [h(_icon.default, {
|
|
"attrs": {
|
|
"name": this.uploadIcon
|
|
},
|
|
"class": bem('upload-icon')
|
|
}), this.uploadText && h("span", {
|
|
"class": bem('upload-text')
|
|
}, [this.uploadText]), Input]);
|
|
}
|
|
},
|
|
render: function render() {
|
|
var h = arguments[0];
|
|
return h("div", {
|
|
"class": bem()
|
|
}, [h("div", {
|
|
"class": bem('wrapper', {
|
|
disabled: this.disabled
|
|
})
|
|
}, [this.genPreviewList(), this.genUpload()])]);
|
|
}
|
|
});
|
|
|
|
exports.default = _default2; |