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