diff --git a/frontend/app/components/platform/ScriptExplorer.tsx b/frontend/app/components/platform/ScriptExplorer.tsx index c65f477..1556ca0 100644 --- a/frontend/app/components/platform/ScriptExplorer.tsx +++ b/frontend/app/components/platform/ScriptExplorer.tsx @@ -178,25 +178,29 @@ export function ScriptExplorer({ ) : ( <> - {memberScriptGroups.map((group) => ( - - ))} + {memberScriptGroups.map((group) => { + const ownerKey = group.user?.user_id ?? "anon"; + return ( + + ); + })} {filteredScripts.length === 0 && (
diff --git a/frontend/app/features/platform/WorkspaceTree.tsx b/frontend/app/features/platform/WorkspaceTree.tsx index b52cda2..34e0a42 100644 --- a/frontend/app/features/platform/WorkspaceTree.tsx +++ b/frontend/app/features/platform/WorkspaceTree.tsx @@ -1,4 +1,4 @@ -import { type MouseEvent as ReactMouseEvent } from "react"; +import { type MouseEvent as ReactMouseEvent, useEffect } from "react"; import Icon from "../../components/common/Icon"; import type { @@ -23,12 +23,14 @@ type WorkspaceTreeProps = { target: WorkspaceTreeTarget, ) => void; readOnly?: boolean; + // 唯一标识此 group(通常 `__group__`),让多个 owner 的 group 各自独立展开。 + groupKey: string; expandedPaths: Set; onToggle: (path: string) => void; loadingChildrenPaths: Set; }; -type WorkspaceTreeItemsProps = Omit & { +type WorkspaceTreeItemsProps = Omit & { path: string; depth: number; }; @@ -65,19 +67,27 @@ export function WorkspaceTreeGroup({ onSelect, onContextMenu, readOnly = false, + groupKey, expandedPaths, onToggle, loadingChildrenPaths, }: WorkspaceTreeProps) { - const open = expandedPaths.has(""); - const childrenLoading = loadingChildrenPaths.has(""); + const open = expandedPaths.has(groupKey); + // 首次挂载自动展开(保留原本 useState(true) 的默认展开行为)。 + // toggleExpanded 内识别 `__group__` 前缀,不会触发 loadChildren。 + useEffect(() => { + if (!expandedPaths.has(groupKey)) { + void onToggle(groupKey); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [groupKey]); return (
{open && (
diff --git a/frontend/app/features/platform/state/scriptWorkspaceStore.ts b/frontend/app/features/platform/state/scriptWorkspaceStore.ts index c367b7b..6520189 100644 --- a/frontend/app/features/platform/state/scriptWorkspaceStore.ts +++ b/frontend/app/features/platform/state/scriptWorkspaceStore.ts @@ -293,7 +293,8 @@ export const useScriptWorkspaceStore = create((set, get) => { next.delete(path); } else { next.add(path); - if (!state.loadedChildPaths.has(path)) { + // group key (`__group__`) 不是 workspace 路径,不调 loadChildren + if (!path.startsWith("__group__") && !state.loadedChildPaths.has(path)) { void get().loadChildren(path); } }