element/packages/upload/src/upload-dragger.vue

71 lines
1.7 KiB
Vue
Raw Normal View History

2017-01-09 05:30:42 +00:00
<template>
<div
class="el-upload-dragger"
:class="{
2017-02-15 13:16:30 +00:00
'is-dragover': dragover
2017-01-09 05:30:42 +00:00
}"
@drop.prevent="onDrop"
2017-04-21 03:57:30 +00:00
@dragover.prevent="onDragover"
2017-02-15 13:16:30 +00:00
@dragleave.prevent="dragover = false"
2017-01-09 05:30:42 +00:00
>
2017-02-12 16:44:57 +00:00
<slot></slot>
2017-01-09 05:30:42 +00:00
</div>
</template>
2017-01-03 03:34:44 +00:00
<script>
export default {
2017-02-12 16:44:57 +00:00
name: 'ElUploadDrag',
2017-04-21 03:57:30 +00:00
props: {
disabled: Boolean
},
inject: {
uploader: {
default: ''
}
},
2017-01-09 05:30:42 +00:00
data() {
return {
2017-02-15 13:16:30 +00:00
dragover: false
2017-01-09 05:30:42 +00:00
};
2017-01-03 03:34:44 +00:00
},
2017-01-09 05:30:42 +00:00
methods: {
2017-04-21 03:57:30 +00:00
onDragover() {
if (!this.disabled) {
this.dragover = true;
}
},
2017-01-09 05:30:42 +00:00
onDrop(e) {
if (this.disabled || !this.uploader) return;
const accept = this.uploader.accept;
this.dragover = false;
if (!accept) {
2017-04-21 03:57:30 +00:00
this.$emit('file', e.dataTransfer.files);
return;
2017-04-21 03:57:30 +00:00
}
this.$emit('file', [].slice.call(e.dataTransfer.files).filter(file => {
const { type, name } = file;
const extension = name.indexOf('.') > -1
? `.${ name.split('.').pop() }`
: '';
const baseType = type.replace(/\/.*$/, '');
return accept.split(',')
.map(type => type.trim())
.filter(type => type)
.some(acceptedType => {
if (/\..+$/.test(acceptedType)) {
return extension === acceptedType;
}
if (/\/\*$/.test(acceptedType)) {
return baseType === acceptedType.replace(/\/\*$/, '');
}
if (/^[^\/]+\/[^\/]+$/.test(acceptedType)) {
return type === acceptedType;
}
return false;
});
}));
2017-01-03 03:34:44 +00:00
}
}
};
</script>