fix: Persist group collapse state across auto-refresh
Fix the issue where groups would collapse but immediately reopen on next refresh:
Problem:
- Groups collapsed correctly but reopened after 1 second due to auto-refresh
- The toggleGroup function used classList.contains('collapsed') to check state
- But displayDownloads() regenerated HTML every second, losing the collapsed state
Solution:
- Add collapsedGroups Set to store which group IDs are collapsed
- Check collapsedGroups.has(groupId) instead of DOM class
- Save state in memory when toggling (add/delete from Set)
- Apply collapsed state when generating HTML (inline styles and CSS class)
- Groups now stay collapsed across auto-refresh cycles
The collapsed state persists:
- Across auto-refresh (every second)
- When filters change (commented out optional reset)
- Until user manually expands the group again
This commit is contained in:
+13
-3
@@ -837,6 +837,7 @@
|
|||||||
let currentAnimeUrl = '';
|
let currentAnimeUrl = '';
|
||||||
let searchResultsCache = {};
|
let searchResultsCache = {};
|
||||||
let allDownloads = []; // Store all downloads for filtering
|
let allDownloads = []; // Store all downloads for filtering
|
||||||
|
let collapsedGroups = new Set(); // Store which groups are collapsed
|
||||||
|
|
||||||
// Extract series name from filename (for grouping)
|
// Extract series name from filename (for grouping)
|
||||||
function extractSeriesName(filename) {
|
function extractSeriesName(filename) {
|
||||||
@@ -894,6 +895,9 @@
|
|||||||
const groupBy = document.getElementById('groupBy').value;
|
const groupBy = document.getElementById('groupBy').value;
|
||||||
const searchTerm = document.getElementById('searchDownloads').value.toLowerCase();
|
const searchTerm = document.getElementById('searchDownloads').value.toLowerCase();
|
||||||
|
|
||||||
|
// Clear collapsed groups when filters change (optional)
|
||||||
|
// collapsedGroups.clear();
|
||||||
|
|
||||||
// Filter by status and search
|
// Filter by status and search
|
||||||
let filtered = allDownloads.filter(dl => {
|
let filtered = allDownloads.filter(dl => {
|
||||||
const matchesStatus = statusFilter === 'all' || dl.status === statusFilter;
|
const matchesStatus = statusFilter === 'all' || dl.status === statusFilter;
|
||||||
@@ -1547,13 +1551,17 @@
|
|||||||
groupNames.forEach((groupName, index) => {
|
groupNames.forEach((groupName, index) => {
|
||||||
const groupDownloads = groups[groupName];
|
const groupDownloads = groups[groupName];
|
||||||
const groupId = `group-${index}`;
|
const groupId = `group-${index}`;
|
||||||
|
const isCollapsed = collapsedGroups.has(groupId);
|
||||||
|
const collapsedClass = isCollapsed ? 'collapsed' : '';
|
||||||
|
const displayStyle = isCollapsed ? 'display: none;' : '';
|
||||||
|
|
||||||
html += `
|
html += `
|
||||||
<div class="downloads-group">
|
<div class="downloads-group">
|
||||||
<div class="downloads-group-header" onclick="toggleGroup('${groupId}')">
|
<div class="downloads-group-header ${collapsedClass}" onclick="toggleGroup('${groupId}')">
|
||||||
<div class="downloads-group-title">${escapeHtml(groupName)}</div>
|
<div class="downloads-group-title">${escapeHtml(groupName)}</div>
|
||||||
<div class="downloads-group-count">${groupDownloads.length}</div>
|
<div class="downloads-group-count">${groupDownloads.length}</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="downloads-group-items" id="${groupId}">
|
<div class="downloads-group-items" id="${groupId}" style="${displayStyle}">
|
||||||
${groupDownloads.map(dl => renderDownloadItem(dl)).join('')}
|
${groupDownloads.map(dl => renderDownloadItem(dl)).join('')}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1655,18 +1663,20 @@
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const isCollapsed = header.classList.contains('collapsed');
|
const isCollapsed = collapsedGroups.has(groupId);
|
||||||
console.log('isCollapsed:', isCollapsed);
|
console.log('isCollapsed:', isCollapsed);
|
||||||
|
|
||||||
if (isCollapsed) {
|
if (isCollapsed) {
|
||||||
// Expand
|
// Expand
|
||||||
items.style.display = 'flex';
|
items.style.display = 'flex';
|
||||||
header.classList.remove('collapsed');
|
header.classList.remove('collapsed');
|
||||||
|
collapsedGroups.delete(groupId);
|
||||||
console.log('Expanded group');
|
console.log('Expanded group');
|
||||||
} else {
|
} else {
|
||||||
// Collapse
|
// Collapse
|
||||||
items.style.display = 'none';
|
items.style.display = 'none';
|
||||||
header.classList.add('collapsed');
|
header.classList.add('collapsed');
|
||||||
|
collapsedGroups.add(groupId);
|
||||||
console.log('Collapsed group');
|
console.log('Collapsed group');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user