Skip to content

Commit 2f539c3

Browse files
committed
fix: Improve test input row selection and type handling in RunModal and Header
1 parent e9ee5cb commit 2f539c3

2 files changed

Lines changed: 56 additions & 27 deletions

File tree

frontend/src/components/Header.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ const Header: React.FC<HeaderProps> = ({ activePage, associatedWorkflowId }) =>
5252
isVisible: false,
5353
})
5454
const testInputs = useSelector((state: RootState) => state.flow.testInputs)
55-
const [selectedRow, setSelectedRow] = useState<number | null>(null)
55+
const [selectedRow, setSelectedRow] = useState<string | null>(null)
5656
const [isHelpModalOpen, setIsHelpModalOpen] = useState<boolean>(false)
5757

5858
const router = useRouter()
@@ -78,7 +78,7 @@ const Header: React.FC<HeaderProps> = ({ activePage, associatedWorkflowId }) =>
7878

7979
useEffect(() => {
8080
if (testInputs.length > 0 && !selectedRow) {
81-
setSelectedRow(testInputs[0].id)
81+
setSelectedRow(testInputs[0].id.toString())
8282
}
8383
}, [testInputs])
8484

@@ -142,7 +142,7 @@ const Header: React.FC<HeaderProps> = ({ activePage, associatedWorkflowId }) =>
142142
return
143143
}
144144

145-
const testCase = testInputs.find((row) => row.id === selectedRow) ?? testInputs[0]
145+
const testCase = testInputs.find((row) => row.id.toString() === selectedRow) ?? testInputs[0]
146146

147147
if (testCase) {
148148
const { id, ...inputValues } = testCase
@@ -379,7 +379,13 @@ const Header: React.FC<HeaderProps> = ({ activePage, associatedWorkflowId }) =>
379379
<SettingsCard />
380380
</NavbarItem>
381381
<NavbarItem className="hidden sm:flex">
382-
<Button isIconOnly radius="full" variant="light" onPress={() => setIsHelpModalOpen(true)} aria-label="Help">
382+
<Button
383+
isIconOnly
384+
radius="full"
385+
variant="light"
386+
onPress={() => setIsHelpModalOpen(true)}
387+
aria-label="Help"
388+
>
383389
<Icon className="text-foreground/60" icon="solar:question-circle-linear" width={24} />
384390
</Button>
385391
</NavbarItem>
@@ -392,12 +398,14 @@ const Header: React.FC<HeaderProps> = ({ activePage, associatedWorkflowId }) =>
392398
await executeWorkflow(selectedInputs)
393399
setIsDebugModalOpen(false)
394400
}}
401+
selectedRow={selectedRow}
402+
onSelectedRowChange={setSelectedRow}
395403
/>
396404
<DeployModal
397405
isOpen={isDeployModalOpen}
398406
onOpenChange={setIsDeployModalOpen}
399407
workflowId={workflowId}
400-
testInput={testInputs.find((row) => row.id === selectedRow) ?? testInputs[0]}
408+
testInput={testInputs.find((row) => row.id.toString() === selectedRow) ?? testInputs[0]}
401409
/>
402410
<HelpModal isOpen={isHelpModalOpen} onClose={() => setIsHelpModalOpen(false)} />
403411
</>

frontend/src/components/modals/RunModal.tsx

Lines changed: 43 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,75 @@
1-
import React, { useState, useEffect } from 'react'
2-
import { useSelector, useDispatch } from 'react-redux'
1+
import { TestInput } from '@/types/api_types/workflowSchemas'
2+
import { uploadTestFiles } from '@/utils/api'
33
import {
4+
Alert,
5+
Button,
6+
Input,
47
Modal,
5-
ModalContent,
6-
ModalHeader,
78
ModalBody,
9+
ModalContent,
810
ModalFooter,
9-
Button,
11+
ModalHeader,
12+
Switch,
1013
Table,
11-
TableHeader,
12-
TableColumn,
1314
TableBody,
14-
TableRow,
1515
TableCell,
16-
Input,
16+
TableColumn,
17+
TableHeader,
18+
TableRow,
1719
Tooltip,
18-
Switch,
19-
Alert,
2020
} from '@heroui/react'
2121
import { Icon } from '@iconify/react'
22-
import TextEditor from '../textEditor/TextEditor'
23-
import { addTestInput, deleteTestInput, updateTestInput } from '../../store/flowSlice'
24-
import { RootState } from '../../store/store'
25-
import { AppDispatch } from '../../store/store'
26-
import { TestInput } from '@/types/api_types/workflowSchemas'
22+
import React, { useEffect, useState } from 'react'
23+
import { useDispatch, useSelector } from 'react-redux'
2724
import { useSaveWorkflow } from '../../hooks/useSaveWorkflow'
28-
import FileUploadBox from '../FileUploadBox'
29-
import { uploadTestFiles } from '@/utils/api'
25+
import { addTestInput, deleteTestInput, updateTestInput } from '../../store/flowSlice'
3026
import { getNodeMissingRequiredFields } from '../../store/nodeTypesSlice'
27+
import { AppDispatch, RootState } from '../../store/store'
28+
import FileUploadBox from '../FileUploadBox'
29+
import TextEditor from '../textEditor/TextEditor'
3130

3231
interface RunModalProps {
3332
isOpen: boolean
3433
onOpenChange: (isOpen: boolean) => void
3534
onRun: (initialInputs: Record<string, any>, files?: Record<string, string[]>) => void
3635
onSave?: () => void
36+
selectedRow?: string | null
37+
onSelectedRowChange?: (rowId: string | null) => void
3738
}
3839

3940
interface EditingCell {
4041
rowId: number
4142
field: string
4243
}
4344

44-
const RunModal: React.FC<RunModalProps> = ({ isOpen, onOpenChange, onRun, onSave }) => {
45+
const RunModal: React.FC<RunModalProps> = ({
46+
isOpen,
47+
onOpenChange,
48+
onRun,
49+
onSave,
50+
selectedRow: externalSelectedRow,
51+
onSelectedRowChange,
52+
}) => {
4553
const nodes = useSelector((state: RootState) => state.flow.nodes)
4654
const nodeConfigs = useSelector((state: RootState) => state.flow.nodeConfigs)
4755
const nodeTypesMetadata = useSelector((state: RootState) => state.nodeTypes).metadata
4856
const workflowID = useSelector((state: RootState) => state.flow.workflowID)
4957
const inputNode = nodes.find((node) => node.type === 'InputNode')
5058
const workflowInputVariables = inputNode ? nodeConfigs[inputNode.id]?.output_schema || {} : {}
5159
const workflowInputVariableNames = Object.keys(workflowInputVariables)
52-
const [alert, setAlert] = useState<{ message: string; color: 'danger' | 'success' | 'warning' | 'default'; isVisible: boolean }>({
60+
const [alert, setAlert] = useState<{
61+
message: string
62+
color: 'danger' | 'success' | 'warning' | 'default'
63+
isVisible: boolean
64+
}>({
5365
message: '',
5466
color: 'default',
5567
isVisible: false,
5668
})
5769

5870
const [testData, setTestData] = useState<TestInput[]>([])
5971
const [editingCell, setEditingCell] = useState<EditingCell | null>(null)
60-
const [selectedRow, setSelectedRow] = useState<string | null>(null)
72+
const [selectedRow, setSelectedRow] = useState<string | null>(externalSelectedRow || null)
6173
const [editorContents, setEditorContents] = useState<Record<string, string>>({})
6274
const [uploadedFiles, setUploadedFiles] = useState<Record<string, File[]>>({})
6375
const [filePaths, setFilePaths] = useState<Record<string, string[]>>({})
@@ -73,10 +85,18 @@ const RunModal: React.FC<RunModalProps> = ({ isOpen, onOpenChange, onRun, onSave
7385

7486
useEffect(() => {
7587
if (isOpen && testData.length > 0 && !selectedRow) {
76-
setSelectedRow(testData[0].id.toString())
88+
const newSelectedRow = testData[0].id.toString()
89+
setSelectedRow(newSelectedRow)
90+
onSelectedRowChange?.(newSelectedRow)
7791
}
7892
}, [isOpen, testData, selectedRow])
7993

94+
useEffect(() => {
95+
if (externalSelectedRow !== selectedRow) {
96+
setSelectedRow(externalSelectedRow)
97+
}
98+
}, [externalSelectedRow])
99+
80100
const getNextId = () => {
81101
const maxId = testData.reduce((max, row) => Math.max(max, row.id), 0)
82102
return maxId + 1
@@ -337,6 +357,7 @@ const RunModal: React.FC<RunModalProps> = ({ isOpen, onOpenChange, onRun, onSave
337357
onSelectionChange={(selection) => {
338358
const selectedKey = Array.from(selection)[0]?.toString() || null
339359
setSelectedRow(selectedKey)
360+
onSelectedRowChange?.(selectedKey)
340361
}}
341362
classNames={{
342363
base: 'min-w-[800px]',

0 commit comments

Comments
 (0)