This commit is contained in:
+23
-15
@@ -286,7 +286,12 @@ async function loadStepGeometry(): Promise<void> {
|
||||
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 = '<p class="text-xs text-gray-500 px-4 py-3">Tree unavailable — reconvert this model in the admin panel to enable.</p>'
|
||||
}
|
||||
}
|
||||
|
||||
// ---- 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) {
|
||||
|
||||
Reference in New Issue
Block a user