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:
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user