/** Main Research Workbench app - Home and Project Workspace panels. */ import * as api from "./api_client.js"; import { renderAssetPanel } from "./panels/AssetPanel.js"; const mainContent = document.getElementById("main-content"); const navButtons = document.querySelectorAll(".nav-btn"); let currentPanel = "home"; let currentProjectId = null; function navigateTo(panel, projectId = null) { currentPanel = panel; currentProjectId = projectId; navButtons.forEach(btn => btn.classList.remove("active")); document.getElementById(`nav-${panel}`)?.classList.add("active"); render(); } async function render() { if (currentPanel === "home") { try { const [projects, feedItems, papers] = await Promise.all([ api.listProjects(), api.getTodayFeed(), api.listPapers({ library_status: "library" }), ]); mainContent.innerHTML = ""; renderHomePanel(mainContent, { projects, feedItems, papers }, navigateTo); } catch (e) { mainContent.innerHTML = `

Failed to load: ${e.message}

`; } } else if (currentPanel === "projects") { try { const projects = await api.listProjects(); mainContent.innerHTML = ""; renderProjectPanel(mainContent, { projects }, navigateTo); } catch (e) { mainContent.innerHTML = `

Failed to load: ${e.message}

`; } } else if (currentPanel === "canvas") { window.location.href = "/"; } else if (currentPanel === "assets") { mainContent.innerHTML = ""; renderAssetPanel(mainContent, api); } } function renderHomePanel(container, { projects, feedItems, papers }, navigateTo) { const projectCount = projects.length || 0; const activeProjects = projects.filter(p => p.status === "active").length; container.innerHTML = `

${projectCount}

Total Projects

${activeProjects}

Active

${papers.length}

Papers in Library

${feedItems.length}

Today's Feed

Today Feed

${feedItems.length === 0 ? '

No papers in feed yet.

' : feedItems.map(item => `

${item.title || "Untitled"}

${item.authors_text || ""} ยท ${item.published_at || ""}

${item.abstract || ""}

`).join("")}

Project Focus

${projects.length === 0 ? '

No projects yet.

' : projects.slice(0, 5).map(p => `

${p.title}

${p.goal || "No goal set"}

${p.status}
`).join("")}

Quick Entry

`; document.getElementById("btn-new-project")?.addEventListener("click", async () => { const title = prompt("Project title:"); if (title) { await api.createProject({ title, goal: "" }); navigateTo("projects"); } }); container.querySelectorAll(".project-card").forEach(card => { card.addEventListener("click", () => { navigateTo("projects"); }); }); } function renderProjectPanel(container, { projects }, navigateTo) { container.innerHTML = `

Projects

${projects.length === 0 ? '

No projects. Create your first project.

' : projects.map(p => `

${p.title}

${p.goal || "No goal set"}

${p.status}
`).join("")}
`; document.getElementById("btn-create-project")?.addEventListener("click", async () => { const title = prompt("Project title:"); if (title) { await api.createProject({ title, goal: "" }); const projects = await api.listProjects(); renderProjectPanel(container, { projects }, navigateTo); } }); } // Wire up navigation document.getElementById("nav-home").addEventListener("click", () => navigateTo("home")); document.getElementById("nav-projects").addEventListener("click", () => navigateTo("projects")); document.getElementById("nav-assets").addEventListener("click", () => navigateTo("assets")); document.getElementById("nav-canvas").addEventListener("click", () => navigateTo("canvas")); // Initial render render();