web-vue2
Version:
web ui for vue2
869 lines (863 loc) • 39.9 kB
JavaScript
import CustomToolbar from './CustomToolbar';
import ContainerLayout from '../ContainerLayout';
import common from "./common";
import router from "./router";
import {getToken} from "../../utils/auth";
/**
* 已正式加入框架体系应用
* marked by deleteelf 20210506
*/
export default {
mixins: [router,common],//监听外部框架的大小改变事件
data() {
return {
initialized: false,
fid: null,
linkageTimeoutHandle: {},
selectedItem: null,
pageOptions: null,
view: {//布局控制配置
buttonType: 1, //1 只允许出现在一个地方,2,允许同时出现在工具栏和列表
buttonStyle: 2,//1,表示只显示图标,2表示只显示文字,3表示显示文字和图标,4表示以链接方式显示,默认为2,图标受按钮配置影响
idKey: "id",
parentClass: "app-page",
title: null,
showTitle: false,
showToolbar: true,
noQuery: false,
emptyText: null,
oa: false,//是否激活oa对应的按钮功能
params: {},//用于本页面内置参数干预
query: {},//用于本页面查询参数干预
dialog: {
title: "表单"
}
},
queryParams: {loading: false},
dialog: {},
defaultDialog: {
visible: false,
title: "未设置标题",
width: "700px",
height: "300px",
modalClose: false,
destroyOnClose: true,
component: null
}, defaultRule: {
validate: {
list: {required: false, msg: "请先勾选后再操作!!"},
id: {required: false, msg: "请先选择一条数据!!"}
}
}, defaultTools: {
add: {
name: "[toolbar.add]", type: "form", remark: "[toolbar.add_remark]", style: "icon-add success",
linkageRule: {params: {fid: "{fid}", cid: "{cid}", pTodoId: "{pTodoId}"}}
},
mod: {
name: "[toolbar.mod]", type: "form", remark: "[toolbar.mod_remark]", style: "icon-mod",
linkageRule: {params: {fid: "{fid}", cid: "{cid}", id: "{id}"}, validate: {id: {required: true}}}
},
del: {
name: "[toolbar.del]", type: "jsonupdate", remark: "[toolbar.del_remark]", style: "icon-del danger",
actionUrl: this.$store.state.api.form.delForm + "{fid}",
linkageRule: {
params: {list: "{list}"}, validate: {list: {required: true}},
confirm: {msg: "是否删除选中数据"}
}
},
oa_submit: {
style: "icon-oa-submit success",
type: "form", code: "oa_submit", name: "提交", remark: "提交到代办流程",
linkageRule: {
width: "800px", height: "650px", title: "提交到代办流程",
params: {
proId: "{proid}", cid: "{cid}", infoId: "{id}", pTodoId: "{pTodoId}",
toStepId: "{first_step}", title: "{title}", fid: "submitProcess"
},
validate: {
id: {required: true}, proid: {required: true, msg: "未设置有效的流程编号"},
status: {indexOf: ["未提交", "审批退回"], msg: "只能对未提交或者审批退回的内容执行提交操作!"}
}
}
},
oa_do: {
style: "icon-process-list warning",
type: "form", code: "oa_do", name: "审批", remark: "执行审批操作",
linkageRule: {
width: "800px", height: "700px", title: "流程审批",
component: "StepView", params: {
proId: "{proid}", cid: "{cid}", infoId: "{id}", stepId: "{stepid}",
fid: "{oa_fid}", rid: "{oa_rid}", todoId: "{todoid}"
},
validate: {
id: {required: true}, proid: {required: true, msg: "未设置有效的流程编号"},
status: {indexOf: ["已提交", "审批中"], msg: "只能对已提交或者审批中的内容执行审批操作!"},
stepuser: {required: true, msg: "只有流程步骤审批人才能执行审批操作!"},
stepid: {required: true, msg: "未设置有效的步骤编号"}
}
}
},
oa_detail: {
style: "icon-log",
type: "form", code: "oa_detail", name: "查看详情", remark: "查看审批结果与审批记录",
linkageRule: {
width: "850px", height: "800px", title: "查看代办详情",
component: "ProcessView", params: {proId: "{proid}", cid: "{cid}", id: "{id}", rid: "{oa_rid}"},
validate: {
id: {required: true}, proid: {required: true, msg: "未设置有效的流程编号"},
status: {notEquals: "未提交", msg: "无法对未提交的内容进行查看详细操作!"}
}
}
}
},
hiddens: {}
}
},
created() {
},
components: {
ContainerLayout,
CustomToolbar,
Dialog: (resolve) => require([`../Dialog`], resolve),
ListView: (resolve) => require([`../editors/ListView`], resolve),
FormView: (resolve) => require([`../editors/FormView`], resolve),
TreeView: (resolve) => require([`../editors/TreeView`], resolve),
EChartView: (resolve) => require([`../editors/EChartView`], resolve),
WebView: (resolve) => require([`../WebView`], resolve),
ImageView: (resolve) => require([`../ImageView`], resolve),
TabControl: (resolve) => require([`../tab`], resolve),
SelectTreeView: (resolve) => require([`../editors/SelectTreeView`], resolve),
// ProcessView: (resolve) => require([`../oa/ProcessView`], resolve),//下面按需注册
StepView: (resolve) => require([`../oa/StepView`], resolve),
},
methods: {
$_page_getRouter() {
let params= this.getParams();
this.$_page_updatePageParams(params);
},
/**
* 更新界面参数
* @param pageParams 页面参数
*/
$_page_updatePageParams(pageParams) {
this.$core.debug().log("当前界面收到上级界面或菜单传递的参数",this.$options.name,pageParams);
let keys = Object.getOwnPropertyNames(pageParams);
if (keys.length > 0) {//这边需要处理一下所有非视图控制的逻辑,如 表单加载选项
if(pageParams.fid!= null)
this.fid = pageParams.fid;
if(pageParams.websocket!==undefined)
this.websocket = pageParams.websocket
for (let key in pageParams) {
this.$set(this.queryParams, key, this.$core.adapterData(pageParams[key]));
}
if (pageParams.showPage != null&&this.view.pageControl)
this.view.pageControl.visible= (pageParams.showPage !== false && pageParams.showPage !== "false")
if (pageParams.s &&this.view.pageControl&& this.view.pageControl.pageSizes) {
if (!Number.isNaN(pageParams.s) && this.view.pageControl.pageSizes.indexOf(pageParams.s) < 0) {
for (let i in this.view.pageControl.pageSizes) {
if (pageParams.s < this.view.pageControl.pageSizes[i]) {
this.view.pageControl.pageSizes.splice(i, 0, pageParams.s);
break;
}
}
}
}
this.pageOptions=pageParams;
// 表单加载完后,应该重新执行一次
//处理参数传递可能产生的恶性界面污染问题
// delete this.queryParams.novali;
delete this.queryParams.showPage;
// delete this.queryParams.hide;//jid因为要作为数据应用到下拉,所以不能删除
delete this.queryParams.hideColumn;//防止因开发未正确处理而导致的无限循环现象。
this.updatePageParams(pageParams);
}
}, $_page_toolbar_initComplete(params, view, toolbarItems) {
this.$_page_updateView(view, toolbarItems);//从工具栏的返回参数中获取下个页面的配置,一定要在界面查询完成后进行
this.initialized = true;
if (this.handleParams)
this.handleParams();
this.$core.debug().log("工具栏加载结果",this.$options.name,toolbarItems);
this.$_page_updateQueryParams(params);//从工具栏收集最新的参数给列表
}, $_page_updateQueryParams(params, isOut) { //接收页面级参数 //是否是外部参数
this.updatePageParams(params);//如果涉及主报表和主表单变更,可能需要考虑更复杂的重新加载逻辑,目前,先考虑不会修改
if (isOut) {
if (params.fid != null)
this.$core.debug().warn("收到外部传递参数,目前没有对外部传递的影响工具栏的参数进行处理,主要是fid", params);
for (let key in params) {
let value = this.$core.debug().adapterData(params[key]);
if (value !== this.queryParams[key]) {//数据不一样才进行处理
this.$set(this.queryParams, key, value);//外部传递的参数,可能是不合法的
if (this.$refs.toolbar && this.$refs.toolbar.toolbars && this.$refs.toolbar.toolbars[key] >= 0) {//如果联动了工具栏,则需要触发事件
let toolbarItem = this.$refs.toolbar.items[this.$refs.toolbar.toolbars[key]];
if (toolbarItem && toolbarItem.triggerHandler) {
toolbarItem.triggerHandler(toolbarItem, value);
}
}
}
}
} else {
for (let key in params) {
this.$set(this.queryParams, key, params[key]);
}
}
this.query(params);
}, $_page_keepSelectedCallback(data) {
let item = null;
if (this.selectedItem) {
for (let i in data) {
if (data[i][this.view.idKey] === this.selectedItem[this.view.idKey]) {
item = data[i];
break;
}
}
delete this.selectedItem;
}
return item;
},getPageParams() {
return this.$core.extend({},this.queryParams,this.selectedItem,this.getFormData());
},query(params) {//默认查询支持 //受进入页面不查询的支持
if (this.view.noQuery) {
this.view.emptyText = "页面启动了加载不查询功能,请点击查询获取数据!"
}
params.data = (this.view.noQuery !== true);
if (this.initialized !== false && params.inited !== false)
this.customQuery(params);
}, showDialog(item) {
let options ={params: {}};
if(item.type==="form"){
options= this.$core.merge({params: {}}, this.view.dialog,{params:this.view.formView},item.linkageRule);//克隆,防止参数污染
}else{
// if(item.type=="list"){
options= this.$core.merge({params: {}}, this.view.dialog, item.linkageRule);//克隆,防止参数污染
}
switch (item.type) {
case "form":
case "list":
let params = this.$core.extend({}, this.queryParams, this.selectedItem, this.getFormData());
if (this.$options.name === "TreeView"&&item.code==="add"&&!options.params.pid) {
options.params.pid = this.selectedItem ? this.selectedItem[this.view.idKey] : this.queryParams.pid;
}
if(item.linkageRule.params){ //增加对批量选择的支持
for(let key in item.linkageRule.params) {
if(typeof item.linkageRule.params[key]=="string"&&item.linkageRule.params[key].indexOf("{list}")>=0) {
if (this.checkedItems && this.checkedItems.length > 0) { //优先勾选的对象
params.list = this.checkedItems.map((item, index) => {
return item[this.view.idKey];
});
} else if (this.selectedItem && this.selectedItem.id) {
params.list = [this.selectedItem.id];
}
options.params[key]= item.linkageRule.params[key].urlFormat(params, true);
}
}
}
if (this.fid)
params.fid = this.fid;
if (typeof item.linkageRule.componentPath == "string" && typeof item.linkageRule.component == "string"
&& this.$options.components[item.linkageRule.component] == null) {
let name = item.linkageRule.component;
this.$reg(this, name, item.linkageRule.componentPath);
}
for (let key in options.params) {
if (typeof options.params[key] == "string") {
options.params[key] = options.params[key].urlFormat(params, true);
}
}
if (options.title) {
options.title = this.$_i18n( options.title);
}
break;
case "webpage":
if (typeof item.linkageRule.componentPath == "string" && typeof item.linkageRule.component == "string"
&& this.$options.components[item.linkageRule.component] == null) {
let name = item.linkageRule.component;
this.$reg(this, name, item.linkageRule.componentPath);
}
for (let key in options.params) {
if (typeof options.params[key] == "string") {
options.params[key] = options.params[key].urlFormat(params, true);
}
}
if (options.title) {
options.title = this.$_i18n( options.title);
}
break;
default:
break;
}
this.dialog=this.$core.merge(this.defaultDialog,options);
if(item.type==="form"){
if(item.code==="add"){
this.dialog.title=this.$_i18n("[toolbar.add]")+this.dialog.title;
}else if(item.code==="mod"){
this.dialog.title=this.$_i18n("[toolbar.mod]")+this.dialog.title;
}
}
this.dialog.visible = true;
}, $_page_updateLayoutSetting(view) {
for (let key1 in view.layout) { //在执行某个layout属性挂载,那么visible与component必须在最后执行
if(this.view.layout[key1]) {
let area = view.layout[key1];
let result = this.$core.merge(this.view.layout[key1], area);
for (let key2 in area) {
if (key2 !== "visible" && key2 !== "component")
this.$set(this.view.layout[key1], key2, result[key2]);//融合不支持常量
}
if (area.visible != null)
this.$set(this.view.layout[key1], "visible", area.visible);
if (area.component != null) {
if (area.componentPath && !this.$options.components[area.component]) {
this.$reg(this, area.component, area.componentPath);
}
this.$set(this.view.layout[key1], "component", area.component);
}
}
}
},
/**
* 更新视图
* @param view 视图配置
* @param toolbarItems 工具栏项
*/
$_page_updateView(view, toolbarItems) {
if (view) {
if(this.pageOptions) {
this.$core.debug().log("优先处理上级页面的视图控制参数",this.$options.name,this.pageOptions);
if (this.pageOptions.noQuery)
view.noQuery = this.pageOptions.noQuery;
if (this.pageOptions.showToolbar != null)
view.showToolbar = !(this.pageOptions.showToolbar === false || this.pageOptions.showToolbar === "false");
if (this.pageOptions.halfChecked != null)
view.checkStrictly = !(this.pageOptions.halfChecked === false || this.pageOptions.halfChecked === "false")
if (this.pageOptions.expandAll != null)
view.expandAll = (this.pageOptions.expandAll === true || this.pageOptions.expandAll === "true")
this.$core.debug().log("检查参数", this.$options.name, view.showTitle, this.pageOptions.showTitle)
if (this.pageOptions.showTitle != null)
view.showTitle = (this.pageOptions.showTitle === true || this.pageOptions.showTitle === "true");
this.$core.debug().log("获得参数", this.$options.name, view.showTitle)
if (this.pageOptions.showFilter != null)
view.showFilter = (this.pageOptions.showFilter === true || this.pageOptions.showFilter === "true")
if (this.pageOptions.checkStrictly != null)
view.checkStrictly = (this.pageOptions.checkStrictly === true || this.pageOptions.checkStrictly === "true")
if (this.pageOptions.showCheckbox != null)
view.showCheckbox = (this.pageOptions.showCheckbox === true || this.pageOptions.showCheckbox === "true")
if (this.pageOptions.selectEnable != null)
view.selectEnable = (this.pageOptions.selectEnable === true || this.pageOptions.selectEnable === "true")
if (this.pageOptions.dataType != null)
view.dataType = this.pageOptions.dataType;
if (this.pageOptions.action) {
view.action = this.pageOptions.action
}
if (this.pageOptions.oa) {
view.oa = this.pageOptions.oa
}
if (this.pageOptions.reportName)
view.reportName = this.$_i18n(this.pageOptions.reportName);
if(this.pageOptions.hideColumn){
let hiddens=this.pageOptions.hideColumn.split(",");
this.hiddens=[];
for(let i=0;i<hiddens.length;i++){
this.hiddens[hiddens[i]]=true;
}
}
}
//对于view的属性加载是有讲究的
for (let key in view) {
if (key === "title") {
if (this.view.title !== "未设置标题")
this.$set(this.view, key, view[key]);
} else if (key === "layout") {
this.$_page_updateLayoutSetting(view);
} else if (key === "query") {
this.$set(this, "queryParams", this.$core.extend(this.queryParams, view[key]));
} else if (key === "params") {
this.$_page_updatePageParams(view[key]);
} else {
if (typeof view[key] == "object" && !this.$core.isArray(view[key]))
this.$set(this.view, key, this.$core.merge(this.view[key], view[key]));
else
this.$set(this.view, key, view[key]);
}
}
if (view.layout)
this.$nextTick(() => {
this.$refs.layout.updateLayout(this.view.layout);
})
}
if (this.$options.name === "ListView"&&this.view.row && this.view.row.list.length > 0 && toolbarItems) {
let buttons = [];
for (let i in this.view.row.list) {
let codes = this.stringArray(this.view.row.list[i]);
buttons = buttons.concat(codes);
}
for (let i in toolbarItems) {
let item = toolbarItems[i];
if (buttons.indexOf(item.code) >= 0) {
this.view.row.buttons[item.code] = item;
if (this.view.buttonType === 1) {
this.$set(item, "visible", false);
}
}
}
}
if(toolbarItems){
for (let i in toolbarItems) {
let item = toolbarItems[i];
if(this.view.rowClick===item.code){
this.$set(item, "visible", false);
this.rowClickHandle=item;
}else if(this.view.rowDbClick===item.code) {
this.$set(item, "visible", false);
this.rowDbClickHandle=item;
}
}
}
if (this.resize)
this.resize();
},async handleDialogClose(e) {
if(this.dialog.rule&&this.$refs.form.linkageData) {
let params=this.$core.extend({},this.getFormData(),e.form);
await this.$refs.form.linkageData(this.dialog.rule, true, this.getFormData(), params);
}
if (typeof e != "function" && e.code != null) {
if(e.params&&e.params.closeParent) {//如果配置了关闭父窗口,则执行关闭
this.closeDialog({code:e.code,msg:e.msg,form:this.getFormData()})
}else{
this.$nextTick(() => {
this.$_page_message(e);
this.customQuery(this.queryParams);
})
}
}
},getFormData(){
if(this.$refs.form&&this.$refs.form.form){
let result=this.$core.merge({},this.$refs.form.form);
for(let i in this.$refs.form.items){
switch(this.$refs.form.items[i].type){
case "editor"://保存时需要恢复成相对地址
// case "file"://保存时需要恢复成相对地址
// case "image"://保存时需要恢复成相对地址
let key= this.$refs.form.items[i].code;
if(result[key]) {
let reg=new RegExp(this.$store.state.api.axios.baseURL + "/","g");
result[key] = result[key].replace(reg, ""); //地址修复
result[key] = result[key].replace(/width="300"/g, 'width="100%"') ; //强制去掉播放器的宽度和高度
result[key] = result[key].replace(/height="150"/g, "");
// result[key] = result[key].replace(/width="200"/g, 'width="100%"') ; //强制去掉播放器的宽度和高度
// result[key] = result[key].replace(/height="160"/g, "");
}
break;
default:
break;
}
}
return result;
}
}, $page_toolbar_clickHandler(event,item) {
//工具栏点击事件一共分为两种
//1,不需要进行当前界面二次收集数据的
//2,需要当前界面二次收集数据,如选中项
//是否需要,则是由验证器来决定
//从设计上来说,目前只有查询是绝对不需要验证器的,其他一律走验证器逻辑
this.$core.merge({}, this.queryParams, this.$refs.toolbar.queryParams);
this.$core.debug().log("点击了按钮", item);
switch (item.type) {
case "search":
this.queryParams.p = 1;
this.$refs.toolbar.queryParams.data=true;
this.customQuery(this.$refs.toolbar.queryParams);
break;
default:
let setting = this.$core.merge({}, this.defaultRule, item.linkageRule);
let params=this.getPageParams();
if (this.validate(setting,params)) {
if (setting.confirm && setting.confirm.msg) {
this.$core.debug().log("确认的参数",setting.confirm,this.queryParams);
let msg=setting.confirm.msg.format(params);
this.$confirm(msg).then((e) => {
this.execute(item);
}).catch(() => {
})
} else {
this.execute(item);
}
}else{
event.preventDefault();
// if(item.type=="linkButton"){
//
// }
return false;
}
break;
}
}, validate(setting,data) {
if (setting.validate) {
if (this.validateCallback) {
for (let key in setting.validate) {
if (setting.validate[key].required !== false){
let result=this.validateCallback(setting.validate[key], key,data);
if(result===false) {
this.$notify({title: '警告', message: setting.validate[key].msg || "未输入正确的提示信息", type: 'warning'});
return false;
}else if(result==null){//递归的不再提示
return false;
}
}
}
}
}
return true;
}, execute(item) {
switch (item.type) {
case "form":
if (!item.linkageRule || !item.linkageRule.component)
this.$core.merge(true, item, {linkageRule: {component: "FormView"}});
this.showDialog(item);
break;
case "list":
if (!item.linkageRule || !item.linkageRule.component)
this.$core.merge(true, item, {linkageRule: {component: "ListView"}});
this.showDialog(item);
break;
case "webpage":
case "print":
if (item.actionUrl) {
if(!item.linkageRule.component)
item.linkageRule.component = "WebView";
let params = this.$core.extend({}, this.queryParams, this.selectedItem);
if (this.$core.isExternal(item.actionUrl)) {
item.linkageRule.params = this.$core.merge(item.linkageRule.params,{src: item.actionUrl.urlFormat(params, false, true)});
} else {
item.linkageRule.params = this.$core.merge(item.linkageRule.params, {src: this.$store.state.api.axios.baseURL + item.actionUrl.urlFormat(params, false, true)});
}
}
this.showDialog(item);
break;
case "link":
if (item.actionUrl) {
let params = this.$core.extend({}, this.queryParams, this.selectedItem);
if(item.actionUrl.indexOf("{token}")>-1){//对token的包装支持
params["token"] =getToken();
}
let url =this.adapterUrl(item.actionUrl.urlFormat(params));
this.$set(item, "href", this.$core.replaceQueryString(url));
}
break;
case "jsonupdate":
if (item.actionUrl) {
let params = {};
if (this.checkedItems && this.checkedItems.length > 0) { //优先勾选的对象
params.list = this.checkedItems.map((item, index) => {
return item[this.view.idKey];
});
}else if (this.selectedItem && this.selectedItem.id) {
params.list = [this.selectedItem.id];
}
let options = this.$core.extend({}, this.queryParams, this.selectedItem, params, this.getFormData());//获取所有的参数
params = this.$core.extend(params,this.$core.getParams(item.actionUrl));//对地址栏上的get参数进行支持
params = this.$core.extend(params,item.linkageRule.params);//对联动规则上的参数进行支持
for (let key in params) {
if(typeof params[key]=="string") {
params[key] = params[key].urlFormat(options, true);
}
}
let url = this.$core.getPageAddress(item.actionUrl).urlFormat(options);//对动态地址进行支持
this.$http(url, {data: params}).then((res) => {
if(item.linkageRule.saveAndClose){
if (res.code===0) {
if(item.linkageRule.saveAndClose){ //关闭弹窗,刷新父页面
this.closeDialog({code: res.code, msg: res.msg, form: params, params: this.params});
}else{
this.$_page_message(res);//当前页提示消息
this.$parent.returnData={code:res.code,form:params, params: this.params};
}
} else {
this.$_page_message(res);// this.$notify({title: '失败',duration:10,message: res.msg,type: 'error'});
}
}else {
if (res.code===0) {
this.$_page_message(res);
this.customQuery(this.$refs.toolbar.queryParams);
} else {
this.$_page_message(res);
}
}
})
}
break;
case "save":
this.save(item, this.view.formView == null || this.view.formView.saveAndClose);
break;
case "saveRel":
let ids= this.$refs.tree.getCheckedKeys();//选中的节点
if(!this.view.checkStrictly)
ids = ids.concat(this.$refs.tree.getHalfCheckedKeys());//追加半选
let params = this.$core.extend({}, this.queryParams, {checkedIds: ids.join(",")})
this.$http({url: this.$store.state.api.form.saveRel, data: params}).then((res) => {
if (res.code===0) {
//关闭弹窗或刷新父页面
if (this.$parent && this.$parent.hide && this.$parent.$options.name === "Dialog") {
//this.$core.debug().log("执行关闭");
//this.$parent.hide({success: res.code===0, msg: res.msg});
if(this.view.formView == null || this.view.formView.saveAndClose){ //关闭弹窗,刷新父页面
this.closeDialog({code: res.code, msg: res.msg, params: this.params});
}else{
this.$_page_message(res);//当前页提示消息
this.$parent.returnData={code: res.code , params: this.params};
}
}
} else {
this.$_page_message(res);// this.$notify({title: '失败',duration:10,message: res.msg,type: 'error'});
}
})
break;
case "close":
this.save(item);
break;
case "plugin":
if(item.linkageRule&&item.linkageRule.plugin) {
if (this.$plugins[item.linkageRule.plugin])
this.$plugins[item.linkageRule.plugin](item, this);
else
this.$core.debug().warn("未找到相关插件,请检查配置", item);
}
break;
default:
break;
}
},getStyle(style) {
if (style)
return "iconfont iconfont-toolbar " + style;
},$_page_adapterNextParams(options,data){
let params ={p: 1};
for (let key in options) {
if (typeof options[key] == "string") {
if (options[key] === "selected") {
params[key] = data[key];
} else {
params[key] = options[key].urlFormat(data, true);
}
} else {
if (data[key] != null) {
params[key] = data[key];
} else {
params[key] = options[key];
}
}
}
return params;
},
$_page_linkageLayout(layout) {
if (this.$refs[layout] && this.$refs[layout].initialized !== false) { //防止某些页面没有注册这个参数
if (this.selectedItem) {
let nextParams=this.$core.merge(this.queryParams,this.selectedItem);
let params= this.$_page_adapterNextParams(this.view.layout[layout].query,nextParams);
this.$refs[layout].$_page_updateQueryParams(params, true);
} else if (this.getFormData()) {
this.$refs[layout].$_page_updateQueryParams(this.$core.extend({}, this.queryParams, this.getFormData()), true);
}
} else {
if (this.linkageTimeoutHandle[layout] != null) {
clearTimeout(this.linkageTimeoutHandle[layout]);
delete this.linkageTimeoutHandle[layout];
}
this.linkageTimeoutHandle[layout] = setTimeout(this.$_page_linkageLayout, 50, layout);
}
},save(item,successClose=true){
this.$refs.form.$refs.form.validate((valid) => {
if (valid) {
let url = this.$store.state.api.form.saveForm+ this.fid;;
if(this.view.formView&&this.view.formView.action!=null)//支持地址置空
url=this.view.formView.action;
if(item.actionUrl!=null)//支持地址置空
url=item.actionUrl;
let data=this.getFormData();
if(item.linkageRule){
if(item.linkageRule.saveAndClose!=null)
successClose=item.linkageRule.saveAndClose;
if(item.linkageRule.params){//包装扩展参数
let temp=this.$core.merge({},data);
for(let key in item.linkageRule.params){
if(data[key]===undefined){
if(typeof item.linkageRule.params[key]=="string"&&item.linkageRule.params[key].indexOf("{")>=0)
temp[key]=item.linkageRule.params[key].urlFormat(this.getFormData(),true);
else
temp[key]=item.linkageRule.params[key];
}
}
data=temp;
}
}
if(url) {//如果提供了地址,则执行保存并返回
this.$http(url, {data: data}).then((res) => {
if (res.code===0) {
if(successClose){ //关闭弹窗,刷新父页面
this.closeDialog({code: res.code, msg: res.msg, form: data, params: this.params});
}else{
this.$_page_message(res);//当前页提示消息
this.$parent.returnData={code: res.code ,form: data, params: this.params};
}
} else {
this.$_page_message(res);// this.$notify({title: '失败',duration:10,message: res.msg,type: 'error'});
}
})
}else{//否则直接执行返回
this.closeDialog({form: data, params: this.params});
}
} else {
return false;
}
});
},closeDialog(returnData){
if (this.$parent && this.$parent.hide && this.$parent.$options.name === "Dialog") {
this.$parent.hide(returnData);
}else{
this.$_page_message(returnData);//当前页提示消息
}
},
/**
* 初始化表单
* @returns {Promise<void>} 异步处理
*/
async initFormConfig(){
if(this.fid){
let cache={};
if (this.$store.state.form[this.fid]) {
cache = this.$core.decodeData(this.$store.state.form[this.fid], {}).data[0];
} else {
await this.$async({
url: this.$store.state.api.form.loadConfig + this.fid, keymap: {}, beforeDecode: (e) => {
this.$store.dispatch('form/update', {key: this.fid, value: e});
}
}).then(async (res) => {
cache = res.data[0];
})
}
//完成工具栏数据布局
for(let i=cache.tools.length-1;i>=0;i--){
if(cache.tools[i].position===5){//配置停靠区域为表单的,不在列表显示
cache.tools.splice(i,1);
}else {
let item = cache.tools[i];//新组件
if (this.defaultTools[item.code]) {
if(item.code==="del"&& this.$options.name!=="ListView") {
delete this.defaultTools[item.code].linkageRule.params.list;
delete this.defaultTools[item.code].linkageRule.validate.list;
this.defaultTools[item.code].linkageRule.validate.id={required:true};
}
cache.tools[i] = this.$core.merge(this.defaultTools[item.code], item);//自动完善细化配置,并完成属性重写
}
if(item.code==="add"){
if(cache.view&&cache.view.parent&&cache.view.parent.validate){//
cache.tools[i].linkageRule=this.$core.merge(cache.view.parent, cache.tools[i].linkageRule);
}
}
}
}
this.$nextTick(async ()=>{
if(this.$options.name==="SelectTreeView"){
cache.tools=this.tools.concat(cache.tools);
for(let i=cache.tools.length-1;i>=0;i--){
switch (cache.tools[i].code) {
case "add":
case "mod":
case "del":
cache.tools.splice(i,1);
break;
default:
break;
}
}
}
await this.$refs.toolbar.updateTools(cache.tools,cache.view);
if (this.view.oa && this.queryParams.cid) {//oa的组件暂时追加在配置的最后面
this.$reg(this, "StepView", "../oa/StepView");
this.$reg(this, "ProcessView", "../oa/ProcessView");
let buttons= ["oa_submit","oa_do","oa_detail"];
let hidden=[]
if(this.queryParams.hide)
hidden= this.queryParams.hide.split(",");
buttons.forEach((code,i)=>{
if(this.queryParams.hide){
let index= hidden.findIndex((item)=>(item===code));
if(index>=0)//如果发现需要隐藏的oa工具,则跳过此工具的加载
return;
}
if (this.$refs.toolbar.toolbars[code] == null) {
let index = this.$refs.toolbar.items.length;
this.$refs.toolbar.items.push(this.defaultTools[code]);
this.$refs.toolbar.toolbars[code]=index;
}
})
//除了这些功能外,还需要对修改和删除功能进行干预
this.$nextTick(() => {
if (this.$refs.toolbar && this.$refs.toolbar.toolbars) {
if (this.$refs.toolbar.toolbars["mod"] != null) {
this.$refs.toolbar.items[this.$refs.toolbar.toolbars["mod"]].linkageRule.validate.status = {
indexOf: ["未提交", "审批退回"], msg: "流程执行过程,不允许修改内容!"
}
}
if (this.$refs.toolbar.toolbars["del"] != null) {
this.$refs.toolbar.items[this.$refs.toolbar.toolbars["del"]].linkageRule.validate.status = {
indexOf: ["未提交", "审批退回"],
msg: "流程执行过程,不允许修改内容!"
}
}
}
})
}
})
}else{ //如果没有表单干预,则默认加载当前配置的tools
this.$nextTick(async ()=>{
await this.$refs.toolbar.updateTools(this.tools,{});
})
}
},validateData(item, key,data) {
if (item.required) {
if (!(data && data[key]!=null && ("" + data[key]).length > 0)) {
if (key === "list") {//增加对列表参数的判断支持
let datas = this.checkedItems;
if (this.checkedItems.length === 0)
datas = [data];
for(let i in datas){//遍历数据进行验证
let dataItem=datas[i];
if(!dataItem[this.view.idKey]){//id没有
return false;
}
if (item.validate) {//如果还需要验证扩展属性,则进行验证,此模式仅支持批量同步验证
for (let c_key in item.validate) {
if (item.validate[c_key].required !== false && !(this.validateCallback(item.validate[c_key], c_key,dataItem))) {
this.$notify({title: '警告', message: item.validate[c_key].msg || "未输入正确的提示信息", type: 'warning'});
return null;
}
}
}
}
return true;
}
return false;
}
} else if (item.regex) {//支持正则配置,相关正则,请自行参考百度
return new RegExp(item.regex).test(data[key]);
} else if (item.indexOf!=null) {//包含在数组内
return item.indexOf.indexOf(data[key]) >= 0;
} else if (item.notIndexOf!=null) {//不包含在数组内
return item.notIndexOf.indexOf(data[key]) < 0;
} else if (item.notEquals!=null) {//不等于
return data[key] !== item.notEquals;
} else if (item.equals!=null) {//等于
return data[key]===item.equals||(item.equals.indexOf("{")>=0 && data[key]===item.equals.format(data));
} else if (item.equalsIgnoreCase!=null) {
if (data[key] === item.equalsIgnoreCase) {
return true;
} else if (data[key] != null && item.equalsIgnoreCase != null) {
return data[key].toLowerCase() === item.equalsIgnoreCase.toLowerCase();
}
return false;
} else if (item.expression) {//使用表达式需要注意,最后返回的结果是 null,0,"",false均为false,其他为true
return eval(item.expression.urlFormat(data));
}
return true;
}
}
}