From 624c0db16ec1d5438bc8641c183173189549405d Mon Sep 17 00:00:00 2001 From: Lukas Date: Thu, 26 Feb 2026 20:52:21 +0100 Subject: [PATCH] Remove per-card NFO action buttons; add bulk NFO refresh for selected --- docs/instructions.md | 5 ++ .../web/static/js/index/selection-manager.js | 66 +++++++++++++++++++ .../web/static/js/index/series-manager.js | 49 -------------- src/server/web/templates/index.html | 4 ++ 4 files changed, 75 insertions(+), 49 deletions(-) diff --git a/docs/instructions.md b/docs/instructions.md index 7467220..142d506 100644 --- a/docs/instructions.md +++ b/docs/instructions.md @@ -120,3 +120,8 @@ For each task completed: ## TODO List: --- + +1. ~~remove gui action button for each card~~ + ~~
~~ +2. ~~add nfo refresh action for all selected cards~~ + ~~so a button right next to "Select All" that call update nfo for all selected items~~ diff --git a/src/server/web/static/js/index/selection-manager.js b/src/server/web/static/js/index/selection-manager.js index fba2760..4ee93d7 100644 --- a/src/server/web/static/js/index/selection-manager.js +++ b/src/server/web/static/js/index/selection-manager.js @@ -36,6 +36,11 @@ AniWorld.SelectionManager = (function() { if (downloadBtn) { downloadBtn.addEventListener('click', downloadSelected); } + + const refreshNfoBtn = document.getElementById('refresh-nfo-selected'); + if (refreshNfoBtn) { + refreshNfoBtn.addEventListener('click', refreshNFOForSelected); + } } /** @@ -90,6 +95,11 @@ AniWorld.SelectionManager = (function() { downloadBtn.disabled = selectedSeries.size === 0; + const refreshNfoBtn = document.getElementById('refresh-nfo-selected'); + if (refreshNfoBtn) { + refreshNfoBtn.disabled = selectedSeries.size === 0; + } + const allSelectableSelected = selectableKeys.every(function(key) { return selectedSeries.has(key); }); @@ -274,6 +284,60 @@ AniWorld.SelectionManager = (function() { } } + /** + * Get selected series keys + * @returns {Array} + */ + function getSelectedKeys() { + return Array.from(selectedSeries); + } + + /** + * Refresh NFO metadata for all selected series + */ + async function refreshNFOForSelected() { + if (selectedSeries.size === 0) { + AniWorld.UI.showToast('No series selected', 'warning'); + return; + } + + if (!AniWorld.NFOManager) { + AniWorld.UI.showToast('NFO Manager not available', 'error'); + return; + } + + const keys = Array.from(selectedSeries); + let successCount = 0; + let failCount = 0; + + AniWorld.UI.showLoading('Refreshing NFO for ' + keys.length + ' series...'); + + for (const key of keys) { + try { + await AniWorld.NFOManager.refreshNFO(key); + successCount++; + } catch (error) { + console.error('Error refreshing NFO for ' + key + ':', error); + failCount++; + } + } + + AniWorld.UI.hideLoading(); + + if (failCount === 0) { + AniWorld.UI.showToast('NFO refreshed for ' + successCount + ' series', 'success'); + } else { + AniWorld.UI.showToast( + 'NFO refreshed for ' + successCount + ' series, ' + failCount + ' failed', + failCount === keys.length ? 'error' : 'warning' + ); + } + + if (successCount > 0 && AniWorld.SeriesManager) { + AniWorld.SeriesManager.loadSeries(); + } + } + /** * Get selected series count * @returns {number} @@ -291,6 +355,8 @@ AniWorld.SelectionManager = (function() { toggleSelectAll: toggleSelectAll, clearSelection: clearSelection, downloadSelected: downloadSelected, + refreshNFOForSelected: refreshNFOForSelected, + getSelectedKeys: getSelectedKeys, getSelectionCount: getSelectionCount }; })(); diff --git a/src/server/web/static/js/index/series-manager.js b/src/server/web/static/js/index/series-manager.js index ea3a66a..b43facf 100644 --- a/src/server/web/static/js/index/series-manager.js +++ b/src/server/web/static/js/index/series-manager.js @@ -237,46 +237,6 @@ AniWorld.SeriesManager = (function() { }); }); - // Bind NFO button events - grid.querySelectorAll('.nfo-create-btn').forEach(function(btn) { - btn.addEventListener('click', function(e) { - e.stopPropagation(); - const seriesKey = e.currentTarget.dataset.key; - if (AniWorld.NFOManager) { - AniWorld.NFOManager.createNFO(seriesKey).then(function() { - // Reload series to reflect new NFO status - loadSeries(); - }).catch(function(error) { - console.error('Error creating NFO:', error); - }); - } - }); - }); - - grid.querySelectorAll('.nfo-view-btn').forEach(function(btn) { - btn.addEventListener('click', function(e) { - e.stopPropagation(); - const seriesKey = e.currentTarget.dataset.key; - if (AniWorld.NFOManager) { - AniWorld.NFOManager.showNFOModal(seriesKey); - } - }); - }); - - grid.querySelectorAll('.nfo-refresh-btn').forEach(function(btn) { - btn.addEventListener('click', function(e) { - e.stopPropagation(); - const seriesKey = e.currentTarget.dataset.key; - if (AniWorld.NFOManager) { - AniWorld.NFOManager.refreshNFO(seriesKey).then(function() { - // Reload series to reflect updated NFO - loadSeries(); - }).catch(function(error) { - console.error('Error refreshing NFO:', error); - }); - } - }); - }); } /** @@ -376,15 +336,6 @@ AniWorld.SeriesManager = (function() { '' + serie.site + '' + '' + (isLoading ? getLoadingIndicatorHTML(serie) : '') + - '
' + - (hasNfo ? - '' + - '' : - '') + - '
' + ''; } diff --git a/src/server/web/templates/index.html b/src/server/web/templates/index.html index 8b64b8b..f7b99fa 100644 --- a/src/server/web/templates/index.html +++ b/src/server/web/templates/index.html @@ -141,6 +141,10 @@ Select All +