From 1ee8db1f23e31b189e4525c811a7fc3d610485cb Mon Sep 17 00:00:00 2001
From: sanjaycal <sanjay.calgary@gmail.com>
Date: Wed, 26 Feb 2025 12:00:29 -0500
Subject: [PATCH] Be able to add training recipes to the workflow(though I
 still need to have it run those in the API)

---
 .../Experiment/Workflows/NewNodeModal.tsx     | 94 ++++++++++++++++---
 .../components/Experiment/Workflows/index.tsx |  2 +-
 2 files changed, 80 insertions(+), 16 deletions(-)

diff --git a/src/renderer/components/Experiment/Workflows/NewNodeModal.tsx b/src/renderer/components/Experiment/Workflows/NewNodeModal.tsx
index 47326441..f3ed2fa8 100644
--- a/src/renderer/components/Experiment/Workflows/NewNodeModal.tsx
+++ b/src/renderer/components/Experiment/Workflows/NewNodeModal.tsx
@@ -9,42 +9,106 @@ import {
   Modal,
   ModalClose,
   ModalDialog,
+  Option,
+  Select,
   Stack,
   Textarea,
 } from '@mui/joy';
 import { useState } from 'react';
 
 import * as chatAPI from 'renderer/lib/transformerlab-api-sdk';
+import useSWR from 'swr';
+import { node } from 'webpack';
 
-export default function NewNodeModal({ open, onClose, workflowId }) {
-  const [state, setState] = useState(null);
+const fetcher = (url: any) => fetch(url).then((res) => res.json());
+
+export default function NewNodeModal({ open, onClose, selectedWorkflow }) {
+  const [mode, setMode] = useState('OTHER');
+
+  console.log(mode);
+
+  const {
+    data: trainingTemplatesData,
+    error: trainingTemplatesError,
+    isLoading: isLoading,
+  } = useSWR(chatAPI.GET_TRAINING_TEMPLATE_URL(), fetcher);
+
+  const {
+    data: workflowsData,
+    error: workflowsError,
+    isLoading: workflowsIsLoading,
+  } = useSWR(chatAPI.Endpoints.Workflows.List(), fetcher);
+
+  console.log(trainingTemplatesData);
+
+  const handleModeChange = (event: React.ChangeEvent<HTMLSelectElement>) => {
+    setMode(event.target.outerText);
+  };
 
   return (
     <Modal open={open} onClose={() => onClose()}>
       <ModalDialog>
         <ModalClose />
         <DialogTitle>Create new Node</DialogTitle>
-        <DialogContent>Fill in the information.</DialogContent>
+        <DialogContent>text</DialogContent>
         <form
           onSubmit={async (event: React.FormEvent<HTMLFormElement>) => {
             event.preventDefault();
             const formData = new FormData(event.currentTarget);
-            const node = formData.get('node') as string;
-            //const nodes = formData.get('nodes') as string;
-            await fetch(
-              chatAPI.Endpoints.Workflows.AddNode(
-                workflowId,
-                node
-              )
-            );
+            const name = formData.get('name') as string;
+            if (mode == 'TRAIN') {
+              const template = formData.get('trainingTemplate') as string;
+              const config = JSON.parse(selectedWorkflow.config);
+              console.log(config);
+              const node = {
+                name: name,
+                type: 'TRAIN',
+                out: (config.nodes.length + 1).toString(),
+                template: template,
+              };
+              await fetch(
+                chatAPI.Endpoints.Workflows.AddNode(
+                  selectedWorkflow.id,
+                  JSON.stringify(node)
+                )
+              );
+            } else {
+              const node = JSON.parse(formData.get('node') as string);
+              node.name = name;
+              await fetch(
+                chatAPI.Endpoints.Workflows.AddNode(
+                  selectedWorkflow.id,
+                  JSON.stringify(node)
+                )
+              );
+            }
             onClose();
           }}
         >
           <Stack spacing={2}>
-            <FormControl>
-              <FormLabel>Nodes</FormLabel>
-              <Textarea minRows={4} autoFocus required name="node" />
-            </FormControl>
+            <Select
+              labelId="mode-label"
+              id="mode-select"
+              value={mode}
+              onChange={handleModeChange}
+            >
+              <Option value="OTHER">OTHER</Option>
+              <Option value="TRAIN">TRAIN</Option>
+            </Select>
+            <FormLabel>Name</FormLabel>
+            <Textarea minRows={4} autoFocus required name="name" />
+            {mode == 'TRAIN' ? (
+              <Select name="trainingTemplate">
+                {trainingTemplatesData.map((template) => (
+                  <Option value={template[1]}>{template[1]}</Option>
+                ))}
+              </Select>
+            ) : (
+              <FormControl>
+                <FormLabel>Nodes</FormLabel>
+                <Textarea minRows={4} autoFocus required name="node" />
+              </FormControl>
+            )}
             <Button type="submit">Submit</Button>
           </Stack>
         </form>
diff --git a/src/renderer/components/Experiment/Workflows/index.tsx b/src/renderer/components/Experiment/Workflows/index.tsx
index 35f5e25f..edd9567f 100644
--- a/src/renderer/components/Experiment/Workflows/index.tsx
+++ b/src/renderer/components/Experiment/Workflows/index.tsx
@@ -74,7 +74,7 @@ export default function Workflows({ experimentInfo }) {
             setNewNodeflowModalOpen(false);
             mutateWorkflows();
           }}
-          workflowId={selectedWorkflow?.id}
+          selectedWorkflow={selectedWorkflow}
         />
       )}
       <Typography level="h1">Workflows</Typography>
-- 
GitLab