|
@@ -1,5 +1,4 @@
|
|
|
<script setup lang="ts">
|
|
|
-// TODO - Fix sortable
|
|
|
import {
|
|
|
defineAsyncComponent,
|
|
|
ref,
|
|
@@ -8,7 +7,6 @@ import {
|
|
|
onBeforeUnmount
|
|
|
} from "vue";
|
|
|
import Toast from "toasters";
|
|
|
-import { Sortable } from "sortablejs-vue3";
|
|
|
import { storeToRefs } from "pinia";
|
|
|
import { useWebsocketsStore } from "@/stores/websockets";
|
|
|
import { useModalsStore } from "@/stores/modals";
|
|
@@ -19,6 +17,9 @@ const Modal = defineAsyncComponent(() => import("@/components/Modal.vue"));
|
|
|
const SongItem = defineAsyncComponent(
|
|
|
() => import("@/components/SongItem.vue")
|
|
|
);
|
|
|
+const Draggable = defineAsyncComponent(
|
|
|
+ () => import("@/components/Draggable.vue")
|
|
|
+);
|
|
|
|
|
|
const props = defineProps({
|
|
|
modalUuid: { type: String, default: "" }
|
|
@@ -56,7 +57,6 @@ const discogs = ref({
|
|
|
disableLoadMore: false
|
|
|
});
|
|
|
const discogsTabs = ref([]);
|
|
|
-const sortableUpdateNumber = ref(0);
|
|
|
|
|
|
// TODO might not not be needed anymore, might be able to directly edit prefillDiscogs
|
|
|
const localPrefillDiscogs = computed({
|
|
@@ -333,60 +333,52 @@ const updateTrackSong = updatedSong => {
|
|
|
});
|
|
|
};
|
|
|
|
|
|
-const updatePlaylistSongPosition = ({ oldIndex, newIndex }) => {
|
|
|
- if (oldIndex === newIndex) return;
|
|
|
- const oldSongs = playlistSongs.value;
|
|
|
- oldSongs.splice(newIndex, 0, oldSongs.splice(oldIndex, 1)[0]);
|
|
|
- playlistSongs.value = oldSongs;
|
|
|
-};
|
|
|
-
|
|
|
-const updateTrackSongPosition = (trackIndex, { oldIndex, newIndex }) => {
|
|
|
- if (oldIndex === newIndex) return;
|
|
|
- const oldSongs = trackSongs.value[trackIndex];
|
|
|
- oldSongs.splice(newIndex, 0, oldSongs.splice(oldIndex, 1)[0]);
|
|
|
- trackSongs.value[trackIndex] = oldSongs;
|
|
|
-};
|
|
|
-
|
|
|
-const playlistSongAdded = event => {
|
|
|
- const fromTrack = event.from;
|
|
|
- const fromTrackIndex = Number(fromTrack.dataset.trackIndex);
|
|
|
- const song = trackSongs.value[fromTrackIndex][event.oldIndex];
|
|
|
- const newPlaylistSongs = JSON.parse(JSON.stringify(playlistSongs.value));
|
|
|
- newPlaylistSongs.splice(event.newIndex, 0, song);
|
|
|
- playlistSongs.value = newPlaylistSongs;
|
|
|
-
|
|
|
- sortableUpdateNumber.value += 1;
|
|
|
-};
|
|
|
-
|
|
|
-const playlistSongRemoved = event => {
|
|
|
- playlistSongs.value.splice(event.oldIndex, 1);
|
|
|
-
|
|
|
- sortableUpdateNumber.value += 1;
|
|
|
-};
|
|
|
-
|
|
|
-const trackSongAdded = (trackIndex, event) => {
|
|
|
- const fromElement = event.from;
|
|
|
- let song = null;
|
|
|
- if (fromElement.dataset.trackIndex) {
|
|
|
- const fromTrackIndex = Number(fromElement.dataset.trackIndex);
|
|
|
- song = trackSongs.value[fromTrackIndex][event.oldIndex];
|
|
|
- } else {
|
|
|
- song = playlistSongs.value[event.oldIndex];
|
|
|
- }
|
|
|
- const newTrackSongs = JSON.parse(
|
|
|
- JSON.stringify(trackSongs.value[trackIndex])
|
|
|
- );
|
|
|
- newTrackSongs.splice(event.newIndex, 0, song);
|
|
|
- trackSongs.value[trackIndex] = newTrackSongs;
|
|
|
-
|
|
|
- sortableUpdateNumber.value += 1;
|
|
|
-};
|
|
|
-
|
|
|
-const trackSongRemoved = (trackIndex, event) => {
|
|
|
- trackSongs.value[trackIndex].splice(event.oldIndex, 1);
|
|
|
-
|
|
|
- sortableUpdateNumber.value += 1;
|
|
|
-};
|
|
|
+// const updatePlaylistSongPosition = ({ oldIndex, newIndex }) => {
|
|
|
+// if (oldIndex === newIndex) return;
|
|
|
+// const oldSongs = playlistSongs.value;
|
|
|
+// oldSongs.splice(newIndex, 0, oldSongs.splice(oldIndex, 1)[0]);
|
|
|
+// playlistSongs.value = oldSongs;
|
|
|
+// };
|
|
|
+
|
|
|
+// const updateTrackSongPosition = (trackIndex, { oldIndex, newIndex }) => {
|
|
|
+// if (oldIndex === newIndex) return;
|
|
|
+// const oldSongs = trackSongs.value[trackIndex];
|
|
|
+// oldSongs.splice(newIndex, 0, oldSongs.splice(oldIndex, 1)[0]);
|
|
|
+// trackSongs.value[trackIndex] = oldSongs;
|
|
|
+// };
|
|
|
+
|
|
|
+// const playlistSongAdded = event => {
|
|
|
+// const fromTrack = event.from;
|
|
|
+// const fromTrackIndex = Number(fromTrack.dataset.trackIndex);
|
|
|
+// const song = trackSongs.value[fromTrackIndex][event.oldIndex];
|
|
|
+// const newPlaylistSongs = JSON.parse(JSON.stringify(playlistSongs.value));
|
|
|
+// newPlaylistSongs.splice(event.newIndex, 0, song);
|
|
|
+// playlistSongs.value = newPlaylistSongs;
|
|
|
+// };
|
|
|
+
|
|
|
+// const playlistSongRemoved = event => {
|
|
|
+// playlistSongs.value.splice(event.oldIndex, 1);
|
|
|
+// };
|
|
|
+
|
|
|
+// const trackSongAdded = (trackIndex, event) => {
|
|
|
+// const fromElement = event.from;
|
|
|
+// let song = null;
|
|
|
+// if (fromElement.dataset.trackIndex) {
|
|
|
+// const fromTrackIndex = Number(fromElement.dataset.trackIndex);
|
|
|
+// song = trackSongs.value[fromTrackIndex][event.oldIndex];
|
|
|
+// } else {
|
|
|
+// song = playlistSongs.value[event.oldIndex];
|
|
|
+// }
|
|
|
+// const newTrackSongs = JSON.parse(
|
|
|
+// JSON.stringify(trackSongs.value[trackIndex])
|
|
|
+// );
|
|
|
+// newTrackSongs.splice(event.newIndex, 0, song);
|
|
|
+// trackSongs.value[trackIndex] = newTrackSongs;
|
|
|
+// };
|
|
|
+
|
|
|
+// const trackSongRemoved = (trackIndex, event) => {
|
|
|
+// trackSongs.value[trackIndex].splice(event.oldIndex, 1);
|
|
|
+// };
|
|
|
|
|
|
onMounted(() => {
|
|
|
ws.onConnect(init);
|
|
@@ -657,15 +649,11 @@ onBeforeUnmount(() => {
|
|
|
>
|
|
|
Reset
|
|
|
</button>
|
|
|
- <sortable
|
|
|
- :key="`${sortableUpdateNumber}-playlistSongs`"
|
|
|
+ <draggable
|
|
|
v-if="playlistSongs.length > 0"
|
|
|
- :list="playlistSongs"
|
|
|
+ v-model:list="playlistSongs"
|
|
|
item-key="_id"
|
|
|
- :options="{ group: 'songs' }"
|
|
|
- @update="updatePlaylistSongPosition"
|
|
|
- @add="playlistSongAdded"
|
|
|
- @remove="playlistSongRemoved"
|
|
|
+ :group="`import-album-${modalUuid}-songs`"
|
|
|
>
|
|
|
<template #item="{ element }">
|
|
|
<song-item
|
|
@@ -674,7 +662,7 @@ onBeforeUnmount(() => {
|
|
|
>
|
|
|
</song-item>
|
|
|
</template>
|
|
|
- </sortable>
|
|
|
+ </draggable>
|
|
|
</div>
|
|
|
<div
|
|
|
class="track-boxes"
|
|
@@ -689,16 +677,12 @@ onBeforeUnmount(() => {
|
|
|
<span>{{ track.position }}.</span>
|
|
|
<p>{{ track.title }}</p>
|
|
|
</div>
|
|
|
- <sortable
|
|
|
- :key="`${sortableUpdateNumber}-${index}-playlistSongs`"
|
|
|
+ <draggable
|
|
|
class="track-box-songs-drag-area"
|
|
|
- :list="trackSongs[index]"
|
|
|
+ v-model:list="trackSongs[index]"
|
|
|
:data-track-index="index"
|
|
|
item-key="_id"
|
|
|
- :options="{ group: 'songs' }"
|
|
|
- @update="updateTrackSongPosition(index, $event)"
|
|
|
- @add="trackSongAdded(index, $event)"
|
|
|
- @remove="trackSongRemoved(index, $event)"
|
|
|
+ :group="`import-album-${modalUuid}-songs`"
|
|
|
>
|
|
|
<template #item="{ element }">
|
|
|
<song-item
|
|
@@ -707,7 +691,7 @@ onBeforeUnmount(() => {
|
|
|
>
|
|
|
</song-item>
|
|
|
</template>
|
|
|
- </sortable>
|
|
|
+ </draggable>
|
|
|
</div>
|
|
|
</div>
|
|
|
</template>
|