akaunting/resources/assets/js/components/Inputs/DropzoneFileUpload.vue

139 lines
4.1 KiB
Vue
Raw Normal View History

2019-11-16 10:21:14 +03:00
<template>
<div class="dropzone mb-3 dz-clickable"
2021-01-17 17:58:34 +03:00
:class="[isPreviewSingle ? 'dropzone-single': 'dropzone-multiple']">
2019-11-16 10:21:14 +03:00
<div class="fallback">
<div class="custom-file">
<input type="file"
class="custom-file-input"
id="projectCoverUploads"
:multiple="multiple">
<label class="custom-file-label" for="projectCoverUploads">Choose file</label>
</div>
</div>
<div class="dz-preview dz-preview-single"
2021-01-17 17:58:34 +03:00
v-if="isPreviewSingle"
2019-11-16 10:21:14 +03:00
:class="previewClasses"
ref="previewSingle">
<div class="dz-preview-cover">
<img class="dz-preview-img" data-dz-thumbnail>
</div>
</div>
<ul v-else
class="dz-preview dz-preview-multiple list-group list-group-lg list-group-flush"
:class="previewClasses"
ref="previewMultiple">
<li class="list-group-item px-0">
<div class="row align-items-center">
<div class="col-auto">
<div class="avatar">
<img class="avatar-img rounded" data-dz-thumbnail>
</div>
</div>
<div class="col ml--3">
<h4 class="mb-1" data-dz-name>...</h4>
<p class="small text-muted mb-0" data-dz-size>...</p>
</div>
<div class="col-auto">
<button data-dz-remove="true" class="btn btn-danger btn-sm">
<i class="fas fa-trash"></i>
</button>
</div>
</div>
</li>
</ul>
</div>
</template>
<script>
export default {
name: 'dropzone-file-upload',
props: {
options: {
type: Object,
default: () => ({})
},
value: [String, Object, Array],
url: {
type: String,
default: 'http://'
},
multiple: Boolean,
2021-01-17 17:58:34 +03:00
previewClasses: [String, Object, Array],
isPreviewSingle: {
type: Boolean,
default: true
}
2019-11-16 10:21:14 +03:00
},
model: {
prop: 'value',
event: 'change'
},
data() {
return {
currentFile: null,
files: [],
showList: false,
}
},
methods: {
async initDropzone() {
let Dropzone = await import('dropzone')
Dropzone = Dropzone.default || Dropzone
Dropzone.autoDiscover = false
2021-01-17 17:58:34 +03:00
let preview = this.isPreviewSingle ? this.$refs.previewSingle : this.$refs.previewMultiple;
2019-11-16 10:21:14 +03:00
let self = this
2019-11-16 10:21:14 +03:00
let finalOptions = {
...this.options,
url: this.url,
thumbnailWidth: null,
thumbnailHeight: null,
previewsContainer: preview,
previewTemplate: preview.innerHTML,
init: function () {
this.on("addedfile", function (file) {
self.files.push(file)
if (self.options.maxFiles == 1) {
self.$emit('change', file)
} else {
self.$emit('change', this.files)
}
}),
this.on("maxfilesexceeded", function(file) {
this.removeAllFiles('notCancel')
this.addFile(file)
2019-11-16 10:21:14 +03:00
})
}
}
2019-11-16 10:21:14 +03:00
this.dropzone = new Dropzone(this.$el, finalOptions)
preview.innerHTML = ''
let evtList = ['drop', 'dragstart', 'dragend', 'dragenter', 'dragover', 'addedfile', 'removedfile', 'thumbnail', 'error', 'processing', 'uploadprogress', 'sending', 'success', 'complete', 'canceled', 'maxfilesreached', 'maxfilesexceeded', 'processingmultiple', 'sendingmultiple', 'successmultiple', 'completemultiple', 'canceledmultiple', 'totaluploadprogress', 'reset', 'queuecomplete']
2019-11-16 10:21:14 +03:00
evtList.forEach(evt => {
this.dropzone.on(evt, (data) => {
this.$emit(evt, data);
if (evt === 'removedfile') {
2019-11-16 10:21:14 +03:00
let index = this.files.findIndex(f => f.upload.uuid === data.upload.uuid)
2019-11-16 10:21:14 +03:00
if (index !== -1) {
this.files.splice(index, 1);
}
2019-11-16 10:21:14 +03:00
this.$emit('change', this.files);
2019-11-16 10:21:14 +03:00
}
})
})
}
},
async mounted() {
this.initDropzone()
}
}
</script>
<style>
</style>