diff --git a/web/admin/index.html b/web/admin/index.html index 5986a3c..8b1df30 100644 --- a/web/admin/index.html +++ b/web/admin/index.html @@ -120,6 +120,27 @@ } .tree-item .actions button:hover { background: #e8eaed; } .tree-children { padding-left: 20px; } + .tree-item .toggle { + width: 18px; + height: 18px; + margin-right: 2px; + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + border: none; + background: transparent; + padding: 0; + color: #888; + flex-shrink: 0; + transition: transform 0.15s ease; + } + .tree-item .toggle svg { width: 14px; height: 14px; fill: currentColor; } + .tree-item .toggle.collapsed { transform: rotate(-90deg); } + .tree-item .toggle:hover { color: #1a73e8; } + .tree-children { display: block; } + .tree-children.hidden { display: none; } + /* 右侧内容区 - 左右分栏 */ .content { @@ -900,6 +921,15 @@ const API = '/api'; const ADMIN_API = '/admin/api'; let treeData = []; + // 折叠的目录 id 集合(持久化到 localStorage,按用户隔离) + let collapsedFolders = new Set(); + try { + const saved = JSON.parse(localStorage.getItem('noteManagerCollapsedFolders') || '[]'); + collapsedFolders = new Set(Array.isArray(saved) ? saved : []); + } catch (e) { collapsedFolders = new Set(); } + function saveCollapsedFolders() { + try { localStorage.setItem('noteManagerCollapsedFolders', JSON.stringify([...collapsedFolders])); } catch (e) {} + } let currentItem = null; let isFolderMode = false; let editId = null; // 当前打开的笔记 id @@ -1135,10 +1165,17 @@ const children = treeData.filter(c => c.parent_id === item.id); const hasChildren = children.length > 0; const isActive = currentItem && currentItem.id === item.id; - + if (item.is_folder) { + // 目录折叠状态:默认展开;在 collapsedFolders 中则折叠 + const isCollapsed = collapsedFolders.has(item.id); return `
+ ${hasChildren ? ` + ` : ` + `} @@ -1150,11 +1187,12 @@
- ${hasChildren ? `
${renderTreeItems(children)}
` : ''} + ${hasChildren ? `
${renderTreeItems(children)}
` : ''} `; } else { return `
+ @@ -1167,6 +1205,17 @@ }).join(''); } + // 折叠/展开目录 + function toggleFolder(id) { + if (collapsedFolders.has(id)) { + collapsedFolders.delete(id); + } else { + collapsedFolders.add(id); + } + saveCollapsedFolders(); + renderTree(); + } + // 选择项目 async function selectItem(id) { try {