From 3414736b42f289af0817266d17f64609338f0868 Mon Sep 17 00:00:00 2001 From: jason Date: Thu, 23 Apr 2026 13:55:42 -0500 Subject: [PATCH] model tree fix --- src/client/viewer/main.ts | 38 +++++++++++++++++++++++--------------- 1 file changed, 23 insertions(+), 15 deletions(-) diff --git a/src/client/viewer/main.ts b/src/client/viewer/main.ts index abf9247..fb186e2 100644 --- a/src/client/viewer/main.ts +++ b/src/client/viewer/main.ts @@ -286,7 +286,12 @@ async function loadStepGeometry(): Promise { fitCamera(group) addGrid(group) - if (data.tree) wireTreePanel(data.tree) + const treeContent = document.getElementById('tree-content') + if (data.tree) { + wireTreePanel(data.tree) + } else if (treeContent) { + treeContent.innerHTML = '

Tree unavailable — reconvert this model in the admin panel to enable.

' + } } // ---- STL loader (client-side, Three.js built-in) ------------------------- @@ -407,31 +412,34 @@ function wireTreePanel(root: HierarchyNode) { const content = document.getElementById('tree-content') if (!content) return - // Skip an unnamed single-child root wrapper — go straight to its children + // Skip an unnamed root wrapper — go straight to its children const topNodes = (!root.name && root.children.length > 0) ? root.children : [root] content.innerHTML = '' for (const node of topNodes) { content.append(buildTreeNode(node, 0)) } - - // Wire tree toggle button - const treePanel = document.getElementById('tree-panel')! - const toggleBtn = document.getElementById('tree-toggle-btn') - const closeBtn = document.getElementById('tree-close-btn') - - const openPanel = () => { treePanel.classList.remove('closed'); toggleBtn?.classList.add('text-accent') } - const closePanel = () => { treePanel.classList.add('closed'); toggleBtn?.classList.remove('text-accent') } - - toggleBtn?.addEventListener('click', () => - treePanel.classList.contains('closed') ? openPanel() : closePanel() - ) - closeBtn?.addEventListener('click', closePanel) } // ---- Viewer toolbar ------------------------------------------------------ function wireToolbar() { + // Model tree panel toggle (always wired; content populated after geometry loads) + const treePanel = document.getElementById('tree-panel') + const treeBtn = document.getElementById('tree-toggle-btn') + const treeClose = document.getElementById('tree-close-btn') + if (treePanel) { + treeBtn?.addEventListener('click', () => { + const closing = !treePanel.classList.contains('closed') + treePanel.classList.toggle('closed') + treeBtn.classList.toggle('text-accent', !closing) + }) + treeClose?.addEventListener('click', () => { + treePanel.classList.add('closed') + treeBtn?.classList.remove('text-accent') + }) + } + // Copy-link const copyBtn = document.getElementById('copy-link-btn') as HTMLButtonElement | null if (copyBtn) {