Initial DDC release

This commit is contained in:
SirBlob committed 2026-10-25 20:24:50 -04:00
commit 434f6441da
57 files changed
+4606

No files matched your search

+50
View File
@@ -0,0 +1,50 @@
import { button, element } from "./dom.js";
import { formatBytes } from "./format.js";
export function renderTree(container, nodes, selection, handlers) {
if (nodes.length === 0) {
container.replaceChildren(element("p", "muted", "No files found."));
return;
}
container.replaceChildren(buildList(nodes, selection, handlers));
}
export function topLevelSelection(selection) {
const paths = [...selection].sort();
return paths.filter((path) => !paths.some((other) => other !== path && path.startsWith(`${other}/`)));
}
function buildList(nodes, selection, handlers) {
const list = element("ul", "tree-list");
for (const node of nodes) list.append(buildNode(node, selection, handlers));
return list;
}
function buildNode(node, selection, handlers) {
const item = element("li", "tree-item");
const row = element("div", "tree-row");
const label = element("label", "tree-label");
const checkbox = document.createElement("input");
checkbox.type = "checkbox";
checkbox.checked = selection.has(node.path);
checkbox.addEventListener("change", () => {
if (checkbox.checked) selection.add(node.path);
else selection.delete(node.path);
handlers.onSelectionChange();
});
const displayName = node.isDir ? `${node.name}/` : node.name;
label.append(checkbox, element("span", node.isDir ? "tree-name folder" : "tree-name", displayName));
row.append(label, element("span", "tree-size", formatBytes(node.size)));
if (node.isArchive) {
row.append(button("Extract", "secondary small", () => handlers.onExtract(node.path)));
}
item.append(row);
if (node.children && node.children.length > 0) {
item.append(buildList(node.children, selection, handlers));
}
return item;
}