import { esc } from './esc.js'; import { fs } from './fs.js'; function renderNode(node, depth) { const isGroup = node.kind !== 'file'; const padding = depth * 4; const name = esc(node.name); const action = isGroup ? `` : `${name}`; const remove = ``; const pathAttribute = node.kind === 'file' ? ` data-path="${esc(node.path)}"` : ''; const row = `${action}` + `${node.kind === 'file' ? fs(node.file.size) : ''}` + `${node.error ? esc(node.error) : node.kind === 'file' ? 'готов' : ''}${remove}`; if (!isGroup || !node.expanded) return row; return row + node.children.map((child) => renderNode(child, depth + 1)).join(''); } export function render(state, elements) { elements.tableBodyEl.innerHTML = state.nodes.length ? state.nodes.map((node) => renderNode(node, 0)).join('') : 'Нет выбранных файлов'; const files = []; const visit = (node) => { if (node.kind === 'file') files.push(node); else node.children.forEach(visit); }; state.nodes.forEach(visit); elements.countEl.textContent = `${files.length} файлов · ${fs(files.reduce((sum, node) => sum + node.file.size, 0))}`; } export function findNode(nodes, id) { for (const node of nodes) { if (node.id === id) return { node, nodes }; const found = findNode(node.children || [], id); if (found) return found; } return null; } export function flattenFiles(nodes, result = []) { nodes.forEach((node) => { if (node.kind === 'file') result.push({ path: node.path, name: node.name, size: node.file.size, file: node.file }); else flattenFiles(node.children, result); }); return result; }