Files
aurora-admin/frameworks/Tree.html
T

125 lines
4.3 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Kole UI · Tree (H5)</title>
<link rel="stylesheet" href="../.design_library/kole-ui/colors_and_type.css">
<link rel="stylesheet" href="./Tree.css">
<style>
/* 演示页布局脚手架 —— 组件样式已并入 Tree.css(S9-P7 单一样式真源) */
.demo { padding: 24px; background: var(--kole-color-page-bg); color: var(--kole-color-text-body); font-family: var(--font-family); }
h1 { font-size: 20px; margin: 0 0 4px; }
.sub { color: var(--kole-color-text-secondary); margin: 0 0 24px; font-size: 12px; }
</style>
</head>
<body>
<div class="demo">
<h1>Kole UI · Tree 组件(纯 H5)</h1>
<p class="sub">对齐 Tree 规范:节点高32px、缩进16px/级、箭头12px、选中态 #F0F5FF + 品牌色、支持复选框级联</p>
<label style="font-size:13px;color:var(--color-text-secondary);margin-right:16px;">
<input type="checkbox" id="chkToggle" checked onchange="checkable=this.checked; render();"> 启用复选框
</label>
<div class="kole-tree" role="tree" id="tree" style="margin-top:12px"></div>
</div>
<script>
const treeData = [
{ key: 'org', title: '某某科技', children: [
{ key: 'tech', title: '技术中心', children: [
{ key: 'fe', title: '前端组' },
{ key: 'be', title: '后端组' }
]},
{ key: 'product', title: '产品中心', children: [
{ key: 'pm', title: '产品组' },
{ key: 'ux', title: '设计组' }
]}
]}
];
let checkable = true;
let expanded = new Set(['org']);
let selected = new Set(['fe']);
let checked = new Set(['tech']);
function findNode(key, nodes = treeData) {
for (const n of nodes) {
if (n.key === key) return n;
if (n.children) { const f = findNode(key, n.children); if (f) return f; }
}
return null;
}
function descendantKeys(node) {
let out = [];
(node.children || []).forEach(c => { out.push(c.key); out = out.concat(descendantKeys(c)); });
return out;
}
function allChildrenChecked(node, set) {
if (!node.children || !node.children.length) return set.has(node.key);
return node.children.every(c => allChildrenChecked(c, set));
}
function hasChildren(n) { return n.children && n.children.length; }
function toggleExpand(key) {
expanded.has(key) ? expanded.delete(key) : expanded.add(key);
render();
}
function selectRow(key) {
selected = new Set([key]); render();
}
function toggleCheck(key) {
const node = findNode(key);
const willCheck = !checked.has(key);
const keys = [key, ...descendantKeys(node)];
keys.forEach(k => willCheck ? checked.add(k) : checked.delete(k));
// 向上级联:父节点 = 其所有子节点均勾选
propagateUp(node);
render();
}
function propagateUp(node) {
// 简单向上:遍历所有有父的节点
function walk(nodes, parent) {
nodes.forEach(n => {
if (parent && hasChildren(parent)) {
if (allChildrenChecked(parent, checked)) checked.add(parent.key);
else checked.delete(parent.key);
}
if (n.children) walk(n.children, n);
});
}
walk(treeData, null);
}
function visibleList() {
const out = [];
(function walk(nodes, depth) {
nodes.forEach(n => {
out.push({ node: n, depth });
if (hasChildren(n) && expanded.has(n.key)) walk(n.children, depth + 1);
});
})(treeData, 0);
return out;
}
function render() {
const root = document.getElementById('tree');
root.innerHTML = visibleList().map(({ node, depth }) => {
const open = expanded.has(node.key);
const arrow = hasChildren(node)
? `<span class="kole-tree-arrow ${open ? 'is-open' : ''}" role="tree" onclick="toggleExpand('${node.key}')">▸</span>`
: `<span class="kole-tree-arrow-placeholder"></span>`;
const check = checkable
? `<input type="checkbox" class="kole-tree-check" role="tree" ${checked.has(node.key) ? 'checked' : ''} onclick="event.stopPropagation();toggleCheck('${node.key}')">`
: '';
const sel = selected.has(node.key) ? ' is-selected' : '';
return `<div class="kole-tree-node${sel}" role="treeitem" tabindex="0" style="padding-left:${depth * 16 + 4}px" onclick="selectRow('${node.key}')">
${arrow}${check}<span class="kole-tree-label">${node.title}</span>
</div>`;
}).join('');
}
render();
</script>
</body>
</html>