Optimize UI: Update playlist status without refetching all playlists

- After linking/unlinking, update UI state directly instead of refetching
- Avoids 7+ second delay from fetching track stats for all playlists
- Added data-playlist-id attribute to table rows for easy lookup
- Only refreshes Active Playlists tab (fast operation)
- Much better UX when linking multiple playlists
This commit is contained in:
2026-02-03 17:40:47 -05:00
parent b3bfa16b93
commit ef0ee65160

View File

@@ -1182,7 +1182,7 @@
const externalAvail = p.externalAvailable || 0; const externalAvail = p.externalAvailable || 0;
return ` return `
<tr> <tr data-playlist-id="${escapeHtml(p.id)}">
<td><strong>${escapeHtml(p.name)}</strong></td> <td><strong>${escapeHtml(p.name)}</strong></td>
<td class="track-count">${localCount}</td> <td class="track-count">${localCount}</td>
<td class="track-count">${externalCount > 0 ? `${externalAvail}/${externalCount}` : '-'}</td> <td class="track-count">${externalCount > 0 ? `${externalAvail}/${externalCount}` : '-'}</td>
@@ -1246,9 +1246,22 @@
showToast('Playlist linked!', 'success'); showToast('Playlist linked!', 'success');
showRestartBanner(); showRestartBanner();
closeModal('link-playlist-modal'); closeModal('link-playlist-modal');
// Refresh both tabs to show updated status
fetchJellyfinPlaylists(); // Update UI state without refetching all playlists
fetchPlaylists(); const playlistsTable = document.getElementById('jellyfinPlaylistsTable');
if (playlistsTable) {
const rows = playlistsTable.querySelectorAll('tr');
rows.forEach(row => {
if (row.dataset.playlistId === jellyfinId) {
const actionCell = row.querySelector('td:last-child');
if (actionCell) {
actionCell.innerHTML = `<button class="danger" onclick="unlinkPlaylist('${escapeJs(name)}')">Unlink</button>`;
}
}
});
}
fetchPlaylists(); // Only refresh the Active Playlists tab
} else { } else {
showToast(data.error || 'Failed to link playlist', 'error'); showToast(data.error || 'Failed to link playlist', 'error');
} }
@@ -1270,8 +1283,24 @@
if (res.ok) { if (res.ok) {
showToast('Playlist unlinked.', 'success'); showToast('Playlist unlinked.', 'success');
showRestartBanner(); showRestartBanner();
fetchJellyfinPlaylists();
fetchPlaylists(); // Update UI state without refetching all playlists
const playlistsTable = document.getElementById('jellyfinPlaylistsTable');
if (playlistsTable) {
const rows = playlistsTable.querySelectorAll('tr');
rows.forEach(row => {
const nameCell = row.querySelector('td:first-child');
if (nameCell && nameCell.textContent === name) {
const actionCell = row.querySelector('td:last-child');
if (actionCell) {
const playlistId = row.dataset.playlistId;
actionCell.innerHTML = `<button class="primary" onclick="openLinkPlaylist('${escapeJs(playlistId)}', '${escapeJs(name)}')">Link to Spotify</button>`;
}
}
});
}
fetchPlaylists(); // Only refresh the Active Playlists tab
} else { } else {
showToast(data.error || 'Failed to unlink playlist', 'error'); showToast(data.error || 'Failed to unlink playlist', 'error');
} }