@xrenders/xflow
Version:
一款功能强大、易用灵活的流程编辑器框架,帮助你轻松构建复杂的工作流和流程产品
180 lines (179 loc) • 4.88 kB
TypeScript
import { TabPaneProps } from 'antd';
import { Schema, useForm } from 'form-render';
import { ReactFlow } from '@xyflow/react';
import React, { ReactNode, ComponentProps } from 'react';
import SourceHandle, { HandleProps } from './components/CustomNode/sourceHandle';
type SourceHandleType = typeof SourceHandle;
type ReactFlowProps = ComponentProps<typeof ReactFlow>;
export interface TNodeItem {
title: string;
type: string;
description?: string;
hidden?: boolean;
iconSvg?: string;
icon: {
type: string;
bgColor: string;
};
settingSchema?: Schema;
settingWidget?: string;
settingWidgetProps?: object;
hideDesc?: boolean;
nodePanel?: {
width?: string | number;
hideDesc?: boolean;
};
nodeWidget?: string;
renderHandle?: (sourceHandle: SourceHandleType, sourceHandleProps: ComponentProps<SourceHandleType>, nodeProps: {
id: string;
type: string;
data: any;
layout: 'LR' | 'TB';
isConnectable: boolean;
readOnly: boolean;
}) => React.JSX.Element;
getSettingSchema?: (nodeId: string, nodeType: string, nodeItem: TNodeItem, nodeData: any, form: ReturnType<typeof useForm>) => Promise<Schema>;
switchExtra: {
hideElse: boolean;
valueKey: string;
titleKey: string;
};
parallelExtra: {
valueKey: string;
titleKey: string;
};
disabledCopy?: boolean;
disabledDelete?: boolean;
onTesting: (node: any, nodes: any) => void;
showTestingBtn?: boolean;
className?: string;
disabledShortcutDelete?: boolean;
}
export interface TNodeGroup {
title: string;
type: '_group';
items: TNodeItem[];
}
export interface TNodeMenu {
ref: React.RefObject<any>;
showSearch: boolean;
items: (TNodeGroup | TNodeItem)[];
onClick: ({}: {
type: string;
}) => void;
}
export interface TNodePanel {
width?: string | number;
hideDesc?: boolean;
onClose?: (activeNodeId: string) => void;
showPanel?: boolean;
}
export interface TNodeSelector {
showSearch: boolean;
items?: (TNodeGroup | TNodeItem)[];
}
export interface TLogListItem {
statusPanel?: {
status?: Array<{
label: string;
value?: string;
isBadge?: boolean;
}>;
extra?: string | ReactNode;
};
codePanel?: Array<{
title: string;
code: string;
}>;
nodeId: string;
groupTitle?: string;
showDetailLogWidget?: boolean;
_status?: string | number;
}
export interface TLogPanel {
logList: Array<TLogListItem>;
loading?: boolean;
logWidget?: string;
width?: number;
tabsProps?: TabPaneProps;
detailLogWidget?: string;
}
export interface TNodeView {
hideTitleTips?: boolean;
status?: Array<{
name: string;
color: string;
}>;
}
export interface TEdge {
hideEdgeAddBtn?: boolean;
hideEdgeDelBtn?: boolean;
deletable?: boolean;
}
export interface TControl {
hideAddNode?: boolean;
hideAnnotate?: boolean;
hideUndoRedoBtns?: boolean;
hideZoomInOutBtns?: boolean;
hideControlBtns?: boolean;
hideAutoLayout?: boolean;
hideFullscreen?: boolean;
hideInteractionMode?: boolean;
}
export interface THandle {
isValidConnection?: HandleProps['isValidConnection'];
}
export interface FlowProps {
initialValues?: {
nodes: Array<{
id: string;
type: string;
data: Record<string, any>;
position: {
x: number;
y: number;
};
}>;
edges: Array<{
id: string;
source: string;
target: string;
}>;
};
layout?: 'LR' | 'TB';
/**
* 自定义组件
*/
widgets?: any;
/**
* 节点配置
*/
settings?: (TNodeGroup | TNodeItem)[];
nodeSelector?: TNodeSelector;
iconFontUrl?: string;
globalConfig?: {
nodePanel?: TNodePanel;
nodeView?: TNodeView;
edge?: TEdge;
controls?: TControl;
handle?: THandle;
deleteKeyCode?: string | string[] | null;
};
logPanel?: TLogPanel;
readOnly?: boolean;
onNodeClick?: ReactFlowProps['onNodeClick'];
onEdgeClick?: ReactFlowProps['onEdgeClick'];
onMenuItemClick?: (itemInfo: ItemInfo, defaultAction: () => void) => void;
clickAddNode?: (type: string, nodeItem: TNodeItem, addNode: (initData?: Record<string, any>) => void) => void;
zoomOnScroll?: boolean;
panOnScroll?: boolean;
preventScrolling?: boolean;
openColorfulMode?: boolean;
connectionLineComponent?: ReactFlowProps['connectionLineComponent'];
}
interface ItemInfo {
key: 'copy' | 'paste' | 'delete' | string;
nodeId: string;
sourceHandle?: string;
}
export default FlowProps;