From 698c6abd15a58eec203800ec2e4338d3f0c40fb7 Mon Sep 17 00:00:00 2001 From: Julien Maille Date: Tue, 30 Dec 2025 17:54:33 +0100 Subject: [PATCH] fix for queue list closing when modified --- js/side-panel.js | 13 +++ js/ui-interactions.js | 190 +++++++++++++++++++++--------------------- 2 files changed, 110 insertions(+), 93 deletions(-) diff --git a/js/side-panel.js b/js/side-panel.js index f48106e..730a4f3 100644 --- a/js/side-panel.js +++ b/js/side-panel.js @@ -44,6 +44,19 @@ export class SidePanelManager { return this.currentView === view && this.panel.classList.contains('active'); } + refresh(view, renderControlsCallback, renderContentCallback) { + if (this.isActive(view)) { + if (renderControlsCallback) { + this.controlsElement.innerHTML = ''; + renderControlsCallback(this.controlsElement); + } + if (renderContentCallback) { + this.contentElement.innerHTML = ''; + renderContentCallback(this.contentElement); + } + } + } + updateContent(view, renderContentCallback) { if (this.isActive(view)) { this.contentElement.innerHTML = ''; diff --git a/js/ui-interactions.js b/js/ui-interactions.js index 397bf2a..f6fa90d 100644 --- a/js/ui-interactions.js +++ b/js/ui-interactions.js @@ -30,111 +30,115 @@ export function initializeUIInteractions(player, api) { }); // Queue panel - const openQueuePanel = () => { - const renderControls = (container) => { - const currentQueue = player.getCurrentQueue(); - const showClearBtn = currentQueue.length > 0; + const renderQueueControls = (container) => { + const currentQueue = player.getCurrentQueue(); + const showClearBtn = currentQueue.length > 0; - container.innerHTML = ` - - - `; + container.innerHTML = ` + + + `; - container.querySelector('#close-side-panel-btn').addEventListener('click', () => { - sidePanelManager.close(); + container.querySelector('#close-side-panel-btn').addEventListener('click', () => { + sidePanelManager.close(); + }); + + const clearBtn = container.querySelector('#clear-queue-btn'); + if (clearBtn) { + clearBtn.addEventListener('click', () => { + player.clearQueue(); + refreshQueuePanel(); }); + } + }; - const clearBtn = container.querySelector('#clear-queue-btn'); - if (clearBtn) { - clearBtn.addEventListener('click', () => { - player.clearQueue(); - openQueuePanel(); // Re-render to update state - }); - } - }; + const renderQueueContent = (container) => { + const currentQueue = player.getCurrentQueue(); - const renderContent = (container) => { - const currentQueue = player.getCurrentQueue(); + if (currentQueue.length === 0) { + container.innerHTML = '
Queue is empty.
'; + return; + } - if (currentQueue.length === 0) { - container.innerHTML = '
Queue is empty.
'; - return; - } + const html = currentQueue.map((track, index) => { + const isPlaying = index === player.currentQueueIndex; + const trackTitle = getTrackTitle(track); + const trackArtists = getTrackArtists(track, { fallback: "Unknown" }); - const html = currentQueue.map((track, index) => { - const isPlaying = index === player.currentQueueIndex; - const trackTitle = getTrackTitle(track); - const trackArtists = getTrackArtists(track, { fallback: "Unknown" }); - - return ` -
-
- - - - -
-
- -
-
${trackTitle}
-
${trackArtists}
-
-
-
${formatTime(track.duration)}
- + return ` +
+
+ + + +
- `; - }).join(''); +
+ +
+
${trackTitle}
+
${trackArtists}
+
+
+
${formatTime(track.duration)}
+ +
+ `; + }).join(''); - container.innerHTML = html; + container.innerHTML = html; - container.querySelectorAll('.queue-track-item').forEach((item) => { - const index = parseInt(item.dataset.queueIndex); + container.querySelectorAll('.queue-track-item').forEach((item) => { + const index = parseInt(item.dataset.queueIndex); - item.addEventListener('click', (e) => { - const removeBtn = e.target.closest('.queue-remove-btn'); - if (removeBtn) { - e.stopPropagation(); - player.removeFromQueue(index); - openQueuePanel(); // Re-render - return; - } - player.playAtIndex(index); - openQueuePanel(); // Re-render to update playing state - }); - - item.addEventListener('dragstart', (e) => { - draggedQueueIndex = index; - item.style.opacity = '0.5'; - }); - - item.addEventListener('dragend', () => { - item.style.opacity = '1'; - }); - - item.addEventListener('dragover', (e) => { - e.preventDefault(); - }); - - item.addEventListener('drop', (e) => { - e.preventDefault(); - if (draggedQueueIndex !== null && draggedQueueIndex !== index) { - player.moveInQueue(draggedQueueIndex, index); - openQueuePanel(); // Re-render - } - }); + item.addEventListener('click', (e) => { + const removeBtn = e.target.closest('.queue-remove-btn'); + if (removeBtn) { + e.stopPropagation(); + player.removeFromQueue(index); + refreshQueuePanel(); + return; + } + player.playAtIndex(index); + refreshQueuePanel(); }); - }; - sidePanelManager.open('queue', 'Queue', renderControls, renderContent); + item.addEventListener('dragstart', (e) => { + draggedQueueIndex = index; + item.style.opacity = '0.5'; + }); + + item.addEventListener('dragend', () => { + item.style.opacity = '1'; + }); + + item.addEventListener('dragover', (e) => { + e.preventDefault(); + }); + + item.addEventListener('drop', (e) => { + e.preventDefault(); + if (draggedQueueIndex !== null && draggedQueueIndex !== index) { + player.moveInQueue(draggedQueueIndex, index); + refreshQueuePanel(); + } + }); + }); + }; + + const refreshQueuePanel = () => { + sidePanelManager.refresh('queue', renderQueueControls, renderQueueContent); + }; + + const openQueuePanel = () => { + sidePanelManager.open('queue', 'Queue', renderQueueControls, renderQueueContent); }; queueBtn.addEventListener('click', openQueuePanel); @@ -142,7 +146,7 @@ export function initializeUIInteractions(player, api) { // Expose renderQueue for external updates (e.g. shuffle, add to queue) window.renderQueueFunction = () => { if (sidePanelManager.isActive('queue')) { - openQueuePanel(); // Re-open acts as update if active + refreshQueuePanel(); } };