mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Update:Playlist edit modal
This commit is contained in:
		
							parent
							
								
									623a706555
								
							
						
					
					
						commit
						c957e9483e
					
				| @ -220,6 +220,8 @@ export default { | |||||||
|         this.$store.commit('showEditModal', entity) |         this.$store.commit('showEditModal', entity) | ||||||
|       } else if (this.entityName === 'collections') { |       } else if (this.entityName === 'collections') { | ||||||
|         this.$store.commit('globals/setEditCollection', entity) |         this.$store.commit('globals/setEditCollection', entity) | ||||||
|  |       } else if (this.entityName === 'playlists') { | ||||||
|  |         this.$store.commit('globals/setEditPlaylist', entity) | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     clearSelectedEntities() { |     clearSelectedEntities() { | ||||||
|  | |||||||
							
								
								
									
										128
									
								
								client/components/modals/playlists/EditModal.vue
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								client/components/modals/playlists/EditModal.vue
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | <template> | ||||||
|  |   <modals-modal v-model="show" name="edit-playlist" :width="700" :height="'unset'" :processing="processing"> | ||||||
|  |     <template #outer> | ||||||
|  |       <div class="absolute top-0 left-0 p-5 w-2/3 overflow-hidden"> | ||||||
|  |         <p class="font-book text-3xl text-white truncate">{{ $strings.HeaderPlaylist }}</p> | ||||||
|  |       </div> | ||||||
|  |     </template> | ||||||
|  |     <div class="p-4 w-full text-sm py-6 rounded-lg bg-bg shadow-lg border border-black-300 relative overflow-hidden" style="min-height: 400px; max-height: 80vh"> | ||||||
|  |       <form @submit.prevent="submitForm"> | ||||||
|  |         <div class="flex"> | ||||||
|  |           <div> | ||||||
|  |             <covers-playlist-cover :items="items" :width="200" :height="100 * bookCoverAspectRatio" :book-cover-aspect-ratio="bookCoverAspectRatio" /> | ||||||
|  |           </div> | ||||||
|  |           <div class="flex-grow px-4"> | ||||||
|  |             <ui-text-input-with-label v-model="newPlaylistName" :label="$strings.LabelName" class="mb-2" /> | ||||||
|  | 
 | ||||||
|  |             <ui-textarea-with-label v-model="newPlaylistDescription" :label="$strings.LabelDescription" /> | ||||||
|  |           </div> | ||||||
|  |         </div> | ||||||
|  |         <div class="absolute bottom-0 left-0 right-0 w-full py-2 px-4 flex"> | ||||||
|  |           <ui-btn v-if="userCanDelete" small color="error" type="button" @click.stop="removeClick">{{ $strings.ButtonRemove }}</ui-btn> | ||||||
|  |           <div class="flex-grow" /> | ||||||
|  |           <ui-btn color="success" type="submit">{{ $strings.ButtonSave }}</ui-btn> | ||||||
|  |         </div> | ||||||
|  |       </form> | ||||||
|  |     </div> | ||||||
|  |   </modals-modal> | ||||||
|  | </template> | ||||||
|  | 
 | ||||||
|  | <script> | ||||||
|  | export default { | ||||||
|  |   data() { | ||||||
|  |     return { | ||||||
|  |       processing: false, | ||||||
|  |       newPlaylistName: null, | ||||||
|  |       newPlaylistDescription: null, | ||||||
|  |       showImageUploader: false | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   watch: { | ||||||
|  |     show: { | ||||||
|  |       handler(newVal) { | ||||||
|  |         if (newVal) { | ||||||
|  |           this.init() | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   computed: { | ||||||
|  |     show: { | ||||||
|  |       get() { | ||||||
|  |         return this.$store.state.globals.showEditPlaylistModal | ||||||
|  |       }, | ||||||
|  |       set(val) { | ||||||
|  |         this.$store.commit('globals/setShowEditPlaylistModal', val) | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     bookCoverAspectRatio() { | ||||||
|  |       return this.$store.getters['libraries/getBookCoverAspectRatio'] | ||||||
|  |     }, | ||||||
|  |     playlist() { | ||||||
|  |       return this.$store.state.globals.selectedPlaylist || {} | ||||||
|  |     }, | ||||||
|  |     playlistName() { | ||||||
|  |       return this.playlist.name | ||||||
|  |     }, | ||||||
|  |     items() { | ||||||
|  |       return this.playlist.items || [] | ||||||
|  |     }, | ||||||
|  |     userCanDelete() { | ||||||
|  |       return this.$store.getters['user/getUserCanDelete'] | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   methods: { | ||||||
|  |     init() { | ||||||
|  |       this.newPlaylistName = this.playlistName | ||||||
|  |       this.newPlaylistDescription = this.playlist.description || '' | ||||||
|  |     }, | ||||||
|  |     removeClick() { | ||||||
|  |       if (confirm(this.$getString('MessageConfirmRemovePlaylist', [this.playlistName]))) { | ||||||
|  |         this.processing = true | ||||||
|  |         this.$axios | ||||||
|  |           .$delete(`/api/playlists/${this.playlist.id}`) | ||||||
|  |           .then(() => { | ||||||
|  |             this.processing = false | ||||||
|  |             this.show = false | ||||||
|  |             this.$toast.success(this.$strings.ToastPlaylistRemoveSuccess) | ||||||
|  |           }) | ||||||
|  |           .catch((error) => { | ||||||
|  |             console.error('Failed to remove playlist', error) | ||||||
|  |             this.processing = false | ||||||
|  |             this.$toast.error(this.$strings.ToastPlaylistRemoveFailed) | ||||||
|  |           }) | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     submitForm() { | ||||||
|  |       if (this.newPlaylistName === this.playlistName && this.newPlaylistDescription === this.playlist.description) { | ||||||
|  |         return | ||||||
|  |       } | ||||||
|  |       if (!this.newPlaylistName) { | ||||||
|  |         return this.$toast.error('Playlist must have a name') | ||||||
|  |       } | ||||||
|  | 
 | ||||||
|  |       this.processing = true | ||||||
|  | 
 | ||||||
|  |       var playlistUpdate = { | ||||||
|  |         name: this.newPlaylistName, | ||||||
|  |         description: this.newPlaylistDescription || null | ||||||
|  |       } | ||||||
|  |       this.$axios | ||||||
|  |         .$patch(`/api/playlists/${this.playlist.id}`, playlistUpdate) | ||||||
|  |         .then((playlist) => { | ||||||
|  |           console.log('Playlist Updated', playlist) | ||||||
|  |           this.processing = false | ||||||
|  |           this.show = false | ||||||
|  |           this.$toast.success(this.$strings.ToastPlaylistUpdateSuccess) | ||||||
|  |         }) | ||||||
|  |         .catch((error) => { | ||||||
|  |           console.error('Failed to update playlist', error) | ||||||
|  |           this.processing = false | ||||||
|  |           this.$toast.error(this.$strings.ToastPlaylistUpdateFailed) | ||||||
|  |         }) | ||||||
|  |     } | ||||||
|  |   }, | ||||||
|  |   mounted() {}, | ||||||
|  |   beforeDestroy() {} | ||||||
|  | } | ||||||
|  | </script> | ||||||
| @ -45,7 +45,7 @@ export default { | |||||||
|     } |     } | ||||||
|   }, |   }, | ||||||
|   watch: { |   watch: { | ||||||
|     books: { |     items: { | ||||||
|       handler(newVal) { |       handler(newVal) { | ||||||
|         this.init() |         this.init() | ||||||
|       } |       } | ||||||
|  | |||||||
| @ -11,8 +11,9 @@ | |||||||
| 
 | 
 | ||||||
|     <modals-item-edit-modal /> |     <modals-item-edit-modal /> | ||||||
|     <modals-collections-add-create-modal /> |     <modals-collections-add-create-modal /> | ||||||
|  |     <modals-collections-edit-modal /> | ||||||
|     <modals-playlists-add-create-modal /> |     <modals-playlists-add-create-modal /> | ||||||
|     <modals-edit-collection-modal /> |     <modals-playlists-edit-modal /> | ||||||
|     <modals-podcast-edit-episode /> |     <modals-podcast-edit-episode /> | ||||||
|     <modals-podcast-view-episode /> |     <modals-podcast-view-episode /> | ||||||
|     <modals-authors-edit-modal /> |     <modals-authors-edit-modal /> | ||||||
|  | |||||||
| @ -5,6 +5,7 @@ export const state = () => ({ | |||||||
|   showCollectionsModal: false, |   showCollectionsModal: false, | ||||||
|   showEditCollectionModal: false, |   showEditCollectionModal: false, | ||||||
|   showPlaylistsModal: false, |   showPlaylistsModal: false, | ||||||
|  |   showEditPlaylistModal: false, | ||||||
|   showEditPodcastEpisode: false, |   showEditPodcastEpisode: false, | ||||||
|   showViewPodcastEpisodeModal: false, |   showViewPodcastEpisodeModal: false, | ||||||
|   showConfirmPrompt: false, |   showConfirmPrompt: false, | ||||||
| @ -12,10 +13,11 @@ export const state = () => ({ | |||||||
|   showEditAuthorModal: false, |   showEditAuthorModal: false, | ||||||
|   selectedEpisode: null, |   selectedEpisode: null, | ||||||
|   selectedPlaylistItems: null, |   selectedPlaylistItems: null, | ||||||
|  |   selectedPlaylist: null, | ||||||
|   selectedCollection: null, |   selectedCollection: null, | ||||||
|   selectedAuthor: null, |   selectedAuthor: null, | ||||||
|   isCasting: false, // Actively casting
 |   isCasting: false, // Actively casting
 | ||||||
|   isChromecastInitialized: false, // Script loaded
 |   isChromecastInitialized: false, // Script loadeds
 | ||||||
|   showBatchQuickMatchModal: false, |   showBatchQuickMatchModal: false, | ||||||
|   dateFormats: [ |   dateFormats: [ | ||||||
|     { |     { | ||||||
| @ -84,6 +86,9 @@ export const mutations = { | |||||||
|   setShowPlaylistsModal(state, val) { |   setShowPlaylistsModal(state, val) { | ||||||
|     state.showPlaylistsModal = val |     state.showPlaylistsModal = val | ||||||
|   }, |   }, | ||||||
|  |   setShowEditPlaylistModal(state, val) { | ||||||
|  |     state.showEditPlaylistModal = val | ||||||
|  |   }, | ||||||
|   setShowEditPodcastEpisodeModal(state, val) { |   setShowEditPodcastEpisodeModal(state, val) { | ||||||
|     state.showEditPodcastEpisode = val |     state.showEditPodcastEpisode = val | ||||||
|   }, |   }, | ||||||
| @ -101,6 +106,10 @@ export const mutations = { | |||||||
|     state.selectedCollection = collection |     state.selectedCollection = collection | ||||||
|     state.showEditCollectionModal = true |     state.showEditCollectionModal = true | ||||||
|   }, |   }, | ||||||
|  |   setEditPlaylist(state, playlist) { | ||||||
|  |     state.selectedPlaylist = playlist | ||||||
|  |     state.showEditPlaylistModal = true | ||||||
|  |   }, | ||||||
|   setSelectedEpisode(state, episode) { |   setSelectedEpisode(state, episode) { | ||||||
|     state.selectedEpisode = episode |     state.selectedEpisode = episode | ||||||
|   }, |   }, | ||||||
|  | |||||||
| @ -112,6 +112,7 @@ | |||||||
|   "HeaderOtherFiles": "Other Files", |   "HeaderOtherFiles": "Other Files", | ||||||
|   "HeaderPermissions": "Permissions", |   "HeaderPermissions": "Permissions", | ||||||
|   "HeaderPlayerQueue": "Player Queue", |   "HeaderPlayerQueue": "Player Queue", | ||||||
|  |   "HeaderPlaylist": "Playlist", | ||||||
|   "HeaderPlaylistItems": "Playlist Items", |   "HeaderPlaylistItems": "Playlist Items", | ||||||
|   "HeaderPodcastsToAdd": "Podcasts to Add", |   "HeaderPodcastsToAdd": "Podcasts to Add", | ||||||
|   "HeaderPreviewCover": "Preview Cover", |   "HeaderPreviewCover": "Preview Cover", | ||||||
| @ -428,6 +429,7 @@ | |||||||
|   "MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?", |   "MessageConfirmRemoveCollection": "Are you sure you want to remove collection \"{0}\"?", | ||||||
|   "MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?", |   "MessageConfirmRemoveEpisode": "Are you sure you want to remove episode \"{0}\"?", | ||||||
|   "MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?", |   "MessageConfirmRemoveEpisodes": "Are you sure you want to remove {0} episodes?", | ||||||
|  |   "MessageConfirmRemovePlaylist": "Are you sure you want to remove your playlist \"{0}\"?", | ||||||
|   "MessageDownloadingEpisode": "Downloading episode", |   "MessageDownloadingEpisode": "Downloading episode", | ||||||
|   "MessageDragFilesIntoTrackOrder": "Drag files into correct track order", |   "MessageDragFilesIntoTrackOrder": "Drag files into correct track order", | ||||||
|   "MessageEmbedFinished": "Embed Finished!", |   "MessageEmbedFinished": "Embed Finished!", | ||||||
| @ -557,6 +559,10 @@ | |||||||
|   "ToastLibraryScanStarted": "Library scan started", |   "ToastLibraryScanStarted": "Library scan started", | ||||||
|   "ToastLibraryUpdateFailed": "Failed to update library", |   "ToastLibraryUpdateFailed": "Failed to update library", | ||||||
|   "ToastLibraryUpdateSuccess": "Library \"{0}\" updated", |   "ToastLibraryUpdateSuccess": "Library \"{0}\" updated", | ||||||
|  |   "ToastPlaylistRemoveFailed": "Failed to remove playlist", | ||||||
|  |   "ToastPlaylistRemoveSuccess": "Playlist removed", | ||||||
|  |   "ToastPlaylistUpdateFailed": "Failed to update playlist", | ||||||
|  |   "ToastPlaylistUpdateSuccess": "Playlist updated", | ||||||
|   "ToastPodcastCreateFailed": "Failed to create podcast", |   "ToastPodcastCreateFailed": "Failed to create podcast", | ||||||
|   "ToastPodcastCreateSuccess": "Podcast created successfully", |   "ToastPodcastCreateSuccess": "Podcast created successfully", | ||||||
|   "ToastRemoveItemFromCollectionFailed": "Failed to remove item from collection", |   "ToastRemoveItemFromCollectionFailed": "Failed to remove item from collection", | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user