refactor: remove hidden files indexing configuration and convert to UI-only display preference, eliminating includeHidden and hiddenWhitelist from vault config and indexing logic while adding hideHiddenFiles client-side filtering
This commit is contained in:
+68
-193
@@ -24,6 +24,9 @@
|
||||
let _iconDebounceTimer = null;
|
||||
let activeSidebarTab = "vaults";
|
||||
let filterDebounce = null;
|
||||
|
||||
// Vault settings cache for hideHiddenFiles
|
||||
let vaultSettings = {};
|
||||
|
||||
// Advanced search state
|
||||
let advancedSearchOffset = 0;
|
||||
@@ -1866,6 +1869,39 @@
|
||||
renderTagCloud(filteredTags);
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helper: Check if path should be displayed based on hideHiddenFiles setting
|
||||
// ---------------------------------------------------------------------------
|
||||
function shouldDisplayPath(path, vaultName) {
|
||||
// Get hideHiddenFiles setting for this vault (default: false = show all)
|
||||
const settings = vaultSettings[vaultName] || { hideHiddenFiles: false };
|
||||
|
||||
if (!settings.hideHiddenFiles) {
|
||||
// Show all files
|
||||
return true;
|
||||
}
|
||||
|
||||
// Check if any segment of the path starts with a dot (hidden)
|
||||
const segments = path.split('/').filter(Boolean);
|
||||
for (const segment of segments) {
|
||||
if (segment.startsWith('.')) {
|
||||
return false; // Hide this path
|
||||
}
|
||||
}
|
||||
|
||||
return true; // Show this path
|
||||
}
|
||||
|
||||
async function loadVaultSettings() {
|
||||
try {
|
||||
const settings = await api("/api/vaults/settings/all");
|
||||
vaultSettings = settings;
|
||||
} catch (err) {
|
||||
console.error("Failed to load vault settings:", err);
|
||||
vaultSettings = {};
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Sidebar — Vault tree
|
||||
// ---------------------------------------------------------------------------
|
||||
@@ -2013,6 +2049,11 @@
|
||||
const fragment = document.createDocumentFragment();
|
||||
|
||||
data.items.forEach((item) => {
|
||||
// Apply client-side filtering for hidden files
|
||||
if (!shouldDisplayPath(item.path, vaultName)) {
|
||||
return; // Skip this item
|
||||
}
|
||||
|
||||
if (item.type === "directory") {
|
||||
const dirItem = el("div", { class: "tree-item", "data-vault": vaultName, "data-path": item.path }, [
|
||||
icon("chevron-right", 14),
|
||||
@@ -3013,9 +3054,6 @@
|
||||
// Hidden files configuration
|
||||
const saveHiddenBtn = document.getElementById("cfg-save-hidden-files");
|
||||
if (saveHiddenBtn) saveHiddenBtn.addEventListener("click", saveHiddenFilesSettings);
|
||||
|
||||
const reindexHiddenBtn = document.getElementById("cfg-reindex-hidden");
|
||||
if (reindexHiddenBtn) reindexHiddenBtn.addEventListener("click", reindexWithHiddenFiles);
|
||||
|
||||
document.addEventListener("keydown", (e) => {
|
||||
if (e.key === "Escape" && modal.classList.contains("active")) {
|
||||
@@ -3231,32 +3269,6 @@
|
||||
|
||||
// --- Hidden Files Configuration ---
|
||||
|
||||
// Track which vaults have been modified
|
||||
let modifiedVaults = new Set();
|
||||
|
||||
function updateHiddenFilesButtonStates() {
|
||||
const saveBtn = document.getElementById("cfg-save-hidden-files");
|
||||
const reindexBtn = document.getElementById("cfg-reindex-hidden");
|
||||
|
||||
if (modifiedVaults.size > 0) {
|
||||
if (saveBtn) {
|
||||
saveBtn.textContent = `💾 Sauvegarder (${modifiedVaults.size} modifié${modifiedVaults.size > 1 ? 's' : ''})`;
|
||||
saveBtn.classList.add("config-btn-highlight");
|
||||
}
|
||||
if (reindexBtn) {
|
||||
reindexBtn.textContent = "🔄 Sauvegarder et réindexer";
|
||||
}
|
||||
} else {
|
||||
if (saveBtn) {
|
||||
saveBtn.textContent = "💾 Sauvegarder";
|
||||
saveBtn.classList.remove("config-btn-highlight");
|
||||
}
|
||||
if (reindexBtn) {
|
||||
reindexBtn.textContent = "🔄 Réindexer";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function loadHiddenFilesSettings() {
|
||||
const container = document.getElementById("hidden-files-vault-list");
|
||||
if (!container) return;
|
||||
@@ -3281,7 +3293,7 @@
|
||||
}
|
||||
|
||||
allVaults.forEach(vault => {
|
||||
const settings = allSettings[vault.name] || { includeHidden: false, hiddenWhitelist: [] };
|
||||
const settings = allSettings[vault.name] || { hideHiddenFiles: false };
|
||||
|
||||
const vaultCard = el("div", { class: "hidden-files-vault-card", "data-vault": vault.name });
|
||||
|
||||
@@ -3291,144 +3303,32 @@
|
||||
el("span", { class: "hidden-files-vault-type" }, [document.createTextNode(vault.type || "VAULT")])
|
||||
]);
|
||||
|
||||
// Include all hidden toggle
|
||||
// Hide hidden files toggle
|
||||
const toggleRow = el("div", { class: "config-row" }, [
|
||||
el("label", { class: "config-label", for: `hidden-include-${vault.name}` }, [
|
||||
document.createTextNode("Afficher tous les fichiers cachés")
|
||||
el("label", { class: "config-label", for: `hide-hidden-${vault.name}` }, [
|
||||
document.createTextNode("Masquer les fichiers/dossiers cachés")
|
||||
]),
|
||||
el("label", { class: "config-toggle" }, [
|
||||
el("input", {
|
||||
type: "checkbox",
|
||||
id: `hidden-include-${vault.name}`,
|
||||
id: `hide-hidden-${vault.name}`,
|
||||
"data-vault": vault.name,
|
||||
checked: settings.includeHidden || false
|
||||
checked: settings.hideHiddenFiles || false
|
||||
}),
|
||||
el("span", { class: "config-toggle-slider" })
|
||||
]),
|
||||
el("span", { class: "config-hint" }, [
|
||||
document.createTextNode("Indexer tous les fichiers/dossiers commençant par un point")
|
||||
document.createTextNode("Masquer les fichiers/dossiers commençant par un point dans l'interface (ils restent indexés et cherchables)")
|
||||
])
|
||||
]);
|
||||
|
||||
// Whitelist section
|
||||
const whitelistSection = el("div", { class: "hidden-files-whitelist" });
|
||||
const whitelistLabel = el("label", { class: "config-label" }, [
|
||||
document.createTextNode("Liste blanche")
|
||||
]);
|
||||
const whitelistHint = el("span", { class: "config-hint", style: "display:block;margin-bottom:8px" }, [
|
||||
document.createTextNode("Dossiers cachés spécifiques à afficher (tous les sous-dossiers cachés seront inclus)")
|
||||
]);
|
||||
|
||||
const whitelistItems = el("div", { class: "hidden-files-whitelist-items", id: `whitelist-items-${vault.name}` });
|
||||
|
||||
// Render existing whitelist items
|
||||
(settings.hiddenWhitelist || []).forEach(item => {
|
||||
const itemEl = createWhitelistItem(vault.name, item);
|
||||
whitelistItems.appendChild(itemEl);
|
||||
});
|
||||
|
||||
// Add new item input
|
||||
const addRow = el("div", { class: "hidden-files-add-row" }, [
|
||||
el("input", {
|
||||
type: "text",
|
||||
class: "config-input",
|
||||
id: `whitelist-input-${vault.name}`,
|
||||
placeholder: ".obsidian"
|
||||
}),
|
||||
el("button", {
|
||||
class: "config-btn-add",
|
||||
type: "button",
|
||||
"data-vault": vault.name
|
||||
}, [document.createTextNode("➕ Ajouter")])
|
||||
]);
|
||||
|
||||
whitelistSection.appendChild(whitelistLabel);
|
||||
whitelistSection.appendChild(whitelistHint);
|
||||
whitelistSection.appendChild(whitelistItems);
|
||||
whitelistSection.appendChild(addRow);
|
||||
|
||||
vaultCard.appendChild(header);
|
||||
vaultCard.appendChild(toggleRow);
|
||||
vaultCard.appendChild(whitelistSection);
|
||||
|
||||
container.appendChild(vaultCard);
|
||||
|
||||
// Event listeners
|
||||
const addBtn = addRow.querySelector("button");
|
||||
const input = addRow.querySelector("input");
|
||||
const checkbox = toggleRow.querySelector("input[type='checkbox']");
|
||||
|
||||
addBtn.addEventListener("click", () => {
|
||||
addWhitelistItem(vault.name);
|
||||
modifiedVaults.add(vault.name);
|
||||
updateHiddenFilesButtonStates();
|
||||
});
|
||||
input.addEventListener("keypress", (e) => {
|
||||
if (e.key === "Enter") {
|
||||
addWhitelistItem(vault.name);
|
||||
modifiedVaults.add(vault.name);
|
||||
updateHiddenFilesButtonStates();
|
||||
}
|
||||
});
|
||||
checkbox.addEventListener("change", () => {
|
||||
modifiedVaults.add(vault.name);
|
||||
updateHiddenFilesButtonStates();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function createWhitelistItem(vaultName, itemValue) {
|
||||
const item = el("div", { class: "hidden-files-whitelist-item" }, [
|
||||
el("span", { class: "whitelist-item-text" }, [document.createTextNode(itemValue)]),
|
||||
el("button", {
|
||||
class: "whitelist-item-remove",
|
||||
type: "button",
|
||||
title: "Supprimer",
|
||||
"data-vault": vaultName,
|
||||
"data-item": itemValue
|
||||
}, [document.createTextNode("×")])
|
||||
]);
|
||||
|
||||
const removeBtn = item.querySelector("button");
|
||||
removeBtn.addEventListener("click", () => {
|
||||
item.remove();
|
||||
modifiedVaults.add(vaultName);
|
||||
updateHiddenFilesButtonStates();
|
||||
});
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
function addWhitelistItem(vaultName) {
|
||||
const input = document.getElementById(`whitelist-input-${vaultName}`);
|
||||
const container = document.getElementById(`whitelist-items-${vaultName}`);
|
||||
const includeHiddenCheckbox = document.getElementById(`hidden-include-${vaultName}`);
|
||||
|
||||
if (!input || !container) return;
|
||||
|
||||
const value = input.value.trim();
|
||||
if (!value) 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(normalizedValue)) {
|
||||
showToast("Cet élément existe déjà", "error");
|
||||
return;
|
||||
}
|
||||
|
||||
// Auto-uncheck "Afficher tous les fichiers cachés" when adding to whitelist
|
||||
if (includeHiddenCheckbox && includeHiddenCheckbox.checked) {
|
||||
includeHiddenCheckbox.checked = false;
|
||||
}
|
||||
|
||||
const item = createWhitelistItem(vaultName, normalizedValue);
|
||||
container.appendChild(item);
|
||||
input.value = "";
|
||||
}
|
||||
|
||||
async function saveHiddenFilesSettings() {
|
||||
const btn = document.getElementById("cfg-save-hidden-files");
|
||||
@@ -3440,15 +3340,10 @@
|
||||
|
||||
vaultCards.forEach(card => {
|
||||
const vaultName = card.dataset.vault;
|
||||
const includeHidden = document.getElementById(`hidden-include-${vaultName}`)?.checked || false;
|
||||
|
||||
const whitelistItems = Array.from(
|
||||
document.querySelectorAll(`#whitelist-items-${vaultName} .whitelist-item-text`)
|
||||
).map(el => el.textContent);
|
||||
const hideHiddenFiles = document.getElementById(`hide-hidden-${vaultName}`)?.checked || false;
|
||||
|
||||
const settings = {
|
||||
includeHidden,
|
||||
hiddenWhitelist: whitelistItems
|
||||
hideHiddenFiles
|
||||
};
|
||||
|
||||
promises.push(
|
||||
@@ -3467,9 +3362,14 @@
|
||||
});
|
||||
|
||||
await Promise.all(promises);
|
||||
modifiedVaults.clear();
|
||||
updateHiddenFilesButtonStates();
|
||||
|
||||
// Reload vault settings to update the cache
|
||||
await loadVaultSettings();
|
||||
|
||||
showToast("✓ Paramètres sauvegardés", "success");
|
||||
|
||||
// Refresh the UI to apply the filter
|
||||
await Promise.all([loadVaults(), refreshTagsForContext()]);
|
||||
} catch (err) {
|
||||
console.error("Failed to save hidden files settings:", err);
|
||||
const errorMsg = err.message || "Erreur inconnue";
|
||||
@@ -3479,41 +3379,6 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function reindexWithHiddenFiles() {
|
||||
const btn = document.getElementById("cfg-reindex-hidden");
|
||||
if (btn) { btn.disabled = true; btn.textContent = "💾 Sauvegarde..."; }
|
||||
|
||||
try {
|
||||
// First save the settings to ensure they are persisted
|
||||
await saveHiddenFilesSettings();
|
||||
|
||||
// Update button text to show reindexing phase
|
||||
if (btn) { btn.textContent = "⏳ Réindexation..."; }
|
||||
|
||||
// Reindex only modified vaults if any, otherwise reindex all
|
||||
if (modifiedVaults.size > 0) {
|
||||
const vaultsToReindex = Array.from(modifiedVaults);
|
||||
for (const vaultName of vaultsToReindex) {
|
||||
await api(`/api/index/reload/${encodeURIComponent(vaultName)}`);
|
||||
}
|
||||
showToast(`✓ Réindexation terminée (${vaultsToReindex.length} vault${vaultsToReindex.length > 1 ? 's' : ''})`, "success");
|
||||
} else {
|
||||
await api("/api/index/reload");
|
||||
showToast("✓ Réindexation terminée", "success");
|
||||
}
|
||||
|
||||
modifiedVaults.clear();
|
||||
updateHiddenFilesButtonStates();
|
||||
loadDiagnostics();
|
||||
await Promise.all([loadVaults(), loadTags()]);
|
||||
} catch (err) {
|
||||
console.error("Reindex with hidden files error:", err);
|
||||
const errorMsg = err.message || "Erreur inconnue";
|
||||
showToast(`Erreur: ${errorMsg}`, "error");
|
||||
} finally {
|
||||
if (btn) { btn.disabled = false; btn.textContent = "🔄 Réindexer"; }
|
||||
}
|
||||
}
|
||||
|
||||
function renderConfigFilters() {
|
||||
const config = TagFilterService.getConfig();
|
||||
@@ -3826,6 +3691,11 @@
|
||||
}
|
||||
const container = el("div", { class: "search-results" });
|
||||
data.results.forEach((r) => {
|
||||
// Apply client-side filtering for hidden files
|
||||
if (!shouldDisplayPath(r.path, r.vault)) {
|
||||
return; // Skip this result
|
||||
}
|
||||
|
||||
const titleDiv = el("div", { class: "search-result-title" });
|
||||
if (query && query.trim()) {
|
||||
highlightSearchText(titleDiv, r.title, query, searchCaseSensitive);
|
||||
@@ -3986,6 +3856,11 @@
|
||||
// Results list
|
||||
const container = el("div", { class: "search-results" });
|
||||
data.results.forEach((r) => {
|
||||
// Apply client-side filtering for hidden files
|
||||
if (!shouldDisplayPath(r.path, r.vault)) {
|
||||
return; // Skip this result
|
||||
}
|
||||
|
||||
const titleDiv = el("div", { class: "search-result-title" });
|
||||
if (freeText) {
|
||||
highlightSearchText(titleDiv, r.title, freeText, searchCaseSensitive);
|
||||
@@ -5544,7 +5419,7 @@
|
||||
|
||||
if (authOk) {
|
||||
try {
|
||||
await Promise.all([loadVaults(), loadTags()]);
|
||||
await Promise.all([loadVaultSettings(), loadVaults(), loadTags()]);
|
||||
|
||||
// Check for popup mode query parameter
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
|
||||
+2
-3
@@ -551,9 +551,9 @@
|
||||
<!-- Hidden Files/Folders Configuration -->
|
||||
<section class="config-section">
|
||||
<h2>🗂️ Fichiers cachés</h2>
|
||||
<p class="config-description">Gérez l'affichage des fichiers/dossiers cachés (commençant par <code>.</code>) par vault.</p>
|
||||
<p class="config-description">Contrôlez l'affichage des fichiers/dossiers cachés (commençant par <code>.</code>) par vault.</p>
|
||||
<p class="config-hint" style="margin-bottom: 12px; padding: 8px; background: var(--background-secondary); border-radius: 4px;">
|
||||
⚠️ <strong>Important :</strong> Après avoir modifié les paramètres, cliquez sur <strong>"Sauvegarder"</strong> puis sur <strong>"Réindexer"</strong> pour appliquer les changements.
|
||||
ℹ️ <strong>Note :</strong> Tous les fichiers sont toujours indexés et cherchables. Ce paramètre contrôle uniquement leur visibilité dans l'interface.
|
||||
</p>
|
||||
|
||||
<div id="hidden-files-vault-list">
|
||||
@@ -562,7 +562,6 @@
|
||||
|
||||
<div class="config-actions-row" style="margin-top: 16px;">
|
||||
<button class="config-btn-save" id="cfg-save-hidden-files">💾 Sauvegarder</button>
|
||||
<button class="config-btn-secondary" id="cfg-reindex-hidden">🔄 Réindexer</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
|
||||
Reference in New Issue
Block a user