Skip to content

Commit 903f21e

Browse files
authored
Merge pull request #1620 from alibaba/xflow-validate
Xflow增加控制面板表单校验
2 parents 8767e48 + 6a6b826 commit 903f21e

2 files changed

Lines changed: 48 additions & 6 deletions

File tree

packages/x-flow/src/XFlow.tsx

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ import FlowProps from './types';
3232
import { isTruthy, uuid, uuid4 } from './utils';
3333
import autoLayoutNodes from './utils/autoLayoutNodes';
3434

35+
import { message } from 'antd';
3536
import { shallow } from 'zustand/shallow';
3637
import NodeEditor from './components/NodeEditor';
3738
import NodeLogPanel from './components/NodeLogPanel';
@@ -87,6 +88,7 @@ const XFlow: FC<FlowProps> = memo(props => {
8788
const [openPanel, setOpenPanel] = useState<boolean>(true);
8889
const [openLogPanel, setOpenLogPanel] = useState<boolean>(true);
8990
const { onNodeClick } = props;
91+
const nodeEditorRef = useRef(null);
9092

9193
useEffect(() => {
9294
zoomTo(0.8);
@@ -226,7 +228,14 @@ const XFlow: FC<FlowProps> = memo(props => {
226228
type={_nodeType}
227229
layout={layout}
228230
status={_status}
229-
onClick={e => {
231+
onClick={async e => {
232+
if (nodeEditorRef?.current?.validateForm) {
233+
const result = await nodeEditorRef?.current?.validateForm();
234+
if (!result) {
235+
message.error('请检查必填项!');
236+
return;
237+
}
238+
}
230239
setActiveNode({
231240
id,
232241
_nodeType,
@@ -249,6 +258,7 @@ const XFlow: FC<FlowProps> = memo(props => {
249258
onChange={handleNodeValueChange}
250259
nodeType={activeNode?._nodeType}
251260
id={activeNode?.id}
261+
ref={nodeEditorRef}
252262
/>
253263
);
254264
}, [activeNode?.id]);
@@ -286,7 +296,6 @@ const XFlow: FC<FlowProps> = memo(props => {
286296
});
287297
return result;
288298
};
289-
console.log('121212', nodes, getNodesJ(nodes),edges);
290299

291300
return (
292301
<div id="xflow-container" ref={workflowContainerRef}>
@@ -362,8 +371,14 @@ const XFlow: FC<FlowProps> = memo(props => {
362371
<PanelContainer
363372
id={activeNode?.id}
364373
nodeType={activeNode?._nodeType}
365-
onClose={() => {
374+
onClose={async () => {
375+
// 面板关闭校验表单
376+
const result = await nodeEditorRef?.current?.validateForm();
377+
if (!result) {
378+
return;
379+
}
366380
setOpenPanel(false);
381+
367382
// 如果日志面板关闭
368383
if (!isTruthy(activeNode?._status) || !openLogPanel) {
369384
setActiveNode(null);

packages/x-flow/src/components/NodeEditor/index.tsx

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import FormRender, { Schema, useForm } from 'form-render';
22
import produce from 'immer';
33
import { debounce, isFunction } from 'lodash';
4-
import React, { FC, useContext, useEffect, useState } from 'react';
4+
import React, {
5+
FC,
6+
forwardRef,
7+
useContext,
8+
useEffect,
9+
useImperativeHandle,
10+
useState,
11+
} from 'react';
512
import { shallow } from 'zustand/shallow';
613
import { useStore } from '../../hooks/useStore';
714
import { ConfigContext } from '../../models/context';
@@ -14,7 +21,7 @@ interface INodeEditorProps {
1421
id: string;
1522
}
1623

17-
const NodeEditor: FC<INodeEditorProps> = (props: any) => {
24+
const NodeEditor: FC<INodeEditorProps> = forwardRef((props, ref) => {
1825
const { data, onChange, nodeType, id } = props;
1926
const form = useForm();
2027
// // 1.获取节点配置信息
@@ -26,6 +33,26 @@ const NodeEditor: FC<INodeEditorProps> = (props: any) => {
2633
const getSettingSchema = nodeSetting['getSettingSchema'];
2734
const [asyncSchema, setAsyncSchema] = useState<Schema>({});
2835

36+
useImperativeHandle(ref, () => ({
37+
validateForm: async () => {
38+
let result = true;
39+
if (
40+
nodeSetting?.settingSchema ||
41+
(isFunction(getSettingSchema) && Object.keys(asyncSchema).length > 0)
42+
) {
43+
result = await form
44+
.validateFields()
45+
.then(() => {
46+
return true;
47+
})
48+
.catch(err => {
49+
return false;
50+
});
51+
}
52+
return result;
53+
},
54+
}));
55+
2956
async function getSchema() {
3057
const shema = await getSettingSchema(
3158
id,
@@ -158,6 +185,6 @@ const NodeEditor: FC<INodeEditorProps> = (props: any) => {
158185
} else {
159186
return null;
160187
}
161-
};
188+
});
162189

163190
export default NodeEditor;

0 commit comments

Comments
 (0)