mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-11-04 03:17:00 -05: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> |