From 4a73ef6d2439aca7fd24b82d0094f1575f748398 Mon Sep 17 00:00:00 2001 From: Broque Thomas <26755000+Nezreka@users.noreply.github.com> Date: Sat, 14 Mar 2026 18:36:05 -0700 Subject: [PATCH] Optimize enhanced view performance with event delegation and scoped DOM queries --- webui/static/script.js | 144 +++++++++++++++++++++++++++++++++++------ 1 file changed, 123 insertions(+), 21 deletions(-) diff --git a/webui/static/script.js b/webui/static/script.js index df0025a9..5939dd07 100644 --- a/webui/static/script.js +++ b/webui/static/script.js @@ -10692,14 +10692,13 @@ async function selectWishlistCategory(category) { const tracksListHTML = albumData.tracks.map(track => `
-
@@ -10713,11 +10712,10 @@ async function selectWishlistCategory(category) { albumsHTML += `
-
-
'; tracksList.innerHTML = albumsHTML; + _attachWishlistDelegation(tracksList); } else { // For Singles, show list with album images @@ -10781,10 +10780,9 @@ async function selectWishlistCategory(category) { tracksHTML += `
-
-
@@ -10800,6 +10798,7 @@ async function selectWishlistCategory(category) { }); tracksList.innerHTML = tracksHTML; + _attachWishlistDelegation(tracksList); } } catch (error) { @@ -10808,6 +10807,49 @@ async function selectWishlistCategory(category) { } } +function _attachWishlistDelegation(container) { + // Single click handler for all wishlist album/track interactions + container.addEventListener('click', (e) => { + const target = e.target; + + // Skip checkbox wrapper clicks — handled by change listener + if (target.closest('.wishlist-checkbox-wrapper')) return; + + // Album header click (expand/collapse) + const header = target.closest('.wishlist-album-header'); + if (header && !target.closest('.wishlist-delete-album-btn')) { + toggleAlbumTracks(header.dataset.albumId); + return; + } + + // Album delete button + const albumDelBtn = target.closest('.wishlist-delete-album-btn'); + if (albumDelBtn) { + e.stopPropagation(); + removeAlbumFromWishlist(albumDelBtn.dataset.albumId, e); + return; + } + + // Track delete button + const trackDelBtn = target.closest('.wishlist-delete-btn'); + if (trackDelBtn && trackDelBtn.dataset.trackId) { + e.stopPropagation(); + removeTrackFromWishlist(trackDelBtn.dataset.trackId, e); + return; + } + }); + + // Separate change handler for checkboxes (more reliable than click for inputs) + container.addEventListener('change', (e) => { + const target = e.target; + if (target.classList.contains('wishlist-album-select-all-cb')) { + toggleWishlistAlbumSelection(target.dataset.albumId, target.checked); + } else if (target.classList.contains('wishlist-select-cb')) { + updateWishlistBatchBar(); + } + }); +} + function backToCategories() { const categoryTracksSection = document.getElementById('wishlist-category-tracks'); const categoryGrid = document.querySelector('.wishlist-category-grid'); @@ -19282,9 +19324,9 @@ function renderRetagGroups(groups, container) { const defaultQuery = (artist + ' ' + (group.album_name || '')).trim(); html += `
-
-