From a38f64852fdf0c37017674684ff6fb5c4b94e2ff Mon Sep 17 00:00:00 2001 From: Eliot Berriot <contact@eliotberriot.com> Date: Tue, 20 Mar 2018 23:41:15 +0100 Subject: [PATCH] Can now delete playlist --- .../components/playlists/PlaylistModal.vue | 108 ++++++++++-------- front/src/views/playlists/Detail.vue | 32 +++++- 2 files changed, 91 insertions(+), 49 deletions(-) diff --git a/front/src/components/playlists/PlaylistModal.vue b/front/src/components/playlists/PlaylistModal.vue index b470eb5ce0..5fdf585dfb 100644 --- a/front/src/components/playlists/PlaylistModal.vue +++ b/front/src/components/playlists/PlaylistModal.vue @@ -1,53 +1,66 @@ <template> <modal @update:show="update" :show="$store.state.playlists.showModal"> - <template v-if="track"> - <div class="header"> - Add "{{ track.title }}" by {{ track.artist.name }} to one of your playlists - </div> - <div class="scrolling content"> - <div class="description"> - <playlist-form></playlist-form> - <div class="ui divider"></div> - <div v-if="errors.length > 0" class="ui negative message"> - <div class="header">We cannot add the track to a playlist</div> - <ul class="list"> - <li v-for="error in errors">{{ error }}</li> - </ul> + <div class="header"> + Manage playlists + </div> + <div class="scrolling content"> + <div class="description"> + <template v-if="track"> + <h4 class="ui header">Current track</h4> + <div> + "{{ track.title }}" by {{ track.artist.name }} </div> - <h4 class="ui header">Available playlists</h4> - <table class="ui single line unstackable very basic table"> - <thead> - <tr> - <th>Name</th> - <th class="sorted descending">Last modification</th> - <th>Tracks</th> - <th>Visibility</th> - <th></th> - </tr> - </thead> - <tbody> - <tr v-for="playlist in sortedPlaylists"> - <td><router-link :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">{{ playlist.name }}</router-link></td> - <td><human-date :date="playlist.modification_date"></human-date></td> - <td>{{ playlist.tracks_count }}</td> - <td>{{ playlist.privacy_level }}</td> - <td> - <div - class="ui green icon right floated button" - title="Add to this playlist" - @click="addToPlaylist(playlist.id)"> - <i class="plus icon"></i> - </div> - </td> - </tr> - </tbody> - </table> + <div class="ui divider"></div> + </template> + + <playlist-form></playlist-form> + <div class="ui divider"></div> + <div v-if="errors.length > 0" class="ui negative message"> + <div class="header">We cannot add the track to a playlist</div> + <ul class="list"> + <li v-for="error in errors">{{ error }}</li> + </ul> </div> + </div> + <h4 class="ui header">Available playlists</h4> + <table class="ui unstackable very basic table"> + <thead> + <tr> + <th></th> + <th>Name</th> + <th class="sorted descending">Last modification</th> + <th>Tracks</th> + <th></th> + </tr> + </thead> + <tbody> + <tr v-for="playlist in sortedPlaylists"> + <td> + <router-link + class="ui icon basic small button" + :to="{name: 'library.playlists.detail', params: {id: playlist.id }, query: {mode: 'edit'}}"><i class="ui pencil icon"></i></router-link> + </td> + <td> + <router-link :to="{name: 'library.playlists.detail', params: {id: playlist.id }}">{{ playlist.name }}</router-link></td> + <td><human-date :date="playlist.modification_date"></human-date></td> + <td>{{ playlist.tracks_count }}</td> + <td> + <div + v-if="track" + class="ui green icon basic small right floated button" + title="Add to this playlist" + @click="addToPlaylist(playlist.id)"> + <i class="plus icon"></i> Add track + </div> + </td> + </tr> + </tbody> + </table> </div> - <div class="actions"> - <div class="ui cancel button">Cancel</div> - </div> - </template> + </div> + <div class="actions"> + <div class="ui cancel button">Cancel</div> + </div> </modal> </template> @@ -100,6 +113,11 @@ export default { p.reverse() return p } + }, + watch: { + '$store.state.route.path' () { + this.$store.commit('playlists/showModal', false) + } } } </script> diff --git a/front/src/views/playlists/Detail.vue b/front/src/views/playlists/Detail.vue index fc27b7126e..1f3caa4942 100644 --- a/front/src/views/playlists/Detail.vue +++ b/front/src/views/playlists/Detail.vue @@ -1,6 +1,9 @@ <template> - <div v-if="playlist"> - <div class="ui head vertical center aligned stripe segment"> + <div> + <div v-if="isLoading" class="ui vertical segment"> + <div :class="['ui', 'centered', 'active', 'inline', 'loader']"></div> + </div> + <div v-if="!isLoading && playlist" class="ui head vertical center aligned stripe segment"> <div class="segment-content"> <h2 class="ui center aligned icon header"> <i class="circular inverted list yellow icon"></i> @@ -23,6 +26,12 @@ <template v-if="edit">End edition</template> <template v-else>Edit...</template> </button> + <dangerous-button class="labeled icon" :action="deletePlaylist"> + <i class="trash icon"></i> Delete + <p slot="modal-header">Do you want to delete the playlist "{{ playlist.name }}"?</p> + <p slot="modal-content">This will completely delete this playlist and cannot be undone.</p> + <p slot="modal-confirm">Delete playlist</p> + </dangerous-button> </div> </div> <div v-if="tracks.length > 0" class="ui vertical stripe segment"> @@ -45,7 +54,8 @@ import PlaylistEditor from '@/components/playlists/Editor' export default { props: { - id: {required: true} + id: {required: true}, + defaultEdit: {type: Boolean, default: false} }, components: { PlaylistEditor, @@ -55,7 +65,8 @@ export default { }, data: function () { return { - edit: false, + edit: this.defaultEdit, + isLoading: false, playlist: null, tracks: [], playlistTracks: [] @@ -75,11 +86,24 @@ export default { }, fetch: function () { let self = this + self.isLoading = true let url = 'playlists/' + this.id + '/' axios.get(url).then((response) => { self.playlist = response.data axios.get(url + 'tracks').then((response) => { self.updatePlts(response.data.results) + }).then(() => { + self.isLoading = false + }) + }) + }, + deletePlaylist () { + let self = this + let url = 'playlists/' + this.id + '/' + axios.delete(url).then((response) => { + self.$store.dispatch('playlists/fetchOwn') + self.$router.push({ + path: '/library' }) }) } -- GitLab