diff --git a/frontend/app/components/common/Sidebar.tsx b/frontend/app/components/common/Sidebar.tsx index 6ae1544..98a5189 100644 --- a/frontend/app/components/common/Sidebar.tsx +++ b/frontend/app/components/common/Sidebar.tsx @@ -1,6 +1,6 @@ import Icon from "./Icon"; -type ActivePage = "home" | "scripts" | "data-resources" | "schedules" | "system"; +type ActivePage = "home" | "scripts" | "schedules" | "system"; type SidebarProps = { activePage: ActivePage; @@ -15,7 +15,7 @@ type SidebarProps = { type NavigationItem = { label: string; - icon: "home" | "script" | "database" | "schedule" | "settings"; + icon: "home" | "script" | "schedule" | "settings"; page: ActivePage; }; @@ -44,7 +44,6 @@ export function Sidebar({ const navigation: NavigationItem[] = [ { label: "工作台", icon: "home", page: "home" }, { label: "构建脚本", icon: "script", page: "scripts" }, - { label: "数据资源", icon: "database", page: "data-resources" }, { label: "调度配置", icon: "schedule", page: "schedules" }, ]; diff --git a/frontend/app/components/common/Topbar.tsx b/frontend/app/components/common/Topbar.tsx index f19c29a..22e7dcd 100644 --- a/frontend/app/components/common/Topbar.tsx +++ b/frontend/app/components/common/Topbar.tsx @@ -28,7 +28,6 @@ export function Topbar({ home: "工作台", scripts: "构建脚本", schedules: "调度配置", - "data-resources": "数据资源", system: "系统管理", }; diff --git a/frontend/app/components/platform/ScriptExplorer.tsx b/frontend/app/components/platform/ScriptExplorer.tsx index 399f4d0..eb9286e 100644 --- a/frontend/app/components/platform/ScriptExplorer.tsx +++ b/frontend/app/components/platform/ScriptExplorer.tsx @@ -4,11 +4,13 @@ import { WorkspaceTreeGroup } from "~/features/platform/WorkspaceTree"; import { useScriptWorkspaceStore } from "~/features/platform/state/scriptWorkspaceStore"; import type { ScriptItem, WorkspaceDirectory } from "~/services/api"; import { type AuthUser } from "~/context/AuthContext"; +import type { ResourceItem } from "~/services/api"; type ScriptExplorerProps = { scripts: ScriptItem[]; filteredScripts: ScriptItem[]; directories: WorkspaceDirectory[]; + dataResources: ResourceItem[]; user: AuthUser | null; selectedId: string | null; loading: boolean; @@ -26,6 +28,7 @@ type ScriptExplorerProps = { target: { kind: "root" | "directory" | "file"; path: string; script?: ScriptItem } ) => void; onSelect: (scriptId: string) => void; + onCopyResourcePath: (jupyterPath: string) => void; uploadInputRef: RefObject; onHandleUpload: (event: ChangeEvent) => void; }; @@ -34,6 +37,7 @@ export function ScriptExplorer({ scripts, filteredScripts, directories, + dataResources, user, selectedId, loading, @@ -48,6 +52,7 @@ export function ScriptExplorer({ onChooseUpload, onContextMenu, onSelect, + onCopyResourcePath, uploadInputRef, onHandleUpload, }: ScriptExplorerProps) { @@ -57,6 +62,16 @@ export function ScriptExplorer({ ); const onToggle = useScriptWorkspaceStore((s) => s.toggleExpanded); + const dataByOwner = useMemo(() => { + const map = new Map(); + for (const r of dataResources) { + const list = map.get(r.owner_user_id) ?? []; + list.push(r); + map.set(r.owner_user_id, list); + } + return map; + }, [dataResources]); + const memberScriptGroups = useMemo(() => { const visibleScripts = user?.is_system_admin === true @@ -83,6 +98,7 @@ export function ScriptExplorer({ user: AuthUser | null; scripts: ScriptItem[]; directories: WorkspaceDirectory[]; + dataResources: ResourceItem[]; }[] = []; for (const [ownerUserId, groupScripts] of byOwner.entries()) { const displayName = @@ -109,6 +125,7 @@ export function ScriptExplorer({ ownerUserId === user?.user_id ? mergeDirectories(directories, inferred) : inferred, + dataResources: dataByOwner.get(groupUser.user_id) ?? [], }); } @@ -119,7 +136,7 @@ export function ScriptExplorer({ }); return groups; - }, [filteredScripts, directories, user]); + }, [filteredScripts, directories, user, dataByOwner]); return (