add show/hide minimap

This commit is contained in:
hjlarry 2025-09-23 17:20:41 +08:00
parent c1e9c56e25
commit f49476a206
3 changed files with 56 additions and 17 deletions

View File

@ -1,4 +1,4 @@
import { memo, useEffect, useMemo, useRef } from 'react'
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'
import { MiniMap } from 'reactflow'
import UndoRedo from '../header/undo-redo'
import ZoomInOut from './zoom-in-out'
@ -13,6 +13,12 @@ export type OperatorProps = {
const Operator = ({ handleUndo, handleRedo }: OperatorProps) => {
const bottomPanelRef = useRef<HTMLDivElement>(null)
const [showMiniMap, setShowMiniMap] = useState(true)
const handleToggleMiniMap = useCallback(() => {
setShowMiniMap(prev => !prev)
}, [])
const workflowCanvasWidth = useStore(s => s.workflowCanvasWidth)
const rightPanelWidth = useStore(s => s.rightPanelWidth)
const setBottomPanelWidth = useStore(s => s.setBottomPanelWidth)
@ -57,18 +63,23 @@ const Operator = ({ handleUndo, handleRedo }: OperatorProps) => {
</div>
<VariableTrigger />
<div className='relative'>
<MiniMap
pannable
zoomable
style={{
width: 102,
height: 72,
}}
maskColor='var(--color-workflow-minimap-bg)'
className='!absolute !bottom-10 z-[9] !m-0 !h-[73px] !w-[103px] !rounded-lg !border-[0.5px]
!border-divider-subtle !bg-background-default-subtle !shadow-md !shadow-shadow-shadow-5'
{showMiniMap && (
<MiniMap
pannable
zoomable
style={{
width: 102,
height: 72,
}}
maskColor='var(--color-workflow-minimap-bg)'
className='!absolute !bottom-10 z-[9] !m-0 !h-[73px] !w-[103px] !rounded-lg !border-[0.5px]
!border-divider-subtle !bg-background-default-subtle !shadow-md !shadow-shadow-shadow-5'
/>
)}
<ZoomInOut
showMiniMap={showMiniMap}
onToggleMiniMap={handleToggleMiniMap}
/>
<ZoomInOut />
</div>
</div>
<VariableInspectPanel />

View File

@ -6,6 +6,7 @@ import {
useState,
} from 'react'
import {
RiCheckLine,
RiZoomInLine,
RiZoomOutLine,
} from '@remixicon/react'
@ -38,9 +39,18 @@ enum ZoomType {
zoomTo75 = 'zoomTo75',
zoomTo100 = 'zoomTo100',
zoomTo200 = 'zoomTo200',
toggleMiniMap = 'toggleMiniMap',
}
const ZoomInOut: FC = () => {
type ZoomInOutProps = {
showMiniMap?: boolean
onToggleMiniMap?: () => void
}
const ZoomInOut: FC<ZoomInOutProps> = ({
showMiniMap = true,
onToggleMiniMap,
}) => {
const { t } = useTranslation()
const {
zoomIn,
@ -78,13 +88,17 @@ const ZoomInOut: FC = () => {
key: ZoomType.zoomTo25,
text: '25%',
},
],
[
{
key: ZoomType.zoomToFit,
text: t('workflow.operator.zoomToFit'),
},
],
[
{
key: ZoomType.toggleMiniMap,
text: t('workflow.operator.showMiniMap'),
},
],
]
const handleZoom = (type: string) => {
@ -109,6 +123,11 @@ const ZoomInOut: FC = () => {
if (type === ZoomType.zoomTo200)
zoomTo(2)
if (type === ZoomType.toggleMiniMap) {
onToggleMiniMap?.()
return
}
handleSyncWorkflowDraft()
}
@ -178,7 +197,7 @@ const ZoomInOut: FC = () => {
</div>
</PortalToFollowElemTrigger>
<PortalToFollowElemContent className='z-10'>
<div className='w-[145px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px]'>
<div className='w-[192px] rounded-xl border-[0.5px] border-components-panel-border bg-components-panel-bg-blur shadow-lg backdrop-blur-[5px]'>
{
ZOOM_IN_OUT_OPTIONS.map((options, i) => (
<Fragment key={i}>
@ -195,7 +214,15 @@ const ZoomInOut: FC = () => {
className='system-md-regular flex h-8 cursor-pointer items-center justify-between space-x-1 rounded-lg py-1.5 pl-3 pr-2 text-text-secondary hover:bg-state-base-hover'
onClick={() => handleZoom(option.key)}
>
<span>{option.text}</span>
<div className='flex items-center space-x-2'>
{option.key === ZoomType.toggleMiniMap && showMiniMap && (
<RiCheckLine className='h-4 w-4 text-text-primary' />
)}
{option.key === ZoomType.toggleMiniMap && !showMiniMap && (
<div className='h-4 w-4' />
)}
<span>{option.text}</span>
</div>
<div className='flex items-center space-x-0.5'>
{
option.key === ZoomType.zoomToFit && (

View File

@ -326,6 +326,7 @@ const translation = {
zoomTo50: 'Zoom to 50%',
zoomTo100: 'Zoom to 100%',
zoomToFit: 'Zoom to Fit',
showMiniMap: 'Minimap',
alignNodes: 'Align Nodes',
alignLeft: 'Left',
alignCenter: 'Center',