diff --git a/src/backend/base/langflow/base/constants.py b/src/backend/base/langflow/base/constants.py index 8c3f52845..319899847 100644 --- a/src/backend/base/langflow/base/constants.py +++ b/src/backend/base/langflow/base/constants.py @@ -20,6 +20,7 @@ FIELD_FORMAT_ATTRIBUTES = [ "required", "list", "multiline", + "combobox", "fileTypes", "password", "input_types", diff --git a/src/backend/base/langflow/inputs/input_mixin.py b/src/backend/base/langflow/inputs/input_mixin.py index 7092b4dee..9b9c49db6 100644 --- a/src/backend/base/langflow/inputs/input_mixin.py +++ b/src/backend/base/langflow/inputs/input_mixin.py @@ -141,6 +141,11 @@ class MultilineMixin(BaseModel): multiline: CoalesceBool = True +class ComboboxMixin(BaseModel): + combobox: CoalesceBool = False + """Variable that defines if the user can insert custom values in the dropdown.""" + + class TableMixin(BaseModel): table_schema: Optional[TableSchema | list[Column]] = None diff --git a/src/backend/base/langflow/inputs/inputs.py b/src/backend/base/langflow/inputs/inputs.py index 8ba5d3624..bd81fc3c4 100644 --- a/src/backend/base/langflow/inputs/inputs.py +++ b/src/backend/base/langflow/inputs/inputs.py @@ -11,6 +11,7 @@ from .input_mixin import ( BaseInputMixin, DatabaseLoadMixin, DropDownMixin, + ComboboxMixin, FieldTypes, FileMixin, InputTraceMixin, @@ -292,7 +293,7 @@ class DictInput(BaseInputMixin, ListableInputMixin, InputTraceMixin): value: Optional[dict] = {} -class DropdownInput(BaseInputMixin, DropDownMixin, MetadataTraceMixin): +class DropdownInput(BaseInputMixin, DropDownMixin, MetadataTraceMixin, ComboboxMixin): """ Represents a dropdown input field. @@ -307,6 +308,7 @@ class DropdownInput(BaseInputMixin, DropDownMixin, MetadataTraceMixin): field_type: Optional[SerializableFieldTypes] = FieldTypes.TEXT options: list[str] = Field(default_factory=list) + combobox: CoalesceBool = False class MultiselectInput(BaseInputMixin, ListableInputMixin, DropDownMixin, MetadataTraceMixin): diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index f67a627eb..b9991e274 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -25,7 +25,7 @@ export default function Dropdown({ isLoading, value, options, - combobox = true, + combobox, onSelect, editNode = false, id = "", diff --git a/src/frontend/src/components/parameterRenderComponent/component/strRenderComponent/index.tsx b/src/frontend/src/components/parameterRenderComponent/component/strRenderComponent/index.tsx index cc9d1ce64..1c8dad612 100644 --- a/src/frontend/src/components/parameterRenderComponent/component/strRenderComponent/index.tsx +++ b/src/frontend/src/components/parameterRenderComponent/component/strRenderComponent/index.tsx @@ -1,3 +1,5 @@ +import { handleOnNewValueType } from "@/CustomNodes/hooks/use-handle-new-value"; +import { InputFieldType } from "@/types/api"; import Dropdown from "../../../dropdownComponent"; import InputGlobalComponent from "../../../inputGlobalComponent"; import InputListComponent from "../../../inputListComponent"; @@ -12,6 +14,14 @@ export function StrRenderComponent({ handleOnNewValue, editNode, id, +}: { + templateData: Partial; + value: any; + name: string; + disabled: boolean; + handleOnNewValue: handleOnNewValueType; + editNode: boolean; + id: string; }) { const onChange = (value: any, dbValue?: boolean, skipSnapshot?: boolean) => { handleOnNewValue({ value, load_from_db: dbValue }, { skipSnapshot }); @@ -65,6 +75,7 @@ export function StrRenderComponent({ editNode={editNode} options={templateData.options} onSelect={onChange} + combobox={templateData.combobox} value={value ?? "Choose an option"} id={`dropdown_${id}`} /> diff --git a/src/frontend/src/types/api/index.ts b/src/frontend/src/types/api/index.ts index a14277ce7..d317e0922 100644 --- a/src/frontend/src/types/api/index.ts +++ b/src/frontend/src/types/api/index.ts @@ -74,6 +74,7 @@ export type InputFieldType = { real_time_refresh?: boolean; refresh_button?: boolean; refresh_button_text?: string; + combobox?: boolean; [key: string]: any; }; diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index a4caee44b..29eaeb5ba 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -97,7 +97,7 @@ export type InputGlobalComponentType = { disabled: boolean; onChange: (value: string, dbValue: boolean, snapshot?: boolean) => void; name: string; - data: InputFieldType; + data: Partial; editNode?: boolean; playgroundDisabled?: boolean; };