diff --git a/frontend/src/components/workbench/events/events-sidebar.tsx b/frontend/src/components/workbench/events/events-sidebar.tsx index a0dd2ca5c..ae70b03a9 100644 --- a/frontend/src/components/workbench/events/events-sidebar.tsx +++ b/frontend/src/components/workbench/events/events-sidebar.tsx @@ -137,10 +137,12 @@ function WorkbenchSidebarEventsList({ - - {tab.label} + {/* TODO(chris): Please adjust this */} + + {tab.label} + {tab.label.slice(0, 4)} ))} diff --git a/frontend/src/components/workbench/panel/action-panel.tsx b/frontend/src/components/workbench/panel/action-panel.tsx index 16725f07d..d3a8dc1db 100644 --- a/frontend/src/components/workbench/panel/action-panel.tsx +++ b/frontend/src/components/workbench/panel/action-panel.tsx @@ -32,6 +32,7 @@ import { ToyBrickIcon, } from "lucide-react" import { FormProvider, useForm } from "react-hook-form" +import { ImperativePanelHandle } from "react-resizable-panels" import YAML from "yaml" import { z } from "zod" @@ -157,6 +158,8 @@ const parseYaml = (str: string | undefined) => const stringifyYaml = (obj: unknown | undefined) => obj ? YAML.stringify(obj) : "" +export interface ActionPanelRef extends ImperativePanelHandle {} + export function ActionPanel({ actionId, workflowId, diff --git a/frontend/src/components/workbench/panel/workbench-panel.tsx b/frontend/src/components/workbench/panel/workbench-panel.tsx index b7cc4b48a..f718df57a 100644 --- a/frontend/src/components/workbench/panel/workbench-panel.tsx +++ b/frontend/src/components/workbench/panel/workbench-panel.tsx @@ -6,11 +6,14 @@ import { useWorkflow } from "@/providers/workflow" import { FormLoading } from "@/components/loading/form" import { AlertNotification } from "@/components/notifications" import { NodeType } from "@/components/workbench/canvas/canvas" -import { ActionPanel } from "@/components/workbench/panel/action-panel" +import { + ActionPanel, + ActionPanelRef, +} from "@/components/workbench/panel/action-panel" import { TriggerPanel } from "@/components/workbench/panel/trigger-panel" import { WorkflowPanel } from "@/components/workbench/panel/workflow-panel" -export function WorkbenchPanel() { +export const WorkbenchPanel = React.forwardRef((_, ref) => { const { selectedNodeId, getNode } = useWorkflowBuilder() const { workflow, isLoading, error } = useWorkflow() const selectedNode = getNode(selectedNodeId ?? "") @@ -45,7 +48,10 @@ export function WorkbenchPanel() { )} ) -} +}) + +WorkbenchPanel.displayName = "WorkbenchPanel" + function NodePanel({ node, workflow, diff --git a/frontend/src/components/workbench/workbench.tsx b/frontend/src/components/workbench/workbench.tsx index 6d196c692..23e4989ee 100644 --- a/frontend/src/components/workbench/workbench.tsx +++ b/frontend/src/components/workbench/workbench.tsx @@ -8,7 +8,6 @@ import { cn } from "@/lib/utils" import { Button } from "@/components/ui/button" import { CustomResizableHandle, - ResizableHandle, ResizablePanel, ResizablePanelGroup, } from "@/components/ui/resizable" @@ -28,8 +27,15 @@ interface WorkbenchProps { } export function Workbench({ defaultLayout = [0, 68, 32] }: WorkbenchProps) { - const { canvasRef, sidebarRef, isSidebarCollapsed, toggleSidebar } = - useWorkflowBuilder() + const { + canvasRef, + sidebarRef, + isSidebarCollapsed, + toggleSidebar, + actionPanelRef, + isActionPanelCollapsed, + toggleActionPanel, + } = useWorkflowBuilder() return ( - - - + + + + + + + {isActionPanelCollapsed && ( + View Side Panel + )} + + + + + diff --git a/frontend/src/providers/builder.tsx b/frontend/src/providers/builder.tsx index 3a5274ae3..be03aa7cd 100644 --- a/frontend/src/providers/builder.tsx +++ b/frontend/src/providers/builder.tsx @@ -25,6 +25,7 @@ import { WorkflowCanvasRef, } from "@/components/workbench/canvas/canvas" import { EventsSidebarRef } from "@/components/workbench/events/events-sidebar" +import { ActionPanelRef } from "@/components/workbench/panel/action-panel" interface ReactFlowContextType { reactFlow: ReactFlowInstance @@ -37,8 +38,11 @@ interface ReactFlowContextType { setSelectedNodeId: React.Dispatch> canvasRef: React.RefObject sidebarRef: React.RefObject + actionPanelRef: React.RefObject isSidebarCollapsed: boolean + isActionPanelCollapsed: boolean toggleSidebar: () => void + toggleActionPanel: () => void expandSidebarAndFocusEvents: () => void } @@ -58,8 +62,11 @@ export const WorkflowBuilderProvider: React.FC< const [selectedNodeId, setSelectedNodeId] = useState(null) const [isSidebarCollapsed, setIsSidebarCollapsed] = React.useState(false) + const [isActionPanelCollapsed, setIsActionPanelCollapsed] = + React.useState(false) const canvasRef = useRef(null) const sidebarRef = useRef(null) + const actionPanelRef = useRef(null) useEffect(() => { setSelectedNodeId(null) @@ -103,6 +110,20 @@ export const WorkflowBuilderProvider: React.FC< }) }, [sidebarRef]) + const toggleActionPanel = React.useCallback(() => { + setIsActionPanelCollapsed((prev: boolean) => { + const newState = !prev + if (actionPanelRef.current) { + if (newState) { + actionPanelRef.current.collapse() + } else { + actionPanelRef.current.expand() + } + } + return newState + }) + }, [sidebarRef]) + const expandSidebarAndFocusEvents = React.useCallback(() => { setIsSidebarCollapsed(() => { const newState = false @@ -129,6 +150,9 @@ export const WorkflowBuilderProvider: React.FC< isSidebarCollapsed, toggleSidebar, expandSidebarAndFocusEvents, + actionPanelRef, + isActionPanelCollapsed, + toggleActionPanel, }), [ workflowId, @@ -143,6 +167,9 @@ export const WorkflowBuilderProvider: React.FC< isSidebarCollapsed, toggleSidebar, expandSidebarAndFocusEvents, + actionPanelRef, + isActionPanelCollapsed, + toggleActionPanel, ] )