fix: partage dirigé — dossier Partage virtuel + ouverture en onglet #196
CI / lint (push) Successful in 3m1s
CI / security (push) Failing after 1m58s
CI / test (push) Successful in 4m43s
CI / build (push) Successful in 1m39s
CI / e2e (push) Successful in 20m28s

- _resolve_shared_file: home-<user>/Partage/<f> -> fichier source (/api/file, raw, download)
- clic dossier Partage: dépliage sans navigation (fix Directory not found)
- fichiers reçus ouverts en onglet applicatif (arbre, recherche, dashboard)
- POST /api/share: path vide/null rejeté (400) — un share path:null cassait /api/shares
- +2 tests (13 total)
This commit is contained in:
2026-10-10 21:48:46 -04:00
parent fdc9f47a0d
commit de6bde1613
16 changed files with 142 additions and 29 deletions
+4 -9
View File
@@ -68,8 +68,10 @@ const DashboardSharedWidget = {
: `<button class="shared-copy-btn" data-url="${window.location.origin}/s/${s.token}">${t('dashboard.copy_btn')}</button>
<button class="shared-open-btn">${t('dashboard.open_btn')}</button>
<button class="shared-revoke-btn" data-id="${s.id}">🗑</button>`;
const cardVault = received ? `home-${me}` : s.vault;
const cardPath = received ? `Partage/${(s.path || "").split("/").pop()}` : s.path;
return `
<div class="shared-card" data-vault="${escapeHtml(s.vault)}" data-path="${escapeHtml(s.path)}" data-token="${s.token}" data-received="${received ? "1" : ""}">
<div class="shared-card" data-vault="${escapeHtml(cardVault)}" data-path="${escapeHtml(cardPath)}" data-token="${s.token}" data-received="${received ? "1" : ""}">
<div class="shared-card-header">
<i data-lucide="file-text" style="width:14px;height:14px"></i>
<span class="shared-card-title">${escapeHtml(s.path.split("/").pop().replace(/\\.md$/i, ""))}</span>
@@ -93,10 +95,7 @@ const DashboardSharedWidget = {
grid.querySelectorAll(".shared-open-btn").forEach(b => b.addEventListener("click", (e) => {
e.stopPropagation();
const card = b.closest(".shared-card");
if (card && card.dataset.received === "1" && card.dataset.token) {
window.open(`/s/${card.dataset.token}`, "_blank");
return;
}
// #196 : onglet applicatif — /api/file résout Partage/ vers la source.
if (card) TabManager.openPreview(card.dataset.vault, card.dataset.path);
}));
grid.querySelectorAll(".shared-revoke-btn").forEach(b => b.addEventListener("click", async (e) => {
@@ -106,10 +105,6 @@ const DashboardSharedWidget = {
this.load();
}));
grid.querySelectorAll(".shared-card").forEach(card => card.addEventListener("click", () => {
if (card.dataset.received === "1" && card.dataset.token) {
window.open(`/s/${card.dataset.token}`, "_blank");
return;
}
TabManager.openPreview(card.dataset.vault, card.dataset.path);
}));
} catch (err) { if (empty) empty.style.display = ""; }
+3 -2
View File
@@ -911,9 +911,10 @@ export function renderSearchResults(data, query, tagFilter) {
});
if (tagsDiv.children.length > 0) item.appendChild(tagsDiv);
}
// #196 : document reçu par partage → ouvre la page de partage (lecture seule).
// #196 : document reçu par partage → onglet applicatif (/api/file résout
// Partage/ vers la source, lecture seule). Fallback /s/ si résolution KO.
if (r.share_token) {
item.addEventListener("click", () => window.open(`/s/${r.share_token}`, "_blank"));
item.addEventListener("click", () => TabManager.openPreview(r.vault, r.path));
} else {
item.addEventListener("click", () => TabManager.openPreview(r.vault, r.path));
item.addEventListener("dblclick", (e) => { e.preventDefault(); TabManager.openPersistent(r.vault, r.path); });
+18 -4
View File
@@ -370,12 +370,19 @@ async function incrementalLoadDirectory(vaultName, dirPath, container) {
fItem.title = t("dashboard.shared_by", { user: s.created_by || "" });
fItem.addEventListener("click", () => {
scrollTreeItemIntoView(fItem, false);
window.open(`/s/${s.token}`, "_blank");
// #196 : ouverture en onglet applicatif — /api/file résout Partage/
// vers le fichier source (lecture seule).
if (window.innerWidth <= 768) {
TabManager.openPersistent(vaultName, `Partage/${(s.path || "").split("/").pop()}`);
} else {
TabManager.openPreview(vaultName, `Partage/${(s.path || "").split("/").pop()}`);
}
closeMobileSidebar();
});
shareSub.appendChild(fItem);
});
shareDir.addEventListener("click", () => {
TabManager.openNav(vaultName, "Partage");
// #196 : dossier virtuel — pas de navigation (pas de répertoire physique).
const expanded = !shareSub.classList.contains("collapsed");
shareSub.classList.toggle("collapsed", expanded);
const chev = shareDir.querySelector("[data-lucide]");
@@ -733,12 +740,19 @@ async function loadDirectory(vaultName, dirPath, container) {
fItem.title = t("dashboard.shared_by", { user: s.created_by || "" });
fItem.addEventListener("click", () => {
scrollTreeItemIntoView(fItem, false);
window.open(`/s/${s.token}`, "_blank");
// #196 : ouverture en onglet applicatif — /api/file résout Partage/
// vers le fichier source (lecture seule).
if (window.innerWidth <= 768) {
TabManager.openPersistent(vaultName, `Partage/${(s.path || "").split("/").pop()}`);
} else {
TabManager.openPreview(vaultName, `Partage/${(s.path || "").split("/").pop()}`);
}
closeMobileSidebar();
});
shareSub.appendChild(fItem);
});
shareDir.addEventListener("click", () => {
TabManager.openNav(vaultName, "Partage");
// #196 : dossier virtuel — pas de navigation (pas de répertoire physique).
const expanded = !shareSub.classList.contains("collapsed");
shareSub.classList.toggle("collapsed", expanded);
const chev = shareDir.querySelector("[data-lucide]");