!128 enhancement #I5Y92X 支持选择组件跳转同时指定组件名和标签
Merge pull request !128 from 码农小易/dev
This commit is contained in:
commit
9f904eae00
|
@ -29,7 +29,9 @@ public class SwitchCondition extends Condition{
|
||||||
|
|
||||||
private final Map<String, Executable> targetMap = new HashMap<>();
|
private final Map<String, Executable> targetMap = new HashMap<>();
|
||||||
|
|
||||||
private final String TAG_PREFIX = "tag:";
|
private final String TAG_PREFIX = "tag";
|
||||||
|
private final String TAG_FLAG = ":";
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void execute(Integer slotIndex) throws Exception {
|
public void execute(Integer slotIndex) throws Exception {
|
||||||
|
@ -46,13 +48,15 @@ public class SwitchCondition extends Condition{
|
||||||
if (StrUtil.isNotBlank(targetId)) {
|
if (StrUtil.isNotBlank(targetId)) {
|
||||||
Executable targetExecutor;
|
Executable targetExecutor;
|
||||||
|
|
||||||
//这里要判断是否跳转到tag
|
//这里要判断是否使用tag模式跳转
|
||||||
if (targetId.startsWith(TAG_PREFIX)){
|
if (targetId.contains(TAG_FLAG)){
|
||||||
String targetTag = targetId.replaceAll(TAG_PREFIX, "");
|
String[] target = targetId.split(TAG_FLAG, 2);
|
||||||
|
String _targetId = target[0];
|
||||||
|
String _targetTag = target[1];
|
||||||
targetExecutor = targetMap.values().stream().filter(executable -> {
|
targetExecutor = targetMap.values().stream().filter(executable -> {
|
||||||
if (executable instanceof Node){
|
if (executable instanceof Node){
|
||||||
Node node = (Node) executable;
|
Node node = (Node) executable;
|
||||||
return targetTag.equals(node.getTag());
|
return (StrUtil.startWith(_targetId, TAG_PREFIX) && _targetTag.equals(node.getTag())) || ((StrUtil.isEmpty(_targetId) || _targetId.equals(node.getId())) && (StrUtil.isEmpty(_targetTag) || _targetTag.equals(node.getTag())));
|
||||||
}else{
|
}else{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,4 +50,18 @@ public class SwitchELDeclMultiSpringbootTest extends BaseTest {
|
||||||
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch4() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>g==>d",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch5() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>h==>b",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,10 +37,18 @@ public class CmpConfig {
|
||||||
|
|
||||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH,nodeId = "f",nodeType = NodeTypeEnum.SWITCH)
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH,nodeId = "f",nodeType = NodeTypeEnum.SWITCH)
|
||||||
public String processF(NodeComponent bindCmp) {
|
public String processF(NodeComponent bindCmp) {
|
||||||
return "tag:td";
|
return ":td";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH,nodeId = "g",nodeType = NodeTypeEnum.SWITCH)
|
||||||
|
public String processG(NodeComponent bindCmp) {
|
||||||
|
return "d:td";
|
||||||
|
}
|
||||||
|
|
||||||
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH,nodeId = "h",nodeType = NodeTypeEnum.SWITCH)
|
||||||
|
public String processH(NodeComponent bindCmp) {
|
||||||
|
return "tag:td";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,4 +21,18 @@
|
||||||
SWITCH(f).to(b.tag("td"), d)
|
SWITCH(f).to(b.tag("td"), d)
|
||||||
);
|
);
|
||||||
</chain>
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain4">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(g).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain5">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(h).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
</flow>
|
</flow>
|
|
@ -49,4 +49,18 @@ public class SwitchELDeclSpringbootTest extends BaseTest {
|
||||||
Assert.assertTrue(response.isSuccess());
|
Assert.assertTrue(response.isSuccess());
|
||||||
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch4() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>g==>d",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch5() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>h==>b",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,6 @@ public class FSwitchCmp{
|
||||||
|
|
||||||
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
|
||||||
public String processSwitch(NodeComponent bindCmp) throws Exception {
|
public String processSwitch(NodeComponent bindCmp) throws Exception {
|
||||||
return "tag:td";
|
return ":td";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||||
|
import com.yomahub.liteflow.core.NodeComponent;
|
||||||
|
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||||
|
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("g")
|
||||||
|
public class GSwitchCmp {
|
||||||
|
|
||||||
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
|
||||||
|
public String processSwitch(NodeComponent bindCmp) throws Exception {
|
||||||
|
return "d:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.annotation.LiteflowMethod;
|
||||||
|
import com.yomahub.liteflow.core.NodeComponent;
|
||||||
|
import com.yomahub.liteflow.enums.LiteFlowMethodEnum;
|
||||||
|
import com.yomahub.liteflow.enums.NodeTypeEnum;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("h")
|
||||||
|
public class HSwitchCmp {
|
||||||
|
|
||||||
|
@LiteflowMethod(value = LiteFlowMethodEnum.PROCESS_SWITCH, nodeType = NodeTypeEnum.SWITCH)
|
||||||
|
public String processSwitch(NodeComponent bindCmp) throws Exception {
|
||||||
|
return "tag:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,4 +21,18 @@
|
||||||
SWITCH(f).to(b.tag("td"), d)
|
SWITCH(f).to(b.tag("td"), d)
|
||||||
);
|
);
|
||||||
</chain>
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain4">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(g).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain5">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(h).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
</flow>
|
</flow>
|
|
@ -40,4 +40,18 @@ public class SwitchTest extends BaseTest{
|
||||||
Assert.assertTrue(response.isSuccess());
|
Assert.assertTrue(response.isSuccess());
|
||||||
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch4() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>g==>d",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch5() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>h==>b",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,6 @@ public class FSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String processSwitch() throws Exception {
|
public String processSwitch() throws Exception {
|
||||||
return "tag:td";
|
return ":td";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
|
||||||
|
public class GSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "d:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
|
||||||
|
public class HSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "tag:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -7,6 +7,8 @@
|
||||||
<node id="d" class="com.yomahub.liteflow.test.switchcase.cmp.DCmp"/>
|
<node id="d" class="com.yomahub.liteflow.test.switchcase.cmp.DCmp"/>
|
||||||
<node id="e" class="com.yomahub.liteflow.test.switchcase.cmp.ESwitchCmp"/>
|
<node id="e" class="com.yomahub.liteflow.test.switchcase.cmp.ESwitchCmp"/>
|
||||||
<node id="f" class="com.yomahub.liteflow.test.switchcase.cmp.FSwitchCmp"/>
|
<node id="f" class="com.yomahub.liteflow.test.switchcase.cmp.FSwitchCmp"/>
|
||||||
|
<node id="g" class="com.yomahub.liteflow.test.switchcase.cmp.GSwitchCmp"/>
|
||||||
|
<node id="h" class="com.yomahub.liteflow.test.switchcase.cmp.HSwitchCmp"/>
|
||||||
</nodes>
|
</nodes>
|
||||||
|
|
||||||
<chain name="chain1">
|
<chain name="chain1">
|
||||||
|
@ -30,4 +32,18 @@
|
||||||
SWITCH(f).to(b.tag("td"), d)
|
SWITCH(f).to(b.tag("td"), d)
|
||||||
);
|
);
|
||||||
</chain>
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain4">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(g).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain5">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(h).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
</flow>
|
</flow>
|
|
@ -51,4 +51,18 @@ public class SwitchELSpringbootTest extends BaseTest {
|
||||||
Assert.assertTrue(response.isSuccess());
|
Assert.assertTrue(response.isSuccess());
|
||||||
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch4() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>g==>d",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch5() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>h==>b",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,6 @@ public class FSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String processSwitch() throws Exception {
|
public String processSwitch() throws Exception {
|
||||||
return "tag:td";
|
return ":td";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("g")
|
||||||
|
public class GSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "d:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("h")
|
||||||
|
public class HSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "tag:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,4 +21,18 @@
|
||||||
SWITCH(f).to(b.tag("td"), d)
|
SWITCH(f).to(b.tag("td"), d)
|
||||||
);
|
);
|
||||||
</chain>
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain4">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(g).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain5">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(h).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
</flow>
|
</flow>
|
|
@ -38,4 +38,17 @@ public class SwitchELSpringTest extends BaseTest {
|
||||||
Assert.assertTrue(response.isSuccess());
|
Assert.assertTrue(response.isSuccess());
|
||||||
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
Assert.assertEquals("a==>f==>b",response.getExecuteStepStr());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSwitch4() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain4", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>g==>d",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
|
@Test
|
||||||
|
public void testSwitch5() throws Exception{
|
||||||
|
LiteflowResponse response = flowExecutor.execute2Resp("chain5", "arg");
|
||||||
|
Assert.assertTrue(response.isSuccess());
|
||||||
|
Assert.assertEquals("a==>h==>b",response.getExecuteStepStr());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,6 @@ public class FSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String processSwitch() throws Exception {
|
public String processSwitch() throws Exception {
|
||||||
return "tag:td";
|
return ":td";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("g")
|
||||||
|
public class GSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "d:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
/**
|
||||||
|
* <p>Title: liteflow</p>
|
||||||
|
* <p>Description: 轻量级的组件式流程框架</p>
|
||||||
|
* @author Bryan.Zhang
|
||||||
|
* @email weenyc31@163.com
|
||||||
|
* @Date 2020/4/1
|
||||||
|
*/
|
||||||
|
package com.yomahub.liteflow.test.switchcase.cmp;
|
||||||
|
|
||||||
|
import com.yomahub.liteflow.core.NodeSwitchComponent;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
@Component("h")
|
||||||
|
public class HSwitchCmp extends NodeSwitchComponent {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String processSwitch() throws Exception {
|
||||||
|
return "tag:td";
|
||||||
|
}
|
||||||
|
}
|
|
@ -21,4 +21,18 @@
|
||||||
SWITCH(f).to(b.tag("td"), d)
|
SWITCH(f).to(b.tag("td"), d)
|
||||||
);
|
);
|
||||||
</chain>
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain4">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(g).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
|
|
||||||
|
<chain name="chain5">
|
||||||
|
THEN(
|
||||||
|
a,
|
||||||
|
SWITCH(h).to(b.tag("td"), d.tag("td"))
|
||||||
|
);
|
||||||
|
</chain>
|
||||||
</flow>
|
</flow>
|
Loading…
Reference in New Issue