balibabu
Feat: The Begin and IterationStart operators cannot be deleted using shortcut keys #4287 (#4288)
b1ea792
| import { useTheme } from '@/components/theme-provider'; | |
| import { | |
| IIterationNode, | |
| IIterationStartNode, | |
| } from '@/interfaces/database/flow'; | |
| import { cn } from '@/lib/utils'; | |
| import { Handle, NodeProps, NodeResizeControl, Position } from '@xyflow/react'; | |
| import { ListRestart } from 'lucide-react'; | |
| import { LeftHandleStyle, RightHandleStyle } from './handle-icon'; | |
| import styles from './index.less'; | |
| import NodeHeader from './node-header'; | |
| function ResizeIcon() { | |
| return ( | |
| <svg | |
| xmlns="http://www.w3.org/2000/svg" | |
| width="20" | |
| height="20" | |
| viewBox="0 0 24 24" | |
| strokeWidth="2" | |
| stroke="#5025f9" | |
| fill="none" | |
| strokeLinecap="round" | |
| strokeLinejoin="round" | |
| style={{ | |
| position: 'absolute', | |
| right: 5, | |
| bottom: 5, | |
| }} | |
| > | |
| <path stroke="none" d="M0 0h24v24H0z" fill="none" /> | |
| <polyline points="16 20 20 20 20 16" /> | |
| <line x1="14" y1="14" x2="20" y2="20" /> | |
| <polyline points="8 4 4 4 4 8" /> | |
| <line x1="4" y1="4" x2="10" y2="10" /> | |
| </svg> | |
| ); | |
| } | |
| const controlStyle = { | |
| background: 'transparent', | |
| border: 'none', | |
| cursor: 'nwse-resize', | |
| }; | |
| export function IterationNode({ | |
| id, | |
| data, | |
| isConnectable = true, | |
| selected, | |
| }: NodeProps<IIterationNode>) { | |
| const { theme } = useTheme(); | |
| return ( | |
| <section | |
| className={cn( | |
| 'w-full h-full bg-zinc-200 opacity-70', | |
| styles.iterationNode, | |
| { | |
| ['bg-gray-800']: theme === 'dark', | |
| [styles.selectedIterationNode]: selected, | |
| }, | |
| )} | |
| > | |
| <NodeResizeControl style={controlStyle} minWidth={100} minHeight={50}> | |
| <ResizeIcon /> | |
| </NodeResizeControl> | |
| <Handle | |
| id="c" | |
| type="source" | |
| position={Position.Left} | |
| isConnectable={isConnectable} | |
| className={styles.handle} | |
| style={LeftHandleStyle} | |
| ></Handle> | |
| <Handle | |
| type="source" | |
| position={Position.Right} | |
| isConnectable={isConnectable} | |
| className={styles.handle} | |
| id="b" | |
| style={RightHandleStyle} | |
| ></Handle> | |
| <NodeHeader | |
| id={id} | |
| name={data.name} | |
| label={data.label} | |
| wrapperClassName={cn( | |
| 'p-2 bg-white rounded-t-[10px] absolute w-full top-[-60px] left-[-0.3px]', | |
| styles.iterationHeader, | |
| { | |
| [`${styles.dark} text-white`]: theme === 'dark', | |
| [styles.selectedHeader]: selected, | |
| }, | |
| )} | |
| ></NodeHeader> | |
| </section> | |
| ); | |
| } | |
| export function IterationStartNode({ | |
| isConnectable = true, | |
| selected, | |
| }: NodeProps<IIterationStartNode>) { | |
| const { theme } = useTheme(); | |
| return ( | |
| <section | |
| className={cn('bg-white p-2 rounded-xl', { | |
| [styles.dark]: theme === 'dark', | |
| [styles.selectedNode]: selected, | |
| })} | |
| > | |
| <Handle | |
| type="source" | |
| position={Position.Right} | |
| isConnectable={isConnectable} | |
| className={styles.handle} | |
| style={RightHandleStyle} | |
| isConnectableEnd={false} | |
| ></Handle> | |
| <div> | |
| <ListRestart className="size-7" /> | |
| </div> | |
| </section> | |
| ); | |
| } | |