From 2216cb11f7bbad285a59bd8670be77b14dc35f1d Mon Sep 17 00:00:00 2001 From: Prakash Maheshwaran <73785492+Prakashmaheshwaran@users.noreply.github.com> Date: Sat, 7 Jun 2025 21:31:03 -0400 Subject: [PATCH] feat: add search functionality to workflow node library panel (#2597) Co-authored-by: Jonathan Dobson --- .../panels/WorkflowNodeLibraryPanel.tsx | 62 ++++++++++++++----- 1 file changed, 48 insertions(+), 14 deletions(-) diff --git a/skyvern-frontend/src/routes/workflows/editor/panels/WorkflowNodeLibraryPanel.tsx b/skyvern-frontend/src/routes/workflows/editor/panels/WorkflowNodeLibraryPanel.tsx index 7a8e2fd0..42c0dcbd 100644 --- a/skyvern-frontend/src/routes/workflows/editor/panels/WorkflowNodeLibraryPanel.tsx +++ b/skyvern-frontend/src/routes/workflows/editor/panels/WorkflowNodeLibraryPanel.tsx @@ -1,10 +1,16 @@ import { ScrollArea, ScrollAreaViewport } from "@/components/ui/scroll-area"; import { useWorkflowPanelStore } from "@/store/WorkflowPanelStore"; -import { Cross2Icon, PlusIcon } from "@radix-ui/react-icons"; +import { useState } from "react"; +import { + Cross2Icon, + PlusIcon, + MagnifyingGlassIcon, +} from "@radix-ui/react-icons"; import { WorkflowBlockTypes } from "../../types/workflowTypes"; import { AddNodeProps } from "../FlowRenderer"; import { WorkflowBlockNode } from "../nodes"; import { WorkflowBlockIcon } from "../nodes/WorkflowBlockIcon"; +import { Input } from "@/components/ui/input"; const enableCodeBlock = import.meta.env.VITE_ENABLE_CODE_BLOCK?.toLowerCase() === "true"; @@ -229,6 +235,26 @@ function WorkflowNodeLibraryPanel({ onNodeClick, first }: Props) { const closeWorkflowPanel = useWorkflowPanelStore( (state) => state.closeWorkflowPanel, ); + const [search, setSearch] = useState(""); + + const filteredItems = nodeLibraryItems.filter((item) => { + if (workflowPanelData?.disableLoop && item.nodeType === "loop") { + return false; + } + if (!enableCodeBlock && item.nodeType === "codeBlock") { + return false; + } + + const term = search.toLowerCase(); + if (!term) { + return true; + } + + return ( + item.nodeType.toLowerCase().includes(term) || + item.title.toLowerCase().includes(term) + ); + }); return (
@@ -251,20 +277,24 @@ function WorkflowNodeLibraryPanel({ onNodeClick, first }: Props) { : "Click on the node type you want to add"} +
+
+ +
+ { + setSearch(event.target.value); + }} + placeholder="Search blocks..." + className="pl-9" + /> +
- {nodeLibraryItems.map((item) => { - if ( - workflowPanelData?.disableLoop && - item.nodeType === "loop" - ) { - return null; - } - if (!enableCodeBlock && item.nodeType === "codeBlock") { - return null; - } - return ( + {filteredItems.length > 0 ? ( + filteredItems.map((item) => (
- ); - })} + )) + ) : ( +
+ No results found +
+ )}