mirror of
https://github.com/labring/FastGPT.git
synced 2025-07-23 05:12:39 +00:00
fix: simple mode variables dnd (#3767)
* fix: simple mode variables dnd * optimize dnd drag
This commit is contained in:
@@ -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>
|
||||||
);
|
);
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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) {
|
||||||
|
@@ -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>
|
||||||
|
Reference in New Issue
Block a user