// --- static/tree-ui.js ---
// ==========================================
// 🌟 輔助函數:全部展開與全部收合
// ==========================================
export function expandAll(elementId) {
const details = document.getElementById(`details-${elementId}`);
if (details) {
details.open = true; // 展開自己
const subDetails = details.querySelectorAll('details');
subDetails.forEach(d => d.open = true); // 展開所有子項目
}
}
export function collapseAll(elementId) {
const details = document.getElementById(`details-${elementId}`);
if (details) {
const subDetails = details.querySelectorAll('details');
subDetails.forEach(d => d.open = false); // 收合所有子項目
details.open = false; // 收合自己
}
}
// ==========================================
// 🌟 核心函數:生成完整設備配置樹狀圖
// ==========================================
export function buildTree(node, path = '', isParentCommandGroup = false) {
let html = '';
if (!node || typeof node !== 'object') return html;
for (const [key, value] of Object.entries(node)) {
const currentPath = path ? `${path}::${key}` : key;
let cliCommand = currentPath.replace(/::/g, ' ').replace(/\s*\[\d+\]/g, '');
if (typeof value === 'object' && value !== null) {
const hasNestedObject = Object.values(value).some(v => typeof v === 'object' && v !== null);
const isCommandGroup = isParentCommandGroup || !hasNestedObject;
const elementId = `folder-${currentPath.replace(/[^a-zA-Z0-9]/g, '-')}`;
const folderSuffix = isCommandGroup ? '(指令群組)' : '';
const svgFolderClosed = ``;
const svgFolderOpen = ``;
const svgGroupClosed = ``;
const svgGroupOpen = ``;
const iconClosed = isCommandGroup ? svgGroupClosed : svgFolderClosed;
const iconOpen = isCommandGroup ? svgGroupOpen : svgFolderOpen;
const expandAllIcon = ``;
const collapseAllIcon = ``;
const expandCollapseBtns = `
${expandAllIcon}
${collapseAllIcon}
`;
html += `
${iconClosed}
${key}${folderSuffix}
${expandCollapseBtns}