From ec0af06573e9296fa5df72bae0e5f13a0b87bbd1 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 23 Apr 2024 09:26:15 -0300 Subject: [PATCH 001/142] Add playground button to flow cards in MainPage (#1752) * Add playground button to flow cards in MainPage * Add IOModal component for playground functionality * Update playground button styling not working yet --- .../src/components/cardComponent/index.tsx | 3 ++ .../MainPage/components/components/index.tsx | 40 ++++++++++++++++--- 2 files changed, 37 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 2ec60e0a2..f9eef310e 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -25,11 +25,13 @@ export default function CollectionCardComponent({ disabled = false, button, onDelete, + playground }: { data: storeComponent; authorized?: boolean; disabled?: boolean; button?: JSX.Element; + playground?:JSX.Element; onDelete?: () => void; }) { const addFlow = useFlowsManagerStore((state) => state.addFlow); @@ -345,6 +347,7 @@ export default function CollectionCardComponent({ )} {button && button} + {playground && playground} diff --git a/src/frontend/src/pages/MainPage/components/components/index.tsx b/src/frontend/src/pages/MainPage/components/components/index.tsx index 65189fa8a..ba5879747 100644 --- a/src/frontend/src/pages/MainPage/components/components/index.tsx +++ b/src/frontend/src/pages/MainPage/components/components/index.tsx @@ -14,6 +14,7 @@ import { import useAlertStore from "../../../../stores/alertStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import { FlowType } from "../../../../types/flow"; +import IOModal from "../../../../modals/IOModal"; export default function ComponentsComponent({ is_component = true, @@ -21,6 +22,7 @@ export default function ComponentsComponent({ is_component?: boolean; }) { const addFlow = useFlowsManagerStore((state) => state.addFlow); + const setCurrentFlowId = useFlowsManagerStore((state) => state.setCurrentFlowId); const uploadFlow = useFlowsManagerStore((state) => state.uploadFlow); const removeFlow = useFlowsManagerStore((state) => state.removeFlow); const isLoading = useFlowsManagerStore((state) => state.isLoading); @@ -31,6 +33,7 @@ export default function ComponentsComponent({ const [pageSize, setPageSize] = useState(20); const [pageIndex, setPageIndex] = useState(1); const [loadingScreen, setLoadingScreen] = useState(true); + const [openPlayground, setOpenPlayground] = useState(false); const navigate = useNavigate(); @@ -75,9 +78,8 @@ export default function ComponentsComponent({ }) .then(() => { setSuccessData({ - title: `${ - is_component ? "Component" : "Flow" - } uploaded successfully`, + title: `${is_component ? "Component" : "Flow" + } uploaded successfully`, }); }) .catch((error) => { @@ -142,9 +144,8 @@ export default function ComponentsComponent({ onDelete={() => { removeFlow(item.id); setSuccessData({ - title: `${ - item.is_component ? "Component" : "Flow" - } deleted successfully!`, + title: `${item.is_component ? "Component" : "Flow" + } deleted successfully!`, }); resetFilter(); }} @@ -174,6 +175,33 @@ export default function ComponentsComponent({ <> ) } + playground={ + !is_component ? ( + + + + ) : ( + <> + ) + } /> )) ) : ( From bb6ad3939b6b06f505772ea091a48220a20b69a8 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 23 Apr 2024 16:48:00 -0300 Subject: [PATCH 002/142] first implementation, working but not stable --- .../src/components/cardComponent/index.tsx | 56 ++++++++++++++++--- src/frontend/src/modals/IOModal/index.tsx | 1 + .../MainPage/components/components/index.tsx | 33 +---------- 3 files changed, 49 insertions(+), 41 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index f9eef310e..21701f459 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -18,6 +18,8 @@ import { CardHeader, CardTitle, } from "../ui/card"; +import IOModal from "../../modals/IOModal"; +import useFlowStore from "../../stores/flowStore"; export default function CollectionCardComponent({ data, @@ -31,7 +33,7 @@ export default function CollectionCardComponent({ authorized?: boolean; disabled?: boolean; button?: JSX.Element; - playground?:JSX.Element; + playground?: boolean; onDelete?: () => void; }) { const addFlow = useFlowsManagerStore((state) => state.addFlow); @@ -48,9 +50,24 @@ export default function CollectionCardComponent({ const [downloads_count, setDownloads_count] = useState( data?.downloads_count ?? 0 ); + const currentFlow = useFlowsManagerStore((state) => state.currentFlow); + const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId); + const setNodes = useFlowStore((state) => state.setNodes); + const setEdges = useFlowStore((state) => state.setEdges); + const [openPlayground, setOpenPlayground] = useState(false); + const setCurrentFlowId = useFlowsManagerStore((state) => state.setCurrentFlowId); + + const name = data.is_component ? "Component" : "Flow"; + useEffect(() => { + if (currentFlowId && playground) { + setNodes(currentFlow?.data?.nodes ?? []); + setEdges(currentFlow?.data?.edges ?? []); + } + }, [currentFlowId]); + useEffect(() => { if (data) { setLiked_by_user(data?.liked_by_user ?? false); @@ -69,18 +86,16 @@ export default function CollectionCardComponent({ addFlow(true, newFlow) .then((id) => { setSuccessData({ - title: `${name} ${ - isStore ? "Downloaded" : "Installed" - } Successfully.`, + title: `${name} ${isStore ? "Downloaded" : "Installed" + } Successfully.`, }); setLoading(false); }) .catch((error) => { setLoading(false); setErrorData({ - title: `Error ${ - isStore ? "downloading" : "installing" - } the ${name}`, + title: `Error ${isStore ? "downloading" : "installing" + } the ${name}`, list: [error["response"]["data"]["detail"]], }); }); @@ -347,10 +362,33 @@ export default function CollectionCardComponent({ )} {button && button} - {playground && playground} + {playground && + + } - + ); } diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index c81aecc35..c59368fe5 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -78,6 +78,7 @@ export default function IOModal({ const isBuilding = useFlowStore((state) => state.isBuilding); const currentFlow = useFlowsManagerStore((state) => state.currentFlow); const setNode = useFlowStore((state) => state.setNode); + console.log(nodes) async function updateVertices() { return updateVerticesOrder(currentFlow!.id, null); diff --git a/src/frontend/src/pages/MainPage/components/components/index.tsx b/src/frontend/src/pages/MainPage/components/components/index.tsx index ba5879747..55bc6a511 100644 --- a/src/frontend/src/pages/MainPage/components/components/index.tsx +++ b/src/frontend/src/pages/MainPage/components/components/index.tsx @@ -14,15 +14,12 @@ import { import useAlertStore from "../../../../stores/alertStore"; import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; import { FlowType } from "../../../../types/flow"; -import IOModal from "../../../../modals/IOModal"; - export default function ComponentsComponent({ is_component = true, }: { is_component?: boolean; }) { const addFlow = useFlowsManagerStore((state) => state.addFlow); - const setCurrentFlowId = useFlowsManagerStore((state) => state.setCurrentFlowId); const uploadFlow = useFlowsManagerStore((state) => state.uploadFlow); const removeFlow = useFlowsManagerStore((state) => state.removeFlow); const isLoading = useFlowsManagerStore((state) => state.isLoading); @@ -33,8 +30,6 @@ export default function ComponentsComponent({ const [pageSize, setPageSize] = useState(20); const [pageIndex, setPageIndex] = useState(1); const [loadingScreen, setLoadingScreen] = useState(true); - const [openPlayground, setOpenPlayground] = useState(false); - const navigate = useNavigate(); useEffect(() => { @@ -175,33 +170,7 @@ export default function ComponentsComponent({ <> ) } - playground={ - !is_component ? ( - - - - ) : ( - <> - ) - } + playground={!is_component} /> )) ) : ( From 34ac7f359a44e5e5c729afed968fa8bdf14c4c6e Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 23 Apr 2024 16:53:38 -0300 Subject: [PATCH 003/142] removed console.log --- src/frontend/src/modals/IOModal/index.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index c59368fe5..c81aecc35 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -78,7 +78,6 @@ export default function IOModal({ const isBuilding = useFlowStore((state) => state.isBuilding); const currentFlow = useFlowsManagerStore((state) => state.currentFlow); const setNode = useFlowStore((state) => state.setNode); - console.log(nodes) async function updateVertices() { return updateVerticesOrder(currentFlow!.id, null); From ec94bed45e7fa73c3240e1aa8fd932f42a75593e Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Wed, 24 Apr 2024 00:27:38 +0200 Subject: [PATCH 004/142] Added user icon even if the autologin is off --- .../src/components/headerComponent/index.tsx | 100 +++++++++++------- 1 file changed, 60 insertions(+), 40 deletions(-) diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index 2973fe61a..ed9c33759 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -168,50 +168,70 @@ export default function Header(): JSX.Element { /> )} - {!autoLogin && ( - <> - - - - + + } + > +
Page
+ + ); +} diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index b48e5147d..239a7d870 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -17,6 +17,7 @@ import ViewPage from "./pages/ViewPage"; import DeleteAccountPage from "./pages/deleteAccountPage"; import LoginPage from "./pages/loginPage"; import SignUp from "./pages/signUpPage"; +import GlobalVariablesPage from "./pages/GlobalVariablesPage"; const Router = () => { const navigate = useNavigate(); @@ -126,6 +127,14 @@ const Router = () => { } /> + + + + } + /> Date: Tue, 23 Apr 2024 20:38:04 -0300 Subject: [PATCH 006/142] Update build_and_cache_graph function to handle graph data from database and from input data (#1750) * Update build_and_cache_graph function to handle graph data from database and from input data * Update get_vertices endpoint to handle graph data from input * Update build_vertex function to handle graph data from database * Update build_vertex function to handle graph data from input * Update FlowDataRequest schema to include optional viewport field --- src/backend/base/langflow/api/utils.py | 13 ++++++++++++- src/backend/base/langflow/api/v1/chat.py | 20 +++++++++++++++----- src/backend/base/langflow/api/v1/schemas.py | 12 ++++++++++++ 3 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/backend/base/langflow/api/utils.py b/src/backend/base/langflow/api/utils.py index 0500917a3..b9f10d2c4 100644 --- a/src/backend/base/langflow/api/utils.py +++ b/src/backend/base/langflow/api/utils.py @@ -201,7 +201,7 @@ def format_elapsed_time(elapsed_time: float) -> str: return f"{minutes} {minutes_unit}, {seconds} {seconds_unit}" -async def build_and_cache_graph( +async def build_and_cache_graph_from_db( flow_id: str, session: Session, chat_service: "ChatService", @@ -220,6 +220,17 @@ async def build_and_cache_graph( return graph +async def build_and_cache_graph_from_data( + flow_id: str, + chat_service: "ChatService", + graph_data: dict, +): # -> Graph | Any: + """Build and cache the graph.""" + graph = Graph.from_payload(graph_data, flow_id) + await chat_service.set_cache(flow_id, graph) + return graph + + def format_syntax_error_message(exc: SyntaxError) -> str: """Format a SyntaxError message for returning to the frontend.""" if exc.text is None: diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index 9ee4edb03..6a2be44ef 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -8,13 +8,15 @@ from fastapi.responses import StreamingResponse from loguru import logger from langflow.api.utils import ( - build_and_cache_graph, + build_and_cache_graph_from_data, + build_and_cache_graph_from_db, format_elapsed_time, format_exception_message, get_top_level_vertices, parse_exception, ) from langflow.api.v1.schemas import ( + FlowDataRequest, InputValueRequest, ResultDataResponse, StreamData, @@ -52,6 +54,7 @@ async def try_running_celery_task(vertex, user_id): @router.get("/build/{flow_id}/vertices", response_model=VerticesOrderResponse) async def get_vertices( flow_id: str, + data: Optional[FlowDataRequest] = None, stop_component_id: Optional[str] = None, start_component_id: Optional[str] = None, chat_service: "ChatService" = Depends(get_chat_service), @@ -76,9 +79,14 @@ async def get_vertices( try: # First, we need to check if the flow_id is in the cache graph = None - if cache := await chat_service.get_cache(flow_id): - graph = cache.get("result") - graph = await build_and_cache_graph(flow_id, session, chat_service, graph) + if not data: + if cache := await chat_service.get_cache(flow_id): + graph = cache.get("result") + graph = await build_and_cache_graph_from_db( + flow_id=flow_id, session=session, chat_service=chat_service, graph=graph + ) + else: + graph = await build_and_cache_graph_from_data(flow_id=flow_id, data=data, chat_service=chat_service) if stop_component_id or start_component_id: try: first_layer = graph.sort_vertices(stop_component_id, start_component_id) @@ -144,7 +152,9 @@ async def build_vertex( if not cache: # If there's no cache logger.warning(f"No cache found for {flow_id}. Building graph starting at {vertex_id}") - graph = await build_and_cache_graph(flow_id=flow_id, session=next(get_session()), chat_service=chat_service) + graph = await build_and_cache_graph_from_db( + flow_id=flow_id, session=next(get_session()), chat_service=chat_service + ) else: graph = cache.get("result") result_data_response = ResultDataResponse(results={}) diff --git a/src/backend/base/langflow/api/v1/schemas.py b/src/backend/base/langflow/api/v1/schemas.py index f5d0b97d1..f47637280 100644 --- a/src/backend/base/langflow/api/v1/schemas.py +++ b/src/backend/base/langflow/api/v1/schemas.py @@ -294,3 +294,15 @@ class SimplifiedAPIRequest(BaseModel): ) tweaks: Optional[Tweaks] = Field(default=None, description="The tweaks") session_id: Optional[str] = Field(default=None, description="The session id") + + +# (alias) type ReactFlowJsonObject = { +# nodes: Node[]; +# edges: Edge[]; +# viewport: Viewport; +# } +# import ReactFlowJsonObject +class FlowDataRequest(BaseModel): + nodes: List[dict] + edges: List[dict] + viewport: Optional[dict] = None From 55e56e19f5204ebe8194754eb45b5e0157b8b56c Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Wed, 24 Apr 2024 11:12:54 -0300 Subject: [PATCH 007/142] merge from origin/dev --- src/frontend/src/types/components/index.ts | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 4fb2ca1b7..87495b10b 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -80,14 +80,6 @@ export type InputGlobalComponentType = { editNode?: boolean; }; -export type InputGlobalComponentType = { - disabled: boolean; - onChange: (value: string) => void; - setDb: (value: boolean) => void; - name: string; - data: NodeDataType; - editNode?: boolean; -}; export type KeyPairListComponentType = { value: any; @@ -601,6 +593,7 @@ export type IOModalPropsType = { open: boolean; setOpen: (open: boolean) => void; disable?: boolean; + isPlayground?: boolean; }; export type buttonBoxPropsType = { From ed10322af2171832c6f334ca299905ee8d594c5d Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Wed, 24 Apr 2024 17:50:02 -0300 Subject: [PATCH 008/142] Update setNodes and setEdges functions in flowStore.ts to skip saving changes when skipSave parameter is true --- src/frontend/src/components/cardComponent/index.tsx | 5 +++-- src/frontend/src/modals/IOModal/index.tsx | 10 +++++----- src/frontend/src/stores/flowStore.ts | 8 ++++---- src/frontend/src/types/zustand/flow/index.ts | 4 ++-- 4 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 21701f459..20af31351 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -63,8 +63,8 @@ export default function CollectionCardComponent({ useEffect(() => { if (currentFlowId && playground) { - setNodes(currentFlow?.data?.nodes ?? []); - setEdges(currentFlow?.data?.edges ?? []); + setNodes(currentFlow?.data?.nodes ?? [],true); + setEdges(currentFlow?.data?.edges ?? [],true); } }, [currentFlowId]); @@ -364,6 +364,7 @@ export default function CollectionCardComponent({ {button && button} {playground && diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 920335a97..9dc0b0384 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -1,5 +1,5 @@ -import { AxiosResponse } from "axios"; -import { ReactFlowJsonObject } from "reactflow"; +import { AxiosRequestConfig, AxiosResponse } from "axios"; +import { Edge, ReactFlowJsonObject,Node } from "reactflow"; import { BASE_URL_API } from "../../constants/constants"; import { api } from "../../controllers/API/api"; import { @@ -906,16 +906,21 @@ export async function updateGlobalVariable( export async function getVerticesOrder( flowId: string, startNodeId?: string | null, - stopNodeId?: string | null + stopNodeId?: string | null, + nodes?:Node[], + Edges?:Edge[] ): Promise> { // nodeId is optional and is a query parameter // if nodeId is not provided, the API will return all vertices - const config = {}; + const config:AxiosRequestConfig = {}; if (stopNodeId) { config["params"] = { stop_component_id: stopNodeId }; } else if (startNodeId) { config["params"] = { start_component_id: startNodeId }; } + if(nodes && Edges){ + config.data = {nodes,Edges} + } return await api.get(`${BASE_URL_API}build/${flowId}/vertices`, config); } diff --git a/src/frontend/src/modals/IOModal/index.tsx b/src/frontend/src/modals/IOModal/index.tsx index 857f1ed25..86c9d6591 100644 --- a/src/frontend/src/modals/IOModal/index.tsx +++ b/src/frontend/src/modals/IOModal/index.tsx @@ -31,8 +31,10 @@ export default function IOModal({ open, setOpen, disable, + cleanOnClose=false, }: IOModalPropsType): JSX.Element { const allNodes = useFlowStore((state) => state.nodes); + const cleanFlowPool = useFlowStore((state) => state.CleanFlowPool); const inputs = useFlowStore((state) => state.inputs).filter( (input) => input.type !== "ChatInput" ); @@ -127,6 +129,13 @@ export default function IOModal({ open={open} setOpen={setOpen} disable={disable} + onChangeOpenModal={(open)=>{ + if(!open && cleanOnClose){ + console.log("cleaning flow pool") + cleanFlowPool(); + } + + }} > {children} {/* TODO ADAPT TO ALL TYPES OF INPUTS AND OUTPUTS */} diff --git a/src/frontend/src/pages/FlowPage/index.tsx b/src/frontend/src/pages/FlowPage/index.tsx index 8fb792702..b69015395 100644 --- a/src/frontend/src/pages/FlowPage/index.tsx +++ b/src/frontend/src/pages/FlowPage/index.tsx @@ -6,18 +6,25 @@ import { useDarkStore } from "../../stores/darkStore"; import useFlowsManagerStore from "../../stores/flowsManagerStore"; import Page from "./components/PageComponent"; import ExtraSidebar from "./components/extraSidebarComponent"; +import useFlowStore from "../../stores/flowStore"; export default function FlowPage({ view }: { view?: boolean }): JSX.Element { const setCurrentFlowId = useFlowsManagerStore( (state) => state.setCurrentFlowId ); const version = useDarkStore((state) => state.version); + const setOnFlowPage = useFlowStore((state) => state.setOnFlowPage); const currentFlow = useFlowsManagerStore((state) => state.currentFlow); const { id } = useParams(); // Set flow tab id useEffect(() => { setCurrentFlowId(id!); + setOnFlowPage(true); + + return () => { + setOnFlowPage(false); + }; }, [id]); return ( <> diff --git a/src/frontend/src/stores/flowStore.ts b/src/frontend/src/stores/flowStore.ts index 17e32f090..736c70d5b 100644 --- a/src/frontend/src/stores/flowStore.ts +++ b/src/frontend/src/stores/flowStore.ts @@ -44,9 +44,12 @@ import { getInputsAndOutputs } from "../utils/storeUtils"; import useAlertStore from "./alertStore"; import { useDarkStore } from "./darkStore"; import useFlowsManagerStore from "./flowsManagerStore"; +import FlowPage from "../pages/FlowPage"; // this is our useStore hook that we can use in our components to get parts of the store and call actions const useFlowStore = create((set, get) => ({ + onFlowPage: false, + setOnFlowPage:(FlowPage=>set({onFlowPage:FlowPage})), flowState: undefined, flowBuildStatus: {}, nodes: [], @@ -164,7 +167,7 @@ const useFlowStore = create((set, get) => ({ }); const flowsManager = useFlowsManagerStore.getState(); - if (!get().isBuilding && !skipSave) { + if (!get().isBuilding && !skipSave && get().onFlowPage) { flowsManager.autoSaveCurrentFlow( newChange, newEdges, @@ -180,7 +183,7 @@ const useFlowStore = create((set, get) => ({ }); const flowsManager = useFlowsManagerStore.getState(); - if (!get().isBuilding && !skipSave) { + if (!get().isBuilding && !skipSave && get().onFlowPage) { flowsManager.autoSaveCurrentFlow( get().nodes, newChange, @@ -560,6 +563,8 @@ const useFlowStore = create((set, get) => ({ useFlowStore.getState().updateBuildStatus(idList, BuildStatus.BUILDING); }, onValidateNodes: validateSubgraph, + nodes: !get().onFlowPage ? get().nodes : undefined, + edges: !get().onFlowPage ? get().edges : undefined, }); get().setIsBuilding(false); get().revertBuiltStatusFromBuilding(); diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 87495b10b..8cf20a80f 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -594,6 +594,7 @@ export type IOModalPropsType = { setOpen: (open: boolean) => void; disable?: boolean; isPlayground?: boolean; + cleanOnClose?: boolean; }; export type buttonBoxPropsType = { diff --git a/src/frontend/src/types/zustand/flow/index.ts b/src/frontend/src/types/zustand/flow/index.ts index dac3cec52..c975eec8d 100644 --- a/src/frontend/src/types/zustand/flow/index.ts +++ b/src/frontend/src/types/zustand/flow/index.ts @@ -45,6 +45,8 @@ export type FlowPoolType = { }; export type FlowStoreType = { + onFlowPage: boolean; + setOnFlowPage: (onFlowPage: boolean) => void; flowPool: FlowPoolType; inputs: Array<{ type: string; id: string; displayName: string }>; outputs: Array<{ type: string; id: string; displayName: string }>; diff --git a/src/frontend/src/utils/buildUtils.ts b/src/frontend/src/utils/buildUtils.ts index bc2cc62e7..ac648acb1 100644 --- a/src/frontend/src/utils/buildUtils.ts +++ b/src/frontend/src/utils/buildUtils.ts @@ -5,6 +5,7 @@ import useAlertStore from "../stores/alertStore"; import useFlowStore from "../stores/flowStore"; import { VertexBuildTypeAPI } from "../types/api"; import { VertexLayerElementType } from "../types/zustand/flow"; +import { Edge, Node } from "reactflow"; type BuildVerticesParams = { flowId: string; // Assuming FlowType is the type for your flow @@ -21,6 +22,8 @@ type BuildVerticesParams = { onBuildError?: (title, list, idList: VertexLayerElementType[]) => void; onBuildStart?: (idList: VertexLayerElementType[]) => void; onValidateNodes?: (nodes: string[]) => void; + nodes?: Node[]; + edges?: Edge[]; }; function getInactiveVertexData(vertexId: string): VertexBuildTypeAPI { @@ -48,7 +51,9 @@ function getInactiveVertexData(vertexId: string): VertexBuildTypeAPI { export async function updateVerticesOrder( flowId: string, startNodeId?: string | null, - stopNodeId?: string | null + stopNodeId?: string | null, + nodes?:Node[], + edges?:Edge[] ): Promise<{ verticesLayers: VertexLayerElementType[][]; verticesIds: string[]; @@ -59,7 +64,7 @@ export async function updateVerticesOrder( const setErrorData = useAlertStore.getState().setErrorData; let orderResponse; try { - orderResponse = await getVerticesOrder(flowId, startNodeId, stopNodeId); + orderResponse = await getVerticesOrder(flowId, startNodeId, stopNodeId, nodes, edges); } catch (error: any) { setErrorData({ title: "Oops! Looks like you missed something", @@ -101,6 +106,8 @@ export async function buildVertices({ onBuildError, onBuildStart, onValidateNodes, + nodes, + edges, }: BuildVerticesParams) { let verticesBuild = useFlowStore.getState().verticesBuild; // if startNodeId and stopNodeId are provided @@ -113,7 +120,9 @@ export async function buildVertices({ let verticesOrderResponse = await updateVerticesOrder( flowId, startNodeId, - stopNodeId + stopNodeId, + nodes, + edges ); if (onValidateNodes) { try { From e799f53116b320b00098ebdbe9b365dbfcde9b4f Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Thu, 25 Apr 2024 16:23:09 +0200 Subject: [PATCH 012/142] Added grid on table component as a mock --- src/frontend/package-lock.json | 19 +++++ src/frontend/package.json | 1 + .../src/components/tableComponent/index.tsx | 85 +++++++++++++++++++ .../src/pages/GlobalVariablesPage/index.tsx | 5 +- 4 files changed, 109 insertions(+), 1 deletion(-) create mode 100644 src/frontend/src/components/tableComponent/index.tsx diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 2ec5cdfb3..6bd58b234 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -31,6 +31,7 @@ "@tailwindcss/line-clamp": "^0.4.4", "@types/axios": "^0.14.0", "ace-builds": "^1.24.1", + "ag-grid-react": "^31.2.1", "ansi-to-html": "^0.7.2", "axios": "^1.5.0", "base64-js": "^1.5.1", @@ -4325,6 +4326,24 @@ "node": ">=0.4.0" } }, + "node_modules/ag-grid-community": { + "version": "31.2.1", + "resolved": "https://registry.npmjs.org/ag-grid-community/-/ag-grid-community-31.2.1.tgz", + "integrity": "sha512-D+gnUQ4dHZ/EQJmupQnDqcEKiCEeuK5ZxlsIpdPKgHg/23dmW+aEdivtB9nLpSc2IEK0RUpchcSxeUT37Boo5A==" + }, + "node_modules/ag-grid-react": { + "version": "31.2.1", + "resolved": "https://registry.npmjs.org/ag-grid-react/-/ag-grid-react-31.2.1.tgz", + "integrity": "sha512-9UH3xxXRwZfW97oz58KboyCJl4t+zdetopieeHVcttsXX1DvGFDUIEz7A1sQaG8e1DAXLMf3IxoIPrfWheH4XA==", + "dependencies": { + "ag-grid-community": "31.2.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^16.3.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.3.0 || ^17.0.0 || ^18.0.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index 338c8a541..49d3fe5ba 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -26,6 +26,7 @@ "@tailwindcss/line-clamp": "^0.4.4", "@types/axios": "^0.14.0", "ace-builds": "^1.24.1", + "ag-grid-react": "^31.2.1", "ansi-to-html": "^0.7.2", "axios": "^1.5.0", "base64-js": "^1.5.1", diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx new file mode 100644 index 000000000..d816b55b1 --- /dev/null +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -0,0 +1,85 @@ +import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the grid +import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the grid +import { AgGridReact } from "ag-grid-react"; +import { useState } from "react"; +import { Card, CardContent, CardFooter } from "../ui/card"; + +export default function TableComponent() { + // Column Definitions: Defines the columns to be displayed. + const [colDefs, setColDefs] = useState([ + { headerName: "Variable Name", field: "name", flex: 1, editable: true }, //This column will be twice as wide as the others + { + field: "type", + cellEditor: "agSelectCellEditor", + cellEditorParams: { + values: ["Prompt", "Credential"], + valueListGap: 10, + }, + flex: 1, + editable: true, + }, + { + field: "value", + cellEditor: "agLargeTextCellEditor", + cellEditorPopup: true, + flex: 2, + editable: true, + }, + { + headerName: "Default Fields", + field: "defaultFields", + flex: 1, + editable: true, + }, + ]); + + const [rowData, setRowData] = useState([ + { + name: "OpenAI Key", + type: "Credential", + value: "apijpioj09u302j0982ejf", + defaultFields: "Open AI API Key", + }, + { + name: "Prompt", + type: "Prompt", + value: `Answer user's questions based on the document below: + + --- + + {Document} + + --- + + Question: + {Question} + + Answer: + `, + defaultFields: ["Prompt"], + }, + { + name: "Azure Key", + type: "Credential", + value: "awowkdenvoaimojndofunoweoij0293u0n2e08n23", + defaultFields: ["Azure API Key"], + }, + ]); + + return ( + + +
+ +
+
+ +
+ Showing 1-3 of 3 products +
+
+
+ ); +} diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index 19cb2ce27..4c0aec707 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -2,6 +2,7 @@ import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; import PageLayout from "../../components/pageLayout"; +import TableComponent from "../../components/tableComponent"; export default function GlobalVariablesPage() { return ( @@ -17,7 +18,9 @@ export default function GlobalVariablesPage() { } > -
Page
+
+ +
); } From e22a3300cb5e9b8bd647813172b7ccc1630d6af2 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 25 Apr 2024 13:03:53 -0300 Subject: [PATCH 013/142] Refactor get_vertices function to retrieve_vertices_order in chat.py --- src/backend/base/langflow/api/v1/chat.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index 6a2be44ef..e839df1c6 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -51,8 +51,8 @@ async def try_running_celery_task(vertex, user_id): return vertex -@router.get("/build/{flow_id}/vertices", response_model=VerticesOrderResponse) -async def get_vertices( +@router.post("/build/{flow_id}/vertices", response_model=VerticesOrderResponse) +async def retrieve_vertices_order( flow_id: str, data: Optional[FlowDataRequest] = None, stop_component_id: Optional[str] = None, @@ -65,6 +65,7 @@ async def get_vertices( Args: flow_id (str): The ID of the flow. + data (Optional[FlowDataRequest], optional): The flow data. Defaults to None. stop_component_id (str, optional): The ID of the stop component. Defaults to None. start_component_id (str, optional): The ID of the start component. Defaults to None. chat_service (ChatService, optional): The chat service dependency. Defaults to Depends(get_chat_service). From dc71ad261b879ac83fe924d22ad35a51a164a415 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Thu, 25 Apr 2024 15:33:34 -0300 Subject: [PATCH 014/142] Fix cleanFlowPool function not being called in CollectionCardComponent --- src/frontend/src/components/cardComponent/index.tsx | 2 ++ src/frontend/src/controllers/API/index.ts | 6 ++++-- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 261cd009e..7c71c110e 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -40,6 +40,7 @@ export default function CollectionCardComponent({ const setSuccessData = useAlertStore((state) => state.setSuccessData); const setErrorData = useAlertStore((state) => state.setErrorData); const setValidApiKey = useStoreStore((state) => state.updateValidApiKey); + const cleanFlowPool = useFlowStore((state) => state.CleanFlowPool); const isStore = false; const [loading, setLoading] = useState(false); const [loadingLike, setLoadingLike] = useState(false); @@ -64,6 +65,7 @@ export default function CollectionCardComponent({ if (currentFlowId && playground) { setNodes(currentFlow?.data?.nodes ?? [],true); setEdges(currentFlow?.data?.edges ?? [],true); + cleanFlowPool(); } }, [currentFlowId]); diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 9dc0b0384..be9572398 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -918,10 +918,12 @@ export async function getVerticesOrder( } else if (startNodeId) { config["params"] = { start_component_id: startNodeId }; } + const data = {} if(nodes && Edges){ - config.data = {nodes,Edges} + data["nodes"] = nodes + data["edges"] = Edges } - return await api.get(`${BASE_URL_API}build/${flowId}/vertices`, config); + return await api.post(`${BASE_URL_API}build/${flowId}/vertices`,data, config); } export async function postBuildVertex( From 4317ab35b75b6116b38be0408647307341ef6809 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Thu, 25 Apr 2024 16:06:14 -0300 Subject: [PATCH 015/142] Refactor build_and_cache_graph_from_data function in chat.py to use model_dump() method for graph data --- src/backend/base/langflow/api/v1/chat.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/api/v1/chat.py b/src/backend/base/langflow/api/v1/chat.py index e839df1c6..5d8e4ace3 100644 --- a/src/backend/base/langflow/api/v1/chat.py +++ b/src/backend/base/langflow/api/v1/chat.py @@ -87,7 +87,9 @@ async def retrieve_vertices_order( flow_id=flow_id, session=session, chat_service=chat_service, graph=graph ) else: - graph = await build_and_cache_graph_from_data(flow_id=flow_id, data=data, chat_service=chat_service) + graph = await build_and_cache_graph_from_data( + flow_id=flow_id, graph_data=data.model_dump(), chat_service=chat_service + ) if stop_component_id or start_component_id: try: first_layer = graph.sort_vertices(stop_component_id, start_component_id) From 089446b1b76db6d9832086c7a9dbaefd629398ad Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Thu, 25 Apr 2024 16:28:03 -0300 Subject: [PATCH 016/142] initial implementation of playground on store, not working yet --- .../src/components/cardComponent/index.tsx | 15 +++++++++++++-- src/frontend/src/pages/StorePage/index.tsx | 1 + 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 7c71c110e..9e5db5433 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -63,8 +63,19 @@ export default function CollectionCardComponent({ useEffect(() => { if (currentFlowId && playground) { - setNodes(currentFlow?.data?.nodes ?? [],true); - setEdges(currentFlow?.data?.edges ?? [],true); + console.log(currentFlowId) + if(currentFlow){ + setNodes(currentFlow?.data?.nodes ?? [],true); + setEdges(currentFlow?.data?.edges ?? [],true); + } + else{ + getComponent(data.id) + .then((res) => { + const newFlow = cloneFLowWithParent(res, res.id, data.is_component); + setNodes(newFlow?.data?.nodes??[]); + setEdges(newFlow?.data?.edges??[]); + }); + } cleanFlowPool(); } }, [currentFlowId]); diff --git a/src/frontend/src/pages/StorePage/index.tsx b/src/frontend/src/pages/StorePage/index.tsx index 64df241fb..4bc482f56 100644 --- a/src/frontend/src/pages/StorePage/index.tsx +++ b/src/frontend/src/pages/StorePage/index.tsx @@ -371,6 +371,7 @@ export default function StorePage(): JSX.Element { data={item} authorized={validApiKey} disabled={loading} + playground={item.last_tested_version?.includes("1.0.0")&& !item.is_component} /> ); From b8a62a3c7bd771c2f9ffe1984979a1e19abd6e8f Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Thu, 25 Apr 2024 18:37:23 -0300 Subject: [PATCH 017/142] running flows from store, still need fixes --- .../src/components/cardComponent/index.tsx | 32 +++++++++++-------- .../MainPage/components/components/index.tsx | 2 +- src/frontend/src/stores/flowsManagerStore.ts | 10 ++++++ .../src/types/zustand/flowsManager/index.ts | 2 ++ src/frontend/src/utils/storeUtils.ts | 7 ++-- 5 files changed, 37 insertions(+), 16 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 9e5db5433..04f009d22 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -52,6 +52,8 @@ export default function CollectionCardComponent({ data?.downloads_count ?? 0 ); const currentFlow = useFlowsManagerStore((state) => state.currentFlow); + const setCurrentFlow = useFlowsManagerStore((state) => state.setCurrentFlow); + const getFlowById = useFlowsManagerStore((state) => state.getFlowById); const currentFlowId = useFlowsManagerStore((state) => state.currentFlowId); const setNodes = useFlowStore((state) => state.setNodes); const setEdges = useFlowStore((state) => state.setEdges); @@ -61,21 +63,16 @@ export default function CollectionCardComponent({ const name = data.is_component ? "Component" : "Flow"; + async function getFlowData(){ + const res = await getComponent(data.id) + const newFlow = cloneFLowWithParent(res, res.id, data.is_component,true); + return newFlow; + } + useEffect(() => { if (currentFlowId && playground) { - console.log(currentFlowId) - if(currentFlow){ setNodes(currentFlow?.data?.nodes ?? [],true); setEdges(currentFlow?.data?.edges ?? [],true); - } - else{ - getComponent(data.id) - .then((res) => { - const newFlow = cloneFLowWithParent(res, res.id, data.is_component); - setNodes(newFlow?.data?.nodes??[]); - setEdges(newFlow?.data?.edges??[]); - }); - } cleanFlowPool(); } }, [currentFlowId]); @@ -385,8 +382,17 @@ export default function CollectionCardComponent({ "playground-flow-button-" + data.id } onClick={() => { - setCurrentFlowId(data.id); - setOpenPlayground(true); + if(getFlowById(data.id)){ + setCurrentFlowId(data.id); + setOpenPlayground(true); + } + else{ + getFlowData().then((res) => { + setCurrentFlow(res); + setOpenPlayground(true); + }); + + } }} > ([]); diff --git a/src/frontend/src/stores/flowsManagerStore.ts b/src/frontend/src/stores/flowsManagerStore.ts index 9471889c3..62e88f99c 100644 --- a/src/frontend/src/stores/flowsManagerStore.ts +++ b/src/frontend/src/stores/flowsManagerStore.ts @@ -46,6 +46,16 @@ const useFlowsManagerStore = create((set, get) => ({ set({ examples }); }, currentFlowId: "", + setCurrentFlow: (flow: FlowType) => { + set((state) => ({ + currentFlow: flow, + currentFlowId: flow.id, + })); + + }, + getFlowById: (id: string) => { + return get().flows.find((flow) => flow.id === id); + }, setCurrentFlowId: (currentFlowId: string) => { set((state) => ({ currentFlowId, diff --git a/src/frontend/src/types/zustand/flowsManager/index.ts b/src/frontend/src/types/zustand/flowsManager/index.ts index 817ddd3d1..16985105a 100644 --- a/src/frontend/src/types/zustand/flowsManager/index.ts +++ b/src/frontend/src/types/zustand/flowsManager/index.ts @@ -2,6 +2,7 @@ import { Edge, Node, Viewport, XYPosition } from "reactflow"; import { FlowType } from "../../flow"; export type FlowsManagerStoreType = { + getFlowById: (id: string) => FlowType | undefined; flows: Array; setFlows: (flows: FlowType[]) => void; currentFlow: FlowType | undefined; @@ -50,6 +51,7 @@ export type FlowsManagerStoreType = { takeSnapshot: () => void; examples: Array; setExamples: (examples: FlowType[]) => void; + setCurrentFlow: (flow: FlowType) => void; }; export type UseUndoRedoOptions = { diff --git a/src/frontend/src/utils/storeUtils.ts b/src/frontend/src/utils/storeUtils.ts index e51cf8933..78b7ee7ff 100644 --- a/src/frontend/src/utils/storeUtils.ts +++ b/src/frontend/src/utils/storeUtils.ts @@ -6,11 +6,14 @@ import { isInputNode, isOutputNode } from "./reactflowUtils"; export default function cloneFLowWithParent( flow: FlowType, parent: string, - is_component: boolean + is_component: boolean, + keepId=false ) { let childFLow = cloneDeep(flow); childFLow.parent = parent; - childFLow.id = ""; + if(!keepId){ + childFLow.id = ""; + } childFLow.is_component = is_component; return childFLow; } From 16bd9f1ee15ff34c9965c7afb754c33fc49b4314 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Fri, 26 Apr 2024 01:32:03 +0200 Subject: [PATCH 018/142] Added settings page --- .../src/components/headerComponent/index.tsx | 11 +--- .../src/pages/GlobalVariablesPage/index.tsx | 24 +++++---- src/frontend/src/pages/SettingsPage/index.tsx | 51 +++++++++++++++++++ src/frontend/src/routes.tsx | 25 +++++---- src/frontend/src/utils/styleUtils.ts | 2 + 5 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 src/frontend/src/pages/SettingsPage/index.tsx diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index ed9c33759..ff48c5f79 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -190,16 +190,9 @@ export default function Header(): JSX.Element { navigate("/global-variables")} + onClick={() => navigate("/settings")} > - Global Variables - - - navigate("/shortcuts")} - > - Shortcuts + Settings {!autoLogin && ( <> diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index 4c0aec707..41e72bcc0 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -1,26 +1,30 @@ import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; -import PageLayout from "../../components/pageLayout"; import TableComponent from "../../components/tableComponent"; export default function GlobalVariablesPage() { return ( - +
+
+
+

Global Variables

+

+ Manage and assign global variables to default fields. You can add + new global variables by clicking the button. +

+
+
- - } - > +
+
+
- +
); } diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx new file mode 100644 index 000000000..0bf50a46e --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -0,0 +1,51 @@ +import { useEffect } from "react"; +import { Outlet } from "react-router-dom"; +import ForwardedIconComponent from "../../components/genericIconComponent"; +import PageLayout from "../../components/pageLayout"; +import SidebarNav from "../../components/sidebarComponent"; +import useFlowsManagerStore from "../../stores/flowsManagerStore"; + +export default function SettingsPage(): JSX.Element { + const pathname = location.pathname; + const setCurrentFlowId = useFlowsManagerStore( + (state) => state.setCurrentFlowId + ); + useEffect(() => { + setCurrentFlowId(""); + }, [pathname]); + + const sidebarNavItems = [ + { + title: "Global Variables", + href: "/settings/global-variables", + icon: ( + + ), + }, + { + title: "Keyboard Shortcuts", + href: "/settings/shortcuts", + icon: ( + + ), + }, + ]; + return ( + +
+ +
+ +
+
+
+ ); +} diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index 239a7d870..943a953b0 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -1,5 +1,5 @@ import { useEffect } from "react"; -import { Route, Routes, useNavigate } from "react-router-dom"; +import { Navigate, Route, Routes, useNavigate } from "react-router-dom"; import { ProtectedAdminRoute } from "./components/authAdminGuard"; import { ProtectedRoute } from "./components/authGuard"; import { ProtectedLoginRoute } from "./components/authLoginGuard"; @@ -9,15 +9,16 @@ import AdminPage from "./pages/AdminPage"; import LoginAdminPage from "./pages/AdminPage/LoginPage"; import ApiKeysPage from "./pages/ApiKeysPage"; import FlowPage from "./pages/FlowPage"; +import GlobalVariablesPage from "./pages/GlobalVariablesPage"; import HomePage from "./pages/MainPage"; import ComponentsComponent from "./pages/MainPage/components/components"; import ProfileSettingsPage from "./pages/ProfileSettingsPage"; +import SettingsPage from "./pages/SettingsPage"; import StorePage from "./pages/StorePage"; import ViewPage from "./pages/ViewPage"; import DeleteAccountPage from "./pages/deleteAccountPage"; import LoginPage from "./pages/loginPage"; import SignUp from "./pages/signUpPage"; -import GlobalVariablesPage from "./pages/GlobalVariablesPage"; const Router = () => { const navigate = useNavigate(); @@ -46,6 +47,18 @@ const Router = () => { element={} />
+ + + + } + > + } /> + } /> + } /> + { } /> - - - - } - /> Date: Fri, 26 Apr 2024 01:37:51 +0200 Subject: [PATCH 019/142] Added more settings options --- src/frontend/src/pages/SettingsPage/index.tsx | 42 ++++++++++++++++++- src/frontend/src/utils/styleUtils.ts | 6 +++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx index 0bf50a46e..48941fd06 100644 --- a/src/frontend/src/pages/SettingsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -15,6 +15,46 @@ export default function SettingsPage(): JSX.Element { }, [pathname]); const sidebarNavItems = [ + { + title: "General", + href: "/settings/general", + icon: ( + + ), + }, + { + title: "Theme", + href: "/settings/theme", + icon: ( + + ), + }, + { + title: "Bundles", + href: "/settings/bundles", + icon: ( + + ), + }, + { + title: "Integrations", + href: "/settings/integrations", + icon: ( + + ), + }, { title: "Global Variables", href: "/settings/global-variables", @@ -26,7 +66,7 @@ export default function SettingsPage(): JSX.Element { ), }, { - title: "Keyboard Shortcuts", + title: "Shortcuts", href: "/settings/shortcuts", icon: ( diff --git a/src/frontend/src/utils/styleUtils.ts b/src/frontend/src/utils/styleUtils.ts index ea646109c..25e5ec4fb 100644 --- a/src/frontend/src/utils/styleUtils.ts +++ b/src/frontend/src/utils/styleUtils.ts @@ -5,6 +5,7 @@ import { ArrowUpToLine, Bell, Binary, + Blocks, BookMarked, BookmarkPlus, Bot, @@ -87,6 +88,7 @@ import { MoreHorizontal, Network, Package2, + Palette, Paperclip, Pencil, PencilLine, @@ -109,6 +111,7 @@ import { Share2, Shield, Sliders, + SlidersHorizontal, Snowflake, Sparkles, Square, @@ -414,6 +417,9 @@ export const nodeIconsLucide: iconsType = { MoonIcon, Bell, ChevronLeft, + SlidersHorizontal, + Palette, + Blocks, ChevronDown, ArrowLeft, Shield, From 2dd0b2bf169cc8a0334e405505c88fde32b54091 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Thu, 25 Apr 2024 21:38:53 -0300 Subject: [PATCH 020/142] add type import --- src/frontend/package-lock.json | 412 +++++++++--------- src/frontend/package.json | 1 + .../src/components/tableComponent/index.tsx | 10 +- 3 files changed, 220 insertions(+), 203 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 6bd58b234..5e6b7fe67 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -31,6 +31,7 @@ "@tailwindcss/line-clamp": "^0.4.4", "@types/axios": "^0.14.0", "ace-builds": "^1.24.1", + "ag-grid-community": "^31.2.1", "ag-grid-react": "^31.2.1", "ansi-to-html": "^0.7.2", "axios": "^1.5.0", @@ -167,25 +168,25 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", - "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", - "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", - "@babel/generator": "^7.24.1", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.1", - "@babel/parser": "^7.24.1", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", @@ -204,9 +205,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", - "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -339,9 +340,9 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", - "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", @@ -366,9 +367,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", - "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "bin": { "parser": "bin/babel-parser.js" }, @@ -377,9 +378,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.1", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", - "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -906,9 +907,9 @@ "integrity": "sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q==" }, "node_modules/@headlessui/react": { - "version": "1.7.18", - "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.18.tgz", - "integrity": "sha512-4i5DOrzwN4qSgNsL4Si61VMkUcWbcSKueUV7sFhpHzQcSShdlHENE5+QBntMSRvHt8NyoFO2AGG8si9lq+w4zQ==", + "version": "1.7.19", + "resolved": "https://registry.npmjs.org/@headlessui/react/-/react-1.7.19.tgz", + "integrity": "sha512-Ll+8q3OlMJfJbAKM/+/Y2q6PPYbryqNTXDbryx7SXLIDamkF6iQFbriYHga0dY44PvDhvvBWCx1Xj4U5+G4hOw==", "dependencies": { "@tanstack/react-virtual": "^3.0.0-beta.60", "client-only": "^0.0.1" @@ -2790,11 +2791,11 @@ } }, "node_modules/@reactflow/background": { - "version": "11.3.9", - "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.9.tgz", - "integrity": "sha512-byj/G9pEC8tN0wT/ptcl/LkEP/BBfa33/SvBkqE4XwyofckqF87lKp573qGlisfnsijwAbpDlf81PuFL41So4Q==", + "version": "11.3.12", + "resolved": "https://registry.npmjs.org/@reactflow/background/-/background-11.3.12.tgz", + "integrity": "sha512-jBuWVb43JQy5h4WOS7G0PU8voGTEJNA+qDmx8/jyBtrjbasTesLNfQvboTGjnQYYiJco6mw5vrtQItAJDNoIqw==", "dependencies": { - "@reactflow/core": "11.10.4", + "@reactflow/core": "11.11.2", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2804,11 +2805,11 @@ } }, "node_modules/@reactflow/controls": { - "version": "11.2.9", - "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.9.tgz", - "integrity": "sha512-e8nWplbYfOn83KN1BrxTXS17+enLyFnjZPbyDgHSRLtI5ZGPKF/8iRXV+VXb2LFVzlu4Wh3la/pkxtfP/0aguA==", + "version": "11.2.12", + "resolved": "https://registry.npmjs.org/@reactflow/controls/-/controls-11.2.12.tgz", + "integrity": "sha512-L9F3+avFRShoprdT+5oOijm5gVsz2rqWCXBzOAgD923L1XFGIspdiHLLf8IlPGsT+mfl0GxbptZhaEeEzl1e3g==", "dependencies": { - "@reactflow/core": "11.10.4", + "@reactflow/core": "11.11.2", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2818,9 +2819,9 @@ } }, "node_modules/@reactflow/core": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.10.4.tgz", - "integrity": "sha512-j3i9b2fsTX/sBbOm+RmNzYEFWbNx4jGWGuGooh2r1jQaE2eV+TLJgiG/VNOp0q5mBl9f6g1IXs3Gm86S9JfcGw==", + "version": "11.11.2", + "resolved": "https://registry.npmjs.org/@reactflow/core/-/core-11.11.2.tgz", + "integrity": "sha512-+GfgyskweL1PsgRSguUwfrT2eDotlFgaKfDLm7x0brdzzPJY2qbCzVetaxedaiJmIli3817iYbILvE9qLKwbRA==", "dependencies": { "@types/d3": "^7.4.0", "@types/d3-drag": "^3.0.1", @@ -2838,11 +2839,11 @@ } }, "node_modules/@reactflow/minimap": { - "version": "11.7.9", - "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.9.tgz", - "integrity": "sha512-le95jyTtt3TEtJ1qa7tZ5hyM4S7gaEQkW43cixcMOZLu33VAdc2aCpJg/fXcRrrf7moN2Mbl9WIMNXUKsp5ILA==", + "version": "11.7.12", + "resolved": "https://registry.npmjs.org/@reactflow/minimap/-/minimap-11.7.12.tgz", + "integrity": "sha512-SRDU77c2PCF54PV/MQfkz7VOW46q7V1LZNOQlXAp7dkNyAOI6R+tb9qBUtUJOvILB+TCN6pRfD9fQ+2T99bW3Q==", "dependencies": { - "@reactflow/core": "11.10.4", + "@reactflow/core": "11.11.2", "@types/d3-selection": "^3.0.3", "@types/d3-zoom": "^3.0.1", "classcat": "^5.0.3", @@ -2856,11 +2857,11 @@ } }, "node_modules/@reactflow/node-resizer": { - "version": "2.2.9", - "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.9.tgz", - "integrity": "sha512-HfickMm0hPDIHt9qH997nLdgLt0kayQyslKE0RS/GZvZ4UMQJlx/NRRyj5y47Qyg0NnC66KYOQWDM9LLzRTnUg==", + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@reactflow/node-resizer/-/node-resizer-2.2.12.tgz", + "integrity": "sha512-6LHJGuI1zHyRrZHw5gGlVLIWnvVxid9WIqw8FMFSg+oF2DuS3pAPwSoZwypy7W22/gDNl9eD1Dcl/OtFtDFQ+w==", "dependencies": { - "@reactflow/core": "11.10.4", + "@reactflow/core": "11.11.2", "classcat": "^5.0.4", "d3-drag": "^3.0.0", "d3-selection": "^3.0.0", @@ -2872,11 +2873,11 @@ } }, "node_modules/@reactflow/node-toolbar": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.9.tgz", - "integrity": "sha512-VmgxKmToax4sX1biZ9LXA7cj/TBJ+E5cklLGwquCCVVxh+lxpZGTBF3a5FJGVHiUNBBtFsC8ldcSZIK4cAlQww==", + "version": "1.3.12", + "resolved": "https://registry.npmjs.org/@reactflow/node-toolbar/-/node-toolbar-1.3.12.tgz", + "integrity": "sha512-4kJRvNna/E3y2MZW9/80wTKwkhw4pLJiz3D5eQrD13XcmojSb1rArO9CiwyrI+rMvs5gn6NlCFB4iN1F+Q+lxQ==", "dependencies": { - "@reactflow/core": "11.10.4", + "@reactflow/core": "11.11.2", "classcat": "^5.0.3", "zustand": "^4.4.1" }, @@ -2886,9 +2887,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.15.3", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.15.3.tgz", - "integrity": "sha512-Oy8rmScVrVxWZVOpEF57ovlnhpZ8CCPlnIIumVcV9nFdiSIrus99+Lw78ekXyGvVDlIsFJbSfmSovJUhCWYV3w==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.0.tgz", + "integrity": "sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==", "engines": { "node": ">=14.0.0" } @@ -3204,9 +3205,9 @@ "dev": true }, "node_modules/@swc/core": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.11.tgz", - "integrity": "sha512-WKEakMZxkVwRdgMN4AMJ9K5nysY8g8npgQPczmjBeNK5In7QEAZAJwnyccrWwJZU0XjVeHn2uj+XbOKdDW17rg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.0.tgz", + "integrity": "sha512-fjADAC5gOOX54Rpcr1lF9DHLD+nPD5H/zXLtEgK2Ez3esmogT+LfHzCZtUxqetjvaMChKhQ0Pp0ZB6Hpz/tCbw==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -3221,16 +3222,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.11", - "@swc/core-darwin-x64": "1.4.11", - "@swc/core-linux-arm-gnueabihf": "1.4.11", - "@swc/core-linux-arm64-gnu": "1.4.11", - "@swc/core-linux-arm64-musl": "1.4.11", - "@swc/core-linux-x64-gnu": "1.4.11", - "@swc/core-linux-x64-musl": "1.4.11", - "@swc/core-win32-arm64-msvc": "1.4.11", - "@swc/core-win32-ia32-msvc": "1.4.11", - "@swc/core-win32-x64-msvc": "1.4.11" + "@swc/core-darwin-arm64": "1.5.0", + "@swc/core-darwin-x64": "1.5.0", + "@swc/core-linux-arm-gnueabihf": "1.5.0", + "@swc/core-linux-arm64-gnu": "1.5.0", + "@swc/core-linux-arm64-musl": "1.5.0", + "@swc/core-linux-x64-gnu": "1.5.0", + "@swc/core-linux-x64-musl": "1.5.0", + "@swc/core-win32-arm64-msvc": "1.5.0", + "@swc/core-win32-ia32-msvc": "1.5.0", + "@swc/core-win32-x64-msvc": "1.5.0" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -3242,9 +3243,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.11.tgz", - "integrity": "sha512-C1j1Qp/IHSelVWdEnT7f0iONWxQz6FAqzjCF2iaL+0vFg4V5f2nlgrueY8vj5pNNzSGhrAlxsMxEIp4dj1MXkg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.0.tgz", + "integrity": "sha512-dyA25zQjm3xmMFsRPFgBpSqWSW9TITnkndZkZAiPYLjBxH9oTNMa0l09BePsaqEeXySY++tUgAeYu/9onsHLbg==", "cpu": [ "arm64" ], @@ -3258,9 +3259,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.11.tgz", - "integrity": "sha512-0TTy3Ni8ncgaMCchSQ7FK8ZXQLlamy0FXmGWbR58c+pVZWYZltYPTmheJUvVcR0H2+gPAymRKyfC0iLszDALjg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.0.tgz", + "integrity": "sha512-cO7kZMMA/fcQIBT31LBzcVNSk3AZGVYLqvEPnJhFImjPm3mGKUd6kWpARUEGR68MyRU2VsWhE6eCjMcM+G7bxw==", "cpu": [ "x64" ], @@ -3274,9 +3275,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.11.tgz", - "integrity": "sha512-XJLB71uw0rog4DjYAPxFGAuGCBQpgJDlPZZK6MTmZOvI/1t0+DelJ24IjHIxk500YYM26Yv47xPabqFPD7I2zQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.0.tgz", + "integrity": "sha512-BXaXytS4y9lBFRO6vwA6ovvy1d2ZIzS02i2R1oegoZzzNu89CJDpkYXYS9bId0GvK2m9Q9y2ofoZzKE2Rp3PqQ==", "cpu": [ "arm" ], @@ -3290,9 +3291,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.11.tgz", - "integrity": "sha512-vYQwzJvm/iu052d5Iw27UFALIN5xSrGkPZXxLNMHPySVko2QMNNBv35HLatkEQHbQ3X+VKSW9J9SkdtAvAVRAQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.0.tgz", + "integrity": "sha512-Bu4/41pGadXKnRsUbox0ig63xImATVH704oPCXcoOvNGkDyMjWgIAhzIi111vrwFNpj9utabgUE4AtlUa2tAOQ==", "cpu": [ "arm64" ], @@ -3306,9 +3307,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.11.tgz", - "integrity": "sha512-eV+KduiRYUFjPsvbZuJ9aknQH9Tj0U2/G9oIZSzLx/18WsYi+upzHbgxmIIHJ2VJgfd7nN40RI/hMtxNsUzR/g==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.0.tgz", + "integrity": "sha512-lUFFvC8tsepNcTnKEHNrePWanVVef6PQ82Rv9wIeebgGHRUqDh6+CyCqodXez+aKz6NyE/PBIfp0r+jPx4hoJA==", "cpu": [ "arm64" ], @@ -3322,9 +3323,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.11.tgz", - "integrity": "sha512-WA1iGXZ2HpqM1OR9VCQZJ8sQ1KP2or9O4bO8vWZo6HZJIeoQSo7aa9waaCLRpkZvkng1ct/TF/l6ymqSNFXIzQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.0.tgz", + "integrity": "sha512-c6LegFU1qdyMfk+GzNIOvrX61+mksm21Q01FBnXSy1nf1ACj/a86jmr3zkPl0zpNVHfPOw3Ry1QIuLQKD+67YA==", "cpu": [ "x64" ], @@ -3338,9 +3339,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.11.tgz", - "integrity": "sha512-UkVJToKf0owwQYRnGvjHAeYVDfeimCEcx0VQSbJoN7Iy0ckRZi7YPlmWJU31xtKvikE2bQWCOVe0qbSDqqcWXA==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.0.tgz", + "integrity": "sha512-I/V8aWBmfDWwjtM1bS8ASG+6PcO/pVFYyPP5g2ok46Vz1o1MnAUd18mHnWX43nqVJokaW+BD/G4ZMZ+gXRl4zQ==", "cpu": [ "x64" ], @@ -3354,9 +3355,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.11.tgz", - "integrity": "sha512-35khwkyly7lF5NDSyvIrukBMzxPorgc5iTSDfVO/LvnmN5+fm4lTlrDr4tUfTdOhv3Emy7CsKlsNAeFRJ+Pm+w==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.0.tgz", + "integrity": "sha512-nN685BvI7iM58xabrSOSQHUvIY10pcXh5H9DmS8LeYqG6Dkq7QZ8AwYqqonOitIS5C35MUfhSMLpOTzKoLdUqA==", "cpu": [ "arm64" ], @@ -3370,9 +3371,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.11.tgz", - "integrity": "sha512-Wx8/6f0ufgQF2pbVPsJ2dAmFLwIOW+xBE5fxnb7VnEbGkTgP1qMDWiiAtD9rtvDSuODG3i1AEmAak/2HAc6i6A==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.0.tgz", + "integrity": "sha512-3YjltmEHljI+TvuDOC4lspUzjBUoB3X5BhftRBprSTJx/czuMl0vdoZKs2Snzb5Eqqesp0Rl8q+iQ1E1oJ6dEA==", "cpu": [ "ia32" ], @@ -3386,9 +3387,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.11.tgz", - "integrity": "sha512-0xRFW6K9UZQH2NVC/0pVB0GJXS45lY24f+6XaPBF1YnMHd8A8GoHl7ugyM5yNUTe2AKhSgk5fJV00EJt/XBtdQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.0.tgz", + "integrity": "sha512-ZairtCwJsaxnUH85DcYCyGpNb9bUoIm9QXYW+VaEoXwbcB95dTIiJwN0aRxPT8B0B2MNw/CXLqjoPo6sDwz5iw==", "cpu": [ "x64" ], @@ -3488,11 +3489,11 @@ } }, "node_modules/@tanstack/react-virtual": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.2.0.tgz", - "integrity": "sha512-OEdMByf2hEfDa6XDbGlZN8qO6bTjlNKqjM3im9JG+u3mCL8jALy0T/67oDI001raUUPh1Bdmfn4ZvPOV5knpcg==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-virtual/-/react-virtual-3.4.0.tgz", + "integrity": "sha512-GZN4xn/Tg5w7gvYeVcMVCeL4pEyUhvg+Cp6KX2Z01C4FRNxIWMgIQ9ibgMarNQfo+gt0PVLcEER4A9sNv/jlow==", "dependencies": { - "@tanstack/virtual-core": "3.2.0" + "@tanstack/virtual-core": "3.4.0" }, "funding": { "type": "github", @@ -3504,32 +3505,32 @@ } }, "node_modules/@tanstack/virtual-core": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.2.0.tgz", - "integrity": "sha512-P5XgYoAw/vfW65byBbJQCw+cagdXDT/qH6wmABiLt4v4YBT2q2vqCOhihe+D1Nt325F/S/0Tkv6C5z0Lv+VBQQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@tanstack/virtual-core/-/virtual-core-3.4.0.tgz", + "integrity": "sha512-75jXqXxqq5M5Veb9KP1STi8kA5u408uOOAefk2ftHDGCpUk3RP6zX++QqfbmHJTBiU72NQ+ghgCZVts/Wocz8Q==", "funding": { "type": "github", "url": "https://github.com/sponsors/tannerlinsley" } }, "node_modules/@testing-library/dom": { - "version": "9.3.4", - "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz", - "integrity": "sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-10.0.0.tgz", + "integrity": "sha512-PmJPnogldqoVFf+EwbHvbBJ98MmqASV8kLrBYgsDNxQcFMeIS7JFL48sfyXvuMtgmWO/wMhh25odr+8VhDmn4g==", "dev": true, "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", "@types/aria-query": "^5.0.1", - "aria-query": "5.1.3", + "aria-query": "5.3.0", "chalk": "^4.1.0", "dom-accessibility-api": "^0.5.9", "lz-string": "^1.5.0", "pretty-format": "^27.0.2" }, "engines": { - "node": ">=14" + "node": ">=18" } }, "node_modules/@testing-library/dom/node_modules/ansi-styles": { @@ -3749,6 +3750,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@testing-library/react/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dev": true, + "dependencies": { + "deep-equal": "^2.0.5" + } + }, "node_modules/@testing-library/react/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4203,9 +4213,9 @@ "integrity": "sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==" }, "node_modules/@types/node": { - "version": "16.18.93", - "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.93.tgz", - "integrity": "sha512-epWuohp6c0bQt0j3RYCiP9x52axHVn+CjS1Rx1VjPwF+ySg8lrigH3yXGs88XqnA+jGM2qnSMuFTsBxft+hO1Q==", + "version": "16.18.96", + "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.96.tgz", + "integrity": "sha512-84iSqGXoO+Ha16j8pRZ/L90vDMKX04QTYMTfYeE1WrjWaZXuchBehGUZEpNgx7JnmlrIHdnABmpjrQjhCnNldQ==", "devOptional": true }, "node_modules/@types/prop-types": { @@ -4214,18 +4224,18 @@ "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.2.73", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.73.tgz", - "integrity": "sha512-XcGdod0Jjv84HOC7N5ziY3x+qL0AfmubvKOZ9hJjJ2yd5EE+KYjWhdOjt387e9HPheHkdggF9atTifMRtyAaRA==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.0.tgz", + "integrity": "sha512-DiUcKjzE6soLyln8NNZmyhcQjVv+WsUIFSqetMN0p8927OztKT4VTfFTqsbAi5oAGIcgOmOajlfBqyptDDjZRw==", "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.23", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.23.tgz", - "integrity": "sha512-ZQ71wgGOTmDYpnav2knkjr3qXdAFu0vsk8Ci5w3pGAIdj7/kKAyn+VsQDhXsmzzzepAiI9leWMmubXz690AI/A==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", "devOptional": true, "dependencies": { "@types/react": "*" @@ -4285,9 +4295,9 @@ "deprecated": "Use your platform's native atob() and btoa() methods instead" }, "node_modules/ace-builds": { - "version": "1.32.9", - "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.32.9.tgz", - "integrity": "sha512-dqBLPj//Gq0b92YUtRIsdWsORf4J+4xW3r8/4Wr2Vqid7O1j7YBV/ZsVvWBjZFy+EnvMCRFCFOEIM1cbt4BQ/g==" + "version": "1.33.1", + "resolved": "https://registry.npmjs.org/ace-builds/-/ace-builds-1.33.1.tgz", + "integrity": "sha512-pj5mcXV1n3s86UI4SWUt8X0ltN8cTaYcvF76cSmvy5i2ZDtXX9KkjVcYTGkCV7ox6VUrzqHByeqH0xRsMjXi4g==" }, "node_modules/acorn": { "version": "8.11.3", @@ -4463,12 +4473,12 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/array-buffer-byte-length": { @@ -4908,9 +4918,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001603", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001603.tgz", - "integrity": "sha512-iL2iSS0eDILMb9n5yKQoTBim9jMZ0Yrk8g0N9K7UzYyWnfIKzXBZD5ngpM37ZcL/cv0Mli8XtVMRYMQAfFpi5Q==", + "version": "1.0.30001612", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001612.tgz", + "integrity": "sha512-lFgnZ07UhaCcsSZgWW0K5j4e69dK1u/ltrL9lTUiFOwNHs12S3UMIEYgBV0Z6C6hRDev7iRnMzzYmKabYdXF9g==", "funding": [ { "type": "opencollective", @@ -5021,9 +5031,9 @@ } }, "node_modules/classcat": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.4.tgz", - "integrity": "sha512-sbpkOw6z413p+HDGcBENe498WM9woqWHiJxCq7nvmxe9WmrUmqfAcxpIwAiMtM5Q3AhYkzXcNQHqsWq0mND51g==" + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/classcat/-/classcat-5.0.5.tgz", + "integrity": "sha512-JhZUT7JFcQy/EzW605k/ktHtncoo9vnyW/2GspNYwFlN1C/WmjuV/xtS04e9SOkL2sTdw0VAZ2UGCcQ9lR6p6w==" }, "node_modules/cli-cursor": { "version": "4.0.0", @@ -5371,9 +5381,9 @@ } }, "node_modules/daisyui": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.9.0.tgz", - "integrity": "sha512-9JsDx4E+30kPxThE+6yEwQokqg1957uwTx/skP2RE98fG6Ten6U+S9YXeQg1a3CI958aF5aOb0oEA+KZFfrZUA==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.10.2.tgz", + "integrity": "sha512-eCWS1W/JPyxW9IvlgW5m0R6rp9ZhRsBTW37rvEUthckkjsV04u8XipV519OoccSA46ixhSJa3q7XLI1WUFtRCA==", "dev": true, "dependencies": { "css-selector-tokenizer": "^0.8", @@ -5678,9 +5688,9 @@ } }, "node_modules/dompurify": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.0.11.tgz", - "integrity": "sha512-Fan4uMuyB26gFV3ovPoEoQbxRRPfTu3CvImyZnhGq5fsIEO+gEFLp45ISFt+kQBWsK5ulDdT0oV28jS1UrwQLg==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.1.0.tgz", + "integrity": "sha512-yoU4rhgPKCo+p5UrWWWNKiIq+ToGqmVVhk0PmMYBK4kRsR3/qhemNFL8f6CFmBd4gMwm3F4T7HBoydP5uY07fA==" }, "node_modules/dot-case": { "version": "3.0.4", @@ -5708,9 +5718,9 @@ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" }, "node_modules/electron-to-chromium": { - "version": "1.4.723", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.723.tgz", - "integrity": "sha512-rxFVtrMGMFROr4qqU6n95rUi9IlfIm+lIAt+hOToy/9r6CDv0XiEcQdC3VP71y1pE5CFTzKV0RvxOGYCPWWHPw==" + "version": "1.4.749", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.749.tgz", + "integrity": "sha512-LRMMrM9ITOvue0PoBrvNIraVmuDbJV5QC9ierz/z5VilMdPOVMjOtpICNld3PuXuTZ3CHH/UPxX9gHhAPwi+0Q==" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -6665,9 +6675,9 @@ } }, "node_modules/framer-motion": { - "version": "11.0.24", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.0.24.tgz", - "integrity": "sha512-l2iM8NR53qtcujgAqYvGPJJGModPNWEVUaATRDLfnaLvUoFpImovBm0AHalSSsY8tW6knP8mfJTW4WYGbnAe4w==", + "version": "11.1.7", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.7.tgz", + "integrity": "sha512-cW11Pu53eDAXUEhv5hEiWuIXWhfkbV32PlgVISn7jRdcAiVrJ1S03YQQ0/DzoswGYYwKi4qYmHHjCzAH52eSdQ==", "dependencies": { "tslib": "^2.4.0" }, @@ -9380,9 +9390,9 @@ } }, "node_modules/nwsapi": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", - "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.9.tgz", + "integrity": "sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==" }, "node_modules/object-assign": { "version": "4.1.1", @@ -9738,9 +9748,9 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.1.tgz", + "integrity": "sha512-tS24spDe/zXhWbNPErCHs/AGOzbKGHT+ybSBqmdLm8WZ1xXLWvH8Qn71QPAlqVhd0qUTWjy+Kl9JmISgDdEjsA==", "engines": { "node": "14 || >=16.14" } @@ -10348,9 +10358,9 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, "node_modules/property-information": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.4.1.tgz", - "integrity": "sha512-OHYtXfu5aI2sS2LWFSN5rgJjrQ4pCy8i1jubJLe2QvMF8JJ++HXTUIVWFLfXJoaOfvYYjk2SN8J2wFUWIGXT4w==", + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", + "integrity": "sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -10427,9 +10437,9 @@ } }, "node_modules/react": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", - "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.0.tgz", + "integrity": "sha512-RPutkJftSAldDibyrjuku7q11d3oy6wKOyPe5K1HA/HwwrXcEqBdHsLypkC2FFYjP7bPUa6gbzSBhw4sY2JcDg==", "dependencies": { "loose-envify": "^1.1.0" }, @@ -10467,15 +10477,15 @@ } }, "node_modules/react-dom": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", - "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-zaKdLBftQJnvb7FtDIpZtsAIb2MZU087RM8bRDZU8LVCCFYjPTsDZJNFUWPcVz3HFSN1n/caxi0ca4B/aaVQGQ==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.1" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.0" } }, "node_modules/react-draggable": { @@ -10503,9 +10513,9 @@ } }, "node_modules/react-icons": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.0.1.tgz", - "integrity": "sha512-WqLZJ4bLzlhmsvme6iFdgO8gfZP17rfjYEJ2m9RsZjZ+cc4k1hTzknEz63YS1MeT50kVzoa1Nz36f4BEx+Wigw==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.1.0.tgz", + "integrity": "sha512-D3zug1270S4hbSlIRJ0CUS97QE1yNNKDjzQe3HqY0aefp2CBn9VgzgES27sRR2gOvFK+0CNx/BW0ggOESp6fqQ==", "peerDependencies": { "react": "*" } @@ -10559,23 +10569,23 @@ } }, "node_modules/react-markdown/node_modules/react-is": { - "version": "18.2.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", - "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.0.tgz", + "integrity": "sha512-wRiUsea88TjKDc4FBEn+sLvIDesp6brMbGWnJGjew2waAc9evdhja/2LvePc898HJbHw0L+MTWy7NhpnELAvLQ==" }, "node_modules/react-reconciler": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.0.tgz", - "integrity": "sha512-wa0fGj7Zht1EYMRhKWwoo1H9GApxYLBuhoAuXN0TlltESAjDssB+Apf0T/DngVqaMyPypDmabL37vw/2aRM98Q==", + "version": "0.29.1", + "resolved": "https://registry.npmjs.org/react-reconciler/-/react-reconciler-0.29.1.tgz", + "integrity": "sha512-xyrmljHU7F5cn1jngF+qPlbSZwstjSOW2BYwkv2LTIv37/BOCJ1XW7Z4iyMxofRJexBueKkhmlX8G2Y01hQx9w==", "dependencies": { "loose-envify": "^1.1.0", - "scheduler": "^0.23.0" + "scheduler": "^0.23.1" }, "engines": { "node": ">=0.10.0" }, "peerDependencies": { - "react": "^18.2.0" + "react": "^18.3.0" } }, "node_modules/react-remove-scroll": { @@ -10624,11 +10634,11 @@ } }, "node_modules/react-router": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.22.3.tgz", - "integrity": "sha512-dr2eb3Mj5zK2YISHK++foM9w4eBnO23eKnZEDs7c880P6oKbrjz/Svg9+nxqtHQK+oMW4OtjZca0RqPglXxguQ==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.0.tgz", + "integrity": "sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==", "dependencies": { - "@remix-run/router": "1.15.3" + "@remix-run/router": "1.16.0" }, "engines": { "node": ">=14.0.0" @@ -10638,12 +10648,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.22.3", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.22.3.tgz", - "integrity": "sha512-7ZILI7HjcE+p31oQvwbokjk6OA/bnFxrhJ19n82Ex9Ph8fNAq+Hm/7KchpMGlTgWhUxRHMMCut+vEtNpWpowKw==", + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.0.tgz", + "integrity": "sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==", "dependencies": { - "@remix-run/router": "1.15.3", - "react-router": "6.22.3" + "@remix-run/router": "1.16.0", + "react-router": "6.23.0" }, "engines": { "node": ">=14.0.0" @@ -10691,24 +10701,24 @@ } }, "node_modules/react18-json-view": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.7.tgz", - "integrity": "sha512-u1H0ZrjrYZUuXEyjcMU+/lVbFi890SNacTcYQT+e7/TI7OeczHyLwcngY4JbtZgfhwjIU078O1+NKh97IVVwZw==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/react18-json-view/-/react18-json-view-0.2.8.tgz", + "integrity": "sha512-uJlcf5PEDaba6yTqfcDAcMSYECZ15SLcpP94mLFTa/+fa1kZANjERqKzS7YxxsrGP4+jDxt6sIaglR0PbQcKPw==", "peerDependencies": { "react": ">=16.8.0" } }, "node_modules/reactflow": { - "version": "11.10.4", - "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.10.4.tgz", - "integrity": "sha512-0CApYhtYicXEDg/x2kvUHiUk26Qur8lAtTtiSlptNKuyEuGti6P1y5cS32YGaUoDMoCqkm/m+jcKkfMOvSCVRA==", + "version": "11.11.2", + "resolved": "https://registry.npmjs.org/reactflow/-/reactflow-11.11.2.tgz", + "integrity": "sha512-o1fT3stSdhzW+SedCGNSmEvZvULZygZIMLyW67NcWNZrgwx1wuJfzLg5fuQ0Nzf389wItumZX/zP3zdaPX7lEw==", "dependencies": { - "@reactflow/background": "11.3.9", - "@reactflow/controls": "11.2.9", - "@reactflow/core": "11.10.4", - "@reactflow/minimap": "11.7.9", - "@reactflow/node-resizer": "2.2.9", - "@reactflow/node-toolbar": "1.3.9" + "@reactflow/background": "11.3.12", + "@reactflow/controls": "11.2.12", + "@reactflow/core": "11.11.2", + "@reactflow/minimap": "11.7.12", + "@reactflow/node-resizer": "2.2.12", + "@reactflow/node-toolbar": "1.3.12" }, "peerDependencies": { "react": ">=17", @@ -11086,9 +11096,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.1.tgz", + "integrity": "sha512-5GKS5JGfiah1O38Vfa9srZE4s3wdHbwjlCrvIookrg2FO9aIwKLOJXuJQFlEfNcVSOXuaL2hzDeY20uVXcUtrw==", "dependencies": { "loose-envify": "^1.1.0" } @@ -12086,9 +12096,9 @@ } }, "node_modules/typescript": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", - "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", "devOptional": true, "bin": { "tsc": "bin/tsc", @@ -12122,11 +12132,11 @@ } }, "node_modules/undici": { - "version": "6.10.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-6.10.2.tgz", - "integrity": "sha512-HcVuBy7ACaDejIMdwCzAvO22OsiE6ir6ziTIr9kAE0vB+PheVe29ZvRN8p7FXCO2uZHTjEoUs5bPiFpuc/hwwQ==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.14.1.tgz", + "integrity": "sha512-mAel3i4BsYhkeVPXeIPXVGPJKeBzqCieZYoFsbWfUzd68JmHByhc1Plit5WlylxXFaGpgkZB8mExlxnt+Q1p7A==", "engines": { - "node": ">=18.0" + "node": ">=18.17" } }, "node_modules/unified": { @@ -13238,9 +13248,9 @@ } }, "node_modules/zod": { - "version": "3.22.4", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.22.4.tgz", - "integrity": "sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==", + "version": "3.23.4", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.4.tgz", + "integrity": "sha512-/AtWOKbBgjzEYYQRNfoGKHObgfAZag6qUJX1VbHo2PRBgS+wfWagEY2mizjfyAPcGesrJOcx/wcl0L9WnVrHFw==", "funding": { "url": "https://github.com/sponsors/colinhacks" } diff --git a/src/frontend/package.json b/src/frontend/package.json index 49d3fe5ba..9b95e7acc 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -26,6 +26,7 @@ "@tailwindcss/line-clamp": "^0.4.4", "@types/axios": "^0.14.0", "ace-builds": "^1.24.1", + "ag-grid-community": "^31.2.1", "ag-grid-react": "^31.2.1", "ansi-to-html": "^0.7.2", "axios": "^1.5.0", diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index d816b55b1..754cc4dda 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -1,14 +1,20 @@ import "ag-grid-community/styles/ag-grid.css"; // Mandatory CSS required by the grid import "ag-grid-community/styles/ag-theme-quartz.css"; // Optional Theme applied to the grid import { AgGridReact } from "ag-grid-react"; +import { ColDef,ColGroupDef } from 'ag-grid-community'; import { useState } from "react"; import { Card, CardContent, CardFooter } from "../ui/card"; export default function TableComponent() { // Column Definitions: Defines the columns to be displayed. - const [colDefs, setColDefs] = useState([ - { headerName: "Variable Name", field: "name", flex: 1, editable: true }, //This column will be twice as wide as the others + const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ + { headerName: "Variable Name", + field: "name", + flex: 1, + editable: true + }, //This column will be twice as wide as the others { + field: "type", cellEditor: "agSelectCellEditor", cellEditorParams: { From 2474cd348ef3a7dc5ef0dc17f27c52dfb9776e85 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Fri, 26 Apr 2024 13:40:54 -0300 Subject: [PATCH 021/142] Refactor CollectionCardComponent to improve code readability and fix loadingPlayground state handling --- .../src/components/cardComponent/index.tsx | 38 +++++++++++++------ 1 file changed, 26 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 04f009d22..f342960ab 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -20,6 +20,10 @@ import { } from "../ui/card"; import IOModal from "../../modals/IOModal"; import useFlowStore from "../../stores/flowStore"; +import { set } from "lodash"; +import LoadingComponent from "../loadingComponent"; +import { f } from "million/dist/shared/million.9d4df3c1"; +import Loading from "../ui/loading"; export default function CollectionCardComponent({ data, @@ -59,20 +63,21 @@ export default function CollectionCardComponent({ const setEdges = useFlowStore((state) => state.setEdges); const [openPlayground, setOpenPlayground] = useState(false); const setCurrentFlowId = useFlowsManagerStore((state) => state.setCurrentFlowId); + const [loadingPlayground, setLoadingPlayground] = useState(false); const name = data.is_component ? "Component" : "Flow"; - async function getFlowData(){ + async function getFlowData() { const res = await getComponent(data.id) - const newFlow = cloneFLowWithParent(res, res.id, data.is_component,true); + const newFlow = cloneFLowWithParent(res, res.id, data.is_component, true); return newFlow; } useEffect(() => { if (currentFlowId && playground) { - setNodes(currentFlow?.data?.nodes ?? [],true); - setEdges(currentFlow?.data?.edges ?? [],true); + setNodes(currentFlow?.data?.nodes ?? [], true); + setEdges(currentFlow?.data?.edges ?? [], true); cleanFlowPool(); } }, [currentFlowId]); @@ -373,6 +378,7 @@ export default function CollectionCardComponent({ {button && button} {playground && + + + + ); } diff --git a/src/frontend/src/style/ag-theme-shadcn.css b/src/frontend/src/style/ag-theme-shadcn.css new file mode 100644 index 000000000..dfe61f229 --- /dev/null +++ b/src/frontend/src/style/ag-theme-shadcn.css @@ -0,0 +1,22 @@ +/* set the background color of many elements across the grid */ +.ag-theme-quartz { + --ag-foreground-color: hsl(222 47% 11%); + --ag-background-color: hsl(0 0% 100%); + --ag-secondary-foreground-color: hsl(215 16% 46%); + --ag-data-color: hsl(222 47% 11%); + --ag-header-foreground-color: hsl(222 47% 11%); + --ag-header-background-color: hsl(210 40% 98%); + --ag-tooltip-background-color: hsl(210 40% 98%); + --ag-disabled-foreground-color: hsl(214 32% 91%); + + /* Add more color variables based on the ShadCN color palette */ + + --ag-border-color: hsl(214 32% 91%); + --ag-selected-row-background-color: hsl(210 40% 98%); + --ag-menu-background-color: hsl(210 40% 98%); + --ag-panel-background-color: hsl(210 40% 98%); + --ag-row-hover-color: hsl(210 40% 98%); + /* Set more color variables as per the ShadCN color scheme */ + +} + From be0bb512547bc06005b1fa1837fd133e0440af52 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Sun, 28 Apr 2024 22:50:09 +0200 Subject: [PATCH 031/142] Updated colors on dark mode --- src/frontend/src/style/ag-theme-shadcn.css | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/frontend/src/style/ag-theme-shadcn.css b/src/frontend/src/style/ag-theme-shadcn.css index dfe61f229..408f1e34e 100644 --- a/src/frontend/src/style/ag-theme-shadcn.css +++ b/src/frontend/src/style/ag-theme-shadcn.css @@ -20,3 +20,23 @@ } +.ag-theme-quartz-dark{ + --ag-foreground-color: hsl(213 31% 91%); + --ag-background-color: 224 35% 7.5%; + --ag-secondary-foreground-color: hsl(215 16% 46%); + --ag-data-color: hsl(210 20% 80%); + --ag-header-foreground-color: hsl(210 20% 80%); + --ag-header-background-color: hsl(223 27% 11%); + --ag-tooltip-background-color: hsl(223 27% 11%); + --ag-disabled-foreground-color: hsl(216 34% 17%); + + /* Add more color variables based on the ShadCN color palette */ + + --ag-border-color: hsl(216 34% 17%); + --ag-selected-row-background-color: 222.2 27.4% 1.2%; + --ag-menu-background-color: 222.2 27.4% 1.2%; + --ag-panel-background-color: 222.2 27.4% 1.2%; + --ag-row-hover-color: 222.2 27.4% 1.2%; + +} + From 358f53d837fb218a28d71e52f475050521f117c8 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Sun, 28 Apr 2024 23:00:21 +0200 Subject: [PATCH 032/142] Added pagination --- .../src/components/tableComponent/index.tsx | 27 ++----------------- 1 file changed, 2 insertions(+), 25 deletions(-) diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 12688845f..05d1ecd97 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -77,33 +77,10 @@ export default function TableComponent() {
- -
-
-
- Showing 1-3 of 3 products -
-
- - -
+
); From 3696aef55769b02ff0315fb82c0b52d272fd90d9 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Sun, 28 Apr 2024 23:11:57 +0200 Subject: [PATCH 033/142] Fixed colors with the variables --- src/frontend/src/style/ag-theme-shadcn.css | 54 ++++++---------------- 1 file changed, 14 insertions(+), 40 deletions(-) diff --git a/src/frontend/src/style/ag-theme-shadcn.css b/src/frontend/src/style/ag-theme-shadcn.css index 408f1e34e..ca8c2a126 100644 --- a/src/frontend/src/style/ag-theme-shadcn.css +++ b/src/frontend/src/style/ag-theme-shadcn.css @@ -1,42 +1,16 @@ /* set the background color of many elements across the grid */ -.ag-theme-quartz { - --ag-foreground-color: hsl(222 47% 11%); - --ag-background-color: hsl(0 0% 100%); - --ag-secondary-foreground-color: hsl(215 16% 46%); - --ag-data-color: hsl(222 47% 11%); - --ag-header-foreground-color: hsl(222 47% 11%); - --ag-header-background-color: hsl(210 40% 98%); - --ag-tooltip-background-color: hsl(210 40% 98%); - --ag-disabled-foreground-color: hsl(214 32% 91%); - - /* Add more color variables based on the ShadCN color palette */ - - --ag-border-color: hsl(214 32% 91%); - --ag-selected-row-background-color: hsl(210 40% 98%); - --ag-menu-background-color: hsl(210 40% 98%); - --ag-panel-background-color: hsl(210 40% 98%); - --ag-row-hover-color: hsl(210 40% 98%); - /* Set more color variables as per the ShadCN color scheme */ - +.ag-theme-shadcn { + --ag-foreground-color: hsl(var(--foreground)); + --ag-background-color: hsl(var(--background)); + --ag-secondary-foreground-color: hsl(var(--secondary-foreground)); + --ag-data-color: hsl(var(--foreground)); + --ag-header-foreground-color: hsl(var(--foreground)); + --ag-header-background-color: hsl(var(--muted)); + --ag-tooltip-background-color: hsl(var(--muted)); + --ag-disabled-foreground-color: hsl(var(--muted-foreground)); + --ag-border-color: hsl(var(--border)); + --ag-selected-row-background-color: hsl(var(--accent)); + --ag-menu-background-color: hsl(var(--accent)); + --ag-panel-background-color: hsl(var(--accent)); + --ag-row-hover-color: hsl(var(--accent)); } - -.ag-theme-quartz-dark{ - --ag-foreground-color: hsl(213 31% 91%); - --ag-background-color: 224 35% 7.5%; - --ag-secondary-foreground-color: hsl(215 16% 46%); - --ag-data-color: hsl(210 20% 80%); - --ag-header-foreground-color: hsl(210 20% 80%); - --ag-header-background-color: hsl(223 27% 11%); - --ag-tooltip-background-color: hsl(223 27% 11%); - --ag-disabled-foreground-color: hsl(216 34% 17%); - - /* Add more color variables based on the ShadCN color palette */ - - --ag-border-color: hsl(216 34% 17%); - --ag-selected-row-background-color: 222.2 27.4% 1.2%; - --ag-menu-background-color: 222.2 27.4% 1.2%; - --ag-panel-background-color: 222.2 27.4% 1.2%; - --ag-row-hover-color: 222.2 27.4% 1.2%; - -} - From 7b79bfeeaf6ca868bde55cd53e95d274cf436494 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Sun, 28 Apr 2024 23:33:35 +0200 Subject: [PATCH 034/142] Fixed sizing and colors to fit blocks table --- src/frontend/src/style/ag-theme-shadcn.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/style/ag-theme-shadcn.css b/src/frontend/src/style/ag-theme-shadcn.css index ca8c2a126..f1a124468 100644 --- a/src/frontend/src/style/ag-theme-shadcn.css +++ b/src/frontend/src/style/ag-theme-shadcn.css @@ -4,8 +4,8 @@ --ag-background-color: hsl(var(--background)); --ag-secondary-foreground-color: hsl(var(--secondary-foreground)); --ag-data-color: hsl(var(--foreground)); - --ag-header-foreground-color: hsl(var(--foreground)); - --ag-header-background-color: hsl(var(--muted)); + --ag-header-foreground-color: hsl(var(--muted-foreground)); + --ag-header-background-color: hsl(var(--background)); --ag-tooltip-background-color: hsl(var(--muted)); --ag-disabled-foreground-color: hsl(var(--muted-foreground)); --ag-border-color: hsl(var(--border)); @@ -13,4 +13,5 @@ --ag-menu-background-color: hsl(var(--accent)); --ag-panel-background-color: hsl(var(--accent)); --ag-row-hover-color: hsl(var(--accent)); + --ag-header-height: 2.5rem; } From 366ce591cbd6ee92dc21ab5dae6d57b57b6ca92f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Mon, 29 Apr 2024 09:53:56 -0300 Subject: [PATCH 035/142] Add default_fields column to the variable table --- .../1f4d6df60295_add_default_fields_column.py | 45 +++++++++++++++++++ src/backend/base/langflow/api/v1/variable.py | 4 +- .../database/models/variable/model.py | 7 ++- 3 files changed, 52 insertions(+), 4 deletions(-) create mode 100644 src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.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 new file mode 100644 index 000000000..7b69058c2 --- /dev/null +++ b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py @@ -0,0 +1,45 @@ +"""Add default_fields column + +Revision ID: 1f4d6df60295 +Revises: 58b28437a398 +Create Date: 2024-04-29 09:49:46.864145 + +""" + +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 = "1f4d6df60295" +down_revision: Union[str, None] = "58b28437a398" +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 + 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: + if "default_fields" not in column_names: + batch_op.add_column(sa.Column("default_fields", sa.JSON(), nullable=True)) + + # ### end Alembic commands ### + + +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: + if "default_fields" in column_names: + batch_op.drop_column("default_fields") + + # ### end Alembic commands ### diff --git a/src/backend/base/langflow/api/v1/variable.py b/src/backend/base/langflow/api/v1/variable.py index 123086676..b1cca14c1 100644 --- a/src/backend/base/langflow/api/v1/variable.py +++ b/src/backend/base/langflow/api/v1/variable.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timezone from uuid import UUID from fastapi import APIRouter, Depends, HTTPException @@ -85,7 +85,7 @@ def update_variable( variable_data = variable.model_dump(exclude_unset=True) for key, value in variable_data.items(): setattr(db_variable, key, value) - db_variable.updated_at = datetime.utcnow() + db_variable.updated_at = datetime.now(timezone.utc) session.commit() session.refresh(db_variable) return db_variable 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 1fab92b4c..cf2236fe1 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -1,8 +1,8 @@ from datetime import datetime, timezone -from typing import TYPE_CHECKING, Optional +from typing import TYPE_CHECKING, List, Optional from uuid import UUID, uuid4 -from sqlmodel import Column, DateTime, Field, Relationship, SQLModel, func +from sqlmodel import JSON, Column, DateTime, Field, Relationship, SQLModel, func if TYPE_CHECKING: from langflow.services.database.models.user.model import User @@ -15,6 +15,7 @@ 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") + default_fields: Optional[List[str]] = Field(sa_column=Column(JSON)) type: Optional[str] = Field(None, description="Type of the variable") @@ -35,6 +36,7 @@ class Variable(VariableBase, table=True): sa_column=Column(DateTime(timezone=True), nullable=True), description="Last update time of the variable", ) + default_fields: Optional[List[str]] = Field(sa_column=Column(JSON)) # foreign key to user table user_id: UUID = Field(description="User ID associated with this variable", foreign_key="user.id") user: "User" = Relationship(back_populates="variables") @@ -56,3 +58,4 @@ class VariableUpdate(SQLModel): id: UUID # Include the ID for updating name: Optional[str] = Field(None, description="Name of the variable") value: Optional[str] = Field(None, description="Encrypted value of the variable") + default_fields: Optional[List[str]] = Field(None, description="Default fields for the variable") From 01ebe97f3ae87e0ad68d539ebd730ce0d42b48e9 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 29 Apr 2024 19:05:18 +0200 Subject: [PATCH 036/142] Fixed footer height --- src/frontend/src/style/ag-theme-shadcn.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/frontend/src/style/ag-theme-shadcn.css b/src/frontend/src/style/ag-theme-shadcn.css index f1a124468..3605d53b3 100644 --- a/src/frontend/src/style/ag-theme-shadcn.css +++ b/src/frontend/src/style/ag-theme-shadcn.css @@ -15,3 +15,7 @@ --ag-row-hover-color: hsl(var(--accent)); --ag-header-height: 2.5rem; } + +.ag-theme-shadcn .ag-paging-panel { + height: 3rem; +} From 51a3d651149982b7247a067fb0f2048499263af7 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 29 Apr 2024 19:08:14 +0200 Subject: [PATCH 037/142] Fixed editability of variable name --- src/frontend/src/components/tableComponent/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 05d1ecd97..6ebb12af4 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -11,7 +11,7 @@ import { Button } from "../ui/button"; export default function TableComponent() { // Column Definitions: Defines the columns to be displayed. const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ - { headerName: "Variable Name", field: "name", flex: 1, editable: true }, //This column will be twice as wide as the others + { headerName: "Variable Name", field: "name", flex: 1 }, //This column will be twice as wide as the others { field: "type", cellEditor: "agSelectCellEditor", From f14b8831bfac329d0b18c84be5fd7128731a9cd6 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 29 Apr 2024 19:18:03 +0200 Subject: [PATCH 038/142] Modified title to be on pair with modals --- src/frontend/src/components/tableComponent/index.tsx | 2 +- src/frontend/src/pages/GlobalVariablesPage/index.tsx | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 6ebb12af4..50cb15521 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -30,7 +30,7 @@ export default function TableComponent() { editable: true, }, { - headerName: "Default Fields", + headerName: "Apply To Fields", field: "defaultFields", flex: 1, editable: true, diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index 41e72bcc0..e8bcc0547 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -1,6 +1,7 @@ import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; +import ForwardedIconComponent from "../../components/genericIconComponent"; import TableComponent from "../../components/tableComponent"; export default function GlobalVariablesPage() { @@ -8,8 +9,11 @@ export default function GlobalVariablesPage() {
-

Global Variables

-

+

+ Global Variables + +

+

Manage and assign global variables to default fields. You can add new global variables by clicking the button.

@@ -17,7 +21,7 @@ export default function GlobalVariablesPage() {
From 8dac69708fc660452e3c92b26bf29a90ab38076b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 14:22:04 -0300 Subject: [PATCH 039/142] Add avaliableFields functionality to GlobalVariablesStore --- src/frontend/src/stores/globalVariables.ts | 7 +++++++ src/frontend/src/stores/typesStore.ts | 1 + src/frontend/src/types/zustand/globalVariables/index.ts | 3 +++ 3 files changed, 11 insertions(+) diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index e2f3e37df..6cbb8a641 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -3,6 +3,13 @@ import { GlobalVariablesStore } from "../types/zustand/globalVariables"; export const useGlobalVariablesStore = create( (set, get) => ({ + avaliableFields: [], + setAvaliableFields: (fields) => { + set({ avaliableFields: fields }); + }, + addAvaliableField: (field) => { + set({ avaliableFields: [...get().avaliableFields, field] }); + }, globalVariablesEntries: [], globalVariables: {}, setGlobalVariables: (variables) => { diff --git a/src/frontend/src/stores/typesStore.ts b/src/frontend/src/stores/typesStore.ts index 142118f44..95223087f 100644 --- a/src/frontend/src/stores/typesStore.ts +++ b/src/frontend/src/stores/typesStore.ts @@ -24,6 +24,7 @@ export const useTypesStore = create((set, get) => ({ templates: templatesGenerator(data), })); setLoading(false); + console.log(templatesGenerator(data)) resolve(); }) .catch((error) => { diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 3e651179e..fbf7f0675 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -7,4 +7,7 @@ export type GlobalVariablesStore = { addGlobalVariable: (name: string, id: string, type?: string) => void; removeGlobalVariable: (name: string) => void; getVariableId: (name: string) => string | undefined; + avaliableFields: Array; + setAvaliableFields: (fields: Array) => void; + addAvaliableField: (field: string) => void; }; From 793a025163571eda48fb9339569a90baf94a708c Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 29 Apr 2024 19:22:44 +0200 Subject: [PATCH 040/142] Fixed title of global pages --- src/frontend/src/pages/GlobalVariablesPage/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index e8bcc0547..d02776c44 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -11,7 +11,7 @@ export default function GlobalVariablesPage() {

Global Variables - +

Manage and assign global variables to default fields. You can add From 979dae8c49833c7679dfa2ce6bdbc730461f011f Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 15:57:46 -0300 Subject: [PATCH 041/142] Add extractFieldsFromComponenents function to reactflowUtils.ts --- src/frontend/src/utils/reactflowUtils.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index 4cd19bf7e..49aae5b7a 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1234,6 +1234,19 @@ export function templatesGenerator(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); + }); + }); + }); + return Array.from(fields); +} + export function downloadFlow( flow: FlowType, flowName: string, From df8cbff32f3cf6f74c45374362762cbe3bfa4045 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Mon, 29 Apr 2024 23:03:16 +0200 Subject: [PATCH 042/142] Added Add New Variable --- .../src/pages/GlobalVariablesPage/index.tsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index d02776c44..5d3b3a981 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -1,6 +1,7 @@ import IconComponent from "../../components/genericIconComponent"; import { Button } from "../../components/ui/button"; +import AddNewVariableButton from "../../components/addNewVariableButtonComponent/addNewVariableButton"; import ForwardedIconComponent from "../../components/genericIconComponent"; import TableComponent from "../../components/tableComponent"; @@ -11,7 +12,10 @@ export default function GlobalVariablesPage() {

Global Variables - +

Manage and assign global variables to default fields. You can add @@ -19,10 +23,12 @@ export default function GlobalVariablesPage() {

- + + +
From b06501a4c93db07d06a459247a7e6f935a34f58a Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Mon, 29 Apr 2024 18:07:53 -0300 Subject: [PATCH 043/142] =?UTF-8?q?=E2=9C=A8=20(JsonInput.py):=20add=20a?= =?UTF-8?q?=20new=20component=20called=20"JsonInput"=20to=20handle=20JSON?= =?UTF-8?q?=20input=20data=20in=20the=20language=20flow=20system=20?= =?UTF-8?q?=E2=9C=A8=20(KeyPairInput.py):=20add=20a=20new=20component=20ca?= =?UTF-8?q?lled=20"KeyPairInput"=20to=20handle=20dictionary=20input=20data?= =?UTF-8?q?=20in=20the=20language=20flow=20system=20=E2=9C=A8=20(CSVOutput?= =?UTF-8?q?.py):=20add=20a=20new=20component=20called=20"CSVOutput"=20to?= =?UTF-8?q?=20handle=20CSV=20output=20data=20in=20the=20language=20flow=20?= =?UTF-8?q?system=20=E2=9C=A8=20(ImageOutput.py):=20add=20a=20new=20compon?= =?UTF-8?q?ent=20called=20"ImageOutput"=20to=20handle=20image=20output=20d?= =?UTF-8?q?ata=20in=20the=20language=20flow=20system=20=E2=9C=A8=20(JsonOu?= =?UTF-8?q?tput.py):=20add=20a=20new=20component=20called=20"JsonOutput"?= =?UTF-8?q?=20to=20handle=20JSON=20output=20data=20in=20the=20language=20f?= =?UTF-8?q?low=20system=20=E2=9C=A8=20(PDFOutput.py):=20add=20a=20new=20co?= =?UTF-8?q?mponent=20called=20"PDFOutput"=20to=20handle=20PDF=20output=20d?= =?UTF-8?q?ata=20in=20the=20language=20flow=20system=20=F0=9F=93=9D=20(App?= =?UTF-8?q?.css):=20update=20CSS=20to=20improve=20readability=20and=20form?= =?UTF-8?q?atting=20=F0=9F=93=9D=20(parameterComponent/index.tsx):=20fix?= =?UTF-8?q?=20a=20bug=20where=20rangeSpec=20is=20not=20properly=20accessed?= =?UTF-8?q?=20in=20the=20FloatComponent=20=F0=9F=93=9D=20(cardComponent/in?= =?UTF-8?q?dex.tsx):=20update=20the=20CollectionCardComponent=20to=20inclu?= =?UTF-8?q?de=20a=20new=20button=20for=20opening=20the=20playground=20and?= =?UTF-8?q?=20handle=20the=20opening=20and=20closing=20of=20the=20IOModal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 📝 (codeTabsComponent/index.tsx): fix conditional rendering of InputListComponent by using optional chaining operator to check if the list property exists in the template object 📝 (keypairListComponent/index.tsx): refactor the initialization of the ref variable to handle both empty and non-empty values correctly 📝 (constants.ts): add "JsonInput" and "JsonOutput" to the INPUT_TYPES and OUTPUT_TYPES constants to support JSON input and output components 📝 (editNodeModal/index.tsx): fix conditional rendering of InputListComponent by using optional chaining operator to check if the list property exists in the template object 📝 (ioFieldView/components/JSONInput/index.tsx): add JSONInput component to handle JSON input in the IOFieldView component 📝 (ioFieldView/components/keyPairInput/index.tsx): add keyPairInput component to handle key-value pair input in the IOFieldView component ✨ (IOFieldView/index.tsx): add useState import to use state hook in functional component ✨ (IOFieldView/index.tsx): add support for KeyPairInput component in IOFieldView ✨ (IOFieldView/index.tsx): add support for JsonInput component in IOFieldView ✨ (IOFieldView/index.tsx): add support for JsonOutput component in IOFieldView 📝 (dictAreaModal/index.tsx): add useDarkStore import to use dark mode state in DictAreaModal component 📝 (classes.css): add CSS classes for json-view component in different themes 📝 (types/components/index.ts): remove duplicate InputGlobalComponentType definition --- .../langflow/components/inputs/JsonInput.py | 17 ++++ .../components/inputs/KeyPairInput.py | 19 ++++ .../langflow/components/outputs/CSVOutput.py | 17 ++++ .../components/outputs/ImageOutput.py | 15 +++ .../langflow/components/outputs/JsonOutput.py | 17 ++++ .../langflow/components/outputs/PDFOutput.py | 16 ++++ src/frontend/src/App.css | 14 ++- .../components/parameterComponent/index.tsx | 2 +- .../src/components/cardComponent/index.tsx | 40 ++++---- .../components/codeTabsComponent/index.tsx | 4 +- .../components/keypairListComponent/index.tsx | 8 +- src/frontend/src/constants/constants.ts | 8 +- .../src/modals/EditNodeModal/index.tsx | 8 +- .../components/JSONInput/index.tsx | 45 +++++++++ .../components/keyPairInput/index.tsx | 91 +++++++++++++++++++ .../IOModal/components/IOFieldView/index.tsx | 57 ++++++++++++ .../src/modals/dictAreaModal/index.tsx | 6 +- src/frontend/src/style/classes.css | 28 ++++++ src/frontend/src/types/components/index.ts | 13 +-- 19 files changed, 386 insertions(+), 39 deletions(-) create mode 100644 src/backend/base/langflow/components/inputs/JsonInput.py create mode 100644 src/backend/base/langflow/components/inputs/KeyPairInput.py create mode 100644 src/backend/base/langflow/components/outputs/CSVOutput.py create mode 100644 src/backend/base/langflow/components/outputs/ImageOutput.py create mode 100644 src/backend/base/langflow/components/outputs/JsonOutput.py create mode 100644 src/backend/base/langflow/components/outputs/PDFOutput.py create mode 100644 src/frontend/src/modals/IOModal/components/IOFieldView/components/JSONInput/index.tsx create mode 100644 src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx diff --git a/src/backend/base/langflow/components/inputs/JsonInput.py b/src/backend/base/langflow/components/inputs/JsonInput.py new file mode 100644 index 000000000..713868147 --- /dev/null +++ b/src/backend/base/langflow/components/inputs/JsonInput.py @@ -0,0 +1,17 @@ +from langflow.base.io.text import TextComponent +from langflow.field_typing.constants import Data, NestedDict + +class JsonInput(TextComponent): + display_name = "JSON Input" + description = "JSON Input." + + def build_config(self): + return { + "input_value": { + "display_name": "JSON", + "field_type": "NestedDict" + } + } + + def build(self, input_value: NestedDict) -> NestedDict: + return input_value diff --git a/src/backend/base/langflow/components/inputs/KeyPairInput.py b/src/backend/base/langflow/components/inputs/KeyPairInput.py new file mode 100644 index 000000000..c48d0a0e1 --- /dev/null +++ b/src/backend/base/langflow/components/inputs/KeyPairInput.py @@ -0,0 +1,19 @@ +from langflow.base.io.text import TextComponent +from langflow.field_typing.constants import Data + + +class KeyPairInput(TextComponent): + display_name = "Dictionary Input" + description = "Dictionary Input." + + def build_config(self): + return { + "input_value": { + "display_name": "Dictionaries", + "field_type": "dict", + "list": True + } + } + + def build(self, input_value: dict) -> dict: + return input_value diff --git a/src/backend/base/langflow/components/outputs/CSVOutput.py b/src/backend/base/langflow/components/outputs/CSVOutput.py new file mode 100644 index 000000000..711a6ab96 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/CSVOutput.py @@ -0,0 +1,17 @@ +from typing import Optional + +from langflow.base.io.text import TextComponent +from langflow.field_typing import Text, Data + + +class CSVOutput(TextComponent): + display_name = "CSV Output" + description = "Used view csv files" + + field_config = { + "input_value": {"display_name": "csv","info":"A csv blob","input_types":["Data"]}, + "separator": {"display_name": "separator","info":"The separator used in the csv file","input_types":["Text"], "field_type":"Text","default_value":";","options":[";", ",", "|"]}, + } + + def build(self, input_value: Data, separator) -> Data: + return {"data": input_value, "separator": separator} diff --git a/src/backend/base/langflow/components/outputs/ImageOutput.py b/src/backend/base/langflow/components/outputs/ImageOutput.py new file mode 100644 index 000000000..f50fb7bf7 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/ImageOutput.py @@ -0,0 +1,15 @@ +from typing import Optional + +from langflow.base.io.text import TextComponent +from langflow.field_typing import Text + +class ImageOutput(TextComponent): + display_name = "Image Output" + description = "Used view image files" + + field_config = { + "input_value": {"display_name": "image","info":"A image url","input_types":["Text"]}, + } + + def build(self, input_value: Text) -> Text: + return input_value \ No newline at end of file diff --git a/src/backend/base/langflow/components/outputs/JsonOutput.py b/src/backend/base/langflow/components/outputs/JsonOutput.py new file mode 100644 index 000000000..cbbc10ddc --- /dev/null +++ b/src/backend/base/langflow/components/outputs/JsonOutput.py @@ -0,0 +1,17 @@ +from langflow.base.io.text import TextComponent +from langflow.field_typing.constants import Data, NestedDict + +class JsonOutput(TextComponent): + display_name = "JSON Output" + description = "JSON Output." + + def build_config(self): + return { + "input_value": { + "display_name": "JSON", + "field_type": "NestedDict" + } + } + + def build(self, input_value: NestedDict) -> NestedDict: + return input_value diff --git a/src/backend/base/langflow/components/outputs/PDFOutput.py b/src/backend/base/langflow/components/outputs/PDFOutput.py new file mode 100644 index 000000000..75e1fabf4 --- /dev/null +++ b/src/backend/base/langflow/components/outputs/PDFOutput.py @@ -0,0 +1,16 @@ +from typing import Optional + +from langflow.base.io.text import TextComponent +from langflow.field_typing import Text + + +class PDFOutput(TextComponent): + display_name = "PDF Output" + description = "Used view pdf files" + + field_config = { + "input_value": {"display_name": "pdf","info":"A pdf url","input_types":["Text"]}, + } + + def build(self, input_value: Text) -> Text: + return input_value diff --git a/src/frontend/src/App.css b/src/frontend/src/App.css index 6aa681415..22a596730 100644 --- a/src/frontend/src/App.css +++ b/src/frontend/src/App.css @@ -96,6 +96,18 @@ body { } .custom-hover:hover { - background-color: rgba(99, 102, 241, 0.1); /* Medium indigo color with 20% opacity */ + background-color: rgba( + 99, + 102, + 241, + 0.1 + ); /* Medium indigo color with 20% opacity */ } +.json-view-playground .json-view { + background-color: #fff !important; +} + +.json-view-flow .json-view { + background-color: #bbb !important; +} diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index eef861758..ad00225b8 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -618,7 +618,7 @@ export default function ParameterComponent({
diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 21701f459..06e87602f 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -1,7 +1,9 @@ import { useEffect, useState } from "react"; import { getComponent, postLikeComponent } from "../../controllers/API"; import DeleteConfirmationModal from "../../modals/DeleteConfirmationModal"; +import IOModal from "../../modals/IOModal"; import useAlertStore from "../../stores/alertStore"; +import useFlowStore from "../../stores/flowStore"; import useFlowsManagerStore from "../../stores/flowsManagerStore"; import { useStoreStore } from "../../stores/storeStore"; import { storeComponent } from "../../types/store"; @@ -18,8 +20,6 @@ import { CardHeader, CardTitle, } from "../ui/card"; -import IOModal from "../../modals/IOModal"; -import useFlowStore from "../../stores/flowStore"; export default function CollectionCardComponent({ data, @@ -27,7 +27,7 @@ export default function CollectionCardComponent({ disabled = false, button, onDelete, - playground + playground, }: { data: storeComponent; authorized?: boolean; @@ -55,9 +55,9 @@ export default function CollectionCardComponent({ const setNodes = useFlowStore((state) => state.setNodes); const setEdges = useFlowStore((state) => state.setEdges); const [openPlayground, setOpenPlayground] = useState(false); - const setCurrentFlowId = useFlowsManagerStore((state) => state.setCurrentFlowId); - - + const setCurrentFlowId = useFlowsManagerStore( + (state) => state.setCurrentFlowId + ); const name = data.is_component ? "Component" : "Flow"; @@ -86,16 +86,18 @@ export default function CollectionCardComponent({ addFlow(true, newFlow) .then((id) => { setSuccessData({ - title: `${name} ${isStore ? "Downloaded" : "Installed" - } Successfully.`, + title: `${name} ${ + isStore ? "Downloaded" : "Installed" + } Successfully.`, }); setLoading(false); }) .catch((error) => { setLoading(false); setErrorData({ - title: `Error ${isStore ? "downloading" : "installing" - } the ${name}`, + title: `Error ${ + isStore ? "downloading" : "installing" + } the ${name}`, list: [error["response"]["data"]["detail"]], }); }); @@ -362,15 +364,13 @@ export default function CollectionCardComponent({
)} {button && button} - {playground && + {playground && ( - } + )} - + ); } diff --git a/src/frontend/src/components/codeTabsComponent/index.tsx b/src/frontend/src/components/codeTabsComponent/index.tsx index 78c344714..3666c61a6 100644 --- a/src/frontend/src/components/codeTabsComponent/index.tsx +++ b/src/frontend/src/components/codeTabsComponent/index.tsx @@ -267,7 +267,7 @@ export default function CodeTabsComponent({
{node.data.node.template[ templateField - ].list ? ( + ]?.list ? (
diff --git a/src/frontend/src/components/keypairListComponent/index.tsx b/src/frontend/src/components/keypairListComponent/index.tsx index fcd35e01e..2fa12e3b8 100644 --- a/src/frontend/src/components/keypairListComponent/index.tsx +++ b/src/frontend/src/components/keypairListComponent/index.tsx @@ -20,7 +20,13 @@ export default function KeypairListComponent({ } }, [disabled]); - const ref = useRef(value.length === 0 ? [{ "": "" }] : value); + const checkValueType = (value) => { + return Array.isArray(value) ? value : [value]; + }; + + const ref = useRef([]); + ref.current = + !value || value?.length === 0 ? [{ "": "" }] : checkValueType(value); useEffect(() => { if (JSON.stringify(value) !== JSON.stringify(ref.current)) { diff --git a/src/frontend/src/constants/constants.ts b/src/frontend/src/constants/constants.ts index 49483875c..f8d45da02 100644 --- a/src/frontend/src/constants/constants.ts +++ b/src/frontend/src/constants/constants.ts @@ -711,13 +711,19 @@ export const LANGFLOW_SUPPORTED_TYPES = new Set([ export const priorityFields = new Set(["code", "template"]); -export const INPUT_TYPES = new Set(["ChatInput", "TextInput", "KeyPairInput"]); +export const INPUT_TYPES = new Set([ + "ChatInput", + "TextInput", + "KeyPairInput", + "JsonInput", +]); export const OUTPUT_TYPES = new Set([ "ChatOutput", "TextOutput", "PDFOutput", "ImageOutput", "CSVOutput", + "JsonOutput", ]); export const CHAT_FIRST_INITIAL_TEXT = diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index 17da8c73b..87c72d1df 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -203,7 +203,7 @@ const EditNodeModal = forwardRef( !myData.node.template[templateParam].options ? (
{myData.node.template[templateParam] - .list ? ( + ?.list ? (
@@ -420,6 +420,10 @@ const EditNodeModal = forwardRef( .type === "int" ? (
{ + if (value) onChange(value); + }, [value]); + const isDark = useDarkStore((state) => state.dark); + + const ref = useRef(null); + ref.current = value; + + const getClassNames = () => { + if (!isDark && !left) return "json-view-playground-white"; + if (!isDark && left) return "json-view-playground-white-left"; + if (isDark && left) return "json-view-playground-dark-left"; + if (isDark && !left) return "json-view-playground-dark"; + }; + + return ( +
+ { + ref.current = edit["src"]; + }} + onChange={(edit) => { + ref.current = edit["src"]; + }} + src={ref.current} + /> +
+ ); +} diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx new file mode 100644 index 000000000..b0b557c55 --- /dev/null +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/components/keyPairInput/index.tsx @@ -0,0 +1,91 @@ +import _ from "lodash"; +import { useRef } from "react"; +import IconComponent from "../../../../../../components/genericIconComponent"; +import { Input } from "../../../../../../components/ui/input"; +import { classNames } from "../../../../../../utils/utils"; + +const IOKeyPairInput = ({ value, onChange, duplicateKey, isList = true }) => { + const checkValueType = (value) => { + return Array.isArray(value) ? value : [value]; + }; + + const ref = useRef([]); + ref.current = + !value || value?.length === 0 ? [{ "": "" }] : checkValueType(value); + + const handleChangeKey = (event, idx) => { + const oldKey = Object.keys(ref.current[idx])[0]; + const updatedObj = { [event.target.value]: ref.current[idx][oldKey] }; + ref.current[idx] = updatedObj; + onChange(ref.current); + }; + + const handleChangeValue = (newValue, idx) => { + const key = Object.keys(ref.current[idx])[0]; + ref.current[idx][key] = newValue; + onChange(ref.current); + }; + + return ( + <> +
+ {ref.current?.map((obj, index) => { + return Object.keys(obj).map((key, idx) => { + return ( +
+ handleChangeKey(event, index)} + /> + + + handleChangeValue(event.target.value, index) + } + /> + + {isList && index === ref.current.length - 1 ? ( + + ) : isList ? ( + + ) : ( + "" + )} +
+ ); + }); + })} +
+ + ); +}; + +export default IOKeyPairInput; diff --git a/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx b/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx index dd02d19ca..468b090fe 100644 --- a/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx +++ b/src/frontend/src/modals/IOModal/components/IOFieldView/index.tsx @@ -1,4 +1,5 @@ import { cloneDeep } from "lodash"; +import { useState } from "react"; import ImageViewer from "../../../../components/ImageViewer"; import CsvOutputComponent from "../../../../components/csvOutputComponent"; import PdfViewer from "../../../../components/pdfViewer"; @@ -15,7 +16,13 @@ import { PDFViewConstant } from "../../../../constants/constants"; import { InputOutput } from "../../../../constants/enums"; import useFlowStore from "../../../../stores/flowStore"; import { IOFieldViewProps } from "../../../../types/components"; +import { + convertValuesToNumbers, + hasDuplicateKeys, +} from "../../../../utils/reactflowUtils"; import IOFileInput from "./components/FileInput"; +import IoJsonInput from "./components/JSONInput"; +import IOKeyPairInput from "./components/keyPairInput"; export default function IOFieldView({ type, @@ -39,6 +46,7 @@ export default function IOFieldView({ } } }; + const [errorDuplicateKey, setErrorDuplicateKey] = useState(false); function handleOutputType() { if (!node) return <>"No node found!"; @@ -78,6 +86,39 @@ export default function IOFieldView({ /> ); + case "KeyPairInput": + return ( + { + if (node) { + let newNode = cloneDeep(node); + newNode.data.node!.template["input_value"].value = e; + setNode(node.id, newNode); + } + const valueToNumbers = convertValuesToNumbers(e); + setErrorDuplicateKey(hasDuplicateKeys(valueToNumbers)); + }} + duplicateKey={errorDuplicateKey} + isList={node.data.node!.template["input_value"]?.list ?? false} + /> + ); + + case "JsonInput": + return ( + { + if (node) { + let newNode = cloneDeep(node); + newNode.data.node!.template["input_value"].value = e; + setNode(node.id, newNode); + } + }} + left={left} + /> + ); + default: return (