diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index b06271782..de54c93bb 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -224,7 +224,7 @@ export default function ParameterComponent({ type === "int") && !optionalHandle ? ( <> - ) : left === true && type === "str" ? ( + ) : left === true && type === "dict" ? (
{ @@ -54,7 +52,12 @@ export default function KeypairListComponent({ disabled={disabled} type="text" value={key} - className={editNode ? "input-edit-node" : ""} + className={classNames( + editNode + ? "input-edit-node" + : "", + duplicateKey ? "input-invalid" : "" + )} placeholder="Type key..." onChange={(event) => handleChangeKey(event, index)} onKeyDown={(e) => { diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index 80f31b160..5f53d670c 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -27,6 +27,11 @@ import { TabsContext } from "../../contexts/tabsContext"; import { typesContext } from "../../contexts/typesContext"; import { NodeDataType } from "../../types/flow"; import { TabsState } from "../../types/tabs"; +import { + convertArrayToObj, + convertObjToArray, + hasDuplicateKeys, +} from "../../utils/reactflowUtils"; import { classNames } from "../../utils/utils"; import BaseModal from "../baseModal"; @@ -49,6 +54,7 @@ const EditNodeModal = forwardRef( const [myData, setMyData] = useState(data); const { setTabsState, tabId } = useContext(TabsContext); const { reactFlowInstance } = useContext(typesContext); + const [errorDuplicateKey, setErrorDuplicateKey] = useState(false); let disabled = reactFlowInstance @@ -87,10 +93,10 @@ const EditNodeModal = forwardRef( key5: "value5", key6: "value6", } as {}); - const [dictArr, setDictArr] = useState([]); + const [dictArr, setDictArr] = useState([] as string[]); useEffect(() => { - convertToArray(dict); + setDictArr(convertObjToArray(dict)); }, [dict]); const convertToArray = (singleObject) => { @@ -208,13 +214,25 @@ const EditNodeModal = forwardRef( }} /> ) : myData.node?.template[templateParam] - .type === "str" ? ( + .type === "dict" ? (
{ + setErrorDuplicateKey( + hasDuplicateKeys(newValue) + ); + if (hasDuplicateKeys(newValue)) { + setDictArr(newValue); + } else { + setDict( + convertArrayToObj(newValue) + ); + } + }} />
) : myData.node.template[templateParam] diff --git a/src/frontend/src/style/applies.css b/src/frontend/src/style/applies.css index 4f6f9b3a5..e52599291 100644 --- a/src/frontend/src/style/applies.css +++ b/src/frontend/src/style/applies.css @@ -1037,4 +1037,8 @@ .label-invalid{ @apply text-destructive } + + .input-invalid{ + @apply border-destructive focus:ring-destructive focus:border-destructive + } }