mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-31 02:17:01 -04:00 
			
		
		
		
	- only include Material Symbols Rounded - Replace some ligatures with codepoint so loading isnt as ugly/shifting
		
			
				
	
	
		
			140 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			140 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <tr>
 | |
|     <td class="px-4">
 | |
|       {{ showFullPath ? file.metadata.path : file.metadata.relPath }} <ui-tooltip :text="$strings.LabelPrimaryEbook" class="inline-block"><span v-if="isPrimary" class="material-symbols text-success align-text-bottom">check_circle</span></ui-tooltip>
 | |
|     </td>
 | |
|     <td>
 | |
|       {{ $bytesPretty(file.metadata.size) }}
 | |
|     </td>
 | |
|     <td class="text-xs">
 | |
|       <ui-icon-btn icon="auto_stories" outlined borderless icon-font-size="1.125rem" :size="8" @click="readEbook" />
 | |
|     </td>
 | |
|     <td v-if="contextMenuItems.length" class="text-center">
 | |
|       <ui-context-menu-dropdown :items="contextMenuItems" :menu-width="130" :processing="processing" @action="contextMenuAction" />
 | |
|     </td>
 | |
|   </tr>
 | |
| </template>
 | |
| 
 | |
| <script>
 | |
| export default {
 | |
|   props: {
 | |
|     libraryItemId: String,
 | |
|     showFullPath: Boolean,
 | |
|     file: {
 | |
|       type: Object,
 | |
|       default: () => {}
 | |
|     }
 | |
|   },
 | |
|   data() {
 | |
|     return {
 | |
|       processing: false
 | |
|     }
 | |
|   },
 | |
|   computed: {
 | |
|     userToken() {
 | |
|       return this.$store.getters['user/getToken']
 | |
|     },
 | |
|     userCanDownload() {
 | |
|       return this.$store.getters['user/getUserCanDownload']
 | |
|     },
 | |
|     userCanDelete() {
 | |
|       return this.$store.getters['user/getUserCanDelete']
 | |
|     },
 | |
|     userCanUpdate() {
 | |
|       return this.$store.getters['user/getUserCanUpdate']
 | |
|     },
 | |
|     userIsAdmin() {
 | |
|       return this.$store.getters['user/getIsAdminOrUp']
 | |
|     },
 | |
|     downloadUrl() {
 | |
|       return `${process.env.serverUrl}/api/items/${this.libraryItemId}/file/${this.file.ino}/download?token=${this.userToken}`
 | |
|     },
 | |
|     isPrimary() {
 | |
|       return !this.file.isSupplementary
 | |
|     },
 | |
|     libraryIsAudiobooksOnly() {
 | |
|       return this.$store.getters['libraries/getLibraryIsAudiobooksOnly']
 | |
|     },
 | |
|     contextMenuItems() {
 | |
|       const items = []
 | |
|       if (this.userCanUpdate && !this.libraryIsAudiobooksOnly) {
 | |
|         items.push({
 | |
|           text: this.isPrimary ? this.$strings.LabelSetEbookAsSupplementary : this.$strings.LabelSetEbookAsPrimary,
 | |
|           action: 'updateStatus'
 | |
|         })
 | |
|       }
 | |
|       if (this.userCanDownload) {
 | |
|         items.push({
 | |
|           text: this.$strings.LabelDownload,
 | |
|           action: 'download'
 | |
|         })
 | |
|       }
 | |
|       if (this.userCanDelete) {
 | |
|         items.push({
 | |
|           text: this.$strings.ButtonDelete,
 | |
|           action: 'delete'
 | |
|         })
 | |
|       }
 | |
|       return items
 | |
|     }
 | |
|   },
 | |
|   methods: {
 | |
|     readEbook() {
 | |
|       this.$emit('read', this.file.ino)
 | |
|     },
 | |
|     contextMenuAction({ action }) {
 | |
|       if (action === 'delete') {
 | |
|         this.deleteLibraryFile()
 | |
|       } else if (action === 'download') {
 | |
|         this.downloadLibraryFile()
 | |
|       } else if (action === 'updateStatus') {
 | |
|         this.updateEbookStatus()
 | |
|       }
 | |
|     },
 | |
|     updateEbookStatus() {
 | |
|       this.processing = true
 | |
|       this.$axios
 | |
|         .$patch(`/api/items/${this.libraryItemId}/ebook/${this.file.ino}/status`)
 | |
|         .then(() => {
 | |
|           this.$toast.success('Ebook updated')
 | |
|         })
 | |
|         .catch((error) => {
 | |
|           console.error('Failed to update ebook', error)
 | |
|           this.$toast.error('Failed to update ebook')
 | |
|         })
 | |
|         .finally(() => {
 | |
|           this.processing = false
 | |
|         })
 | |
|     },
 | |
|     deleteLibraryFile() {
 | |
|       const payload = {
 | |
|         message: this.$strings.MessageConfirmDeleteFile,
 | |
|         callback: (confirmed) => {
 | |
|           if (confirmed) {
 | |
|             this.processing = true
 | |
|             this.$axios
 | |
|               .$delete(`/api/items/${this.libraryItemId}/file/${this.file.ino}`)
 | |
|               .then(() => {
 | |
|                 this.$toast.success(this.$strings.ToastDeleteFileSuccess)
 | |
|               })
 | |
|               .catch((error) => {
 | |
|                 console.error('Failed to delete file', error)
 | |
|                 this.$toast.error(this.$strings.ToastDeleteFileFailed)
 | |
|               })
 | |
|               .finally(() => {
 | |
|                 this.processing = false
 | |
|               })
 | |
|           }
 | |
|         },
 | |
|         type: 'yesNo'
 | |
|       }
 | |
|       this.$store.commit('globals/setConfirmPrompt', payload)
 | |
|     },
 | |
|     downloadLibraryFile() {
 | |
|       this.$downloadFile(this.downloadUrl, this.file.metadata.filename)
 | |
|     }
 | |
|   },
 | |
|   mounted() {}
 | |
| }
 | |
| </script>
 |