feat: dossier perso (#194) — vaults home-* en tête de l'arborescence, icône maison, compose de test
CI / lint (push) Successful in 3m1s
CI / security (push) Successful in 1m41s
CI / test (push) Successful in 4m37s
CI / build (push) Successful in 1m34s
CI / e2e (push) Successful in 17m40s

- frontend/js/sidebar.js : tri stable _homeFirst appliqué à la source des
  deux listes de vaults (loadVaults + soft refresh) → les vaults home-<user>
  passent en premier, arborescence et sélecteurs cohérents.
- frontend/js/viewer.js : getVaultIcon renvoie l'icône lucide "home" pour
  home-* (même safeCreateIcons / stroke currentColor que les autres).
- docker-compose.test-win.yml : montage test_home:/vaults/Home +
  OBSIGATE_HOME_ROOT=/vaults/Home pour tester la feature en local ;
  test_home/ ajouté au .gitignore.
- Tests : sidebar-filters.test.mjs +2 (icône maison, gemme violette
  inchangée), vérifié live sur l'instance 2020 (ordre + svg.lucide-home).
This commit is contained in:
2026-10-10 16:09:59 -04:00
parent 8235d632b8
commit 10453d8dfe
16 changed files with 84 additions and 14 deletions
+8
View File
@@ -220,8 +220,15 @@ async function loadVaultSettings() {
// ---------------------------------------------------------------------------
// Sidebar — Vault tree
// ---------------------------------------------------------------------------
// #194 : le dossier personnel (vault « home-<user> ») s'affiche en premier
// dans l'arborescence. Tri stable fait sur place, à la source de toutes les
// listes (arborescence, sélecteurs, state.allVaults).
const _homeFirst = (a, b) =>
(String(b?.name).startsWith("home-") ? 1 : 0) - (String(a?.name).startsWith("home-") ? 1 : 0);
async function loadVaults() {
const vaults = await api("/api/vaults");
vaults.sort(_homeFirst);
state.allVaults = vaults;
const container = document.getElementById("vault-tree");
container.innerHTML = "";
@@ -426,6 +433,7 @@ export async function refreshSidebarTreePreservingState() {
// 2. Soft update: vault names/counts without wiping the tree
try {
const vaults = await api("/api/vaults");
vaults.sort(_homeFirst);
state.allVaults = vaults;
vaults.forEach((v) => {
const vItem = document.querySelector(`.vault-item[data-vault="${CSS.escape(v.name)}"]`);
+4
View File
@@ -7579,6 +7579,10 @@ export function attachTreeItemLongPress(itemEl, getMenuData) {
}
export function getVaultIcon(vaultName, size = 16) {
// Dossier personnel (#194) : icône maison, même style lucide que le reste.
if (typeof vaultName === "string" && vaultName.startsWith("home-")) {
return icon("home", size);
}
const v = state.allVaults.find((val) => val.name === vaultName);
const type = v ? v.type : "VAULT";