diff --git a/src/backend/base/langflow/base/composio/composio_base.py b/src/backend/base/langflow/base/composio/composio_base.py index 55b6c95bf..df7350691 100644 --- a/src/backend/base/langflow/base/composio/composio_base.py +++ b/src/backend/base/langflow/base/composio/composio_base.py @@ -38,7 +38,6 @@ class ComposioBaseComponent(Component): name="api_key", display_name="Composio API Key", required=True, - info="Refer to https://docs.composio.dev/faq/api_key/api_key", real_time_refresh=True, value="COMPOSIO_API_KEY", ), @@ -53,12 +52,11 @@ class ComposioBaseComponent(Component): placeholder="Select action", options=[], value="disabled", - info="Select action to pass to the agent", helper_text="Please connect before selecting actions.", helper_text_metadata={"variant": "destructive"}, show=True, + required=False, real_time_refresh=True, - required=True, limit=1, ), ] diff --git a/src/backend/base/langflow/components/composio/gmail_composio.py b/src/backend/base/langflow/components/composio/gmail_composio.py index f199dec97..83d1cf11b 100644 --- a/src/backend/base/langflow/components/composio/gmail_composio.py +++ b/src/backend/base/langflow/components/composio/gmail_composio.py @@ -16,9 +16,8 @@ class ComposioGmailAPIComponent(ComposioBaseComponent): """Gmail API component for interacting with Gmail services.""" display_name: str = "Gmail" - description: str = "Gmail API" name = "GmailAPI" - icon = "Gmail" + icon = "Google" documentation: str = "https://docs.composio.dev" app_name = "gmail" diff --git a/src/frontend/src/CustomNodes/GenericNode/components/ListSelectionComponent/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/ListSelectionComponent/index.tsx index 16dbd55dd..4780e23fe 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/ListSelectionComponent/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/ListSelectionComponent/index.tsx @@ -1,7 +1,9 @@ import ForwardedIconComponent from "@/components/common/genericIconComponent"; import ShadTooltip from "@/components/common/shadTooltipComponent"; import SearchBarComponent from "@/components/core/parameterRenderComponent/components/searchBarComponent"; +import { InputProps } from "@/components/core/parameterRenderComponent/types"; import { Button } from "@/components/ui/button"; +import { DialogHeader } from "@/components/ui/dialog"; import { Dialog, DialogContent } from "@/components/ui/dialog-with-no-close"; import { cn, testIdCase } from "@/utils/utils"; import { useCallback, useEffect, useMemo, useRef, useState } from "react"; @@ -64,8 +66,9 @@ const ListItem = ({ unstyled size="sm" className={cn( - "group w-full rounded-md py-3 pl-3 pr-3", + "group flex w-full rounded-md px-2 py-0.5", !isKeyboardNavActive && "hover:bg-muted", // Only apply hover styles when not in keyboard nav + !item.metaData && "py-2.5", isFocused && "bg-muted", className, )} @@ -85,21 +88,30 @@ const ListItem = ({ >
{item.icon && ( - - )} -
{item.name}
- {"metaData" in item && item.metaData && ( -
{item.metaData}
+
+ +
)} +
+
+ {item.name} +
+ {"metaData" in item && item.metaData && ( +
+ {item.metaData} +
+ )} +
+ {isHovered || isFocused ? (
-
+
Select
-
+
@@ -129,7 +141,9 @@ const ListSelectionComponent = ({ selectedList = [], options, limit = 1, -}: ListSelectionComponentProps) => { + ...baseInputProps +}: InputProps) => { + const { nodeClass } = baseInputProps; const [search, setSearch] = useState(""); const [hoveredItem, setHoveredItem] = useState(null); const [focusedIndex, setFocusedIndex] = useState(-1); @@ -263,28 +277,33 @@ const ListSelectionComponent = ({ return ( !isOpen && onClose()}> -
- - -
+ +
+ +
+ {nodeClass?.display_name} +
+
+
+ {(filteredList?.length > 20 || search) && ( +
+ +
+ )}
{filteredList.length > 0 ? ( filteredList.map((item, index) => ( diff --git a/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx index 271262fda..639697d39 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/NodeInputField/index.tsx @@ -152,6 +152,7 @@ export default function NodeInputField({ title, nodeId: data.id, isFlexView, + required, })} } @@ -165,13 +166,13 @@ export default function NodeInputField({ title, nodeId: data.id, isFlexView, + required, })} }
)} - {required ? "*" : ""}
{info !== "" && ( }> diff --git a/src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/index.tsx b/src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/index.tsx index c0ab05610..e361718d3 100644 --- a/src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/components/RenderInputParameters/index.tsx @@ -74,6 +74,8 @@ const RenderInputParameters = ({ return keyMap; }, [templateFields, data.id, data.node?.template]); + console.log({ data }); + const renderInputParameter = templateFields.map( (templateField: string, idx) => { const template = data.node?.template[templateField]; diff --git a/src/frontend/src/CustomNodes/GenericNode/index.tsx b/src/frontend/src/CustomNodes/GenericNode/index.tsx index f04477fa4..aa5352639 100644 --- a/src/frontend/src/CustomNodes/GenericNode/index.tsx +++ b/src/frontend/src/CustomNodes/GenericNode/index.tsx @@ -250,8 +250,6 @@ function GenericNode({ [data.node?.outputs], ); - console.log(shownOutputs, hiddenOutputs); - const [hasChangedNodeDescription, setHasChangedNodeDescription] = useState(false); diff --git a/src/frontend/src/components/core/parameterRenderComponent/components/connectionComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/connectionComponent/index.tsx index 1d5a2fc31..f3488d0dc 100644 --- a/src/frontend/src/components/core/parameterRenderComponent/components/connectionComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/connectionComponent/index.tsx @@ -236,6 +236,7 @@ const ConnectionComponent = ({ setSelectedList={setSelectedItem} selectedList={selectedItem} options={options} + {...baseInputProps} />
); diff --git a/src/frontend/src/components/core/parameterRenderComponent/components/searchBarComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/searchBarComponent/index.tsx index 0d698191c..662511727 100644 --- a/src/frontend/src/components/core/parameterRenderComponent/components/searchBarComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/searchBarComponent/index.tsx @@ -35,7 +35,7 @@ const SearchBarComponent = ({ }; return ( -
+
{searchCategories && searchCategories.length > 0 && ( diff --git a/src/frontend/src/components/core/parameterRenderComponent/components/sortableListComponent/index.tsx b/src/frontend/src/components/core/parameterRenderComponent/components/sortableListComponent/index.tsx index 09af496aa..8d11c292e 100644 --- a/src/frontend/src/components/core/parameterRenderComponent/components/sortableListComponent/index.tsx +++ b/src/frontend/src/components/core/parameterRenderComponent/components/sortableListComponent/index.tsx @@ -33,7 +33,7 @@ const SortableListItem = memo(
  • {limit !== 1 && ( @@ -52,8 +52,8 @@ const SortableListItem = memo( {data.name} @@ -63,9 +63,9 @@ const SortableListItem = memo( size="icon" variant={limit !== 1 ? "outline" : "ghost"} className={cn( - "ml-auto h-7 w-7 opacity-0 transition-opacity duration-200", + "ml-auto h-6 w-6 opacity-0 transition-opacity duration-200", limit === 1 - ? "group pr-3 opacity-100" + ? "group pr-1 opacity-100" : "hover:border hover:border-destructive hover:bg-transparent hover:opacity-100", )} onClick={onRemove} @@ -192,6 +192,7 @@ const SortableListComponent = ({ selectedList={listData} options={options} limit={limit} + {...baseInputProps} />
  • ); diff --git a/src/frontend/src/components/ui/dialog-with-no-close.tsx b/src/frontend/src/components/ui/dialog-with-no-close.tsx index 1d8998440..a549c8141 100644 --- a/src/frontend/src/components/ui/dialog-with-no-close.tsx +++ b/src/frontend/src/components/ui/dialog-with-no-close.tsx @@ -35,7 +35,7 @@ const DialogContent = React.forwardRef< { await page.locator('//*[@id="showtemperature"]').click(); expect( await page.locator('//*[@id="showtemperature"]').isChecked(), - ).toBeTruthy(); + ).toBeFalsy(); await page.locator('//*[@id="showmodel_kwargs"]').click(); expect( @@ -108,7 +108,7 @@ test("IntComponent", { tag: ["@release", "@workspace"] }, async ({ page }) => { await page.locator('//*[@id="showtemperature"]').click(); expect( await page.locator('//*[@id="showtemperature"]').isChecked(), - ).toBeFalsy(); + ).toBeTruthy(); await page.locator('//*[@id="showmodel_kwargs"]').click(); expect( @@ -128,7 +128,7 @@ test("IntComponent", { tag: ["@release", "@workspace"] }, async ({ page }) => { await page.locator('//*[@id="showtemperature"]').click(); expect( await page.locator('//*[@id="showtemperature"]').isChecked(), - ).toBeTruthy(); + ).toBeFalsy(); await page.getByText("Close").last().click();