diff --git a/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c222b8adff906dd2f30b5c7a6401d4d84df47664 --- /dev/null +++ b/src/renderer/components/Experiment/Workflows/WorkflowCanvas.tsx @@ -0,0 +1,69 @@ +import { Background, ControlButton, Controls, ReactFlow } from '@xyflow/react'; +import React from 'react'; + +function generateNodes(workflow: any) { + let out: any[] = []; + let currentTask = '0'; + let position = 0; + + const workflowConfig = JSON.parse(workflow?.config); + console.log(workflowConfig); + + while (currentTask < workflowConfig.nodes.length) { + out.push({ + id: currentTask, + position: { x: 0, y: position }, + data: { label: workflowConfig.nodes[currentTask].name }, + }); + position += 100; + currentTask = workflowConfig.nodes[currentTask].out; + } + + return out; +} + +function generateEdges(workflow: any) { + let out: any[] = []; + let currentTask = '0'; + let ids = '0'; + + const workflowConfig = JSON.parse(workflow?.config); + console.log(workflowConfig); + + while (currentTask < workflowConfig.nodes.length) { + out.push({ + id: ids, + source: currentTask, + target: workflowConfig.nodes[currentTask].out, + markerEnd: { + type: 'arrow', + }, + }); + ids += 1; + currentTask = workflowConfig.nodes[currentTask].out; + } + + return out; +} + +export default function WorkflowCanvas({ selectedWorkflow }) { + return ( + <ReactFlow + nodes={generateNodes(selectedWorkflow)} + edges={generateEdges(selectedWorkflow)} + fitView + style={{ backgroundColor: '#F7F9FB' }} + > + <Background color="#96ADE9" /> + <Controls> + <ControlButton + onClick={() => { + alert('hi'); + }} + > + * + </ControlButton> + </Controls> + </ReactFlow> + ); +} diff --git a/src/renderer/components/Experiment/Workflows/index.tsx b/src/renderer/components/Experiment/Workflows/index.tsx index ece2e3ba25010c95e5d510f287905377c6128d78..0e5dc4a31161f250ff9a7c01fc24ea4d7d882f46 100644 --- a/src/renderer/components/Experiment/Workflows/index.tsx +++ b/src/renderer/components/Experiment/Workflows/index.tsx @@ -1,6 +1,7 @@ import { Box, Button, + Divider, List, ListItem, ListItemButton, @@ -9,7 +10,6 @@ import { Sheet, Typography, } from '@mui/joy'; -import { Background, ControlButton, Controls, ReactFlow } from '@xyflow/react'; import '@xyflow/react/dist/style.css'; import { PlayIcon, PlusCircleIcon, WorkflowIcon } from 'lucide-react'; @@ -18,6 +18,7 @@ import { useState } from 'react'; import * as chatAPI from '../../../lib/transformerlab-api-sdk'; import useSWR from 'swr'; import NewWorkflowModal from './NewWorkflowModal'; +import WorkflowCanvas from './WorkflowCanvas'; const fetcher = (url: any) => fetch(url).then((res) => res.json()); @@ -33,51 +34,6 @@ export default function Workflows({ experimentInfo }) { const workflows = workflowsData; - function generateNodes(workflow: any) { - let out: any[] = []; - let currentTask = '0'; - let position = 0; - - const workflowConfig = JSON.parse(workflow?.config); - console.log(workflowConfig); - - while (currentTask < workflowConfig.nodes.length) { - out.push({ - id: currentTask, - position: { x: 0, y: position }, - data: { label: workflowConfig.nodes[currentTask].name }, - }); - position += 100; - currentTask = workflowConfig.nodes[currentTask].out; - } - - return out; - } - - function generateEdges(workflow: any) { - let out: any[] = []; - let currentTask = '0'; - let ids = '0'; - - const workflowConfig = JSON.parse(workflow?.config); - console.log(workflowConfig); - - while (currentTask < workflowConfig.nodes.length) { - out.push({ - id: ids, - source: currentTask, - target: workflowConfig.nodes[currentTask].out, - markerEnd: { - type: 'arrow', - }, - }); - ids += 1; - currentTask = workflowConfig.nodes[currentTask].out; - } - - return out; - } - async function runWorkflow(workflowId: string) { await fetch(chatAPI.Endpoints.Workflows.RunWorkflow(workflowId)); } @@ -131,6 +87,7 @@ export default function Workflows({ experimentInfo }) { </ListItemButton> </ListItem> ))} + <Divider /> <ListItem> <ListItemButton onClick={() => setNewWorkflowModalOpen(true)}> <ListItemDecorator> @@ -157,23 +114,7 @@ export default function Workflows({ experimentInfo }) { }} > {selectedWorkflow ? ( - <ReactFlow - nodes={generateNodes(selectedWorkflow)} - edges={generateEdges(selectedWorkflow)} - fitView - style={{ backgroundColor: '#F7F9FB' }} - > - <Background color="#96ADE9" /> - <Controls> - <ControlButton - onClick={() => { - alert('hi'); - }} - > - * - </ControlButton> - </Controls> - </ReactFlow> + <WorkflowCanvas selectedWorkflow={selectedWorkflow} /> ) : ( <Box sx={{ width: '100%', backgroundColor: '#F7F9FB' }} p={4}> Select Workflow