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
+ }
}