/* * Copyright (C) 2010---2014 星星(wuweixing)<349446658@qq.com> * * This file is part of Wabacus * * Wabacus is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package com.wabacus.system.assistant; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Map.Entry; import com.wabacus.config.Config; import com.wabacus.config.OnloadMethodBean; import com.wabacus.config.component.IComponentConfigBean; import com.wabacus.config.component.application.report.ConditionBean; import com.wabacus.config.component.application.report.ReportBean; import com.wabacus.config.component.container.page.PageBean; import com.wabacus.exception.WabacusConfigLoadingException; import com.wabacus.system.inputbox.AbsInputBox; import com.wabacus.system.inputbox.IInputBoxOwnerBean; import com.wabacus.system.inputbox.validate.JavascriptValidateBean; import com.wabacus.util.Consts_Private; import com.wabacus.util.Tools; public class JavaScriptAssistant { private final static JavaScriptAssistant instance=new JavaScriptAssistant(); protected JavaScriptAssistant() {} public static JavaScriptAssistant getInstance() { return instance; } public void createRefreshSlaveReportsDataScript(ReportBean rbean) { if(rbean.getMDependChilds()==null||rbean.getMDependChilds().size()==0) { throw new WabacusConfigLoadingException("报表"+rbean.getPath()+"没有依赖它的从报表,不需生成刷新从报表的javascript函数"); } StringBuffer resultBuf=new StringBuffer(); resultBuf.append("function "+rbean.getRefreshSlaveReportsCallBackMethodName()+"(pageid,reportid,selectedTrObjArr,deselectedTrObjArr){"); resultBuf.append(getRefreshSlaveReportsScriptString(rbean)); resultBuf.append("}"); writeJsMethodToJsFiles(rbean.getPageBean(),resultBuf.toString()); } private String getRefreshSlaveReportsScriptString(ReportBean rbean) { StringBuffer scriptBuf=new StringBuffer(); scriptBuf.append("var reportguid=getComponentGuidById(pageid, reportid);"); scriptBuf.append("var metadataObj=getReportMetadataObj(reportguid);"); scriptBuf.append("var oldSlaveTrObj=getRealCurrentSlaveTrObjForReport(reportguid);"); scriptBuf.append("if(oldSlaveTrObj!=null&&(selectedTrObjArr==null||selectedTrObjArr.length==0)&&(deselectedTrObjArr==null||deselectedTrObjArr.length==0))"); scriptBuf.append("{"); scriptBuf.append(" doSelectListReportDataRow(metadataObj,oldSlaveTrObj,true,false);"); scriptBuf.append(" return;"); scriptBuf.append("}"); scriptBuf.append("var currentSlaveTrObj=null;"); scriptBuf.append("if (selectedTrObjArr == null || selectedTrObjArr.length <= 0) selectedTrObjArr = getListReportSelectedTrObjs(pageid, reportid, false, true);"); scriptBuf.append("if (selectedTrObjArr == null || selectedTrObjArr.length <= 0)"); scriptBuf.append("{"); scriptBuf.append(" if(deselectedTrObjArr==null||deselectedTrObjArr.length==0)"); scriptBuf.append(" {"); scriptBuf.append(" var tableObj=document.getElementById(reportguid + '_data');"); scriptBuf.append(" if(tableObj==null) return;"); scriptBuf.append(" var trChilds = tableObj.getElementsByTagName('TR');"); scriptBuf.append(" if(trChilds==null||trChilds.length==0) return;"); scriptBuf.append(" var trObjTmp;"); scriptBuf.append(" for (var i = 0, len = trChilds.length; i < len; i++) "); scriptBuf.append(" {"); scriptBuf.append(" trObjTmp = trChilds[i];"); scriptBuf.append(" if (!isListReportDataTrObj(trObjTmp)) continue;"); scriptBuf.append(" var trtype = trObjTmp.getAttribute('EDIT_TYPE');"); scriptBuf.append(" if (trtype == null || trtype != 'add')"); scriptBuf.append(" {"); scriptBuf.append(" doSelectListReportDataRow(metadataObj,trObjTmp,true,false);"); scriptBuf.append(" return;");//因为在上面的选中函数中会执行行选中回调函数,因此会重新调用此方法刷新从报表 scriptBuf.append(" }"); scriptBuf.append(" }"); scriptBuf.append(" }"); scriptBuf.append("}else"); scriptBuf.append("{"); scriptBuf.append(" var trObjTmp;"); scriptBuf.append(" for (var i = selectedTrObjArr.length - 1; i >= 0; i--)"); scriptBuf.append(" {"); scriptBuf.append(" trObjTmp = selectedTrObjArr[i];"); scriptBuf.append(" var trtype = trObjTmp.getAttribute('EDIT_TYPE');"); scriptBuf.append(" if (trtype == null || trtype != 'add')"); scriptBuf.append(" {"); scriptBuf.append(" if(isCurrentSlaveTrObjOfReport(reportguid,trObjTmp)) return;"); scriptBuf.append(" currentSlaveTrObj = trObjTmp;"); scriptBuf.append(" break;"); scriptBuf.append(" }"); scriptBuf.append(" }"); scriptBuf.append("}"); scriptBuf.append("setCurrentSlaveTrObjForReport(reportguid,currentSlaveTrObj);"); scriptBuf.append("if(currentSlaveTrObj==null)"); scriptBuf.append("{"); scriptBuf.append(" var slaveReportSpanObjTmp=null;var staticlinkparams='';"); scriptBuf.append( hideAllSlaveReports(rbean,null)); scriptBuf.append("}else"); scriptBuf.append("{"); scriptBuf.append( refreshAllSlaveReports(rbean));//刷新所有从报表 scriptBuf.append("}"); return scriptBuf.toString(); } private String hideAllSlaveReports(ReportBean rbean,Boolean parentDisplayWhenNoData) { StringBuffer scriptBuf=new StringBuffer(); ReportBean rbeanTmp; String slaveidTmp; scriptBuf.append("var serverurl='"+Config.showreport_onpage_url+"&PAGEID='+pageid;"); for(Entry<String,Map<String,String>> reportEntries:rbean.getMDependChilds().entrySet()) { slaveidTmp=reportEntries.getKey(); rbeanTmp=rbean.getPageBean().getReportChild(slaveidTmp,true); boolean mydisplayWhenNoData=rbeanTmp.isDisplayOnParentNoData(); if(parentDisplayWhenNoData!=null&&parentDisplayWhenNoData==false) { mydisplayWhenNoData=false; } if(!mydisplayWhenNoData) { scriptBuf.append("slaveReportSpanObjTmp=document.getElementById('WX_CONTENT_").append(rbeanTmp.getGuid()).append("');"); scriptBuf.append("if(slaveReportSpanObjTmp!=null) slaveReportSpanObjTmp.innerHTML=' ';"); }else { Map<String,String> mParamsTmp=reportEntries.getValue(); scriptBuf.append("staticlinkparams='';");//存放刷新每个从报表所配置的常量参数 for(Entry<String,String> paramEntry:mParamsTmp.entrySet()) { if(!Tools.isDefineKey("@",paramEntry.getValue())) { scriptBuf .append("staticlinkparams=staticlinkparams+'&"+paramEntry.getKey()+"='+encodeURIComponent('"+paramEntry.getValue()+"');"); } } scriptBuf.append("refreshComponent(serverurl+'&WX_ISREFRESH_BY_MASTER=true&"+slaveidTmp+"_PARENTREPORT_NODATA=true&SLAVE_REPORTID="+slaveidTmp+"'+staticlinkparams);"); } if(rbeanTmp.getMDependChilds()!=null) scriptBuf.append(hideAllSlaveReports(rbeanTmp,mydisplayWhenNoData)); } return scriptBuf.toString(); } private String refreshAllSlaveReports(ReportBean rbean) { StringBuffer scriptBuf=new StringBuffer(); scriptBuf.append("var linkparams=getRefreshSlaveReportsHrefParams(currentSlaveTrObj);"); scriptBuf.append("if(linkparams==null||linkparams==''){wx_warn('没有取到刷新从报表数据的动态参数,刷新失败');return false;}"); scriptBuf.append("var serverurl='"+Config.showreport_onpage_url+"&'+linkparams+'&PAGEID='+pageid;"); scriptBuf.append("var staticlinkparams;"); for(Entry<String,Map<String,String>> reportEntries:rbean.getMDependChilds().entrySet()) { String slaveid=reportEntries.getKey(); Map<String,String> mParamsTmp=reportEntries.getValue(); scriptBuf.append("staticlinkparams='';"); for(Entry<String,String> paramEntry:mParamsTmp.entrySet()) { if(!Tools.isDefineKey("@",paramEntry.getValue())) {//当前参数是常量参数 scriptBuf .append("staticlinkparams=staticlinkparams+'&"+paramEntry.getKey()+"='+encodeURIComponent('"+paramEntry.getValue()+"');"); } } ReportBean slaverbean=rbean.getPageBean().getSlaveReportBean(slaveid); if(slaverbean==null) { throw new WabacusConfigLoadingException("为报表"+rbean.getPath()+"生成刷新从报表数据的javascript函数失败,没有取到"+slaveid+"对应的从报表"); } scriptBuf.append("refreshComponent(serverurl+'&WX_ISREFRESH_BY_MASTER=true&SLAVE_REPORTID="+slaveid+"'+staticlinkparams);"); } return scriptBuf.toString(); } public void createComponentOnloadScript(IComponentConfigBean componentBean) { List<OnloadMethodBean> lstOnloadMethods=componentBean.getLstOnloadMethods(); if(lstOnloadMethods==null||lstOnloadMethods.size()==0) return; Collections.sort(lstOnloadMethods); StringBuffer scriptBuf=new StringBuffer(); for(OnloadMethodBean methodBeanTmp:lstOnloadMethods) { if(Consts_Private.ONLOAD_CONFIG.equalsIgnoreCase(methodBeanTmp.getType())) { scriptBuf.append(methodBeanTmp.getMethod()).append("('").append(componentBean.getPageBean().getId()).append("','"); scriptBuf.append(componentBean.getId()).append("');"); }else if(Consts_Private.ONlOAD_IMGSCROLL.equalsIgnoreCase(methodBeanTmp.getType()) ||Consts_Private.ONlOAD_CURVETITLE.equalsIgnoreCase(methodBeanTmp.getType())) { scriptBuf.append(methodBeanTmp.getMethod()).append(";"); }else if(Consts_Private.ONLOAD_REFRESHSLAVE.equalsIgnoreCase(methodBeanTmp.getType())) {//是刷新从报表的js函数,则不传入pageid和reportid两个参数 scriptBuf.append(methodBeanTmp.getMethod()).append("('").append(componentBean.getPageBean().getId()).append("','").append( componentBean.getId()).append("',null,null);"); } } if(scriptBuf.toString().trim().equals("")) return; StringBuffer resultBuf=new StringBuffer(); resultBuf.append("function "+componentBean.getOnloadMethodName()+"(){"); resultBuf.append(scriptBuf.toString()); resultBuf.append("}"); writeJsMethodToJsFiles(componentBean.getPageBean(),resultBuf.toString()); } public void createInputBoxValidateMethod(AbsInputBox inputboxObj) { String jsvalidate=inputboxObj.getJsvalidate(); if(jsvalidate==null||jsvalidate.trim().equals("")) return; List<String> lstJsMethods=Tools.parseStringToList(jsvalidate.trim(),";",new String[] { "'", "'" },false); if(lstJsMethods==null||lstJsMethods.size()==0) return; StringBuilder scriptBuf=new StringBuilder(); scriptBuf.append("function validate_"+inputboxObj.getOwner().getInputBoxId()+"(metadataObj,boxMetadataObj,boxValue,boxObj,paramsObj,isOnblur){"); JavascriptValidateBean jsvalidateBean=new JavascriptValidateBean(inputboxObj); jsvalidateBean.setValidatetype(inputboxObj.getJsvalidatetype()); IInputBoxOwnerBean ownerBean=inputboxObj.getOwner(); jsvalidateBean.addParamBean("inputbox_label",ownerBean.getLabel(null),true); if(ownerBean instanceof ConditionBean) { ConditionBean cbTmp=(ConditionBean)ownerBean; if(cbTmp.getLabel()!=null&&!cbTmp.getLabel().trim().equals("")&&ConditionBean.LABELPOSITION_INNER.equals(cbTmp.getLabelposition())) { scriptBuf.append("if(boxValue==paramsObj.inputbox_label) boxValue='';"); } } scriptBuf.append("var errorpromptparamsObj=null;"); scriptBuf .append("if(boxMetadataObj!=null) errorpromptparamsObj=getObjectByJsonString(boxMetadataObj.getAttribute('errorpromptparamsonblur'));"); for(String jsMethodTmp:lstJsMethods) { if(jsMethodTmp==null||jsMethodTmp.trim().equals("")) continue; jsMethodTmp=jsMethodTmp.trim(); String methodname=jsMethodTmp; int lidx=jsMethodTmp.indexOf("("); int ridx=jsMethodTmp.lastIndexOf(")"); if(lidx>0&&lidx<ridx) {//自己提供出错信息提示 methodname=jsMethodTmp.substring(0,lidx); if(methodname.equals("")) continue; jsvalidateBean.parseConfigValidateMethodParams(methodname,jsMethodTmp.substring(lidx+1,ridx).trim()); } scriptBuf.append("if(!"+methodname+"(boxValue,boxObj,paramsObj))"); scriptBuf.append("{"); scriptBuf.append(" var errormess=paramsObj."+methodname+"_errormessage;"); scriptBuf.append(" if(errormess!=null&&errormess!='')"); scriptBuf.append(" {"); scriptBuf.append(" errormess=errormess.replace(/#label#/g,paramsObj.inputbox_label);"); scriptBuf.append(" errormess=errormess.replace(/#data#/g,boxValue);"); scriptBuf.append(" var tiparamsObj=paramsObj."+methodname+"_tiparams;if(tiparamsObj==null) tiparamsObj=errorpromptparamsObj;"); scriptBuf.append(" if(errormess!=null&&errormess!='')"); scriptBuf.append(" {"); scriptBuf.append(" if(isOnblur===true){wx_jsPromptErrorOnblur(metadataObj,boxObj,errormess,tiparamsObj);}else{wx_warn(errormess);}"); scriptBuf.append(" }"); scriptBuf.append(" }"); scriptBuf.append(" return false;"); scriptBuf.append("}else{"); scriptBuf.append(" wx_hideJsPromptErrorOnblur(metadataObj,boxObj);");//隐藏掉出错提示框 scriptBuf.append("}"); } scriptBuf.append("return true;}"); writeJsMethodToJsFiles(ownerBean.getReportBean().getPageBean(),scriptBuf.toString()); ownerBean.getReportBean().addInputboxJsValidateBean(ownerBean.getInputBoxId(),jsvalidateBean); } public void writeJsMethodToJsFiles(PageBean pagebean,String jsMethodContent) { if(jsMethodContent!=null&&!jsMethodContent.trim().equals("")) { writeJsMethodToJsFiles(pagebean.getJsFilePath(),jsMethodContent); pagebean.setShouldIncludeAutoCreatedJs(true); } } public void writeJsMethodToJsFiles(String jsPath,String jsMethodContent) { if(!Config.should_createjs) return; if(jsMethodContent==null||jsMethodContent.trim().equals("")) return; if(jsPath==null||jsPath.trim().equals("")) return; FilePathAssistant.getInstance().writeFileContentToDisk(jsPath,jsMethodContent,true); } }