feat(kernel): complete tree-first graph tasks 074-080

This commit is contained in:
lix-2026
2026-04-16 22:01:51 +08:00
parent 2ff10fa86c
commit b1d5d97142
65 changed files with 11579 additions and 4606 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
"use client";
import type { DocumentNode } from "@/lib/documents";
import type { SidebarTreeNode } from "@/lib/kernel-sidebar";
import type { MediaAsset } from "@/types/media";
import type { FileTreeRow } from "./types";
import { makeAssetFolderRowId, makeAssetRowId, makeDocRowId, makeIndexRowId } from "./types";
@@ -12,7 +12,7 @@ export function buildVisibleRows({
assetChildrenByAssetId,
expandedAssetFolderIds,
}: {
nodes: DocumentNode[];
nodes: SidebarTreeNode[];
expanded: Set<string>;
assetsByDoc: Record<string, MediaAsset[]>;
assetChildrenByAssetId?: Record<string, MediaAsset[]>;
@@ -21,7 +21,7 @@ export function buildVisibleRows({
const rows: FileTreeRow[] = [];
const visitedDocIds = new Set<string>();
const walk = (node: DocumentNode, depth: number) => {
const walk = (node: SidebarTreeNode, depth: number) => {
// 防御性处理:上游数据异常时(例如同一 docId 在树中重复出现),避免生成重复 rowId 导致 React key 冲突。
// 同时也能避免潜在的“循环引用/重复引用”导致的递归问题。
if (visitedDocIds.has(node.id)) return;
+3 -3
View File
@@ -1,6 +1,6 @@
"use client";
import type { DocumentNode } from "@/lib/documents";
import type { SidebarTreeNode } from "@/lib/kernel-sidebar";
import type { MediaAsset } from "@/types/media";
export type FileTreeRowKind = "doc" | "index" | "asset" | "asset-folder";
@@ -60,7 +60,7 @@ export type FileTreeRow =
depth: number;
docId: string;
parentDocId: string | null;
node: DocumentNode;
node: SidebarTreeNode;
hasChildren: boolean;
isExpanded: boolean;
}
@@ -70,7 +70,7 @@ export type FileTreeRow =
depth: number;
docId: string;
parentDocId: string;
node: DocumentNode;
node: SidebarTreeNode;
}
| {
kind: "asset-folder";