FIX: search history
This commit is contained in:
parent
baec739b01
commit
43a6e17df9
2 changed files with 80 additions and 0 deletions
|
|
@ -2123,6 +2123,10 @@ document.addEventListener('DOMContentLoaded', async () => {
|
||||||
ui.renderSearchHistory();
|
ui.renderSearchHistory();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
searchInput.addEventListener('click', () => {
|
||||||
|
ui.renderSearchHistory();
|
||||||
|
});
|
||||||
|
|
||||||
document.addEventListener('click', (e) => {
|
document.addEventListener('click', (e) => {
|
||||||
if (!e.target.closest('.search-bar')) {
|
if (!e.target.closest('.search-bar')) {
|
||||||
const historyEl = document.getElementById('search-history');
|
const historyEl = document.getElementById('search-history');
|
||||||
|
|
|
||||||
76
js/ui.js
76
js/ui.js
|
|
@ -2078,6 +2078,82 @@ export class UIRenderer {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
renderSearchHistory() {
|
||||||
|
const historyEl = document.getElementById('search-history');
|
||||||
|
if (!historyEl) return;
|
||||||
|
const history = JSON.parse(localStorage.getItem('search-history') || '[]');
|
||||||
|
if (history.length === 0) {
|
||||||
|
historyEl.style.display = 'none';
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
historyEl.innerHTML =
|
||||||
|
history
|
||||||
|
.map(
|
||||||
|
(query) => `
|
||||||
|
<div class="search-history-item" data-query="${escapeHtml(query)}">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="history-icon">
|
||||||
|
<circle cx="12" cy="12" r="10"></circle>
|
||||||
|
<polyline points="12 6 12 12 16 14"></polyline>
|
||||||
|
</svg>
|
||||||
|
<span class="query-text">${escapeHtml(query)}</span>
|
||||||
|
<span class="delete-history-btn" title="Remove from history">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><line x1="18" y1="6" x2="6" y2="18"></line><line x1="6" y1="6" x2="18" y2="18"></line></svg>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
`
|
||||||
|
)
|
||||||
|
.join('') +
|
||||||
|
`
|
||||||
|
<div class="search-history-clear-all" id="clear-search-history">
|
||||||
|
Clear all history
|
||||||
|
</div>
|
||||||
|
`;
|
||||||
|
historyEl.style.display = 'block';
|
||||||
|
|
||||||
|
historyEl.querySelectorAll('.search-history-item').forEach((item) => {
|
||||||
|
item.addEventListener('click', (e) => {
|
||||||
|
if (e.target.closest('.delete-history-btn')) {
|
||||||
|
e.stopPropagation();
|
||||||
|
this.removeFromSearchHistory(item.dataset.query);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const query = item.dataset.query;
|
||||||
|
const searchInput = document.getElementById('search-input');
|
||||||
|
if (searchInput) {
|
||||||
|
searchInput.value = query;
|
||||||
|
searchInput.dispatchEvent(new Event('input'));
|
||||||
|
historyEl.style.display = 'none';
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
const clearBtn = document.getElementById('clear-search-history');
|
||||||
|
if (clearBtn) {
|
||||||
|
clearBtn.addEventListener('click', (e) => {
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopPropagation();
|
||||||
|
localStorage.removeItem('search-history');
|
||||||
|
this.renderSearchHistory();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
removeFromSearchHistory(query) {
|
||||||
|
let history = JSON.parse(localStorage.getItem('search-history') || '[]');
|
||||||
|
history = history.filter((q) => q !== query);
|
||||||
|
localStorage.setItem('search-history', JSON.stringify(history));
|
||||||
|
this.renderSearchHistory();
|
||||||
|
}
|
||||||
|
|
||||||
|
addToSearchHistory(query) {
|
||||||
|
if (!query || query.trim().length === 0) return;
|
||||||
|
let history = JSON.parse(localStorage.getItem('search-history') || '[]');
|
||||||
|
history = history.filter((q) => q !== query);
|
||||||
|
history.unshift(query);
|
||||||
|
history = history.slice(0, 10);
|
||||||
|
localStorage.setItem('search-history', JSON.stringify(history));
|
||||||
|
}
|
||||||
|
|
||||||
async renderAlbumPage(albumId, provider = null) {
|
async renderAlbumPage(albumId, provider = null) {
|
||||||
this.showPage('album');
|
this.showPage('album');
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue