UI事件
用于在新建/编辑页,当发生变更时进行数据更新/校验并反填回界面
配置方式:在对象管理的布局中,右侧全局设置中找到UI事件
注:1、从对象不支持触发UI事件
2、 UI事件的执行结果只作用在新建/编辑页,实际生效以是否保存为准
3、自定义对象全部支持UI事件,预置对象部分支持(销售线索、客户、订单/订单产品、商机2.0/商机2.0明细)
4、只有旗舰版和集团版支持该能力
数据更新事件
1、在新建/编辑页,当某一字段修改(值改变且失焦)时,触发自定义函数来更新主对象或从对象的数据
实际场景:新建订单,当选择客户后,能够直接将客户的地址同步到到订单的送货地址字段上
配置方式:UI事件 — 添加数据更新事件 — 分类选择字段事件
函数编写模板:
Groovy:
//新建UIEvent事件
UIEvent event = UIEvent.build(context) {
//把字段设置为只读、隐藏
editMasterFields "field_I18ri__c" readOnly(true) hidden(true)
//设置提醒消息
remind Remind.Text("弹窗提醒")
//主对象修改数据
editMaster("a": 1, "b": 2)
//添加一条从对象,添加从对象,必须指定业务类型,而且是当前布局展示的业务类型
//如果业务类型不匹配.从对象无法添加
addDetail "detailApiName" set("a": 1, "b": 2)
//根据条件删除 从对象, 删除为where中返回为true的从对象
removeDetail "detailApiName" where { x -> (x["a"] as Integer) > 0 }
//根据条件编辑从对象 和上同理只会处理where 中返回为true的从对象数据
editDetail "detailApiName" set("a": 1, "b": 2) where { x -> (x["a"] as Integer) > 0 }
//removeDetail和editDetail 都可以不添加where这样会直接作用于所有数据
//set的内容和editMaster的内容要保证是map也就是key:valued的形式
removeDetail "detailApiName"
editDetail "detailApiName" set("a": 1, "b": 2)
// 将apiName为object_0uyAd__c的从对象隐藏(注:从对象隐藏后,保存数据时会将隐藏的从对象数据清空,切记谨慎使用!!)
editObject 'object_0uyAd__c' hidden(true)
// 从对象隐藏业务类型
editDetailRecordType "object_qep6N__c" recordType("defaultA__c") hidden(true)
// 选项值隐藏
editOption "object_qep6N__c" fieldApiName("field_y210t__c") option("wwxJqgnO4") hidden(true)
// 隐藏批量编辑按钮field_y1XV1__c
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.BATCH_UPDATE, true)
// 隐藏批量删除按钮
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.BATCH_DELETE, true)
// 隐藏批量复制按钮
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.BATCH_CLONE, true)
// 隐藏通用添加一行按钮
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.SINGLE_ADD_ONE, true)
// 隐藏通用按钮--从对象查找关联
editDetailButton "object_qep6N__c" recordType("defaultA__c") lookupFieldApiName("field_y1XV1__c") hiddenButton(ButtonAction.BATCH_LOOKUP_CREATE, true)
// 隐藏单条删除操作
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.SINGLE_DELETE, true) where { x -> (x["a"] as Integer) > 0 }
// 隐藏单条复制操作
editDetailButton "object_qep6N__c" recordType("defaultA__c") hiddenButton(ButtonAction.SINGLE_CLONE, true) where { x -> (x["a"] as Integer) > 0 }
// 从对象字段只读隐藏
editDetailFields "object_qep6N__c" fieldApiName("field_jt9F4__c") hidden(true) readOnly(true)
editDetailFields "object_qep6N__c" fieldApiName("field_y220t__c") hidden(true) readOnly(true)
//获取被删除的从对象方式一
def deletedDetails = (context.arg as Map)["deletedDetails"] as Map
UIEvent event = UIEvent.build(context){
}
//获取被删除的从对象方式二
Map currentDeletedDetail = event.getCurrentDeletedDetail()
}
return event
Java:
import java.util.List;
import java.util.Map;
import com.fxiaoke.functions.UIEvent;
public class UIEventCode implements IUIEventAction {
/**
* UI事件函数的运行方法
*/
@Override
public UIEvent execute(FunctionContext context, Map<String, Object> args) {
UIEvent.Builder builder = UIEvent.Builder.create(context);
//把字段设置为只读、隐藏
builder.editMasterFields("field_I18ri__c").readOnly(true).hidden(true);
//设置提醒消息
builder.remind(Remind.Text("弹窗提醒"));
//主对象修改数据
builder.editMaster(Maps.of("a", 1, "b", 2));
//添加一条从对象,添加从对象,必须指定业务类型,而且是当前布局展示的业务类型
//如果业务类型不匹配.从对象无法添加
builder.addDetail("detailApiName").set(Maps.of("a", 1, "b", 2));
//根据条件删除 从对象, 删除为where中返回为true的从对象
builder.removeDetail("detailApiName").where(x -> ((Integer) x.get("a")) > 0);
// 根据条件编辑从对象 和上同理只会处理where 中返回为true的从对象数据,where方法使用lambda表达式
builder.editDetail("detailApiName").set(Maps.of("a", 1, "b", 2)).where(x -> ((Integer) x.get("a")) > 0);
//removeDetail和editDetail 都可以不添加where这样会直接作用于所有数据
//set的内容和editMaster的内容要保证是map也就是key:valued的形式
builder.removeDetail("detailApiName");
builder.editDetail("detailApiName").set(Maps.of("a", 1, "b", 2));
// 将apiName为object_0uyAd__c的从对象隐藏
builder.editObject("object_0uyAd__c").hidden(true);
UIEvent event = builder.getUIEvent();
return event;
}
}
2、在主从同时新建/编辑页,当新建/编辑/删除从对象时,触发自定义函数来更新主对象/从对象的数据(前提是该对象存在从对象,才会有从对象事件入口)
实际场景:每新增一条订单产品明细,根据客户的级别为该产品明细的优惠额度字段赋值
配置方式:UI事件 — 添加数据更新事件 — 分类选择从对象事件,触发条件可选新增明细/编辑明细/删除明细
函数编写模板:
Groovy:
UIEvent event = UIEvent.build(context) {
//主对象、从对象数据修改,详见上
}
//获取当前操作的从对象数据
Map currentData = event.getCurrentDetail()
//修改当前操作的从对象数据(主要用于新建明细和编辑明细的场景下)
currentData.put("从对象字段的ApiName","该字段需要变更的值为")
currentData.put("从对象字段1的ApiName","该字段1需要变更的值为")
//获取当前新增的从对象数据
List currentData = event.getCurrentAddDetail()
return event
Java:
import java.util.List;
import java.util.Map;
import com.fxiaoke.functions.UIEvent;
public class UIEventCode implements IUIEventAction {
/**
* UI事件函数的运行方法
*/
@Override
public UIEvent execute(FunctionContext context, Map<String, Object> args) {
UIEvent.Builder builder = UIEvent.Builder.create(context);
UIEvent event = builder.getUIEvent();
//获取当前操作的从对象数据
Map currentData = event.getCurrentDetail();
//修改当前操作的从对象数据(主要用于新建明细和编辑明细的场景下)
currentData.put("从对象字段的ApiName","该字段需要变更的值为");
currentData.put("从对象字段1的ApiName","该字段1需要变更的值为");
//获取当前新增的从对象数据
List list = event.getCurrentAddDetail();
return event;
}
}
3、返回错误信息到页面示例:
Fx.message.throwErrorMessage("错误信息");
return null;
页面加载事件
在新建/编辑页,当页面加载时,触发自定义函数来更新主对象或从对象的数据
实际场景:创建电子签时,根据电子签关联的业务数据自动创建签署人从数据
配置方式:UI事件 — 添加数据更新事件 — 分类选择页面加载事件
函数编写模板:参考数据更新事件
校验事件:
在新建/编辑页,当某一字段修改(值改变且失焦)时,触发自定义函数验证该字段值是否符合特定条件
实际场景:在填写手机号/邮箱格式错误时,能够立即给到前端提示
配置方式:UI事件 — 添加校验事件
函数编写模板:
Groovy:
//红字提醒
Remind remind = Remind.Text("Text");
//弹窗提醒
Remind remind = Remind.Alert("Text");
//设置提醒消息
remind Remind.builder()
.remindText("name", "主属性名称重复")
.remindText("field_y2k46__c", "字段不能包含test")
.build()
//清除提醒消息
remind Remind.builder()
.remindText("name", "")
.remindText("field_y2k46__c", "")
.build()
return remind;