diff --git a/front/package.json b/front/package.json
index d2135afd7..23ea89142 100644
--- a/front/package.json
+++ b/front/package.json
@@ -44,6 +44,7 @@
"vue-router": "4.1.2",
"vue-tsc": "0.38.9",
"vue-upload-component": "3.1.2",
+ "vue-virtual-scroller": "^2.0.0-alpha.1",
"vue3-gettext": "2.3.0",
"vue3-lazyload": "0.3.5",
"vue3-virtual-scroll-list": "0.2.0",
@@ -61,6 +62,7 @@
"@types/qs": "6.9.7",
"@types/semantic-ui": "2.2.7",
"@types/showdown": "2.0.0",
+ "@types/vue-virtual-scroller": "npm:@earltp/vue-virtual-scroller",
"@typescript-eslint/eslint-plugin": "5.30.7",
"@vitejs/plugin-vue": "3.0.1",
"@vue/compiler-sfc": "3.2.37",
diff --git a/front/src/components/Queue.vue b/front/src/components/Queue.vue
index 5e408382e..6aafd088c 100644
--- a/front/src/components/Queue.vue
+++ b/front/src/components/Queue.vue
@@ -387,12 +387,19 @@ const reorderTracks = async (from: number, to: number) => {
:list="queueItems"
:component="QueueItem"
:size="50"
- :item-class="(index: number) => currentIndex === index ? 'active': ''"
- data-key="id"
- @play="play"
- @remove="removeTrack"
@reorder="reorderTracks"
- />
+ >
+
+
+
+
string
}
interface Emits {
@@ -18,7 +17,6 @@ defineEmits
()
diff --git a/front/src/components/vui/list/VirtualList.vue b/front/src/components/vui/list/VirtualList.vue
index 43c8f8d0c..7836a3d01 100644
--- a/front/src/components/vui/list/VirtualList.vue
+++ b/front/src/components/vui/list/VirtualList.vue
@@ -4,9 +4,10 @@ import type { MaybeElementRef, MaybeElement } from '@vueuse/core'
import { useMouse, useCurrentElement, useResizeObserver, useRafFn, useElementByPoint } from '@vueuse/core'
import { ref, watchEffect, reactive } from 'vue'
-import VirtualItem from './VirtualItem.vue'
// @ts-expect-error no typings
-import VirtualList from 'vue3-virtual-scroll-list'
+// import VirtualList from 'vue3-virtual-scroll-list'
+import { RecycleScroller } from 'vue-virtual-scroller'
+import 'vue-virtual-scroller/dist/vue-virtual-scroller.css'
interface Emits {
(e: 'reorder', from: number, to: number): void
@@ -15,7 +16,6 @@ interface Emits {
interface Props {
list: object[]
size: number
- dataKey: string
}
const emit = defineEmits
()
@@ -31,7 +31,7 @@ const getIndex = (element: HTMLElement) => +(element?.getAttribute('data-index')
const isTouch = ref(false)
const onMousedown = (event: MouseEvent | TouchEvent) => {
const element = event.target as HTMLElement
- const dragItem = element.closest('.drag-item')?.children[0] as HTMLElement
+ const dragItem = element.closest('.drag-item') as HTMLElement
if (!dragItem || !element.classList.contains('handle')) return
// Touch devices stop emitting touch events while container is scrolled
@@ -68,10 +68,7 @@ document.addEventListener('touchcancel', (event: TouchEvent) => {
})
const reorder = (event: MouseEvent | TouchEvent) => {
- const element = event.target as HTMLElement
- const dragItem = element.closest('.drag-item')?.children[0]
-
- if (dragItem && draggedItem.value) {
+ if (draggedItem.value) {
const from = draggedItem.value.index
let to = hoveredIndex.value
@@ -98,10 +95,6 @@ const cleanup = () => {
scrollDirection.value = undefined
}
-const dragClassHandler = (index: number) => draggedItem.value && hoveredIndex.value === index
- ? `drop-${position.value}`
- : ''
-
const scrollDirection = ref()
const containerSize = reactive({ bottom: 0, top: 0 })
const { x, y: screenY } = useMouse({ type: 'client' })
@@ -109,12 +102,14 @@ const { element: hoveredElement } = useElementByPoint({ x, y: screenY })
// Find current index and position on both desktop and mobile devices
watchEffect(() => {
- const dragItem = (hoveredElement.value as HTMLElement)?.closest('.drag-item')?.children[0] as HTMLElement
- if (!dragItem) return
+ if (draggedItem.value) {
+ const dragItem = (hoveredElement.value as HTMLElement)?.closest('.drag-item') as HTMLElement
+ if (!dragItem) return
- hoveredIndex.value = getIndex(dragItem)
- const { y } = dragItem.getBoundingClientRect()
- position.value = screenY.value - y < props.size / 2 ? 'before' : 'after'
+ hoveredIndex.value = getIndex(dragItem)
+ const { y } = dragItem.getBoundingClientRect()
+ position.value = screenY.value - y < props.size / 2 ? 'before' : 'after'
+ }
})
// Automatically scroll when on the edge
@@ -137,7 +132,6 @@ watchEffect(() => {
scrollDirection.value = undefined
})
-const keeps = ref(30)
const el = useCurrentElement()
useResizeObserver(el as unknown as MaybeElementRef, ([entry]) => {
const height = entry.borderBoxSize?.[0]?.blockSize ?? 0
@@ -145,7 +139,6 @@ useResizeObserver(el as unknown as MaybeElementRef, ([entry]) => {
if (height !== 0) {
containerSize.top = (entry.target as HTMLElement).offsetTop
containerSize.bottom = height + containerSize.top
- keeps.value = (containerSize.bottom - containerSize.top) / props.size * 2 | 0
}
})
@@ -164,38 +157,29 @@ const { resume, pause } = useRafFn(() => {
const virtualList = ref()
defineExpose({
- scrollToIndex: (index: number) => virtualList.value?.scrollToIndex(index),
+ scrollToIndex: (index: number) => virtualList.value?.scrollToItem(index),
cleanup
})
-
-