import {validatenull} from "@/util/validate"; import {findArray} from "@/util/util"; /** * 按钮的基础服务 */ /** * 替换文本中的${xxx} * @param text 文本 * @param dataStore 选择的数据 * @param sourceData 来源数据 * @returns 替换后的值,字符串 */ export const replaceFreeMarker = (text,dataStore,sourceData) => { //替换表达式 if (!sourceData) { sourceData = {}; } if (!dataStore) { dataStore = []; } let replaceData = dataStore.length > 0 ? dataStore[0] : {}; if (text && text.indexOf("${") > -1 && text.indexOf("}")) { //js只能使用${xxx}这种的方式 let reg = "root.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = replaceData[field] || sourceData[field] || ''; text = temp + field + end; } reg = "sourceData.${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = replaceData[field] || sourceData[field] || ''; text = temp + field + end; } reg = "${"; while (text.indexOf(reg) > -1) { let temp = text.substring(0, text.indexOf(reg)); let field = text.substring(text.indexOf(reg) + reg.length, text.indexOf("}")); let end = text.substring(text.indexOf("}") + 1); field = replaceData[field] || sourceData[field] || ''; text = temp + field + end; } } return text; }; /** * 参数转换为小写 * @param paramsVOs 参数 * @returns 小写后的参数对象 */ export const paramLow = (paramsVOs) => { // if (!paramsVOs) { paramsVOs = {}; } var params = {}; for (var key in paramsVOs) { params[key.toLowerCase()] = paramsVOs[key]; } return params; }; /** * 执行前置事件 * @param options 按钮的配置信息,前置事件里配置的参数会替换这个里的参数的信息 * @param buttonTarget 按钮js所在的对象 * @param callback 回调,如果存在前置事件,会在执行完成后执行回调,否则直接回调 * @param preEventName 前置事件名称,默认beforeevent */ export const callPreEvent = (options,buttonTarget,callback,preEventName) => { const params = paramLow(options.paramVOS); options.paramVOS = params; let beforeEvent = params[preEventName || 'beforeevent']; if(beforeEvent) { let buttonParse = parseEventByUrl(beforeEvent,options,true); buttonParse.options.callback = callback; if(validatenull(buttonParse)){ buttonTarget[buttonParse.methodName](buttonParse); }else{ layui.use(buttonParse.jsPath,function () { layui[buttonParse.jsPath][buttonParse.methodName](options); }); } }else{ if(callback){ callback(options); } } }; /** * 执行后置时间 * @param options 按钮的配置信息,后置事件里配置的参数会替换这个里的参数的信息 * @param buttonTarget 按钮Js所在的对象 */ export const callPostEvent = (options,buttonTarget,callback,postEventName)=>{ const params = paramLow(options.paramVOS); options.paramVOS = params; var afterEvent = params[postEventName || 'afterevent']; if(afterEvent) { var buttonParse = parseEventByUrl(afterEvent,options,false); if(validatenull(buttonParse)){ buttonTarget[buttonParse.methodName](buttonParse); }else{ layui.use(buttonParse.jsPath,function () { layui[buttonParse.jsPath][buttonParse.methodName](options); }); } }else{ if(callback){ callback(options); } } }; /** * 使用url获取事件的信息 * @param url 路径,格式如jsPath#methodName?param=aaa¶m1=bbb * @param options 按钮的配置信息,会自动覆盖相同属性的参数 * @param isBefore 是否为前置事件,否则为后置 * @returns {{jsPath: js的路径, options: 按钮的配置信息, methodName: (string)方法的名字}} */ export const parseEventByUrl = (url,options,isBefore) => { //根据配置格式化事件 var jsPath = url; var methodName = isBefore?"doBefore":"doAfter"; var params = {}; if (url.indexOf("?")) { var temp = url.substring(0, url.indexOf("?")); if (temp.indexOf("#") > -1) { var array = temp.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = temp; } var paramArray = url.substring(url.indexOf("?") + 1).split("&"); layui.each(paramArray, function (_index, _item) { if (_item.indexOf("=") < 0) { this.$message.error(isBefore?"前置事件":"后置事件" + "的参数配置错误,需要要xxx=yyy&zzz=a的方式"); return true; } params[_item.split("=")[0]] = _item.split("=")[1]; }); }else{ if (url.indexOf("#") > -1) { var array = url.split("#"); if(array.length == 1){ jsPath = array[0]; }else{ jsPath = array[0]; methodName = array[1]; } }else{ jsPath = url; } } for (var key in params) { options.paramVOS[key.toLowerCase()] = params[key]; } return { jsPath:jsPath, methodName:methodName, options:options }; };