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 ( - - ); - })} - -
+
+ {nodeLength > 0 && ( +
+
+
- )} -
+
+ )}