From df6924c73e55809f1d122a99aafb0fb614b1545b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:20:38 -0300 Subject: [PATCH 01/15] Refactor GlobalVariablesPage component to include default_fields in rowData --- src/frontend/src/App.tsx | 4 +++- .../addNewVariableButton.tsx | 11 +++++++++-- src/frontend/src/utils/utils.ts | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 6c5af17df..d0a74982c 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -22,7 +22,7 @@ import useFlowsManagerStore from "./stores/flowsManagerStore"; import { useGlobalVariablesStore } from "./stores/globalVariables"; import { useStoreStore } from "./stores/storeStore"; import { useTypesStore } from "./stores/typesStore"; - +import { getUnavailableFields } from "./utils/utils"; export default function App() { const removeFromTempNotificationList = useAlertStore( (state) => state.removeFromTempNotificationList @@ -48,6 +48,7 @@ export default function App() { const setGlobalVariables = useGlobalVariablesStore( (state) => state.setGlobalVariables ); + const setUnavailableFields = useGlobalVariablesStore((state) => state.setUnavaliableFields); const checkHasStore = useStoreStore((state) => state.checkHasStore); const navigate = useNavigate(); const dark = useDarkStore((state) => state.dark); @@ -95,6 +96,7 @@ export default function App() { refreshFlows(); const res = await getGlobalVariables(); setGlobalVariables(res); + setUnavailableFields(getUnavailableFields(res)); checkHasStore(); fetchApiData(); } catch (error) { diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index aae36775d..b5a3dde26 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -22,9 +22,15 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); + const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); + const availableFields = Array.from(componentFields).filter((field) => !unavaliableFields.has(field)); const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); + console.log(componentFields); + console.log(unavaliableFields); + console.log(availableFields); + function handleSaveVariable() { let data: { name: string; value: string; type?: string; default_fields?: string[] } = { name: key, @@ -39,6 +45,7 @@ export default function AddNewVariableButton({ children }): JSX.Element { setKey(""); setValue(""); setType(""); + setFields([]); setOpen(false); }) .catch((error) => { @@ -98,8 +105,8 @@ export default function AddNewVariableButton({ children }): JSX.Element { setSelectedOptions={(value) => setFields(value)} selectedOptions={fields} password={false} - options={Array.from(componentFields)} - placeholder="Choose a type for the variable..." + options={availableFields} + placeholder="Choose a field for the variable..." > diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index afcc264f6..43c8549eb 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -91,6 +91,21 @@ export function toTitleCase( .join(" "); } +export function getUnavailableFields( + variables:{[key: string]: { id: string; type: string,default_fields:string[] }} +): Set { + console.log(variables) + const set = new Set(); + Object.keys(variables).forEach((key) => { + if(variables[key].default_fields){ + variables[key].default_fields.forEach((field) => { + set.add(field); + }); + } + }); + return set; +} + export const upperCaseWords: string[] = ["llm", "uri"]; export function checkUpperWords(str: string): string { const words = str.split(" ").map((word) => { From ca1bb8dd36140f615533b61309cef4c34f653546 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:21:51 -0300 Subject: [PATCH 02/15] remove console.logs --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 3 --- .../src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx | 2 -- src/frontend/src/utils/reactflowUtils.ts | 1 - src/frontend/src/utils/utils.ts | 1 - 4 files changed, 7 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index b5a3dde26..a0da18db9 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -27,9 +27,6 @@ export default function AddNewVariableButton({ children }): JSX.Element { const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); - console.log(componentFields); - console.log(unavaliableFields); - console.log(availableFields); function handleSaveVariable() { let data: { name: string; value: string; type?: string; default_fields?: string[] } = { diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index cc65efcdb..802663924 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -43,7 +43,6 @@ export default function GlobalVariablesPage() { name: string;default_fields:string | undefined}> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; - console.log(globalVariableObj); rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, @@ -51,7 +50,6 @@ export default function GlobalVariablesPage() { name: e, }); }); - console.log(rows); setRowData(rows); }, [globalVariables]); diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index ad1244495..df56e0711 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1244,7 +1244,6 @@ export function extractFieldsFromComponenents(data:APIObjectType ) { }); }); }); - console.log(fields); return fields; } diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 43c8549eb..53c61ee77 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -94,7 +94,6 @@ export function toTitleCase( export function getUnavailableFields( variables:{[key: string]: { id: string; type: string,default_fields:string[] }} ): Set { - console.log(variables) const set = new Set(); Object.keys(variables).forEach((key) => { if(variables[key].default_fields){ From 242bd55a24ef6b33af442f94a16b3a4233ebdba1 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:26:15 -0300 Subject: [PATCH 03/15] Update AddNewVariableButton component to set default type value --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index a0da18db9..abacdb6a8 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -17,7 +17,7 @@ import { useTypesStore } from "../../stores/typesStore"; export default function AddNewVariableButton({ children }): JSX.Element { const [key, setKey] = useState(""); const [value, setValue] = useState(""); - const [type, setType] = useState(""); + const [type, setType] = useState("Generic"); const [fields, setFields] = useState([]); const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); From 90f1efb18b8f7b2ac88d79f78aab083c7c347e6d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:34:54 -0300 Subject: [PATCH 04/15] Refactor Alembic migration scripts and Variable model --- .../1f4d6df60295_add_default_fields_column.py | 2 - ...d85f_set_name_and_value_to_not_nullable.py | 52 +++++++++++++++++++ .../database/models/variable/model.py | 4 +- 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py diff --git a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py index 7b69058c2..7cf2fd083 100644 --- a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +++ b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py @@ -22,7 +22,6 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: @@ -35,7 +34,6 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py new file mode 100644 index 000000000..26cf872ab --- /dev/null +++ b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py @@ -0,0 +1,52 @@ +"""Set name and value to not nullable + +Revision ID: c153816fd85f +Revises: 1f4d6df60295 +Create Date: 2024-04-30 14:31:23.898995 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision: str = "c153816fd85f" +down_revision: Union[str, None] = "1f4d6df60295" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + # ### commands auto generated by Alembic - please adjust! ### + columns = inspector.get_columns("variable") + with op.batch_alter_table("variable", schema=None) as batch_op: + name_column = [column for column in columns if column["name"] == "name"][0] + if name_column and name_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) + value_column = [column for column in columns if column["name"] == "value"][0] + if value_column and value_column[0]["nullable"]: + batch_op.alter_column("value", existing_type=sa.VARCHAR(), nullable=False) + + +# ### end Alembic commands ### + + +def downgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + columns = inspector.get_columns("variable") + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("variable", schema=None) as batch_op: + name_column = [column for column in columns if column["name"] == "name"][0] + if name_column and not name_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) + value_column = [column for column in columns if column["name"] == "value"][0] + if value_column and not value_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) + + # ### end Alembic commands ### diff --git a/src/backend/base/langflow/services/database/models/variable/model.py b/src/backend/base/langflow/services/database/models/variable/model.py index 5c56f5b6d..bf61c25dc 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -13,8 +13,8 @@ def utc_now(): class VariableBase(SQLModel): - name: Optional[str] = Field(None, description="Name of the variable") - value: Optional[str] = Field(None, description="Encrypted value of the variable") + name: str = Field(description="Name of the variable") + value: str = Field(description="Encrypted value of the variable") default_fields: Optional[List[str]] = Field(sa_column=Column(JSON)) type: Optional[str] = Field(None, description="Type of the variable") From 027cfe81fc5745c4ab209e43f88a4fe416118bc7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:35:09 -0300 Subject: [PATCH 05/15] format --- src/backend/base/langflow/components/models/AzureOpenAIModel.py | 1 - src/backend/base/langflow/components/models/ChatLiteLLMModel.py | 2 +- src/backend/base/langflow/schema/schema.py | 2 +- src/backend/base/langflow/services/database/service.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/base/langflow/components/models/AzureOpenAIModel.py b/src/backend/base/langflow/components/models/AzureOpenAIModel.py index b6d3607f3..a2ee20b28 100644 --- a/src/backend/base/langflow/components/models/AzureOpenAIModel.py +++ b/src/backend/base/langflow/components/models/AzureOpenAIModel.py @@ -1,6 +1,5 @@ from typing import Optional -from langchain.llms.base import BaseLanguageModel from langchain_openai import AzureChatOpenAI from pydantic.v1 import SecretStr diff --git a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py index 23ac483cb..95574f0a5 100644 --- a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py +++ b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py @@ -4,7 +4,7 @@ from langchain_community.chat_models.litellm import ChatLiteLLM, ChatLiteLLMExce from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langflow.field_typing import BaseLanguageModel, Text +from langflow.field_typing import Text class ChatLiteLLMModelComponent(LCModelComponent): diff --git a/src/backend/base/langflow/schema/schema.py b/src/backend/base/langflow/schema/schema.py index 979c78920..5d2967dac 100644 --- a/src/backend/base/langflow/schema/schema.py +++ b/src/backend/base/langflow/schema/schema.py @@ -4,7 +4,7 @@ from typing import Literal, Optional from langchain_core.documents import Document from langchain_core.messages import BaseMessage from pydantic import BaseModel, model_validator -from langchain_core.messages import HumanMessage, AIMessage, BaseMessage +from langchain_core.messages import HumanMessage, AIMessage class Record(BaseModel): diff --git a/src/backend/base/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py index 5ca20c642..ee2812d32 100644 --- a/src/backend/base/langflow/services/database/service.py +++ b/src/backend/base/langflow/services/database/service.py @@ -133,7 +133,7 @@ class DatabaseService(Service): alembic_cfg = Config(stdout=buffer) # alembic_cfg.attributes["connection"] = session alembic_cfg.set_main_option("script_location", str(self.script_location)) - alembic_cfg.set_main_option("sqlalchemy.url", self.database_url.replace('%', '%%')) + alembic_cfg.set_main_option("sqlalchemy.url", self.database_url.replace("%", "%%")) should_initialize_alembic = False with Session(self.engine) as session: From 56342f4489c33ddd4a989eb7255fc4549dee13ce Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:35:28 -0300 Subject: [PATCH 06/15] Refactor globalVariables.ts to include unavaliableFields in useGlobalVariablesStore --- src/frontend/src/App.tsx | 1 - src/frontend/src/stores/globalVariables.ts | 4 ++++ src/frontend/src/utils/utils.ts | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index d0a74982c..1f3f76ac2 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -96,7 +96,6 @@ export default function App() { refreshFlows(); const res = await getGlobalVariables(); setGlobalVariables(res); - setUnavailableFields(getUnavailableFields(res)); checkHasStore(); fetchApiData(); } catch (error) { diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 5a2a67fa4..7d3113ff0 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,7 @@ import { create } from "zustand"; import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { deleteGlobalVariable } from "../controllers/API"; +import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( (set, get) => ({ @@ -20,6 +21,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: variables, globalVariablesEntries: Object.keys(variables), + unavaliableFields: getUnavailableFields(variables) }); }, addGlobalVariable: (name, id, type, default_fields) => { @@ -28,6 +30,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), + unavaliableFields: getUnavailableFields(newVariables) }); }, removeGlobalVariable:async (name) => { @@ -39,6 +42,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), + unavaliableFields: getUnavailableFields(newVariables) }); }, getVariableId: (name) => { diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 53c61ee77..87aa5e376 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -92,12 +92,12 @@ export function toTitleCase( } export function getUnavailableFields( - variables:{[key: string]: { id: string; type: string,default_fields:string[] }} + variables:{[key: string]: { default_fields?:string[] }} ): Set { const set = new Set(); Object.keys(variables).forEach((key) => { if(variables[key].default_fields){ - variables[key].default_fields.forEach((field) => { + variables[key].default_fields!.forEach((field) => { set.add(field); }); } From 854afe02acb989b135155000dd9624c2ef82f538 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:37:12 -0300 Subject: [PATCH 07/15] code format --- src/frontend/src/App.tsx | 5 ++-- .../addNewVariableButton.tsx | 19 +++++++++++---- .../components/dropdownComponent/index.tsx | 10 ++++++-- .../components/inputGlobalComponent/index.tsx | 4 ++-- src/frontend/src/controllers/API/index.ts | 8 +++---- src/frontend/src/pages/SettingsPage/index.tsx | 20 ++++++++-------- .../pages/GlobalVariablesPage/index.tsx | 23 +++++++++++++------ .../pages/ShortcutsPage/index.tsx | 4 +--- src/frontend/src/routes.tsx | 1 - src/frontend/src/stores/flowsManagerStore.ts | 20 ++++++++++++---- src/frontend/src/stores/globalVariables.ts | 12 +++++----- src/frontend/src/stores/typesStore.ts | 13 ++++++++--- .../types/zustand/globalVariables/index.ts | 7 +++++- src/frontend/src/utils/reactflowUtils.ts | 9 +++++--- src/frontend/src/utils/utils.ts | 8 +++---- 15 files changed, 106 insertions(+), 57 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 1f3f76ac2..396906e91 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -22,7 +22,6 @@ import useFlowsManagerStore from "./stores/flowsManagerStore"; import { useGlobalVariablesStore } from "./stores/globalVariables"; import { useStoreStore } from "./stores/storeStore"; import { useTypesStore } from "./stores/typesStore"; -import { getUnavailableFields } from "./utils/utils"; export default function App() { const removeFromTempNotificationList = useAlertStore( (state) => state.removeFromTempNotificationList @@ -48,7 +47,9 @@ export default function App() { const setGlobalVariables = useGlobalVariablesStore( (state) => state.setGlobalVariables ); - const setUnavailableFields = useGlobalVariablesStore((state) => state.setUnavaliableFields); + const setUnavailableFields = useGlobalVariablesStore( + (state) => state.setUnavaliableFields + ); const checkHasStore = useStoreStore((state) => state.checkHasStore); const navigate = useNavigate(); const dark = useDarkStore((state) => state.dark); diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index abacdb6a8..d1e6c7ffa 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -3,6 +3,7 @@ import { registerGlobalVariable } from "../../controllers/API"; import BaseModal from "../../modals/baseModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; +import { useTypesStore } from "../../stores/typesStore"; import { ResponseErrorDetailAPI } from "../../types/api"; import ForwardedIconComponent from "../genericIconComponent"; import InputComponent from "../inputComponent"; @@ -10,7 +11,6 @@ import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; -import { useTypesStore } from "../../stores/typesStore"; //TODO IMPLEMENT FORM LOGIC @@ -22,18 +22,27 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); - const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); - const availableFields = Array.from(componentFields).filter((field) => !unavaliableFields.has(field)); + const unavaliableFields = useGlobalVariablesStore( + (state) => state.unavaliableFields + ); + const availableFields = Array.from(componentFields).filter( + (field) => !unavaliableFields.has(field) + ); const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); function handleSaveVariable() { - let data: { name: string; value: string; type?: string; default_fields?: string[] } = { + let data: { + name: string; + value: string; + type?: string; + default_fields?: string[]; + } = { name: key, type, value, - default_fields: fields + default_fields: fields, }; registerGlobalVariable(data) .then((res) => { diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index c3407aba8..b17332268 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -33,7 +33,9 @@ export default function Dropdown({ const refButton = useRef(null); - const PopoverContentDropdown = children ? PopoverContent : PopoverContentWithoutPortal; + const PopoverContentDropdown = children + ? PopoverContent + : PopoverContentWithoutPortal; return ( <> @@ -77,7 +79,11 @@ export default function Dropdown({ )} diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index b2052ab84..0d1b0ea40 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -1,5 +1,4 @@ import { useEffect } from "react"; -import { deleteGlobalVariable } from "../../controllers/API"; import DeleteConfirmationModal from "../../modals/DeleteConfirmationModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; @@ -43,7 +42,8 @@ export default function InputGlobalComponent({ function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { - removeGlobalVariable(key).then((_) => { + removeGlobalVariable(key) + .then((_) => { if ( data?.node?.template[name].value === key && data?.node?.template[name].load_from_db diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8770f1b5e..36c1d0fed 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -860,14 +860,14 @@ export async function requestLogout() { } export async function getGlobalVariables(): Promise<{ - [key: string]: { id: string; type: string,default_fields:string[] }; + [key: string]: { id: string; type: string; default_fields: string[] }; }> { const globalVariables = {}; (await api.get(`${BASE_URL_API}variables/`)).data.forEach((element) => { globalVariables[element.name] = { id: element.id, type: element.type, - default_fields:element.default_fields + default_fields: element.default_fields, }; }); return globalVariables; @@ -877,7 +877,7 @@ export async function registerGlobalVariable({ name, value, type, - default_fields=[], + default_fields = [], }: { name: string; value: string; @@ -888,7 +888,7 @@ export async function registerGlobalVariable({ name, value, type, - default_fields:default_fields + default_fields: default_fields, }); } diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx index 86d47cd34..554be79b6 100644 --- a/src/frontend/src/pages/SettingsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -16,16 +16,16 @@ export default function SettingsPage(): JSX.Element { const sidebarNavItems = [ { - title: "General", - href: "/settings/general", - icon: ( - - ), - }, - /* { + title: "General", + href: "/settings/general", + icon: ( + + ), + }, + /* { title: "Theme", href: "/settings/theme", icon: ( diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 802663924..266712881 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -34,19 +34,29 @@ export default function GlobalVariablesPage() { ); }; - - const [rowData, setRowData] = useState<{ type: string | undefined; - id: string; name: string; default_fields:string | undefined }[]>(); + const [rowData, setRowData] = + useState< + { + type: string | undefined; + id: string; + name: string; + default_fields: string | undefined; + }[] + >(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; - name: string;default_fields:string | undefined}> = []; + const rows: Array<{ + type: string | undefined; + id: string; + name: string; + default_fields: string | undefined; + }> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, - default_fields: (globalVariableObj.default_fields??[]).join(", "), + default_fields: (globalVariableObj.default_fields ?? []).join(", "), name: e, }); }); @@ -92,7 +102,6 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - ]); const [selectedRows, setSelectedRows] = useState([]); diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index 1dac8d095..adcfcefef 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -124,9 +124,7 @@ export default function ShortcutsPage() { Flow - - Shortcuts relating to the flow. - + Shortcuts relating to the flow. ((set, get) => ({ ); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); set({ isLoading: false }); resolve(); @@ -199,7 +202,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); }, 200); // addFlowToLocalState(newFlow); @@ -222,7 +228,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); // Return the id @@ -252,7 +261,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); resolve(); }); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 7d3113ff0..d67da5079 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; -import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { deleteGlobalVariable } from "../controllers/API"; +import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( @@ -21,7 +21,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: variables, globalVariablesEntries: Object.keys(variables), - unavaliableFields: getUnavailableFields(variables) + unavaliableFields: getUnavailableFields(variables), }); }, addGlobalVariable: (name, id, type, default_fields) => { @@ -30,19 +30,19 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), - unavaliableFields: getUnavailableFields(newVariables) + unavaliableFields: getUnavailableFields(newVariables), }); }, - removeGlobalVariable:async (name) => { + removeGlobalVariable: async (name) => { const id = get().globalVariables[name]?.id; if (id === undefined) return; - await deleteGlobalVariable(id) + await deleteGlobalVariable(id); const newVariables = { ...get().globalVariables }; delete newVariables[name]; set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), - unavaliableFields: getUnavailableFields(newVariables) + unavaliableFields: getUnavailableFields(newVariables), }); }, getVariableId: (name) => { diff --git a/src/frontend/src/stores/typesStore.ts b/src/frontend/src/stores/typesStore.ts index f2539a8d3..c92236e03 100644 --- a/src/frontend/src/stores/typesStore.ts +++ b/src/frontend/src/stores/typesStore.ts @@ -2,7 +2,11 @@ import { create } from "zustand"; import { getAll } from "../controllers/API"; import { APIDataType } from "../types/api"; import { TypesStoreType } from "../types/zustand/types"; -import { extractFieldsFromComponenents, templatesGenerator, typesGenerator } from "../utils/reactflowUtils"; +import { + extractFieldsFromComponenents, + templatesGenerator, + typesGenerator, +} from "../utils/reactflowUtils"; import useAlertStore from "./alertStore"; import useFlowsManagerStore from "./flowsManagerStore"; @@ -28,7 +32,10 @@ export const useTypesStore = create((set, get) => ({ set((old) => ({ types: typesGenerator(data), data: { ...old.data, ...data }, - ComponentFields: extractFieldsFromComponenents({ ...old.data, ...data }), + ComponentFields: extractFieldsFromComponenents({ + ...old.data, + ...data, + }), templates: templatesGenerator(data), })); setLoading(false); @@ -50,7 +57,7 @@ export const useTypesStore = create((set, get) => ({ }, setData: (change: APIDataType | ((old: APIDataType) => APIDataType)) => { let newChange = typeof change === "function" ? change(get().data) : change; - set({ data: newChange}); + set({ data: newChange }); get().setComponentFields(extractFieldsFromComponenents(newChange)); }, })); diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 45fda27cd..b69952993 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -9,7 +9,12 @@ export type GlobalVariablesStore = { }; }; setGlobalVariables: (variables: { - [name: string]: { id: string; type?: string; default_fields?: string[],value?: string }; + [name: string]: { + id: string; + type?: string; + default_fields?: string[]; + value?: string; + }; }) => void; addGlobalVariable: ( name: string, diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index df56e0711..deb470f80 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1234,13 +1234,16 @@ export function templatesGenerator(data: APIObjectType) { }, {}); } -export function extractFieldsFromComponenents(data:APIObjectType ) { +export function extractFieldsFromComponenents(data: APIObjectType) { const fields = new Set(); Object.keys(data).forEach((key) => { Object.keys(data[key]).forEach((kind) => { Object.keys(data[key][kind].template).forEach((field) => { - if(data[key][kind].template[field].display_name && data[key][kind].template[field].show) - fields.add(data[key][kind].template[field].display_name!); + if ( + data[key][kind].template[field].display_name && + data[key][kind].template[field].show + ) + fields.add(data[key][kind].template[field].display_name!); }); }); }); diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 87aa5e376..3dafc3877 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -91,12 +91,12 @@ export function toTitleCase( .join(" "); } -export function getUnavailableFields( - variables:{[key: string]: { default_fields?:string[] }} -): Set { +export function getUnavailableFields(variables: { + [key: string]: { default_fields?: string[] }; +}): Set { const set = new Set(); Object.keys(variables).forEach((key) => { - if(variables[key].default_fields){ + if (variables[key].default_fields) { variables[key].default_fields!.forEach((field) => { set.add(field); }); From c56733f3a4338ec0a8802f6c1b63b7a817353a8c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:38:07 -0300 Subject: [PATCH 08/15] Add .prettierignore file and update package.json to include ignore path for Prettier --- src/frontend/.prettierignore | 1 + src/frontend/package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/frontend/.prettierignore diff --git a/src/frontend/.prettierignore b/src/frontend/.prettierignore new file mode 100644 index 000000000..07ed7069a --- /dev/null +++ b/src/frontend/.prettierignore @@ -0,0 +1 @@ +build/* \ No newline at end of file diff --git a/src/frontend/package.json b/src/frontend/package.json index 26dc911af..bc8dcc041 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -72,7 +72,7 @@ "start": "vite", "build": "vite build", "serve": "vite preview", - "format": "npx prettier --write \"./**/*.{js,jsx,ts,tsx,json,md}\"", + "format": "npx prettier --write \"./**/*.{js,jsx,ts,tsx,json,md}\" --ignore-path .prettierignore", "type-check": "tsc --noEmit --pretty --project tsconfig.json && vite" }, "eslintConfig": { From d4a516c2eb0a7cb53da6062469bffb58f8638b24 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:40:36 -0300 Subject: [PATCH 09/15] Refactor useGlobalVariablesStore to update unavaliableFields in globalVariables.ts --- src/frontend/src/stores/globalVariables.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index d67da5079..636745d00 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -13,7 +13,9 @@ export const useGlobalVariablesStore = create( set({ unavaliableFields: get().unavaliableFields.add(field) }); }, removeUnavaliableField: (field) => { - get().unavaliableFields.delete(field); + const newFields = get().unavaliableFields; + newFields.delete(field); + set({ unavaliableFields: newFields }); }, globalVariablesEntries: [], globalVariables: {}, From 40aa3052791f51e6bf844fa235cb4ffedb4f29da Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 30 Apr 2024 14:45:01 -0300 Subject: [PATCH 10/15] =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Remove=20un?= =?UTF-8?q?used=20import=20and=20update=20dependencies=20in=20InputGlobalC?= =?UTF-8?q?omponent=20=F0=9F=93=9D=20(index.tsx):=20Add=20async/await=20to?= =?UTF-8?q?=20handleDelete=20function=20in=20InputGlobalComponent=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20re?= =?UTF-8?q?gisterGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20de?= =?UTF-8?q?leteGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20up?= =?UTF-8?q?dateGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Remove=20unused=20import=20and=20?= =?UTF-8?q?add=20deleteGlobalVariable=20import=20in=20GlobalVariablesPage?= =?UTF-8?q?=20=F0=9F=93=9D=20(index.tsx):=20Add=20setErrorData=20and=20get?= =?UTF-8?q?VariableId=20hooks=20to=20GlobalVariablesPage=20=F0=9F=93=9D=20?= =?UTF-8?q?(index.tsx):=20Add=20async/await=20to=20removeVariables=20funct?= =?UTF-8?q?ion=20in=20GlobalVariablesPage=20=F0=9F=93=9D=20(globalVariable?= =?UTF-8?q?s.ts):=20Remove=20unused=20import=20in=20globalVariables=20stor?= =?UTF-8?q?e=20=F0=9F=93=9D=20(globalVariables.ts):=20Remove=20async/await?= =?UTF-8?q?=20from=20removeGlobalVariable=20function=20in=20globalVariable?= =?UTF-8?q?s=20store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/inputGlobalComponent/index.tsx | 12 +++--- src/frontend/src/controllers/API/index.ts | 43 ++++++++++++++----- .../pages/GlobalVariablesPage/index.tsx | 30 ++++++++++--- src/frontend/src/stores/globalVariables.ts | 5 +-- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index b2052ab84..f0f3f4cc3 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -3,7 +3,6 @@ import { deleteGlobalVariable } from "../../controllers/API"; import DeleteConfirmationModal from "../../modals/DeleteConfirmationModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; -import { ResponseErrorDetailAPI } from "../../types/api"; import { InputGlobalComponentType } from "../../types/components"; import { cn } from "../../utils/utils"; import AddNewVariableButton from "../addNewVariableButtonComponent/addNewVariableButton"; @@ -40,10 +39,12 @@ export default function InputGlobalComponent({ } }, [globalVariablesEntries]); - function handleDelete(key: string) { + async function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { - removeGlobalVariable(key).then((_) => { + await deleteGlobalVariable(id) + .then(() => { + removeGlobalVariable(key); if ( data?.node?.template[name].value === key && data?.node?.template[name].load_from_db @@ -52,11 +53,10 @@ export default function InputGlobalComponent({ setDb(false); } }) - .catch((error) => { - let responseError = error as ResponseErrorDetailAPI; + .catch(() => { setErrorData({ title: "Error deleting variable", - list: [responseError.response.data.detail ?? "Unknown error"], + list: [cn("ID not found for variable: ", key)], }); }); } else { diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8c5cc6892..3e9c1cc22 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -883,16 +883,29 @@ export async function registerGlobalVariable({ type?: string; default_fields?: string[]; }): Promise> { - return await api.post(`${BASE_URL_API}variables/`, { - name, - value, - type, - default_fields:default_fields - }); + try{ + const response = await api.post(`${BASE_URL_API}variables/`, { + name, + value, + type, + default_fields:default_fields + }); + return response; + } + catch(error){ + throw error; + } + } export async function deleteGlobalVariable(id: string) { - api.delete(`${BASE_URL_API}variables/${id}`); + try{ + const response = await api.delete(`${BASE_URL_API}variables/${id}`); + return response; + } + catch(error){ + throw error; + } } export async function updateGlobalVariable( @@ -900,10 +913,18 @@ export async function updateGlobalVariable( value: string, id: string ) { - api.patch(`${BASE_URL_API}variables/${id}`, { - name, - value, - }); + try{ + const response = api.patch(`${BASE_URL_API}variables/${id}`, { + name, + value, + }); + + return response; + } + catch(error){ + throw error; + } + } export async function getVerticesOrder( diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index d0d786985..e9e5bef18 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -8,6 +8,8 @@ import Dropdown from "../../../../components/dropdownComponent"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; +import { deleteGlobalVariable } from "../../../../controllers/API"; +import useAlertStore from "../../../../stores/alertStore"; import { useGlobalVariablesStore } from "../../../../stores/globalVariables"; import { cn } from "../../../../utils/utils"; @@ -21,6 +23,8 @@ export default function GlobalVariablesPage() { const globalVariables = useGlobalVariablesStore( (state) => state.globalVariables ); + const setErrorData = useAlertStore((state) => state.setErrorData); + const getVariableId = useGlobalVariablesStore((state) => state.getVariableId); const BadgeRenderer = (props) => { return props.value !== "" ? ( @@ -33,10 +37,12 @@ export default function GlobalVariablesPage() {
); }; - const [rowData, setRowData] = useState<{ type: string | undefined; id: string; name: string; }[]>(); + const [rowData, setRowData] = + useState<{ type: string | undefined; id: string; name: string }[]>(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; name: string}> = []; + const rows: Array<{ type: string | undefined; id: string; name: string }> = + []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; rows.push({ @@ -87,15 +93,27 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - ]); const [selectedRows, setSelectedRows] = useState([]); - function removeVariables() { - selectedRows.forEach((row) => { - removeGlobalVariable(row); + async function removeVariables() { + const deleteGlobalVariablesPromise = selectedRows.map(async (row) => { + const id = getVariableId(row); + const deleteGlobalVariables = deleteGlobalVariable(id!); + await deleteGlobalVariables; }); + Promise.all(deleteGlobalVariablesPromise) + .then(() => { + selectedRows.forEach((row) => { + removeGlobalVariable(row); + }); + }) + .catch(() => { + setErrorData({ + title: `Error deleting global variables.`, + }); + }); } return ( diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 5a2a67fa4..701b7700e 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,5 @@ import { create } from "zustand"; import { GlobalVariablesStore } from "../types/zustand/globalVariables"; -import { deleteGlobalVariable } from "../controllers/API"; export const useGlobalVariablesStore = create( (set, get) => ({ @@ -30,10 +29,10 @@ export const useGlobalVariablesStore = create( globalVariablesEntries: Object.keys(newVariables), }); }, - removeGlobalVariable:async (name) => { + removeGlobalVariable: async (name) => { const id = get().globalVariables[name]?.id; if (id === undefined) return; - await deleteGlobalVariable(id) + const newVariables = { ...get().globalVariables }; delete newVariables[name]; set({ From 354a7b5985a307af7bae19d1cf23f1fc7b8f541f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:46:28 -0300 Subject: [PATCH 11/15] Refactor Alembic migration scripts to set name and value columns as not nullable --- .../c153816fd85f_set_name_and_value_to_not_nullable.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py index 26cf872ab..cec3f6081 100644 --- a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +++ b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py @@ -26,10 +26,10 @@ def upgrade() -> None: columns = inspector.get_columns("variable") with op.batch_alter_table("variable", schema=None) as batch_op: name_column = [column for column in columns if column["name"] == "name"][0] - if name_column and name_column[0]["nullable"]: + if name_column and name_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) value_column = [column for column in columns if column["name"] == "value"][0] - if value_column and value_column[0]["nullable"]: + if value_column and value_column["nullable"]: batch_op.alter_column("value", existing_type=sa.VARCHAR(), nullable=False) @@ -43,10 +43,10 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("variable", schema=None) as batch_op: name_column = [column for column in columns if column["name"] == "name"][0] - if name_column and not name_column[0]["nullable"]: + if name_column and not name_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) value_column = [column for column in columns if column["name"] == "value"][0] - if value_column and not value_column[0]["nullable"]: + if value_column and not value_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) # ### end Alembic commands ### From ec490a78a80cb92e285926f4aa5d3dfa97d575db Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:56:51 -0300 Subject: [PATCH 12/15] update UnavaliableFields structure --- .../addNewVariableButton.tsx | 5 +++-- src/frontend/src/stores/globalVariables.ts | 7 ++----- src/frontend/src/types/zustand/globalVariables/index.ts | 5 ++--- src/frontend/src/utils/utils.ts | 8 ++++---- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index d1e6c7ffa..e5e8dd488 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -22,9 +22,10 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); - const unavaliableFields = useGlobalVariablesStore( + const unavaliableFields =new Set(Object.keys(useGlobalVariablesStore( (state) => state.unavaliableFields - ); + ))); + const availableFields = Array.from(componentFields).filter( (field) => !unavaliableFields.has(field) ); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 636745d00..a66bf1589 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -5,16 +5,13 @@ import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( (set, get) => ({ - unavaliableFields: new Set(), + unavaliableFields: {}, setUnavaliableFields: (fields) => { set({ unavaliableFields: fields }); }, - addUnavaliableField: (field) => { - set({ unavaliableFields: get().unavaliableFields.add(field) }); - }, removeUnavaliableField: (field) => { const newFields = get().unavaliableFields; - newFields.delete(field); + delete newFields[field]; set({ unavaliableFields: newFields }); }, globalVariablesEntries: [], diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index b69952993..752336c19 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -25,8 +25,7 @@ export type GlobalVariablesStore = { ) => void; removeGlobalVariable: (name: string) => Promise; getVariableId: (name: string) => string | undefined; - unavaliableFields: Set; - setUnavaliableFields: (fields: Set) => void; - addUnavaliableField: (field: string) => void; + unavaliableFields: {[name: string]: string}; + setUnavaliableFields: (fields: {[name: string]: string}) => void; removeUnavaliableField: (field: string) => void; }; diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 3dafc3877..1c580fa4b 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -93,16 +93,16 @@ export function toTitleCase( export function getUnavailableFields(variables: { [key: string]: { default_fields?: string[] }; -}): Set { - const set = new Set(); +}): {[name: string]: string} { + const unVariables:{[name: string]: string} = {}; Object.keys(variables).forEach((key) => { if (variables[key].default_fields) { variables[key].default_fields!.forEach((field) => { - set.add(field); + unVariables[field] = key; }); } }); - return set; + return unVariables; } export const upperCaseWords: string[] = ["llm", "uri"]; From 6261c71e01d64e521111e2524403c3ed6e2b3be3 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 15:11:26 -0300 Subject: [PATCH 13/15] Update InputGlobalComponent to handle unavaliableFields in useGlobalVariablesStore --- .../src/components/inputGlobalComponent/index.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 0d1b0ea40..6bd598778 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -23,6 +23,7 @@ export default function InputGlobalComponent({ ); const getVariableId = useGlobalVariablesStore((state) => state.getVariableId); + const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); const removeGlobalVariable = useGlobalVariablesStore( (state) => state.removeGlobalVariable ); @@ -39,6 +40,15 @@ export default function InputGlobalComponent({ } }, [globalVariablesEntries]); + useEffect(() => { + if (!data.node?.template[name].value && data.node?.template[name].display_name) { + if(unavaliableFields[data.node?.template[name].display_name!]){ + setDb(true); + onChange(unavaliableFields[data.node?.template[name].display_name!]); + } + } + },[unavaliableFields]); + function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { From 4bbba570fe28e9bac8e97506bd9c0017f88f9c79 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 15:18:36 -0300 Subject: [PATCH 14/15] Fix validation for empty variable name and value in create_variable function --- src/backend/base/langflow/api/v1/variable.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/api/v1/variable.py b/src/backend/base/langflow/api/v1/variable.py index b1cca14c1..f992c1429 100644 --- a/src/backend/base/langflow/api/v1/variable.py +++ b/src/backend/base/langflow/api/v1/variable.py @@ -37,7 +37,11 @@ def create_variable( variable_dict["user_id"] = current_user.id db_variable = Variable.model_validate(variable_dict) - if not db_variable.value: + if not db_variable.name and not db_variable.value: + raise HTTPException(status_code=400, detail="Variable name and value cannot be empty") + elif not db_variable.name: + raise HTTPException(status_code=400, detail="Variable name cannot be empty") + elif not db_variable.value: raise HTTPException(status_code=400, detail="Variable value cannot be empty") encrypted = auth_utils.encrypt_api_key(db_variable.value, settings_service=settings_service) db_variable.value = encrypted From e82d8f482677850a9e5cdf2f9067e7c9c6a6c64c Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 15:47:52 -0300 Subject: [PATCH 15/15] Update InputGlobalComponent to handle unavaliableFields in useGlobalVariablesStore --- src/frontend/src/components/inputGlobalComponent/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 6bd598778..c6feb8037 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -125,7 +125,8 @@ export default function InputGlobalComponent({ )} selectedOption={ - data?.node?.template[name].load_from_db ?? false + data?.node?.template[name].load_from_db && + globalVariablesEntries.includes(data?.node?.template[name].value??"") ? data?.node?.template[name].value : "" }