This commit is contained in:
+23
-15
@@ -286,7 +286,12 @@ async function loadStepGeometry(): Promise<void> {
|
|||||||
fitCamera(group)
|
fitCamera(group)
|
||||||
addGrid(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) -------------------------
|
// ---- STL loader (client-side, Three.js built-in) -------------------------
|
||||||
@@ -407,31 +412,34 @@ function wireTreePanel(root: HierarchyNode) {
|
|||||||
const content = document.getElementById('tree-content')
|
const content = document.getElementById('tree-content')
|
||||||
if (!content) return
|
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]
|
const topNodes = (!root.name && root.children.length > 0) ? root.children : [root]
|
||||||
|
|
||||||
content.innerHTML = ''
|
content.innerHTML = ''
|
||||||
for (const node of topNodes) {
|
for (const node of topNodes) {
|
||||||
content.append(buildTreeNode(node, 0))
|
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 ------------------------------------------------------
|
// ---- Viewer toolbar ------------------------------------------------------
|
||||||
|
|
||||||
function wireToolbar() {
|
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
|
// Copy-link
|
||||||
const copyBtn = document.getElementById('copy-link-btn') as HTMLButtonElement | null
|
const copyBtn = document.getElementById('copy-link-btn') as HTMLButtonElement | null
|
||||||
if (copyBtn) {
|
if (copyBtn) {
|
||||||
|
|||||||
Reference in New Issue
Block a user