AkauntingDropzpneFileUpload feature added.

This commit is contained in:
Cüneyt Şentürk 2021-01-18 11:24:51 +03:00
parent 9fe6d0df22
commit c0b685328e
3 changed files with 213 additions and 31 deletions

View File

@ -0,0 +1,194 @@
<template>
<div class="dropzone mb-3 dz-clickable" :class="[isPreviewSingle ? 'dropzone-single': 'dropzone-multiple']">
<div class="fallback">
<div class="custom-file">
<input type="file" class="custom-file-input" :id="'projectCoverUploads' + _uid" :multiple="multiple">
<label class="custom-file-label" :for="'projectCoverUploads' + _uid">{{ textChooseFile }}</label>
</div>
</div>
<div v-if="isPreviewSingle" class="dz-preview dz-preview-single" :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>
import Dropzone from 'dropzone';
Dropzone.autoDiscover = false;
export default {
name: 'akaunting-dropzone-file-upload',
props: {
textChooseFile: {
type: String,
default: 'Choose File',
description: 'Choose file text'
},
options: {
type: Object,
default: () => ({})
},
value: [String, Object, Array],
url: {
type: String,
default: 'http:'
},
multiple: {
type: Boolean,
default: false,
description: 'Multiple file Upload'
},
previewClasses: [String, Object, Array],
isPreviewSingle: {
type: Boolean,
default: true
},
},
model: {
prop: 'value',
event: 'change'
},
data() {
return {
currentFile: null,
files: [],
showList: false,
}
},
methods: {
async initDropzone() {
let self = this;
let preview = this.isPreviewSingle ? this.$refs.previewSingle : this.$refs.previewMultiple;
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);
});
}
};
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',
];
evtList.forEach(evt => {
this.dropzone.on(evt, (file) => {
this.$emit(evt, file);
/*
if (evt === 'addedfile') {
if (self.multiple) {
this.files.push(file);
this.$emit('change', this.files);
} else {
this.file = file;
this.$emit('change', file);
}
}
*/
if (evt === 'removedfile') {
//if (self.multiple) {
let index = this.files.findIndex(f => f.upload.uuid === file.upload.uuid);
if (index !== -1) {
this.files.splice(index, 1);
}
this.$emit('change', this.files);
//} else {
// this.file = '';
// this.$emit('change', '');
//}
}
})
}, this);
}
},
async mounted() {
this.initDropzone();
},
}
</script>
<style>
</style>

View File

@ -1,6 +1,6 @@
<template> <template>
<div class="dropzone mb-3 dz-clickable" <div class="dropzone mb-3 dz-clickable"
:class="[isPreviewSingle ? 'dropzone-single': 'dropzone-multiple']"> :class="[multiple ? 'dropzone-multiple': 'dropzone-single']">
<div class="fallback"> <div class="fallback">
<div class="custom-file"> <div class="custom-file">
<input type="file" <input type="file"
@ -11,7 +11,7 @@
</div> </div>
</div> </div>
<div class="dz-preview dz-preview-single" <div class="dz-preview dz-preview-single"
v-if="isPreviewSingle" v-if="!multiple"
:class="previewClasses" :class="previewClasses"
ref="previewSingle"> ref="previewSingle">
<div class="dz-preview-cover"> <div class="dz-preview-cover">
@ -44,6 +44,10 @@
</div> </div>
</template> </template>
<script> <script>
import Dropzone from 'dropzone';
Dropzone.autoDiscover = false;
export default { export default {
name: 'dropzone-file-upload', name: 'dropzone-file-upload',
props: { props: {
@ -57,11 +61,7 @@
default: 'http://' default: 'http://'
}, },
multiple: Boolean, multiple: Boolean,
previewClasses: [String, Object, Array], previewClasses: [String, Object, Array]
isPreviewSingle: {
type: Boolean,
default: true
}
}, },
model: { model: {
prop: 'value', prop: 'value',
@ -76,12 +76,8 @@
}, },
methods: { methods: {
async initDropzone() { async initDropzone() {
let Dropzone = await import('dropzone') let preview = this.multiple ? this.$refs.previewMultiple : this.$refs.previewSingle;
Dropzone = Dropzone.default || Dropzone
Dropzone.autoDiscover = false
let preview = this.isPreviewSingle ? this.$refs.previewSingle : this.$refs.previewMultiple;
let self = this let self = this
let finalOptions = { let finalOptions = {
...this.options, ...this.options,
url: this.url, url: this.url,
@ -89,41 +85,33 @@
thumbnailHeight: null, thumbnailHeight: null,
previewsContainer: preview, previewsContainer: preview,
previewTemplate: preview.innerHTML, previewTemplate: preview.innerHTML,
maxFiles: (!this.multiple) ? 1 : null,
acceptedFiles: (!this.multiple) ? 'image/*' : null,
init: function () { init: function () {
this.on("addedfile", function (file) { this.on("addedfile", function (file) {
self.files.push(file) if (!self.multiple && self.currentFile) {
// this.removeFile(this.currentFile);
if (self.options.maxFiles == 1) {
self.$emit('change', file)
} else {
self.$emit('change', this.files)
} }
}), self.currentFile = file;
this.on("maxfilesexceeded", function(file) {
this.removeAllFiles('notCancel')
this.addFile(file)
}) })
} }
} }
this.dropzone = new Dropzone(this.$el, finalOptions) this.dropzone = new Dropzone(this.$el, finalOptions)
preview.innerHTML = '' 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'] 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']
evtList.forEach(evt => { evtList.forEach(evt => {
this.dropzone.on(evt, (data) => { this.dropzone.on(evt, (data) => {
this.$emit(evt, data); this.$emit(evt, data);
if (evt === 'removedfile') { if (evt === 'addedfile') {
this.files.push(data)
this.$emit('change', this.files);
} else if (evt === 'removedfile') {
let index = this.files.findIndex(f => f.upload.uuid === data.upload.uuid) let index = this.files.findIndex(f => f.upload.uuid === data.upload.uuid)
if (index !== -1) { if (index !== -1) {
this.files.splice(index, 1); this.files.splice(index, 1);
} }
this.$emit('change', this.files); this.$emit('change', this.files);
} }
}) })
}) })

View File

@ -8,7 +8,7 @@
@endif @endif
<div class="input-group input-group-merge"> <div class="input-group input-group-merge">
<dropzone-file-upload <akaunting-dropzone-file-upload
@if (!empty($attributes['dropzone-class'])) @if (!empty($attributes['dropzone-class']))
class="{{ $attributes['dropzone-class'] }}" class="{{ $attributes['dropzone-class'] }}"
@endif @endif
@ -22,7 +22,7 @@
:is-preview-single="{{ $attributes['isPreviewSingle'] }}" :is-preview-single="{{ $attributes['isPreviewSingle'] }}"
@endif @endif
v-model="{{ !empty($attributes['v-model']) ? $attributes['v-model'] : (!empty($attributes['data-field']) ? 'form.' . $attributes['data-field'] . '.'. $name : 'form.' . $name) }}" v-model="{{ !empty($attributes['v-model']) ? $attributes['v-model'] : (!empty($attributes['data-field']) ? 'form.' . $attributes['data-field'] . '.'. $name : 'form.' . $name) }}"
></dropzone-file-upload> ></akaunting-dropzone-file-upload>
</div> </div>
<div class="invalid-feedback d-block" <div class="invalid-feedback d-block"