diff --git a/src/frontend/src/components/tableNodeCellRender/index.tsx b/src/frontend/src/components/tableNodeCellRender/index.tsx
new file mode 100644
index 000000000..c93d6ce09
--- /dev/null
+++ b/src/frontend/src/components/tableNodeCellRender/index.tsx
@@ -0,0 +1,300 @@
+import { CustomCellRendererProps } from "ag-grid-react";
+import { classNames, cn, isTimeStampString } from "../../utils/utils";
+import ArrayReader from "../arrayReaderComponent";
+import DateReader from "../dateReaderComponent";
+import NumberReader from "../numberReader";
+import ObjectRender from "../objectRender";
+import StringReader from "../stringReaderComponent";
+import { Badge } from "../ui/badge";
+import { cloneDeep } from "lodash";
+import { type } from "os";
+import {
+ convertObjToArray,
+ convertValuesToNumbers,
+ hasDuplicateKeys,
+ scapedJSONStringfy,
+} from "../../utils/reactflowUtils";
+import CodeAreaComponent from "../codeAreaComponent";
+import DictComponent from "../dictComponent";
+import Dropdown from "../dropdownComponent";
+import FloatComponent from "../floatComponent";
+import InputFileComponent from "../inputFileComponent";
+import InputGlobalComponent from "../inputGlobalComponent";
+import InputListComponent from "../inputListComponent";
+import IntComponent from "../intComponent";
+import KeypairListComponent from "../keypairListComponent";
+import PromptAreaComponent from "../promptComponent";
+import TextAreaComponent from "../textAreaComponent";
+import ToggleShadComponent from "../toggleShadComponent";
+import { useState } from "react";
+import useFlowStore from "../../stores/flowStore";
+
+export default function TableNodeCellRender({
+ node: { data: templateData },
+ value: {
+ value: templateValue,
+ nodeClass,
+ handleOnNewValue,
+ handleOnChangeDb,
+ },
+}: CustomCellRendererProps) {
+ console.log(
+ templateData,
+ templateValue,
+ nodeClass,
+ handleOnNewValue,
+ handleOnChangeDb,
+ );
+ const [errorDuplicateKey, setErrorDuplicateKey] = useState(false);
+ const edges = useFlowStore((state) => state.edges);
+
+ const id = {
+ inputTypes: templateData.input_types,
+ type: templateData.type,
+ id: nodeClass.id,
+ fieldName: templateData.key,
+ };
+ const disabled =
+ edges.some(
+ (edge) =>
+ edge.targetHandle ===
+ scapedJSONStringfy(
+ templateData.proxy
+ ? {
+ ...id,
+ proxy: templateData.proxy,
+ }
+ : id,
+ ),
+ ) ?? false;
+ function getCellType() {
+ switch (templateData.type) {
+ case "str":
+ if (!templateData.options) {
+ return (
+
+ {templateData?.list ? (
+ {
+ handleOnNewValue(value, templateData.key);
+ }}
+ />
+ ) : templateData.multiline ? (
+ {
+ handleOnNewValue(value, templateData.key);
+ }}
+ />
+ ) : (
+
+ handleOnNewValue(value, templateData.key)
+ }
+ setDb={(value) => {
+ handleOnChangeDb(value, templateData.key);
+ }}
+ name={templateData.key}
+ data={templateData}
+ />
+ )}
+
+ );
+ } else {
+ return (
+
+ handleOnNewValue(value, templateData.key)}
+ value={templateData.value ?? "Choose an option"}
+ id={"dropdown-edit-" + templateData.name}
+ >
+
+ );
+ }
+
+ case "NestedDict":
+ return (
+
+ {
+ templateValue = newValue;
+ handleOnNewValue(newValue, templateData.key);
+ }}
+ id="editnode-div-dict-input"
+ />
+
+ );
+ break;
+
+ case "dict":
+ return (
+ 1 ? "my-3" : "",
+ )}
+ >
+ {
+ const valueToNumbers = convertValuesToNumbers(newValue);
+ templateValue = valueToNumbers;
+ setErrorDuplicateKey(hasDuplicateKeys(valueToNumbers));
+ handleOnNewValue(valueToNumbers, templateData.key);
+ }}
+ isList={templateData.list ?? false}
+ />
+
+ );
+ break;
+
+ case "bool":
+ return (
+
+ {" "}
+ {
+ handleOnNewValue(isEnabled, templateData.key);
+ }}
+ size="small"
+ editNode={true}
+ />
+
+ );
+
+ case "float":
+ return (
+
+ {
+ handleOnNewValue(value, templateData.key);
+ }}
+ />
+
+ );
+ case "int":
+ return (
+
+ {
+ handleOnNewValue(value, templateData.key);
+ }}
+ />
+
+ );
+ break;
+
+ case "file":
+ return (
+
+ {
+ handleOnNewValue(value, templateData.key);
+ }}
+ fileTypes={templateData.fileTypes}
+ onFileChange={(filePath: string) => {
+ templateData.file_path = filePath;
+ }}
+ >
+
+ );
+
+ case "prompt":
+ return (
+
+
{
+ nodeClass = value;
+ }}
+ value={templateValue ?? ""}
+ onChange={(value: string | string[]) => {
+ handleOnNewValue(value, templateData.key);
+ }}
+ id={"prompt-area-edit-" + templateData.name}
+ data-testid={"modal-prompt-input-" + templateData.name}
+ />
+
+ );
+ break;
+
+ case "code":
+ return (
+
+ {
+ nodeClass = value;
+ }}
+ nodeClass={nodeClass}
+ disabled={disabled}
+ editNode={true}
+ value={templateData.value ?? ""}
+ onChange={(value: string | string[]) => {
+ handleOnNewValue(value, templateData.key);
+ }}
+ id={"code-area-edit" + templateData.name}
+ />
+
+ );
+ break;
+ case "Any":
+ return <>->;
+ break;
+ default:
+ return String(templateValue);
+ }
+ }
+
+ return (
+
+ {getCellType()}
+
+ );
+}
diff --git a/src/frontend/src/modals/editNodeModal/index.tsx b/src/frontend/src/modals/editNodeModal/index.tsx
index 40e174529..771129d94 100644
--- a/src/frontend/src/modals/editNodeModal/index.tsx
+++ b/src/frontend/src/modals/editNodeModal/index.tsx
@@ -1,46 +1,20 @@
import { cloneDeep } from "lodash";
import { forwardRef, useEffect, useState } from "react";
-import CodeAreaComponent from "../../components/codeAreaComponent";
-import DictComponent from "../../components/dictComponent";
-import Dropdown from "../../components/dropdownComponent";
-import FloatComponent from "../../components/floatComponent";
import IconComponent from "../../components/genericIconComponent";
-import InputFileComponent from "../../components/inputFileComponent";
-import InputGlobalComponent from "../../components/inputGlobalComponent";
-import InputListComponent from "../../components/inputListComponent";
-import IntComponent from "../../components/intComponent";
-import KeypairListComponent from "../../components/keypairListComponent";
-import PromptAreaComponent from "../../components/promptComponent";
-import ShadTooltip from "../../components/shadTooltipComponent";
-import TextAreaComponent from "../../components/textAreaComponent";
-import ToggleShadComponent from "../../components/toggleShadComponent";
import { Badge } from "../../components/ui/badge";
-import {
- Table,
- TableBody,
- TableCell,
- TableHead,
- TableHeader,
- TableRow,
-} from "../../components/ui/table";
import {
LANGFLOW_SUPPORTED_TYPES,
limitScrollFieldsModal,
} from "../../constants/constants";
-import { Case } from "../../shared/components/caseComponent";
import useFlowStore from "../../stores/flowStore";
import { NodeDataType } from "../../types/flow";
-import {
- convertObjToArray,
- convertValuesToNumbers,
- hasDuplicateKeys,
- scapedJSONStringfy,
-} from "../../utils/reactflowUtils";
import { classNames } from "../../utils/utils";
import BaseModal from "../baseModal";
import TableComponent from "../../components/tableComponent";
import TableAutoCellRender from "../../components/tableAutoCellRender";
import { TemplateVariableType } from "../../types/api";
+import TableNodeCellRender from "../../components/tableNodeCellRender";
+import { ValueGetterParams } from "ag-grid-community";
const EditNodeModal = forwardRef(
(
@@ -63,7 +37,6 @@ const EditNodeModal = forwardRef(
const [myData, setMyData] = useState(dataFromStore ?? data);
- const edges = useFlowStore((state) => state.edges);
const setNode = useFlowStore((state) => state.setNode);
function changeAdvanced(n) {
@@ -89,12 +62,6 @@ const EditNodeModal = forwardRef(
}
}, [open]);
- const [errorDuplicateKey, setErrorDuplicateKey] = useState(false);
-
- const type = (templateParam) => {
- return myData.node?.template[templateParam].type;
- };
-
const rowData = Object.keys(myData.node!.template)
.filter((key: string) => {
const templateParam = myData.node!.template[
@@ -103,7 +70,11 @@ const EditNodeModal = forwardRef(
return (
key.charAt(0) !== "_" &&
templateParam.show &&
- LANGFLOW_SUPPORTED_TYPES.has(templateParam.type)
+ LANGFLOW_SUPPORTED_TYPES.has(templateParam.type) &&
+ !(
+ (key === "code" && templateParam.type === "code") ||
+ (key.includes("code") && templateParam.proxy)
+ )
);
})
.map((key: string) => {
@@ -111,44 +82,65 @@ const EditNodeModal = forwardRef(
key
] as TemplateVariableType;
return {
- param:
- (templateParam.display_name
- ? templateParam.display_name
- : templateParam.name) ?? key,
- desc: templateParam.info ?? "",
- value: templateParam.value ?? "",
- show: !templateParam.advanced ?? "",
+ ...templateParam,
key: key,
};
});
const columnDefs = [
{
- headerName: "Parameter",
- field: "param",
+ headerName: "Name",
+ field: "display_name",
+ valueGetter: (params) => {
+ const templateParam = params.data;
+ return (
+ (templateParam.display_name
+ ? templateParam.display_name
+ : templateParam.name) ?? params.data.key
+ );
+ },
cellRenderer: TableAutoCellRender,
flex: 1,
resizable: false,
},
{
headerName: "Description",
- field: "desc",
- cellRenderer: TableAutoCellRender,
- flex: 1,
- resizable: false,
- },
- {
- headerName: "Value",
- field: "value",
+ field: "info",
cellRenderer: TableAutoCellRender,
flex: 2,
resizable: false,
},
+ {
+ headerName: "Value",
+ field: "value",
+ cellRenderer: TableNodeCellRender,
+ valueGetter: (params: ValueGetterParams) => {
+ console.log("params", params);
+ return {
+ value: params.data.value,
+ nodeClass: myData.node,
+ handleOnNewValue: handleOnNewValue,
+ handleOnChangeDb: (value, key) => {
+ setMyData((oldData) => {
+ let newData = cloneDeep(oldData);
+ newData.node!.template[key].load_from_db = value;
+ return newData;
+ });
+ },
+ };
+ },
+ minWidth: 300,
+ flex: 1,
+ resizable: false,
+ },
{
headerName: "Show",
- field: "show",
+ field: "advanced",
cellRenderer: "agCheckboxCellRenderer",
cellEditor: "agCheckboxCellEditor",
+ valueGetter: (params) => {
+ return !params.data.advanced;
+ },
valueSetter: (params) => {
changeAdvanced(params.data.key);
return true;
@@ -196,518 +188,14 @@ const EditNodeModal = forwardRef(
Parameters
-
-
limitScrollFieldsModal
- ? "overflow-scroll overflow-x-hidden custom-scroll"
- : "",
- )}
- >
- {nodeLength > 0 && (
-
-
-
-
-
- PARAM
- DESC
-
- VALUE
-
- SHOW
-
-
-
- {Object.keys(myData.node!.template)
- .filter(
- (templateParam) =>
- templateParam.charAt(0) !== "_" &&
- myData.node?.template[templateParam].show &&
- LANGFLOW_SUPPORTED_TYPES.has(
- myData.node!.template[templateParam].type,
- ),
- )
- .map((templateParam, index) => {
- let id = {
- inputTypes:
- myData.node!.template[templateParam].input_types,
- type: myData.node!.template[templateParam].type,
- id: myData.id,
- fieldName: templateParam,
- };
- let disabled =
- edges.some(
- (edge) =>
- edge.targetHandle ===
- scapedJSONStringfy(
- myData.node!.template[templateParam].proxy
- ? {
- ...id,
- proxy:
- myData.node?.template[templateParam]
- .proxy,
- }
- : id,
- ),
- ) ?? false;
- return (
-
-
-
-
- {myData.node?.template[templateParam]
- .display_name
- ? myData.node!.template[templateParam]
- .display_name
- : myData.node?.template[templateParam]
- .name}
-
-
-
-
-
-
- {data.node?.template[templateParam]?.info ??
- ""}
-
-
-
-
-
-
- {myData.node!.template[templateParam]
- ?.list ? (
- {
- handleOnNewValue(
- value,
- templateParam,
- );
- }}
- />
- ) : myData.node!.template[templateParam]
- .multiline ? (
- {
- handleOnNewValue(
- value,
- templateParam,
- );
- }}
- />
- ) : (
-
- handleOnNewValue(value, templateParam)
- }
- setDb={(value) => {
- setMyData((oldData) => {
- let newData = cloneDeep(oldData);
- newData.node!.template[
- templateParam
- ].load_from_db = value;
- return newData;
- });
- }}
- name={templateParam}
- data={myData}
- />
- )}
-
-
-
-
-
- {
- myData.node!.template[
- templateParam
- ].value = newValue;
- handleOnNewValue(
- newValue,
- templateParam,
- );
- }}
- id="editnode-div-dict-input"
- />
-
-
-
-
- 1
- ? "my-3"
- : "",
- )}
- >
- {
- const valueToNumbers =
- convertValuesToNumbers(newValue);
- myData.node!.template[
- templateParam
- ].value = valueToNumbers;
- setErrorDuplicateKey(
- hasDuplicateKeys(valueToNumbers),
- );
- handleOnNewValue(
- valueToNumbers,
- templateParam,
- );
- }}
- isList={
- data.node?.template[templateParam]
- ?.list ?? false
- }
- />
-
-
-
-
-
- {" "}
- {
- handleOnNewValue(
- isEnabled,
- templateParam,
- );
- }}
- size="small"
- editNode={true}
- />
-
-
-
-
-
- {
- handleOnNewValue(value, templateParam);
- }}
- />
-
-
-
-
-
-
- handleOnNewValue(value, templateParam)
- }
- value={
- myData.node!.template[templateParam]
- .value ?? "Choose an option"
- }
- id={
- "dropdown-edit-" +
- myData.node!.template[templateParam]
- .name
- }
- >
-
-
-
-
-
- {
- handleOnNewValue(value, templateParam);
- }}
- />
-
-
-
-
-
- {
- handleOnNewValue(value, templateParam);
- }}
- fileTypes={
- myData.node!.template[templateParam]
- .fileTypes
- }
- onFileChange={(filePath: string) => {
- data.node!.template[
- templateParam
- ].file_path = filePath;
- }}
- >
-
-
-
-
-
-
{
- myData.node = nodeClass;
- }}
- value={
- myData.node!.template[templateParam]
- .value ?? ""
- }
- onChange={(value: string | string[]) => {
- handleOnNewValue(value, templateParam);
- }}
- id={
- "prompt-area-edit-" +
- myData.node!.template[templateParam]
- .name
- }
- data-testid={
- "modal-prompt-input-" +
- myData.node!.template[templateParam]
- .name
- }
- />
-
-
-
-
-
- {
- data.node = nodeClass;
- }}
- nodeClass={data.node}
- disabled={disabled}
- editNode={true}
- value={
- myData.node!.template[templateParam]
- .value ?? ""
- }
- onChange={(value: string | string[]) => {
- handleOnNewValue(value, templateParam);
- }}
- id={
- "code-area-edit" +
- myData.node!.template[templateParam]
- .name
- }
- />
-
-
-
-
- <>->
-
-
-
-
- {
- changeAdvanced(templateParam);
- }}
- disabled={disabled}
- size="small"
- editNode={true}
- />
-
-
-
- );
- })}
-
-
+
+ {nodeLength > 0 && (
+
+
+ )}