fix: keep search controls visible and enable suggestion click-to-resolve

- Search input and button now stay visible after Search Again for unlimited searches
- Clicking a suggestion populates provider key and triggers resolve, card disappears
- Added data-provider-key attribute to suggestion links for click handling
This commit is contained in:
2026-06-07 16:18:50 +02:00
parent f3042206a8
commit cf00c9f7c5

View File

@@ -594,13 +594,13 @@
? folder.search_suggestions.map(s => ` ? folder.search_suggestions.map(s => `
<div class="suggestion-item"> <div class="suggestion-item">
<i class="fas fa-link"></i> <i class="fas fa-link"></i>
<a href="${s.link}" class="suggestion-link" target="_blank">${s.name || s.title}</a> <a href="#" class="suggestion-link" data-provider-key="${s.provider_key || s.key || ''}" data-folder="${folder.folder_name}">${s.name || s.title}</a>
</div> </div>
`).join('') `).join('')
: '<div class="no-suggestions"><i class="fas fa-info-circle"></i> No suggestions found</div>'; : '<div class="no-suggestions"><i class="fas fa-info-circle"></i> No suggestions found</div>';
const searchAgainBtn = (folder.search_suggestions && folder.search_suggestions.length === 0) // Always show search row so user can search multiple times
? `<div class="search-again-row"> const searchAgainBtn = `<div class="search-again-row">
<input type="text" class="search-again-input" <input type="text" class="search-again-input"
placeholder="Custom search..." placeholder="Custom search..."
value="${folder.title || ''}" value="${folder.title || ''}"
@@ -608,8 +608,7 @@
<button class="search-again-btn" data-folder="${folder.folder_name}"> <button class="search-again-btn" data-folder="${folder.folder_name}">
<i class="fas fa-search"></i> Search Again <i class="fas fa-search"></i> Search Again
</button> </button>
</div>` </div>`;
: '';
return ` return `
<div class="folder-item" data-folder="${folder.folder_name}"> <div class="folder-item" data-folder="${folder.folder_name}">
@@ -767,22 +766,79 @@
suggestionsEl.innerHTML = result.search_suggestions.map(s => ` suggestionsEl.innerHTML = result.search_suggestions.map(s => `
<div class="suggestion-item"> <div class="suggestion-item">
<i class="fas fa-link"></i> <i class="fas fa-link"></i>
<a href="${s.link}" class="suggestion-link" target="_blank">${s.name || s.title}</a> <a href="#" class="suggestion-link" data-provider-key="${s.provider_key || s.key || ''}" data-folder="${folder}">${s.name || s.title}</a>
</div> </div>
`).join(''); `).join('');
} else { } else {
suggestionsEl.innerHTML = '<div class="no-suggestions"><i class="fas fa-info-circle"></i> No suggestions found</div>'; suggestionsEl.innerHTML = '<div class="no-suggestions"><i class="fas fa-info-circle"></i> No suggestions found</div>';
} }
// Remove the search row since we now have suggestions (or none) // Keep search row visible for additional searches
const searchRow = item.querySelector('.search-again-row'); btn.classList.remove('searching');
if (searchRow) searchRow.remove(); btn.innerHTML = '<i class="fas fa-search"></i> Search Again';
} catch (err) { } catch (err) {
showToast('Search failed', 'error'); showToast('Search failed', 'error');
btn.classList.remove('searching');
btn.innerHTML = '<i class="fas fa-search"></i> Search Again';
} finally { } finally {
btn.classList.remove('searching'); btn.classList.remove('searching');
} }
}); });
}); });
// Suggestion link click - populate input and resolve
document.querySelectorAll('.suggestion-link').forEach(link => {
link.addEventListener('click', async (e) => {
e.preventDefault();
const providerKey = e.target.dataset.providerKey;
const folder = e.target.dataset.folder;
if (!providerKey) {
showToast('No provider key available for this suggestion', 'error');
return;
}
const input = document.querySelector(`.folder-input[data-folder="${folder}"]`);
const resolveBtn = document.querySelector(`.resolve-btn[data-folder="${folder}"]`);
const item = document.querySelector(`.folder-item[data-folder="${folder}"]`);
const errEl = document.querySelector(`.folder-error[data-folder="${folder}"]`);
if (!input || !resolveBtn || !item) return;
// Populate input and enable button
input.value = providerKey;
resolveBtn.disabled = false;
// Trigger resolve
item.classList.add('resolving');
resolveBtn.disabled = true;
resolveBtn.innerHTML = '<i class="fas fa-spinner fa-spin"></i>';
try {
const result = await resolveFolder(folder, providerKey);
if (result.status === 'success') {
showToast(`Added: ${result.message.replace('Successfully resolved and added series: ', '')}`, 'success');
item.classList.add('resolved');
setTimeout(() => {
item.remove();
checkEmptyList();
}, 400);
} else {
errEl.textContent = result.detail || result.message || 'Failed to resolve';
errEl.classList.add('visible');
resolveBtn.disabled = false;
resolveBtn.innerHTML = 'Resolve';
}
} catch (err) {
errEl.textContent = 'Server error. Please try again.';
errEl.classList.add('visible');
resolveBtn.disabled = false;
resolveBtn.innerHTML = 'Resolve';
} finally {
item.classList.remove('resolving');
}
});
});
} }
function checkEmptyList() { function checkEmptyList() {