From 5be658747718c180d7126c57f3f6d9dbf0d9aed1 Mon Sep 17 00:00:00 2001 From: jZonG Date: Fri, 18 Apr 2025 14:02:11 +0800 Subject: [PATCH] variable inspect panel layout --- .../components/workflow/operator/index.tsx | 6 +- web/app/components/workflow/panel/index.tsx | 2 +- .../workflow/store/workflow/layout-slice.ts | 8 ++- .../workflow/store/workflow/panel-slice.ts | 4 ++ .../workflow/variable-inspect/index.tsx | 60 +++++++++++++++++++ .../workflow/variable-inspect/panel.tsx | 19 ++++++ .../workflow/variable-inspect/trigger.tsx | 13 +++- 7 files changed, 104 insertions(+), 8 deletions(-) create mode 100644 web/app/components/workflow/variable-inspect/index.tsx create mode 100644 web/app/components/workflow/variable-inspect/panel.tsx diff --git a/web/app/components/workflow/operator/index.tsx b/web/app/components/workflow/operator/index.tsx index 702f94184b..63d048bcea 100644 --- a/web/app/components/workflow/operator/index.tsx +++ b/web/app/components/workflow/operator/index.tsx @@ -2,7 +2,8 @@ import { memo, useEffect, useMemo, useRef } from 'react' import { MiniMap } from 'reactflow' import UndoRedo from '../header/undo-redo' import ZoomInOut from './zoom-in-out' -import Trigger from '../variable-inspect/trigger' +import VariableTrigger from '../variable-inspect/trigger' +import VariableInspectPanel from '../variable-inspect' import { useStore } from '../store' export type OperatorProps = { @@ -50,7 +51,7 @@ const Operator = ({ handleUndo, handleRedo }: OperatorProps) => { >
- +
{
+ ) } diff --git a/web/app/components/workflow/panel/index.tsx b/web/app/components/workflow/panel/index.tsx index b5bbe16bf1..f687eb034b 100644 --- a/web/app/components/workflow/panel/index.tsx +++ b/web/app/components/workflow/panel/index.tsx @@ -80,7 +80,7 @@ const Panel: FC = () => {
{ diff --git a/web/app/components/workflow/store/workflow/layout-slice.ts b/web/app/components/workflow/store/workflow/layout-slice.ts index ea691670ae..e41a9ed083 100644 --- a/web/app/components/workflow/store/workflow/layout-slice.ts +++ b/web/app/components/workflow/store/workflow/layout-slice.ts @@ -14,8 +14,10 @@ export type LayoutSliceShape = { setOtherPanelWidth: (width: number) => void bottomPanelWidth: number // min-width = 400px; default-width = auto || 480px; setBottomPanelWidth: (width: number) => void - bottomPanelHeight: number // min-height = 120px; max-height = 480px; default-height = 320px; + bottomPanelHeight: number setBottomPanelHeight: (height: number) => void + variableInspectPanelHeight: number // min-height = 120px; default-height = 320px; + setVariableInspectPanelHeight: (height: number) => void } export const createLayoutSlice: StateCreator = set => ({ @@ -31,6 +33,8 @@ export const createLayoutSlice: StateCreator = set => ({ setOtherPanelWidth: width => set(() => ({ otherPanelWidth: width })), bottomPanelWidth: 480, setBottomPanelWidth: width => set(() => ({ bottomPanelWidth: width })), - bottomPanelHeight: 320, + bottomPanelHeight: 324, setBottomPanelHeight: height => set(() => ({ bottomPanelHeight: height })), + variableInspectPanelHeight: localStorage.getItem('workflow-variable-inpsect-panel-height') ? Number.parseFloat(localStorage.getItem('workflow-variable-inpsect-panel-height')!) : 320, + setVariableInspectPanelHeight: height => set(() => ({ variableInspectPanelHeight: height })), }) diff --git a/web/app/components/workflow/store/workflow/panel-slice.ts b/web/app/components/workflow/store/workflow/panel-slice.ts index 06a5f45e11..3005197bf3 100644 --- a/web/app/components/workflow/store/workflow/panel-slice.ts +++ b/web/app/components/workflow/store/workflow/panel-slice.ts @@ -15,6 +15,8 @@ export type PanelSliceShape = { left: number } setPanelMenu: (panelMenu: PanelSliceShape['panelMenu']) => void + showVariableInspectPanel: boolean + setShowVariableInspectPanel: (showVariableInspectPanel: boolean) => void } export const createPanelSlice: StateCreator = set => ({ @@ -29,4 +31,6 @@ export const createPanelSlice: StateCreator = set => ({ setShowDebugAndPreviewPanel: showDebugAndPreviewPanel => set(() => ({ showDebugAndPreviewPanel })), panelMenu: undefined, setPanelMenu: panelMenu => set(() => ({ panelMenu })), + showVariableInspectPanel: true, + setShowVariableInspectPanel: showVariableInspectPanel => set(() => ({ showVariableInspectPanel })), }) diff --git a/web/app/components/workflow/variable-inspect/index.tsx b/web/app/components/workflow/variable-inspect/index.tsx new file mode 100644 index 0000000000..c51429b882 --- /dev/null +++ b/web/app/components/workflow/variable-inspect/index.tsx @@ -0,0 +1,60 @@ +import type { FC } from 'react' +import { + useCallback, + useMemo, +} from 'react' +import { debounce } from 'lodash-es' +import { useStore } from '../store' +import { useResizePanel } from '../nodes/_base/hooks/use-resize-panel' +import Panel from './panel' +import cn from '@/utils/classnames' + +const VariableInspectPanel: FC = () => { + const showVariableInspectPanel = useStore(s => s.showVariableInspectPanel) + const workflowCanvasHeight = useStore(s => s.workflowCanvasHeight) + const variableInspectPanelHeight = useStore(s => s.variableInspectPanelHeight) + const setVariableInspectPanelHeight = useStore(s => s.setVariableInspectPanelHeight) + + const maxHeight = useMemo(() => { + if (!workflowCanvasHeight) + return 480 + return workflowCanvasHeight - 60 + }, [workflowCanvasHeight]) + + const handleResize = useCallback((width: number) => { + setVariableInspectPanelHeight(width) + }, [setVariableInspectPanelHeight]) + + const { + triggerRef, + containerRef, + } = useResizePanel({ + direction: 'vertical', + triggerDirection: 'top', + minHeight: 120, + maxHeight, + onResize: debounce(handleResize), + }) + + if (!showVariableInspectPanel) + return null + + return ( +
+
+
+
+
+ +
+
+ ) +} + +export default VariableInspectPanel diff --git a/web/app/components/workflow/variable-inspect/panel.tsx b/web/app/components/workflow/variable-inspect/panel.tsx new file mode 100644 index 0000000000..b148456f24 --- /dev/null +++ b/web/app/components/workflow/variable-inspect/panel.tsx @@ -0,0 +1,19 @@ +import type { FC } from 'react' + +// import { +// RiLoader2Line, +// RiStopCircleFill, +// } from '@remixicon/react' +import { useStore } from '../store' +import cn from '@/utils/classnames' + +const Panel: FC = () => { + const workflowCanvasHeight = useStore(s => s.workflowCanvasHeight) + + return ( +
+
+ ) +} + +export default Panel diff --git a/web/app/components/workflow/variable-inspect/trigger.tsx b/web/app/components/workflow/variable-inspect/trigger.tsx index 27a06d5f0f..fc9e994c9c 100644 --- a/web/app/components/workflow/variable-inspect/trigger.tsx +++ b/web/app/components/workflow/variable-inspect/trigger.tsx @@ -1,22 +1,29 @@ import type { FC } from 'react' import { RiLoader2Line, RiStopCircleFill } from '@remixicon/react' import Tooltip from '@/app/components/base/tooltip' +import { useStore } from '../store' import cn from '@/utils/classnames' const VariableInspectTrigger: FC = () => { + const showVariableInspectPanel = useStore(s => s.showVariableInspectPanel) + const setShowVariableInspectPanel = useStore(s => s.setShowVariableInspectPanel) + + if (showVariableInspectPanel) + return null + return (
{/* view button */}
{}} + onClick={() => setShowVariableInspectPanel(true)} > Variable inspect
{/* caching button */}
{}} + onClick={() => setShowVariableInspectPanel(true)} > Caching running status @@ -35,7 +42,7 @@ const VariableInspectTrigger: FC = () => { {/* finish button */}
{}} + onClick={() => setShowVariableInspectPanel(true)} > View cached variables