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
+