mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2024-12-20 19:06:06 +01:00
107 lines
3.4 KiB
Vue
107 lines
3.4 KiB
Vue
|
<template>
|
||
|
<modals-modal v-model="show" name="upload-image" :width="500" :height="'unset'">
|
||
|
<div ref="container" class="w-full rounded-lg bg-primary box-shadow-md overflow-y-auto overflow-x-hidden" style="max-height: 80vh">
|
||
|
<div class="flex items-center">
|
||
|
<div class="w-40 pr-2 pt-4" style="min-width: 160px">
|
||
|
<ui-file-input ref="fileInput" @change="fileUploadSelected">Upload Cover</ui-file-input>
|
||
|
</div>
|
||
|
<form @submit.prevent="submitForm" class="flex flex-grow">
|
||
|
<ui-text-input-with-label v-model="imageUrl" label="Cover Image URL" />
|
||
|
<ui-btn color="success" type="submit" :padding-x="4" class="mt-5 ml-3 w-24">Update</ui-btn>
|
||
|
</form>
|
||
|
</div>
|
||
|
<div v-if="previewUpload" class="absolute top-0 left-0 w-full h-full z-10 bg-bg p-8">
|
||
|
<p class="text-lg">Preview Cover</p>
|
||
|
<span class="absolute top-4 right-4 material-icons text-2xl cursor-pointer" @click="resetCoverPreview">close</span>
|
||
|
<div class="flex justify-center py-4">
|
||
|
<covers-preview-cover :src="previewUpload" :width="240" />
|
||
|
</div>
|
||
|
<div class="absolute bottom-0 right-0 flex py-4 px-5">
|
||
|
<ui-btn :disabled="processingUpload" class="mx-2" @click="resetCoverPreview">Clear</ui-btn>
|
||
|
<ui-btn :loading="processingUpload" color="success" @click="submitCoverUpload">Upload</ui-btn>
|
||
|
</div>
|
||
|
</div>
|
||
|
</div>
|
||
|
</modals-modal>
|
||
|
</template>
|
||
|
|
||
|
<script>
|
||
|
export default {
|
||
|
props: {
|
||
|
value: Boolean,
|
||
|
entity: String,
|
||
|
entityId: String
|
||
|
},
|
||
|
data() {
|
||
|
return {
|
||
|
imageUrl: null,
|
||
|
previewUpload: null,
|
||
|
processingUpload: false
|
||
|
}
|
||
|
},
|
||
|
watch: {
|
||
|
value(newVal) {
|
||
|
if (newVal) this.init()
|
||
|
}
|
||
|
},
|
||
|
computed: {
|
||
|
show: {
|
||
|
get() {
|
||
|
return this.value
|
||
|
},
|
||
|
set(val) {
|
||
|
this.$emit('input', val)
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
methods: {
|
||
|
init() {},
|
||
|
fileUploadSelected() {
|
||
|
this.previewUpload = URL.createObjectURL(file)
|
||
|
this.selectedFile = file
|
||
|
},
|
||
|
resetCoverPreview() {
|
||
|
if (this.$refs.fileInput) {
|
||
|
this.$refs.fileInput.reset()
|
||
|
}
|
||
|
this.previewUpload = null
|
||
|
this.selectedFile = null
|
||
|
},
|
||
|
submitCoverUpload() {
|
||
|
this.processingUpload = true
|
||
|
var form = new FormData()
|
||
|
form.set('cover', this.selectedFile)
|
||
|
|
||
|
this.$axios
|
||
|
.$post(`/api/${this.entity}/${this.entityId}/cover`, form)
|
||
|
.then((data) => {
|
||
|
if (data.error) {
|
||
|
this.$toast.error(data.error)
|
||
|
} else {
|
||
|
this.$toast.success('Cover Uploaded')
|
||
|
this.resetCoverPreview()
|
||
|
}
|
||
|
this.processingUpload = false
|
||
|
})
|
||
|
.catch((error) => {
|
||
|
console.error('Failed', error)
|
||
|
var errorMsg = error.response && error.response.data ? error.response.data : 'Unknown Error'
|
||
|
this.$toast.error(errorMsg)
|
||
|
this.processingUpload = false
|
||
|
})
|
||
|
},
|
||
|
async submitForm() {
|
||
|
this.processingUpload = true
|
||
|
|
||
|
var success = await this.$axios.$post(`/api/${this.entity}/${this.entityId}/cover`, { url: this.imageUrl }).catch((error) => {
|
||
|
console.error('Failed to download cover from url', error)
|
||
|
var errorMsg = error.response && error.response.data ? error.response.data : 'Unknown Error'
|
||
|
this.$toast.error(errorMsg)
|
||
|
return false
|
||
|
})
|
||
|
|
||
|
this.processingUpload = false
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
</script>
|