From 480e1cc638085811f69284e3f9f50540c0cbc5fc Mon Sep 17 00:00:00 2001 From: "tao.chen" <93983997+taochen-ct@users.noreply.github.com> Date: Fri, 14 Aug 2026 11:59:06 +0800 Subject: [PATCH] update: data source --- frontend/app/components/common/Sidebar.tsx | 5 +- frontend/app/components/common/Topbar.tsx | 1 - .../components/platform/ScriptExplorer.tsx | 23 +- .../components/platform/TreeContextMenu.tsx | 86 +++-- frontend/app/context/AuthContext.tsx | 11 +- .../features/platform/DataResourcesPage.css | 147 -------- .../features/platform/DataResourcesPage.tsx | 339 ------------------ .../app/features/platform/ScriptsPage.tsx | 105 +++++- .../app/features/platform/WorkspaceTree.tsx | 87 ++++- .../platform/hooks/useEditSessionLifecycle.ts | 2 +- .../platform/state/scriptWorkspaceStore.ts | 104 +++++- .../app/features/platform/state/uiStore.ts | 60 +++- frontend/app/routes.ts | 1 - frontend/app/routes/platform.tsx | 4 +- frontend/app/services/api.ts | 16 + 15 files changed, 432 insertions(+), 559 deletions(-) delete mode 100644 frontend/app/features/platform/DataResourcesPage.css delete mode 100644 frontend/app/features/platform/DataResourcesPage.tsx 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 (