mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			69 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
<template>
 | 
						|
  <div class="w-full border-b border-gray-700 pb-2">
 | 
						|
    <div class="flex py-1 hover:bg-gray-300 hover:bg-opacity-10 cursor-pointer" @click="selectMatch">
 | 
						|
      <div class="h-24 bg-primary" :style="{ minWidth: 96 / bookCoverAspectRatio + 'px' }">
 | 
						|
        <img v-if="selectedCover" :src="selectedCover" class="h-full w-full object-contain" />
 | 
						|
      </div>
 | 
						|
      <div v-if="!isPodcast" class="px-4 flex-grow">
 | 
						|
        <div class="flex items-center">
 | 
						|
          <h1>{{ book.title }}</h1>
 | 
						|
          <div class="flex-grow" />
 | 
						|
          <p>{{ book.publishedYear }}</p>
 | 
						|
        </div>
 | 
						|
        <p class="text-gray-400">{{ book.author }}</p>
 | 
						|
        <div class="w-full max-h-12 overflow-hidden">
 | 
						|
          <p class="text-gray-500 text-xs">{{ book.description }}</p>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
      <div v-else class="px-4 flex-grow">
 | 
						|
        <h1>{{ book.title }}</h1>
 | 
						|
        <p class="text-base text-gray-300 whitespace-nowrap truncate">by {{ book.author }}</p>
 | 
						|
        <p class="text-xs text-gray-400 leading-5">{{ book.genres.join(', ') }}</p>
 | 
						|
        <p class="text-xs text-gray-400 leading-5">{{ book.trackCount }} Episodes</p>
 | 
						|
      </div>
 | 
						|
    </div>
 | 
						|
    <div v-if="bookCovers.length > 1" class="flex">
 | 
						|
      <template v-for="cover in bookCovers">
 | 
						|
        <div :key="cover" class="border-2 hover:border-yellow-300 border-transparent" :class="cover === selectedCover ? 'border-yellow-200' : ''" @mousedown.stop @mouseup.stop @click.stop="clickCover(cover)">
 | 
						|
          <img :src="cover" class="h-20 w-12 object-cover mr-1" />
 | 
						|
        </div>
 | 
						|
      </template>
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</template>
 | 
						|
 | 
						|
<script>
 | 
						|
export default {
 | 
						|
  props: {
 | 
						|
    book: {
 | 
						|
      type: Object,
 | 
						|
      default: () => {}
 | 
						|
    },
 | 
						|
    isPodcast: Boolean,
 | 
						|
    bookCoverAspectRatio: Number
 | 
						|
  },
 | 
						|
  data() {
 | 
						|
    return {
 | 
						|
      selectedCover: null
 | 
						|
    }
 | 
						|
  },
 | 
						|
  computed: {
 | 
						|
    bookCovers() {
 | 
						|
      return this.book.covers ? this.book.covers || [] : []
 | 
						|
    }
 | 
						|
  },
 | 
						|
  methods: {
 | 
						|
    selectMatch() {
 | 
						|
      var book = { ...this.book }
 | 
						|
      book.cover = this.selectedCover
 | 
						|
      this.$emit('select', this.book)
 | 
						|
    },
 | 
						|
    clickCover(cover) {
 | 
						|
      this.selectedCover = cover
 | 
						|
    }
 | 
						|
  },
 | 
						|
  mounted() {
 | 
						|
    this.selectedCover = this.bookCovers.length ? this.bookCovers[0] : this.book.cover || null
 | 
						|
  }
 | 
						|
}
 | 
						|
</script> |