From c897ee07715be0bee865a5317c0e53a83b101094 Mon Sep 17 00:00:00 2001
From: wvffle
Date: Tue, 13 Sep 2022 11:00:38 +0000
Subject: [PATCH] Fix editing playlist tracks
---
changes/changelog.d/1362.bugfix | 1 +
front/src/components/playlists/Editor.vue | 51 +++++++++++++----------
2 files changed, 29 insertions(+), 23 deletions(-)
create mode 100644 changes/changelog.d/1362.bugfix
diff --git a/changes/changelog.d/1362.bugfix b/changes/changelog.d/1362.bugfix
new file mode 100644
index 000000000..461606312
--- /dev/null
+++ b/changes/changelog.d/1362.bugfix
@@ -0,0 +1 @@
+Fix editing playlist tracks (#1362)
diff --git a/front/src/components/playlists/Editor.vue b/front/src/components/playlists/Editor.vue
index 3dd9c6831..ea4f6b8c3 100644
--- a/front/src/components/playlists/Editor.vue
+++ b/front/src/components/playlists/Editor.vue
@@ -29,7 +29,7 @@ const props = defineProps()
const { playlistTracks, playlist } = useVModels(props, emit)
const errors = ref([] as string[])
-const duplicateTrackAddInfo = ref(null)
+const duplicateTrackAddInfo = ref<{ tracks: string[] }>()
const showDuplicateTrackAddConfirmation = ref(false)
const { tracks: queueTracks } = useQueue()
@@ -57,10 +57,10 @@ const labels = computed(() => ({
const isLoading = ref(false)
const status = computed(() => isLoading.value
? 'loading'
- : errors.value.length
- ? 'errored'
- : showDuplicateTrackAddConfirmation.value
- ? 'confirmDuplicateAdd'
+ : showDuplicateTrackAddConfirmation.value
+ ? 'confirmDuplicateAdd'
+ : errors.value.length > 0
+ ? 'errored'
: 'saved'
)
@@ -70,18 +70,11 @@ const responseHandlers = {
showDuplicateTrackAddConfirmation.value = false
},
errored (error: BackendError): void {
- const { backendErrors, rawPayload } = error
- // if backendErrors isn't populated (e.g. duplicate track exceptions raised by
- // the playlist model), read directly from the response
- // TODO (wvffle): Check if such case exists after rewrite
- if (error.rawPayload?.playlist) {
- error.backendErrors = error.rawPayload.playlist as string[]
- error.rawPayload = undefined
- return this.errored(error)
- }
+ showDuplicateTrackAddConfirmation.value = false
- if (backendErrors.length === 1 && backendErrors[0] === 'Tracks already exist in playlist') {
- duplicateTrackAddInfo.value = rawPayload ?? null
+ const { backendErrors, rawPayload = {} } = error
+ if (backendErrors.length === 1 && backendErrors[0] === 'Tracks Already Exist In Playlist') {
+ duplicateTrackAddInfo.value = ((rawPayload.playlist as APIErrorResponse).non_field_errors as APIErrorResponse)[0] as { tracks: string[] }
showDuplicateTrackAddConfirmation.value = true
return
}
@@ -90,6 +83,12 @@ const responseHandlers = {
}
}
+const fetchTracks = async () => {
+ // NOTE: This is handled by other functions and never used directly
+ const response = await axios.get(`playlists/${playlist.value?.id}/tracks/`)
+ playlistTracks.value = response.data.results
+}
+
const store = useStore()
const reorder = async ({ oldIndex: from, newIndex: to }: { oldIndex: number, newIndex: number }) => {
isLoading.value = true
@@ -111,7 +110,10 @@ const removePlaylistTrack = async (index: number) => {
try {
tracks.value.splice(index, 1)
await axios.post(`playlists/${playlist.value?.id}/remove/`, { index })
- await store.dispatch('playlists/fetchOwn')
+ await Promise.all([
+ store.dispatch('playlists/fetchOwn'),
+ fetchTracks()
+ ])
responseHandlers.success()
} catch (error) {
responseHandlers.errored(error as BackendError)
@@ -125,7 +127,7 @@ const clearPlaylist = async () => {
try {
tracks.value = []
- await axios.post(`playlists/${playlist.value?.id}/clear/`)
+ await axios.delete(`playlists/${playlist.value?.id}/clear/`)
await store.dispatch('playlists/fetchOwn')
responseHandlers.success()
} catch (error) {
@@ -145,7 +147,10 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>
})
tracks.value.push(...response.data.results)
- await store.dispatch('playlists/fetchOwn')
+ await Promise.all([
+ store.dispatch('playlists/fetchOwn'),
+ fetchTracks()
+ ])
responseHandlers.success()
} catch (error) {
responseHandlers.errored(error as BackendError)
@@ -185,8 +190,8 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>
>
-
{{ error }}
@@ -206,8 +211,8 @@ const insertMany = async (insertedTracks: Track[], allowDuplicates: boolean) =>