fix: simple mode variables dnd (#3767)

* fix: simple mode variables dnd

* optimize dnd drag
This commit is contained in:
heheer
2025-02-12 14:36:04 +08:00
committed by GitHub
parent c42deab63b
commit 06a8a5e23d
7 changed files with 70 additions and 84 deletions

View File

@@ -1,5 +1,5 @@
import { Box, Tbody } from '@chakra-ui/react'; import { Box, Tbody } from '@chakra-ui/react';
import React, { ReactNode, useState } from 'react'; import React, { ReactElement, ReactNode, useState } from 'react';
import { import {
DragDropContext, DragDropContext,
Droppable, Droppable,
@@ -14,22 +14,19 @@ export * from 'react-beautiful-dnd';
type Props<T = any> = { type Props<T = any> = {
onDragEndCb: (result: T[]) => void; onDragEndCb: (result: T[]) => void;
renderClone?: DraggableChildrenFn; renderClone?: DraggableChildrenFn;
children: children: ({
| ((provided: DroppableProvided, snapshot: DroppableStateSnapshot) => ReactNode) provided,
| ReactNode; snapshot,
draggingItemHeight
}: {
provided: DroppableProvided;
snapshot: DroppableStateSnapshot;
draggingItemHeight: number;
}) => ReactElement<HTMLElement, string>;
dataList: T[]; dataList: T[];
isTable?: boolean;
zoom?: number;
}; };
function DndDrag<T>({ function DndDrag<T>({ children, renderClone, onDragEndCb, dataList }: Props<T>) {
children,
renderClone,
onDragEndCb,
dataList,
isTable = false,
zoom = 1
}: Props<T>) {
const [draggingItemHeight, setDraggingItemHeight] = useState(0); const [draggingItemHeight, setDraggingItemHeight] = useState(0);
const onDragStart = (start: DragStart) => { const onDragStart = (start: DragStart) => {
@@ -56,19 +53,7 @@ function DndDrag<T>({
return ( return (
<DragDropContext onDragStart={onDragStart} onDragEnd={onDragEnd}> <DragDropContext onDragStart={onDragStart} onDragEnd={onDragEnd}>
<Droppable droppableId="droppable" renderClone={renderClone}> <Droppable droppableId="droppable" renderClone={renderClone}>
{(provided, snapshot) => { {(provided, snapshot) => children({ provided, snapshot, draggingItemHeight })}
return isTable ? (
<Tbody {...provided.droppableProps} ref={provided.innerRef}>
{typeof children !== 'function' && children}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight / zoom}px`} />}
</Tbody>
) : (
<Box {...provided.droppableProps} ref={provided.innerRef}>
{typeof children === 'function' && children(provided, snapshot)}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight / zoom}px`} />}
</Box>
);
}}
</Droppable> </Droppable>
</DragDropContext> </DragDropContext>
); );

View File

@@ -9,7 +9,8 @@ import {
Th, Th,
Td, Td,
TableContainer, TableContainer,
Stack Stack,
Tbody
} from '@chakra-ui/react'; } from '@chakra-ui/react';
import { SmallAddIcon } from '@chakra-ui/icons'; import { SmallAddIcon } from '@chakra-ui/icons';
import { import {
@@ -30,7 +31,6 @@ import FormLabel from '@fastgpt/web/components/common/MyBox/FormLabel';
import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip'; import QuestionTip from '@fastgpt/web/components/common/MyTooltip/QuestionTip';
import InputTypeConfig from '@/pageComponents/app/detail/WorkflowComponents/Flow/nodes/NodePluginIO/InputTypeConfig'; import InputTypeConfig from '@/pageComponents/app/detail/WorkflowComponents/Flow/nodes/NodePluginIO/InputTypeConfig';
import MyIconButton from '@fastgpt/web/components/common/Icon/button'; import MyIconButton from '@fastgpt/web/components/common/Icon/button';
import { useReactFlow, useViewport } from 'reactflow';
import DndDrag, { import DndDrag, {
Draggable, Draggable,
DraggableProvided, DraggableProvided,
@@ -60,14 +60,15 @@ export const addVariable = () => {
const VariableEdit = ({ const VariableEdit = ({
variables = [], variables = [],
onChange onChange,
zoom = 1
}: { }: {
variables?: VariableItemType[]; variables?: VariableItemType[];
onChange: (data: VariableItemType[]) => void; onChange: (data: VariableItemType[]) => void;
zoom?: number;
}) => { }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const { toast } = useToast(); const { toast } = useToast();
const { zoom } = useViewport();
const form = useForm<VariableItemType>(); const form = useForm<VariableItemType>();
const { setValue, reset, watch, getValues } = form; const { setValue, reset, watch, getValues } = form;
@@ -222,24 +223,27 @@ const VariableEdit = ({
variables={variables} variables={variables}
/> />
)} )}
isTable
zoom={zoom}
> >
{formatVariables.map((item, index) => ( {({ provided, snapshot, draggingItemHeight }) => (
<Draggable key={item.id} draggableId={item.id} index={index}> <Tbody {...provided.droppableProps} ref={provided.innerRef}>
{(provided, snapshot) => ( {formatVariables.map((item, index) => (
<TableItem <Draggable key={item.id} draggableId={item.id} index={index}>
provided={provided} {(provided, snapshot) => (
snapshot={snapshot} <TableItem
item={item} provided={provided}
reset={reset} snapshot={snapshot}
onChange={onChange} item={item}
variables={variables} reset={reset}
key={item.id} onChange={onChange}
/> variables={variables}
)} key={item.id}
</Draggable> />
))} )}
</Draggable>
))}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight / zoom}px`} />}
</Tbody>
)}
</DndDrag> </DndDrag>
</Table> </Table>
</TableContainer> </TableContainer>

View File

@@ -209,27 +209,30 @@ const NodeFormInput = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
/> />
); );
}} }}
isTable
zoom={zoom}
> >
{inputs.map((item, index) => { {({ provided, snapshot, draggingItemHeight }) => (
const icon = FlowNodeInputMap[item.type as FlowNodeInputTypeEnum]?.icon; <Tbody {...provided.droppableProps} ref={provided.innerRef}>
return ( {inputs.map((item, index) => {
<Draggable key={item.key} draggableId={item.key} index={index}> const icon = FlowNodeInputMap[item.type as FlowNodeInputTypeEnum]?.icon;
{(provided, snapshot) => ( return (
<TableItem <Draggable key={item.key} draggableId={item.key} index={index}>
provided={provided} {(provided, snapshot) => (
snapshot={snapshot} <TableItem
key={item.key} provided={provided}
item={item} snapshot={snapshot}
icon={icon} key={item.key}
setEditField={setEditField} item={item}
onDelete={onDelete} icon={icon}
/> setEditField={setEditField}
)} onDelete={onDelete}
</Draggable> />
); )}
})} </Draggable>
);
})}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight / zoom}px`} />}
</Tbody>
)}
</DndDrag> </DndDrag>
</Table> </Table>
</TableContainer> </TableContainer>

View File

@@ -64,9 +64,8 @@ const NodeIfElse = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
nodeId={nodeId} nodeId={nodeId}
/> />
)} )}
zoom={zoom}
> >
{(provided) => ( {({ provided, snapshot, draggingItemHeight }) => (
<Box {...provided.droppableProps} ref={provided.innerRef}> <Box {...provided.droppableProps} ref={provided.innerRef}>
{ifElseList.map((conditionItem, conditionIndex) => ( {ifElseList.map((conditionItem, conditionIndex) => (
<Draggable <Draggable
@@ -87,6 +86,7 @@ const NodeIfElse = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
)} )}
</Draggable> </Draggable>
))} ))}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight / zoom}px`} />}
</Box> </Box>
)} )}
</DndDrag> </DndDrag>

View File

@@ -417,7 +417,7 @@ const InputTypeConfig = ({
); );
}} }}
> >
{(provided) => ( {({ provided, snapshot, draggingItemHeight }) => (
<Box <Box
{...provided.droppableProps} {...provided.droppableProps}
ref={provided.innerRef} ref={provided.innerRef}
@@ -487,9 +487,7 @@ const InputTypeConfig = ({
)} )}
</Draggable> </Draggable>
))} ))}
<Box h="0" w="0"> {snapshot.isDraggingOver && <Box height={`${draggingItemHeight}px`} />}
{provided.placeholder}
</Box>
</Box> </Box>
)} )}
</DndDrag> </DndDrag>

View File

@@ -1,5 +1,5 @@
import React, { Dispatch, useMemo } from 'react'; import React, { Dispatch, useMemo } from 'react';
import { NodeProps } from 'reactflow'; import { NodeProps, useViewport } from 'reactflow';
import { Box } from '@chakra-ui/react'; import { Box } from '@chakra-ui/react';
import { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/node.d'; import { FlowNodeItemType } from '@fastgpt/global/core/workflow/type/node.d';
@@ -13,12 +13,7 @@ import NodeCard from './render/NodeCard';
import ScheduledTriggerConfig from '@/components/core/app/ScheduledTriggerConfig'; import ScheduledTriggerConfig from '@/components/core/app/ScheduledTriggerConfig';
import { useContextSelector } from 'use-context-selector'; import { useContextSelector } from 'use-context-selector';
import { WorkflowContext } from '../../context'; import { WorkflowContext } from '../../context';
import { import { AppChatConfigType, AppDetailType, VariableItemType } from '@fastgpt/global/core/app/type';
AppChatConfigType,
AppDetailType,
AppQGConfigType,
VariableItemType
} from '@fastgpt/global/core/app/type';
import { useMemoizedFn } from 'ahooks'; import { useMemoizedFn } from 'ahooks';
import VariableEdit from '@/components/core/app/VariableEdit'; import VariableEdit from '@/components/core/app/VariableEdit';
import { AppContext } from '@/pageComponents/app/detail/context'; import { AppContext } from '@/pageComponents/app/detail/context';
@@ -133,8 +128,9 @@ function ChatStartVariable({ chatConfig: { variables = [] }, setAppDetail }: Com
} }
})); }));
}); });
const { zoom } = useViewport();
return <VariableEdit variables={variables} onChange={(e) => updateVariables(e)} />; return <VariableEdit variables={variables} onChange={(e) => updateVariables(e)} zoom={zoom} />;
} }
function AutoExecute({ chatConfig: { autoExecute }, setAppDetail }: ComponentProps) { function AutoExecute({ chatConfig: { autoExecute }, setAppDetail }: ComponentProps) {

View File

@@ -62,9 +62,8 @@ const NodeUserSelect = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
index={rubric.source.index} index={rubric.source.index}
/> />
)} )}
zoom={zoom}
> >
{(provided) => ( {({ provided, snapshot, draggingItemHeight }) => (
<Box ref={provided.innerRef} {...provided.droppableProps}> <Box ref={provided.innerRef} {...provided.droppableProps}>
{options.map((item, i) => ( {options.map((item, i) => (
<Draggable key={item.key} index={i} draggableId={item.key}> <Draggable key={item.key} index={i} draggableId={item.key}>
@@ -81,6 +80,7 @@ const NodeUserSelect = ({ data, selected }: NodeProps<FlowNodeItemType>) => {
)} )}
</Draggable> </Draggable>
))} ))}
{snapshot.isDraggingOver && <Box height={`${draggingItemHeight}px`} />}
</Box> </Box>
)} )}
</DndDrag> </DndDrag>