From 8134e815c49e7beee9ee8bfd57b8a5bfa72e3340 Mon Sep 17 00:00:00 2001 From: jazelly Date: Thu, 8 Aug 2024 23:23:39 +0930 Subject: [PATCH] feat: draggable icon --- .../reusable/AnimatedDropdown.component.tsx | 3 +- .../reusable/FollowPortal.component.tsx | 2 +- .../reusable/TooltipPlus.component.tsx | 1 + .../workflow/NodeSelector.component.tsx | 137 +++++++++++------- .../workflow/block-selector/blocks.tsx | 2 +- frontend/src/components/workflow/index.tsx | 18 ++- .../workflow/nodes/base/base.node.tsx | 7 +- .../src/components/workflow/nodes/index.tsx | 2 +- .../workflow/nodes/trainer.node.tsx | 11 -- 9 files changed, 106 insertions(+), 77 deletions(-) delete mode 100644 frontend/src/components/workflow/nodes/trainer.node.tsx diff --git a/frontend/src/components/reusable/AnimatedDropdown.component.tsx b/frontend/src/components/reusable/AnimatedDropdown.component.tsx index 7bc8731..2b1658c 100644 --- a/frontend/src/components/reusable/AnimatedDropdown.component.tsx +++ b/frontend/src/components/reusable/AnimatedDropdown.component.tsx @@ -40,12 +40,11 @@ export const AnimatedDropdown = ({
{children}
diff --git a/frontend/src/components/reusable/FollowPortal.component.tsx b/frontend/src/components/reusable/FollowPortal.component.tsx index 1560baf..77b672b 100644 --- a/frontend/src/components/reusable/FollowPortal.component.tsx +++ b/frontend/src/components/reusable/FollowPortal.component.tsx @@ -131,7 +131,7 @@ export const PortalToFollowElemTrigger = React.forwardRef< return (
= ({ {children} diff --git a/frontend/src/components/workflow/NodeSelector.component.tsx b/frontend/src/components/workflow/NodeSelector.component.tsx index 38f6510..fcf3281 100644 --- a/frontend/src/components/workflow/NodeSelector.component.tsx +++ b/frontend/src/components/workflow/NodeSelector.component.tsx @@ -1,18 +1,45 @@ -import { HouseLine, MathOperations, PlusCircle } from '@phosphor-icons/react'; +import { + Database, + HouseLine, + MathOperations, + PlusCircle, + Question, +} from '@phosphor-icons/react'; +import cn from 'classnames'; import { t } from 'i18next'; import React, { useEffect, useRef, useState } from 'react'; import { TooltipPlus } from '../reusable/TooltipPlus.component'; import { AnimatedDropdown } from '../reusable/AnimatedDropdown.component'; -import { useDrag, useDragLayer } from 'react-dnd'; +import { DragPreviewImage, useDrag, useDragLayer } from 'react-dnd'; +import CustomNode from './nodes'; +import { BlockEnum } from './types'; +import styled from 'styled-components'; +import { QuestionMarkCircleIcon } from '@heroicons/react/20/solid'; -const DraggableNode = ({ type, children }) => { +const DraggableNode = ({ type, children, className }) => { const ref = useRef(null); + const previewRef = useRef(); const [{ isDragging }, drag, preview] = useDrag(() => ({ type, - item: { type: 'customNode' }, + item: { type }, collect: (monitor) => ({ - isDragging: !!monitor.isDragging(), + isDragging: monitor.isDragging(), }), + end: (item, monitor) => { + if (monitor.didDrop()) { + const x = monitor.getSourceClientOffset()?.x; + const y = monitor.getSourceClientOffset()?.y; + console.log('x, y', x, y); + } + }, + options: { + dropEffect: 'move', + previewOptions: { + anchorX: 0.5, + anchorY: 0.5, + component: DragPreview, + }, + }, })); useEffect(() => { @@ -22,10 +49,9 @@ const DraggableNode = ({ type, children }) => { }, [preview]); return ( - <> +
{children} - {isDragging && } - +
); }; @@ -54,61 +80,70 @@ const DragLayer = ({ type }) => { return (
- +
); }; const DragPreview = ({ type }) => { - return ( - - ); + // return + return
NMSL
; }; export const NodeSelector = () => { return ( -
-
- - {t('workflow.blocks.start')} -
- } +
+ + Use the Dataset node to specify your input data +
+ } + > + - - -
-
- - {t('workflow.blocks.train')} -
- } +
+ + Dataset +
+ + + + + + Use the Train node to specify a model training job +
+ } + > + - - - +
+ + Train +
+ +
+ ); diff --git a/frontend/src/components/workflow/block-selector/blocks.tsx b/frontend/src/components/workflow/block-selector/blocks.tsx index 2c9864f..82eca20 100644 --- a/frontend/src/components/workflow/block-selector/blocks.tsx +++ b/frontend/src/components/workflow/block-selector/blocks.tsx @@ -1,3 +1,4 @@ +import React from 'react'; import { memo, useCallback, useMemo } from 'react'; import { useTranslation } from 'react-i18next'; import { groupBy } from 'lodash-es'; @@ -8,7 +9,6 @@ import { BLOCK_CLASSIFICATIONS } from './constants'; import { useBlocks } from './hooks'; import type { ToolDefaultValue } from './types'; import Tooltip from '@/components/reusable/Tooltip.component'; -import React from 'react'; type BlocksProps = { searchText: string; diff --git a/frontend/src/components/workflow/index.tsx b/frontend/src/components/workflow/index.tsx index 6b26b38..b177794 100644 --- a/frontend/src/components/workflow/index.tsx +++ b/frontend/src/components/workflow/index.tsx @@ -46,6 +46,8 @@ import { TrainerMessageMapContext } from '@/contexts/TrainerMessageMap.context'; import { NodeDetailStateProvider } from '@/contexts/Workflow.context'; import { useNavigate } from 'react-router-dom'; import { v4 } from 'uuid'; +import { DndProvider } from 'react-dnd'; +import { HTML5Backend } from 'react-dnd-html5-backend'; const nodeTypes = { custom: CustomNode, @@ -290,13 +292,15 @@ const WorkflowWrap = memo(() => { } return ( - - - + + + + + ); }); WorkflowWrap.displayName = 'WorkflowWrap'; diff --git a/frontend/src/components/workflow/nodes/base/base.node.tsx b/frontend/src/components/workflow/nodes/base/base.node.tsx index 78db59e..b513dd5 100644 --- a/frontend/src/components/workflow/nodes/base/base.node.tsx +++ b/frontend/src/components/workflow/nodes/base/base.node.tsx @@ -8,9 +8,9 @@ import NodeControl from './components/node-control'; type BaseNodeProps = { children: ReactElement; -} & NodeProps; +} & NodeProps & { className?: string }; -const BaseNode: FC = ({ id, data, children }) => { +const BaseNode: FC = ({ id, data, children, className }) => { const nodeRef = useRef(null); const showSelectedBorder = data.selected || data._isEntering; @@ -33,7 +33,8 @@ const BaseNode: FC = ({ id, data, children }) => {
diff --git a/frontend/src/components/workflow/nodes/index.tsx b/frontend/src/components/workflow/nodes/index.tsx index 8f5dad4..268c7a6 100644 --- a/frontend/src/components/workflow/nodes/index.tsx +++ b/frontend/src/components/workflow/nodes/index.tsx @@ -4,7 +4,7 @@ import type { NodeProps } from 'reactflow'; import { NodeComponentMap } from '../constants'; import BaseNode from './base/base.node'; -const CustomNode = (props: NodeProps) => { +const CustomNode = (props: NodeProps & { className: string }) => { const nodeData = props.data; const NodeComponent = NodeComponentMap[nodeData.type]; console.log('nodeData', nodeData); diff --git a/frontend/src/components/workflow/nodes/trainer.node.tsx b/frontend/src/components/workflow/nodes/trainer.node.tsx deleted file mode 100644 index 8b61297..0000000 --- a/frontend/src/components/workflow/nodes/trainer.node.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react'; - -const TrainerNode: React.FC = ({ data }) => ( -
-

Trainer

-
Training method
-
base model
-
-); - -export default TrainerNode;