feat: filtre sauvegardes (Tous/Recherches/Repertoires) extensible
CI / lint (push) Failing after 3s
CI / test (push) Has been skipped
CI / build (push) Has been skipped
CI / security (push) Failing after -7s

- Barre de filtres avec 3 pills: Tous, Recherches, Repertoires
- Chaque saved-search-item a data-type=search|directory
- _applySavedFilter() masque/affiche selon le filtre actif
- _initSavedFilter() initialise les listeners (run once)
- Extensible: ajouter un pill + data-type suffit
- Gere l'etat empty quand aucun resultat pour le filtre
This commit is contained in:
2026-06-15 16:57:19 -04:00
parent 2c7b8b525a
commit 5466457a06
4 changed files with 72 additions and 4 deletions
+5 -2
View File
@@ -347,16 +347,19 @@ async function loadSavedSearches() {
if (s.exclude_paths) pathFilters.push(`<span class="saved-search-path" title="Exclure: ${escapeHtml(s.exclude_paths)}">\u{1F4E4} ${escapeHtml(s.exclude_paths)}</span>`);
const vaultStr = s.vault && s.vault !== "all" ? `<span class="saved-search-vault">\u{1F4C1} ${escapeHtml(s.vault)}</span>` : "";
return `
<div class="saved-search-item${isDirSearch ? ' saved-search-dir' : ''}">
<div class="saved-search-item${isDirSearch ? ' saved-search-dir' : ''}" data-type="${isDirSearch ? 'directory' : 'search'}">
<div class="saved-search-query">${displayQuery}</div>
<div class="saved-search-meta">
<span class="saved-search-badges">${badges.join("")} ${vaultStr}</span>
${typeIcon}
</div>
${pathFilters.length ? '<div class="saved-search-filters">' + pathFilters.join(" ") + '</div>' : ""}
<button class="saved-search-delete" data-id="${s.id}" title="Supprimer"><E2><9C><95></button>
<button class="saved-search-delete" data-id="${s.id}" title="Supprimer">✕</button>
</div>
`}).join("");
// Apply saved filter + init filter bar
if (typeof _applySavedFilter === 'function') _applySavedFilter();
if (typeof _initSavedFilter === 'function') _initSavedFilter();
list.querySelectorAll(".saved-search-item").forEach(item => {
item.addEventListener("click", (e) => {
if (e.target.classList.contains("saved-search-delete")) return;
+38 -1
View File
@@ -1054,7 +1054,7 @@ export async function loadSavedSearches() {
if (s.exclude_paths) pathFilters.push(`<span class="saved-search-path" title="Exclure: ${escapeHtml(s.exclude_paths)}">📤 ${escapeHtml(s.exclude_paths)}</span>`);
const vaultStr = s.vault && s.vault !== "all" ? `<span class="saved-search-vault">📁 ${escapeHtml(s.vault)}</span>` : "";
return `
<div class="saved-search-item${isDirSearch ? ' saved-search-dir' : ''}">
<div class="saved-search-item${isDirSearch ? ' saved-search-dir' : ''}" data-type="${isDirSearch ? 'directory' : 'search'}">
<div class="saved-search-query">${displayQuery}</div>
<div class="saved-search-meta">
<span class="saved-search-badges">${badges.join("")} ${vaultStr}</span>
@@ -1064,6 +1064,10 @@ export async function loadSavedSearches() {
<button class="saved-search-delete" data-id="${s.id}" title="Supprimer">✕</button>
</div>
`}).join("");
// Apply saved filter
_applySavedFilter();
// Set up filter bar (once)
_initSavedFilter();
list.querySelectorAll(".saved-search-item").forEach(item => {
item.addEventListener("click", (e) => {
if (e.target.classList.contains("saved-search-delete")) return;
@@ -1453,7 +1457,40 @@ function _renderSyncPanel(panel) {
});
html += `</div>`;
}
}
// ── Saved searches filter ──
var _savedFilterType = 'all';
var _savedFilterInitDone = false;
function _initSavedFilter() {
if (_savedFilterInitDone) return;
var bar = document.getElementById('saved-filter-bar');
if (!bar) return;
bar.querySelectorAll('.saved-filter-pill').forEach(function(btn) {
btn.addEventListener('click', function() {
bar.querySelectorAll('.saved-filter-pill').forEach(function(b) { b.classList.remove('active'); });
btn.classList.add('active');
_savedFilterType = btn.dataset.filter;
_applySavedFilter();
});
});
_savedFilterInitDone = true;
}
function _applySavedFilter() {
var items = document.querySelectorAll('.saved-search-item');
var hasVisible = false;
items.forEach(function(item) {
var type = item.dataset.type;
var show = _savedFilterType === 'all' || type === _savedFilterType;
item.style.display = show ? '' : 'none';
if (show) hasVisible = true;
});
// Show/hide empty state
var empty = document.getElementById('saved-searches-empty');
if (empty) empty.style.display = hasVisible ? 'none' : '';
}
panel.innerHTML = html;
}