From 71a9051727030f420b8b4feb50b75096a68657eb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 13:34:27 -0300 Subject: [PATCH 01/14] Add default_fields attribute to VariableRead model and update create_variable method in VariableService --- .../services/database/models/variable/model.py | 1 + .../base/langflow/services/variable/service.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) 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 cf2236fe1..5c56f5b6d 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -52,6 +52,7 @@ class VariableRead(SQLModel): id: UUID name: Optional[str] = Field(None, description="Name of the variable") type: Optional[str] = Field(None, description="Type of the variable") + default_fields: Optional[List[str]] = Field(None, description="Default fields for the variable") class VariableUpdate(SQLModel): diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index ef23a95a2..ea5126d79 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -30,7 +30,14 @@ class VariableService(Service): if var in os.environ: logger.debug(f"Creating {var} variable from environment.") try: - self.create_variable(user_id, var, os.environ[var], _type="Credential", session=session) + self.create_variable( + user_id=user_id, + name=var, + value=os.environ[var], + default_fields=[], + _type="Credential", + session=session, + ) except Exception as e: logger.error(f"Error creating {var} variable: {e}") @@ -91,6 +98,7 @@ class VariableService(Service): user_id: Union[UUID, str], name: str, value: str, + default_fields: list[str] = [], _type: str = "Generic", session: Session = Depends(get_session), ): @@ -98,6 +106,7 @@ class VariableService(Service): name=name, type=_type, value=auth_utils.encrypt_api_key(value, settings_service=self.settings_service), + default_fields=default_fields, ) variable = Variable.model_validate(variable_base, from_attributes=True, update={"user_id": user_id}) session.add(variable) From 17403d817297a3fffddbba115e3b64aa6807c502 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 13:34:44 -0300 Subject: [PATCH 02/14] Refactored GlobalVariablesStore to include a value property in globalVariables object --- .../types/zustand/globalVariables/index.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 0fc9bb473..45fda27cd 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -1,10 +1,23 @@ export type GlobalVariablesStore = { globalVariablesEntries: Array; - globalVariables: { [name: string]: { id: string; type?: string, default_fields?: string[] } }; + globalVariables: { + [name: string]: { + id: string; + type?: string; + default_fields?: string[]; + value?: string; + }; + }; setGlobalVariables: (variables: { - [name: string]: { id: string; type?: string, default_fields?: string[]}; + [name: string]: { id: string; type?: string; default_fields?: string[],value?: string }; }) => void; - addGlobalVariable: (name: string, id: string, type?: string, default_fields?: string[]) => void; + addGlobalVariable: ( + name: string, + id: string, + type?: string, + default_fields?: string[], + value?: string + ) => void; removeGlobalVariable: (name: string) => Promise; getVariableId: (name: string) => string | undefined; unavaliableFields: Set; From 15de984bb66921790cb95b21666b52e4b9b383c6 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 13:59:55 -0300 Subject: [PATCH 03/14] Refactor GlobalVariablesPage component to include default_fields in rowData --- src/frontend/src/controllers/API/index.ts | 3 ++- .../pages/GlobalVariablesPage/index.tsx | 25 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8c5cc6892..8770f1b5e 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -860,13 +860,14 @@ export async function requestLogout() { } export async function getGlobalVariables(): Promise<{ - [key: string]: { id: string; type: 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 }; }); return globalVariables; diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index d0d786985..cc65efcdb 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -33,18 +33,25 @@ 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; default_fields:string | undefined }[]>(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; name: string}> = []; + const rows:Array<{type: string | undefined; id: string; + name: string;default_fields:string | undefined}> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; + console.log(globalVariableObj); rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, + default_fields: (globalVariableObj.default_fields??[]).join(", "), name: e, }); }); + console.log(rows); setRowData(rows); }, [globalVariables]); @@ -75,15 +82,15 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - { - field: "value", - cellEditor: "agLargeTextCellEditor", - flex: 2, - editable: false, - }, + // { + // field: "value", + // cellEditor: "agLargeTextCellEditor", + // flex: 2, + // editable: false, + // }, { headerName: "Apply To Fields", - field: "defaultFields", + field: "default_fields", flex: 1, editable: false, }, From df6924c73e55809f1d122a99aafb0fb614b1545b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:20:38 -0300 Subject: [PATCH 04/14] 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 05/14] 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 06/14] 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 07/14] 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 08/14] 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 09/14] 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 10/14] 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 11/14] 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 12/14] 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 354a7b5985a307af7bae19d1cf23f1fc7b8f541f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:46:28 -0300 Subject: [PATCH 13/14] 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 14/14] 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"];