Skip to content

Commit da16e0d

Browse files
committed
condition
1 parent a38ac28 commit da16e0d

16 files changed

Lines changed: 438 additions & 67 deletions

File tree

frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-panel.tsx

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,24 @@
11
import React from "react";
2-
import {GroovyScriptPreview} from "@/components/script/components/groovy-script-preview";
32
import {RelationPanel} from "@/components/script/components/condition/components/condition-relation";
43
import {Group} from "@/components/script/components/condition/components/condition-group";
54
import {GroovyScriptConvertorUtil} from "@flow-engine/flow-core";
65
import {SCRIPT_DEFAULT_CONDITION} from "@/components/script/default-script";
76
import {Button, Space} from "antd";
87
import {CodeOutlined, ReloadOutlined} from "@ant-design/icons";
98
import {useConditionContext} from "@/components/script/components/condition/hooks/use-condition-context";
9+
import {ConditionPanelProps} from "@/components/script/components/condition/typings";
10+
import {
11+
useConditionScriptConvertor
12+
} from "@/components/script/components/condition/hooks/use-condition-script-convertor";
1013

11-
interface ConditionPanelProps {
12-
script:string;
13-
onChange:(value:string)=>void;
14-
}
15-
16-
export const ConditionPanel:React.FC<ConditionPanelProps> = (props)=>{
1714

15+
export const ConditionPanel: React.FC<ConditionPanelProps> = (props) => {
1816
const {context} = useConditionContext();
19-
2017
const presenter = context.getPresenter();
18+
useConditionScriptConvertor(props);
2119

2220
return (
2321
<div>
24-
<div>
25-
预览
26-
<GroovyScriptPreview
27-
script={props.script}
28-
multiline={true}
29-
/>
30-
</div>
3122
<div>
3223
关系
3324
<RelationPanel/>
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,30 @@
11
import {PlusCircleOutlined} from "@ant-design/icons";
22
import React from "react";
33
import {ConditionRelationProps} from "@/components/script/components/condition/typings";
4-
import { Dropdown } from "antd";
4+
import {Badge, Dropdown} from "antd";
55
import {
66
useDropdownMenus
77
} from "@/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus";
8+
import {
9+
RelationValidate
10+
} from "@/components/script/components/condition/components/condition-relation/domain/relation-validate";
811

912
export const RelationAction: React.FC<ConditionRelationProps> = (props) => {
1013
const items = useDropdownMenus(props);
14+
const relationValidate = new RelationValidate(props);
1115

1216
return (
1317
<Dropdown
1418
menu={{items}}>
15-
<PlusCircleOutlined
16-
style={{
17-
cursor: 'pointer',
18-
}}
19-
/>
19+
<Badge
20+
dot={relationValidate.isError()}
21+
>
22+
<PlusCircleOutlined
23+
style={{
24+
cursor: 'pointer',
25+
}}
26+
/>
27+
</Badge>
2028
</Dropdown>
2129
)
2230
}
Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,31 @@
11
import React from "react";
22
import {ConditionRelationProps} from "@/components/script/components/condition/typings";
3-
import {Dropdown, Tag} from "antd";
3+
import {Badge, Dropdown, Tag} from "antd";
44
import {
55
useDropdownMenus
66
} from "@/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus";
7+
import {
8+
RelationValidate
9+
} from "@/components/script/components/condition/components/condition-relation/domain/relation-validate";
710

811
export const RelationAnd: React.FC<ConditionRelationProps> = (props) => {
912
const items = useDropdownMenus(props);
13+
const relationValidate = new RelationValidate(props);
14+
1015
return (
1116
<Dropdown
1217
menu={{items}}>
13-
<Tag style={{
14-
cursor: "pointer",
15-
}}>
16-
{props.current.label}
17-
</Tag>
18+
<Badge
19+
dot={relationValidate.isError()}
20+
>
21+
<Tag
22+
style={{
23+
cursor: "pointer",
24+
}}
25+
>
26+
{props.current.label}
27+
</Tag>
28+
</Badge>
1829
</Dropdown>
1930
)
2031
}

frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-relation/condition.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,27 @@ import {ConditionRelationProps} from "@/components/script/components/condition/t
33
import {
44
useDropdownMenus
55
} from "@/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus";
6-
import {Dropdown, Tag} from "antd";
6+
import {Badge, Dropdown, Tag} from "antd";
7+
import {
8+
RelationValidate
9+
} from "@/components/script/components/condition/components/condition-relation/domain/relation-validate";
710

811
export const RelationCondition: React.FC<ConditionRelationProps> = (props) => {
912
const items = useDropdownMenus(props);
13+
const relationValidate = new RelationValidate(props);
14+
1015
return (
1116
<Dropdown
1217
menu={{items}}>
13-
<Tag style={{
14-
cursor: "pointer",
15-
}}>
16-
{props.current.label}
17-
</Tag>
18+
<Badge
19+
dot={relationValidate.isError()}
20+
>
21+
<Tag style={{
22+
cursor: "pointer",
23+
}}>
24+
{props.current.label}
25+
</Tag>
26+
</Badge>
1827
</Dropdown>
1928
)
2029
}

frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-relation/hooks/menu-relation.tsx renamed to frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-relation/domain/menu-relation.tsx

File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
import {ConditionRelationProps, LogicalRelation} from "@/components/script/components/condition/typings";
2+
3+
export class RelationValidate {
4+
5+
private readonly leftRelation?: LogicalRelation;
6+
private readonly current: LogicalRelation;
7+
private readonly rightRelation?: LogicalRelation;
8+
9+
10+
constructor(props: ConditionRelationProps) {
11+
this.leftRelation = props.leftRelation;
12+
this.current = props.current;
13+
this.rightRelation = props.rightRelation;
14+
}
15+
16+
public isError() {
17+
const currentType = this.current.type;
18+
const currentId = this.current.id;
19+
20+
if (this.leftRelation) {
21+
const leftType = this.leftRelation.type;
22+
23+
if (leftType === 'and' || leftType === 'or') {
24+
if (currentType === 'and' || currentType === 'or') {
25+
return true;
26+
}
27+
}
28+
29+
if (leftType === 'group' || leftType === 'condition') {
30+
if (currentType === 'group' || currentType === 'condition') {
31+
return true;
32+
}
33+
}
34+
35+
}
36+
if (this.rightRelation) {
37+
const rightType = this.rightRelation.type;
38+
if (rightType === 'action') {
39+
if (currentType === 'and' || currentType === 'or') {
40+
return true;
41+
}
42+
}
43+
return false;
44+
} else {
45+
if (currentType === 'and' || currentType === 'or') {
46+
return true;
47+
}
48+
}
49+
if (currentType === 'action' && currentId) {
50+
return true;
51+
}
52+
return false;
53+
}
54+
}
55+
56+
57+
export class RelationListValidate {
58+
59+
private readonly relations: LogicalRelation[];
60+
61+
private error: boolean = false;
62+
63+
constructor(relations: LogicalRelation[]) {
64+
this.relations = relations;
65+
}
66+
67+
public isError() {
68+
this.fetchRelations(this.relations);
69+
return this.error;
70+
}
71+
72+
private fetchRelations(relations: LogicalRelation[]) {
73+
const length = relations.length;
74+
for (let i = 0; i < length; i++) {
75+
const left = i - 1 < 0 ? undefined : relations[i - 1];
76+
const right = i + 1 > length ? undefined : relations[i + 1];
77+
const current = relations[i];
78+
79+
const validate = new RelationValidate({
80+
leftRelation: left,
81+
current,
82+
rightRelation: right,
83+
});
84+
85+
if (validate.isError()) {
86+
this.error = true;
87+
}
88+
if (current.children) {
89+
this.fetchRelations(current.children);
90+
}
91+
}
92+
93+
}
94+
95+
96+
}
Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,45 @@
1-
import {Dropdown, Tag} from "antd";
1+
import {Badge, Dropdown, Tag} from "antd";
22
import React from "react";
33
import {ConditionRelationProps} from "@/components/script/components/condition/typings";
44
import {
55
useDropdownMenus
66
} from "@/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus";
77
import {RelationRender} from "@/components/script/components/condition/components/condition-relation/render";
8+
import {
9+
RelationValidate
10+
} from "@/components/script/components/condition/components/condition-relation/domain/relation-validate";
811

912
export const RelationGroup: React.FC<ConditionRelationProps> = (props) => {
1013
const items = useDropdownMenus(props);
14+
const relationValidate = new RelationValidate(props);
1115

1216
return (
1317
<>
14-
<Dropdown
15-
menu={{items}}>
16-
<Tag
17-
style={{
18-
cursor: "pointer",
19-
}}
20-
></Tag>
21-
</Dropdown>
18+
<Badge
19+
dot={relationValidate.isError()}
20+
>
21+
<Dropdown
22+
menu={{items}}>
23+
<Tag
24+
style={{
25+
cursor: "pointer",
26+
}}
27+
></Tag>
28+
</Dropdown>
29+
</Badge>
2230
{RelationRender.getInstance().renderList(props.current.children || [])}
23-
<Dropdown
24-
menu={{items}}>
25-
<Tag
26-
style={{
27-
cursor: "pointer",
28-
}}
29-
></Tag>
30-
</Dropdown>
31+
<Badge
32+
dot={relationValidate.isError()}
33+
>
34+
<Dropdown
35+
menu={{items}}>
36+
<Tag
37+
style={{
38+
cursor: "pointer",
39+
}}
40+
></Tag>
41+
</Dropdown>
42+
</Badge>
3143
</>
3244
)
3345
}

frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import React from "react";
22
import {useConditionContext} from "@/components/script/components/condition/hooks/use-condition-context";
33
import {ConditionRelationProps} from "@/components/script/components/condition/typings";
4-
import {MenuRelation} from "@/components/script/components/condition/components/condition-relation/hooks/menu-relation";
4+
import {MenuRelation} from "@/components/script/components/condition/components/condition-relation/domain/menu-relation";
55

66

77
export const useDropdownMenus = (props: ConditionRelationProps) => {

frontend/packages/flow-pc/flow-pc-design/src/components/script/components/condition/components/condition-relation/index.tsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@ export const RelationPanel = () => {
1414
return list;
1515
}, [state.relations]);
1616

17-
1817
return (
1918
<div style={{
2019
padding: '4px 11px',
Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,29 @@
11
import React from "react";
22
import {ConditionRelationProps} from "@/components/script/components/condition/typings";
3-
import {Dropdown, Tag } from "antd";
3+
import {Badge, Dropdown, Tag} from "antd";
44
import {
55
useDropdownMenus
66
} from "@/components/script/components/condition/components/condition-relation/hooks/use-dropdown-menus";
7+
import {
8+
RelationValidate
9+
} from "@/components/script/components/condition/components/condition-relation/domain/relation-validate";
710

811
export const RelationOr: React.FC<ConditionRelationProps> = (props) => {
912
const items = useDropdownMenus(props);
13+
const relationValidate = new RelationValidate(props);
14+
1015
return (
1116
<Dropdown
1217
menu={{items}}>
13-
<Tag style={{
14-
cursor: "pointer",
15-
}}>
16-
{props.current.label}
17-
</Tag>
18+
<Badge
19+
dot={relationValidate.isError()}
20+
>
21+
<Tag style={{
22+
cursor: "pointer",
23+
}}>
24+
{props.current.label}
25+
</Tag>
26+
</Badge>
1827
</Dropdown>
1928
)
2029
}

0 commit comments

Comments
 (0)