Merge "Add drag and drop file upload."

This commit is contained in:
Treehugger Robot
2021-07-13 18:01:13 +00:00
committed by Gerrit Code Review

View File

@@ -1,11 +1,19 @@
<template> <template>
<label class="file-select"> <label class="file-select ma-5">
<div class="select-button"> <div
<span v-if="label">{{ label }}</span> class="select-button"
@dragover="dragover"
@dragleave="dragleave"
@drop="drop"
>
<span v-if="label">{{ !fileName ? label : '' }}</span>
<span v-else>Select File</span> <span v-else>Select File</span>
<div v-if="fileName"> File selected: {{ fileName }}</div>
</div> </div>
<input <input
ref="file"
type="file" type="file"
accept=".zip"
@change="handleFileChange" @change="handleFileChange"
> >
</label> </label>
@@ -16,31 +24,53 @@ export default {
props: { props: {
label: { label: {
type: String, type: String,
default: '' default: '',
},
},
data() {
return {
fileName: '',
} }
}, },
methods: { methods: {
handleFileChange(e) { handleFileChange(event) {
this.$emit('file-select', e.target.files) this.$emit('file-select', this.$refs.file.files)
} this.fileName = this.$refs.file.files[0].name
} },
dragover(event) {
event.preventDefault()
if (!event.currentTarget.classList.contains('file-hover')) {
event.currentTarget.classList.add('file-hover')
}
},
dragleave(event) {
event.currentTarget.classList.remove('file-hover')
},
drop(event) {
event.preventDefault()
this.$refs.file.files = event.dataTransfer.files
this.handleFileChange(event)
event.currentTarget.classList.remove('file-hover')
},
},
} }
</script> </script>
<style scoped> <style scoped>
.file-select > .select-button { .file-select > .select-button {
padding: 1rem; padding: 3rem;
border-radius: 0.3rem;
color: white; border: 4px dashed #eaebec;
background-color: #2EA169;
border-radius: .3rem;
text-align: center; text-align: center;
font-weight: bold; font-weight: bold;
cursor: pointer;
} }
.file-select > input[type="file"] { .file-select > input[type='file'] {
display: none; display: none;
} }
.file-hover {
background-color: #95e995;
}
</style> </style>