From edabb31112da106d5dd0527165711375e433850c Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 30 Apr 2024 13:33:37 -0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(StringListInput.py):=20add=20a=20n?= =?UTF-8?q?ew=20custom=20component=20called=20"StringListInput"=20to=20han?= =?UTF-8?q?dle=20string=20list=20inputs=20=E2=9C=A8=20(KeyPairOutput.py):?= =?UTF-8?q?=20add=20a=20new=20custom=20component=20called=20"KeyPairOutput?= =?UTF-8?q?"=20to=20handle=20dictionary=20outputs=20=E2=9C=A8=20(StringLis?= =?UTF-8?q?tOutput.py):=20add=20a=20new=20custom=20component=20called=20"S?= =?UTF-8?q?tringListOutput"=20to=20handle=20string=20list=20outputs=20?= =?UTF-8?q?=F0=9F=9A=80=20(constants.ts):=20add=20"StringListInput"=20and?= =?UTF-8?q?=20"StringListOutput"=20to=20the=20list=20of=20supported=20inpu?= =?UTF-8?q?t=20and=20output=20types=20=E2=99=BB=EF=B8=8F=20(index.tsx):=20?= =?UTF-8?q?refactor=20IOKeyPairInput=20component=20to=20accept=20an=20addi?= =?UTF-8?q?tional=20prop=20"isInputField"=20and=20disable=20input=20fields?= =?UTF-8?q?=20if=20it's=20false=20=E2=99=BB=EF=B8=8F=20(index.tsx):=20refa?= =?UTF-8?q?ctor=20IOFieldView=20component=20to=20handle=20rendering=20of?= =?UTF-8?q?=20"StringListInput"=20and=20"StringListOutput"=20components?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/inputs/StringListInput.py | 13 ++++++++++ .../components/outputs/KeyPairOutput.py | 19 ++++++++++++++ .../components/outputs/StringListOutput.py | 13 ++++++++++ src/frontend/src/constants/constants.ts | 3 +++ .../components/keyPairInput/index.tsx | 22 +++++++++++++--- .../IOModal/components/IOFieldView/index.tsx | 25 +++++++++++++++++++ 6 files changed, 92 insertions(+), 3 deletions(-) create mode 100644 src/backend/base/langflow/components/inputs/StringListInput.py create mode 100644 src/backend/base/langflow/components/outputs/KeyPairOutput.py create mode 100644 src/backend/base/langflow/components/outputs/StringListOutput.py diff --git a/src/backend/base/langflow/components/inputs/StringListInput.py b/src/backend/base/langflow/components/inputs/StringListInput.py new file mode 100644 index 000000000..1fef86be1 --- /dev/null +++ b/src/backend/base/langflow/components/inputs/StringListInput.py @@ -0,0 +1,13 @@ +# from langflow.field_typing import Data +from langflow.schema import Record +from langflow.interface.custom.custom_component import CustomComponent + + +class StringListInput(CustomComponent): + display_name = "String List Input" + + def build_config(self): + return {"param": {"display_name": "String List Input", "field_type": "str", "list": True}} + + def build(self, param: list) -> Record: + return Record(data=param) diff --git a/src/backend/base/langflow/components/outputs/KeyPairOutput.py b/src/backend/base/langflow/components/outputs/KeyPairOutput.py new file mode 100644 index 000000000..f2204bb83 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/KeyPairOutput.py @@ -0,0 +1,19 @@ +from langflow.base.io.text import TextComponent +from langflow.field_typing.constants import Data + + +class KeyPairOutput(TextComponent): + display_name = "Dictionary Output" + description = "Dictionary Output." + + def build_config(self): + return { + "input_value": { + "display_name": "Dictionaries", + "field_type": "dict", + "list": True + } + } + + def build(self, input_value: dict) -> dict: + return input_value diff --git a/src/backend/base/langflow/components/outputs/StringListOutput.py b/src/backend/base/langflow/components/outputs/StringListOutput.py new file mode 100644 index 000000000..9e5384986 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/StringListOutput.py @@ -0,0 +1,13 @@ +# from langflow.field_typing import Data +from langflow.schema import Record +from langflow.interface.custom.custom_component import CustomComponent + + +class StringListOutput(CustomComponent): + display_name = "String List Output" + + def build_config(self): + return {"param": {"display_name": "String List Output", "field_type": "str", "list": True}} + + def build(self, param: list) -> Record: + return Record(data=param) diff --git a/src/frontend/src/constants/constants.ts b/src/frontend/src/constants/constants.ts index f8d45da02..6893d0d03 100644 --- a/src/frontend/src/constants/constants.ts +++ b/src/frontend/src/constants/constants.ts @@ -716,6 +716,7 @@ export const INPUT_TYPES = new Set([ "TextInput", "KeyPairInput", "JsonInput", + "StringListInput", ]); export const OUTPUT_TYPES = new Set([ "ChatOutput", @@ -724,6 +725,8 @@ export const OUTPUT_TYPES = new Set([ "ImageOutput", "CSVOutput", "JsonOutput", + "KeyPairOutput", + "StringListOutput", ]); export const CHAT_FIRST_INITIAL_TEXT = diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx index b0b557c55..2e95e78ef 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx @@ -4,7 +4,21 @@ import IconComponent from "../../../../../../components/genericIconComponent"; import { Input } from "../../../../../../components/ui/input"; import { classNames } from "../../../../../../utils/utils"; -const IOKeyPairInput = ({ value, onChange, duplicateKey, isList = true }) => { +export type IOKeyPairInputProps = { + value: any; + onChange: (value: any) => void; + duplicateKey: boolean; + isList: boolean; + isInputField?: boolean; +}; + +const IOKeyPairInput = ({ + value, + onChange, + duplicateKey, + isList = true, + isInputField, +}: IOKeyPairInputProps) => { const checkValueType = (value) => { return Array.isArray(value) ? value : [value]; }; @@ -39,6 +53,7 @@ const IOKeyPairInput = ({ value, onChange, duplicateKey, isList = true }) => { className={classNames(duplicateKey ? "input-invalid" : "")} placeholder="Type key..." onChange={(event) => handleChangeKey(event, index)} + disabled={!isInputField} /> { onChange={(event) => handleChangeValue(event.target.value, index) } + disabled={!isInputField} /> - {isList && index === ref.current.length - 1 ? ( + {isList && isInputField && index === ref.current.length - 1 ? ( - ) : isList ? ( + ) : isList && isInputField ? (