mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-30 18:12:25 -04: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> |