feat: merge UI vault settings with environment config, improve French UI text clarity, and enhance hidden files whitelist styling with hover effects and empty state
This commit is contained in:
parent
fe3ffe5860
commit
08e4d732f5
@ -329,6 +329,18 @@ async def build_index(progress_callback=None) -> None:
|
|||||||
vault_config.clear()
|
vault_config.clear()
|
||||||
vault_config.update(load_vault_config())
|
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
|
global _index_generation
|
||||||
with _index_lock:
|
with _index_lock:
|
||||||
index.clear()
|
index.clear()
|
||||||
|
|||||||
@ -3268,7 +3268,7 @@
|
|||||||
// Include all hidden toggle
|
// Include all hidden toggle
|
||||||
const toggleRow = el("div", { class: "config-row" }, [
|
const toggleRow = el("div", { class: "config-row" }, [
|
||||||
el("label", { class: "config-label", for: `hidden-include-${vault.name}` }, [
|
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("label", { class: "config-toggle" }, [
|
||||||
el("input", {
|
el("input", {
|
||||||
@ -3280,17 +3280,17 @@
|
|||||||
el("span", { class: "config-toggle-slider" })
|
el("span", { class: "config-toggle-slider" })
|
||||||
]),
|
]),
|
||||||
el("span", { class: "config-hint" }, [
|
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
|
// Whitelist section
|
||||||
const whitelistSection = el("div", { class: "hidden-files-whitelist" });
|
const whitelistSection = el("div", { class: "hidden-files-whitelist" });
|
||||||
const whitelistLabel = el("label", { class: "config-label" }, [
|
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" }, [
|
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}` });
|
const whitelistItems = el("div", { class: "hidden-files-whitelist-items", id: `whitelist-items-${vault.name}` });
|
||||||
@ -3307,13 +3307,13 @@
|
|||||||
type: "text",
|
type: "text",
|
||||||
class: "config-input",
|
class: "config-input",
|
||||||
id: `whitelist-input-${vault.name}`,
|
id: `whitelist-input-${vault.name}`,
|
||||||
placeholder: "Ex: .obsidian"
|
placeholder: ".obsidian"
|
||||||
}),
|
}),
|
||||||
el("button", {
|
el("button", {
|
||||||
class: "config-btn-add",
|
class: "config-btn-add",
|
||||||
type: "button",
|
type: "button",
|
||||||
"data-vault": vault.name
|
"data-vault": vault.name
|
||||||
}, [document.createTextNode("Ajouter")])
|
}, [document.createTextNode("➕ Ajouter")])
|
||||||
]);
|
]);
|
||||||
|
|
||||||
whitelistSection.appendChild(whitelistLabel);
|
whitelistSection.appendChild(whitelistLabel);
|
||||||
@ -3367,21 +3367,18 @@
|
|||||||
const value = input.value.trim();
|
const value = input.value.trim();
|
||||||
if (!value) return;
|
if (!value) return;
|
||||||
|
|
||||||
// Validate format (should start with a dot)
|
// Auto-add dot if missing
|
||||||
if (!value.startsWith(".")) {
|
const normalizedValue = value.startsWith(".") ? value : `.${value}`;
|
||||||
showToast("Le nom doit commencer par un point (ex: .obsidian)", "error");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check for duplicates
|
// Check for duplicates
|
||||||
const existing = Array.from(container.querySelectorAll(".whitelist-item-text"))
|
const existing = Array.from(container.querySelectorAll(".whitelist-item-text"))
|
||||||
.map(el => el.textContent);
|
.map(el => el.textContent);
|
||||||
if (existing.includes(value)) {
|
if (existing.includes(normalizedValue)) {
|
||||||
showToast("Cet élément existe déjà", "error");
|
showToast("Cet élément existe déjà", "error");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
const item = createWhitelistItem(vaultName, value);
|
const item = createWhitelistItem(vaultName, normalizedValue);
|
||||||
container.appendChild(item);
|
container.appendChild(item);
|
||||||
input.value = "";
|
input.value = "";
|
||||||
}
|
}
|
||||||
@ -3417,18 +3414,18 @@
|
|||||||
});
|
});
|
||||||
|
|
||||||
await Promise.all(promises);
|
await Promise.all(promises);
|
||||||
showToast("Paramètres des fichiers cachés sauvegardés", "success");
|
showToast("✓ Paramètres sauvegardés", "success");
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Failed to save hidden files settings:", err);
|
console.error("Failed to save hidden files settings:", err);
|
||||||
showToast("Erreur de sauvegarde", "error");
|
showToast("Erreur de sauvegarde", "error");
|
||||||
} finally {
|
} finally {
|
||||||
if (btn) { btn.disabled = false; btn.textContent = "Sauvegarder les paramètres"; }
|
if (btn) { btn.disabled = false; btn.textContent = "💾 Sauvegarder"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async function reindexWithHiddenFiles() {
|
async function reindexWithHiddenFiles() {
|
||||||
const btn = document.getElementById("cfg-reindex-hidden");
|
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 {
|
try {
|
||||||
// First save the settings
|
// First save the settings
|
||||||
@ -3436,14 +3433,14 @@
|
|||||||
|
|
||||||
// Then trigger reindex
|
// Then trigger reindex
|
||||||
await api("/api/index/reload");
|
await api("/api/index/reload");
|
||||||
showToast("Réindexation avec nouveaux paramètres terminée", "success");
|
showToast("✓ Réindexation terminée", "success");
|
||||||
loadDiagnostics();
|
loadDiagnostics();
|
||||||
await Promise.all([loadVaults(), loadTags()]);
|
await Promise.all([loadVaults(), loadTags()]);
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
console.error("Reindex with hidden files error:", err);
|
console.error("Reindex with hidden files error:", err);
|
||||||
showToast("Erreur de réindexation", "error");
|
showToast("Erreur de réindexation", "error");
|
||||||
} finally {
|
} finally {
|
||||||
if (btn) { btn.disabled = false; btn.textContent = "Réindexer avec nouveaux paramètres"; }
|
if (btn) { btn.disabled = false; btn.textContent = "🔄 Réindexer"; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -550,16 +550,16 @@
|
|||||||
|
|
||||||
<!-- Hidden Files/Folders Configuration -->
|
<!-- Hidden Files/Folders Configuration -->
|
||||||
<section class="config-section">
|
<section class="config-section">
|
||||||
<h2>📁 Fichiers et dossiers cachés</h2>
|
<h2><EFBFBD>️ Fichiers cachés</h2>
|
||||||
<p class="config-description">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.</p>
|
<p class="config-description">Gérez l'affichage des fichiers/dossiers cachés (commençant par <code>.</code>) par vault.</p>
|
||||||
|
|
||||||
<div id="hidden-files-vault-list">
|
<div id="hidden-files-vault-list">
|
||||||
<!-- Vault-specific settings will be injected here -->
|
<!-- Vault-specific settings will be injected here -->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="config-actions-row" style="margin-top: 16px;">
|
<div class="config-actions-row" style="margin-top: 16px;">
|
||||||
<button class="config-btn-save" id="cfg-save-hidden-files">Sauvegarder les paramètres</button>
|
<button class="config-btn-save" id="cfg-save-hidden-files">💾 Sauvegarder</button>
|
||||||
<button class="config-btn-secondary" id="cfg-reindex-hidden">Réindexer avec nouveaux paramètres</button>
|
<button class="config-btn-secondary" id="cfg-reindex-hidden">🔄 Réindexer</button>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|||||||
@ -3414,61 +3414,85 @@ body.resizing-v {
|
|||||||
.hidden-files-vault-card {
|
.hidden-files-vault-card {
|
||||||
background: var(--bg-secondary);
|
background: var(--bg-secondary);
|
||||||
border: 1px solid var(--border);
|
border: 1px solid var(--border);
|
||||||
border-radius: 8px;
|
border-radius: 6px;
|
||||||
padding: 16px;
|
padding: 12px;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 12px;
|
||||||
|
transition: border-color 200ms ease;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hidden-files-vault-card:hover {
|
||||||
|
border-color: var(--accent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-vault-header {
|
.hidden-files-vault-header {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
margin-bottom: 16px;
|
margin-bottom: 12px;
|
||||||
padding-bottom: 12px;
|
padding-bottom: 8px;
|
||||||
border-bottom: 1px solid var(--border);
|
border-bottom: 1px solid var(--border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-vault-header h3 {
|
.hidden-files-vault-header h3 {
|
||||||
font-size: 1rem;
|
font-size: 0.95rem;
|
||||||
font-weight: 600;
|
font-weight: 600;
|
||||||
color: var(--text-primary);
|
color: var(--text-primary);
|
||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-vault-type {
|
.hidden-files-vault-type {
|
||||||
font-size: 0.75rem;
|
font-size: 0.7rem;
|
||||||
padding: 2px 8px;
|
padding: 2px 6px;
|
||||||
background: var(--tag-bg);
|
background: var(--tag-bg);
|
||||||
color: var(--tag-text);
|
color: var(--tag-text);
|
||||||
border-radius: 4px;
|
border-radius: 3px;
|
||||||
font-family: var(--mono);
|
font-family: var(--mono);
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-whitelist {
|
.hidden-files-whitelist {
|
||||||
margin-top: 16px;
|
margin-top: 12px;
|
||||||
padding-top: 16px;
|
padding-top: 12px;
|
||||||
border-top: 1px solid var(--border);
|
border-top: 1px solid var(--border);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-whitelist-items {
|
.hidden-files-whitelist-items {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
gap: 8px;
|
gap: 6px;
|
||||||
margin-bottom: 12px;
|
margin-bottom: 10px;
|
||||||
min-height: 32px;
|
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 {
|
.hidden-files-whitelist-item {
|
||||||
display: inline-flex;
|
display: inline-flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
gap: 6px;
|
gap: 4px;
|
||||||
padding: 4px 8px 4px 12px;
|
padding: 3px 6px 3px 8px;
|
||||||
background: var(--tag-bg);
|
background: var(--tag-bg);
|
||||||
color: var(--tag-text);
|
color: var(--tag-text);
|
||||||
border-radius: 6px;
|
border-radius: 4px;
|
||||||
font-size: 0.875rem;
|
font-size: 0.85rem;
|
||||||
font-family: var(--mono);
|
font-family: var(--mono);
|
||||||
border: 1px solid color-mix(in srgb, var(--tag-text) 30%, transparent);
|
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 {
|
.whitelist-item-text {
|
||||||
@ -3480,25 +3504,52 @@ body.resizing-v {
|
|||||||
border: none;
|
border: none;
|
||||||
color: var(--text-muted);
|
color: var(--text-muted);
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
font-size: 1.2rem;
|
font-size: 1.1rem;
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: 0 4px;
|
padding: 0 2px;
|
||||||
transition: color 150ms ease;
|
transition: all 150ms ease;
|
||||||
|
border-radius: 2px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.whitelist-item-remove:hover {
|
.whitelist-item-remove:hover {
|
||||||
color: var(--danger);
|
color: var(--danger);
|
||||||
|
background: color-mix(in srgb, var(--danger) 15%, transparent);
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-add-row {
|
.hidden-files-add-row {
|
||||||
display: flex;
|
display: flex;
|
||||||
gap: 8px;
|
gap: 8px;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
|
margin-top: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.hidden-files-add-row .config-input {
|
.hidden-files-add-row .config-input {
|
||||||
flex: 1;
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------
|
/* ---------------------------------------------------------------------------
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user