11<script lang="ts" setup>
2+ import { useDraggable } from " vue-draggable-plus" ;
23import type { TrackModel } from " @bcc-code/bmm-sdk-fetch" ;
34
45const props = withDefaults (
@@ -11,16 +12,22 @@ const props = withDefaults(
1112 showThumbnails? : boolean ;
1213 addDropdownItems? : (items : DropdownMenuItem [], track : TrackModel ) => void ;
1314 origin? : string ;
15+ reorder? : boolean ;
1416 }>(),
1517 {
1618 skeletonCount: 5 ,
1719 addDropdownItems: undefined ,
1820 trackTypeIsKnown: undefined ,
1921 albumIsKnown: false ,
2022 origin: " " ,
23+ reorder: false ,
2124 },
2225);
2326
27+ const emit = defineEmits <{
28+ reorder: [tracks : TrackModel []];
29+ }>();
30+
2431const { setQueue } = useNuxtApp ().$mediaPlayer ;
2532
2633const isTrackTypeKnown = () => {
@@ -35,10 +42,37 @@ const isTrackTypeKnown = () => {
3542 ) || false
3643 );
3744};
45+
46+ const orderableTracks = ref <TrackModel []>([]);
47+ onMounted (() => {
48+ if (props .tracks ) {
49+ orderableTracks .value = props .tracks ;
50+ }
51+ });
52+ const trackList = ref <HTMLOListElement >();
53+ useDraggable <TrackModel >(trackList , orderableTracks , {
54+ animation: 200 ,
55+ disabled: ! props .reorder ,
56+ ghostClass: " opacity-50" ,
57+ handle: " .drag-handle" ,
58+ onSort({ oldIndex , newIndex }) {
59+ if (oldIndex === undefined || newIndex === undefined || ! props .tracks ) {
60+ return ;
61+ }
62+ const tracks = [... props .tracks ];
63+ const [removed] = tracks .splice (oldIndex , 1 );
64+ if (! removed ) {
65+ return ;
66+ }
67+ tracks .splice (newIndex , 0 , removed );
68+ emit (" reorder" , tracks );
69+ },
70+ });
3871 </script >
3972
4073<template >
4174 <ol
75+ ref =" trackList"
4276 class =" grid w-full grid-cols-tracklist grid-rows-1 gap-x-4 divide-y divide-label-separator"
4377 >
4478 <template v-if =" showSkeleton " >
@@ -58,6 +92,7 @@ const isTrackTypeKnown = () => {
5892 :add-dropdown-items =" props.addDropdownItems"
5993 :is-album-known =" props.albumIsKnown"
6094 :origin =" props.origin"
95+ :show-drag-handle =" props.reorder"
6196 @play-track =" setQueue(tracks, i, props.origin)"
6297 >
6398 </TrackItem >
0 commit comments