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,
]
)