diff --git a/backend/indexer.py b/backend/indexer.py index f41c074..9af436c 100644 --- a/backend/indexer.py +++ b/backend/indexer.py @@ -329,6 +329,18 @@ async def build_index(progress_callback=None) -> None: vault_config.clear() vault_config.update(load_vault_config()) + # Merge vault_settings (from UI) with vault_config (from env vars) + from backend.vault_settings import get_all_vault_settings + saved_settings = get_all_vault_settings() + for vault_name, config in vault_config.items(): + if vault_name in saved_settings: + settings = saved_settings[vault_name] + # Override with saved settings if present + if "includeHidden" in settings: + config["includeHidden"] = settings["includeHidden"] + if "hiddenWhitelist" in settings: + config["hiddenWhitelist"] = settings["hiddenWhitelist"] + global _index_generation with _index_lock: index.clear() diff --git a/frontend/app.js b/frontend/app.js index f2da100..bfcea66 100644 --- a/frontend/app.js +++ b/frontend/app.js @@ -3268,7 +3268,7 @@ // Include all hidden toggle const toggleRow = el("div", { class: "config-row" }, [ el("label", { class: "config-label", for: `hidden-include-${vault.name}` }, [ - document.createTextNode("Inclure tous les fichiers cachés") + document.createTextNode("Afficher tous les fichiers cachés") ]), el("label", { class: "config-toggle" }, [ el("input", { @@ -3280,17 +3280,17 @@ el("span", { class: "config-toggle-slider" }) ]), el("span", { class: "config-hint" }, [ - document.createTextNode("Activer pour indexer tous les fichiers et dossiers cachés (commençant par un point)") + document.createTextNode("Indexer tous les fichiers/dossiers commençant par un point") ]) ]); // Whitelist section const whitelistSection = el("div", { class: "hidden-files-whitelist" }); const whitelistLabel = el("label", { class: "config-label" }, [ - document.createTextNode("Liste blanche (dossiers cachés spécifiques)") + document.createTextNode("Liste blanche") ]); const whitelistHint = el("span", { class: "config-hint", style: "display:block;margin-bottom:8px" }, [ - document.createTextNode("Ajoutez des dossiers cachés individuels à indexer (ex: .obsidian, .github)") + document.createTextNode("Dossiers cachés spécifiques à afficher (ex: .obsidian, .github)") ]); const whitelistItems = el("div", { class: "hidden-files-whitelist-items", id: `whitelist-items-${vault.name}` }); @@ -3307,13 +3307,13 @@ type: "text", class: "config-input", id: `whitelist-input-${vault.name}`, - placeholder: "Ex: .obsidian" + placeholder: ".obsidian" }), el("button", { class: "config-btn-add", type: "button", "data-vault": vault.name - }, [document.createTextNode("Ajouter")]) + }, [document.createTextNode("➕ Ajouter")]) ]); whitelistSection.appendChild(whitelistLabel); @@ -3367,21 +3367,18 @@ const value = input.value.trim(); if (!value) return; - // Validate format (should start with a dot) - if (!value.startsWith(".")) { - showToast("Le nom doit commencer par un point (ex: .obsidian)", "error"); - return; - } + // Auto-add dot if missing + const normalizedValue = value.startsWith(".") ? value : `.${value}`; // Check for duplicates const existing = Array.from(container.querySelectorAll(".whitelist-item-text")) .map(el => el.textContent); - if (existing.includes(value)) { + if (existing.includes(normalizedValue)) { showToast("Cet élément existe déjà", "error"); return; } - const item = createWhitelistItem(vaultName, value); + const item = createWhitelistItem(vaultName, normalizedValue); container.appendChild(item); input.value = ""; } @@ -3417,18 +3414,18 @@ }); await Promise.all(promises); - showToast("Paramètres des fichiers cachés sauvegardés", "success"); + showToast("✓ Paramètres sauvegardés", "success"); } catch (err) { console.error("Failed to save hidden files settings:", err); showToast("Erreur de sauvegarde", "error"); } finally { - if (btn) { btn.disabled = false; btn.textContent = "Sauvegarder les paramètres"; } + if (btn) { btn.disabled = false; btn.textContent = "💾 Sauvegarder"; } } } async function reindexWithHiddenFiles() { const btn = document.getElementById("cfg-reindex-hidden"); - if (btn) { btn.disabled = true; btn.textContent = "Réindexation..."; } + if (btn) { btn.disabled = true; btn.textContent = "⏳ Réindexation..."; } try { // First save the settings @@ -3436,14 +3433,14 @@ // Then trigger reindex await api("/api/index/reload"); - showToast("Réindexation avec nouveaux paramètres terminée", "success"); + showToast("✓ Réindexation terminée", "success"); loadDiagnostics(); await Promise.all([loadVaults(), loadTags()]); } catch (err) { console.error("Reindex with hidden files error:", err); showToast("Erreur de réindexation", "error"); } finally { - if (btn) { btn.disabled = false; btn.textContent = "Réindexer avec nouveaux paramètres"; } + if (btn) { btn.disabled = false; btn.textContent = "🔄 Réindexer"; } } } diff --git a/frontend/index.html b/frontend/index.html index 36d75cf..2865fed 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -550,16 +550,16 @@
-

📁 Fichiers et dossiers cachés

-

Configurez la prise en charge des fichiers et dossiers cachés (commençant par un point) pour chaque vault. Vous pouvez activer tous les fichiers cachés ou ajouter des dossiers spécifiques à une liste blanche.

+

�️ Fichiers cachés

+

Gérez l'affichage des fichiers/dossiers cachés (commençant par .) par vault.

- - + +
diff --git a/frontend/style.css b/frontend/style.css index 85fdbfa..58e63b5 100644 --- a/frontend/style.css +++ b/frontend/style.css @@ -3414,61 +3414,85 @@ body.resizing-v { .hidden-files-vault-card { background: var(--bg-secondary); border: 1px solid var(--border); - border-radius: 8px; - padding: 16px; - margin-bottom: 16px; + border-radius: 6px; + padding: 12px; + margin-bottom: 12px; + transition: border-color 200ms ease; +} + +.hidden-files-vault-card:hover { + border-color: var(--accent); } .hidden-files-vault-header { display: flex; align-items: center; justify-content: space-between; - margin-bottom: 16px; - padding-bottom: 12px; + margin-bottom: 12px; + padding-bottom: 8px; border-bottom: 1px solid var(--border); } .hidden-files-vault-header h3 { - font-size: 1rem; + font-size: 0.95rem; font-weight: 600; color: var(--text-primary); margin: 0; } .hidden-files-vault-type { - font-size: 0.75rem; - padding: 2px 8px; + font-size: 0.7rem; + padding: 2px 6px; background: var(--tag-bg); color: var(--tag-text); - border-radius: 4px; + border-radius: 3px; font-family: var(--mono); + text-transform: uppercase; + letter-spacing: 0.5px; } .hidden-files-whitelist { - margin-top: 16px; - padding-top: 16px; + margin-top: 12px; + padding-top: 12px; border-top: 1px solid var(--border); } .hidden-files-whitelist-items { display: flex; flex-wrap: wrap; - gap: 8px; - margin-bottom: 12px; - min-height: 32px; + gap: 6px; + margin-bottom: 10px; + min-height: 28px; + padding: 4px; + background: var(--bg-primary); + border-radius: 4px; + border: 1px dashed var(--border); +} + +.hidden-files-whitelist-items:empty::before { + content: "Aucun dossier dans la liste blanche"; + color: var(--text-muted); + font-size: 0.85rem; + font-style: italic; } .hidden-files-whitelist-item { display: inline-flex; align-items: center; - gap: 6px; - padding: 4px 8px 4px 12px; + gap: 4px; + padding: 3px 6px 3px 8px; background: var(--tag-bg); color: var(--tag-text); - border-radius: 6px; - font-size: 0.875rem; + border-radius: 4px; + font-size: 0.85rem; font-family: var(--mono); border: 1px solid color-mix(in srgb, var(--tag-text) 30%, transparent); + transition: all 150ms ease; +} + +.hidden-files-whitelist-item:hover { + background: color-mix(in srgb, var(--tag-bg) 80%, var(--accent) 20%); + border-color: var(--accent); } .whitelist-item-text { @@ -3480,25 +3504,52 @@ body.resizing-v { border: none; color: var(--text-muted); cursor: pointer; - font-size: 1.2rem; + font-size: 1.1rem; line-height: 1; - padding: 0 4px; - transition: color 150ms ease; + padding: 0 2px; + transition: all 150ms ease; + border-radius: 2px; } .whitelist-item-remove:hover { color: var(--danger); + background: color-mix(in srgb, var(--danger) 15%, transparent); } .hidden-files-add-row { display: flex; gap: 8px; align-items: center; + margin-top: 4px; } .hidden-files-add-row .config-input { flex: 1; - max-width: 300px; + max-width: 250px; + font-family: var(--mono); + font-size: 0.9rem; +} + +.config-btn-add { + padding: 6px 12px; + background: var(--accent); + color: white; + border: none; + border-radius: 4px; + cursor: pointer; + font-size: 0.875rem; + font-weight: 500; + transition: all 150ms ease; + white-space: nowrap; +} + +.config-btn-add:hover { + background: color-mix(in srgb, var(--accent) 85%, black); + transform: translateY(-1px); +} + +.config-btn-add:active { + transform: translateY(0); } /* ---------------------------------------------------------------------------