Commit 173336f2 authored by StyleZhang's avatar StyleZhang

node handle

parent f37316f2
...@@ -57,7 +57,6 @@ export const NODES_INITIAL_DATA = { ...@@ -57,7 +57,6 @@ export const NODES_INITIAL_DATA = {
type: BlockEnum.IfElse, type: BlockEnum.IfElse,
title: '', title: '',
desc: '', desc: '',
...IfElseDefault.defaultValue, ...IfElseDefault.defaultValue,
}, },
[BlockEnum.Code]: { [BlockEnum.Code]: {
......
...@@ -10,6 +10,7 @@ import type { ...@@ -10,6 +10,7 @@ import type {
Viewport, Viewport,
} from 'reactflow' } from 'reactflow'
import { import {
Position,
getConnectedEdges, getConnectedEdges,
getIncomers, getIncomers,
useReactFlow, useReactFlow,
...@@ -118,32 +119,32 @@ export const useWorkflow = () => { ...@@ -118,32 +119,32 @@ export const useWorkflow = () => {
getNodes, getNodes,
setNodes, setNodes,
} = store.getState() } = store.getState()
const { setHelpLine } = useStore.getState() // const { setHelpLine } = useStore.getState()
e.stopPropagation() e.stopPropagation()
const nodes = getNodes() const nodes = getNodes()
const showVerticalHelpLineNodes = nodes.filter((n) => { // const showVerticalHelpLineNodes = nodes.filter((n) => {
if ( // if (
n.position.x === node.position.x // n.position.x === node.position.x
|| n.position.x + n.width! === node.position.x // || n.position.x + n.width! === node.position.x
|| n.position.x === node.position.x + node.width! // || n.position.x === node.position.x + node.width!
) // )
return true // return true
return false // return false
}) // })
const showHorizontalHelpLineNodes = nodes.filter((n) => { // const showHorizontalHelpLineNodes = nodes.filter((n) => {
if ( // if (
n.position.y === node.position.y // n.position.y === node.position.y
|| n.position.y === node.position.y + node.height! // || n.position.y === node.position.y + node.height!
|| n.position.y + n.height! === node.position.y // || n.position.y + n.height! === node.position.y
|| n.position.y + n.height! === node.position.y + node.height! // || n.position.y + n.height! === node.position.y + node.height!
) // )
return true // return true
return false // return false
}) // })
const newNodes = produce(nodes, (draft) => { const newNodes = produce(nodes, (draft) => {
const currentNode = draft.find(n => n.id === node.id)! const currentNode = draft.find(n => n.id === node.id)!
...@@ -166,17 +167,9 @@ export const useWorkflow = () => { ...@@ -166,17 +167,9 @@ export const useWorkflow = () => {
const handleNodeEnter = useCallback<NodeMouseHandler>((_, node) => { const handleNodeEnter = useCallback<NodeMouseHandler>((_, node) => {
const { const {
getNodes,
setNodes,
edges, edges,
setEdges, setEdges,
} = store.getState() } = store.getState()
const newNodes = produce(getNodes(), (draft) => {
const currentNode = draft.find(n => n.id === node.id)!
currentNode.data._hovering = true
})
setNodes(newNodes)
const newEdges = produce(edges, (draft) => { const newEdges = produce(edges, (draft) => {
const connectedEdges = getConnectedEdges([node], edges) const connectedEdges = getConnectedEdges([node], edges)
...@@ -189,19 +182,11 @@ export const useWorkflow = () => { ...@@ -189,19 +182,11 @@ export const useWorkflow = () => {
setEdges(newEdges) setEdges(newEdges)
}, [store]) }, [store])
const handleNodeLeave = useCallback<NodeMouseHandler>((_, node) => { const handleNodeLeave = useCallback<NodeMouseHandler>(() => {
const { const {
getNodes,
setNodes,
edges, edges,
setEdges, setEdges,
} = store.getState() } = store.getState()
const newNodes = produce(getNodes(), (draft) => {
const currentNode = draft.find(n => n.id === node.id)!
currentNode.data._hovering = false
})
setNodes(newNodes)
const newEdges = produce(edges, (draft) => { const newEdges = produce(edges, (draft) => {
draft.forEach((edge) => { draft.forEach((edge) => {
edge.data = { ...edge.data, _connectedNodeIsHovering: false } edge.data = { ...edge.data, _connectedNodeIsHovering: false }
...@@ -331,6 +316,7 @@ export const useWorkflow = () => { ...@@ -331,6 +316,7 @@ export const useWorkflow = () => {
x: currentNode.position.x + 304, x: currentNode.position.x + 304,
y: currentNode.position.y, y: currentNode.position.y,
}, },
targetPosition: Position.Left,
} }
const newEdge = { const newEdge = {
id: `${currentNode.id}-${nextNode.id}`, id: `${currentNode.id}-${nextNode.id}`,
......
import { memo } from 'react' import { memo, useMemo } from 'react'
import { import {
getConnectedEdges, getConnectedEdges,
getOutgoers, getOutgoers,
...@@ -6,10 +6,14 @@ import { ...@@ -6,10 +6,14 @@ import {
useStoreApi, useStoreApi,
} from 'reactflow' } from 'reactflow'
import BlockIcon from '../../../../block-icon' import BlockIcon from '../../../../block-icon'
import type { Node } from '../../../../types' import type {
Branch,
Node,
} from '../../../../types'
import Add from './add' import Add from './add'
import Item from './item' import Item from './item'
import Line from './line' import Line from './line'
import { BlockEnum } from '@/app/components/workflow/types'
type NextStepProps = { type NextStepProps = {
selectedNode: Node selectedNode: Node
...@@ -18,7 +22,15 @@ const NextStep = ({ ...@@ -18,7 +22,15 @@ const NextStep = ({
selectedNode, selectedNode,
}: NextStepProps) => { }: NextStepProps) => {
const store = useStoreApi() const store = useStoreApi()
const branches = selectedNode?.data._targetBranches const branches = useMemo(() => {
const nodeData = selectedNode.data
if (nodeData.type === BlockEnum.IfElse)
return nodeData._targetBranches
if (nodeData.type === BlockEnum.QuestionClassifier)
return (nodeData as any).classes
}, [selectedNode])
const edges = useEdges() const edges = useEdges()
const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges) const outgoers = getOutgoers(selectedNode as Node, store.getState().getNodes(), edges)
const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id) const connectedEdges = getConnectedEdges([selectedNode] as Node[], edges).filter(edge => edge.source === selectedNode!.id)
...@@ -52,7 +64,7 @@ const NextStep = ({ ...@@ -52,7 +64,7 @@ const NextStep = ({
} }
{ {
branches?.length && ( branches?.length && (
branches.map((branch) => { branches.map((branch: Branch) => {
const connected = connectedEdges.find(edge => edge.sourceHandle === branch.id) const connected = connectedEdges.find(edge => edge.sourceHandle === branch.id)
const target = outgoers.find(outgoer => outgoer.id === connected?.target) const target = outgoers.find(outgoer => outgoer.id === connected?.target)
......
...@@ -70,7 +70,7 @@ export const NodeTargetHandle = ({ ...@@ -70,7 +70,7 @@ export const NodeTargetHandle = ({
triggerClassName={open => ` triggerClassName={open => `
hidden absolute left-0 top-0 pointer-events-none hidden absolute left-0 top-0 pointer-events-none
${nodeSelectorClassName} ${nodeSelectorClassName}
${data._hovering && '!flex'} group-hover:flex
${open && '!flex'} ${open && '!flex'}
`} `}
/> />
...@@ -83,7 +83,6 @@ export const NodeTargetHandle = ({ ...@@ -83,7 +83,6 @@ export const NodeTargetHandle = ({
export const NodeSourceHandle = ({ export const NodeSourceHandle = ({
id, id,
data,
handleId, handleId,
handleClassName, handleClassName,
nodeSelectorClassName, nodeSelectorClassName,
...@@ -129,7 +128,7 @@ export const NodeSourceHandle = ({ ...@@ -129,7 +128,7 @@ export const NodeSourceHandle = ({
triggerClassName={open => ` triggerClassName={open => `
hidden absolute top-0 left-0 pointer-events-none hidden absolute top-0 left-0 pointer-events-none
${nodeSelectorClassName} ${nodeSelectorClassName}
${data._hovering && '!flex'} group-hover:flex
${open && '!flex'} ${open && '!flex'}
`} `}
/> />
......
...@@ -7,6 +7,11 @@ import { ...@@ -7,6 +7,11 @@ import {
memo, memo,
} from 'react' } from 'react'
import type { NodeProps } from '../../types' import type { NodeProps } from '../../types'
import { BlockEnum } from '../../types'
import {
NodeSourceHandle,
NodeTargetHandle,
} from './components/node-handle'
import BlockIcon from '@/app/components/workflow/block-icon' import BlockIcon from '@/app/components/workflow/block-icon'
type BaseNodeProps = { type BaseNodeProps = {
...@@ -18,8 +23,6 @@ const BaseNode: FC<BaseNodeProps> = ({ ...@@ -18,8 +23,6 @@ const BaseNode: FC<BaseNodeProps> = ({
data, data,
children, children,
}) => { }) => {
const type = data.type
return ( return (
<div <div
className={` className={`
...@@ -28,6 +31,26 @@ const BaseNode: FC<BaseNodeProps> = ({ ...@@ -28,6 +31,26 @@ const BaseNode: FC<BaseNodeProps> = ({
${data._selected ? 'border-[2px] border-primary-600' : 'border border-white'} ${data._selected ? 'border-[2px] border-primary-600' : 'border border-white'}
`} `}
> >
{
data.type !== BlockEnum.VariableAssigner && (
<NodeTargetHandle
id={id}
data={data}
handleClassName='!top-[17px] !-left-2'
handleId='target'
/>
)
}
{
data.type !== BlockEnum.IfElse && data.type !== BlockEnum.QuestionClassifier && (
<NodeSourceHandle
id={id}
data={data}
handleClassName='!top-[17px] !-right-2'
handleId='source'
/>
)
}
<div className='flex items-center px-3 pt-3 pb-2'> <div className='flex items-center px-3 pt-3 pb-2'>
<BlockIcon <BlockIcon
className='shrink-0 mr-2' className='shrink-0 mr-2'
......
import { memo } from 'react' import { memo } from 'react'
import type { NodeProps } from 'reactflow' import type { NodeProps } from 'reactflow'
import type { Node } from '../types' import type { Node } from '../types'
import { BlockEnum } from '../types'
import { canRunBySingle } from '../utils' import { canRunBySingle } from '../utils'
import { import {
NodeComponentMap, NodeComponentMap,
...@@ -9,10 +8,6 @@ import { ...@@ -9,10 +8,6 @@ import {
} from './constants' } from './constants'
import BaseNode from './_base/node' import BaseNode from './_base/node'
import BasePanel from './_base/panel' import BasePanel from './_base/panel'
import {
NodeSourceHandle,
NodeTargetHandle,
} from './_base/components/node-handle'
import NodeControl from './_base/components/node-control' import NodeControl from './_base/components/node-control'
const CustomNode = memo((props: NodeProps) => { const CustomNode = memo((props: NodeProps) => {
...@@ -22,27 +17,9 @@ const CustomNode = memo((props: NodeProps) => { ...@@ -22,27 +17,9 @@ const CustomNode = memo((props: NodeProps) => {
return ( return (
<> <>
{
nodeData.type !== BlockEnum.VariableAssigner && (
<NodeTargetHandle
{ ...props }
handleClassName='!top-[17px] !-left-2'
handleId='target'
/>
)
}
<BaseNode { ...props }> <BaseNode { ...props }>
<NodeComponent /> <NodeComponent />
</BaseNode> </BaseNode>
{
nodeData.type !== BlockEnum.IfElse && nodeData.type !== BlockEnum.QuestionClassifier && (
<NodeSourceHandle
{ ...props }
handleClassName='!top-[17px] !-right-2'
handleId='source'
/>
)
}
{ {
nodeData._selected nodeData._selected
&& canRunBySingle(nodeData.type) && canRunBySingle(nodeData.type)
......
...@@ -42,7 +42,7 @@ const Node: FC<NodeProps<QuestionClassifierNodeType>> = (props) => { ...@@ -42,7 +42,7 @@ const Node: FC<NodeProps<QuestionClassifierNodeType>> = (props) => {
<NodeSourceHandle <NodeSourceHandle
{...props} {...props}
handleId={topic.name} handleId={topic.name}
handleClassName='!top-[11px] !-right-[21px]' handleClassName='!top-1/2 !-translate-y-1/2 !-right-[21px]'
/> />
</div> </div>
))} ))}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment