2021-08-18 00:01:11 +02:00
< template >
2021-09-06 21:13:01 +02:00
< div class = "w-full h-full relative" >
2022-03-13 23:10:48 +01:00
< widgets -item -details -edit ref = "itemDetailsEdit" :library-item ="libraryItem" @submit ="submitForm" / >
2021-09-05 02:58:39 +02:00
2022-03-13 23:10:48 +01:00
< div class = "absolute bottom-0 left-0 w-full py-4 bg-bg" : class = "isScrollable ? 'box-shadow-md-up' : 'box-shadow-sm-up border-t border-primary border-opacity-50'" >
< div class = "flex items-center px-4" >
< ui -btn v-if ="userCanDelete" color="error" type="button" class="h-8" :padding-x="3" small @click.stop.prevent="removeItem" > Remove < / ui -btn >
2021-08-18 00:01:11 +02:00
2022-03-13 23:10:48 +01:00
< div class = "flex-grow" / >
2021-08-19 18:31:03 +02:00
2022-03-13 23:10:48 +01:00
< ui -tooltip v-if ="!isMissing" text="(Root User Only) Save a NFO metadata file in your audiobooks directory" direction="bottom" class="mr-4 hidden sm:block" >
< ui -btn v-if ="isRootUser" :loading="savingMetadata" color="bg" type="button" class="h-full" small @click.stop.prevent="saveMetadata" > Save Metadata < / ui -btn >
< / u i - t o o l t i p >
2021-08-19 18:31:03 +02:00
2022-03-13 23:10:48 +01:00
< ui -tooltip :disabled ="!!quickMatching" : text = "`(Root User Only) Populate empty book details & cover with first book result from '${libraryProvider}'. Does not overwrite details.`" direction = "bottom" class = "mr-4" >
< ui -btn v-if ="isRootUser" :loading="quickMatching" color="bg" type="button" class="h-full" small @click.stop.prevent="quickMatch" > Quick Match < / ui -btn >
< / u i - t o o l t i p >
2021-08-18 00:01:11 +02:00
2022-03-13 23:10:48 +01:00
< ui -tooltip :disabled ="!!libraryScan" text = "(Root User Only) Rescan audiobook including metadata" direction = "bottom" class = "mr-4" >
< ui -btn v-if ="isRootUser" :loading="rescanning" :disabled="!!libraryScan" color="bg" type="button" class="h-full" small @click.stop.prevent="rescan" > Re -Scan < / ui -btn >
< / u i - t o o l t i p >
2022-01-10 01:37:16 +01:00
2022-03-13 23:10:48 +01:00
< ui -btn @click ="submitForm" > Submit < / ui -btn >
2021-09-06 23:11:37 +02:00
< / div >
2022-03-12 02:46:32 +01:00
< / div >
2021-08-18 00:01:11 +02:00
< / div >
< / template >
< script >
export default {
props : {
processing : Boolean ,
2022-03-11 01:45:02 +01:00
libraryItem : {
2021-08-18 00:01:11 +02:00
type : Object ,
default : ( ) => { }
}
} ,
data ( ) {
return {
2021-09-06 21:13:01 +02:00
resettingProgress : false ,
2021-09-29 17:16:38 +02:00
isScrollable : false ,
2021-10-01 01:52:32 +02:00
savingMetadata : false ,
2022-02-15 23:15:09 +01:00
rescanning : false ,
quickMatching : false
2021-08-18 00:01:11 +02:00
}
} ,
computed : {
isProcessing : {
get ( ) {
return this . processing
} ,
set ( val ) {
this . $emit ( 'update:processing' , val )
}
} ,
2021-09-29 17:16:38 +02:00
isRootUser ( ) {
return this . $store . getters [ 'user/getIsRoot' ]
} ,
2021-10-27 00:55:48 +02:00
isMissing ( ) {
2022-03-11 01:45:02 +01:00
return ! ! this . libraryItem && ! ! this . libraryItem . isMissing
2021-10-27 00:55:48 +02:00
} ,
2022-03-11 01:45:02 +01:00
libraryItemId ( ) {
return this . libraryItem ? this . libraryItem . id : null
2021-08-18 00:01:11 +02:00
} ,
2022-03-11 01:45:02 +01:00
media ( ) {
return this . libraryItem ? this . libraryItem . media || { } : { }
} ,
mediaMetadata ( ) {
return this . media . metadata || { }
2021-08-18 00:01:11 +02:00
} ,
2021-09-07 00:42:15 +02:00
userCanDelete ( ) {
return this . $store . getters [ 'user/getUserCanDelete' ]
} ,
2021-10-06 04:10:49 +02:00
libraryId ( ) {
2022-03-11 01:45:02 +01:00
return this . libraryItem ? this . libraryItem . libraryId : null
2021-10-06 04:10:49 +02:00
} ,
2022-02-15 23:15:09 +01:00
libraryProvider ( ) {
return this . $store . getters [ 'libraries/getLibraryProvider' ] ( this . libraryId ) || 'google'
} ,
2021-10-06 04:10:49 +02:00
libraryScan ( ) {
if ( ! this . libraryId ) return null
return this . $store . getters [ 'scanners/getLibraryScan' ] ( this . libraryId )
2021-08-18 00:01:11 +02:00
}
} ,
methods : {
2022-02-15 23:15:09 +01:00
quickMatch ( ) {
this . quickMatching = true
var matchOptions = {
provider : this . libraryProvider ,
2022-02-15 23:36:22 +01:00
title : this . details . title ,
author : this . details . author !== this . book . author ? this . details . author : null
2022-02-15 23:15:09 +01:00
}
this . $axios
2022-03-11 01:45:02 +01:00
. $post ( ` /api/books/ ${ this . libraryItemId } /match ` , matchOptions )
2022-02-15 23:15:09 +01:00
. then ( ( res ) => {
this . quickMatching = false
if ( res . warning ) {
this . $toast . warning ( res . warning )
} else if ( res . updated ) {
2022-03-11 01:45:02 +01:00
this . $toast . success ( 'Item details updated' )
2022-02-15 23:15:09 +01:00
} else {
this . $toast . info ( 'No updates were made' )
}
} )
. catch ( ( error ) => {
var errMsg = error . response ? error . response . data || '' : ''
console . error ( 'Failed to match' , error )
this . $toast . error ( errMsg || 'Failed to match' )
this . quickMatching = false
} )
} ,
2022-03-13 00:45:32 +01:00
libraryScanComplete ( result ) {
2021-10-01 01:52:32 +02:00
this . rescanning = false
if ( ! result ) {
this . $toast . error ( ` Re-Scan Failed for " ${ this . title } " ` )
} else if ( result === 'UPDATED' ) {
2022-03-13 00:45:32 +01:00
this . $toast . success ( ` Re-Scan complete item was updated ` )
2021-10-01 01:52:32 +02:00
} else if ( result === 'UPTODATE' ) {
2022-03-13 00:45:32 +01:00
this . $toast . success ( ` Re-Scan complete item was up to date ` )
2021-10-01 01:52:32 +02:00
} else if ( result === 'REMOVED' ) {
2022-03-13 00:45:32 +01:00
this . $toast . error ( ` Re-Scan complete item was removed ` )
2021-10-01 01:52:32 +02:00
}
} ,
rescan ( ) {
this . rescanning = true
2022-03-13 00:45:32 +01:00
this . $root . socket . once ( 'item_scan_complete' , this . libraryScanComplete )
this . $root . socket . emit ( 'scan_item' , this . libraryItemId )
2021-10-01 01:52:32 +02:00
} ,
2021-09-29 17:16:38 +02:00
saveMetadataComplete ( result ) {
this . savingMetadata = false
if ( result . error ) {
this . $toast . error ( result . error )
} else if ( result . audiobookId ) {
var { savedPath } = result
if ( ! savedPath ) {
this . $toast . error ( ` Failed to save metadata file ( ${ result . audiobookId } ) ` )
} else {
this . $toast . success ( ` Metadata file saved " ${ result . audiobookTitle } " ` )
}
}
} ,
saveMetadata ( ) {
this . savingMetadata = true
this . $root . socket . once ( 'save_metadata_complete' , this . saveMetadataComplete )
2022-03-11 01:45:02 +01:00
this . $root . socket . emit ( 'save_metadata' , this . libraryItemId )
2021-09-29 17:16:38 +02:00
} ,
2021-12-02 02:07:03 +01:00
submitForm ( ) {
2021-08-25 13:38:32 +02:00
if ( this . isProcessing ) {
return
}
2022-03-13 23:10:48 +01:00
if ( ! this . $refs . itemDetailsEdit ) {
return
2021-12-02 02:07:03 +01:00
}
2022-03-13 23:10:48 +01:00
var updatedDetails = this . $refs . itemDetailsEdit . getDetails ( )
if ( ! updatedDetails . hasChanges ) {
this . $toast . info ( 'No changes were made' )
return
2021-12-02 02:07:03 +01:00
}
2022-03-13 23:10:48 +01:00
this . updateDetails ( updatedDetails )
2021-12-02 02:07:03 +01:00
} ,
2022-03-13 23:10:48 +01:00
async updateDetails ( updatedDetails ) {
this . isProcessing = true
console . log ( 'Sending update' , updatedDetails . updatePayload )
var updatedAudiobook = await this . $axios . $patch ( ` /api/items/ ${ this . libraryItemId } /media ` , updatedDetails . updatePayload ) . catch ( ( error ) => {
2021-08-18 00:01:11 +02:00
console . error ( 'Failed to update' , error )
return false
} )
this . isProcessing = false
if ( updatedAudiobook ) {
this . $toast . success ( 'Update Successful' )
this . $emit ( 'close' )
}
} ,
2022-03-11 01:45:02 +01:00
removeItem ( ) {
if ( confirm ( ` Are you sure you want to remove this item? \ n \ n*Does not delete your files, only removes the item from audiobookshelf ` ) ) {
2021-08-18 00:01:11 +02:00
this . isProcessing = true
this . $axios
2022-03-13 00:45:32 +01:00
. $delete ( ` /api/items/ ${ this . libraryItemId } ` )
2021-08-18 00:01:11 +02:00
. then ( ( ) => {
2022-03-11 01:45:02 +01:00
console . log ( 'Item removed' )
this . $toast . success ( 'Item Removed' )
2021-08-18 00:01:11 +02:00
this . $emit ( 'close' )
this . isProcessing = false
} )
. catch ( ( error ) => {
2022-03-11 01:45:02 +01:00
console . error ( 'Remove item failed' , error )
2021-08-18 00:01:11 +02:00
this . isProcessing = false
} )
}
2021-09-06 21:13:01 +02:00
} ,
checkIsScrollable ( ) {
this . $nextTick ( ( ) => {
2022-03-13 23:10:48 +01:00
var formWrapper = document . getElementById ( 'formWrapper' )
if ( formWrapper ) {
if ( formWrapper . scrollHeight > formWrapper . clientHeight ) {
2021-09-06 21:13:01 +02:00
this . isScrollable = true
} else {
this . isScrollable = false
}
}
} )
} ,
setResizeObserver ( ) {
try {
2022-03-13 23:10:48 +01:00
var formWrapper = document . getElementById ( 'formWrapper' )
if ( formWrapper ) {
this . $nextTick ( ( ) => {
const resizeObserver = new ResizeObserver ( ( ) => {
this . checkIsScrollable ( )
} )
resizeObserver . observe ( formWrapper )
2021-09-06 21:13:01 +02:00
} )
2022-03-13 23:10:48 +01:00
}
2021-09-06 21:13:01 +02:00
} catch ( error ) {
console . error ( 'Failed to set resize observer' )
}
2021-08-18 00:01:11 +02:00
}
2021-09-06 21:13:01 +02:00
} ,
mounted ( ) {
this . setResizeObserver ( )
2021-08-18 00:01:11 +02:00
}
}
2021-09-06 21:13:01 +02:00
< / script >
< style scoped >
. details - form - wrapper {
height : calc ( 100 % - 70 px ) ;
2021-09-06 23:11:37 +02:00
max - height : calc ( 100 % - 70 px ) ;
2021-09-06 21:13:01 +02:00
}
< / style >