diff --git a/src/backend/langflow/api/v1/base.py b/src/backend/langflow/api/v1/base.py index 28be40ae0..420e1645f 100644 --- a/src/backend/langflow/api/v1/base.py +++ b/src/backend/langflow/api/v1/base.py @@ -14,7 +14,7 @@ class Code(BaseModel): class FrontendNodeRequest(FrontendNode): - template: dict + template: dict # type: ignore class ValidatePromptRequest(BaseModel): diff --git a/src/backend/langflow/chat/utils.py b/src/backend/langflow/chat/utils.py index d070a7457..7db65b8e3 100644 --- a/src/backend/langflow/chat/utils.py +++ b/src/backend/langflow/chat/utils.py @@ -21,6 +21,10 @@ async def process_graph( # Generate result and thought try: + if not chat_inputs.message: + logger.debug("No message provided") + raise ValueError("No message provided") + logger.debug("Generating result and thought") result, intermediate_steps = await get_result_and_steps( langchain_object, chat_inputs.message, websocket=websocket diff --git a/src/backend/langflow/config.yaml b/src/backend/langflow/config.yaml index 032a2f049..f4f83301a 100644 --- a/src/backend/langflow/config.yaml +++ b/src/backend/langflow/config.yaml @@ -153,6 +153,7 @@ memories: documentation: "https://python.langchain.com/docs/modules/memory/how_to/vectorstore_retriever_memory" MongoDBChatMessageHistory: documentation: "https://python.langchain.com/docs/modules/memory/integrations/mongodb_chat_message_history" +prompts: ChatMessagePromptTemplate: documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/msg_prompt_templates" HumanMessagePromptTemplate: @@ -161,7 +162,6 @@ memories: documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/how_to/prompts" ChatPromptTemplate: documentation: "https://python.langchain.com/docs/modules/model_io/models/chat/how_to/prompts" -prompts: PromptTemplate: documentation: "https://python.langchain.com/docs/modules/model_io/prompts/prompt_templates/" textsplitters: @@ -280,6 +280,8 @@ vectorstores: wrappers: RequestsWrapper: documentation: "" + SQLDatabase: + documentation: "" output_parsers: StructuredOutputParser: documentation: "https://python.langchain.com/docs/modules/model_io/output_parsers/structured" diff --git a/src/backend/langflow/custom/customs.py b/src/backend/langflow/custom/customs.py index bbafb4526..58ef1b508 100644 --- a/src/backend/langflow/custom/customs.py +++ b/src/backend/langflow/custom/customs.py @@ -23,6 +23,7 @@ CUSTOM_NODES = { }, "memories": { "PostgresChatMessageHistory": frontend_node.memories.PostgresChatMessageHistoryFrontendNode(), + "MongoDBChatMessageHistory": frontend_node.memories.MongoDBChatMessageHistoryFrontendNode(), }, "chains": { "SeriesCharacterChain": frontend_node.chains.SeriesCharacterChainNode(), diff --git a/src/backend/langflow/interface/importing/utils.py b/src/backend/langflow/interface/importing/utils.py index 3c7f89b5b..ccfd8d5dd 100644 --- a/src/backend/langflow/interface/importing/utils.py +++ b/src/backend/langflow/interface/importing/utils.py @@ -10,6 +10,7 @@ from langchain.chains.base import Chain from langchain.chat_models.base import BaseChatModel from langchain.tools import BaseTool from langflow.utils import validate +from langflow.interface.wrappers.base import wrapper_creator def import_module(module_path: str) -> Any: @@ -96,7 +97,11 @@ def import_prompt(prompt: str) -> Type[PromptTemplate]: def import_wrapper(wrapper: str) -> Any: """Import wrapper from wrapper name""" - return import_module(f"from langchain.requests import {wrapper}") + if ( + isinstance(wrapper_creator.type_dict, dict) + and wrapper in wrapper_creator.type_dict + ): + return wrapper_creator.type_dict.get(wrapper) def import_toolkit(toolkit: str) -> Any: diff --git a/src/backend/langflow/interface/initialize/loading.py b/src/backend/langflow/interface/initialize/loading.py index 3c3616dd8..25149cd4b 100644 --- a/src/backend/langflow/interface/initialize/loading.py +++ b/src/backend/langflow/interface/initialize/loading.py @@ -20,6 +20,7 @@ from langflow.interface.toolkits.base import toolkits_creator from langflow.interface.chains.base import chain_creator from langflow.interface.output_parsers.base import output_parser_creator from langflow.interface.retrievers.base import retriever_creator +from langflow.interface.wrappers.base import wrapper_creator from langflow.interface.utils import load_file_into_dict from langflow.utils import validate from langchain.chains.base import Chain @@ -89,10 +90,21 @@ def instantiate_based_on_type(class_object, base_type, node_type, params): return instantiate_retriever(node_type, class_object, params) elif base_type == "memory": return instantiate_memory(node_type, class_object, params) + elif base_type == "wrappers": + return instantiate_wrapper(node_type, class_object, params) else: return class_object(**params) +def instantiate_wrapper(node_type, class_object, params): + if node_type in wrapper_creator.from_method_nodes: + method = wrapper_creator.from_method_nodes[node_type] + if class_method := getattr(class_object, method, None): + return class_method(**params) + raise ValueError(f"Method {method} not found in {class_object}") + return class_object(**params) + + def instantiate_output_parser(node_type, class_object, params): if node_type in output_parser_creator.from_method_nodes: method = output_parser_creator.from_method_nodes[node_type] @@ -115,7 +127,7 @@ def instantiate_memory(node_type, class_object, params): # process input_key and output_key to remove them if # they are empty strings for key in ["input_key", "output_key"]: - if key in params and not params[key]: + if key in params and (params[key] == "" or not params[key]): params.pop(key) try: @@ -193,7 +205,7 @@ def instantiate_prompt(node_type, class_object, params: Dict): prompt = class_object(**params) - format_kwargs = {} + format_kwargs: Dict[str, Any] = {} for input_variable in prompt.input_variables: if input_variable in params: variable = params[input_variable] diff --git a/src/backend/langflow/interface/wrappers/base.py b/src/backend/langflow/interface/wrappers/base.py index f5773d07a..77e38f921 100644 --- a/src/backend/langflow/interface/wrappers/base.py +++ b/src/backend/langflow/interface/wrappers/base.py @@ -1,25 +1,36 @@ from typing import Dict, List, Optional -from langchain import requests +from langchain import requests, sql_database from langflow.interface.base import LangChainTypeCreator from langflow.utils.logger import logger -from langflow.utils.util import build_template_from_class +from langflow.utils.util import build_template_from_class, build_template_from_method class WrapperCreator(LangChainTypeCreator): type_name: str = "wrappers" + from_method_nodes = {"SQLDatabase": "from_uri"} + @property def type_to_loader_dict(self) -> Dict: if self.type_dict is None: self.type_dict = { - wrapper.__name__: wrapper for wrapper in [requests.TextRequestsWrapper] + wrapper.__name__: wrapper + for wrapper in [requests.TextRequestsWrapper, sql_database.SQLDatabase] } return self.type_dict def get_signature(self, name: str) -> Optional[Dict]: try: + if name in self.from_method_nodes: + return build_template_from_method( + name, + type_to_cls_dict=self.type_to_loader_dict, + add_function=True, + method_name=self.from_method_nodes[name], + ) + return build_template_from_class(name, self.type_to_loader_dict) except ValueError as exc: raise ValueError("Wrapper not found") from exc diff --git a/src/backend/langflow/processing/base.py b/src/backend/langflow/processing/base.py index b39ad4af1..478b98816 100644 --- a/src/backend/langflow/processing/base.py +++ b/src/backend/langflow/processing/base.py @@ -1,3 +1,4 @@ +from typing import Union from langflow.api.v1.callback import ( AsyncStreamingLLMCallbackHandler, StreamingLLMCallbackHandler, @@ -6,7 +7,7 @@ from langflow.processing.process import fix_memory_inputs, format_actions from langflow.utils.logger import logger -async def get_result_and_steps(langchain_object, inputs: dict, **kwargs): +async def get_result_and_steps(langchain_object, inputs: Union[dict, str], **kwargs): """Get result and thought from extracted json""" try: diff --git a/src/backend/langflow/template/frontend_node/agents.py b/src/backend/langflow/template/frontend_node/agents.py index 5cae6a346..02aea78b9 100644 --- a/src/backend/langflow/template/frontend_node/agents.py +++ b/src/backend/langflow/template/frontend_node/agents.py @@ -19,8 +19,7 @@ class AgentFrontendNode(FrontendNode): if field.name in ["suffix", "prefix"]: field.show = True if field.name == "Tools" and name == "ZeroShotAgent": - # field. - field.type_name = "BaseTool" + field.field_type = "BaseTool" field.is_list = True diff --git a/src/backend/langflow/template/frontend_node/memories.py b/src/backend/langflow/template/frontend_node/memories.py index 6d490212f..d98a322ff 100644 --- a/src/backend/langflow/template/frontend_node/memories.py +++ b/src/backend/langflow/template/frontend_node/memories.py @@ -4,6 +4,10 @@ from langflow.template.field.base import TemplateField from langflow.template.frontend_node.base import FrontendNode from langflow.template.template.base import Template from langchain.memory.chat_message_histories.postgres import DEFAULT_CONNECTION_STRING +from langchain.memory.chat_message_histories.mongodb import ( + DEFAULT_COLLECTION_NAME, + DEFAULT_DBNAME, +) class MemoryFrontendNode(FrontendNode): @@ -120,3 +124,56 @@ class PostgresChatMessageHistoryFrontendNode(MemoryFrontendNode): ) description: str = "Memory store with Postgres" base_classes: list[str] = ["PostgresChatMessageHistory", "BaseChatMessageHistory"] + + +class MongoDBChatMessageHistoryFrontendNode(MemoryFrontendNode): + name: str = "MongoDBChatMessageHistory" + template: Template = Template( + # langchain/memory/chat_message_histories/mongodb.py + # connection_string: str, + # session_id: str, + # database_name: str = DEFAULT_DBNAME, + # collection_name: str = DEFAULT_COLLECTION_NAME, + type_name="MongoDBChatMessageHistory", + fields=[ + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + name="session_id", + ), + TemplateField( + field_type="str", + required=True, + show=True, + name="connection_string", + value="", + info="MongoDB connection string (e.g mongodb://mongo_user:password123@mongo:27017)", + ), + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + value=DEFAULT_DBNAME, + name="database_name", + ), + TemplateField( + field_type="str", + required=True, + placeholder="", + is_list=False, + show=True, + multiline=False, + value=DEFAULT_COLLECTION_NAME, + name="collection_name", + ), + ], + ) + description: str = "Memory store with MongoDB" + base_classes: list[str] = ["MongoDBChatMessageHistory", "BaseChatMessageHistory"] diff --git a/src/frontend/index.html b/src/frontend/index.html index 50bdae647..426983565 100644 --- a/src/frontend/index.html +++ b/src/frontend/index.html @@ -5,6 +5,7 @@ + Langflow diff --git a/src/frontend/package-lock.json b/src/frontend/package-lock.json index 1bd962f0a..6ac6b625c 100644 --- a/src/frontend/package-lock.json +++ b/src/frontend/package-lock.json @@ -85,6 +85,7 @@ "daisyui": "^3.1.1", "postcss": "^8.4.23", "prettier": "^2.8.8", + "prettier-plugin-organize-imports": "^3.2.2", "prettier-plugin-tailwindcss": "^0.3.0", "tailwindcss": "^3.3.2", "typescript": "^5.0.2", @@ -146,33 +147,33 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.5.tgz", - "integrity": "sha512-4Jc/YuIaYqKnDDz892kPIledykKg12Aw1PYX5i/TY28anJtacvM1Rrr8wbieB9GfEJwlzqT0hUEao0CxEebiDA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.5.tgz", - "integrity": "sha512-SBuTAjg91A3eKOvD+bPEz3LlhHZRNu1nFOVts9lzDJTXshHTjII0BAtDS3Y2DAkdZdDKWVZGVwkDfc4Clxn1dg==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", - "@babel/helper-compilation-targets": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", "@babel/helper-module-transforms": "^7.22.5", - "@babel/helpers": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.8", "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.2" }, "engines": { "node": ">=6.9.0" @@ -194,9 +195,9 @@ } }, "node_modules/@babel/generator": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.5.tgz", - "integrity": "sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", "dependencies": { "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", @@ -208,15 +209,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.5.tgz", - "integrity": "sha512-Ji+ywpHeuqxB8WDxraCiqR0xfhYjiDE/e6k7FuIaANnoOFxAHskHChz4vA1mJC9Lbm01s1PVAGhQY4FUKSkGZw==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", "dependencies": { - "@babel/compat-data": "^7.22.5", + "@babel/compat-data": "^7.22.6", "@babel/helper-validator-option": "^7.22.5", - "browserslist": "^4.21.3", - "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" }, "engines": { "node": ">=6.9.0" @@ -297,9 +298,9 @@ } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.5.tgz", - "integrity": "sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dependencies": { "@babel/types": "^7.22.5" }, @@ -332,12 +333,12 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.5.tgz", - "integrity": "sha512-pSXRmfE1vzcUIDFQcSGA5Mr+GxBV9oiRKDuDxXvWQQBCh8HoIjs/2DlDB7H8smac1IVrB9/xdXj2N3Wol9Cr+Q==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", "dependencies": { "@babel/template": "^7.22.5", - "@babel/traverse": "^7.22.5", + "@babel/traverse": "^7.22.6", "@babel/types": "^7.22.5" }, "engines": { @@ -358,9 +359,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.5.tgz", - "integrity": "sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==", + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", "bin": { "parser": "bin/babel-parser.js" }, @@ -404,17 +405,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.5.tgz", - "integrity": "sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==", + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", "dependencies": { "@babel/code-frame": "^7.22.5", - "@babel/generator": "^7.22.5", + "@babel/generator": "^7.22.7", "@babel/helper-environment-visitor": "^7.22.5", "@babel/helper-function-name": "^7.22.5", "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.5", - "@babel/parser": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", "@babel/types": "^7.22.5", "debug": "^4.1.0", "globals": "^11.1.0" @@ -1337,6 +1338,14 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, + "node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2662,39 +2671,6 @@ "node": ">= 10" } }, - "node_modules/@swc/cli/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/cli/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/cli/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/@swc/core": { "version": "1.3.62", "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.62.tgz", @@ -4124,14 +4100,14 @@ } }, "node_modules/bin-version-check": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.0.0.tgz", - "integrity": "sha512-Q3FMQnS5eZmrBGqmDXLs4dbAn/f+52voP6ykJYmweSA60t6DyH4UTSwZhtbK5UH+LBoWvDljILUQMLRUtsynsA==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-5.1.0.tgz", + "integrity": "sha512-bYsvMqJ8yNGILLz1KP9zKLzQ6YpljV3ln1gqhuLkUtyfGi3qXKGuK2p+U4NAvjVFzDFiBBtOpCOSFNuYYEGZ5g==", "dev": true, "dependencies": { "bin-version": "^6.0.0", - "semver": "^7.3.5", - "semver-truncate": "^2.0.0" + "semver": "^7.5.3", + "semver-truncate": "^3.0.0" }, "engines": { "node": ">=12" @@ -4140,39 +4116,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bin-version-check/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/bin-version-check/node_modules/semver": { - "version": "7.5.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.2.tgz", - "integrity": "sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/bin-version-check/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, "node_modules/bin-version/node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4306,9 +4249,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", "funding": [ { "type": "opencollective", @@ -4317,13 +4260,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -4438,9 +4385,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001486", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001486.tgz", - "integrity": "sha512-uv7/gXuHi10Whlj0pp5q/tsK/32J2QSqVRKQhs2j8VsDCjgyruAh/eEXHF822VqO9yT6iZKw3nRwZRSPBE9OQg==", + "version": "1.0.30001513", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz", + "integrity": "sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==", "funding": [ { "type": "opencollective", @@ -8616,6 +8563,26 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/prettier-plugin-organize-imports": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/prettier-plugin-organize-imports/-/prettier-plugin-organize-imports-3.2.2.tgz", + "integrity": "sha512-e97lE6odGSiHonHJMTYC0q0iLXQyw0u5z/PJpvP/3vRy6/Zi9kLBwFAbEGjDzIowpjQv8b+J04PDamoUSQbzGA==", + "dev": true, + "peerDependencies": { + "@volar/vue-language-plugin-pug": "^1.0.4", + "@volar/vue-typescript": "^1.0.4", + "prettier": ">=2.0", + "typescript": ">=2.9" + }, + "peerDependenciesMeta": { + "@volar/vue-language-plugin-pug": { + "optional": true + }, + "@volar/vue-typescript": { + "optional": true + } + } + }, "node_modules/prettier-plugin-tailwindcss": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.3.0.tgz", @@ -9507,11 +9474,18 @@ } }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" } }, "node_modules/semver-regex": { @@ -9527,17 +9501,38 @@ } }, "node_modules/semver-truncate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-2.0.0.tgz", - "integrity": "sha512-Rh266MLDYNeML5h90ttdMwfXe1+Nc4LAWd9X1KdJe8pPHP4kFmvLZALtsMNHNdvTyQygbEC0D59sIz47DIaq8w==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-3.0.0.tgz", + "integrity": "sha512-LJWA9kSvMolR51oDE6PN3kALBNaUdkxzAGcexw8gjMA8xr5zUqK0JiR3CgARSqanYF3Z1YHvsErb1KDgh+v7Rg==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.3.5" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/shadcn-ui": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/shadcn-ui/-/shadcn-ui-0.2.2.tgz", diff --git a/src/frontend/package.json b/src/frontend/package.json index aab383997..323a9a7be 100644 --- a/src/frontend/package.json +++ b/src/frontend/package.json @@ -106,6 +106,7 @@ "daisyui": "^3.1.1", "postcss": "^8.4.23", "prettier": "^2.8.8", + "prettier-plugin-organize-imports": "^3.2.2", "prettier-plugin-tailwindcss": "^0.3.0", "tailwindcss": "^3.3.2", "typescript": "^5.0.2", diff --git a/src/frontend/src/App.tsx b/src/frontend/src/App.tsx index 7335da19d..0088081ae 100644 --- a/src/frontend/src/App.tsx +++ b/src/frontend/src/App.tsx @@ -1,20 +1,19 @@ -import "reactflow/dist/style.css"; -import { useState, useEffect, useContext } from "react"; -import "./App.css"; -import { useLocation } from "react-router-dom"; import _ from "lodash"; +import { useContext, useEffect, useState } from "react"; +import { useLocation } from "react-router-dom"; +import "reactflow/dist/style.css"; +import "./App.css"; +import { ErrorBoundary } from "react-error-boundary"; import ErrorAlert from "./alerts/error"; import NoticeAlert from "./alerts/notice"; import SuccessAlert from "./alerts/success"; +import CrashErrorComponent from "./components/CrashErrorComponent"; +import Header from "./components/headerComponent"; import { alertContext } from "./contexts/alertContext"; import { locationContext } from "./contexts/locationContext"; -import { ErrorBoundary } from "react-error-boundary"; -import CrashErrorComponent from "./components/CrashErrorComponent"; import { TabsContext } from "./contexts/tabsContext"; -import { getVersion } from "./controllers/API"; import Router from "./routes"; -import Header from "./components/headerComponent"; export default function App() { let { setCurrent, setShowSideBar, setIsStackedOpen } = diff --git a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx index 8e22eafac..caa14975f 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/parameterComponent/index.tsx @@ -1,31 +1,30 @@ +import { Info } from "lucide-react"; +import React, { useContext, useEffect, useRef, useState } from "react"; import { Handle, Position, useUpdateNodeInternals } from "reactflow"; +import ShadTooltip from "../../../../components/ShadTooltipComponent"; +import CodeAreaComponent from "../../../../components/codeAreaComponent"; +import Dropdown from "../../../../components/dropdownComponent"; +import FloatComponent from "../../../../components/floatComponent"; +import InputComponent from "../../../../components/inputComponent"; +import InputFileComponent from "../../../../components/inputFileComponent"; +import InputListComponent from "../../../../components/inputListComponent"; +import IntComponent from "../../../../components/intComponent"; +import PromptAreaComponent from "../../../../components/promptComponent"; +import TextAreaComponent from "../../../../components/textAreaComponent"; +import ToggleShadComponent from "../../../../components/toggleShadComponent"; +import { PopUpContext } from "../../../../contexts/popUpContext"; +import { TabsContext } from "../../../../contexts/tabsContext"; +import { typesContext } from "../../../../contexts/typesContext"; +import { ParameterComponentType } from "../../../../types/components"; import { classNames, getRandomKeyByssmm, groupByFamily, isValidConnection, + nodeColors, nodeIconsLucide, + nodeNames, } from "../../../../utils"; -import { useContext, useEffect, useRef, useState } from "react"; -import InputComponent from "../../../../components/inputComponent"; -import InputListComponent from "../../../../components/inputListComponent"; -import TextAreaComponent from "../../../../components/textAreaComponent"; -import { typesContext } from "../../../../contexts/typesContext"; -import { ParameterComponentType } from "../../../../types/components"; -import FloatComponent from "../../../../components/floatComponent"; -import Dropdown from "../../../../components/dropdownComponent"; -import CodeAreaComponent from "../../../../components/codeAreaComponent"; -import InputFileComponent from "../../../../components/inputFileComponent"; -import { TabsContext } from "../../../../contexts/tabsContext"; -import IntComponent from "../../../../components/intComponent"; -import PromptAreaComponent from "../../../../components/promptComponent"; -import { nodeNames } from "../../../../utils"; -import React from "react"; -import { nodeColors } from "../../../../utils"; -import ShadTooltip from "../../../../components/ShadTooltipComponent"; -import { PopUpContext } from "../../../../contexts/popUpContext"; -import ToggleShadComponent from "../../../../components/toggleShadComponent"; -import { Info } from "lucide-react"; export default function ParameterComponent({ left, @@ -59,10 +58,6 @@ export default function ParameterComponent({ updateNodeInternals(data.id); }, [data.id, position, updateNodeInternals]); - const [enabled, setEnabled] = useState( - data.node.template[name]?.value ?? false - ); - useEffect(() => {}, [closePopUp, data.node.template]); const { reactFlowInstance } = useContext(typesContext); @@ -240,10 +235,9 @@ export default function ParameterComponent({
{ handleOnNewValue(t); - setEnabled(t); }} size="large" /> diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index 313be210c..5a727106b 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -1,3 +1,15 @@ +import { Zap } from "lucide-react"; +import { useContext, useEffect, useRef, useState } from "react"; +import { NodeToolbar } from "reactflow"; +import ShadTooltip from "../../components/ShadTooltipComponent"; +import Tooltip from "../../components/TooltipComponent"; +import { useSSE } from "../../contexts/SSEContext"; +import { alertContext } from "../../contexts/alertContext"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { typesContext } from "../../contexts/typesContext"; +import NodeModal from "../../modals/NodeModal"; +import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; +import { NodeDataType } from "../../types/flow"; import { classNames, nodeColors, @@ -5,18 +17,6 @@ import { toTitleCase, } from "../../utils"; import ParameterComponent from "./components/parameterComponent"; -import { typesContext } from "../../contexts/typesContext"; -import { useContext, useState, useEffect, useRef } from "react"; -import { NodeDataType } from "../../types/flow"; -import { alertContext } from "../../contexts/alertContext"; -import { PopUpContext } from "../../contexts/popUpContext"; -import NodeModal from "../../modals/NodeModal"; -import Tooltip from "../../components/TooltipComponent"; -import { NodeToolbar } from "reactflow"; -import NodeToolbarComponent from "../../pages/FlowPage/components/nodeToolbarComponent"; -import ShadTooltip from "../../components/ShadTooltipComponent"; -import { useSSE } from "../../contexts/SSEContext"; -import { Zap } from "lucide-react"; export default function GenericNode({ data, @@ -94,10 +94,7 @@ export default function GenericNode({ }} />
- +
{data.node.display_name}
diff --git a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx index 857bf0fb4..18475b039 100644 --- a/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/components/singleAlertComponent/index.tsx @@ -1,8 +1,8 @@ -import { Link } from "react-router-dom"; import { Transition } from "@headlessui/react"; +import { CheckCircle2, Info, X, XCircle } from "lucide-react"; import { useState } from "react"; +import { Link } from "react-router-dom"; import { SingleAlertComponentType } from "../../../../types/alerts"; -import { X, CheckCircle2, Info, XCircle } from "lucide-react"; export default function SingleAlert({ dropItem, diff --git a/src/frontend/src/alerts/alertDropDown/index.tsx b/src/frontend/src/alerts/alertDropDown/index.tsx index ef703f624..cd1ed9137 100644 --- a/src/frontend/src/alerts/alertDropDown/index.tsx +++ b/src/frontend/src/alerts/alertDropDown/index.tsx @@ -1,10 +1,10 @@ -import { useContext, useEffect, useRef } from "react"; +import { Trash2, X } from "lucide-react"; +import { useContext, useRef } from "react"; import { alertContext } from "../../contexts/alertContext"; -import SingleAlert from "./components/singleAlertComponent"; -import { AlertDropdownType } from "../../types/alerts"; import { PopUpContext } from "../../contexts/popUpContext"; +import { AlertDropdownType } from "../../types/alerts"; import { useOnClickOutside } from "../hooks/useOnClickOutside"; -import { X, Trash2 } from "lucide-react"; +import SingleAlert from "./components/singleAlertComponent"; export default function AlertDropdown({}: AlertDropdownType) { const { closePopUp } = useContext(PopUpContext); diff --git a/src/frontend/src/alerts/error/index.tsx b/src/frontend/src/alerts/error/index.tsx index d71980b7e..ed395018e 100644 --- a/src/frontend/src/alerts/error/index.tsx +++ b/src/frontend/src/alerts/error/index.tsx @@ -1,7 +1,7 @@ import { Transition } from "@headlessui/react"; +import { XCircle } from "lucide-react"; import { useEffect, useState } from "react"; import { ErrorAlertType } from "../../types/alerts"; -import { XCircle } from "lucide-react"; export default function ErrorAlert({ title, diff --git a/src/frontend/src/alerts/notice/index.tsx b/src/frontend/src/alerts/notice/index.tsx index eeb00cd42..c77a4bcd6 100644 --- a/src/frontend/src/alerts/notice/index.tsx +++ b/src/frontend/src/alerts/notice/index.tsx @@ -1,8 +1,8 @@ import { Transition } from "@headlessui/react"; +import { Info } from "lucide-react"; import { useEffect, useState } from "react"; import { Link } from "react-router-dom"; import { NoticeAlertType } from "../../types/alerts"; -import { Info } from "lucide-react"; export default function NoticeAlert({ title, diff --git a/src/frontend/src/alerts/success/index.tsx b/src/frontend/src/alerts/success/index.tsx index 95eaa1ba4..60dba1e93 100644 --- a/src/frontend/src/alerts/success/index.tsx +++ b/src/frontend/src/alerts/success/index.tsx @@ -1,7 +1,7 @@ import { Transition } from "@headlessui/react"; +import { CheckCircle2 } from "lucide-react"; import { useEffect, useState } from "react"; import { SuccessAlertType } from "../../types/alerts"; -import { CheckCircle2 } from "lucide-react"; export default function SuccessAlert({ title, diff --git a/src/frontend/src/assets/male-technologist.png b/src/frontend/src/assets/male-technologist.png new file mode 100644 index 000000000..3b5281237 Binary files /dev/null and b/src/frontend/src/assets/male-technologist.png differ diff --git a/src/frontend/src/assets/robot.png b/src/frontend/src/assets/robot.png new file mode 100644 index 000000000..81de3118d Binary files /dev/null and b/src/frontend/src/assets/robot.png differ diff --git a/src/frontend/src/components/AccordionComponent/index.tsx b/src/frontend/src/components/AccordionComponent/index.tsx index f03a2ad5f..ceeb938a8 100644 --- a/src/frontend/src/components/AccordionComponent/index.tsx +++ b/src/frontend/src/components/AccordionComponent/index.tsx @@ -1,16 +1,11 @@ -import { ReactElement, useContext, useEffect, useRef, useState } from "react"; -import { - AccordionComponentType, - ProgressBarType, -} from "../../types/components"; -import { Progress } from "../../components/ui/progress"; -import { setInterval } from "timers/promises"; +import { useState } from "react"; import { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "../../components/ui/accordion"; +import { AccordionComponentType } from "../../types/components"; export default function AccordionComponent({ trigger, diff --git a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx index b51722ad8..a0beb11f3 100644 --- a/src/frontend/src/components/EditFlowSettingsComponent/index.tsx +++ b/src/frontend/src/components/EditFlowSettingsComponent/index.tsx @@ -1,7 +1,7 @@ -import React, { useState, ChangeEvent } from "react"; -import { Textarea } from "../../components/ui/textarea"; -import { Label } from "../../components/ui/label"; +import React, { ChangeEvent, useState } from "react"; import { Input } from "../../components/ui/input"; +import { Label } from "../../components/ui/label"; +import { Textarea } from "../../components/ui/textarea"; type InputProps = { name: string | null; diff --git a/src/frontend/src/components/ExtraSidebarComponent/index.tsx b/src/frontend/src/components/ExtraSidebarComponent/index.tsx index 2386e29a8..e307e5234 100644 --- a/src/frontend/src/components/ExtraSidebarComponent/index.tsx +++ b/src/frontend/src/components/ExtraSidebarComponent/index.tsx @@ -1,8 +1,8 @@ import { Disclosure } from "@headlessui/react"; import { useContext } from "react"; import { Link } from "react-router-dom"; -import { classNames } from "../../utils"; import { locationContext } from "../../contexts/locationContext"; +import { classNames } from "../../utils"; export default function ExtraSidebar() { const { diff --git a/src/frontend/src/components/LightTooltipComponent/index.tsx b/src/frontend/src/components/LightTooltipComponent/index.tsx index 4cdc912d0..08ea76266 100644 --- a/src/frontend/src/components/LightTooltipComponent/index.tsx +++ b/src/frontend/src/components/LightTooltipComponent/index.tsx @@ -1,5 +1,5 @@ -import { styled } from "@mui/material/styles"; import Tooltip, { TooltipProps, tooltipClasses } from "@mui/material/Tooltip"; +import { styled } from "@mui/material/styles"; export const LightTooltip = styled(({ className, ...props }: TooltipProps) => ( diff --git a/src/frontend/src/components/LoadingSpinner/index.tsx b/src/frontend/src/components/LoadingSpinner/index.tsx index 642df9e22..ea02a88d6 100644 --- a/src/frontend/src/components/LoadingSpinner/index.tsx +++ b/src/frontend/src/components/LoadingSpinner/index.tsx @@ -1,6 +1,3 @@ -import { useContext, useEffect, useRef, useState } from "react"; -import { RadialProgressType } from "../../types/components"; - export default function LoadingSpinner({}) { return <>; } diff --git a/src/frontend/src/components/RadialProgress/index.tsx b/src/frontend/src/components/RadialProgress/index.tsx index b468b12e8..f277a9c80 100644 --- a/src/frontend/src/components/RadialProgress/index.tsx +++ b/src/frontend/src/components/RadialProgress/index.tsx @@ -1,4 +1,3 @@ -import { useContext, useEffect, useRef, useState } from "react"; import { RadialProgressType } from "../../types/components"; export default function RadialProgressComponent({ diff --git a/src/frontend/src/components/ShadTooltipComponent/index.tsx b/src/frontend/src/components/ShadTooltipComponent/index.tsx index d643a4d08..58aec630b 100644 --- a/src/frontend/src/components/ShadTooltipComponent/index.tsx +++ b/src/frontend/src/components/ShadTooltipComponent/index.tsx @@ -1,27 +1,26 @@ -import { RadialProgressType, ShadToolTipType } from "../../types/components"; -import { - Tooltip, - TooltipContent, - TooltipProvider, - TooltipTrigger, -} from "../ui/tooltip"; +import { ShadToolTipType } from "../../types/components"; +import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/tooltip"; export default function ShadTooltip({ content, side, asChild = true, children, - delayDuration, + style, + delayDuration = 500, }: ShadToolTipType) { return ( - - - {children} + + {children} - - {content} - - - + + {content} + + ); } diff --git a/src/frontend/src/components/TooltipComponent/index.tsx b/src/frontend/src/components/TooltipComponent/index.tsx index 0e571b1bc..91fa006ec 100644 --- a/src/frontend/src/components/TooltipComponent/index.tsx +++ b/src/frontend/src/components/TooltipComponent/index.tsx @@ -1,6 +1,5 @@ -import { ReactElement } from "react"; -import { LightTooltip } from "../LightTooltipComponent"; import { TooltipComponentType } from "../../types/components"; +import { LightTooltip } from "../LightTooltipComponent"; export default function Tooltip({ children, diff --git a/src/frontend/src/components/cardComponent/index.tsx b/src/frontend/src/components/cardComponent/index.tsx index 83228d92d..285aa91b7 100644 --- a/src/frontend/src/components/cardComponent/index.tsx +++ b/src/frontend/src/components/cardComponent/index.tsx @@ -1,26 +1,15 @@ -import { Trash2, ExternalLink } from "lucide-react"; +import { Trash2 } from "lucide-react"; import { useContext } from "react"; -import { Link } from "react-router-dom"; import { TabsContext } from "../../contexts/tabsContext"; import { FlowType } from "../../types/flow"; import { gradients } from "../../utils"; import { - CardTitle, + Card, CardDescription, CardFooter, - Card, CardHeader, + CardTitle, } from "../ui/card"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "../ui/dialog"; -import { Button } from "@mui/material"; export const CardComponent = ({ flow, @@ -47,30 +36,9 @@ export const CardComponent = ({ > {flow.name} {onDelete && ( - - - - - - - Are you sure absolutely sure? - - This action cannot be undone. Are you sure you want to - permanently delete this file from our servers? - - - - - - - + )} diff --git a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx index 4d47e2e1c..09ab90ff7 100644 --- a/src/frontend/src/components/chatComponent/buildTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/buildTrigger/index.tsx @@ -1,16 +1,16 @@ -import { useContext, useState } from "react"; import { Transition } from "@headlessui/react"; import { Zap } from "lucide-react"; -import { validateNodes } from "../../../utils"; -import { FlowType } from "../../../types/flow"; +import { useContext, useState } from "react"; import Loading from "../../../components/ui/loading"; import { useSSE } from "../../../contexts/SSEContext"; -import { typesContext } from "../../../contexts/typesContext"; import { alertContext } from "../../../contexts/alertContext"; +import { typesContext } from "../../../contexts/typesContext"; import { postBuildInit } from "../../../controllers/API"; +import { FlowType } from "../../../types/flow"; +import { validateNodes } from "../../../utils"; -import RadialProgressComponent from "../../RadialProgress"; import { TabsContext } from "../../../contexts/tabsContext"; +import RadialProgressComponent from "../../RadialProgress"; export default function BuildTrigger({ open, diff --git a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx index 2666e4e92..c0cd53550 100644 --- a/src/frontend/src/components/chatComponent/chatTrigger/index.tsx +++ b/src/frontend/src/components/chatComponent/chatTrigger/index.tsx @@ -1,7 +1,6 @@ import { Transition } from "@headlessui/react"; import { MessagesSquare } from "lucide-react"; -import { alertContext } from "../../../contexts/alertContext"; import { useContext } from "react"; import { CHAT_CANNOT_OPEN_DESCRIPTION, @@ -9,6 +8,7 @@ import { FLOW_NOT_BUILT_DESCRIPTION, FLOW_NOT_BUILT_TITLE, } from "../../../constants"; +import { alertContext } from "../../../contexts/alertContext"; export default function ChatTrigger({ open, setOpen, isBuilt, canOpen }) { const { setErrorData } = useContext(alertContext); diff --git a/src/frontend/src/components/chatComponent/index.tsx b/src/frontend/src/components/chatComponent/index.tsx index 9130be694..829dd5b13 100644 --- a/src/frontend/src/components/chatComponent/index.tsx +++ b/src/frontend/src/components/chatComponent/index.tsx @@ -1,14 +1,14 @@ import { useContext, useEffect, useRef, useState } from "react"; import { useNodes } from "reactflow"; import { ChatType } from "../../types/chat"; -import ChatTrigger from "./chatTrigger"; import BuildTrigger from "./buildTrigger"; +import ChatTrigger from "./chatTrigger"; -import { getBuildStatus } from "../../controllers/API"; -import { NodeType } from "../../types/flow"; -import FormModal from "../../modals/formModal"; -import { TabsContext } from "../../contexts/tabsContext"; import * as _ from "lodash"; +import { TabsContext } from "../../contexts/tabsContext"; +import { getBuildStatus } from "../../controllers/API"; +import FormModal from "../../modals/formModal"; +import { NodeType } from "../../types/flow"; export default function Chat({ flow }: ChatType) { const [open, setOpen] = useState(false); diff --git a/src/frontend/src/components/codeAreaComponent/index.tsx b/src/frontend/src/components/codeAreaComponent/index.tsx index 01a1ee9fe..07ceb0593 100644 --- a/src/frontend/src/components/codeAreaComponent/index.tsx +++ b/src/frontend/src/components/codeAreaComponent/index.tsx @@ -1,7 +1,6 @@ import { useContext, useEffect, useState } from "react"; import { PopUpContext } from "../../contexts/popUpContext"; import CodeAreaModal from "../../modals/codeAreaModal"; -import TextAreaModal from "../../modals/textAreaModal"; import { TextAreaComponentType } from "../../types/components"; import { ExternalLink } from "lucide-react"; diff --git a/src/frontend/src/components/dropdownComponent/index.tsx b/src/frontend/src/components/dropdownComponent/index.tsx index 84c036ec4..312ef2b82 100644 --- a/src/frontend/src/components/dropdownComponent/index.tsx +++ b/src/frontend/src/components/dropdownComponent/index.tsx @@ -1,9 +1,9 @@ import { Listbox, Transition } from "@headlessui/react"; +import { Check, ChevronsUpDown } from "lucide-react"; import { Fragment, useContext, useEffect, useState } from "react"; +import { PopUpContext } from "../../contexts/popUpContext"; import { DropDownComponentType } from "../../types/components"; import { classNames } from "../../utils"; -import { ChevronsUpDown, Check } from "lucide-react"; -import { PopUpContext } from "../../contexts/popUpContext"; export default function Dropdown({ value, @@ -63,8 +63,8 @@ export default function Dropdown({ diff --git a/src/frontend/src/components/floatComponent/index.tsx b/src/frontend/src/components/floatComponent/index.tsx index 1c72c7c45..548d608a3 100644 --- a/src/frontend/src/components/floatComponent/index.tsx +++ b/src/frontend/src/components/floatComponent/index.tsx @@ -1,7 +1,7 @@ import { useContext, useEffect, useState } from "react"; -import { FloatComponentType } from "../../types/components"; -import { TabsContext } from "../../contexts/tabsContext"; import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; +import { FloatComponentType } from "../../types/components"; export default function FloatComponent({ value, diff --git a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx index 41cb0bef9..a1536f13d 100644 --- a/src/frontend/src/components/headerComponent/components/menuBar/index.tsx +++ b/src/frontend/src/components/headerComponent/components/menuBar/index.tsx @@ -1,27 +1,25 @@ -import { useContext } from "react"; -import { TabsContext } from "../../../../contexts/tabsContext"; -import { PopUpContext } from "../../../../contexts/popUpContext"; import { - Plus, ChevronDown, ChevronLeft, - Undo, + Plus, Redo, Settings2, + Undo, } from "lucide-react"; +import { useContext } from "react"; +import { PopUpContext } from "../../../../contexts/popUpContext"; +import { TabsContext } from "../../../../contexts/tabsContext"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, - DropdownMenuTrigger, - DropdownMenuRadioGroup, - DropdownMenuRadioItem, DropdownMenuLabel, DropdownMenuSeparator, + DropdownMenuTrigger, } from "../../../ui/dropdown-menu"; -import { alertContext } from "../../../../contexts/alertContext"; import { Link, useNavigate } from "react-router-dom"; +import { alertContext } from "../../../../contexts/alertContext"; import { undoRedoContext } from "../../../../contexts/undoRedoContext"; import FlowSettingsModal from "../../../../modals/flowSettingsModal"; import { Button } from "../../../ui/button"; diff --git a/src/frontend/src/components/headerComponent/index.tsx b/src/frontend/src/components/headerComponent/index.tsx index e03f53518..895f01d79 100644 --- a/src/frontend/src/components/headerComponent/index.tsx +++ b/src/frontend/src/components/headerComponent/index.tsx @@ -1,19 +1,18 @@ -import { Home, MoonIcon, SunIcon, Users2 } from "lucide-react"; +import { Bell, Home, MoonIcon, SunIcon, Users2 } from "lucide-react"; import { useContext, useEffect, useState } from "react"; import { FaDiscord, FaGithub, FaTwitter } from "react-icons/fa"; -import { Button } from "../ui/button"; -import { TabsContext } from "../../contexts/tabsContext"; +import { Link, useLocation, useParams } from "react-router-dom"; import AlertDropdown from "../../alerts/alertDropDown"; +import { USER_PROJECTS_HEADER } from "../../constants"; import { alertContext } from "../../contexts/alertContext"; import { darkContext } from "../../contexts/darkContext"; import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; import { typesContext } from "../../contexts/typesContext"; -import MenuBar from "./components/menuBar"; -import { Link, useLocation, useParams } from "react-router-dom"; -import { USER_PROJECTS_HEADER } from "../../constants"; import { getRepoStars } from "../../controllers/API"; +import { Button } from "../ui/button"; import { Separator } from "../ui/separator"; -import { Bell } from "lucide-react"; +import MenuBar from "./components/menuBar"; export default function Header() { const { flows, addFlow, tabId } = useContext(TabsContext); diff --git a/src/frontend/src/components/inputComponent/index.tsx b/src/frontend/src/components/inputComponent/index.tsx index d180a5fa0..8da5c428e 100644 --- a/src/frontend/src/components/inputComponent/index.tsx +++ b/src/frontend/src/components/inputComponent/index.tsx @@ -1,8 +1,8 @@ import { useContext, useEffect, useState } from "react"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; import { InputComponentType } from "../../types/components"; import { classNames } from "../../utils"; -import { TabsContext } from "../../contexts/tabsContext"; -import { PopUpContext } from "../../contexts/popUpContext"; export default function InputComponent({ value, @@ -39,11 +39,13 @@ export default function InputComponent({ if (disableCopyPaste) setDisableCopyPaste(false); }} className={classNames( - " pr-12 ", disabled ? " input-disable " : "", - password && !pwdVisible && myValue !== "" ? "password" : "", + password && !pwdVisible && myValue !== "" + ? " text-clip password " + : "", editNode ? " input-edit-node " : " input-primary ", - password && editNode ? "pr-8" : "pr-3" + password && editNode ? "pr-8" : "", + password && !editNode ? "pr-10" : "" )} placeholder={password && editNode ? "Key" : "Type something..."} onChange={(e) => { diff --git a/src/frontend/src/components/inputFileComponent/index.tsx b/src/frontend/src/components/inputFileComponent/index.tsx index 505515bf5..fc69e5f95 100644 --- a/src/frontend/src/components/inputFileComponent/index.tsx +++ b/src/frontend/src/components/inputFileComponent/index.tsx @@ -1,9 +1,9 @@ +import { FileSearch2 } from "lucide-react"; import { useContext, useEffect, useState } from "react"; import { alertContext } from "../../contexts/alertContext"; -import { FileComponentType } from "../../types/components"; import { TabsContext } from "../../contexts/tabsContext"; -import { FileSearch2 } from "lucide-react"; import { uploadFile } from "../../controllers/API"; +import { FileComponentType } from "../../types/components"; export default function InputFileComponent({ value, @@ -98,8 +98,10 @@ export default function InputFileComponent({ onClick={handleButtonClick} className={ editNode - ? "input-edit-node " + "input-primary " - : "input-primary " + (disabled ? "input-disable " : "") + ? " input-edit-node " + " input-dialog " + : (disabled ? " input-disable " : "") + + " input-primary " + + " input-dialog " } > {myValue !== "" ? myValue : "No file"} diff --git a/src/frontend/src/components/inputListComponent/index.tsx b/src/frontend/src/components/inputListComponent/index.tsx index 7dd6d79c6..d165d58a2 100644 --- a/src/frontend/src/components/inputListComponent/index.tsx +++ b/src/frontend/src/components/inputListComponent/index.tsx @@ -1,9 +1,8 @@ import { useContext, useEffect, useState } from "react"; import { InputListComponentType } from "../../types/components"; -import { TabsContext } from "../../contexts/tabsContext"; import _ from "lodash"; -import { X, Plus } from "lucide-react"; +import { Plus, X } from "lucide-react"; import { PopUpContext } from "../../contexts/popUpContext"; export default function InputListComponent({ diff --git a/src/frontend/src/components/intComponent/index.tsx b/src/frontend/src/components/intComponent/index.tsx index 473febd91..2428d03ee 100644 --- a/src/frontend/src/components/intComponent/index.tsx +++ b/src/frontend/src/components/intComponent/index.tsx @@ -1,8 +1,7 @@ import { useContext, useEffect, useState } from "react"; -import { FloatComponentType } from "../../types/components"; -import { TabsContext } from "../../contexts/tabsContext"; -import { classNames } from "../../utils"; import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; +import { FloatComponentType } from "../../types/components"; export default function IntComponent({ value, diff --git a/src/frontend/src/components/promptComponent/index.tsx b/src/frontend/src/components/promptComponent/index.tsx index 7e90f323c..7385518c8 100644 --- a/src/frontend/src/components/promptComponent/index.tsx +++ b/src/frontend/src/components/promptComponent/index.tsx @@ -1,13 +1,13 @@ import { useContext, useEffect, useState } from "react"; import { PopUpContext } from "../../contexts/popUpContext"; -import { TextAreaComponentType } from "../../types/components"; import GenericModal from "../../modals/genericModal"; +import { TextAreaComponentType } from "../../types/components"; import { TypeModal } from "../../utils"; -import { ExternalLink } from "lucide-react"; -import { postValidatePrompt } from "../../controllers/API"; -import { typesContext } from "../../contexts/typesContext"; import * as _ from "lodash"; +import { ExternalLink } from "lucide-react"; +import { typesContext } from "../../contexts/typesContext"; +import { postValidatePrompt } from "../../controllers/API"; export default function PromptAreaComponent({ field_name, diff --git a/src/frontend/src/components/textAreaComponent/index.tsx b/src/frontend/src/components/textAreaComponent/index.tsx index 6b41cbe40..a50969cfb 100644 --- a/src/frontend/src/components/textAreaComponent/index.tsx +++ b/src/frontend/src/components/textAreaComponent/index.tsx @@ -1,8 +1,8 @@ import { useContext, useEffect, useState } from "react"; import { PopUpContext } from "../../contexts/popUpContext"; -import { TextAreaComponentType } from "../../types/components"; import GenericModal from "../../modals/genericModal"; -import { TypeModal, classNames } from "../../utils"; +import { TextAreaComponentType } from "../../types/components"; +import { TypeModal } from "../../utils"; import { ExternalLink } from "lucide-react"; diff --git a/src/frontend/src/components/toggleComponent/index.tsx b/src/frontend/src/components/toggleComponent/index.tsx index c7b72a025..81a2b2d8b 100644 --- a/src/frontend/src/components/toggleComponent/index.tsx +++ b/src/frontend/src/components/toggleComponent/index.tsx @@ -1,7 +1,7 @@ import { Switch } from "@headlessui/react"; -import { classNames } from "../../utils"; import { useEffect } from "react"; import { ToggleComponentType } from "../../types/components"; +import { classNames } from "../../utils"; export default function ToggleComponent({ enabled, diff --git a/src/frontend/src/components/toggleShadComponent/index.tsx b/src/frontend/src/components/toggleShadComponent/index.tsx index 9b73ee07d..c06d42430 100644 --- a/src/frontend/src/components/toggleShadComponent/index.tsx +++ b/src/frontend/src/components/toggleShadComponent/index.tsx @@ -1,4 +1,3 @@ -import { useEffect } from "react"; import { ToggleComponentType } from "../../types/components"; import { Switch } from "../ui/switch"; diff --git a/src/frontend/src/components/ui/accordion.tsx b/src/frontend/src/components/ui/accordion.tsx index 5e3e76f33..4b5a12384 100644 --- a/src/frontend/src/components/ui/accordion.tsx +++ b/src/frontend/src/components/ui/accordion.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import * as AccordionPrimitive from "@radix-ui/react-accordion"; import { ChevronDownIcon } from "@radix-ui/react-icons"; +import * as React from "react"; import { cn } from "../../utils"; const Accordion = AccordionPrimitive.Root; diff --git a/src/frontend/src/components/ui/badge.tsx b/src/frontend/src/components/ui/badge.tsx index 36c44ac4d..5464f382e 100644 --- a/src/frontend/src/components/ui/badge.tsx +++ b/src/frontend/src/components/ui/badge.tsx @@ -1,5 +1,5 @@ -import * as React from "react"; import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; import { cn } from "../../utils"; const badgeVariants = cva( diff --git a/src/frontend/src/components/ui/button.tsx b/src/frontend/src/components/ui/button.tsx index 648ce43c9..170494927 100644 --- a/src/frontend/src/components/ui/button.tsx +++ b/src/frontend/src/components/ui/button.tsx @@ -1,6 +1,6 @@ -import * as React from "react"; import { Slot } from "@radix-ui/react-slot"; import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; import { cn } from "../../utils"; const buttonVariants = cva( diff --git a/src/frontend/src/components/ui/checkbox.tsx b/src/frontend/src/components/ui/checkbox.tsx index 4e4905bb9..18332b073 100644 --- a/src/frontend/src/components/ui/checkbox.tsx +++ b/src/frontend/src/components/ui/checkbox.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import * as CheckboxPrimitive from "@radix-ui/react-checkbox"; import { Check } from "lucide-react"; +import * as React from "react"; import { cn } from "../../utils"; const Checkbox = React.forwardRef< diff --git a/src/frontend/src/components/ui/dialog.tsx b/src/frontend/src/components/ui/dialog.tsx index a02379087..2ad709f48 100644 --- a/src/frontend/src/components/ui/dialog.tsx +++ b/src/frontend/src/components/ui/dialog.tsx @@ -1,6 +1,6 @@ -import * as React from "react"; import * as DialogPrimitive from "@radix-ui/react-dialog"; import { X } from "lucide-react"; +import * as React from "react"; import { cn } from "../../utils"; const Dialog = DialogPrimitive.Root; diff --git a/src/frontend/src/components/ui/dropdown-menu.tsx b/src/frontend/src/components/ui/dropdown-menu.tsx index ee62abc4a..0e5468e6e 100644 --- a/src/frontend/src/components/ui/dropdown-menu.tsx +++ b/src/frontend/src/components/ui/dropdown-menu.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import { Check, ChevronRight, Circle } from "lucide-react"; +import * as React from "react"; import { cn } from "../../utils"; const DropdownMenu = DropdownMenuPrimitive.Root; diff --git a/src/frontend/src/components/ui/label.tsx b/src/frontend/src/components/ui/label.tsx index ab5129253..57fbc9d8a 100644 --- a/src/frontend/src/components/ui/label.tsx +++ b/src/frontend/src/components/ui/label.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import * as LabelPrimitive from "@radix-ui/react-label"; import { cva, type VariantProps } from "class-variance-authority"; +import * as React from "react"; import { cn } from "../../utils"; const labelVariants = cva( diff --git a/src/frontend/src/components/ui/menubar.tsx b/src/frontend/src/components/ui/menubar.tsx index 2eb3a61f4..0a3362ca6 100644 --- a/src/frontend/src/components/ui/menubar.tsx +++ b/src/frontend/src/components/ui/menubar.tsx @@ -1,8 +1,8 @@ "use client"; -import * as React from "react"; import * as MenubarPrimitive from "@radix-ui/react-menubar"; import { Check, ChevronRight, Circle } from "lucide-react"; +import * as React from "react"; import { cn } from "../../utils"; diff --git a/src/frontend/src/components/ui/progress.tsx b/src/frontend/src/components/ui/progress.tsx index 69d1f86fb..a08efeb52 100644 --- a/src/frontend/src/components/ui/progress.tsx +++ b/src/frontend/src/components/ui/progress.tsx @@ -1,7 +1,7 @@ "use client"; -import * as React from "react"; import * as ProgressPrimitive from "@radix-ui/react-progress"; +import * as React from "react"; import { cn } from "../../utils"; const Progress = React.forwardRef< diff --git a/src/frontend/src/components/ui/rename-label.tsx b/src/frontend/src/components/ui/rename-label.tsx index e703020f5..e5fef11bf 100644 --- a/src/frontend/src/components/ui/rename-label.tsx +++ b/src/frontend/src/components/ui/rename-label.tsx @@ -1,4 +1,4 @@ -import { useState, useEffect, useRef } from "react"; +import { useEffect, useRef, useState } from "react"; import { cn } from "../../utils"; export default function RenameLabel(props) { diff --git a/src/frontend/src/components/ui/separator.tsx b/src/frontend/src/components/ui/separator.tsx index 84a16676d..a770af987 100644 --- a/src/frontend/src/components/ui/separator.tsx +++ b/src/frontend/src/components/ui/separator.tsx @@ -1,7 +1,7 @@ "use client"; -import * as React from "react"; import * as SeparatorPrimitive from "@radix-ui/react-separator"; +import * as React from "react"; import { cn } from "../../utils"; const Separator = React.forwardRef< diff --git a/src/frontend/src/components/ui/switch.tsx b/src/frontend/src/components/ui/switch.tsx index 8f473a0eb..8ec7c3c80 100644 --- a/src/frontend/src/components/ui/switch.tsx +++ b/src/frontend/src/components/ui/switch.tsx @@ -1,7 +1,7 @@ "use client"; -import * as React from "react"; import * as SwitchPrimitives from "@radix-ui/react-switch"; +import * as React from "react"; import { cn } from "../../utils"; const Switch = React.forwardRef< diff --git a/src/frontend/src/components/ui/table.tsx b/src/frontend/src/components/ui/table.tsx index f08ce3f6b..9b7bdd8ce 100644 --- a/src/frontend/src/components/ui/table.tsx +++ b/src/frontend/src/components/ui/table.tsx @@ -5,7 +5,7 @@ const Table = React.forwardRef< HTMLTableElement, React.HTMLAttributes >(({ className, ...props }, ref) => ( -
+
dict: """ api_url = f"{BASE_API_URL}/{flow_id}" - payload = {"inputs": ${inputs}} + payload = {"inputs": inputs} if tweaks: payload["tweaks"] = tweaks @@ -118,8 +122,8 @@ def run_flow(message: str, flow_id: str, tweaks: dict = None) -> dict: return response.json() # Setup any tweaks you want to apply to the flow - -print(run_flow("Your message", flow_id=FLOW_ID, tweaks=TWEAKS))`; +inputs = ${inputs} +print(run_flow(inputs, flow_id=FLOW_ID, tweaks=TWEAKS))`; }; /** * Function to get the curl code for the API @@ -134,6 +138,7 @@ export const getCurlCode = ( const flowId = flow.id; const tweaks = buildTweaks(flow); const inputs = buildInputs(tabsState, flow.id); + return `curl -X POST \\ ${window.location.protocol}//${ window.location.host @@ -166,7 +171,8 @@ TWEAKS = ${ } flow = load_flow_from_json("${flowName}.json", tweaks=TWEAKS) # Now you can use it like any chain -flow(${inputs})`; +inputs = ${inputs} +flow(inputs)`; }; function buildTweakObject(tweak) { diff --git a/src/frontend/src/contexts/SSEContext.tsx b/src/frontend/src/contexts/SSEContext.tsx index 83b1d4c89..9db32310b 100644 --- a/src/frontend/src/contexts/SSEContext.tsx +++ b/src/frontend/src/contexts/SSEContext.tsx @@ -1,10 +1,4 @@ -import { - createContext, - useContext, - useState, - useEffect, - useCallback, -} from "react"; +import { createContext, useCallback, useContext, useState } from "react"; const initialValue = { updateSSEData: ({}) => {}, diff --git a/src/frontend/src/contexts/index.tsx b/src/frontend/src/contexts/index.tsx index 750df65d2..70b7da07c 100644 --- a/src/frontend/src/contexts/index.tsx +++ b/src/frontend/src/contexts/index.tsx @@ -1,35 +1,38 @@ import { ReactNode } from "react"; +import { ReactFlowProvider } from "reactflow"; +import { TooltipProvider } from "../components/ui/tooltip"; +import { SSEProvider } from "./SSEContext"; import { AlertProvider } from "./alertContext"; import { DarkProvider } from "./darkContext"; import { LocationProvider } from "./locationContext"; import PopUpProvider from "./popUpContext"; import { TabsProvider } from "./tabsContext"; import { TypesProvider } from "./typesContext"; -import { ReactFlowProvider } from "reactflow"; import { UndoRedoProvider } from "./undoRedoContext"; -import { SSEProvider } from "./SSEContext"; export default function ContextWrapper({ children }: { children: ReactNode }) { //element to wrap all context return ( <> - - - - - - - - - {children} - - - - - - - - + + + + + + + + + + {children} + + + + + + + + + ); } diff --git a/src/frontend/src/contexts/popUpContext.tsx b/src/frontend/src/contexts/popUpContext.tsx index d46f51f00..8da50278c 100644 --- a/src/frontend/src/contexts/popUpContext.tsx +++ b/src/frontend/src/contexts/popUpContext.tsx @@ -1,5 +1,4 @@ -import { createContext } from "react"; -import React, { useState } from "react"; +import React, { createContext, useState } from "react"; // context to set JSX element on the DOM export const PopUpContext = createContext({ diff --git a/src/frontend/src/contexts/tabsContext.tsx b/src/frontend/src/contexts/tabsContext.tsx index 8105819a0..001152c9c 100644 --- a/src/frontend/src/contexts/tabsContext.tsx +++ b/src/frontend/src/contexts/tabsContext.tsx @@ -1,33 +1,33 @@ +import _ from "lodash"; import { - createContext, - useEffect, - useState, - useRef, ReactNode, + createContext, useContext, + useEffect, + useRef, + useState, } from "react"; +import { addEdge } from "reactflow"; +import ShortUniqueId from "short-unique-id"; +import { + deleteFlowFromDatabase, + downloadFlowsFromDatabase, + readFlowsFromDatabase, + saveFlowToDatabase, + updateFlowInDatabase, + uploadFlowsToDatabase, +} from "../controllers/API"; +import { APIClassType, APITemplateType } from "../types/api"; import { FlowType, NodeType } from "../types/flow"; import { TabsContextType, TabsState } from "../types/tabs"; import { - updateIds, - updateTemplate, getRandomDescription, getRandomName, + updateIds, + updateTemplate, } from "../utils"; import { alertContext } from "./alertContext"; import { typesContext } from "./typesContext"; -import { APIClassType, APITemplateType } from "../types/api"; -import ShortUniqueId from "short-unique-id"; -import { addEdge } from "reactflow"; -import { - readFlowsFromDatabase, - deleteFlowFromDatabase, - saveFlowToDatabase, - downloadFlowsFromDatabase, - uploadFlowsToDatabase, - updateFlowInDatabase, -} from "../controllers/API"; -import _ from "lodash"; const uid = new ShortUniqueId({ length: 5 }); diff --git a/src/frontend/src/contexts/typesContext.tsx b/src/frontend/src/contexts/typesContext.tsx index 3179e582e..ff4cc1c29 100644 --- a/src/frontend/src/contexts/typesContext.tsx +++ b/src/frontend/src/contexts/typesContext.tsx @@ -1,8 +1,8 @@ import { createContext, ReactNode, useEffect, useState } from "react"; import { Node } from "reactflow"; -import { typesContextType } from "../types/typesContext"; import { getAll } from "../controllers/API"; import { APIKindType } from "../types/api"; +import { typesContextType } from "../types/typesContext"; //context to share types adn functions from nodes to flow diff --git a/src/frontend/src/contexts/undoRedoContext.tsx b/src/frontend/src/contexts/undoRedoContext.tsx index b0f8ca6b9..3df201082 100644 --- a/src/frontend/src/contexts/undoRedoContext.tsx +++ b/src/frontend/src/contexts/undoRedoContext.tsx @@ -1,3 +1,4 @@ +import { cloneDeep } from "lodash"; import { createContext, useCallback, @@ -6,7 +7,6 @@ import { useState, } from "react"; import { Edge, Node, useReactFlow } from "reactflow"; -import { cloneDeep } from "lodash"; import { TabsContext } from "./tabsContext"; type undoRedoContextType = { diff --git a/src/frontend/src/controllers/API/index.ts b/src/frontend/src/controllers/API/index.ts index 72204ee68..2d6f951f0 100644 --- a/src/frontend/src/controllers/API/index.ts +++ b/src/frontend/src/controllers/API/index.ts @@ -1,15 +1,15 @@ -import { - BuildStatusTypeAPI, - errorsTypeAPI, - InitTypeAPI, - UploadFileTypeAPI, - APIClassType, - PromptTypeAPI, -} from "./../../types/api/index"; -import { APIObjectType, sendAllProps } from "../../types/api/index"; import axios, { AxiosResponse } from "axios"; -import { FlowStyleType, FlowType } from "../../types/flow"; import { ReactFlowJsonObject } from "reactflow"; +import { APIObjectType, sendAllProps } from "../../types/api/index"; +import { FlowStyleType, FlowType } from "../../types/flow"; +import { + APIClassType, + BuildStatusTypeAPI, + InitTypeAPI, + PromptTypeAPI, + UploadFileTypeAPI, + errorsTypeAPI, +} from "./../../types/api/index"; /** * Fetches all objects from the API endpoint. diff --git a/src/frontend/src/index.css b/src/frontend/src/index.css index 437358e11..c8e79694a 100644 --- a/src/frontend/src/index.css +++ b/src/frontend/src/index.css @@ -173,7 +173,7 @@ The cursor: default; property value restores the browser's default cursor style @apply w-full overflow-auto scrollbar-hide } .search-icon { - @apply absolute inset-y-0 right-0 flex items-center py-1.5 pr-3 + @apply absolute inset-y-0 right-0 flex items-center py-1.5 pr-5 } .extra-side-bar-save-disable { @apply text-muted-foreground @@ -938,13 +938,13 @@ The cursor: default; property value restores the browser's default cursor style @apply flex-max-width px-2 py-6 pl-4 pr-9 } .form-modal-chatbot-icon { - @apply mb-3 mr-3 mt-1 w-20 + @apply mb-3 ml-3 mr-6 mt-1 } .form-modal-chat-image { @apply flex flex-col items-center gap-1 } .form-modal-chat-img-box { - @apply flex h-8 w-8 items-center justify-center overflow-hidden rounded-md p-5 text-2xl + @apply relative flex h-8 w-8 items-center justify-center overflow-hidden rounded-md p-5 text-2xl } .form-modal-chat-bot-icon { @apply form-modal-chat-img-box bg-[#afe6ef] @@ -952,17 +952,20 @@ The cursor: default; property value restores the browser's default cursor style .form-modal-chat-user-icon { @apply form-modal-chat-img-box bg-[#aface9] } + .form-modal-chat-icon-img { + @apply absolute scale-[60%] + } .form-modal-chat-text-position { - @apply flex w-full flex-1 items-center text-start + @apply flex w-full flex-1 text-start } .form-modal-chat-text { - @apply relative inline-block w-full text-start text-sm font-normal text-muted-foreground + @apply relative flex w-full flex-col text-start text-sm font-normal text-muted-foreground } .form-modal-chat-icon-div { - @apply absolute -left-8 -top-5 cursor-pointer + @apply absolute -left-6 -top-3 cursor-pointer } .form-modal-chat-icon { - @apply h-5 w-5 animate-bounce dark:text-white + @apply h-4 w-4 animate-bounce dark:text-white } .form-modal-chat-thought-border { @apply rounded-md border border-gray-300 @@ -977,7 +980,7 @@ The cursor: default; property value restores the browser's default cursor style @apply mt-1 animate-pulse cursor-default } .form-modal-initial-prompt-btn { - @apply mb-2 flex items-center gap-4 rounded-md border border-ring/60 bg-background px-4 py-3 text-base font-semibold + @apply mb-2 flex items-center gap-4 rounded-md border border-ring/60 bg-background px-4 py-2 text-base font-semibold } .form-modal-iv-box { @apply mt-2 flex-max-width h-[80vh] diff --git a/src/frontend/src/index.tsx b/src/frontend/src/index.tsx index 088db15a8..794fcbf32 100644 --- a/src/frontend/src/index.tsx +++ b/src/frontend/src/index.tsx @@ -1,9 +1,8 @@ -import React from "react"; import ReactDOM from "react-dom/client"; -import App from "./App"; -import reportWebVitals from "./reportWebVitals"; import { BrowserRouter } from "react-router-dom"; +import App from "./App"; import ContextWrapper from "./contexts"; +import reportWebVitals from "./reportWebVitals"; import "./index.css"; diff --git a/src/frontend/src/modals/ApiModal/index.tsx b/src/frontend/src/modals/ApiModal/index.tsx index 99fd03941..ea802cbad 100644 --- a/src/frontend/src/modals/ApiModal/index.tsx +++ b/src/frontend/src/modals/ApiModal/index.tsx @@ -1,42 +1,15 @@ -import { useContext, useEffect, useRef, useState } from "react"; -import { PopUpContext } from "../../contexts/popUpContext"; +import "ace-builds/src-noconflict/ext-language_tools"; import "ace-builds/src-noconflict/mode-python"; import "ace-builds/src-noconflict/theme-github"; import "ace-builds/src-noconflict/theme-twilight"; -import "ace-builds/src-noconflict/ext-language_tools"; +import { useContext, useEffect, useRef, useState } from "react"; +import { PopUpContext } from "../../contexts/popUpContext"; // import "ace-builds/webpack-resolver"; -import { darkContext } from "../../contexts/darkContext"; +import { Check, Clipboard, Code2 } from "lucide-react"; import { Prism as SyntaxHighlighter } from "react-syntax-highlighter"; import { oneDark } from "react-syntax-highlighter/dist/cjs/styles/prism"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "../../components/ui/dialog"; -import { FlowType } from "../../types/flow/index"; -import { getCurlCode, getPythonApiCode, getPythonCode } from "../../constants"; -import { EXPORT_CODE_DIALOG } from "../../constants"; -import { - Tabs, - TabsContent, - TabsList, - TabsTrigger, -} from "../../components/ui/tabs"; -import { Check, Clipboard, Code2 } from "lucide-react"; -import { - Table, - TableBody, - TableCaption, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "../../components/ui/table"; -import { buildTweaks, classNames, limitScrollFieldsModal } from "../../utils"; import AccordionComponent from "../../components/AccordionComponent"; +import ShadTooltip from "../../components/ShadTooltipComponent"; import CodeAreaComponent from "../../components/codeAreaComponent"; import Dropdown from "../../components/dropdownComponent"; import FloatComponent from "../../components/floatComponent"; @@ -47,9 +20,38 @@ import IntComponent from "../../components/intComponent"; import PromptAreaComponent from "../../components/promptComponent"; import TextAreaComponent from "../../components/textAreaComponent"; import ToggleShadComponent from "../../components/toggleShadComponent"; -import ShadTooltip from "../../components/ShadTooltipComponent"; -import { cloneDeep, filter } from "lodash"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../../components/ui/dialog"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "../../components/ui/table"; +import { + Tabs, + TabsContent, + TabsList, + TabsTrigger, +} from "../../components/ui/tabs"; +import { + EXPORT_CODE_DIALOG, + getCurlCode, + getPythonApiCode, + getPythonCode, +} from "../../constants"; +import { darkContext } from "../../contexts/darkContext"; import { TabsContext } from "../../contexts/tabsContext"; +import { FlowType } from "../../types/flow/index"; +import { buildTweaks, classNames } from "../../utils"; export default function ApiModal({ flow }: { flow: FlowType }) { const [open, setOpen] = useState(true); @@ -420,7 +422,6 @@ export default function ApiModal({ flow }: { flow: FlowType }) { ) : t.data.node.template[n] .multiline ? ( ))} - {/* + {/*
diff --git a/src/frontend/src/modals/EditNodeModal/index.tsx b/src/frontend/src/modals/EditNodeModal/index.tsx index b0bd8ce4d..940196552 100644 --- a/src/frontend/src/modals/EditNodeModal/index.tsx +++ b/src/frontend/src/modals/EditNodeModal/index.tsx @@ -1,26 +1,17 @@ -import { useContext, useEffect, useRef, useState } from "react"; -import { PopUpContext } from "../../contexts/popUpContext"; -import { NodeDataType } from "../../types/flow"; -import { classNames, limitScrollFieldsModal } from "../../utils"; -import { typesContext } from "../../contexts/typesContext"; -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from "../../components/ui/table"; -import ToggleShadComponent from "../../components/toggleShadComponent"; -import InputListComponent from "../../components/inputListComponent"; -import TextAreaComponent from "../../components/textAreaComponent"; -import InputComponent from "../../components/inputComponent"; -import FloatComponent from "../../components/floatComponent"; -import Dropdown from "../../components/dropdownComponent"; -import IntComponent from "../../components/intComponent"; -import InputFileComponent from "../../components/inputFileComponent"; -import PromptAreaComponent from "../../components/promptComponent"; +import { Variable } from "lucide-react"; +import { useContext, useRef, useState } from "react"; import CodeAreaComponent from "../../components/codeAreaComponent"; +import Dropdown from "../../components/dropdownComponent"; +import FloatComponent from "../../components/floatComponent"; +import InputComponent from "../../components/inputComponent"; +import InputFileComponent from "../../components/inputFileComponent"; +import InputListComponent from "../../components/inputListComponent"; +import IntComponent from "../../components/intComponent"; +import PromptAreaComponent from "../../components/promptComponent"; +import TextAreaComponent from "../../components/textAreaComponent"; +import ToggleShadComponent from "../../components/toggleShadComponent"; +import { Badge } from "../../components/ui/badge"; +import { Button } from "../../components/ui/button"; import { Dialog, DialogContent, @@ -30,9 +21,19 @@ import { DialogTitle, DialogTrigger, } from "../../components/ui/dialog"; -import { Button } from "../../components/ui/button"; -import { Badge } from "../../components/ui/badge"; -import { Variable } from "lucide-react"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "../../components/ui/table"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; +import { typesContext } from "../../contexts/typesContext"; +import { NodeDataType } from "../../types/flow"; +import { classNames, limitScrollFieldsModal } from "../../utils"; export default function EditNodeModal({ data }: { data: NodeDataType }) { const [open, setOpen] = useState(true); @@ -54,7 +55,12 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { const { closePopUp } = useContext(PopUpContext); const { types } = useContext(typesContext); const ref = useRef(); - const [enabled, setEnabled] = useState(null); + const { setTabsState, tabId, save } = useContext(TabsContext); + const { reactFlowInstance } = useContext(typesContext); + + let disabled = + reactFlowInstance?.getEdges().some((e) => e.targetHandle === data.id) ?? + false; if (nodeLength == 0) { closePopUp(); } @@ -66,8 +72,6 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { } } - useEffect(() => {}, [closePopUp, data.node.template]); - function changeAdvanced(node): void { Object.keys(data.node.template).filter((n, i) => { if (n === node.name) { @@ -78,6 +82,20 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { setNodeValue(!nodeValue); } + const handleOnNewValue = (newValue: any, name) => { + data.node.template[name].value = newValue; + // Set state to pending + setTabsState((prev) => { + return { + ...prev, + [tabId]: { + ...prev[tabId], + isPending: true, + }, + }; + }); + }; + return ( @@ -153,7 +171,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { : data.node.template[n].value } onChange={(t: string[]) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> ) : data.node.template[n].multiline ? ( @@ -162,7 +180,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { editNode={true} value={data.node.template[n].value ?? ""} onChange={(t: string) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> ) : ( @@ -174,7 +192,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { } value={data.node.template[n].value ?? ""} onChange={(t) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> )} @@ -183,13 +201,12 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) {
{" "} { - data.node.template[n].value = e; - setEnabled(e); + setEnabled={(t) => { + handleOnNewValue(t, n); }} size="small" - disabled={false} />
) : data.node.template[n].type === "float" ? ( @@ -210,9 +227,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { numberOfOptions={nodeLength} editNode={true} options={data.node.template[n].options} - onSelect={(newValue) => - (data.node.template[n].value = newValue) - } + onSelect={(t) => handleOnNewValue(t, n)} value={ data.node.template[n].value ?? "Choose an option" @@ -226,7 +241,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { editNode={true} value={data.node.template[n].value ?? ""} onChange={(t) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> @@ -237,12 +252,12 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { disabled={false} value={data.node.template[n].value ?? ""} onChange={(t: string) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} fileTypes={data.node.template[n].fileTypes} suffixes={data.node.template[n].suffixes} onFileChange={(t: string) => { - data.node.template[n].content = t; + handleOnNewValue(t, n); }} > @@ -254,7 +269,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { disabled={false} value={data.node.template[n].value ?? ""} onChange={(t: string) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> @@ -265,7 +280,7 @@ export default function EditNodeModal({ data }: { data: NodeDataType }) { editNode={true} value={data.node.template[n].value ?? ""} onChange={(t: string) => { - data.node.template[n].value = t; + handleOnNewValue(t, n); }} /> diff --git a/src/frontend/src/modals/NodeModal/components/ModalField/index.tsx b/src/frontend/src/modals/NodeModal/components/ModalField/index.tsx index 70344a996..3208b989b 100644 --- a/src/frontend/src/modals/NodeModal/components/ModalField/index.tsx +++ b/src/frontend/src/modals/NodeModal/components/ModalField/index.tsx @@ -1,14 +1,14 @@ import { useState } from "react"; -import InputListComponent from "../../../../components/inputListComponent"; -import Dropdown from "../../../../components/dropdownComponent"; -import TextAreaComponent from "../../../../components/textAreaComponent"; -import InputComponent from "../../../../components/inputComponent"; -import ToggleComponent from "../../../../components/toggleComponent"; -import FloatComponent from "../../../../components/floatComponent"; -import IntComponent from "../../../../components/intComponent"; -import InputFileComponent from "../../../../components/inputFileComponent"; -import PromptAreaComponent from "../../../../components/promptComponent"; import CodeAreaComponent from "../../../../components/codeAreaComponent"; +import Dropdown from "../../../../components/dropdownComponent"; +import FloatComponent from "../../../../components/floatComponent"; +import InputComponent from "../../../../components/inputComponent"; +import InputFileComponent from "../../../../components/inputFileComponent"; +import InputListComponent from "../../../../components/inputListComponent"; +import IntComponent from "../../../../components/intComponent"; +import PromptAreaComponent from "../../../../components/promptComponent"; +import TextAreaComponent from "../../../../components/textAreaComponent"; +import ToggleComponent from "../../../../components/toggleComponent"; import { classNames } from "../../../../utils"; export default function ModalField({ diff --git a/src/frontend/src/modals/NodeModal/index.tsx b/src/frontend/src/modals/NodeModal/index.tsx index 41ca699a9..c61af4ff4 100644 --- a/src/frontend/src/modals/NodeModal/index.tsx +++ b/src/frontend/src/modals/NodeModal/index.tsx @@ -1,6 +1,8 @@ import { Dialog, Transition } from "@headlessui/react"; +import { X } from "lucide-react"; import { Fragment, useContext, useRef, useState } from "react"; import { PopUpContext } from "../../contexts/popUpContext"; +import { typesContext } from "../../contexts/typesContext"; import { NodeDataType } from "../../types/flow"; import { classNames, @@ -9,9 +11,7 @@ import { nodeIconsLucide, toTitleCase, } from "../../utils"; -import { typesContext } from "../../contexts/typesContext"; import ModalField from "./components/ModalField"; -import { X } from "lucide-react"; export default function NodeModal({ data }: { data: NodeDataType }) { const [open, setOpen] = useState(true); diff --git a/src/frontend/src/modals/baseModal/index.tsx b/src/frontend/src/modals/baseModal/index.tsx new file mode 100644 index 000000000..4b135383c --- /dev/null +++ b/src/frontend/src/modals/baseModal/index.tsx @@ -0,0 +1,69 @@ +import { ReactNode, useContext } from "react"; + +import React from "react"; +import { + Dialog, + DialogContent, + DialogDescription, + DialogHeader, + DialogTitle, + DialogTrigger, +} from "../../components/ui/dialog"; +import { PopUpContext } from "../../contexts/popUpContext"; + +type ContentProps = { children: ReactNode }; +type HeaderProps = { children: ReactNode; description: string }; + +const Content: React.FC = ({ children }) => { + return
{children}
; +}; + +const Header: React.FC<{ children: ReactNode; description: string }> = ({ + children, + description, +}) => { + return ( + + {children} + {description} + + ); +}; +interface BaseModalProps { + children: [React.ReactElement, React.ReactElement]; + open: boolean; + setOpen: (open: boolean) => void; +} +function BaseModal({ open, setOpen, children }: BaseModalProps) { + const { closePopUp, setCloseEdit } = useContext(PopUpContext); + + function setModalOpen(x: boolean) { + setOpen(x); + if (x === false) { + setTimeout(() => { + setCloseEdit("editcode"); + closePopUp(); + }, 300); + } + } + const headerChild = React.Children.toArray(children).find( + (child) => (child as React.ReactElement).type === Header + ); + const ContentChild = React.Children.toArray(children).find( + (child) => (child as React.ReactElement).type === Content + ); + //UPDATE COLORS AND STYLE CLASSSES + return ( + + + + {headerChild} +
{ContentChild}
+
+
+ ); +} + +BaseModal.Content = Content; +BaseModal.Header = Header; +export default BaseModal; diff --git a/src/frontend/src/modals/chatModal/chatMessage/index.tsx b/src/frontend/src/modals/chatModal/chatMessage/index.tsx index 6b1aecca2..f90396198 100644 --- a/src/frontend/src/modals/chatModal/chatMessage/index.tsx +++ b/src/frontend/src/modals/chatModal/chatMessage/index.tsx @@ -1,17 +1,17 @@ +import Convert from "ansi-to-html"; +import DOMPurify from "dompurify"; +import { MessageCircle, User2 } from "lucide-react"; import { useEffect, useRef, useState } from "react"; -import { ChatMessageType } from "../../../types/chat"; -import { classNames } from "../../../utils"; -import AiIcon from "../../../assets/Gooey Ring-5s-271px.svg"; -import AiIconStill from "../../../assets/froze-flow.png"; -import FileCard from "../fileComponent"; import ReactMarkdown from "react-markdown"; import rehypeMathjax from "rehype-mathjax"; import remarkGfm from "remark-gfm"; import remarkMath from "remark-math"; -import { CodeBlock } from "./codeBlock"; -import Convert from "ansi-to-html"; -import { User2, MessageCircle } from "lucide-react"; -import DOMPurify from "dompurify"; +import AiIcon from "../../../assets/Gooey Ring-5s-271px.svg"; +import AiIconStill from "../../../assets/froze-flow.png"; +import { ChatMessageType } from "../../../types/chat"; +import { classNames } from "../../../utils"; +import { CodeBlock } from "../../formModal/chatMessage/codeBlock"; +import FileCard from "../../formModal/fileComponent"; export default function ChatMessage({ chat, lockChat, diff --git a/src/frontend/src/modals/chatModal/index.tsx b/src/frontend/src/modals/chatModal/index.tsx index 8cae31d8c..5cbc2d17b 100644 --- a/src/frontend/src/modals/chatModal/index.tsx +++ b/src/frontend/src/modals/chatModal/index.tsx @@ -1,14 +1,14 @@ import { Dialog, Transition } from "@headlessui/react"; +import { Eraser, MessagesSquare, X } from "lucide-react"; import { Fragment, useContext, useEffect, useRef, useState } from "react"; -import { FlowType } from "../../types/flow"; import { alertContext } from "../../contexts/alertContext"; -import { validateNodes } from "../../utils"; import { typesContext } from "../../contexts/typesContext"; -import ChatMessage from "./chatMessage"; -import { X, MessagesSquare, Eraser } from "lucide-react"; import { sendAllProps } from "../../types/api"; import { ChatMessageType } from "../../types/chat"; +import { FlowType } from "../../types/flow"; +import { validateNodes } from "../../utils"; import ChatInput from "./chatInput"; +import ChatMessage from "./chatMessage"; import _ from "lodash"; import { getHealth } from "../../controllers/API"; diff --git a/src/frontend/src/modals/codeAreaModal/index.tsx b/src/frontend/src/modals/codeAreaModal/index.tsx index 8c2ebae86..4ffcec352 100644 --- a/src/frontend/src/modals/codeAreaModal/index.tsx +++ b/src/frontend/src/modals/codeAreaModal/index.tsx @@ -1,27 +1,20 @@ -import { useContext, useRef, useState } from "react"; -import { PopUpContext } from "../../contexts/popUpContext"; -import AceEditor from "react-ace"; +import { DialogTitle } from "@radix-ui/react-dialog"; +import "ace-builds/src-noconflict/ace"; +import "ace-builds/src-noconflict/ext-language_tools"; import "ace-builds/src-noconflict/mode-python"; import "ace-builds/src-noconflict/theme-github"; import "ace-builds/src-noconflict/theme-twilight"; -import "ace-builds/src-noconflict/ext-language_tools"; -// import "ace-builds/webpack-resolver"; -import { darkContext } from "../../contexts/darkContext"; -import { postValidateCode } from "../../controllers/API"; -import { alertContext } from "../../contexts/alertContext"; -import { - Dialog, - DialogContent, - DialogDescription, - DialogFooter, - DialogHeader, - DialogTitle, - DialogTrigger, -} from "../../components/ui/dialog"; +import { TerminalSquare } from "lucide-react"; +import { useContext, useEffect, useRef, useState } from "react"; +import AceEditor from "react-ace"; import { Button } from "../../components/ui/button"; import { CODE_PROMPT_DIALOG_SUBTITLE } from "../../constants"; -import { TerminalSquare } from "lucide-react"; +import { alertContext } from "../../contexts/alertContext"; +import { darkContext } from "../../contexts/darkContext"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { postValidateCode } from "../../controllers/API"; import { APIClassType } from "../../types/api"; +import BaseModal from "../baseModal"; export default function CodeAreaModal({ value, @@ -38,18 +31,15 @@ export default function CodeAreaModal({ const [code, setCode] = useState(value); const [loading, setLoading] = useState(false); const { dark } = useContext(darkContext); + const { closePopUp } = useContext(PopUpContext); const { setErrorData, setSuccessData } = useContext(alertContext); - const { closePopUp, setCloseEdit } = useContext(PopUpContext); + const [error, setError] = useState<{ + detail: { error: string; traceback: string }; + }>(null); const ref = useRef(); - function setModalOpen(x: boolean) { - setOpen(x); - if (x === false) { - setTimeout(() => { - setCloseEdit("editcode"); - closePopUp(); - }, 300); - } - } + useEffect(() => { + setValue(code); + }, [code, setValue]); function handleClick() { setLoading(true); @@ -64,7 +54,7 @@ export default function CodeAreaModal({ title: "Code is ready to run", }); setValue(code); - setModalOpen(false); + setOpen((old) => !old); } else { if (funcErrors.length !== 0) { setErrorData({ @@ -94,46 +84,60 @@ export default function CodeAreaModal({ } return ( - - - - - - Edit Code - - {CODE_PROMPT_DIALOG_SUBTITLE} - - -
- { - setCode(value); - }} - className="h-full w-full rounded-lg border-[1px] border-gray-300 custom-scroll dark:border-gray-600" + + + + Edit Code + + + +
+
+ { + setCode(value); + }} + className="h-full w-full rounded-lg border-[1px] border-gray-300 custom-scroll dark:border-gray-600" + /> +
+
+
+

+ {error?.detail?.error} +

+
+
+                  {error?.detail?.traceback}
+                
+
+
+
+
+ +
- - - - - -
+ + ); } diff --git a/src/frontend/src/modals/exportModal/index.tsx b/src/frontend/src/modals/exportModal/index.tsx index bef5b9244..f4a66c7b9 100644 --- a/src/frontend/src/modals/exportModal/index.tsx +++ b/src/frontend/src/modals/exportModal/index.tsx @@ -1,8 +1,8 @@ +import { Download } from "lucide-react"; import { useContext, useRef, useState } from "react"; -import { alertContext } from "../../contexts/alertContext"; -import { PopUpContext } from "../../contexts/popUpContext"; -import { TabsContext } from "../../contexts/tabsContext"; -import { removeApiKeys } from "../../utils"; +import EditFlowSettings from "../../components/EditFlowSettingsComponent"; +import { Button } from "../../components/ui/button"; +import { Checkbox } from "../../components/ui/checkbox"; import { Dialog, DialogContent, @@ -12,11 +12,11 @@ import { DialogTitle, DialogTrigger, } from "../../components/ui/dialog"; -import { Button } from "../../components/ui/button"; -import { Checkbox } from "../../components/ui/checkbox"; import { EXPORT_DIALOG_SUBTITLE } from "../../constants"; -import { Download } from "lucide-react"; -import EditFlowSettings from "../../components/EditFlowSettingsComponent"; +import { alertContext } from "../../contexts/alertContext"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; +import { removeApiKeys } from "../../utils"; export default function ExportModal() { const [open, setOpen] = useState(true); diff --git a/src/frontend/src/modals/flowSettingsModal/index.tsx b/src/frontend/src/modals/flowSettingsModal/index.tsx index ce9e474b8..44f82e331 100644 --- a/src/frontend/src/modals/flowSettingsModal/index.tsx +++ b/src/frontend/src/modals/flowSettingsModal/index.tsx @@ -1,7 +1,7 @@ +import { Settings2 } from "lucide-react"; import { useContext, useRef, useState } from "react"; -import { alertContext } from "../../contexts/alertContext"; -import { PopUpContext } from "../../contexts/popUpContext"; -import { TabsContext } from "../../contexts/tabsContext"; +import EditFlowSettings from "../../components/EditFlowSettingsComponent"; +import { Button } from "../../components/ui/button"; import { Dialog, DialogContent, @@ -11,11 +11,10 @@ import { DialogTitle, DialogTrigger, } from "../../components/ui/dialog"; -import { Button } from "../../components/ui/button"; import { SETTINGS_DIALOG_SUBTITLE } from "../../constants"; -import EditFlowSettings from "../../components/EditFlowSettingsComponent"; -import { Settings2 } from "lucide-react"; -import { updateFlowInDatabase } from "../../controllers/API"; +import { alertContext } from "../../contexts/alertContext"; +import { PopUpContext } from "../../contexts/popUpContext"; +import { TabsContext } from "../../contexts/tabsContext"; export default function FlowSettingsModal() { const [open, setOpen] = useState(true); diff --git a/src/frontend/src/modals/formModal/chatInput/index.tsx b/src/frontend/src/modals/formModal/chatInput/index.tsx index 5bc694fa6..7cad0c0ec 100644 --- a/src/frontend/src/modals/formModal/chatInput/index.tsx +++ b/src/frontend/src/modals/formModal/chatInput/index.tsx @@ -1,7 +1,6 @@ +import { Lock, LucideSend } from "lucide-react"; +import { useEffect } from "react"; import { classNames } from "../../../utils"; -import { useContext, useEffect, useRef, useState } from "react"; -import { TabsContext } from "../../../contexts/tabsContext"; -import { Eraser, Lock, LucideSend } from "lucide-react"; export default function ChatInput({ lockChat, @@ -49,9 +48,7 @@ export default function ChatInput({ setChatValue(e.target.value); }} className={classNames( - lockChat - ? " form-modal-lock-true" - : " form-modal-lock-false", + lockChat ? " form-modal-lock-true" : " form-modal-lock-false", "form-modal-lockchat" )} placeholder={"Send a message..."} @@ -66,15 +63,9 @@ export default function ChatInput({ onClick={() => sendMessage()} > {lockChat ? ( -