From ec94bed45e7fa73c3240e1aa8fd932f42a75593e Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Wed, 24 Apr 2024 00:27:38 +0200 Subject: [PATCH 01/70] 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: Thu, 25 Apr 2024 16:23:09 +0200 Subject: [PATCH 03/70] 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 16bd9f1ee15ff34c9965c7afb754c33fc49b4314 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Fri, 26 Apr 2024 01:32:03 +0200 Subject: [PATCH 04/70] 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 05/70] 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 06/70] 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 04d723d4058cc9dad85ba7329b884242005512c1 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Sun, 28 Apr 2024 19:42:41 +0200 Subject: [PATCH 07/70] Fixed colors of AG Grid --- .../src/components/tableComponent/index.tsx | 51 +++++++++++++------ src/frontend/src/style/ag-theme-shadcn.css | 22 ++++++++ 2 files changed, 57 insertions(+), 16 deletions(-) create mode 100644 src/frontend/src/style/ag-theme-shadcn.css diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 754cc4dda..12688845f 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -1,20 +1,18 @@ +import { ColDef, ColGroupDef } from "ag-grid-community"; 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"; +import { useDarkStore } from "../../stores/darkStore"; +import "../../style/ag-theme-shadcn.css"; // Custom CSS applied to the grid +import { cn } from "../../utils/utils"; +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, editable: true }, //This column will be twice as wide as the others { - field: "type", cellEditor: "agSelectCellEditor", cellEditorParams: { @@ -72,20 +70,41 @@ export default function TableComponent() { }, ]); + const dark = useDarkStore((state) => state.dark); + return ( - - +
- - -
+
+
Showing 1-3 of 3 products
- - +
+ + +
+
+
); } 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 08/70] 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 09/70] 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 10/70] 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 11/70] 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 12/70] 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 13/70] 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 14/70] 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 15/70] 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 16/70] 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 17/70] 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 18/70] 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 19/70] 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 de57b0955f7c9b65a7dc0bdb1342e551827a292d Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Mon, 29 Apr 2024 19:00:18 -0300 Subject: [PATCH 20/70] Feat: Create Shortcuts page on settings --- src/frontend/package-lock.json | 412 +++++++++--------- src/frontend/package.json | 1 + .../components/shortcutsComponent/index.tsx | 104 +++++ .../src/components/tableComponent/index.tsx | 10 +- .../components/shortcutsPage/index.tsx | 25 ++ src/frontend/src/routes.tsx | 3 +- 6 files changed, 351 insertions(+), 204 deletions(-) create mode 100644 src/frontend/src/components/shortcutsComponent/index.tsx create mode 100644 src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx 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/shortcutsComponent/index.tsx b/src/frontend/src/components/shortcutsComponent/index.tsx new file mode 100644 index 000000000..574bacd12 --- /dev/null +++ b/src/frontend/src/components/shortcutsComponent/index.tsx @@ -0,0 +1,104 @@ +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 ShortcutsComponent() { + const advancedShortcut = "Ctrl + shift + A"; + const minizmizeShortcut = "Ctrl + shift + Q"; + const codeShortcut = "Ctrl + shift + C"; + const copyShortcut = "Ctrl + C"; + const duplicateShortcut = "Ctrl + D"; + const shareShortcut = "Ctrl + shift + S"; + const docsShortcut = "Ctrl + shift + D"; + const saveShortcut = "Ctrl + S"; + const deleteShortcut = "Backspace"; + const interactionShortcut = "Ctrl + K"; + const undoShortcut = "Ctrl + Z"; + const redoShortcut = "Ctrl + Y"; + + + // Column Definitions: Defines the columns to be displayed. + const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ + { headerName: "Functionality", + field: "name", + flex: 1, + editable: false + }, //This column will be twice as wide as the others + { + field: "shortcut", + flex: 2, + editable: false, + } + ]); + + const [rowData, setRowData] = useState([ + { + name: "Open node advanced settings", + shortcut: advancedShortcut, + }, + { + name: "Minimize", + shortcut: minizmizeShortcut + }, + { + name: "Open Code modal", + shortcut: codeShortcut, + }, + { + name: "Copy", + shortcut: copyShortcut, + }, + { + name: "Duplicate", + shortcut: duplicateShortcut, + }, + { + name: "Share", + shortcut: shareShortcut, + }, + { + name: "Open docs", + shortcut: docsShortcut, + }, + { + name: "Save", + shortcut: saveShortcut, + }, + { + name: "Delete", + shortcut: deleteShortcut, + }, + { + name: "Open interaction panel", + shortcut: interactionShortcut, + }, + { + name: "Undo", + shortcut: undoShortcut, + }, + { + name: "Redo", + shortcut: redoShortcut, + }, + ]); + + return ( + + +
+ +
+
+ +
+ Showing 1-3 of 3 products +
+
+
+ ); +} 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: { diff --git a/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx b/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx new file mode 100644 index 000000000..b73efd829 --- /dev/null +++ b/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx @@ -0,0 +1,25 @@ + + + +import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import ShortcutsComponent from "../../../../components/shortcutsComponent"; +import { Button } from "../../../../components/ui/button"; + +export default function ShortcutsPage() { + return ( +
+
+
+

Shortcuts

+

+ Manage and assign global shortcuts +

+
+
+ +
+ +
+
+ ); +} diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index 943a953b0..dcacb3ac0 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -19,6 +19,7 @@ import ViewPage from "./pages/ViewPage"; import DeleteAccountPage from "./pages/deleteAccountPage"; import LoginPage from "./pages/loginPage"; import SignUp from "./pages/signUpPage"; +import ShortcutsPage from "./pages/FlowPage/components/shortcutsPage"; const Router = () => { const navigate = useNavigate(); @@ -57,7 +58,7 @@ const Router = () => { > } /> } /> - } /> + } /> Date: Tue, 30 Apr 2024 00:10:33 +0200 Subject: [PATCH 21/70] Passed Table props to page --- src/frontend/package-lock.json | 4 +- src/frontend/package.json | 4 +- .../src/components/tableComponent/index.tsx | 92 ++++--------------- .../src/pages/GlobalVariablesPage/index.tsx | 65 ++++++++++++- 4 files changed, 84 insertions(+), 81 deletions(-) diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 5e6b7fe67..e7c71d62b 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -48,10 +48,10 @@ "million": "^3.0.6", "moment": "^2.29.4", "playwright": "^1.42.0", - "react": "^18.2.0", + "react": "^18.2.21", "react-ace": "^10.1.0", "react-cookie": "^4.1.1", - "react-dom": "^18.2.0", + "react-dom": "^18.2.21", "react-error-boundary": "^4.0.11", "react-icons": "^5.0.1", "react-laag": "^2.0.5", diff --git a/src/frontend/package.json b/src/frontend/package.json index 9b95e7acc..26dc911af 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -43,10 +43,10 @@ "million": "^3.0.6", "moment": "^2.29.4", "playwright": "^1.42.0", - "react": "^18.2.0", + "react": "^18.2.21", "react-ace": "^10.1.0", "react-cookie": "^4.1.1", - "react-dom": "^18.2.0", + "react-dom": "^18.2.21", "react-error-boundary": "^4.0.11", "react-icons": "^5.0.1", "react-laag": "^2.0.5", diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 43a9106b1..20b9083d9 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -1,89 +1,29 @@ -import { ColDef, ColGroupDef } from "ag-grid-community"; 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 { ComponentPropsWithoutRef, ElementRef, forwardRef } from "react"; import { useDarkStore } from "../../stores/darkStore"; import "../../style/ag-theme-shadcn.css"; // Custom CSS applied to the grid import { cn } from "../../utils/utils"; -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 }, //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: "Apply To 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"], - }, - ]); +const TableComponent = forwardRef< + ElementRef, + ComponentPropsWithoutRef +>(({ ...props }, ref) => { const dark = useDarkStore((state) => state.dark); return (
-
- -
+
+ +
); -} +}); + +export default TableComponent; diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/GlobalVariablesPage/index.tsx index 5d3b3a981..ed4092413 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/GlobalVariablesPage/index.tsx @@ -4,8 +4,71 @@ import { Button } from "../../components/ui/button"; import AddNewVariableButton from "../../components/addNewVariableButtonComponent/addNewVariableButton"; import ForwardedIconComponent from "../../components/genericIconComponent"; import TableComponent from "../../components/tableComponent"; +import { useState } from "react"; +import { ColDef, ColGroupDef } from "ag-grid-community"; export default function GlobalVariablesPage() { + // Column Definitions: Defines the columns to be displayed. + const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ + { headerName: "Variable Name", field: "name", flex: 1 }, //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: "Apply To 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 (
@@ -33,7 +96,7 @@ export default function GlobalVariablesPage() {
- +
); From 2864fd1cc073a38754234948e6535980397b11fa Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 00:16:59 +0200 Subject: [PATCH 22/70] Added shortcuts page --- .../src/pages/ShortcutsPage/index.tsx | 40 +++++++++++++++++++ src/frontend/src/routes.tsx | 2 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/frontend/src/pages/ShortcutsPage/index.tsx diff --git a/src/frontend/src/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/ShortcutsPage/index.tsx new file mode 100644 index 000000000..3c91269d9 --- /dev/null +++ b/src/frontend/src/pages/ShortcutsPage/index.tsx @@ -0,0 +1,40 @@ +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"; + +export default function ShortcutsPage() { + return ( +
+
+
+

+ Shortcuts + +

+

+ Customize, manage and create shortcuts for quick access to + frequently used actions. +

+
+
+ + + +
+
+ +
+ +
+
+ ); +} diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index dcacb3ac0..2bd0af624 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -19,7 +19,7 @@ import ViewPage from "./pages/ViewPage"; import DeleteAccountPage from "./pages/deleteAccountPage"; import LoginPage from "./pages/loginPage"; import SignUp from "./pages/signUpPage"; -import ShortcutsPage from "./pages/FlowPage/components/shortcutsPage"; +import ShortcutsPage from "./pages/ShortcutsPage"; const Router = () => { const navigate = useNavigate(); From d503b74a3f2368d884fa4982153723241143feba Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 00:18:24 +0200 Subject: [PATCH 23/70] Added shortcuts into right page --- .../components/shortcutsComponent/index.tsx | 104 ------------------ .../components/shortcutsPage/index.tsx | 25 ----- .../src/pages/ShortcutsPage/index.tsx | 89 ++++++++++++--- 3 files changed, 76 insertions(+), 142 deletions(-) delete mode 100644 src/frontend/src/components/shortcutsComponent/index.tsx delete mode 100644 src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx diff --git a/src/frontend/src/components/shortcutsComponent/index.tsx b/src/frontend/src/components/shortcutsComponent/index.tsx deleted file mode 100644 index 574bacd12..000000000 --- a/src/frontend/src/components/shortcutsComponent/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -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 ShortcutsComponent() { - const advancedShortcut = "Ctrl + shift + A"; - const minizmizeShortcut = "Ctrl + shift + Q"; - const codeShortcut = "Ctrl + shift + C"; - const copyShortcut = "Ctrl + C"; - const duplicateShortcut = "Ctrl + D"; - const shareShortcut = "Ctrl + shift + S"; - const docsShortcut = "Ctrl + shift + D"; - const saveShortcut = "Ctrl + S"; - const deleteShortcut = "Backspace"; - const interactionShortcut = "Ctrl + K"; - const undoShortcut = "Ctrl + Z"; - const redoShortcut = "Ctrl + Y"; - - - // Column Definitions: Defines the columns to be displayed. - const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ - { headerName: "Functionality", - field: "name", - flex: 1, - editable: false - }, //This column will be twice as wide as the others - { - field: "shortcut", - flex: 2, - editable: false, - } - ]); - - const [rowData, setRowData] = useState([ - { - name: "Open node advanced settings", - shortcut: advancedShortcut, - }, - { - name: "Minimize", - shortcut: minizmizeShortcut - }, - { - name: "Open Code modal", - shortcut: codeShortcut, - }, - { - name: "Copy", - shortcut: copyShortcut, - }, - { - name: "Duplicate", - shortcut: duplicateShortcut, - }, - { - name: "Share", - shortcut: shareShortcut, - }, - { - name: "Open docs", - shortcut: docsShortcut, - }, - { - name: "Save", - shortcut: saveShortcut, - }, - { - name: "Delete", - shortcut: deleteShortcut, - }, - { - name: "Open interaction panel", - shortcut: interactionShortcut, - }, - { - name: "Undo", - shortcut: undoShortcut, - }, - { - name: "Redo", - shortcut: redoShortcut, - }, - ]); - - return ( - - -
- -
-
- -
- Showing 1-3 of 3 products -
-
-
- ); -} diff --git a/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx b/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx deleted file mode 100644 index b73efd829..000000000 --- a/src/frontend/src/pages/FlowPage/components/shortcutsPage/index.tsx +++ /dev/null @@ -1,25 +0,0 @@ - - - -import ForwardedIconComponent from "../../../../components/genericIconComponent"; -import ShortcutsComponent from "../../../../components/shortcutsComponent"; -import { Button } from "../../../../components/ui/button"; - -export default function ShortcutsPage() { - return ( -
-
-
-

Shortcuts

-

- Manage and assign global shortcuts -

-
-
- -
- -
-
- ); -} diff --git a/src/frontend/src/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/ShortcutsPage/index.tsx index 3c91269d9..860f5da2c 100644 --- a/src/frontend/src/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/ShortcutsPage/index.tsx @@ -1,11 +1,82 @@ -import IconComponent from "../../components/genericIconComponent"; -import { Button } from "../../components/ui/button"; - -import AddNewVariableButton from "../../components/addNewVariableButtonComponent/addNewVariableButton"; +import { ColDef, ColGroupDef } from "ag-grid-community"; +import { useState } from "react"; import ForwardedIconComponent from "../../components/genericIconComponent"; import TableComponent from "../../components/tableComponent"; export default function ShortcutsPage() { + const advancedShortcut = "Ctrl + shift + A"; + const minizmizeShortcut = "Ctrl + shift + Q"; + const codeShortcut = "Ctrl + shift + C"; + const copyShortcut = "Ctrl + C"; + const duplicateShortcut = "Ctrl + D"; + const shareShortcut = "Ctrl + shift + S"; + const docsShortcut = "Ctrl + shift + D"; + const saveShortcut = "Ctrl + S"; + const deleteShortcut = "Backspace"; + const interactionShortcut = "Ctrl + K"; + const undoShortcut = "Ctrl + Z"; + const redoShortcut = "Ctrl + Y"; + + // Column Definitions: Defines the columns to be displayed. + const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ + { headerName: "Functionality", field: "name", flex: 1, editable: false }, //This column will be twice as wide as the others + { + field: "shortcut", + flex: 2, + editable: false, + }, + ]); + + const [rowData, setRowData] = useState([ + { + name: "Open node advanced settings", + shortcut: advancedShortcut, + }, + { + name: "Minimize", + shortcut: minizmizeShortcut, + }, + { + name: "Open Code modal", + shortcut: codeShortcut, + }, + { + name: "Copy", + shortcut: copyShortcut, + }, + { + name: "Duplicate", + shortcut: duplicateShortcut, + }, + { + name: "Share", + shortcut: shareShortcut, + }, + { + name: "Open docs", + shortcut: docsShortcut, + }, + { + name: "Save", + shortcut: saveShortcut, + }, + { + name: "Delete", + shortcut: deleteShortcut, + }, + { + name: "Open interaction panel", + shortcut: interactionShortcut, + }, + { + name: "Undo", + shortcut: undoShortcut, + }, + { + name: "Redo", + shortcut: redoShortcut, + }, + ]); return (
@@ -22,18 +93,10 @@ export default function ShortcutsPage() { frequently used actions.

-
- - - -
- +
); From 610fd94cf8047e2b945923ec51a38cc496c1c696 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 00:26:17 +0200 Subject: [PATCH 24/70] Changed position of page --- .../pages}/GlobalVariablesPage/index.tsx | 10 +++++----- .../{ => SettingsPage/pages}/ShortcutsPage/index.tsx | 4 ++-- src/frontend/src/routes.tsx | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) rename src/frontend/src/pages/{ => SettingsPage/pages}/GlobalVariablesPage/index.tsx (87%) rename src/frontend/src/pages/{ => SettingsPage/pages}/ShortcutsPage/index.tsx (94%) diff --git a/src/frontend/src/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx similarity index 87% rename from src/frontend/src/pages/GlobalVariablesPage/index.tsx rename to src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index ed4092413..791cde349 100644 --- a/src/frontend/src/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -1,9 +1,9 @@ -import IconComponent from "../../components/genericIconComponent"; -import { Button } from "../../components/ui/button"; +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"; +import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; +import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import TableComponent from "../../../../components/tableComponent"; import { useState } from "react"; import { ColDef, ColGroupDef } from "ag-grid-community"; diff --git a/src/frontend/src/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx similarity index 94% rename from src/frontend/src/pages/ShortcutsPage/index.tsx rename to src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index 860f5da2c..09ac72d06 100644 --- a/src/frontend/src/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -1,7 +1,7 @@ import { ColDef, ColGroupDef } from "ag-grid-community"; import { useState } from "react"; -import ForwardedIconComponent from "../../components/genericIconComponent"; -import TableComponent from "../../components/tableComponent"; +import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import TableComponent from "../../../../components/tableComponent"; export default function ShortcutsPage() { const advancedShortcut = "Ctrl + shift + A"; diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index 2bd0af624..f8a13a92c 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -9,7 +9,7 @@ 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 GlobalVariablesPage from "./pages/SettingsPage/pages/GlobalVariablesPage"; import HomePage from "./pages/MainPage"; import ComponentsComponent from "./pages/MainPage/components/components"; import ProfileSettingsPage from "./pages/ProfileSettingsPage"; @@ -19,7 +19,7 @@ import ViewPage from "./pages/ViewPage"; import DeleteAccountPage from "./pages/deleteAccountPage"; import LoginPage from "./pages/loginPage"; import SignUp from "./pages/signUpPage"; -import ShortcutsPage from "./pages/ShortcutsPage"; +import ShortcutsPage from "./pages/SettingsPage/pages/ShortcutsPage"; const Router = () => { const navigate = useNavigate(); From 20b2aa04b6207a865d30ac4f10c0a45fcf91f07f Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 00:27:28 +0200 Subject: [PATCH 25/70] Hidden unused settings --- src/frontend/src/pages/SettingsPage/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx index 48941fd06..86d47cd34 100644 --- a/src/frontend/src/pages/SettingsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -25,7 +25,7 @@ export default function SettingsPage(): JSX.Element { /> ), }, - { + /* { title: "Theme", href: "/settings/theme", icon: ( @@ -54,7 +54,7 @@ export default function SettingsPage(): JSX.Element { className="mx-[0.08rem] w-[1.1rem] stroke-[1.5]" /> ), - }, + }, */ { title: "Global Variables", href: "/settings/global-variables", From 6ebeacc11510035dc36630cde48f89935f9033d2 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 00:35:08 +0200 Subject: [PATCH 26/70] Added sample General page --- .../SettingsPage/pages/GeneralPage/index.tsx | 145 ++++++++++++++++++ src/frontend/src/routes.tsx | 8 +- 2 files changed, 150 insertions(+), 3 deletions(-) create mode 100644 src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx diff --git a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx new file mode 100644 index 000000000..ceeb99697 --- /dev/null +++ b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx @@ -0,0 +1,145 @@ +import { Button } from "../../../../components/ui/button"; + +import { ColDef, ColGroupDef } from "ag-grid-community"; +import { useState } from "react"; +import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import { + Card, + CardContent, + CardDescription, + CardFooter, + CardHeader, + CardTitle, +} from "../../../../components/ui/card"; +import { Checkbox } from "../../../../components/ui/checkbox"; +import { Input } from "../../../../components/ui/input"; + +export default function GeneralPage() { + // Column Definitions: Defines the columns to be displayed. + const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ + { headerName: "Variable Name", field: "name", flex: 1 }, //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: "Apply To 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 ( +
+
+
+

+ General + +

+

+ Manage settings related to Langflow and your account. +

+
+
+ +
+ + + Store Name + + Used to identify your store in the marketplace. + + + +
+ +
+
+ + + +
+ + + Plugins Directory + + The directory within your project, in which your plugins are + located. + + + +
+ +
+ + +
+
+
+ + + +
+
+
+ ); +} diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index f8a13a92c..a4b35284a 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -9,17 +9,18 @@ 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/SettingsPage/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 GeneralPage from "./pages/SettingsPage/pages/GeneralPage"; +import GlobalVariablesPage from "./pages/SettingsPage/pages/GlobalVariablesPage"; +import ShortcutsPage from "./pages/SettingsPage/pages/ShortcutsPage"; 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 ShortcutsPage from "./pages/SettingsPage/pages/ShortcutsPage"; const Router = () => { const navigate = useNavigate(); @@ -56,8 +57,9 @@ const Router = () => { } > - } /> + } /> } /> + } /> } /> Date: Tue, 30 Apr 2024 00:41:33 +0200 Subject: [PATCH 27/70] Removed Profile Settings from header --- src/frontend/src/components/headerComponent/index.tsx | 9 +-------- src/frontend/src/routes.tsx | 8 -------- 2 files changed, 1 insertion(+), 16 deletions(-) diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index ff48c5f79..af219f2ac 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -187,7 +187,6 @@ export default function Header(): JSX.Element { General - navigate("/settings")} @@ -196,8 +195,8 @@ export default function Header(): JSX.Element { {!autoLogin && ( <> - My Account + My Account {isAdmin && ( )} - navigate("/account/settings")} - > - Profile Settings - { diff --git a/src/frontend/src/routes.tsx b/src/frontend/src/routes.tsx index a4b35284a..2061017ec 100644 --- a/src/frontend/src/routes.tsx +++ b/src/frontend/src/routes.tsx @@ -145,14 +145,6 @@ const Router = () => { /> - - - - } - /> Date: Tue, 30 Apr 2024 00:56:53 +0200 Subject: [PATCH 28/70] Added Profile settings into General page --- .../gradientChooserComponent/index.tsx | 2 +- .../SettingsPage/pages/GeneralPage/index.tsx | 299 +++++++++++------- 2 files changed, 191 insertions(+), 110 deletions(-) diff --git a/src/frontend/src/components/gradientChooserComponent/index.tsx b/src/frontend/src/components/gradientChooserComponent/index.tsx index bff1fbd51..3467aedb8 100644 --- a/src/frontend/src/components/gradientChooserComponent/index.tsx +++ b/src/frontend/src/components/gradientChooserComponent/index.tsx @@ -2,7 +2,7 @@ import { gradients } from "../../utils/styleUtils"; export default function GradientChooserComponent({ value, onChange }) { return ( -
+
{gradients.map((gradient, idx) => (
{ diff --git a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx index ceeb99697..ac2af4f75 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GeneralPage/index.tsx @@ -1,8 +1,10 @@ -import { Button } from "../../../../components/ui/button"; - -import { ColDef, ColGroupDef } from "ag-grid-community"; -import { useState } from "react"; +import * as Form from "@radix-ui/react-form"; +import { cloneDeep } from "lodash"; +import { useContext, useEffect, useState } from "react"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; +import GradientChooserComponent from "../../../../components/gradientChooserComponent"; +import InputComponent from "../../../../components/inputComponent"; +import { Button } from "../../../../components/ui/button"; import { Card, CardContent, @@ -11,71 +13,88 @@ import { CardHeader, CardTitle, } from "../../../../components/ui/card"; -import { Checkbox } from "../../../../components/ui/checkbox"; -import { Input } from "../../../../components/ui/input"; +import { + EDIT_PASSWORD_ALERT_LIST, + EDIT_PASSWORD_ERROR_ALERT, + SAVE_ERROR_ALERT, + SAVE_SUCCESS_ALERT, +} from "../../../../constants/alerts_constants"; +import { CONTROL_PATCH_USER_STATE } from "../../../../constants/constants"; +import { AuthContext } from "../../../../contexts/authContext"; +import { resetPassword, updateUser } from "../../../../controllers/API"; +import useAlertStore from "../../../../stores/alertStore"; +import useFlowsManagerStore from "../../../../stores/flowsManagerStore"; +import { + inputHandlerEventType, + patchUserInputStateType, +} from "../../../../types/components"; +import { gradients } from "../../../../utils/styleUtils"; export default function GeneralPage() { - // Column Definitions: Defines the columns to be displayed. - const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ - { headerName: "Variable Name", field: "name", flex: 1 }, //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: "Apply To Fields", - field: "defaultFields", - flex: 1, - editable: true, - }, - ]); + const setCurrentFlowId = useFlowsManagerStore( + (state) => state.setCurrentFlowId + ); - 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: + const [inputState, setInputState] = useState( + CONTROL_PATCH_USER_STATE + ); - --- - - {Document} - - --- - - Question: - {Question} - - Answer: - `, - defaultFields: ["Prompt"], - }, - { - name: "Azure Key", - type: "Credential", - value: "awowkdenvoaimojndofunoweoij0293u0n2e08n23", - defaultFields: ["Azure API Key"], - }, - ]); + const { autoLogin } = useContext(AuthContext); + // set null id + useEffect(() => { + setCurrentFlowId(""); + }, []); + const setSuccessData = useAlertStore((state) => state.setSuccessData); + const setErrorData = useAlertStore((state) => state.setErrorData); + const { userData, setUserData } = useContext(AuthContext); + const { password, cnfPassword, gradient } = inputState; + + async function handlePatchPassword() { + if (password !== cnfPassword) { + setErrorData({ + title: EDIT_PASSWORD_ERROR_ALERT, + list: [EDIT_PASSWORD_ALERT_LIST], + }); + return; + } + try { + if (password !== "") await resetPassword(userData!.id, { password }); + handleInput({ target: { name: "password", value: "" } }); + handleInput({ target: { name: "cnfPassword", value: "" } }); + setSuccessData({ title: SAVE_SUCCESS_ALERT }); + } catch (error) { + setErrorData({ + title: SAVE_ERROR_ALERT, + list: [(error as any).response.data.detail], + }); + } + } + + async function handlePatchGradient() { + try { + if (gradient !== "") + await updateUser(userData!.id, { profile_image: gradient }); + if (gradient !== "") { + let newUserData = cloneDeep(userData); + newUserData!.profile_image = gradient; + + setUserData(newUserData); + } + setSuccessData({ title: SAVE_SUCCESS_ALERT }); + } catch (error) { + setErrorData({ + title: SAVE_ERROR_ALERT, + list: [(error as any).response.data.detail], + }); + } + } + + function handleInput({ + target: { name, value }, + }: inputHandlerEventType): void { + setInputState((prev) => ({ ...prev, [name]: value })); + } return (
@@ -94,51 +113,113 @@ export default function GeneralPage() {
- - - Store Name - - Used to identify your store in the marketplace. - - - -
- -
-
- - - -
- - - Plugins Directory - - The directory within your project, in which your plugins are - located. - - - -
- -
- - -
-
-
- - - -
+ {!autoLogin && ( + <> + { + handlePatchGradient(); + event.preventDefault(); + }} + > + + + Profile Gradient + + Choose the gradient that appears as your profile picture. + + + +
+ { + handleInput({ target: { name: "gradient", value } }); + }} + /> +
+
+ + + + + +
+
+ { + handlePatchPassword(); + event.preventDefault(); + }} + > + + + Password + + Type your new password and confirm it. + + + +
+ + { + handleInput({ target: { name: "password", value } }); + }} + value={password} + isForm + password={true} + placeholder="Password" + className="w-full" + /> + + Please enter your password + + + + { + handleInput({ + target: { name: "cnfPassword", value }, + }); + }} + value={cnfPassword} + isForm + password={true} + placeholder="Confirm Password" + className="w-full" + /> + + + Please confirm your password + + +
+
+ + + + + +
+
+ + )}
); From de5116a6bf41f93f9159aa9d6333cd2615234be8 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 01:02:12 +0200 Subject: [PATCH 29/70] Fixed pagination that cant be changed on table --- src/frontend/src/components/tableComponent/index.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index 20b9083d9..d5fdcd712 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -9,7 +9,7 @@ import { cn } from "../../utils/utils"; const TableComponent = forwardRef< ElementRef, ComponentPropsWithoutRef ->(({ ...props }, ref) => { +>(({ pagination = true, ...props }, ref) => { const dark = useDarkStore((state) => state.dark); return ( @@ -20,7 +20,7 @@ const TableComponent = forwardRef< "ag-theme-shadcn flex h-full flex-col pb-8" )} // applying the grid theme > - +
); From 1dcb151c61c84f79f1b9188af69da14e523af87d Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 01:10:22 +0200 Subject: [PATCH 30/70] Added shortcuts into a card in the Shortcuts page --- .../src/components/tableComponent/index.tsx | 2 +- .../pages/ShortcutsPage/index.tsx | 29 ++++++++++++++++--- 2 files changed, 26 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/components/tableComponent/index.tsx b/src/frontend/src/components/tableComponent/index.tsx index d5fdcd712..300aa5cc3 100644 --- a/src/frontend/src/components/tableComponent/index.tsx +++ b/src/frontend/src/components/tableComponent/index.tsx @@ -17,7 +17,7 @@ const TableComponent = forwardRef<
diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index 09ac72d06..bb7131382 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -2,6 +2,13 @@ import { ColDef, ColGroupDef } from "ag-grid-community"; import { useState } from "react"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; +import { + Card, + CardContent, + CardDescription, + CardHeader, + CardTitle, +} from "../../../../components/ui/card"; export default function ShortcutsPage() { const advancedShortcut = "Ctrl + shift + A"; @@ -78,7 +85,7 @@ export default function ShortcutsPage() { }, ]); return ( -
+

@@ -94,9 +101,23 @@ export default function ShortcutsPage() {

- -
- +
+ + + Nodes + + Shortcuts relating to the nodes in the workspace. + + + + + +
); From 1f7c6971586cdc1a6312a597055636e9fa46ae3f Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 01:11:05 +0200 Subject: [PATCH 31/70] Added padding bottom on Global Variables --- .../src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 791cde349..09fd0be75 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -95,7 +95,7 @@ export default function GlobalVariablesPage() {
-
+
From 7e337c7f6550b2985d86d93df9eb06cda9d1714b Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 01:26:25 +0200 Subject: [PATCH 32/70] Added selection and trash --- .../pages/GlobalVariablesPage/index.tsx | 39 +++++++++++++++---- 1 file changed, 32 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 09fd0be75..9818c5e81 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -1,16 +1,24 @@ import IconComponent from "../../../../components/genericIconComponent"; import { Button } from "../../../../components/ui/button"; +import { ColDef, ColGroupDef, SelectionChangedEvent } from "ag-grid-community"; +import { useState } from "react"; import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; -import { useState } from "react"; -import { ColDef, ColGroupDef } from "ag-grid-community"; +import { cn } from "../../../../utils/utils"; export default function GlobalVariablesPage() { // Column Definitions: Defines the columns to be displayed. const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ - { headerName: "Variable Name", field: "name", flex: 1 }, //This column will be twice as wide as the others + { + headerCheckboxSelection: true, + checkboxSelection: true, + showDisabledCheckboxes: true, + headerName: "Variable Name", + field: "name", + flex: 1, + }, //This column will be twice as wide as the others { field: "type", cellEditor: "agSelectCellEditor", @@ -69,6 +77,8 @@ export default function GlobalVariablesPage() { }, ]); + const [selectedRows, setSelectedRows] = useState([]); + return (
@@ -81,11 +91,18 @@ export default function GlobalVariablesPage() { />

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

-
+
+
- + { + setSelectedRows(event.api.getSelectedRows().map((row) => row.name)); + }} + rowSelection="multiple" + suppressRowClickSelection={true} + columnDefs={colDefs} + rowData={rowData} + />
); From db9cc5e052b8d9114f04e94a3cb873d22b7778fc Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 01:36:56 +0200 Subject: [PATCH 33/70] Added badge as renderer of type on Global Variables --- .../pages/GlobalVariablesPage/index.tsx | 20 +++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 9818c5e81..99e1a58a8 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -6,9 +6,19 @@ import { useState } from "react"; import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; +import { Badge } from "../../../../components/ui/badge"; import { cn } from "../../../../utils/utils"; export default function GlobalVariablesPage() { + const BadgeRenderer = (props) => { + return ( +
+ + {props.value} + +
+ ); + }; // Column Definitions: Defines the columns to be displayed. const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ { @@ -21,6 +31,7 @@ export default function GlobalVariablesPage() { }, //This column will be twice as wide as the others { field: "type", + cellRenderer: BadgeRenderer, cellEditor: "agSelectCellEditor", cellEditorParams: { values: ["Prompt", "Credential"], @@ -98,10 +109,15 @@ export default function GlobalVariablesPage() { - - + + + )} + @@ -98,7 +107,7 @@ export default function Dropdown({ - + ) : ( diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 99e1a58a8..ad88bc6f2 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -4,6 +4,7 @@ import { Button } from "../../../../components/ui/button"; import { ColDef, ColGroupDef, SelectionChangedEvent } from "ag-grid-community"; import { useState } from "react"; import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; +import Dropdown from "../../../../components/dropdownComponent"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; @@ -19,6 +20,14 @@ export default function GlobalVariablesPage() {
); }; + + const DropdownEditor = ({ options, value, onValueChange }) => { + return ( + +
+
+ ); + }; // Column Definitions: Defines the columns to be displayed. const [colDefs, setColDefs] = useState<(ColDef | ColGroupDef)[]>([ { @@ -32,10 +41,9 @@ export default function GlobalVariablesPage() { { field: "type", cellRenderer: BadgeRenderer, - cellEditor: "agSelectCellEditor", + cellEditor: DropdownEditor, cellEditorParams: { - values: ["Prompt", "Credential"], - valueListGap: 10, + options: ["Prompt", "Credential"], }, flex: 1, editable: true, diff --git a/src/frontend/src/types/components/index.ts b/src/frontend/src/types/components/index.ts index 4fb2ca1b7..353443572 100644 --- a/src/frontend/src/types/components/index.ts +++ b/src/frontend/src/types/components/index.ts @@ -45,6 +45,7 @@ export type DropDownComponentType = { onSelect: (value: string) => void; editNode?: boolean; id?: string; + children?: ReactNode; }; export type ParameterComponentType = { data: NodeDataType; @@ -80,15 +81,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; onChange: (value: Object[]) => void; From ec3425e3d9d8697702903612db53b286dfa69410 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 22:53:37 -0300 Subject: [PATCH 35/70] Refactored globalVariables.ts and globalVariables/index.ts to add support for unavailable fields --- src/frontend/src/stores/globalVariables.ts | 10 ++++++++++ .../src/types/zustand/globalVariables/index.ts | 4 ++++ 2 files changed, 14 insertions(+) diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 6cbb8a641..913bd278d 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -4,6 +4,16 @@ import { GlobalVariablesStore } from "../types/zustand/globalVariables"; export const useGlobalVariablesStore = create( (set, get) => ({ avaliableFields: [], + unavaliableFields: new Set(), + setUnavaliableFields: (fields) => { + set({ unavaliableFields: fields }); + }, + addUnavaliableField: (field) => { + set({ unavaliableFields: get().unavaliableFields.add(field) }); + }, + removeUnavaliableField: (field) => { + get().unavaliableFields.delete(field); + }, setAvaliableFields: (fields) => { set({ avaliableFields: fields }); }, diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index fbf7f0675..f94dc868b 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -10,4 +10,8 @@ export type GlobalVariablesStore = { avaliableFields: Array; setAvaliableFields: (fields: Array) => void; addAvaliableField: (field: string) => void; + unavaliableFields: Set; + setUnavaliableFields: (fields: Set) => void; + addUnavaliableField: (field: string) => void; + removeUnavaliableField: (field: string) => void; }; From a2885a86bcbf1b49a776e075723558a4e2ff5643 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 22:59:02 -0300 Subject: [PATCH 36/70] Refactored globalVariables.ts and globalVariables/index.ts to use Set for availableFields --- src/frontend/src/stores/globalVariables.ts | 4 ++-- src/frontend/src/types/zustand/globalVariables/index.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 913bd278d..6e17384e6 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -3,7 +3,7 @@ import { GlobalVariablesStore } from "../types/zustand/globalVariables"; export const useGlobalVariablesStore = create( (set, get) => ({ - avaliableFields: [], + avaliableFields: new Set(), unavaliableFields: new Set(), setUnavaliableFields: (fields) => { set({ unavaliableFields: fields }); @@ -18,7 +18,7 @@ export const useGlobalVariablesStore = create( set({ avaliableFields: fields }); }, addAvaliableField: (field) => { - set({ avaliableFields: [...get().avaliableFields, field] }); + set({ avaliableFields: get().avaliableFields.add(field) }); }, globalVariablesEntries: [], globalVariables: {}, diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index f94dc868b..9c4fe421b 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -7,8 +7,8 @@ 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; + avaliableFields: Set; + setAvaliableFields: (fields: Set) => void; addAvaliableField: (field: string) => void; unavaliableFields: Set; setUnavaliableFields: (fields: Set) => void; From fe5f6560e7f353939419538ae4e3a88426e0dc5d Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 23:27:23 -0300 Subject: [PATCH 37/70] Refactored globalVariables.ts and globalVariables/index.ts to extract and store component fields --- src/frontend/src/stores/flowsManagerStore.ts | 5 +++++ src/frontend/src/stores/globalVariables.ts | 7 ------- src/frontend/src/stores/typesStore.ts | 14 +++++++++++--- .../src/types/zustand/globalVariables/index.ts | 3 --- src/frontend/src/types/zustand/types/index.ts | 3 +++ src/frontend/src/utils/reactflowUtils.ts | 7 ++++--- 6 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/frontend/src/stores/flowsManagerStore.ts b/src/frontend/src/stores/flowsManagerStore.ts index 9471889c3..94d104823 100644 --- a/src/frontend/src/stores/flowsManagerStore.ts +++ b/src/frontend/src/stores/flowsManagerStore.ts @@ -22,6 +22,7 @@ import { addVersionToDuplicates, createFlowComponent, createNewFlow, + extractFieldsFromComponenents, processDataFromFlow, processFlows, } from "../utils/reactflowUtils"; @@ -82,6 +83,7 @@ const useFlowsManagerStore = create((set, get) => ({ ); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, + ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), })); set({ isLoading: false }); resolve(); @@ -197,6 +199,7 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, + ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), })); }, 200); // addFlowToLocalState(newFlow); @@ -219,6 +222,7 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, + ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), })); // Return the id @@ -248,6 +252,7 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, + ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), })); resolve(); }); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 6e17384e6..d9a326b08 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -3,7 +3,6 @@ import { GlobalVariablesStore } from "../types/zustand/globalVariables"; export const useGlobalVariablesStore = create( (set, get) => ({ - avaliableFields: new Set(), unavaliableFields: new Set(), setUnavaliableFields: (fields) => { set({ unavaliableFields: fields }); @@ -14,12 +13,6 @@ export const useGlobalVariablesStore = create( removeUnavaliableField: (field) => { get().unavaliableFields.delete(field); }, - setAvaliableFields: (fields) => { - set({ avaliableFields: fields }); - }, - addAvaliableField: (field) => { - set({ avaliableFields: get().avaliableFields.add(field) }); - }, globalVariablesEntries: [], globalVariables: {}, setGlobalVariables: (variables) => { diff --git a/src/frontend/src/stores/typesStore.ts b/src/frontend/src/stores/typesStore.ts index 95223087f..f2539a8d3 100644 --- a/src/frontend/src/stores/typesStore.ts +++ b/src/frontend/src/stores/typesStore.ts @@ -2,11 +2,18 @@ import { create } from "zustand"; import { getAll } from "../controllers/API"; import { APIDataType } from "../types/api"; import { TypesStoreType } from "../types/zustand/types"; -import { templatesGenerator, typesGenerator } from "../utils/reactflowUtils"; +import { extractFieldsFromComponenents, templatesGenerator, typesGenerator } from "../utils/reactflowUtils"; import useAlertStore from "./alertStore"; import useFlowsManagerStore from "./flowsManagerStore"; export const useTypesStore = create((set, get) => ({ + ComponentFields: new Set(), + setComponentFields: (fields) => { + set({ ComponentFields: fields }); + }, + addComponentField: (field) => { + set({ ComponentFields: get().ComponentFields.add(field) }); + }, types: {}, templates: {}, data: {}, @@ -21,10 +28,10 @@ export const useTypesStore = create((set, get) => ({ set((old) => ({ types: typesGenerator(data), data: { ...old.data, ...data }, + ComponentFields: extractFieldsFromComponenents({ ...old.data, ...data }), templates: templatesGenerator(data), })); setLoading(false); - console.log(templatesGenerator(data)) resolve(); }) .catch((error) => { @@ -43,6 +50,7 @@ export const useTypesStore = create((set, get) => ({ }, setData: (change: APIDataType | ((old: APIDataType) => APIDataType)) => { let newChange = typeof change === "function" ? change(get().data) : change; - set({ data: newChange }); + set({ data: newChange}); + get().setComponentFields(extractFieldsFromComponenents(newChange)); }, })); diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 9c4fe421b..c5f6c24d2 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -7,9 +7,6 @@ export type GlobalVariablesStore = { addGlobalVariable: (name: string, id: string, type?: string) => void; removeGlobalVariable: (name: string) => void; getVariableId: (name: string) => string | undefined; - avaliableFields: Set; - setAvaliableFields: (fields: Set) => void; - addAvaliableField: (field: string) => void; unavaliableFields: Set; setUnavaliableFields: (fields: Set) => void; addUnavaliableField: (field: string) => void; diff --git a/src/frontend/src/types/zustand/types/index.ts b/src/frontend/src/types/zustand/types/index.ts index 133afbda1..4f817de47 100644 --- a/src/frontend/src/types/zustand/types/index.ts +++ b/src/frontend/src/types/zustand/types/index.ts @@ -8,4 +8,7 @@ export type TypesStoreType = { data: APIDataType; setData: (newState: {}) => void; getTypes: () => Promise; + ComponentFields: Set; + setComponentFields: (fields: Set) => void; + addComponentField: (field: string) => void; }; diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index 49aae5b7a..ad1244495 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1235,16 +1235,17 @@ export function templatesGenerator(data: APIObjectType) { } export function extractFieldsFromComponenents(data:APIObjectType ) { - const fields = new Set(); + 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); + fields.add(data[key][kind].template[field].display_name!); }); }); }); - return Array.from(fields); + console.log(fields); + return fields; } export function downloadFlow( From 8e78e23a9a58116e8b6a57b16512241570d97ed1 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Mon, 29 Apr 2024 23:29:06 -0300 Subject: [PATCH 38/70] Refactored addNewVariableButton.tsx to use useTypesStore for componentFields --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index 8dab6420f..0c83eefff 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -10,6 +10,7 @@ import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; +import { useTypesStore } from "../../stores/typesStore"; //TODO IMPLEMENT FORM LOGIC @@ -19,6 +20,7 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [type, setType] = useState(""); const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); + const componentFields = useTypesStore((state) => state.ComponentFields); const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); From c23943017d0d57ee28550cc93a6f2dcaa2cefc16 Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Tue, 30 Apr 2024 01:20:46 -0300 Subject: [PATCH 39/70] Refactor: Global Variables table are now populated by backend and delete button works --- .../pages/GlobalVariablesPage/index.tsx | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index ad88bc6f2..867a078b7 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -2,15 +2,25 @@ import IconComponent from "../../../../components/genericIconComponent"; import { Button } from "../../../../components/ui/button"; import { ColDef, ColGroupDef, SelectionChangedEvent } from "ag-grid-community"; -import { useState } from "react"; +import { useEffect, useState } from "react"; import AddNewVariableButton from "../../../../components/addNewVariableButtonComponent/addNewVariableButton"; import Dropdown from "../../../../components/dropdownComponent"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; import { cn } from "../../../../utils/utils"; +import { useGlobalVariablesStore } from "../../../../stores/globalVariables"; export default function GlobalVariablesPage() { + const rows: Array<{type: string | undefined; id: string; name: string}> = []; + const globalVariablesEntries = useGlobalVariablesStore(state => state.globalVariablesEntries); + const removeGlobalVariable = useGlobalVariablesStore(state => state.removeGlobalVariable); + const globalVariables = useGlobalVariablesStore(state => state.globalVariables); + globalVariablesEntries.forEach((e) => { + const globalVariableObj = globalVariables[e] + rows.push({type: globalVariableObj.type, id: globalVariableObj.id, name: e}) + }) + const BadgeRenderer = (props) => { return (
@@ -21,6 +31,10 @@ export default function GlobalVariablesPage() { ); }; + useEffect(() => { + setRowData(rows) + }, [globalVariables]) + const DropdownEditor = ({ options, value, onValueChange }) => { return ( @@ -98,6 +112,12 @@ export default function GlobalVariablesPage() { const [selectedRows, setSelectedRows] = useState([]); + function removeVariables() { + selectedRows.forEach(row => { + removeGlobalVariable(row) + }) + } + return (
@@ -119,6 +139,7 @@ export default function GlobalVariablesPage() { variant="primary" className="group px-2" disabled={selectedRows.length === 0} + onClick={removeVariables} > Date: Tue, 30 Apr 2024 08:22:32 -0300 Subject: [PATCH 40/70] temp fix for default fields --- src/frontend/src/controllers/API/index.ts | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 920335a97..8c5cc6892 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -876,15 +876,18 @@ export async function registerGlobalVariable({ name, value, type, + default_fields=[], }: { name: string; value: string; type?: string; + default_fields?: string[]; }): Promise> { return await api.post(`${BASE_URL_API}variables/`, { name, value, type, + default_fields:default_fields }); } From a556f686e21f842e379b6f284b84bc97067eda29 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 16:46:19 +0200 Subject: [PATCH 41/70] Added multiple inputs possibility to InputComponent --- .../addNewVariableButton.tsx | 9 ++++ .../src/components/inputComponent/index.tsx | 42 ++++++++++++++----- src/frontend/src/types/components/index.ts | 2 + 3 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index 0c83eefff..6ab25b026 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -18,6 +18,7 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [key, setKey] = useState(""); const [value, setValue] = useState(""); const [type, setType] = useState(""); + const [fields, setFields] = useState([]); const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); @@ -91,6 +92,14 @@ export default function AddNewVariableButton({ children }): JSX.Element { placeholder="Insert a value for the variable..." className="w-full resize-none custom-scroll" /> + + setFields(value)} + selectedOptions={fields} + password={false} + options={Array.from(componentFields)} + placeholder="Choose a type for the variable..." + >
diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index bd7f852ab..4f3a207cc 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -33,6 +33,8 @@ export default function InputComponent({ optionsIcon = "ChevronsUpDown", selectedOption, setSelectedOption, + selectedOptions = [], + setSelectedOptions, options = [], optionsPlaceholder = "Search options...", optionsButton, @@ -101,13 +103,18 @@ export default function InputComponent({ value={ (selectedOption !== "" || !onChange) && setSelectedOption ? selectedOption + : (selectedOptions?.length !== 0 || !onChange) && + setSelectedOptions + ? selectedOptions?.join(", ") : value } autoFocus={autoFocus} disabled={disabled} onClick={() => { - (selectedOption !== "" || !onChange) && - setSelectedOption && + (((selectedOption !== "" || !onChange) && + setSelectedOption) || + ((selectedOptions?.length !== 0 || !onChange) && + setSelectedOptions)) && setShowOptions(true); }} required={required} @@ -119,9 +126,11 @@ export default function InputComponent({ ? " text-clip password " : "", editNode ? " input-edit-node " : "", - password && setSelectedOption ? "pr-[62.9px]" : "", - (!password && setSelectedOption) || - (password && !setSelectedOption) + password && (setSelectedOption || setSelectedOptions) + ? "pr-[62.9px]" + : "", + (!password && (setSelectedOption || setSelectedOptions)) || + (password && !(setSelectedOption || setSelectedOptions)) ? "pr-8" : "", @@ -184,7 +193,15 @@ export default function InputComponent({ ? "" : currentValue ); - setShowOptions(false); + setSelectedOptions && + setSelectedOptions( + selectedOptions?.includes(currentValue) + ? selectedOptions.filter( + (item) => item !== currentValue + ) + : [...selectedOptions, currentValue] + ); + !setSelectedOptions && setShowOptions(false); }} >
@@ -192,7 +209,8 @@ export default function InputComponent({
{ setShowOptions((old) => !old); e.preventDefault(); @@ -245,7 +267,7 @@ export default function InputComponent({ )} - {setSelectedOption && ( + {(setSelectedOption || setSelectedOptions) && ( ReactElement; selectedOption?: string; setSelectedOption?: (value: string) => void; + selectedOptions?: string[]; + setSelectedOptions?: (value: string[]) => void; }; export type ToggleComponentType = { enabled: boolean; From e773227e4a94f86caf6ca807482d77519a09e5e2 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 16:49:26 +0200 Subject: [PATCH 42/70] Added fields to request for creating new variable --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 5 +++-- src/frontend/src/stores/globalVariables.ts | 4 ++-- src/frontend/src/types/zustand/globalVariables/index.ts | 6 +++--- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index 6ab25b026..aae36775d 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -26,15 +26,16 @@ export default function AddNewVariableButton({ children }): JSX.Element { (state) => state.addGlobalVariable ); function handleSaveVariable() { - let data: { name: string; value: string; type?: string } = { + let data: { name: string; value: string; type?: string; default_fields?: string[] } = { name: key, type, value, + default_fields: fields }; registerGlobalVariable(data) .then((res) => { const { name, id, type } = res.data; - addGlobalVariable(name, id, type); + addGlobalVariable(name, id, type, fields); setKey(""); setValue(""); setType(""); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index d9a326b08..ff0514042 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -21,8 +21,8 @@ export const useGlobalVariablesStore = create( globalVariablesEntries: Object.keys(variables), }); }, - addGlobalVariable: (name, id, type) => { - const data = { id, type }; + addGlobalVariable: (name, id, type, default_fields) => { + const data = { id, type, default_fields }; const newVariables = { ...get().globalVariables, [name]: data }; set({ globalVariables: newVariables, diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index c5f6c24d2..d34973a17 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -1,10 +1,10 @@ export type GlobalVariablesStore = { globalVariablesEntries: Array; - globalVariables: { [name: string]: { id: string; type?: string } }; + globalVariables: { [name: string]: { id: string; type?: string, default_fields?: string[] } }; setGlobalVariables: (variables: { - [name: string]: { id: string; type?: string }; + [name: string]: { id: string; type?: string, default_fields?: string[]}; }) => void; - addGlobalVariable: (name: string, id: string, type?: string) => void; + addGlobalVariable: (name: string, id: string, type?: string, default_fields?: string[]) => void; removeGlobalVariable: (name: string) => void; getVariableId: (name: string) => string | undefined; unavaliableFields: Set; From 252641ca6cb9628724f009b9884a0312bf6404c2 Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 16:54:27 +0200 Subject: [PATCH 43/70] Fixed shortcuts page to display two different categories --- .../pages/ShortcutsPage/index.tsx | 43 +++++++++++++------ 1 file changed, 31 insertions(+), 12 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index bb7131382..1dac8d095 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -11,13 +11,13 @@ import { } from "../../../../components/ui/card"; export default function ShortcutsPage() { - const advancedShortcut = "Ctrl + shift + A"; - const minizmizeShortcut = "Ctrl + shift + Q"; - const codeShortcut = "Ctrl + shift + C"; + const advancedShortcut = "Ctrl + Shift + A"; + const minizmizeShortcut = "Ctrl + Shift + Q"; + const codeShortcut = "Ctrl + Shift + C"; const copyShortcut = "Ctrl + C"; const duplicateShortcut = "Ctrl + D"; - const shareShortcut = "Ctrl + shift + S"; - const docsShortcut = "Ctrl + shift + D"; + const shareShortcut = "Ctrl + Shift + S"; + const docsShortcut = "Ctrl + Shift + D"; const saveShortcut = "Ctrl + S"; const deleteShortcut = "Backspace"; const interactionShortcut = "Ctrl + K"; @@ -34,9 +34,9 @@ export default function ShortcutsPage() { }, ]); - const [rowData, setRowData] = useState([ + const [nodesRowData, setNodesRowData] = useState([ { - name: "Open node advanced settings", + name: "Advanced Settings", shortcut: advancedShortcut, }, { @@ -44,7 +44,7 @@ export default function ShortcutsPage() { shortcut: minizmizeShortcut, }, { - name: "Open Code modal", + name: "Code", shortcut: codeShortcut, }, { @@ -60,7 +60,7 @@ export default function ShortcutsPage() { shortcut: shareShortcut, }, { - name: "Open docs", + name: "Docs", shortcut: docsShortcut, }, { @@ -71,8 +71,11 @@ export default function ShortcutsPage() { name: "Delete", shortcut: deleteShortcut, }, + ]); + + const [flowRowData, setFlowRowData] = useState([ { - name: "Open interaction panel", + name: "Open Playground", shortcut: interactionShortcut, }, { @@ -101,7 +104,7 @@ export default function ShortcutsPage() {

-
+
Nodes @@ -114,7 +117,23 @@ export default function ShortcutsPage() { domLayout="autoHeight" pagination={false} columnDefs={colDefs} - rowData={rowData} + rowData={nodesRowData} + /> + + + + + Flow + + Shortcuts relating to the flow. + + + + From 239a24ac1692753842498648843df9a601c6d9ae Mon Sep 17 00:00:00 2001 From: Lucas Oliveira Date: Tue, 30 Apr 2024 17:01:26 +0200 Subject: [PATCH 44/70] Fixed badge showing blank when no type is selected --- .../pages/GlobalVariablesPage/index.tsx | 41 ++++++++++++------- 1 file changed, 27 insertions(+), 14 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 867a078b7..ff674e5e6 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -8,32 +8,45 @@ import Dropdown from "../../../../components/dropdownComponent"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; -import { cn } from "../../../../utils/utils"; import { useGlobalVariablesStore } from "../../../../stores/globalVariables"; +import { cn } from "../../../../utils/utils"; export default function GlobalVariablesPage() { - const rows: Array<{type: string | undefined; id: string; name: string}> = []; - const globalVariablesEntries = useGlobalVariablesStore(state => state.globalVariablesEntries); - const removeGlobalVariable = useGlobalVariablesStore(state => state.removeGlobalVariable); - const globalVariables = useGlobalVariablesStore(state => state.globalVariables); + const rows: Array<{ type: string | undefined; id: string; name: string }> = + []; + const globalVariablesEntries = useGlobalVariablesStore( + (state) => state.globalVariablesEntries + ); + const removeGlobalVariable = useGlobalVariablesStore( + (state) => state.removeGlobalVariable + ); + const globalVariables = useGlobalVariablesStore( + (state) => state.globalVariables + ); globalVariablesEntries.forEach((e) => { - const globalVariableObj = globalVariables[e] - rows.push({type: globalVariableObj.type, id: globalVariableObj.id, name: e}) - }) + const globalVariableObj = globalVariables[e]; + rows.push({ + type: globalVariableObj.type, + id: globalVariableObj.id, + name: e, + }); + }); const BadgeRenderer = (props) => { - return ( + return props.value !== "" ? (
{props.value}
+ ) : ( +
); }; useEffect(() => { - setRowData(rows) - }, [globalVariables]) + setRowData(rows); + }, [globalVariables]); const DropdownEditor = ({ options, value, onValueChange }) => { return ( @@ -113,9 +126,9 @@ export default function GlobalVariablesPage() { const [selectedRows, setSelectedRows] = useState([]); function removeVariables() { - selectedRows.forEach(row => { - removeGlobalVariable(row) - }) + selectedRows.forEach((row) => { + removeGlobalVariable(row); + }); } return ( From 2625e320c9f95606d0ae28e8f877250881c1acff Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 12:54:59 -0300 Subject: [PATCH 45/70] Refactored GlobalVariablesPage component to use useEffect hook for populating rows dynamically --- .../pages/GlobalVariablesPage/index.tsx | 61 +++++-------------- 1 file changed, 14 insertions(+), 47 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index ff674e5e6..d0d786985 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -12,8 +12,6 @@ import { useGlobalVariablesStore } from "../../../../stores/globalVariables"; import { cn } from "../../../../utils/utils"; export default function GlobalVariablesPage() { - const rows: Array<{ type: string | undefined; id: string; name: string }> = - []; const globalVariablesEntries = useGlobalVariablesStore( (state) => state.globalVariablesEntries ); @@ -23,14 +21,6 @@ export default function GlobalVariablesPage() { const globalVariables = useGlobalVariablesStore( (state) => state.globalVariables ); - globalVariablesEntries.forEach((e) => { - const globalVariableObj = globalVariables[e]; - rows.push({ - type: globalVariableObj.type, - id: globalVariableObj.id, - name: e, - }); - }); const BadgeRenderer = (props) => { return props.value !== "" ? ( @@ -43,8 +33,18 @@ export default function GlobalVariablesPage() {
); }; + const [rowData, setRowData] = useState<{ type: string | undefined; id: string; name: string; }[]>(); useEffect(() => { + const rows:Array<{type: string | undefined; id: string; name: string}> = []; + globalVariablesEntries.forEach((e) => { + const globalVariableObj = globalVariables[e]; + rows.push({ + type: globalVariableObj.type, + id: globalVariableObj.id, + name: e, + }); + }); setRowData(rows); }, [globalVariables]); @@ -70,57 +70,24 @@ export default function GlobalVariablesPage() { cellRenderer: BadgeRenderer, cellEditor: DropdownEditor, cellEditorParams: { - options: ["Prompt", "Credential"], + options: ["Generic", "Credential"], }, flex: 1, - editable: true, + editable: false, }, { field: "value", cellEditor: "agLargeTextCellEditor", - cellEditorPopup: true, flex: 2, - editable: true, + editable: false, }, { headerName: "Apply To Fields", field: "defaultFields", flex: 1, - editable: true, + editable: false, }, - ]); - 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"], - }, ]); const [selectedRows, setSelectedRows] = useState([]); From de1d5ddf009a078e247ed3e84fb02b33b21c8a86 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 13:23:00 -0300 Subject: [PATCH 46/70] Refactored InputGlobalComponent to use removeGlobalVariable instead of deleteGlobalVariable --- src/frontend/src/components/inputGlobalComponent/index.tsx | 4 +--- src/frontend/src/stores/globalVariables.ts | 6 +++++- src/frontend/src/types/zustand/globalVariables/index.ts | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 19f12e9d4..b2052ab84 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -43,9 +43,7 @@ export default function InputGlobalComponent({ function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { - deleteGlobalVariable(id) - .then((_) => { - removeGlobalVariable(key); + removeGlobalVariable(key).then((_) => { if ( data?.node?.template[name].value === key && data?.node?.template[name].load_from_db diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index ff0514042..5a2a67fa4 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,5 +1,6 @@ import { create } from "zustand"; import { GlobalVariablesStore } from "../types/zustand/globalVariables"; +import { deleteGlobalVariable } from "../controllers/API"; export const useGlobalVariablesStore = create( (set, get) => ({ @@ -29,7 +30,10 @@ export const useGlobalVariablesStore = create( globalVariablesEntries: Object.keys(newVariables), }); }, - removeGlobalVariable: (name) => { + removeGlobalVariable:async (name) => { + const id = get().globalVariables[name]?.id; + if (id === undefined) return; + await deleteGlobalVariable(id) const newVariables = { ...get().globalVariables }; delete newVariables[name]; set({ diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index d34973a17..0fc9bb473 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -5,7 +5,7 @@ export type GlobalVariablesStore = { [name: string]: { id: string; type?: string, default_fields?: string[]}; }) => void; addGlobalVariable: (name: string, id: string, type?: string, default_fields?: string[]) => void; - removeGlobalVariable: (name: string) => void; + removeGlobalVariable: (name: string) => Promise; getVariableId: (name: string) => string | undefined; unavaliableFields: Set; setUnavaliableFields: (fields: Set) => void; From 71a9051727030f420b8b4feb50b75096a68657eb Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 13:34:27 -0300 Subject: [PATCH 47/70] Add default_fields attribute to VariableRead model and update create_variable method in VariableService --- .../services/database/models/variable/model.py | 1 + .../base/langflow/services/variable/service.py | 11 ++++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/services/database/models/variable/model.py b/src/backend/base/langflow/services/database/models/variable/model.py index cf2236fe1..5c56f5b6d 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -52,6 +52,7 @@ class VariableRead(SQLModel): id: UUID name: Optional[str] = Field(None, description="Name of the variable") type: Optional[str] = Field(None, description="Type of the variable") + default_fields: Optional[List[str]] = Field(None, description="Default fields for the variable") class VariableUpdate(SQLModel): diff --git a/src/backend/base/langflow/services/variable/service.py b/src/backend/base/langflow/services/variable/service.py index ef23a95a2..ea5126d79 100644 --- a/src/backend/base/langflow/services/variable/service.py +++ b/src/backend/base/langflow/services/variable/service.py @@ -30,7 +30,14 @@ class VariableService(Service): if var in os.environ: logger.debug(f"Creating {var} variable from environment.") try: - self.create_variable(user_id, var, os.environ[var], _type="Credential", session=session) + self.create_variable( + user_id=user_id, + name=var, + value=os.environ[var], + default_fields=[], + _type="Credential", + session=session, + ) except Exception as e: logger.error(f"Error creating {var} variable: {e}") @@ -91,6 +98,7 @@ class VariableService(Service): user_id: Union[UUID, str], name: str, value: str, + default_fields: list[str] = [], _type: str = "Generic", session: Session = Depends(get_session), ): @@ -98,6 +106,7 @@ class VariableService(Service): name=name, type=_type, value=auth_utils.encrypt_api_key(value, settings_service=self.settings_service), + default_fields=default_fields, ) variable = Variable.model_validate(variable_base, from_attributes=True, update={"user_id": user_id}) session.add(variable) From 17403d817297a3fffddbba115e3b64aa6807c502 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 13:34:44 -0300 Subject: [PATCH 48/70] Refactored GlobalVariablesStore to include a value property in globalVariables object --- .../types/zustand/globalVariables/index.ts | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 0fc9bb473..45fda27cd 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -1,10 +1,23 @@ export type GlobalVariablesStore = { globalVariablesEntries: Array; - globalVariables: { [name: string]: { id: string; type?: string, default_fields?: string[] } }; + globalVariables: { + [name: string]: { + id: string; + type?: string; + default_fields?: string[]; + value?: string; + }; + }; setGlobalVariables: (variables: { - [name: string]: { id: string; type?: string, default_fields?: string[]}; + [name: string]: { id: string; type?: string; default_fields?: string[],value?: string }; }) => void; - addGlobalVariable: (name: string, id: string, type?: string, default_fields?: string[]) => void; + addGlobalVariable: ( + name: string, + id: string, + type?: string, + default_fields?: string[], + value?: string + ) => void; removeGlobalVariable: (name: string) => Promise; getVariableId: (name: string) => string | undefined; unavaliableFields: Set; From 15de984bb66921790cb95b21666b52e4b9b383c6 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 13:59:55 -0300 Subject: [PATCH 49/70] Refactor GlobalVariablesPage component to include default_fields in rowData --- src/frontend/src/controllers/API/index.ts | 3 ++- .../pages/GlobalVariablesPage/index.tsx | 25 ++++++++++++------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8c5cc6892..8770f1b5e 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -860,13 +860,14 @@ export async function requestLogout() { } export async function getGlobalVariables(): Promise<{ - [key: string]: { id: string; type: string }; + [key: string]: { id: string; type: string,default_fields:string[] }; }> { const globalVariables = {}; (await api.get(`${BASE_URL_API}variables/`)).data.forEach((element) => { globalVariables[element.name] = { id: element.id, type: element.type, + default_fields:element.default_fields }; }); return globalVariables; diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index d0d786985..cc65efcdb 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -33,18 +33,25 @@ export default function GlobalVariablesPage() {
); }; - const [rowData, setRowData] = useState<{ type: string | undefined; id: string; name: string; }[]>(); + + + const [rowData, setRowData] = useState<{ type: string | undefined; + id: string; name: string; default_fields:string | undefined }[]>(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; name: string}> = []; + const rows:Array<{type: string | undefined; id: string; + name: string;default_fields:string | undefined}> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; + console.log(globalVariableObj); rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, + default_fields: (globalVariableObj.default_fields??[]).join(", "), name: e, }); }); + console.log(rows); setRowData(rows); }, [globalVariables]); @@ -75,15 +82,15 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - { - field: "value", - cellEditor: "agLargeTextCellEditor", - flex: 2, - editable: false, - }, + // { + // field: "value", + // cellEditor: "agLargeTextCellEditor", + // flex: 2, + // editable: false, + // }, { headerName: "Apply To Fields", - field: "defaultFields", + field: "default_fields", flex: 1, editable: false, }, From df6924c73e55809f1d122a99aafb0fb614b1545b Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:20:38 -0300 Subject: [PATCH 50/70] Refactor GlobalVariablesPage component to include default_fields in rowData --- src/frontend/src/App.tsx | 4 +++- .../addNewVariableButton.tsx | 11 +++++++++-- src/frontend/src/utils/utils.ts | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 6c5af17df..d0a74982c 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -22,7 +22,7 @@ import useFlowsManagerStore from "./stores/flowsManagerStore"; import { useGlobalVariablesStore } from "./stores/globalVariables"; import { useStoreStore } from "./stores/storeStore"; import { useTypesStore } from "./stores/typesStore"; - +import { getUnavailableFields } from "./utils/utils"; export default function App() { const removeFromTempNotificationList = useAlertStore( (state) => state.removeFromTempNotificationList @@ -48,6 +48,7 @@ export default function App() { const setGlobalVariables = useGlobalVariablesStore( (state) => state.setGlobalVariables ); + const setUnavailableFields = useGlobalVariablesStore((state) => state.setUnavaliableFields); const checkHasStore = useStoreStore((state) => state.checkHasStore); const navigate = useNavigate(); const dark = useDarkStore((state) => state.dark); @@ -95,6 +96,7 @@ export default function App() { refreshFlows(); const res = await getGlobalVariables(); setGlobalVariables(res); + setUnavailableFields(getUnavailableFields(res)); checkHasStore(); fetchApiData(); } catch (error) { diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index aae36775d..b5a3dde26 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -22,9 +22,15 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); + const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); + const availableFields = Array.from(componentFields).filter((field) => !unavaliableFields.has(field)); const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); + console.log(componentFields); + console.log(unavaliableFields); + console.log(availableFields); + function handleSaveVariable() { let data: { name: string; value: string; type?: string; default_fields?: string[] } = { name: key, @@ -39,6 +45,7 @@ export default function AddNewVariableButton({ children }): JSX.Element { setKey(""); setValue(""); setType(""); + setFields([]); setOpen(false); }) .catch((error) => { @@ -98,8 +105,8 @@ export default function AddNewVariableButton({ children }): JSX.Element { setSelectedOptions={(value) => setFields(value)} selectedOptions={fields} password={false} - options={Array.from(componentFields)} - placeholder="Choose a type for the variable..." + options={availableFields} + placeholder="Choose a field for the variable..." >
diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index afcc264f6..43c8549eb 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -91,6 +91,21 @@ export function toTitleCase( .join(" "); } +export function getUnavailableFields( + variables:{[key: string]: { id: string; type: string,default_fields:string[] }} +): Set { + console.log(variables) + const set = new Set(); + Object.keys(variables).forEach((key) => { + if(variables[key].default_fields){ + variables[key].default_fields.forEach((field) => { + set.add(field); + }); + } + }); + return set; +} + export const upperCaseWords: string[] = ["llm", "uri"]; export function checkUpperWords(str: string): string { const words = str.split(" ").map((word) => { From ca1bb8dd36140f615533b61309cef4c34f653546 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:21:51 -0300 Subject: [PATCH 51/70] remove console.logs --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 3 --- .../src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx | 2 -- src/frontend/src/utils/reactflowUtils.ts | 1 - src/frontend/src/utils/utils.ts | 1 - 4 files changed, 7 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index b5a3dde26..a0da18db9 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -27,9 +27,6 @@ export default function AddNewVariableButton({ children }): JSX.Element { const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); - console.log(componentFields); - console.log(unavaliableFields); - console.log(availableFields); function handleSaveVariable() { let data: { name: string; value: string; type?: string; default_fields?: string[] } = { diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index cc65efcdb..802663924 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -43,7 +43,6 @@ export default function GlobalVariablesPage() { name: string;default_fields:string | undefined}> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; - console.log(globalVariableObj); rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, @@ -51,7 +50,6 @@ export default function GlobalVariablesPage() { name: e, }); }); - console.log(rows); setRowData(rows); }, [globalVariables]); diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index ad1244495..df56e0711 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1244,7 +1244,6 @@ export function extractFieldsFromComponenents(data:APIObjectType ) { }); }); }); - console.log(fields); return fields; } diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 43c8549eb..53c61ee77 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -94,7 +94,6 @@ export function toTitleCase( export function getUnavailableFields( variables:{[key: string]: { id: string; type: string,default_fields:string[] }} ): Set { - console.log(variables) const set = new Set(); Object.keys(variables).forEach((key) => { if(variables[key].default_fields){ From 242bd55a24ef6b33af442f94a16b3a4233ebdba1 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:26:15 -0300 Subject: [PATCH 52/70] Update AddNewVariableButton component to set default type value --- .../addNewVariableButtonComponent/addNewVariableButton.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index a0da18db9..abacdb6a8 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -17,7 +17,7 @@ import { useTypesStore } from "../../stores/typesStore"; export default function AddNewVariableButton({ children }): JSX.Element { const [key, setKey] = useState(""); const [value, setValue] = useState(""); - const [type, setType] = useState(""); + const [type, setType] = useState("Generic"); const [fields, setFields] = useState([]); const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); From 90f1efb18b8f7b2ac88d79f78aab083c7c347e6d Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:34:54 -0300 Subject: [PATCH 53/70] Refactor Alembic migration scripts and Variable model --- .../1f4d6df60295_add_default_fields_column.py | 2 - ...d85f_set_name_and_value_to_not_nullable.py | 52 +++++++++++++++++++ .../database/models/variable/model.py | 4 +- 3 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py diff --git a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py index 7b69058c2..7cf2fd083 100644 --- a/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py +++ b/src/backend/base/langflow/alembic/versions/1f4d6df60295_add_default_fields_column.py @@ -22,7 +22,6 @@ depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: @@ -35,7 +34,6 @@ def upgrade() -> None: def downgrade() -> None: conn = op.get_bind() inspector = Inspector.from_engine(conn) # type: ignore - table_names = inspector.get_table_names() # ### commands auto generated by Alembic - please adjust! ### column_names = [column["name"] for column in inspector.get_columns("variable")] with op.batch_alter_table("variable", schema=None) as batch_op: diff --git a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py new file mode 100644 index 000000000..26cf872ab --- /dev/null +++ b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py @@ -0,0 +1,52 @@ +"""Set name and value to not nullable + +Revision ID: c153816fd85f +Revises: 1f4d6df60295 +Create Date: 2024-04-30 14:31:23.898995 + +""" + +from typing import Sequence, Union + +import sqlalchemy as sa +from alembic import op +from sqlalchemy.engine.reflection import Inspector + +# revision identifiers, used by Alembic. +revision: str = "c153816fd85f" +down_revision: Union[str, None] = "1f4d6df60295" +branch_labels: Union[str, Sequence[str], None] = None +depends_on: Union[str, Sequence[str], None] = None + + +def upgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + # ### commands auto generated by Alembic - please adjust! ### + columns = inspector.get_columns("variable") + with op.batch_alter_table("variable", schema=None) as batch_op: + name_column = [column for column in columns if column["name"] == "name"][0] + if name_column and name_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) + value_column = [column for column in columns if column["name"] == "value"][0] + if value_column and value_column[0]["nullable"]: + batch_op.alter_column("value", existing_type=sa.VARCHAR(), nullable=False) + + +# ### end Alembic commands ### + + +def downgrade() -> None: + conn = op.get_bind() + inspector = Inspector.from_engine(conn) # type: ignore + columns = inspector.get_columns("variable") + # ### commands auto generated by Alembic - please adjust! ### + with op.batch_alter_table("variable", schema=None) as batch_op: + name_column = [column for column in columns if column["name"] == "name"][0] + if name_column and not name_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) + value_column = [column for column in columns if column["name"] == "value"][0] + if value_column and not value_column[0]["nullable"]: + batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) + + # ### end Alembic commands ### diff --git a/src/backend/base/langflow/services/database/models/variable/model.py b/src/backend/base/langflow/services/database/models/variable/model.py index 5c56f5b6d..bf61c25dc 100644 --- a/src/backend/base/langflow/services/database/models/variable/model.py +++ b/src/backend/base/langflow/services/database/models/variable/model.py @@ -13,8 +13,8 @@ def utc_now(): class VariableBase(SQLModel): - name: Optional[str] = Field(None, description="Name of the variable") - value: Optional[str] = Field(None, description="Encrypted value of the variable") + name: str = Field(description="Name of the variable") + value: str = Field(description="Encrypted value of the variable") default_fields: Optional[List[str]] = Field(sa_column=Column(JSON)) type: Optional[str] = Field(None, description="Type of the variable") From 027cfe81fc5745c4ab209e43f88a4fe416118bc7 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:35:09 -0300 Subject: [PATCH 54/70] format --- src/backend/base/langflow/components/models/AzureOpenAIModel.py | 1 - src/backend/base/langflow/components/models/ChatLiteLLMModel.py | 2 +- src/backend/base/langflow/schema/schema.py | 2 +- src/backend/base/langflow/services/database/service.py | 2 +- 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/backend/base/langflow/components/models/AzureOpenAIModel.py b/src/backend/base/langflow/components/models/AzureOpenAIModel.py index b6d3607f3..a2ee20b28 100644 --- a/src/backend/base/langflow/components/models/AzureOpenAIModel.py +++ b/src/backend/base/langflow/components/models/AzureOpenAIModel.py @@ -1,6 +1,5 @@ from typing import Optional -from langchain.llms.base import BaseLanguageModel from langchain_openai import AzureChatOpenAI from pydantic.v1 import SecretStr diff --git a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py index 23ac483cb..95574f0a5 100644 --- a/src/backend/base/langflow/components/models/ChatLiteLLMModel.py +++ b/src/backend/base/langflow/components/models/ChatLiteLLMModel.py @@ -4,7 +4,7 @@ from langchain_community.chat_models.litellm import ChatLiteLLM, ChatLiteLLMExce from langflow.base.constants import STREAM_INFO_TEXT from langflow.base.models.model import LCModelComponent -from langflow.field_typing import BaseLanguageModel, Text +from langflow.field_typing import Text class ChatLiteLLMModelComponent(LCModelComponent): diff --git a/src/backend/base/langflow/schema/schema.py b/src/backend/base/langflow/schema/schema.py index 979c78920..5d2967dac 100644 --- a/src/backend/base/langflow/schema/schema.py +++ b/src/backend/base/langflow/schema/schema.py @@ -4,7 +4,7 @@ from typing import Literal, Optional from langchain_core.documents import Document from langchain_core.messages import BaseMessage from pydantic import BaseModel, model_validator -from langchain_core.messages import HumanMessage, AIMessage, BaseMessage +from langchain_core.messages import HumanMessage, AIMessage class Record(BaseModel): diff --git a/src/backend/base/langflow/services/database/service.py b/src/backend/base/langflow/services/database/service.py index 5ca20c642..ee2812d32 100644 --- a/src/backend/base/langflow/services/database/service.py +++ b/src/backend/base/langflow/services/database/service.py @@ -133,7 +133,7 @@ class DatabaseService(Service): alembic_cfg = Config(stdout=buffer) # alembic_cfg.attributes["connection"] = session alembic_cfg.set_main_option("script_location", str(self.script_location)) - alembic_cfg.set_main_option("sqlalchemy.url", self.database_url.replace('%', '%%')) + alembic_cfg.set_main_option("sqlalchemy.url", self.database_url.replace("%", "%%")) should_initialize_alembic = False with Session(self.engine) as session: From 56342f4489c33ddd4a989eb7255fc4549dee13ce Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:35:28 -0300 Subject: [PATCH 55/70] Refactor globalVariables.ts to include unavaliableFields in useGlobalVariablesStore --- src/frontend/src/App.tsx | 1 - src/frontend/src/stores/globalVariables.ts | 4 ++++ src/frontend/src/utils/utils.ts | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index d0a74982c..1f3f76ac2 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -96,7 +96,6 @@ export default function App() { refreshFlows(); const res = await getGlobalVariables(); setGlobalVariables(res); - setUnavailableFields(getUnavailableFields(res)); checkHasStore(); fetchApiData(); } catch (error) { diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 5a2a67fa4..7d3113ff0 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,7 @@ import { create } from "zustand"; import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { deleteGlobalVariable } from "../controllers/API"; +import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( (set, get) => ({ @@ -20,6 +21,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: variables, globalVariablesEntries: Object.keys(variables), + unavaliableFields: getUnavailableFields(variables) }); }, addGlobalVariable: (name, id, type, default_fields) => { @@ -28,6 +30,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), + unavaliableFields: getUnavailableFields(newVariables) }); }, removeGlobalVariable:async (name) => { @@ -39,6 +42,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), + unavaliableFields: getUnavailableFields(newVariables) }); }, getVariableId: (name) => { diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 53c61ee77..87aa5e376 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -92,12 +92,12 @@ export function toTitleCase( } export function getUnavailableFields( - variables:{[key: string]: { id: string; type: string,default_fields:string[] }} + variables:{[key: string]: { default_fields?:string[] }} ): Set { const set = new Set(); Object.keys(variables).forEach((key) => { if(variables[key].default_fields){ - variables[key].default_fields.forEach((field) => { + variables[key].default_fields!.forEach((field) => { set.add(field); }); } From 854afe02acb989b135155000dd9624c2ef82f538 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:37:12 -0300 Subject: [PATCH 56/70] code format --- src/frontend/src/App.tsx | 5 ++-- .../addNewVariableButton.tsx | 19 +++++++++++---- .../components/dropdownComponent/index.tsx | 10 ++++++-- .../components/inputGlobalComponent/index.tsx | 4 ++-- src/frontend/src/controllers/API/index.ts | 8 +++---- src/frontend/src/pages/SettingsPage/index.tsx | 20 ++++++++-------- .../pages/GlobalVariablesPage/index.tsx | 23 +++++++++++++------ .../pages/ShortcutsPage/index.tsx | 4 +--- src/frontend/src/routes.tsx | 1 - src/frontend/src/stores/flowsManagerStore.ts | 20 ++++++++++++---- src/frontend/src/stores/globalVariables.ts | 12 +++++----- src/frontend/src/stores/typesStore.ts | 13 ++++++++--- .../types/zustand/globalVariables/index.ts | 7 +++++- src/frontend/src/utils/reactflowUtils.ts | 9 +++++--- src/frontend/src/utils/utils.ts | 8 +++---- 15 files changed, 106 insertions(+), 57 deletions(-) diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 1f3f76ac2..396906e91 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -22,7 +22,6 @@ import useFlowsManagerStore from "./stores/flowsManagerStore"; import { useGlobalVariablesStore } from "./stores/globalVariables"; import { useStoreStore } from "./stores/storeStore"; import { useTypesStore } from "./stores/typesStore"; -import { getUnavailableFields } from "./utils/utils"; export default function App() { const removeFromTempNotificationList = useAlertStore( (state) => state.removeFromTempNotificationList @@ -48,7 +47,9 @@ export default function App() { const setGlobalVariables = useGlobalVariablesStore( (state) => state.setGlobalVariables ); - const setUnavailableFields = useGlobalVariablesStore((state) => state.setUnavaliableFields); + const setUnavailableFields = useGlobalVariablesStore( + (state) => state.setUnavaliableFields + ); const checkHasStore = useStoreStore((state) => state.checkHasStore); const navigate = useNavigate(); const dark = useDarkStore((state) => state.dark); diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index abacdb6a8..d1e6c7ffa 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -3,6 +3,7 @@ import { registerGlobalVariable } from "../../controllers/API"; import BaseModal from "../../modals/baseModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; +import { useTypesStore } from "../../stores/typesStore"; import { ResponseErrorDetailAPI } from "../../types/api"; import ForwardedIconComponent from "../genericIconComponent"; import InputComponent from "../inputComponent"; @@ -10,7 +11,6 @@ import { Button } from "../ui/button"; import { Input } from "../ui/input"; import { Label } from "../ui/label"; import { Textarea } from "../ui/textarea"; -import { useTypesStore } from "../../stores/typesStore"; //TODO IMPLEMENT FORM LOGIC @@ -22,18 +22,27 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); - const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); - const availableFields = Array.from(componentFields).filter((field) => !unavaliableFields.has(field)); + const unavaliableFields = useGlobalVariablesStore( + (state) => state.unavaliableFields + ); + const availableFields = Array.from(componentFields).filter( + (field) => !unavaliableFields.has(field) + ); const addGlobalVariable = useGlobalVariablesStore( (state) => state.addGlobalVariable ); function handleSaveVariable() { - let data: { name: string; value: string; type?: string; default_fields?: string[] } = { + let data: { + name: string; + value: string; + type?: string; + default_fields?: string[]; + } = { name: key, type, value, - default_fields: fields + default_fields: fields, }; registerGlobalVariable(data) .then((res) => { diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index c3407aba8..b17332268 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -33,7 +33,9 @@ export default function Dropdown({ const refButton = useRef(null); - const PopoverContentDropdown = children ? PopoverContent : PopoverContentWithoutPortal; + const PopoverContentDropdown = children + ? PopoverContent + : PopoverContentWithoutPortal; return ( <> @@ -77,7 +79,11 @@ export default function Dropdown({ )} diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index b2052ab84..0d1b0ea40 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -1,5 +1,4 @@ import { useEffect } from "react"; -import { deleteGlobalVariable } from "../../controllers/API"; import DeleteConfirmationModal from "../../modals/DeleteConfirmationModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; @@ -43,7 +42,8 @@ export default function InputGlobalComponent({ function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { - removeGlobalVariable(key).then((_) => { + removeGlobalVariable(key) + .then((_) => { if ( data?.node?.template[name].value === key && data?.node?.template[name].load_from_db diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8770f1b5e..36c1d0fed 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -860,14 +860,14 @@ export async function requestLogout() { } export async function getGlobalVariables(): Promise<{ - [key: string]: { id: string; type: string,default_fields:string[] }; + [key: string]: { id: string; type: string; default_fields: string[] }; }> { const globalVariables = {}; (await api.get(`${BASE_URL_API}variables/`)).data.forEach((element) => { globalVariables[element.name] = { id: element.id, type: element.type, - default_fields:element.default_fields + default_fields: element.default_fields, }; }); return globalVariables; @@ -877,7 +877,7 @@ export async function registerGlobalVariable({ name, value, type, - default_fields=[], + default_fields = [], }: { name: string; value: string; @@ -888,7 +888,7 @@ export async function registerGlobalVariable({ name, value, type, - default_fields:default_fields + default_fields: default_fields, }); } diff --git a/src/frontend/src/pages/SettingsPage/index.tsx b/src/frontend/src/pages/SettingsPage/index.tsx index 86d47cd34..554be79b6 100644 --- a/src/frontend/src/pages/SettingsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/index.tsx @@ -16,16 +16,16 @@ export default function SettingsPage(): JSX.Element { const sidebarNavItems = [ { - title: "General", - href: "/settings/general", - icon: ( - - ), - }, - /* { + title: "General", + href: "/settings/general", + icon: ( + + ), + }, + /* { title: "Theme", href: "/settings/theme", icon: ( diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index 802663924..266712881 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -34,19 +34,29 @@ export default function GlobalVariablesPage() { ); }; - - const [rowData, setRowData] = useState<{ type: string | undefined; - id: string; name: string; default_fields:string | undefined }[]>(); + const [rowData, setRowData] = + useState< + { + type: string | undefined; + id: string; + name: string; + default_fields: string | undefined; + }[] + >(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; - name: string;default_fields:string | undefined}> = []; + const rows: Array<{ + type: string | undefined; + id: string; + name: string; + default_fields: string | undefined; + }> = []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, - default_fields: (globalVariableObj.default_fields??[]).join(", "), + default_fields: (globalVariableObj.default_fields ?? []).join(", "), name: e, }); }); @@ -92,7 +102,6 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - ]); const [selectedRows, setSelectedRows] = useState([]); diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index 1dac8d095..adcfcefef 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -124,9 +124,7 @@ export default function ShortcutsPage() { Flow - - Shortcuts relating to the flow. - + Shortcuts relating to the flow. ((set, get) => ({ ); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); set({ isLoading: false }); resolve(); @@ -199,7 +202,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); }, 200); // addFlowToLocalState(newFlow); @@ -222,7 +228,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); // Return the id @@ -252,7 +261,10 @@ const useFlowsManagerStore = create((set, get) => ({ set({ isLoading: false }); useTypesStore.setState((state) => ({ data: { ...state.data, ["saved_components"]: data }, - ComponentFields: extractFieldsFromComponenents({...state.data, ["saved_components"]: data }), + ComponentFields: extractFieldsFromComponenents({ + ...state.data, + ["saved_components"]: data, + }), })); resolve(); }); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 7d3113ff0..d67da5079 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,6 @@ import { create } from "zustand"; -import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { deleteGlobalVariable } from "../controllers/API"; +import { GlobalVariablesStore } from "../types/zustand/globalVariables"; import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( @@ -21,7 +21,7 @@ export const useGlobalVariablesStore = create( set({ globalVariables: variables, globalVariablesEntries: Object.keys(variables), - unavaliableFields: getUnavailableFields(variables) + unavaliableFields: getUnavailableFields(variables), }); }, addGlobalVariable: (name, id, type, default_fields) => { @@ -30,19 +30,19 @@ export const useGlobalVariablesStore = create( set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), - unavaliableFields: getUnavailableFields(newVariables) + unavaliableFields: getUnavailableFields(newVariables), }); }, - removeGlobalVariable:async (name) => { + removeGlobalVariable: async (name) => { const id = get().globalVariables[name]?.id; if (id === undefined) return; - await deleteGlobalVariable(id) + await deleteGlobalVariable(id); const newVariables = { ...get().globalVariables }; delete newVariables[name]; set({ globalVariables: newVariables, globalVariablesEntries: Object.keys(newVariables), - unavaliableFields: getUnavailableFields(newVariables) + unavaliableFields: getUnavailableFields(newVariables), }); }, getVariableId: (name) => { diff --git a/src/frontend/src/stores/typesStore.ts b/src/frontend/src/stores/typesStore.ts index f2539a8d3..c92236e03 100644 --- a/src/frontend/src/stores/typesStore.ts +++ b/src/frontend/src/stores/typesStore.ts @@ -2,7 +2,11 @@ import { create } from "zustand"; import { getAll } from "../controllers/API"; import { APIDataType } from "../types/api"; import { TypesStoreType } from "../types/zustand/types"; -import { extractFieldsFromComponenents, templatesGenerator, typesGenerator } from "../utils/reactflowUtils"; +import { + extractFieldsFromComponenents, + templatesGenerator, + typesGenerator, +} from "../utils/reactflowUtils"; import useAlertStore from "./alertStore"; import useFlowsManagerStore from "./flowsManagerStore"; @@ -28,7 +32,10 @@ export const useTypesStore = create((set, get) => ({ set((old) => ({ types: typesGenerator(data), data: { ...old.data, ...data }, - ComponentFields: extractFieldsFromComponenents({ ...old.data, ...data }), + ComponentFields: extractFieldsFromComponenents({ + ...old.data, + ...data, + }), templates: templatesGenerator(data), })); setLoading(false); @@ -50,7 +57,7 @@ export const useTypesStore = create((set, get) => ({ }, setData: (change: APIDataType | ((old: APIDataType) => APIDataType)) => { let newChange = typeof change === "function" ? change(get().data) : change; - set({ data: newChange}); + set({ data: newChange }); get().setComponentFields(extractFieldsFromComponenents(newChange)); }, })); diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index 45fda27cd..b69952993 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -9,7 +9,12 @@ export type GlobalVariablesStore = { }; }; setGlobalVariables: (variables: { - [name: string]: { id: string; type?: string; default_fields?: string[],value?: string }; + [name: string]: { + id: string; + type?: string; + default_fields?: string[]; + value?: string; + }; }) => void; addGlobalVariable: ( name: string, diff --git a/src/frontend/src/utils/reactflowUtils.ts b/src/frontend/src/utils/reactflowUtils.ts index df56e0711..deb470f80 100644 --- a/src/frontend/src/utils/reactflowUtils.ts +++ b/src/frontend/src/utils/reactflowUtils.ts @@ -1234,13 +1234,16 @@ export function templatesGenerator(data: APIObjectType) { }, {}); } -export function extractFieldsFromComponenents(data:APIObjectType ) { +export function extractFieldsFromComponenents(data: APIObjectType) { const fields = new Set(); Object.keys(data).forEach((key) => { Object.keys(data[key]).forEach((kind) => { Object.keys(data[key][kind].template).forEach((field) => { - if(data[key][kind].template[field].display_name && data[key][kind].template[field].show) - fields.add(data[key][kind].template[field].display_name!); + if ( + data[key][kind].template[field].display_name && + data[key][kind].template[field].show + ) + fields.add(data[key][kind].template[field].display_name!); }); }); }); diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 87aa5e376..3dafc3877 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -91,12 +91,12 @@ export function toTitleCase( .join(" "); } -export function getUnavailableFields( - variables:{[key: string]: { default_fields?:string[] }} -): Set { +export function getUnavailableFields(variables: { + [key: string]: { default_fields?: string[] }; +}): Set { const set = new Set(); Object.keys(variables).forEach((key) => { - if(variables[key].default_fields){ + if (variables[key].default_fields) { variables[key].default_fields!.forEach((field) => { set.add(field); }); From c56733f3a4338ec0a8802f6c1b63b7a817353a8c Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:38:07 -0300 Subject: [PATCH 57/70] Add .prettierignore file and update package.json to include ignore path for Prettier --- src/frontend/.prettierignore | 1 + src/frontend/package.json | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) create mode 100644 src/frontend/.prettierignore diff --git a/src/frontend/.prettierignore b/src/frontend/.prettierignore new file mode 100644 index 000000000..07ed7069a --- /dev/null +++ b/src/frontend/.prettierignore @@ -0,0 +1 @@ +build/* \ No newline at end of file diff --git a/src/frontend/package.json b/src/frontend/package.json index 26dc911af..bc8dcc041 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -72,7 +72,7 @@ "start": "vite", "build": "vite build", "serve": "vite preview", - "format": "npx prettier --write \"./**/*.{js,jsx,ts,tsx,json,md}\"", + "format": "npx prettier --write \"./**/*.{js,jsx,ts,tsx,json,md}\" --ignore-path .prettierignore", "type-check": "tsc --noEmit --pretty --project tsconfig.json && vite" }, "eslintConfig": { From d4a516c2eb0a7cb53da6062469bffb58f8638b24 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:40:36 -0300 Subject: [PATCH 58/70] Refactor useGlobalVariablesStore to update unavaliableFields in globalVariables.ts --- src/frontend/src/stores/globalVariables.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index d67da5079..636745d00 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -13,7 +13,9 @@ export const useGlobalVariablesStore = create( set({ unavaliableFields: get().unavaliableFields.add(field) }); }, removeUnavaliableField: (field) => { - get().unavaliableFields.delete(field); + const newFields = get().unavaliableFields; + newFields.delete(field); + set({ unavaliableFields: newFields }); }, globalVariablesEntries: [], globalVariables: {}, From 40aa3052791f51e6bf844fa235cb4ffedb4f29da Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 30 Apr 2024 14:45:01 -0300 Subject: [PATCH 59/70] =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Remove=20un?= =?UTF-8?q?used=20import=20and=20update=20dependencies=20in=20InputGlobalC?= =?UTF-8?q?omponent=20=F0=9F=93=9D=20(index.tsx):=20Add=20async/await=20to?= =?UTF-8?q?=20handleDelete=20function=20in=20InputGlobalComponent=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20re?= =?UTF-8?q?gisterGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20de?= =?UTF-8?q?leteGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Add=20try/catch=20block=20to=20up?= =?UTF-8?q?dateGlobalVariable=20function=20in=20API=20controller=20?= =?UTF-8?q?=F0=9F=93=9D=20(index.tsx):=20Remove=20unused=20import=20and=20?= =?UTF-8?q?add=20deleteGlobalVariable=20import=20in=20GlobalVariablesPage?= =?UTF-8?q?=20=F0=9F=93=9D=20(index.tsx):=20Add=20setErrorData=20and=20get?= =?UTF-8?q?VariableId=20hooks=20to=20GlobalVariablesPage=20=F0=9F=93=9D=20?= =?UTF-8?q?(index.tsx):=20Add=20async/await=20to=20removeVariables=20funct?= =?UTF-8?q?ion=20in=20GlobalVariablesPage=20=F0=9F=93=9D=20(globalVariable?= =?UTF-8?q?s.ts):=20Remove=20unused=20import=20in=20globalVariables=20stor?= =?UTF-8?q?e=20=F0=9F=93=9D=20(globalVariables.ts):=20Remove=20async/await?= =?UTF-8?q?=20from=20removeGlobalVariable=20function=20in=20globalVariable?= =?UTF-8?q?s=20store?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../components/inputGlobalComponent/index.tsx | 12 +++--- src/frontend/src/controllers/API/index.ts | 43 ++++++++++++++----- .../pages/GlobalVariablesPage/index.tsx | 30 ++++++++++--- src/frontend/src/stores/globalVariables.ts | 5 +-- 4 files changed, 64 insertions(+), 26 deletions(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index b2052ab84..f0f3f4cc3 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -3,7 +3,6 @@ import { deleteGlobalVariable } from "../../controllers/API"; import DeleteConfirmationModal from "../../modals/DeleteConfirmationModal"; import useAlertStore from "../../stores/alertStore"; import { useGlobalVariablesStore } from "../../stores/globalVariables"; -import { ResponseErrorDetailAPI } from "../../types/api"; import { InputGlobalComponentType } from "../../types/components"; import { cn } from "../../utils/utils"; import AddNewVariableButton from "../addNewVariableButtonComponent/addNewVariableButton"; @@ -40,10 +39,12 @@ export default function InputGlobalComponent({ } }, [globalVariablesEntries]); - function handleDelete(key: string) { + async function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { - removeGlobalVariable(key).then((_) => { + await deleteGlobalVariable(id) + .then(() => { + removeGlobalVariable(key); if ( data?.node?.template[name].value === key && data?.node?.template[name].load_from_db @@ -52,11 +53,10 @@ export default function InputGlobalComponent({ setDb(false); } }) - .catch((error) => { - let responseError = error as ResponseErrorDetailAPI; + .catch(() => { setErrorData({ title: "Error deleting variable", - list: [responseError.response.data.detail ?? "Unknown error"], + list: [cn("ID not found for variable: ", key)], }); }); } else { diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 8c5cc6892..3e9c1cc22 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -883,16 +883,29 @@ export async function registerGlobalVariable({ type?: string; default_fields?: string[]; }): Promise> { - return await api.post(`${BASE_URL_API}variables/`, { - name, - value, - type, - default_fields:default_fields - }); + try{ + const response = await api.post(`${BASE_URL_API}variables/`, { + name, + value, + type, + default_fields:default_fields + }); + return response; + } + catch(error){ + throw error; + } + } export async function deleteGlobalVariable(id: string) { - api.delete(`${BASE_URL_API}variables/${id}`); + try{ + const response = await api.delete(`${BASE_URL_API}variables/${id}`); + return response; + } + catch(error){ + throw error; + } } export async function updateGlobalVariable( @@ -900,10 +913,18 @@ export async function updateGlobalVariable( value: string, id: string ) { - api.patch(`${BASE_URL_API}variables/${id}`, { - name, - value, - }); + try{ + const response = api.patch(`${BASE_URL_API}variables/${id}`, { + name, + value, + }); + + return response; + } + catch(error){ + throw error; + } + } export async function getVerticesOrder( diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index d0d786985..e9e5bef18 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -8,6 +8,8 @@ import Dropdown from "../../../../components/dropdownComponent"; import ForwardedIconComponent from "../../../../components/genericIconComponent"; import TableComponent from "../../../../components/tableComponent"; import { Badge } from "../../../../components/ui/badge"; +import { deleteGlobalVariable } from "../../../../controllers/API"; +import useAlertStore from "../../../../stores/alertStore"; import { useGlobalVariablesStore } from "../../../../stores/globalVariables"; import { cn } from "../../../../utils/utils"; @@ -21,6 +23,8 @@ export default function GlobalVariablesPage() { const globalVariables = useGlobalVariablesStore( (state) => state.globalVariables ); + const setErrorData = useAlertStore((state) => state.setErrorData); + const getVariableId = useGlobalVariablesStore((state) => state.getVariableId); const BadgeRenderer = (props) => { return props.value !== "" ? ( @@ -33,10 +37,12 @@ export default function GlobalVariablesPage() {
); }; - const [rowData, setRowData] = useState<{ type: string | undefined; id: string; name: string; }[]>(); + const [rowData, setRowData] = + useState<{ type: string | undefined; id: string; name: string }[]>(); useEffect(() => { - const rows:Array<{type: string | undefined; id: string; name: string}> = []; + const rows: Array<{ type: string | undefined; id: string; name: string }> = + []; globalVariablesEntries.forEach((e) => { const globalVariableObj = globalVariables[e]; rows.push({ @@ -87,15 +93,27 @@ export default function GlobalVariablesPage() { flex: 1, editable: false, }, - ]); const [selectedRows, setSelectedRows] = useState([]); - function removeVariables() { - selectedRows.forEach((row) => { - removeGlobalVariable(row); + async function removeVariables() { + const deleteGlobalVariablesPromise = selectedRows.map(async (row) => { + const id = getVariableId(row); + const deleteGlobalVariables = deleteGlobalVariable(id!); + await deleteGlobalVariables; }); + Promise.all(deleteGlobalVariablesPromise) + .then(() => { + selectedRows.forEach((row) => { + removeGlobalVariable(row); + }); + }) + .catch(() => { + setErrorData({ + title: `Error deleting global variables.`, + }); + }); } return ( diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 5a2a67fa4..701b7700e 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -1,6 +1,5 @@ import { create } from "zustand"; import { GlobalVariablesStore } from "../types/zustand/globalVariables"; -import { deleteGlobalVariable } from "../controllers/API"; export const useGlobalVariablesStore = create( (set, get) => ({ @@ -30,10 +29,10 @@ export const useGlobalVariablesStore = create( globalVariablesEntries: Object.keys(newVariables), }); }, - removeGlobalVariable:async (name) => { + removeGlobalVariable: async (name) => { const id = get().globalVariables[name]?.id; if (id === undefined) return; - await deleteGlobalVariable(id) + const newVariables = { ...get().globalVariables }; delete newVariables[name]; set({ From 354a7b5985a307af7bae19d1cf23f1fc7b8f541f Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 14:46:28 -0300 Subject: [PATCH 60/70] Refactor Alembic migration scripts to set name and value columns as not nullable --- .../c153816fd85f_set_name_and_value_to_not_nullable.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py index 26cf872ab..cec3f6081 100644 --- a/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py +++ b/src/backend/base/langflow/alembic/versions/c153816fd85f_set_name_and_value_to_not_nullable.py @@ -26,10 +26,10 @@ def upgrade() -> None: columns = inspector.get_columns("variable") with op.batch_alter_table("variable", schema=None) as batch_op: name_column = [column for column in columns if column["name"] == "name"][0] - if name_column and name_column[0]["nullable"]: + if name_column and name_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=False) value_column = [column for column in columns if column["name"] == "value"][0] - if value_column and value_column[0]["nullable"]: + if value_column and value_column["nullable"]: batch_op.alter_column("value", existing_type=sa.VARCHAR(), nullable=False) @@ -43,10 +43,10 @@ def downgrade() -> None: # ### commands auto generated by Alembic - please adjust! ### with op.batch_alter_table("variable", schema=None) as batch_op: name_column = [column for column in columns if column["name"] == "name"][0] - if name_column and not name_column[0]["nullable"]: + if name_column and not name_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) value_column = [column for column in columns if column["name"] == "value"][0] - if value_column and not value_column[0]["nullable"]: + if value_column and not value_column["nullable"]: batch_op.alter_column("name", existing_type=sa.VARCHAR(), nullable=True) # ### end Alembic commands ### From ec490a78a80cb92e285926f4aa5d3dfa97d575db Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 14:56:51 -0300 Subject: [PATCH 61/70] update UnavaliableFields structure --- .../addNewVariableButton.tsx | 5 +++-- src/frontend/src/stores/globalVariables.ts | 7 ++----- src/frontend/src/types/zustand/globalVariables/index.ts | 5 ++--- src/frontend/src/utils/utils.ts | 8 ++++---- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx index d1e6c7ffa..e5e8dd488 100644 --- a/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx +++ b/src/frontend/src/components/addNewVariableButtonComponent/addNewVariableButton.tsx @@ -22,9 +22,10 @@ export default function AddNewVariableButton({ children }): JSX.Element { const [open, setOpen] = useState(false); const setErrorData = useAlertStore((state) => state.setErrorData); const componentFields = useTypesStore((state) => state.ComponentFields); - const unavaliableFields = useGlobalVariablesStore( + const unavaliableFields =new Set(Object.keys(useGlobalVariablesStore( (state) => state.unavaliableFields - ); + ))); + const availableFields = Array.from(componentFields).filter( (field) => !unavaliableFields.has(field) ); diff --git a/src/frontend/src/stores/globalVariables.ts b/src/frontend/src/stores/globalVariables.ts index 636745d00..a66bf1589 100644 --- a/src/frontend/src/stores/globalVariables.ts +++ b/src/frontend/src/stores/globalVariables.ts @@ -5,16 +5,13 @@ import { getUnavailableFields } from "../utils/utils"; export const useGlobalVariablesStore = create( (set, get) => ({ - unavaliableFields: new Set(), + unavaliableFields: {}, setUnavaliableFields: (fields) => { set({ unavaliableFields: fields }); }, - addUnavaliableField: (field) => { - set({ unavaliableFields: get().unavaliableFields.add(field) }); - }, removeUnavaliableField: (field) => { const newFields = get().unavaliableFields; - newFields.delete(field); + delete newFields[field]; set({ unavaliableFields: newFields }); }, globalVariablesEntries: [], diff --git a/src/frontend/src/types/zustand/globalVariables/index.ts b/src/frontend/src/types/zustand/globalVariables/index.ts index b69952993..752336c19 100644 --- a/src/frontend/src/types/zustand/globalVariables/index.ts +++ b/src/frontend/src/types/zustand/globalVariables/index.ts @@ -25,8 +25,7 @@ export type GlobalVariablesStore = { ) => void; removeGlobalVariable: (name: string) => Promise; getVariableId: (name: string) => string | undefined; - unavaliableFields: Set; - setUnavaliableFields: (fields: Set) => void; - addUnavaliableField: (field: string) => void; + unavaliableFields: {[name: string]: string}; + setUnavaliableFields: (fields: {[name: string]: string}) => void; removeUnavaliableField: (field: string) => void; }; diff --git a/src/frontend/src/utils/utils.ts b/src/frontend/src/utils/utils.ts index 3dafc3877..1c580fa4b 100644 --- a/src/frontend/src/utils/utils.ts +++ b/src/frontend/src/utils/utils.ts @@ -93,16 +93,16 @@ export function toTitleCase( export function getUnavailableFields(variables: { [key: string]: { default_fields?: string[] }; -}): Set { - const set = new Set(); +}): {[name: string]: string} { + const unVariables:{[name: string]: string} = {}; Object.keys(variables).forEach((key) => { if (variables[key].default_fields) { variables[key].default_fields!.forEach((field) => { - set.add(field); + unVariables[field] = key; }); } }); - return set; + return unVariables; } export const upperCaseWords: string[] = ["llm", "uri"]; From 6261c71e01d64e521111e2524403c3ed6e2b3be3 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 15:11:26 -0300 Subject: [PATCH 62/70] Update InputGlobalComponent to handle unavaliableFields in useGlobalVariablesStore --- .../src/components/inputGlobalComponent/index.tsx | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 0d1b0ea40..6bd598778 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -23,6 +23,7 @@ export default function InputGlobalComponent({ ); const getVariableId = useGlobalVariablesStore((state) => state.getVariableId); + const unavaliableFields = useGlobalVariablesStore((state) => state.unavaliableFields); const removeGlobalVariable = useGlobalVariablesStore( (state) => state.removeGlobalVariable ); @@ -39,6 +40,15 @@ export default function InputGlobalComponent({ } }, [globalVariablesEntries]); + useEffect(() => { + if (!data.node?.template[name].value && data.node?.template[name].display_name) { + if(unavaliableFields[data.node?.template[name].display_name!]){ + setDb(true); + onChange(unavaliableFields[data.node?.template[name].display_name!]); + } + } + },[unavaliableFields]); + function handleDelete(key: string) { const id = getVariableId(key); if (id !== undefined) { From 4bbba570fe28e9bac8e97506bd9c0017f88f9c79 Mon Sep 17 00:00:00 2001 From: Gabriel Luiz Freitas Almeida Date: Tue, 30 Apr 2024 15:18:36 -0300 Subject: [PATCH 63/70] Fix validation for empty variable name and value in create_variable function --- src/backend/base/langflow/api/v1/variable.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/backend/base/langflow/api/v1/variable.py b/src/backend/base/langflow/api/v1/variable.py index b1cca14c1..f992c1429 100644 --- a/src/backend/base/langflow/api/v1/variable.py +++ b/src/backend/base/langflow/api/v1/variable.py @@ -37,7 +37,11 @@ def create_variable( variable_dict["user_id"] = current_user.id db_variable = Variable.model_validate(variable_dict) - if not db_variable.value: + if not db_variable.name and not db_variable.value: + raise HTTPException(status_code=400, detail="Variable name and value cannot be empty") + elif not db_variable.name: + raise HTTPException(status_code=400, detail="Variable name cannot be empty") + elif not db_variable.value: raise HTTPException(status_code=400, detail="Variable value cannot be empty") encrypted = auth_utils.encrypt_api_key(db_variable.value, settings_service=settings_service) db_variable.value = encrypted From e82d8f482677850a9e5cdf2f9067e7c9c6a6c64c Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 15:47:52 -0300 Subject: [PATCH 64/70] Update InputGlobalComponent to handle unavaliableFields in useGlobalVariablesStore --- src/frontend/src/components/inputGlobalComponent/index.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 6bd598778..c6feb8037 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -125,7 +125,8 @@ export default function InputGlobalComponent({ )} selectedOption={ - data?.node?.template[name].load_from_db ?? false + data?.node?.template[name].load_from_db && + globalVariablesEntries.includes(data?.node?.template[name].value??"") ? data?.node?.template[name].value : "" } From 2fa7df09dcc5fc174770f53e6a4e02e68449def1 Mon Sep 17 00:00:00 2001 From: igorrCarvalho Date: Tue, 30 Apr 2024 17:09:03 -0300 Subject: [PATCH 65/70] Refactor: make global variables search input case insensitive --- src/frontend/src/components/inputComponent/index.tsx | 2 +- .../SettingsPage/pages/GlobalVariablesPage/index.tsx | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index 4f3a207cc..e18c2b559 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -173,7 +173,7 @@ export default function InputComponent({ > { - if (value.includes(search) || value.includes("doNotFilter-")) + if (value.toLowerCase().includes(search.toLowerCase()) || value.includes("doNotFilter-")) return 1; // ensures items arent filtered return 0; }} diff --git a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx index cc65efcdb..955a7cccd 100644 --- a/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/GlobalVariablesPage/index.tsx @@ -41,14 +41,15 @@ export default function GlobalVariablesPage() { useEffect(() => { const rows:Array<{type: string | undefined; id: string; name: string;default_fields:string | undefined}> = []; - globalVariablesEntries.forEach((e) => { - const globalVariableObj = globalVariables[e]; - console.log(globalVariableObj); + + globalVariablesEntries.forEach((entrie) => { + const globalVariableObj = globalVariables[entrie]; + rows.push({ type: globalVariableObj.type, id: globalVariableObj.id, default_fields: (globalVariableObj.default_fields??[]).join(", "), - name: e, + name: entrie, }); }); console.log(rows); From b8b978431d8b7ff80fea7f3bfa207d8a260dffea Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 30 Apr 2024 17:56:12 -0300 Subject: [PATCH 66/70] =?UTF-8?q?=F0=9F=93=9D=20(inputComponent/index.tsx)?= =?UTF-8?q?:=20improve=20code=20readability=20by=20formatting=20if=20state?= =?UTF-8?q?ment=20=F0=9F=93=9D=20(inputComponent/index.tsx):=20improve=20c?= =?UTF-8?q?ode=20readability=20by=20formatting=20if=20statement=20?= =?UTF-8?q?=F0=9F=93=9D=20(inputGlobalComponent/index.tsx):=20add=20delay?= =?UTF-8?q?=20before=20resetting=20input=20value=20and=20setting=20db=20fl?= =?UTF-8?q?ag=20to=20improve=20user=20experience=20=F0=9F=93=9D=20(inputGl?= =?UTF-8?q?obalComponent/index.tsx):=20add=20delay=20before=20resetting=20?= =?UTF-8?q?input=20value=20and=20setting=20db=20flag=20to=20improve=20user?= =?UTF-8?q?=20experience=20=F0=9F=93=9D=20(inputGlobalComponent/index.tsx)?= =?UTF-8?q?:=20add=20console.log=20for=20debugging=20purposes=20?= =?UTF-8?q?=F0=9F=93=9D=20(inputGlobalComponent/index.tsx):=20improve=20co?= =?UTF-8?q?de=20readability=20by=20formatting=20if=20statement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/inputComponent/index.tsx | 5 ++++- .../components/inputGlobalComponent/index.tsx | 17 ++++++++++++----- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index e18c2b559..e355293ff 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -173,7 +173,10 @@ export default function InputComponent({ > { - if (value.toLowerCase().includes(search.toLowerCase()) || value.includes("doNotFilter-")) + if ( + value.toLowerCase().includes(search.toLowerCase()) || + value.includes("doNotFilter-") + ) return 1; // ensures items arent filtered return 0; }} diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 235b00988..0f0097fcf 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -37,8 +37,10 @@ export default function InputGlobalComponent({ !globalVariablesEntries.includes(data.node?.template[name].value) && data.node?.template[name].load_from_db ) { - onChange(""); - setDb(false); + setTimeout(() => { + onChange(""); + setDb(false); + }, 100); } }, [globalVariablesEntries]); @@ -48,8 +50,10 @@ export default function InputGlobalComponent({ data.node?.template[name].display_name ) { if (unavaliableFields[data.node?.template[name].display_name!]) { - setDb(true); - onChange(unavaliableFields[data.node?.template[name].display_name!]); + setTimeout(() => { + setDb(true); + onChange(unavaliableFields[data.node?.template[name].display_name!]); + }, 100); } } }, [unavaliableFields]); @@ -81,6 +85,9 @@ export default function InputGlobalComponent({ }); } } + + console.log(data.node?.template[name], data.node?.template[name].password); + return ( Date: Tue, 30 Apr 2024 18:37:12 -0300 Subject: [PATCH 67/70] Update component names and shortcuts in ShortcutsPage --- .../pages/ShortcutsPage/index.tsx | 46 +++++-------------- 1 file changed, 12 insertions(+), 34 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index adcfcefef..6f911068b 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -36,44 +36,41 @@ export default function ShortcutsPage() { const [nodesRowData, setNodesRowData] = useState([ { - name: "Advanced Settings", + name: "Component Advanced Settings", shortcut: advancedShortcut, }, { - name: "Minimize", + name: "Component Minimize", shortcut: minizmizeShortcut, }, { - name: "Code", + name: "Component Code", shortcut: codeShortcut, }, { - name: "Copy", + name: "Component Copy", shortcut: copyShortcut, }, { - name: "Duplicate", + name: "Component Duplicate", shortcut: duplicateShortcut, }, { - name: "Share", + name: "Component Share", shortcut: shareShortcut, }, { - name: "Docs", + name: "Component Docs", shortcut: docsShortcut, }, { - name: "Save", + name: "Component Save", shortcut: saveShortcut, }, { - name: "Delete", + name: "Component Delete", shortcut: deleteShortcut, }, - ]); - - const [flowRowData, setFlowRowData] = useState([ { name: "Open Playground", shortcut: interactionShortcut, @@ -87,6 +84,7 @@ export default function ShortcutsPage() { shortcut: redoShortcut, }, ]); + return (
@@ -99,19 +97,13 @@ export default function ShortcutsPage() { />

- Customize, manage and create shortcuts for quick access to + Manage Shortcuts for quick access to frequently used actions.

- - - Nodes - - Shortcuts relating to the nodes in the workspace. - - + - - - Flow - Shortcuts relating to the flow. - - - - -
); From b054b4e42712fa8bc67efecd618df8061bbcbc49 Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 18:42:47 -0300 Subject: [PATCH 68/70] =?UTF-8?q?=F0=9F=90=9B=20(inputGlobalComponent/inde?= =?UTF-8?q?x.tsx):=20Fix=20condition=20to=20include=20disabled=20check=20i?= =?UTF-8?q?n=20if=20statement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/components/inputGlobalComponent/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 0f0097fcf..8cd1b5872 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -49,7 +49,7 @@ export default function InputGlobalComponent({ !data.node?.template[name].value && data.node?.template[name].display_name ) { - if (unavaliableFields[data.node?.template[name].display_name!]) { + if (unavaliableFields[data.node?.template[name].display_name!] && !disabled) { setTimeout(() => { setDb(true); onChange(unavaliableFields[data.node?.template[name].display_name!]); From 341b2cb7787bd2c372f7da56de735ddb08fa4b6a Mon Sep 17 00:00:00 2001 From: anovazzi1 Date: Tue, 30 Apr 2024 18:45:20 -0300 Subject: [PATCH 69/70] Update component names in ShortcutsPage --- .../SettingsPage/pages/ShortcutsPage/index.tsx | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx index 6f911068b..de2c92b2d 100644 --- a/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx +++ b/src/frontend/src/pages/SettingsPage/pages/ShortcutsPage/index.tsx @@ -36,39 +36,39 @@ export default function ShortcutsPage() { const [nodesRowData, setNodesRowData] = useState([ { - name: "Component Advanced Settings", + name: "Advanced Settings Component", shortcut: advancedShortcut, }, { - name: "Component Minimize", + name: "Minimize Component", shortcut: minizmizeShortcut, }, { - name: "Component Code", + name: "Code Component", shortcut: codeShortcut, }, { - name: "Component Copy", + name: "Copy Component", shortcut: copyShortcut, }, { - name: "Component Duplicate", + name: "Duplicate Component", shortcut: duplicateShortcut, }, { - name: "Component Share", + name: "Share Component", shortcut: shareShortcut, }, { - name: "Component Docs", + name: "Docs Component", shortcut: docsShortcut, }, { - name: "Component Save", + name: "Save Component", shortcut: saveShortcut, }, { - name: "Component Delete", + name: "Delete Component", shortcut: deleteShortcut, }, { From 4726341ec849d9f1e45ab505ee3de7080df1cb07 Mon Sep 17 00:00:00 2001 From: cristhianzl Date: Tue, 30 Apr 2024 22:01:29 -0300 Subject: [PATCH 70/70] =?UTF-8?q?=F0=9F=93=9D=20(inputGlobalComponent/inde?= =?UTF-8?q?x.tsx):=20remove=20unnecessary=20console.log=20statement?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/frontend/src/components/inputGlobalComponent/index.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/frontend/src/components/inputGlobalComponent/index.tsx b/src/frontend/src/components/inputGlobalComponent/index.tsx index 0f0097fcf..d86d41c86 100644 --- a/src/frontend/src/components/inputGlobalComponent/index.tsx +++ b/src/frontend/src/components/inputGlobalComponent/index.tsx @@ -85,9 +85,6 @@ export default function InputGlobalComponent({ }); } } - - console.log(data.node?.template[name], data.node?.template[name].password); - return (