mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Add populate from buttons to batch edit
This commit is contained in:
		
							parent
							
								
									598a93d224
								
							
						
					
					
						commit
						79acc41d16
					
				| @ -86,7 +86,12 @@ | ||||
|               </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="w-full flex items-center justify-end p-4"> | ||||
|             <div class="w-full flex items-center p-4 space-x-2"> | ||||
|               <ui-btn small @click.stop="resetMapDetails">{{ $strings.ButtonReset }}</ui-btn> | ||||
|               <ui-tooltip direction="bottom" :text="$strings.MessageBatchEditPopulateMapDetailsAllHelp"> | ||||
|                 <ui-btn small :disabled="!hasSelectedBatchUsage" @click.stop="populateFromExisting()">{{ $strings.ButtonBatchEditPopulateFromExisting }}</ui-btn> | ||||
|               </ui-tooltip> | ||||
|               <div class="flex-grow" /> | ||||
|               <ui-btn color="success" :disabled="!hasSelectedBatchUsage" :padding-x="8" small class="text-base" :loading="isProcessing" @click="mapBatchDetails">{{ $strings.ButtonApply }}</ui-btn> | ||||
|             </div> | ||||
|           </div> | ||||
| @ -97,6 +102,11 @@ | ||||
|     <div class="flex justify-center flex-wrap"> | ||||
|       <template v-for="libraryItem in libraryItemCopies"> | ||||
|         <div :key="libraryItem.id" class="w-full max-w-3xl border border-black-300 p-6 -ml-px -mt-px"> | ||||
|           <div class="flex items-center justify-end"> | ||||
|             <ui-tooltip direction="bottom" :text="$strings.MessageBatchEditPopulateMapDetailsItemHelp"> | ||||
|               <ui-btn small :disabled="!hasSelectedBatchUsage" @click="populateFromExisting(libraryItem.id)">{{ $strings.ButtonBatchEditPopulateMapDetails }}</ui-btn> | ||||
|             </ui-tooltip> | ||||
|           </div> | ||||
|           <widgets-book-details-edit v-if="libraryItem.mediaType === 'book'" :ref="`itemForm-${libraryItem.id}`" :library-item="libraryItem" @change="handleItemChange" /> | ||||
|           <widgets-podcast-details-edit v-else :ref="`itemForm-${libraryItem.id}`" :library-item="libraryItem" @change="handleItemChange" /> | ||||
|         </div> | ||||
| @ -228,6 +238,88 @@ export default { | ||||
|     } | ||||
|   }, | ||||
|   methods: { | ||||
|     resetMapDetails() { | ||||
|       this.blurBatchForm() | ||||
|       this.batchDetails = { | ||||
|         subtitle: null, | ||||
|         authors: null, | ||||
|         publishedYear: null, | ||||
|         series: [], | ||||
|         genres: [], | ||||
|         tags: [], | ||||
|         narrators: [], | ||||
|         publisher: null, | ||||
|         language: null, | ||||
|         explicit: false, | ||||
|         abridged: false | ||||
|       } | ||||
|       this.selectedBatchUsage = { | ||||
|         subtitle: false, | ||||
|         authors: false, | ||||
|         publishedYear: false, | ||||
|         series: false, | ||||
|         genres: false, | ||||
|         tags: false, | ||||
|         narrators: false, | ||||
|         publisher: false, | ||||
|         language: false, | ||||
|         explicit: false, | ||||
|         abridged: false | ||||
|       } | ||||
|     }, | ||||
|     populateFromExisting(libraryItemId) { | ||||
|       this.blurBatchForm() | ||||
| 
 | ||||
|       let libraryItemsToMap = this.libraryItemCopies | ||||
|       if (libraryItemId) { | ||||
|         libraryItemsToMap = this.libraryItemCopies.filter((li) => li.id === libraryItemId) | ||||
|       } | ||||
| 
 | ||||
|       for (const key in this.selectedBatchUsage) { | ||||
|         if (!this.selectedBatchUsage[key]) continue | ||||
|         if (this.isMapAppend && !this.appendableKeys.includes(key)) continue | ||||
| 
 | ||||
|         let existingValues = undefined | ||||
|         libraryItemsToMap.forEach((li) => { | ||||
|           if (key === 'tags') { | ||||
|             if (!existingValues) existingValues = [] | ||||
|             li.media.tags.forEach((tag) => { | ||||
|               if (!existingValues.includes(tag)) { | ||||
|                 existingValues.push(tag) | ||||
|               } | ||||
|             }) | ||||
|           } else if (key === 'authors') { | ||||
|             if (!existingValues) existingValues = [] | ||||
|             li.media.metadata[key].forEach((entity) => { | ||||
|               if (!existingValues.some((au) => au.id === entity.id)) { | ||||
|                 existingValues.push({ | ||||
|                   id: entity.id, | ||||
|                   name: entity.name | ||||
|                 }) | ||||
|               } | ||||
|             }) | ||||
|           } else if (key === 'series') { | ||||
|             if (!existingValues) existingValues = [] | ||||
|             li.media.metadata[key].forEach((entity) => { | ||||
|               if (!existingValues.includes(entity.name)) { | ||||
|                 existingValues.push(entity.name) | ||||
|               } | ||||
|             }) | ||||
|           } else if (key === 'genres' || key === 'narrators') { | ||||
|             if (!existingValues) existingValues = [] | ||||
|             li.media.metadata[key].forEach((item) => { | ||||
|               if (!existingValues.includes(item)) { | ||||
|                 existingValues.push(item) | ||||
|               } | ||||
|             }) | ||||
|           } else if (existingValues === undefined) { | ||||
|             existingValues = li.media.metadata[key] | ||||
|           } | ||||
|         }) | ||||
| 
 | ||||
|         this.batchDetails[key] = existingValues | ||||
|       } | ||||
|     }, | ||||
|     handleItemChange(itemChange) { | ||||
|       if (!itemChange.hasChanges) { | ||||
|         this.itemsWithChanges = this.itemsWithChanges.filter((id) => id !== itemChange.libraryItemId) | ||||
|  | ||||
| @ -10,6 +10,8 @@ | ||||
|   "ButtonApplyChapters": "Apply Chapters", | ||||
|   "ButtonAuthors": "Authors", | ||||
|   "ButtonBack": "Back", | ||||
|   "ButtonBatchEditPopulateFromExisting": "Populate from existing", | ||||
|   "ButtonBatchEditPopulateMapDetails": "Populate map details", | ||||
|   "ButtonBrowseForFolder": "Browse for Folder", | ||||
|   "ButtonCancel": "Cancel", | ||||
|   "ButtonCancelEncode": "Cancel Encode", | ||||
| @ -705,6 +707,8 @@ | ||||
|   "MessageBackupsLocationNoEditNote": "Note: The backup location is set through an environment variable and cannot be changed here.", | ||||
|   "MessageBackupsLocationPathEmpty": "Backup location path cannot be empty", | ||||
|   "MessageBatchQuickMatchDescription": "Quick Match will attempt to add missing covers and metadata for the selected items. Enable the options below to allow Quick Match to overwrite existing covers and/or metadata.", | ||||
|   "MessageBatchEditPopulateMapDetailsAllHelp": "Populate enabled fields with data from all items. Fields with multiple values will be merged", | ||||
|   "MessageBatchEditPopulateMapDetailsItemHelp": "Populate enabled map details fields with data from this item", | ||||
|   "MessageBookshelfNoCollections": "You haven't made any collections yet", | ||||
|   "MessageBookshelfNoRSSFeeds": "No RSS feeds are open", | ||||
|   "MessageBookshelfNoResultsForFilter": "No results for filter \"{0}: {1}\"", | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user