71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Plaintext
		
	
	
<template>
 | 
						|
  <div
 | 
						|
    class="el-upload-dragger"
 | 
						|
    :class="{
 | 
						|
      'is-dragover': dragover
 | 
						|
    }"
 | 
						|
    @drop.prevent="onDrop"
 | 
						|
    @dragover.prevent="onDragover"
 | 
						|
    @dragleave.prevent="dragover = false"
 | 
						|
  >
 | 
						|
    <slot></slot>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
<script>
 | 
						|
  export default {
 | 
						|
    name: 'ElUploadDrag',
 | 
						|
    props: {
 | 
						|
      disabled: Boolean
 | 
						|
    },
 | 
						|
    inject: {
 | 
						|
      uploader: {
 | 
						|
        default: ''
 | 
						|
      }
 | 
						|
    },
 | 
						|
    data() {
 | 
						|
      return {
 | 
						|
        dragover: false
 | 
						|
      };
 | 
						|
    },
 | 
						|
    methods: {
 | 
						|
      onDragover() {
 | 
						|
        if (!this.disabled) {
 | 
						|
          this.dragover = true;
 | 
						|
        }
 | 
						|
      },
 | 
						|
      onDrop(e) {
 | 
						|
        if (this.disabled || !this.uploader) return;
 | 
						|
        const accept = this.uploader.accept;
 | 
						|
        this.dragover = false;
 | 
						|
        if (!accept) {
 | 
						|
          this.$emit('file', e.dataTransfer.files);
 | 
						|
          return;
 | 
						|
        }
 | 
						|
        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;
 | 
						|
            });
 | 
						|
        }));
 | 
						|
      }
 | 
						|
    }
 | 
						|
  };
 | 
						|
</script>
 | 
						|
 |