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;
}