Skip to content
Merged

Dev #59

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import lombok.Getter;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Stream;

Expand All @@ -31,7 +32,7 @@ public FlowNodeState(IFlowNode node) {
this.branchNodeTypes.add(NodeType.PARALLEL_BRANCH.name());
}

public boolean isEndNode(){
public boolean isEndNode() {
return this.node.getType().equals(NodeType.END.name());
}

Expand Down Expand Up @@ -65,8 +66,8 @@ public String getName() {
}

public List<IFlowNode> getFirstBlocks() {
List<IFlowNode> blocks = this.node.blocks();
if (blocks != null && !blocks.isEmpty()) {
List<IFlowNode> blocks = this.node.blocks().stream().sorted(Comparator.comparingInt(IFlowNode::getOrder)).toList();
if (!blocks.isEmpty()) {
return Stream.of(blocks.get(0)).toList();
}
return new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public void addDefaultBranch(int count){
List<IFlowNode> branches = new ArrayList<>();
for (int i=0;i<count;i++){
ConditionBranchNode branchNode = new ConditionBranchNode();
branchNode.setOrder(i+1);
branches.add(branchNode);
}
this.setBlocks(branches);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ public void addDefaultBranch(int count){
List<IFlowNode> branches = new ArrayList<>();
for (int i=0;i<count;i++){
InclusiveBranchNode branchNode = new InclusiveBranchNode();
branchNode.setOrder(i+1);
branches.add(branchNode);
}
this.setBlocks(branches);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ public void addDefaultBranch(int count){
List<IFlowNode> branches = new ArrayList<>();
for (int i=0;i<count;i++){
ParallelBranchNode branchNode = new ParallelBranchNode();
branchNode.setOrder(i+1);
branches.add(branchNode);
}
this.setBlocks(branches);
Expand Down
3 changes: 2 additions & 1 deletion frontend/packages/flow-core/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,8 @@
],
"scripts": {
"build": "rslib build",
"dev": "rslib build --watch"
"dev": "rslib build --watch",
"test": "rstest"
},
"peerDependencies": {
"react": ">=18",
Expand Down
15 changes: 15 additions & 0 deletions frontend/packages/flow-core/rstest.config.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
import {pluginReact} from '@rsbuild/plugin-react';
import {defineConfig} from '@rstest/core';
import {pluginSass} from "@rsbuild/plugin-sass";
import * as path from "path";

export default defineConfig({
testEnvironment: 'jsdom',
setupFiles: ['./rstest.setup.ts'],
plugins: [pluginReact(), pluginSass()],
resolve: {
alias: {
"@/": path.resolve(__dirname, "src"),
}
}
});
4 changes: 4 additions & 0 deletions frontend/packages/flow-core/rstest.setup.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
import { expect } from '@rstest/core';
import * as jestDomMatchers from '@testing-library/jest-dom/matchers';

expect.extend(jestDomMatchers);
2 changes: 1 addition & 1 deletion frontend/packages/flow-core/src/groovy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -415,7 +415,7 @@ export class GroovyScriptConvertorUtil {
*/
public static updateScriptMeta(script: string, meta: string): string {
const metaComment = `// ${SCRIPT_META} ${meta}`;
if (GroovyScriptConvertorUtil.getScriptTitle(script)) {
if (GroovyScriptConvertorUtil.getScriptMeta(script)) {
return script.replace(new RegExp(`//\\s*${SCRIPT_META}\\s*.+`), metaComment);
} else {
return `${metaComment}\n${script}`;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import {describe, expect, it} from '@rstest/core';
import {GroovyScriptConvertorUtil} from "@/components/script/utils/convertor";
import {GroovyScriptConvertorUtil} from "@/groovy";

describe('GroovyScriptUtil', () => {

Expand Down Expand Up @@ -54,7 +54,7 @@ def run(request){
});


describe('getScriptMeta', () => {
describe('getScriptMeta1', () => {
it('get groovy script meta', () => {
const script = `
// @SCRIPT_TITLE 这是一个实例的标题
Expand All @@ -67,8 +67,21 @@ def run(request){
});
});

describe('getScriptMeta2', () => {
it('get groovy script meta', () => {
const script = `
// @CUSTOM_SCRIPT 自定义脚本,返回的数据为动作类型
// @SCRIPT_META {"trigger":"PASS"}
def run(request){
return 'SAVE';
}`
const result = GroovyScriptConvertorUtil.getScriptMeta(script)
expect(result).toEqual(`{"trigger":"PASS"}`);
});
});

describe('updateScriptMeta', () => {

describe('updateScriptMeta1', () => {
it('update groovy script meta', () => {
const script = `
// @SCRIPT_TITLE 这是一个实例的标题
Expand All @@ -82,4 +95,19 @@ def run(request){
expect(title).toEqual(`{name:"test"}`);
});
});

describe('updateScriptMeta2', () => {
it('update groovy script meta', () => {
const script = `
// @CUSTOM_SCRIPT 自定义脚本,返回的数据为动作类型
// @SCRIPT_META {"trigger":"PASS"}
def run(request){
return 'SAVE';
}`
const result = GroovyScriptConvertorUtil.updateScriptMeta(script,'{trigger:"SAVE"}');
console.log(result);
const title = GroovyScriptConvertorUtil.getScriptMeta(result)
expect(title).toEqual(`{trigger:"SAVE"}`);
});
});
});
1 change: 1 addition & 0 deletions frontend/packages/flow-core/tests/test.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/// <reference types="@testing-library/jest-dom" />
10 changes: 10 additions & 0 deletions frontend/packages/flow-core/tests/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
{
"extends": "../tsconfig.json",
"include": [".", "../rstest.setup.ts"],
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["../src/*"]
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,6 @@ export const BranchAdderRender: React.FC<BranchAdderProps> = (props) => {
operation.addBlock(
node,
block,
{
index: 0,
}
);
setTimeout(() => {
handleClose();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,16 @@ import {FlowDocumentJSON, FlowNodeRegistry} from "@/components/design-editor/typ
import {Adder} from "@/components/design-editor/components/node-adder";
import {BranchAdder} from "@/components/design-editor/components/branch-adder";
import {Collapse} from "../components/collapse";
import {useDesignContext} from "@/components/design-panel/hooks/use-design-context";

export function useEditorProps(initialData: FlowDocumentJSON, nodeRegistries: FlowNodeRegistry[]): FixedLayoutProps {

const {token} = theme.useToken();

const {context} = useDesignContext();

const presenter = context.getPresenter();

return useMemo<FixedLayoutProps>(
() => ({
/**
Expand Down Expand Up @@ -150,6 +155,8 @@ export function useEditorProps(initialData: FlowDocumentJSON, nodeRegistries: Fl
// Listen change to trigger auto save
const data = ctx.document.toJSON();
console.log('flow-engine auto save: ', data);
presenter.syncNodes(data.nodes);

}, 100),
},
/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,85 @@ interface ActionModalProps {
options: any[];
}

export const ActionModal: React.FC<ActionModalProps> = (props) => {
const custom = props.custom;

interface CustomScriptViewProps{
options: any[];
form: FormInstance<any>;
}

const CustomScriptView:React.FC<CustomScriptViewProps> = (props)=>{

const trigger = props.form.getFieldValue("trigger") as string;

const [currentTrigger,setCurrentTrigger] = React.useState(trigger);

const handleChangeNodeType = (value: string) => {
const script = props.form.getFieldValue('script') as string;
const returnData = GroovyScriptConvertorUtil.getReturnScript(script).trim();
let groovy;
if (returnData) {
if (script) {
const returnData = GroovyScriptConvertorUtil.getReturnScript(script).trim();
groovy = script.replace(returnData, `'${value}'`);
groovy = GroovyScriptConvertorUtil.updateScriptMeta(groovy,`{"trigger":"${value}"}`);
} else {
groovy = `// 自定义脚本,返回的数据为动作类型
groovy = `// @CUSTOM_SCRIPT 自定义脚本,返回的数据为动作类型
// @SCRIPT_META {"trigger":"${value}"}
def run(request){
return '${value}';
}
`
}
props.form.setFieldValue("script", GroovyScriptConvertorUtil.formatScript(groovy));
setCurrentTrigger(value);
}

return (
<Col span={24}>
<Form.Item
name={"script"}
label={(
<Space>
自定义脚本
<Space.Compact size={"small"}>
<Space.Addon>触发动作:</Space.Addon>
<Select
style={{
width: '100px'
}}
value={currentTrigger}
placeholder={"请选择触发动作类型"}
options={props.options}
onChange={handleChangeNodeType}
/>
</Space.Compact>


</Space>
)}
required={true}
help={"请先设置触发动作类型"}

rules={[
{
required: true,
message: '自定义脚本不能为空'
}
]}
>
<GroovyCodeEditor
placeholder={"请输入自定义脚本"}
options={{
minHeight: 200
}}
/>
</Form.Item>
</Col>
)
}

export const ActionModal: React.FC<ActionModalProps> = (props) => {
const custom = props.custom;


return (
<Modal
width={"60%"}
Expand Down Expand Up @@ -91,51 +149,9 @@ export const ActionModal: React.FC<ActionModalProps> = (props) => {
</Form.Item>
</Col>


{custom && (
<>
<Col span={24}>
<Form.Item
name={"script"}
label={(
<Space>
自定义脚本
<Space.Compact size={"small"}>
<Space.Addon>触发动作:</Space.Addon>
<Select
style={{
width: '100px'
}}
placeholder={"请选择触发动作类型"}
options={props.options}
onChange={handleChangeNodeType}
/>
</Space.Compact>


</Space>
)}
required={true}
help={"请先设置触发动作类型"}

rules={[
{
required: true,
message: '自定义脚本不能为空'
}
]}
>
<GroovyCodeEditor
placeholder={"请输入自定义脚本"}
options={{
minHeight: 200
}}
/>
</Form.Item>
</Col>
</>
<CustomScriptView options={props.options} form={props.form} />
)}

</Row>

</Form>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import React from "react";
import {GroovyScriptPreview} from "@/components/script/components/groovy-script-preview";
import {EditOutlined} from "@ant-design/icons";
import {ConditionConfigModal} from "@/components/script/modal/condition-config-modal";
import {useScriptVariables} from "@/components/design-editor/hooks/use-script-variables";

/**
* 条件配置
Expand All @@ -13,6 +14,7 @@ export const ConditionScript = ()=>{

const [form] = Form.useForm();
const [visible,setVisible] = React.useState(false);
const scriptVariables = useScriptVariables();

return (
<Form
Expand Down Expand Up @@ -49,6 +51,7 @@ export const ConditionScript = ()=>{
onCancel={()=>{setVisible(false);}}
onConfirm={(value)=>{onChange(value)}}
script={value}
variables={scriptVariables}
/>
</Space.Compact>
)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,20 @@ export const NodeHeader: React.FC<NodeHeaderProps> = (props) => {
/>
)}
</Field>
{!isSidebar && (
<Field name="order">
{({field: {value, onChange}}: FieldRenderProps<string>) => {
if (nodeType === 'INCLUSIVE_BRANCH' || nodeType === 'CONDITION_BRANCH' || nodeType === 'PARALLEL_BRANCH') {
return (
<>优先级:{value}</>
)
}
return (
<></>
);
}}
</Field>
)}
</Space>

{isSidebar && (
Expand Down
Loading