/*! * Copyright 2011 Guangzhou Donghong Software Technology Inc. * Licensed under the www.jxstar.org */ /** * 公共方法工具类。 * * @author TonyTan * @version 1.0, 2010-01-01 */ JxUtil = {}; (function(){ var rules = null; Ext.apply(JxUtil, { //是否系统退出标志,防止浏览器的刷新事件 isLogout: false, /** * 退出系统,删除当前用户的会话 **/ logout: function(isAuto) { var hdcall = function() { //退出后再刷新,如果把reload放到回调函数外,IE中向后退发送的请求参数为空 var params = 'funid=login&pagetype=login&eventcode=logout'; Request.postRequest(params, function(){ JxUtil.isLogout = true; var href = Jxstar.path; if (JxLang.curLang) href = Jxstar.path + '/index.jsp?currLang=' + JxLang.curLang; if (Jxstar.logoutUrl) { if (JxLang.curLang) { href = Jxstar.logoutUrl + '&currLang=' + JxLang.curLang; } else { href = Jxstar.logoutUrl; } } window.location.href = href; }); }; //如果是通过刷新退出系统 if (isAuto == true) { hdcall(); } else { //确定退出系统吗? Ext.Msg.confirm(jx.base.hint, jx.base.logoutok, function(btn) { if (btn == 'yes') hdcall(); }); } }, /** * 判断css样式在main.css中是否存在 **/ getRule: function(selector) { if (rules == null) { rules = {}; var ss = document.styleSheets; var len = ss.length; var str = ''; for (var i = 0; i < len; i++) { if (ss[i].href && ss[i].href.indexOf('main.css') >= 0) { var css = ss[i].cssRules; for (var j = 0; j < css.length; j++) { var names = css[j].selectorText.toLowerCase().split(','); for (var k = 0; k < names.length; k++) { var n = names[k].trim(); if (n.length > 0) rules[n] = css[j]; str += n + '; '; } } } } } if (rules) { return rules[selector.toLowerCase()]; } }, /** * 把功能菜单添加到权限数组中 **/ putRightNodes: function(datas) { for (var i = 0; i < datas.length; i++) { var m = datas[i]; if (m.leaf) { Jxstar.rightNodes.push(m.id); } else { if (m.children) JxUtil.putRightNodes(m.children); } } }, /** * 将字符串中的字符转为有规律的数字,ascll码值 **/ strToNum:function(content){ content = content.replace(/\"/g, "#o034"); content = content.replace(/\'/g,"#o039"); content = content.replace(/\r\n/g,"#o013#o010"); content = content.replace(/\r/g,"#o013"); content = content.replace(/\n/g,"#o010"); content = content.replace(/\t/g,"#o009"); content = content.replace(/\\/g,"#o092"); content = content.replace(/&/g,"#o025"); content = content.replace(/\+/g,"#o02B"); content = content.replace(/%/g,"#o026"); return content; }, /** * 将字符串中有规律的数字转为特定字符,ascll码值 **/ numToStr: function(content){ content = content.replace(/\#o034/g,"\""); content = content.replace(/\#o039/g,"\'") content = content.replace(/\#o013#o010/g,"\r\n"); content = content.replace(/\#o010/g,"\n"); content = content.replace(/\#o013/g,"\r"); content = content.replace(/\#o009/g,"\t"); content = content.replace(/\#o092/g,"\\"); content = content.replace(/\#o025/g,"&"); content = content.replace(/\#o02B/g,"+"); content = content.replace(/\#o026/g,"%"); return content; }, /** * 构建新的主键值 */ getId : function() { var t = (new Date()).getTime(); t++; return 'jx-'+t; }, /** * 计算树形ID的级别 */ calTreeLevel : function(treeId) { if (!treeId || treeId.length == 0 || treeId.length < 4) return 0; if (treeId.indexOf('-') >= 0) { treeId = treeId.split('-')[1]; } return Math.floor(treeId.length/4); }, /** * 执行js脚本 **/ eval: function(js) { try { if (window.execScript) { window.execScript(js); } else { window.eval(js); } } catch(e) { console.error('JxUtil.eval '+js+'; error: '+e); } }, //显示导入文件的对话框 showImpWin: function(params, hdcall) { var queryForm = new Ext.form.FormPanel({ layout:'form', labelAlign:'right', labelWidth:80, border:false, baseCls:'x-plain', autoHeight: true, bodyStyle: 'padding: 20px 10px 0 10px;', defaults: { anchor: '95%', allowBlank: false, msgTarget: 'side' }, items: [{ xtype: 'fileuploadfield', useType: 'file', fieldLabel: jx.event.selfile, //选择文件 name: 'import_file', buttonText: '', maxLength: 200, buttonCfg: { iconCls: 'upload_icon' } }] }); //创建对话框 var self = this; var win = new Ext.Window({ title:'选择文件', layout:'fit', width:400, height:170, resizable: false, modal: true, closeAction:'close', items:[queryForm], buttons: [{ text:jx.base.ok, handler:function(){ var form = queryForm.getForm(); if (!form.isValid()) return; var hd = function(data){ win.close(); if (hdcall) hdcall(data); }; //上传附件 Request.fileRequest(form, params, hd); } },{ text:jx.base.cancel, handler:function(){win.close();} }] }); win.show(); }, //加载IM工具,一般小项目不启用此套件,移动端默认启用 loadIM: function(ct) { var showed = Jxstar.systemVar.sys__im__showed || '0'; if (showed.length == 0 || showed == '0') return; var el = ct.getComponent(0).getEl(); var imicon = el.insertHtml("afterBegin", "
"); window.imicon = imicon; Ext.get(imicon).on("click", function(){ JxUtil.showIM(); }); //取IM用户信息 var params = 'funid=im_event&eventcode=im_login'; Request.postRequest(params, function(data){ var str = Ext.encode(data); localStorage.setItem('curruser_im', str); }); }, //显示IM工具 showIM: function() { window.open(Jxstar.path + '/cloud/im/index.html?_dc=' + (new Date()).getTime()); }, //显示个人信息设置 showUser: function() { var userid = Jxstar.session['user_id']; var define = Jxstar.findNode('sys_user'); JxUtil.openFunPage(define, define.formpage, '个人设置', userid); }, //显示租户信息 showTenants: function() { var ts = Jxstar.tenants, e = encodeURIComponent; if (!ts) return; var login = function(ten){ var params = 'funid=login&pagetype=login&eventcode=logout'; Request.postRequest(params, function(){ var params = 'funid=login_event&eventcode=cloud_login&user_code='+Jxstar.session['user_code']+'&user_pwd='+ts.myx+'¬_verify=1'+ '&tenant_id='+ten.tenant_id+'&tenant_name='+e(ten.tenant_name); Request.postRequest(params, function(data){ win.close(); Jxstar.viewport.destroy(); Jxstar.session = data; Request.loadJS('/public/core/JxBody.js'); }, {errorcall:function(){ window.location.href = Jxstar.path+'/index.jsp'; }}); }); }; var items = [], hi = 80, v = ts.info; for (var i = 0; i < v.length; i++) { hi += 60; items[i] = {xtype:'button', ten:v[i], text:v[i].tenant_name, width:250, height:40, margins:'20 20 0 20', handler:function(b){ login(b.initialConfig.ten);}}; } var win = new Ext.Window({ title:'选择公司', width: 300, height: hi, layout:'vbox', items:items }); win.show(); }, /** * 显示当前在线用户 **/ onLineUser: function() { var hdcall = function(grid) { Jxstar.loadInitData(grid); }; var define = Jxstar.findNode('sys_user_login'); Jxstar.showData({ filename: define.gridpage, title: define.nodetitle, pagetype: 'notool', width: 600, height: 350, callback: hdcall }); }, /** * 动态加载功能定义数据: * 如果在网速比较慢时使用会影响加载速度,直接放到index_top中了,不使用此方法了。 **/ loadJxData: function() { Ext.fly('loading').dom.innerHTML = jx.util.loading;//'正在加载功能数据文件...'; Ext.fly('loading').show(); JxUtil.loadJS('/public/data/NodeDefine.js', true); JxUtil.loadJS('/public/data/RuleData.js', true); JxUtil.loadJS('/public/locale/combo-lang-'+ JxLang.type +'.js', true); Ext.fly('loading').hide(); }, /** * 动态加载图形库文件 * hdcall -- 加载图形库后执行的函数 **/ loadJxGraph: function() { if (!window.mxClient) { //IE11用mxclient-ff.js文件 var fileName = 'mxclient-ff.jsgz'; if (Ext.isIE) { fileName = 'mxclient-ie.jsgz'; } else if (Ext.isChrome) { fileName = 'mxclient-ch.jsgz'; } //用eval方法在ie中加载报错,用execScript没问题 JxUtil.loadJS('/lib/graph/js/' + fileName); window.mxClient = mxClient; } }, /** * 同步加载js文件,加载后的文件为全局对象; * public目录中的静态文件可以缓存,通过后台类压缩管理; * url -- JS文件路径 * nocache -- 是否不使用缓存 **/ loadJS: function(url, nocache) { //第1一个字符应该是/ if (url.charAt(0) != '/') url = '/' + url; url = Jxstar.path + url; //不使用缓存时,加唯一标志 if (nocache === true) { var dc = '?dc=' + (new Date()).getTime(); url += dc; } var req = new XmlRequest('GET', url, false); req.send(); var js = req.getText(); try { if (window.execScript) { window.execScript(js); } else { window.eval(js); } } catch(e) { console.error('JxUtil.loadJS '+url+'; error: '+e); } }, /** * 动态加载css文件 * url -- css文件路径 * nocache -- 是否不使用缓存 **/ loadCss: function(url, nocache) { //第1一个字符应该是/ if (url.charAt(0) != '/') url = '/' + url; url = Jxstar.path + url; //不使用缓存时,加唯一标志 if (nocache === true) { var dc = '?dc=' + (new Date()).getTime(); url += dc; } var element = document.createElement("link"); element.setAttribute('rel','stylesheet'); element.setAttribute('type','text/css'); element.setAttribute('href',url); document.getElementsByTagName('head')[0].appendChild(element); return element; }, //加载图表库 loadCharts: function() { if (typeof echarts == "undefined") { JxUtil.loadJS('/lib/echarts/echarts.min.js'); JxUtil.loadJS('/lib/echarts/dark.js'); } }, //当前用户是否管理员 isAdminUser: function(){ var roleId = Jxstar.session['role_id']; return (roleId.indexOf('admin') >= 0); }, //选择第一行,并返回选择的记录,如果原来有选择记录,则返回原来选择的记录 firstRow: function(grid) { if (!grid) return []; var records = JxUtil.getSelectRows(grid); if (records.length > 0) return records; var s = grid.getStore(); var cnt = s.getCount(); if (cnt == 0) return []; var sm = grid.getSelectionModel(); if (sm.getSelections) { sm.selectFirstRow(); } else { sm.select(0, 0); } return [s.getAt(0)]; }, //显示一个椭圆审核标志 showAuditFlag: function(fe) { var auditcol = fe.define.auditcol; if (Ext.isEmpty(auditcol)) return; var record = fe.form.myRecord; if (Ext.isEmpty(record)) return; var getx = function(s){ var vs = Jxstar.findComboData('audit'); for (var i = 0, n = vs.length; i < n; i++) { if (vs[i][0] == s) return vs[i][1]; } return ''; }; var fg = fe.form.getEl().child('div.x-fflag'); var state = record.get(auditcol); var msg = getx(state); if (state == '0' || state == '1' || state == '6' || state == '7') {//隐藏标志 if (fg) fg.hide(); return; } else if (state == '3') {//显示已审批标志 if (fg) { fg.show(); fg.removeClass('x-fflag-blue'); fg.dom.innerHTML = msg; } else { fe.form.getEl().insertHtml('afterBegin', '
'+msg+'
'); } } else if (state == '2' || state == '4' || state == '5') {//显示未审批标志 if (fg) { fg.show(); fg.addClass('x-fflag-blue'); fg.dom.innerHTML = msg; } else { fe.form.getEl().insertHtml('afterBegin', '
'+msg+'
'); } } }, //给Combo控件添加: 请选择 insertEmpty: function(combo){ if (!combo) return; var st = combo.store; if (!st) return; var cnt = st.getCount(); if (cnt == 0) return; //如果存在就不添加 if (st.find('text', jx.star.select) >= 0) return; var record = new (st.reader.recordType)({value:'', text:jx.star.select});//请选择 jx.star.select st.insert(0, record); }, //取字段所在的列号 getColumnIndex: function(grid, colname){ var isCheck = grid.getSelectionModel() instanceof Ext.grid.CheckboxSelectionModel; var mycols = grid.gridNode.param.cols; for (var i = 0, n = mycols.length; i < n; i++) { if (mycols[i].col.name == colname) { //排除序号列与checkbox列 return i + (isCheck ? 2:1); } } return -1; }, //检查当前表格中选择的记录的值必填项及长度是否有效 validateGrid: function(grid) { //取第二个Tab的表单 var isReqCheck = true, myForm = null, nnfs = null; if (grid.isXType('editorgrid') == false) { var f = JxUtil.getMyForm(grid); if (f) { myForm = f.getForm(); } else { f = JxUtil.getCloudForm(grid); if (f) { myForm = f.getForm(); } else { //Layout_Cloud布局又没有新增按钮的功能会找不到form对象,需要生成必填项字段信息 nnfs = grid.gridNode.param.notNullFields; if (!nnfs || nnfs.length == 0) { //如果是普通表格,又没有找到表单对象;又没有表必填字段 isReqCheck = false; } } } } if (isReqCheck == false) return true; var cm = grid.getColumnModel(); var records = JxUtil.getSelectRows(grid); var hint = function(record, name){ var index = grid.getStore().indexOf(record); var label = cm.getColumnHeader(cm.findColumnIndex(name)); var hint = String.format(jx.event.auditvalid, index+1, label); JxHint.alert(hint); //第【{0}】条记录的【{1}】数据不完整! return false; }; for (var i = 0; i < records.length; i++) { var record = records[i]; var fields = record.fields.keys; for (var j = 0; j < fields.length; j++) { var name = fields[j]; var value = record.data[name]; if (value == null) value = ''; //判断必填字段 if (nnfs && nnfs.length > 0) { if (nnfs.indexOf(name+';') >= 0 && value.length == 0) { return hint(record, name); } } //如果可编辑表格,则取表格字段,否则取表单字段 var field = null; if (grid.isXType('editorgrid')) { var colIndex = cm.findColumnIndex(name); var rowIndex = grid.getStore().indexOfId(record.id); var editor = cm.getCellEditor(colIndex, rowIndex); if (editor) field = editor.field; } else { if (myForm) { field = myForm.findField(name); } } if (field != null && !field.validateValue(value)) { return hint(record, name); } } } return true; }, //提交前,模拟审批节点与审批人 tmpProcess: function(funId, dataId, srcPage) { var self = this; var isredo = Jxstar.systemVar.wf__tmpnode__isredo||'0'; var params = 'funid=wf_temp_node&eventcode=tmpnode&check_funid='+ funId +'&keyid='+ dataId+'&isredo='+isredo; var endcall = function(data) { self.showTmpNode(funId, dataId, srcPage); }; Request.dataRequest(params, endcall); }, //显示模拟审批节点与审批人 showTmpNode: function(funId, dataId, srcPage) { var define = Jxstar.findNode('wf_temp_node'); var hdcall = function(page) { var options = { where_sql: 'wf_temp_node.fun_id = ? and wf_temp_node.data_id = ? ', where_type: 'string;string', where_value: funId+';'+dataId }; page.tmpFunId = funId; page.tmpDataId = dataId; page.srcChkPage = srcPage; Jxstar.loadData(page, options); }; Jxstar.showData({ filename: define.gridpage, pagetype: 'grid', title: define.nodetitle, callback: hdcall }); }, //获取流程扩展属性,根据功能ID processAttr: function(funId, name, def) { if (!JxUtil.ProcessData) return def; var datas = JxUtil.ProcessData; for (var key in datas) { //取功能ID相等的属性对象;如果一个功能配置了多个审批,则取其中任意一个;主要用于 wfedituser 属性 if (funId == datas[key].funid) { return datas[key][name]; } } return def; }, //获取流程扩展属性,根据流程ID processAttrX: function(processId, name, def) { if (!processId || processId.length == 0) return def; if (!JxUtil.ProcessData) return def; var prod = JxUtil.ProcessData[processId]; if (prod == null) { return def; } return prod[name]; }, //提交前,检查子表数据是否保存 checkSubGrid: function(fpage) { //取明细表的panel var subps = fpage.subgrids; if (subps == null || subps.length == 0) return true; for (var i = 0; i < subps.length; i++) { var subgrid = subps[i].getComponent(0); if (subgrid.isXType('grid')) { var store = subgrid.getStore(); var mrow = store.getModifiedRecords(); if (mrow.length > 0) { JxHint.alert(subps[i].title + jx.util.subno);//'子表数据没有保存,不能执行此操作!' return false; } } } return true; }, //添加附件类型控件,增加index参数方便设置初始显示类型 addAttachCombo: function(grid, combocode, index) { index = index || 0; grid.attachTypeCombo = function() { var typedata = Jxstar.findComboData(combocode); return { anchor:'60%', xtype:'combo', name:'attach_type_combo', fieldLabel:jx.util.doctype,//'资料类型', store: new Ext.data.SimpleStore({ fields:['value','text'], data: typedata }), emptyText: jx.star.select, mode: 'local', triggerAction: 'all', valueField: 'value', displayField: 'text', editable:false, value: typedata[index][0] }; }; }, //主表没数据标志 _NODATA : '-nodata-', isEmptyFK : function(fk){ return (!fk || fk.length == 0 || fk == this._NODATA); }, //根据表格取表单对象 getMyForm: function(myGrid) { var tabPanel = myGrid.findParentByType('tabpanel'); if (tabPanel == null) return null; if (tabPanel.getComponent(1) == null) return null; var formPanel = tabPanel.getComponent(1).getComponent(0); if (formPanel == null || !formPanel.isXType('form')) { return null; } return formPanel; }, //取云布局中的表格 getCloudForm: function(myGrid) { var funid = myGrid.gridNode.nodeId; var layout = JxCloud.apps[funid]; if (!layout) return; var fpage = layout.getComponent(1); if (!fpage) return; //修改多tab的form取不到对象的问题 var cform = fpage.getComponent(0); if (!cform || cform.isXType('form') == false) { cform = fpage.getComponent(0).getComponent(0); } return cform; }, //根据表单取表格对象 getMyGrid: function(myForm) { //取到tab控件,而后取第一个页面中的表格 var tabPanel = myForm.findParentByType('tabpanel'); if (!tabPanel || tabPanel.isXType('tabpanel') == false) { return; } var grid = tabPanel.getComponent(0).getComponent(0); if (!grid || grid.isXType('grid') == false) { return; } return grid; }, //在功能区域的表单或子表中取得父功能的表格 getParentGrid: function(childCmp) { if (!childCmp) return; //增加参数parentGrid,方便在复杂布局中自定义父表格 var pg = childCmp.parentGrid; if (pg && pg.isXType('grid')) return pg; var gn = childCmp.gridNode; if (gn && gn.define.isCloud) { var pform = JxUtil.getParentForm(childCmp); if (pform) { return pform.myGrid; } else { return; } } //取到tab控件,而后取第一个页面中的表格 var tabPanel = childCmp.findParentByType('tabpanel'); if (!tabPanel || tabPanel.isXType('tabpanel') == false) { return; } var grid = tabPanel.getComponent(0).getComponent(0); if (!grid || grid.isXType('grid') == false) { return; } return grid; }, //根据form在的子表取到父form对象 getParentForm: function(subGrid, isCmp) { //普通layout_cloud布局,能取到form var form = subGrid.findParentByType('form'); if (Ext.isEmpty(form)) { var tabPanel = subGrid.findParentByType('tabpanel'); if (!tabPanel) return null; var pform = tabPanel.getComponent(1); if (!pform) return null; //普通layout_main布局,能取到form form = pform.getComponent(0); if (!form) { return null; } else { if (!form.isXType('form')) {//subTabHeader布局表单,能取到form var cmp = tabPanel.getComponent(0); form = cmp.getComponent(0); if (!form || !form.isXType('form')) return null; } } } if (isCmp) { return form; } else { return form.getForm(); } }, //在功能区域的表格或表单中取到布局页面中的树形控件 getLayoutTree: function(childCmp) { var tabPanel; //如果是云布局,则直接取功能布局 if (childCmp.formNode) { var define = childCmp.formNode.define; if (define.isCloud) { tabPanel = JxCloud.apps[define.nodeid]; } } if (!tabPanel) { //取到tab控件,再取上级容器对象 tabPanel = childCmp.findParentByType('tabpanel'); if (!tabPanel || tabPanel.isXType('tabpanel') == false) return null; } //左边第一个子控件是树 var tree = tabPanel.ownerCt.ownerCt.getComponent(0).getComponent(0); if (!tree || tree.isXType('treepanel') == false) return null; return tree; }, //给树形控件添加本级选项 treeAddCheck: function(tree) { if (!tree) return; var tool = tree.getTopToolbar(); var tools = tree.getTopToolbar().find('xtype', 'checkbox'); if (tools.length > 0) return; tool.insert(1, '->'); tool.insert(2, {xtype:'checkbox', boxLabel:jx.util.curlevel});//'本级' tool.doLayout(); }, //显示表格合计数据在分页工具栏中 viewSumData: function(grid) { var bbar = grid.getBottomToolbar(); if (!bbar) return; var sumdata = grid.getStore().reader.jsonData.data.sum; if (Ext.isEmpty(sumdata)) return; sumdata = sumdata[0]; var cm = grid.getColumnModel(); var sumText = jx.util.total;//'合计:'; Ext.iterate(sumdata, function(key, value){ var header = cm.getColumnById(key).header; sumText += header + ':' + value + ' '; }); var sumItem = bbar.sumItem; if (Ext.isEmpty(sumItem)) { var idx = bbar.items.indexOf(bbar.refresh); sumItem = new Ext.Toolbar.TextItem(sumText); bbar.insert(idx + 1, new Ext.Toolbar.Separator()); bbar.insert(idx + 2, sumItem); bbar.sumItem = sumItem; } else { sumItem.setText(sumText); } bbar.doLayout(); }, /** * 显示FORM表单的对话框 * {wincfg, formcfg, okcall, nocall} -- 表单配置信息,参数:{items:[], width:200, height:100} * okcall -- 确定的回调函数 **/ formWindow: function(config) { var formcfg = { layout:'form' }; formcfg = Ext.apply(formcfg, config.formcfg||{}); var winForm = new Ext.form.FormPanel(formcfg); //创建对话框 var self = this; var wincfg = { title:jx.base.inputtext, layout:'fit', width:config.width||400, height:config.height||160, resizable: false, modal: true, closeAction:'close', items:[winForm], buttons: [{ text:jx.base.ok, //确定 handler:function(){ if (config.okcall){ config.okcall(winForm.getForm(), win); } else { win.close(); } } },{ text:jx.base.cancel, //取消 handler:function(){ if (config.nocall){ config.nocall(win); } else { win.close(); } } }] }; wincfg = Ext.apply(wincfg, config.wincfg||{}); var win = new Ext.Window(wincfg); win.show(); }, /** * 修改密码 * userId -- 需要修改密码的用户ID **/ setPass : function(userId, loginFn) { //密码输入界面 var passForm = new Ext.form.FormPanel({ layout:'form', labelAlign:'right', style: 'padding:20px 10px 0 0 ;', border: false, frame: false, baseCls: 'x-plain', items:[//'原密码' {xtype:'textfield', fieldLabel:jx.sys.oldpwd, name:'modfiy_pass__old_pass', inputType: 'password', allowBlank:false, labelSeparator:'*', labelStyle:'color:#0077FF;', anchor:'97%', maxLength:20},//'新密码' {xtype:'textfield', fieldLabel:jx.sys.newpwd, id:'modfiy_pass__new_pass', inputType: 'password', allowBlank:false, labelSeparator:'*', labelStyle:'color:#0077FF;', anchor:'97%', maxLength:20},//'确认新密码' {xtype:'textfield', fieldLabel:jx.sys.conpwd, id:'modfiy_pass__confirm_pass', inputType: 'password', allowBlank:false, labelSeparator:'*', labelStyle:'color:#0077FF;', anchor:'97%', maxLength:20}, {xtype:'label',fieldLabel:'*新密码长度最少为8位*
*必须同时包含数字、大写字母、小写字母!*',labelStyle:'text-align:center;width:320px;color:red;',anchor:'97%'} ] }); //显示修改密码的界面 var win = new Ext.Window({ title:jx.sys.modpwd, //'修改密码' layout:'fit', width:350, height:260, resizable: false, modal: true, closeAction:'close', items:[passForm], buttons: [{ text:jx.base.ok, //'确定' handler:function(){ //数据校验 if (!passForm.getForm().isValid()) { JxHint.alert(jx.event.datavalid); //'请确保输入的数据正确完整!' return; } var myform = passForm.getForm(); var oldpass = myform.findField('modfiy_pass__old_pass').getValue(); var newpass = myform.findField('modfiy_pass__new_pass').getValue(); var confirmpass = myform.findField('modfiy_pass__confirm_pass').getValue(); if (newpass != confirmpass) { JxHint.alert(jx.sys.twopwd); //'请确保两次输入的新密码相同!' return; } var checked_input_message = JxUtil.base64(JxUtil.base64(newpass)); Ext.util.Cookies.set('checked_input_message', checked_input_message, (new Date()).add(Date.MONTH, 1)); //请求参数 var params = 'funid=sys_user&oldpass='+ oldpass +'&newpass='+ newpass; params += '&keyid=' + userId; params += '&pagetype=editgrid&eventcode=setpass'; //发送后台请求 Request.postRequest(params, function(data, extd){ win.close(); //登录时修改密码成功,然后直接登录 if (loginFn) loginFn(); }); } },{ text:jx.base.cancel, //'取消' handler:function(){win.close();} }] }); win.show(); }, //-----------------------------------------处理表单字段排版状态---------------------------------------- //先保存所有审批配置字段,然后恢复原界面字段显示效果 restoreField: function(form, allFields) { if (!allFields || allFields.length == 0) return; var cfs = form.checkFields; if (!cfs) { var fields = allFields.split(';'); //先保存:显示、隐藏、可编辑、只读、必填、非必填的字段 var shows = '', hides = '', edits = '', onlys = '', musts = '', nmusts = ''; for (var i = 0; i < fields.length; i++) { var fn = fields[i].replace('.', '__'); if (fn.length == 0) continue; var field = form.findField(fn); if (!field) continue; //需要只读的字段 if (field.readOnly) { onlys += fn+';'; } else { edits += fn+';'; } //需要隐藏的字段 if (field.hidden) { hides += fn+';'; } else { shows += fn+';'; } //需要必填的字段 if (field.allowBlank === false) { musts += fn+';'; } else { nmusts += fn+';'; } } form.checkFields = { alls : allFields, shows : shows, hides : hides, edits : edits, onlys : onlys, musts : musts, nmusts: nmusts }; } else { //恢复字段原来的状态 JxUtil.setfields(form, cfs.nmusts, '5');//改非必填 JxUtil.setfields(form, cfs.edits, '0');//改编辑 JxUtil.setfields(form, cfs.onlys, '1');//改只读 JxUtil.setfields(form, cfs.shows, '2');//改显示 JxUtil.setfields(form, cfs.hides, '3');//改隐藏 JxUtil.setfields(form, cfs.musts, '4');//改必填 } }, //设置字段状态 setfields : function(form, cols, type) { if (!cols || cols.length == 0) return; var fields = cols.split(';'); //alert('fields=' + fields + '; type='+type); for (var i = 0; i < fields.length; i++) { var fn = fields[i].replace('.', '__'); if (fn.length == 0) continue; var field = form.findField(fn); if (!field) continue; if (type == '0') { field.setReadOnly(false);//改编辑 } else if (type == '1') { field.setReadOnly(true);//改只读 } else if (type == '2') { field.show();//改显示 } else if (type == '3') { field.hide();//改隐藏 } else if (type == '4') { field.allowBlank = false;//改必填 field.setReadOnly(false); var label = field.label; if (label.dom) { var text = label.dom.innerHTML; if (text.indexOf('*') < 0) { label.dom.innerHTML = text+'*'; label.dom.style.color = '#0077FF'; } } } else if (type == '5') { field.allowBlank = true;//改非必填 var label = field.label; if (label.dom) { var text = label.dom.innerHTML; if (text.indexOf('*') >= 0) { label.dom.innerHTML = text.replace('*', ''); label.dom.style.color = '#333333'; } } } } }, /** * 审批过程中,显示表单中:改编辑、改只读、改显示、改隐藏 的字段 * pos 0 - 开始、1 - 审批、2 - 预览 **/ showCheckField: function(nodeId, dataId, form, pos, isaudit) { //先编辑再只读、先显示再隐藏 var hdCall = function(data) { //先恢复原状,再重新控制字段显示效果 JxUtil.restoreField(form, data.allFields, isaudit); if (!isaudit) {//已归档的记录不做处理 JxUtil.setfields(form, data.editFields, '0'); } JxUtil.setfields(form, data.onlyFields, '1'); JxUtil.setfields(form, data.showFields, '2'); JxUtil.setfields(form, data.hideFields, '3'); JxUtil.setfields(form, data.mustFields, '4'); }; var params; if (pos == '0') {//单据界面 params = 'funid=wf_node_field&eventcode=startfield&wf_funid='+ nodeId +'&data_id='+ dataId; } else if (pos == '1') {//审批界面 params = 'funid=wf_node_field&eventcode=wffields&wf_funid='+ nodeId +'&data_id='+ dataId; } else if (pos == '2') {//预览界面 params = 'funid=wf_node_field&eventcode=prefield&nodeid='+ nodeId +'&processid='+ dataId; } else if (pos == '3') {//审批通过的界面 params = 'funid=wf_node_field&eventcode=endfield&wf_funid='+ nodeId +'&data_id='+ dataId; } //从后台查询任务信息 Request.dataRequest(params, hdCall); }, //------------------------------------------------------------------------------------------------- /** * 显示待审批的记录 * nodeId -- 功能ID * dataId -- 数据ID * userId -- 用户ID **/ showCheckData: function(nodeId, dataId, userId) { Jxstar.pageSize=500; //取功能对象信息 var define = Jxstar.findNode(nodeId); if (define == null) { JxHint.alert(String.format(jx.star.nopage, nodeId)); //'没有定义【{0}】功能页面信息!' return false; } //缺省审批界面,如果为空则是form if (Ext.isEmpty(define.showform)) { define.showform = 'form'; } //构建页面参数 var pkcol = define.pkcol.replace('__', '.'); var pageParam = { pageType: 'check', whereSql: pkcol +' in (select data_id from wf_assign where run_state = ? and assign_userid = ? and fun_id = ?)', whereValue: '0;'+userId+';'+nodeId, whereType: 'string;string;string', showType: define.showform, //指定缺省显示表单页面,grid, form, report,如果为空则是form updateId: dataId }; if (Ext.isEmpty(define.checkPage)) { Jxstar.createNode(nodeId, pageParam); } else { //支持指定显示审批表单界面,避免晃动的效果 var pageUrl = define.checkPage; var title = define.nodetitle + jx.base.check; JxUtil.openFunPage(define, pageUrl, title, dataId, null, 'chkform'); } }, /** * 打开一个指定页面的功能标签 */ openFunPage: function(define, pageurl, title, dataid, hdcall, ptype) { if (Ext.isString(define)) {//如果是string表示传递的是funId define = Jxstar.findNode(define); if (define == null) { JxHint.alert(String.format(jx.star.nopage, nodeId)); //'没有定义【{0}】功能页面信息!' return; } } var id = 'fun_'+define.nodeid+'_xx'; Request.loadJS(pageurl, function(f){ if (!ptype) ptype = 'form'; var page = f().showPage(ptype); var mainTab = Jxstar.sysMainTab; var funTab = mainTab.getComponent(id); if (funTab != null) { mainTab.remove(funTab, true); funTab = null; } //显示数据 funTab = mainTab.add({ id: id, label: title, border: false, layout: 'fit', closable: true, iconCls: 'function', items: [page] }); mainTab.activate(funTab); var pkcol = define.pkcol.replace('__', '.'); var mycall = function(page){ //加载显示数据 var options = { where_sql: pkcol+' = ?', where_type: 'string', where_value: dataid, callback: function(data) { if (data.length > 0) { var r = page.formNode.event.newRecord(data[0]); page.getForm().myRecord = r; page.getForm().loadRecord(r); page.formNode.event.initForm(); } } }; Jxstar.queryData(define.nodeid, options); }; if (!hdcall) hdcall = mycall; hdcall(page); }); }, /** * 显示已审批的记录 * nodeId -- 功能ID * dataId -- 数据ID * userId -- 用户ID **/ showCheckHisData: function(nodeId, dataId, userId) { //取功能对象信息 var define = Jxstar.findNode(nodeId); if (define == null) { JxHint.alert(String.format(jx.star.nopage, nodeId)); //'没有定义【{0}】功能页面信息!' return false; } //构建页面参数 var pkcol = define.pkcol.replace('__', '.'); var pageParam = { pageType: 'chkqry', //chkqry用chk是查看历史审批意见时不受数据权限控制,如果用check会出现审批按钮显示在工具栏中,用grid会受数据权限控制 //whereSql: ' exists (select * from wf_assignhis where check_userid = ? and fun_id = ? and data_id = '+ pkcol +')', //whereValue: userId+';'+nodeId, whereSql: pkcol +' = ?', whereValue: dataId, whereType: 'string', showType: 'form', updateId: dataId }; if (Ext.isEmpty(define.checkPage)) { Jxstar.createNode(nodeId, pageParam); } else { //支持指定显示审批表单界面,避免晃动的效果 var pageUrl = define.checkPage; var title = define.nodetitle; JxUtil.openFunPage(define, pageUrl, title, dataId); } }, /** * 处理auditing字段状态徽标 **/ getAuditBadge: function(value) { //静态变量,只构建一次 if (!JxUtil.AuditBadge) { var audit = Jxstar.findComboData('audit'); var auditbadge = { '0':''+ audit[0][1] +'',//未提交 '1':''+ audit[1][1] +'',//已提交 '2':''+ audit[2][1] +'',//审批中 '3':''+ audit[3][1] +'',//已审批 '4':''+ audit[4][1] +'',//已否决 '6':''+ audit[5][1] +'',//已退回 '7':''+ audit[6][1] +''//已注销 }; JxUtil.AuditBadge = auditbadge; } return JxUtil.AuditBadge[value]; }, /** * 显示流程相关信息界面 * appData -- 相关数据 * fileName -- 相关信息界面文件 **/ showCheckWindow: function(appData, fileName) { var hdCall = function(f) { f.showWindow(appData); }; //加载信息界面文件 Request.loadJS('/jxstar/studio/pub/'+ fileName +'.js', hdCall); }, /** * 显示业务表单数据界面 * funId -- 功能ID * dataId -- 数据ID **/ showFormData: function(funId, dataId) { var define = Jxstar.findNode(funId); var pkcol = define.pkcol.replace('__', '.'); var hdcall = function(page) { var options = { where_sql: pkcol + ' = ?', where_type: 'string', where_value: dataId, callback: function(data) { if (data.length == 0) { JxHint.alert(jx.util.nodata); //'没有找到业务记录!' } else { var r = page.formNode.event.newRecord(data[0]); page.getForm().myRecord = r; page.getForm().loadRecord(r); //初始化事件 page.formNode.event.initForm(); } } }; Jxstar.queryData(funId, options); }; Jxstar.showData({ filename: define.formpage, pagetype: 'form', title: define.nodetitle, callback: hdcall }); }, /** * 取工具栏中的按钮 * toolBar -- 工具栏 * eventCode -- 事件代号 **/ getButton: function(toolBar, eventCode) { if (!toolBar) return; if (toolBar.isXType) { return toolBar.find('eventCode', eventCode)[0]; } else { return toolBar.query('button[eventcode="'+eventCode+'"]')[0]; } }, /** * 在表单INC中取指定字段名的配置信息 * items -- 配置对象 * name -- 字段名 **/ findFormItem: function(items, name) { var item = null; var findv = function(items, name) { if (item) return; for (var i = 0; i < items.length; i++) { if (items[i].items) { findv(items[i].items, name); } else { if (items[i].name == name) { item = items[i]; return item; } } } }; findv(items, name); return item; }, /** * 取当前表格每页记录数设置 * grid -- 当前表格对象 **/ getPageSize: function(grid) { //可以直接表格对象的每页记录数,方便子表设置 var pageSize = Jxstar.pageSize; //根据分页工具栏取每页记录数 var bbar = grid.getBottomToolbar(); if (bbar && bbar.isXType('paging')) { pageSize = bbar.pageSize; } else { var pbar = grid.pagebar; if (pbar) { pageSize = pbar.pageSize; } else { //如果分页工具栏放在顶部了 var tbar = grid.getTopToolbar(); if (tbar) { var pbar = tbar.findByType('paging')[0]; if (pbar) { pageSize = pbar.pageSize; } else { //如果没有找到分页栏,就设置每页10000条记录 pageSize = 10000; } } } } return pageSize; }, /** * 云布局下,取子表的工具栏对象 * subgrid -- 子表格对象 **/ disCloudTool: function(subgrid, disable) { subgrid.el.removeClass('gridEdit');//先删除 if(!disable) subgrid.el.addClass('gridEdit');//再根据是否可编辑,可编辑的添加 var bar = JxUtil.getCloudTool(subgrid); if (!bar) return; if (bar.isXType) { JxUtil.disableButton(bar, disable); } else { var btns = bar.query('button[righttype="edit"]'); var oths = bar.query('button[righttype="other"]'); if (oths && oths.length > 0) {btns = btns.concat(oths);} for (var i = 0; i < btns.length; i++) { btns[i].disabled = disable; } } }, getCloudTool: function(subgrid) { var bar = subgrid.getTopToolbar(); if (!bar) { var ct = subgrid.ownerCt; bar = ct.header; if (!bar) {//再取tab容器标题工具栏 bar = ct.tabtooler; if (!bar) return; } } return bar; }, //获取checkboxgroup, radiogroup分组数据 getGroupData: function(code) { var datas = Jxstar.findComboData(code); var data = []; for(var i= 0; i < datas.length; i++){ var label = datas[i][1]; var val = datas[i][0]; if (val == '0') val = parseInt(val);//如果选项值是0,必须用数字,不能用'0',否则控件不能操作 data.push({boxLabel:label, inputValue:val, name:'radio_'+code}); } return data; }, //根据值取显示值 getGroupText: function(value, code) { if (!value || !code) return ''; var datas = Jxstar.findComboData(code); var vs = value.split(','); var ts = ''; for (var i = 0; i < vs.length; i++) { for (var j = 0; j < datas.length; j++) { if (vs[i] == datas[j][0]) { ts += datas[j][1] + ','; } } } return ts.substring(0, ts.length-1); }, /** * 设置编辑权限的按钮为disable状态,用于处理已复核记录设置编辑按钮为disable * toolBar -- 工具栏 * disable -- 是否不可用 **/ disableButton: function(toolBar, disable) { if (!toolBar) return; var btns = toolBar.find('rightType', 'edit'); var oths = toolBar.find('rightType', 'other'); if (oths && oths.length > 0) {btns = btns.concat(oths);} Ext.each(btns, function(btn){btn.setDisabled(disable);}); }, /** * 设置表单的字段是否为只读 * form -- 表单对象BasicForm * readOnly -- 只读:true 设置所有字段为只读,false 设置字段恢复为原状态 **/ readOnlyForm: function(form, readOnly) { if (readOnly == true) { //修改所有字段为只读,不可编辑 form.fieldItems().each(function(f){ if (f.isXType('field')) { if (f.isXType('checkbox', true) || f.isXType('radio', true) || f.isXType('checkboxgroup', true) || f.isXType('radiogroup', true)) { f.setDisabled(true); } else { f.setReadOnly(true); } } }); } else { //修改所有字段为非只读,但如果字段原属性为只读,则不处理 form.fieldItems().each(function(f){ var initReadOnly = f.initialConfig.readOnly; var initDisabled = f.initialConfig.disabled; if (f.isXType('field')) {//添加fileuploadfield,解决disable后不能enable的问题 if (f.isXType('checkbox', true) || f.isXType('radio', true) || f.isXType('checkboxgroup', true) || f.isXType('radiogroup', true) || f.isXType('fileuploadfield', true)) { if (!initDisabled) { f.setDisabled(false); } } else { if (!initReadOnly) { f.setReadOnly(false); } } } }); } }, /** * 判断功能表单数据是否在修改中 **/ isModifyForm: function(fpage){ if (!fpage || !fpage.formNode) return false; if (fpage.getForm().isDirty()) return true; var gs = fpage.findByType('grid'); if (gs && gs.length > 0) { for (var i = 0; i < gs.length; i++) { var store = gs[i].getStore(); if (gs[i].gridNode && store) { var mrow = store.getModifiedRecords(); if (mrow && mrow.length > 0) { return true; } } } } return false; }, /** * 格式化number(n),处理数字的n位小数位数,用于grid.editor.renderer。 * 系统组件Ext.util.Format.number()也支持该功能,但性能有差异。 **/ formatNumber: function(n){ return function(v){ if (n == null || isNaN(n)) n = 2; return (v !== undefined && v !== null && v !== '') ? parseFloat(parseFloat(v).toFixed(n)) : ''; }; }, //n 表示保留几位小数 formatMoney: function(n){ return function(v){ if (n == null || isNaN(n)) n = 2; var f = '0,000'; if (n > 0) f += '.'; for (var i = 0; i < n; i++) { f += '0'; } v = (v !== undefined && v !== null && v !== '') ? Ext.util.Format.number(v, f) : ''; //金额样式小数位中的零是否要显示 var haszero = Jxstar.systemVar.sys__money__zero || '0'; if (haszero == '1') return v; //把小数位后面的多余0去掉 if (v.indexOf('.') >= 0) { var c = 0;//要去掉的字符个数 for (var i = v.length-1; i >= 0; i--) { if (v.charAt(i) == '0') { c++; } else { break; } } //小数位全部是0,则连.也去掉 if (n == c) c++; v = v.substr(0, v.length-c); } return v; }; }, /** * 格式化int整数,用于grid.editor.renderer。 **/ formatInt: function(){ return function(v){ return (v !== undefined && v !== null && v !== '') ? parseInt(v) : ''; }; }, /** * 表格中的数据保存为csv文件, * 原有一个gridToExcel.getExcelXml方法可以输出为xls文件,但它的格式是xml,在linux下无法打开,所以采用csv格式的文件。 * grid -- 数据表格 * includeHidden -- 是否输出隐藏字段 */ gridToCSV: function(grid, includeHidden) { //文件内容 var fileContent = ''; var cm = grid.getColumnModel(); //去掉特殊字符 var dec = function(s){ if (Ext.isString(v)) { return s.replace(/,/ig, ';'); } else { return s; } }; //输出分组标题 var groups = ''; var rows = cm.rows;//支持多行分组标题 if (rows && rows.length > 0) { for (var n = 0; n < rows.length; n++) { var r = rows[n]; for (var i = 0; i < r.length; i++) { var cs = r[i].colspan; if (i == 0) cs = cs-1;//去掉序号列 groups += dec(r[i].header)+','; if (cs > 1) { for (var j = 0; j < cs-1; j++) { groups += ','; } } } if (groups.length > 0) { groups = groups.substr(0, groups.length-1); fileContent += groups + '\n'; groups = ''; } } } //输出表格标题 var title = ''; var colCount = cm.getColumnCount(); for (var i = 0; i < colCount; i++) { if (cm.getDataIndex(i).length > 0 && (includeHidden || !cm.isHidden(i))) { title += dec(cm.getColumnHeader(i)) + ','; } } if (title.length > 0) { title = title.substr(0, title.length-1); } //输出表格内容 var content = '', row = '', r; for (var i = 0, it = grid.store.data.items, l = it.length; i < l; i++) { r = it[i].data; var k = 0; for (var j = 0; j < colCount; j++) { if ((cm.getDataIndex(j).length > 0) && (includeHidden || !cm.isHidden(j))) { var v = r[cm.getDataIndex(j)]; v = Ext.isDate(v) ? v.dateFormat('Y-m-d H:i:s') : v; k++; row += dec(v) + ','; } } if (row.length > 0) { row = row.substr(0, row.length-1); } //保存每行数据 content += row + '\n'; row = ''; } fileContent += title + '\n'; fileContent += content + '\n'; return fileContent; }, /** * 创建一个新的随机ID值 */ newId: function() { return JxUtil.uuid(8,16); }, /** * 创建表单临时主键 */ getTmpKeyId: function() { return 'tmp-'+JxUtil.uuid(20,16); }, /** * 创建唯一ID,len 表示长度, radix 表示进制 * uuid(8, 2) // 01001010 * uuid(8, 10) // 47473046 * uuid(8, 16) // 098f4d35 * uuid() // cc75515e-859d-453e-be02-75ae1d919818 */ uuid: function(len, radix) { var chars = '0123456789abcdefghijklmnopqrstuvwxyz'.split(''); var uuid = [], i; radix = radix || chars.length; if (len) { // Compact form for (i = 0; i < len; i++) uuid[i] = chars[0 | Math.random()*radix]; } else { // rfc4122, version 4 form var r; // rfc4122 requires these characters uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; uuid[14] = '4'; // Fill in random data. At i==19 set the high bits of clock sequence as // per rfc4122, sec. 4.1.5 for (i = 0; i < 36; i++) { if (!uuid[i]) { r = 0 | Math.random()*16; uuid[i] = chars[(i == 19) ? (r & 0x3) | 0x8 : r]; } } } return uuid.join(''); }, /** * 创建一条空记录 * store -- 存储对象 */ emptyRecord: function(store) { var record = new (store.reader.recordType)({}); var cols = record.fields.keys; //给每个字段给空值 for (var i = 0; i < cols.length; i++){ record.set(cols[i], ''); } return record; }, //获取Html转义字符 htmlEncode: function( html ) { return document.createElement( 'a' ).appendChild( document.createTextNode( html ) ).parentNode.innerHTML; }, //获取Html htmlDecode: function( html ) { var a = document.createElement( 'a' ); a.innerHTML = html; return a.textContent; }, /** * FORM中字段控件添加CTRL+F1事件查看字段帮助说明; * 根据字段名,分解为表名与字段名,从数据模型中取字段解释说明。 * * field -- 字段控件 * event -- 按钮事件 */ specialKey: function(field, event) { //CTRL+F1事件 if (event.ctrlKey && event.keyCode == event.F1) { //取表名与字段名 var ft = field.name.split('__'); //显示字段信息 var showField = function(data) { var html = "
"+JxUtil.htmlEncode(data.info)+"
"; var win = new Ext.Window({ title:jx.util.seefield, //'查看字段信息' layout:'fit', width:450, height:250, resizable: true, modal: true, style: '', closeAction:'close', html:html, buttons: [{ text:jx.base.ok, //'确定' handler:function(){win.close();} }] }); win.show(); }; //发送请求 var params = 'funid=dm_fieldcfg&table_name=' + ft[0] + '&field_name=' + ft[1]; params += '&eventcode=queryfield'; Request.postRequest(params, showField); } }, /** * FORM中字段控件值修改后触发的事件 * 注意:TextArea控件在添加x-grid3-dirty-cell样式后无效, * 所以去掉了ext-all.css中的.x-form-text, textarea.x-form-field背景图片样式。 * * field -- 字段控件 * newValue -- 修改后的值 * oldValue -- 修改前的值 */ changeValue: function(field, newValue, oldValue) { if (field.isDirty()) { field.addClass('x-grid3-dirty-cell'); } else { field.removeClass('x-grid3-dirty-cell'); } }, /** * 清除FORM表单中所有字段的修改标记,设置最新的原始值 * form -- form控件 */ clearDirty: function(form) { form.fieldItems().each(function(f){ var name = f.name; if (name != null && name.length > 0) { f.removeClass('x-grid3-dirty-cell'); f.originalValue = f.getValue(); } }); }, /** * 如果字段值长度超过了field控件长度,支持显示提示信息 * form -- formPanel */ fieldValueTip: function(formPanel) { var fields = formPanel.findByType('textfield'); if (fields && fields.length > 0) { Ext.each(fields, function(item){ if (item.isXType('textarea') || item.isXType('datefield') || item.isXType('numberfield')) return; var v = item.getValue(); var len = JxUtil.strlen(v);//初步约定每个字符8像素 var width = item.getWidth(); if (item.tip || ((len*8 > width) && item.el)) { if (!item.tip) { item.tip = new Ext.ToolTip({ target: item.el, html: v }); //alert(len + ';' + width + ';' + item.getName()); } else { if (item.tip.body) {//鼠标没提示时body=null item.tip.body.dom.innerHTML = v; } else { item.tip.html = v; } } } }); } }, /** * 取当前表单中的修改了值的字段名。 * 由于保存方法经常需要取字段值做运算处理,但这些又没有修改, * 所以要把所有值传递到后台,同时传递哪些字段的值修改了。 **/ getDirtyFields: function(form) { var name, fields = ''; form.fieldItems().each(function(f){ name = f.name; if (name != null && name.length > 0 && f.isDirty()) { fields += name.replace('__', '.') + ';'; } }); if (fields.length > 1) { fields = fields.substr(0, fields.length - 1); } return fields; }, /** * 取当前表单的值,组成URL,格式如:&name1=value1&name2=value2... * BasicForm.getValues(true)方法不能处理checkbox,combo的值。 * dirtyOnly -- 是否只处理脏数据 **/ getFormValues: function(form, dirtyOnly) { var name, val, data = '', e = encodeURIComponent; form.fieldItems().each(function(f){ name = f.name; val = f.getValue(); val = Ext.isDate(val) ? val.dateFormat('Y-m-d H:i:s') : val; if (name != null && name.length > 0 && (dirtyOnly !== true || f.isDirty())) { data += '&' + e(name) + '=' + e(val); } }); return data; }, /** * 获取字段校验的错误提示信息。 **/ getErrors: function(form) { var msg = ''; form.items.each(function(f){ if(!f.validate()){ msg += '【'+f.initialConfig.fieldLabel+'】'+f.activeError+' | '; } }); if (msg.length > 0) { msg = '如下字段无效:'+msg; } return msg; }, /** * 解析查询值中的页面参数,参数格式:[table_name.field_name] * whereValue -- 查询值,其中可能含页面参数 * tagRecord -- 页面记录集,字段名格式为table_name__field_name * isBig -- 是否大括号 [true|false] **/ parseWhereValue: function(whereValue, tagRecord, isBig) { if (whereValue == null || whereValue.length == 0 || tagRecord == null) return whereValue; var re = /\[[^\]]+\]/g; if (isBig) re = /\{[^\{]+\}/g; //替换字符串中的字段名 var fn = function(name, index, format, args) { name = name.substr(1, name.length-2); name = name.replace('.', '__'); var v; if (tagRecord.get) { v = tagRecord.get(name); } else { v = tagRecord[name]; } v = Ext.isDate(v) ? v.dateFormat('Y-m-d H:i:s') : v; return v || name; }; var value = whereValue.replace(re, fn); return value; }, /** * 取表格中选择的记录;可编辑表格中的选择方式不同。 */ getSelectRows : function(g) { var records = []; var selModel = g.getSelectionModel(); if (selModel.getSelections) { records = selModel.getSelections(); } else { var pos = selModel.getSelectedCell(); if (pos == null) return records; var record = g.getStore().getAt(pos[0]); if (record) records = [record]; } return records; }, /** * 是否选择记录判断 */ selected: function(records) { if (records == null) { JxHint.alert(jx.util.isnull); //'记录对象为NULL,不能执行此操作!' return false; } if (records.length == 0) { JxHint.alert(jx.util.selectno); //'没有选择一条记录,不能执行此操作!' return false; } return true; }, /** * 是否单选记录判断 */ selectone: function(records) { if (!this.selected(records)) return false; if (records.length > 1) { JxHint.alert(jx.util.selectone); //'只能选择一条记录!' return false; } return true; }, /** * 显示检查项执行失败的结果信息 * 后台返回的检查项数据内容为: * checkMsg:[{checkName:'', result:true}, * {checkName:'', result:false, faildDesc:'', keyid:'', message:'', data:{}},...] */ checkResult: function(extData) { if (!extData || extData.length == 0) return; var cds = extData.checkMsg; //解析失败信息中的参数值 for (var i = 0, n = cds.length; i < n; i++) { var data = cds[i]; var faild = data.faildDesc; if (!data.result && faild.length > 0 && faild.indexOf('[') > -1) { faild = faild.replace(/\[/g, '{'); faild = faild.replace(/\]/g, '}'); var tpl = new Ext.XTemplate(faild); data.faildDesc = tpl.apply(data.data); } } //构建提示消息的模板 var tpl = new Ext.XTemplate( '
', '', ''+ ''+//检查项 ''+//结果 ''+//失败提示 '', '', '', '', '', '', '', '', '', '', '', '', '', '
'+ jx.util.checks +''+ jx.util.results +''+ jx.util.failp +'
{checkName}        {faildDesc} {message}
', '
' ); //创建对话框 var win = new Ext.Window({ title:jx.util.checkis,//'检查项执行结果' layout:'fit', width:400, height:300, resizable: false, modal: true, autoScroll: true, closeAction: 'close', tpl: tpl, data: extData }); win.show(); }, /** * 给tab控件添加快捷键,ctrl+alt+1表示第1个tab */ tabAddKey: function(tab) { var hd = function(tab) { var mappings = [], cnt = tab.items.getCount(); for (var i = 0; i < cnt; i++) { //'1' = 49 var fn = function(k, e){ var index = k - 49; tab.activate(index); }; var key = 49+i; mappings[i] = {key:key, ctrl:true, alt:true, fn:fn}; } tab.keymap = new Ext.KeyMap(tab.el, mappings); tab.keymap.enable(); }; JxUtil.delay(1000, function(){if (this.el) hd(this);}, tab); }, /** * 判断当前事件代号的按钮是否disable */ isDisableBtn: function(page, eventCode) { var tbar = page.getTopToolbar(); if (tbar == null) return true; var btn = JxUtil.getButton(tbar, eventCode); if (btn == null) return true; return btn.disabled; }, /** * 聚焦表单第一个控件,方便执行快捷键 */ focusFirst: function(page) { if (page == null || !page.isXType('form')) return; var hd = function() { page.form.items.each(function(f){ if (f.isFormField && f.rendered && f.name && !f.isXType('hidden')) { f.focus();//true return false; } }); }; JxUtil.delay(500, hd); }, /** * 聚焦表格当前行,方便执行快捷键 */ focusFirstRow: function(page) { if (page == null || !page.isXType('grid')) return; var row = JxUtil.getRowNum(page); page.getView().focusRow(row); }, /** * 获取表格当前选择的行号 */ getRowNum: function(page) { if (page == null || !page.isXType('grid')) return -1; var sm = page.getSelectionModel(); if (sm.getSelectedCell) {//单元个选择模式 var pos = sm.getSelectedCell(); if (pos) { return pos[0]; } else { return -1; } } else {//行选模式 var s = page.getStore(); var r = sm.getSelected(); if (r) { return s.indexOf(r); } else { return -1; } } }, /** * 获取表格第一个可编辑列的位置 */ getEditCol: function(page) { if (page == null || !page.isXType('editorgrid')) return -1; var cm = page.getColumnModel(); var cnt = cm.getColumnCount(); for (var i = 0; i < cnt; i++) { if (cm.isCellEditable(i, 0)) return i; } return -1; }, /** * 解析响应对象的错误信息 * 参考文件:src/adapter/core/ext-base-ajax.js */ errorResponse: function(response) { var msg, code = response.status; var srcdesc = response.srcdesc || ''; if (console && console.log) console.log('Response Error URL: ' + srcdesc); if (response.isTimeout) { msg = jx.util.limittime; //'请求超时,请重新操作,如果失败请联系管理员!' } else { if (code >= 200 && code < 300) { var result = Ext.decode(response.responseText); msg = result.message; if (msg.length == 0) { msg = response.statusText; } } else { if (response.responseText != null && response.responseText.length > 0) { var msg = response.responseText; try { var result = Ext.decode(response.responseText); msg = result.message; }catch(e) {} JxHint.alert(msg); return; } else { msg = response.statusText; } } } if (msg.indexOf('communication') > -1) {//communication failure msg = jx.util.netfail;//'网络异常访问服务器失败,确认后重新操作!'; //是否显示网络异常 var show = Jxstar.systemVar.sys__show__neterror || '0'; if (show == '1') { JxHint.alert(msg); } return; } else { JxHint.alert(msg); } //会话失效,退出系统 code <= 0 || if (msg.indexOf(jx.index.login) >= 0) {//'登录' JxUtil.isLogout = true; //正常退出 window.location.href = Jxstar.logoutUrl || Jxstar.path; } }, /** * 延迟执行指定的函数 * time -- 延时时间,ms * fn -- 函数 * scope -- 指定延时函数中的this对象 * args -- 数组,指定fn中的参数 */ delay: function(time, fn, scope, args) { (new Ext.util.DelayedTask()).delay(time, fn, scope, args); }, /** * 递归删除DOM与子对象 * parent -- 要删除的对象 */ removeChild: function(parent){ if (!parent) return; try { var childs = parent.childNodes || []; for (var i = childs.length - 1; i >= 0; i--) { var has = childs[i].hasChildNodes(); if (has) { JxUtil.removeChild(childs[i]); } else { if (childs[i]) { parent.removeChild(childs[i]); childs[i] = null; } } } if (parent) parent.parentNode.removeChild(parent); parent = null; } catch(e){} }, /** * Base64.encode */ base64: function(str) { return 'TYH' + Base64.encode(str) + 'A='; }, use64: function() { return (Jxstar.systemVar.page__query__encode == '1'); }, /** * 判断是否为手机号码格式 */ isphone: function(value) { if (value == null || value.length != 11) return false; var p = /^1[3,4,5,7,8]\d{9}$/; return p.test(value) ? true : false; }, /** * 判断是否为邮件地址格式 */ isemail: function(value) { if (value == null || value.length < 5) return false; var p = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; return (p.test(value)) ? true : false; }, /** * 取字符串的长度,汉字为两个字节长度 */ strlen: function(value) { if (value == null || value.length < 1) return 0; var len = 0; for (var i = 0; i < value.length; i++) { if (value.charCodeAt(i) < 299) { len++; } else { len += 2; } } return len; }, /** * 把数字转换为金额大写 */ numBigMoney: function(num) { var strOutput = ""; var strUnit = '仟佰拾亿仟佰拾万仟佰拾元角分'; num += "00"; var intPos = num.indexOf('.'); if (intPos >= 0){ num = num.substring(0, intPos) + num.substr(intPos + 1, 2); } strUnit = strUnit.substr(strUnit.length - num.length); for (var i=0; i < num.length; i++){ strOutput += '零壹贰叁肆伍陆柒捌玖'.substr(num.substr(i,1),1) + strUnit.substr(i,1); } return strOutput.replace(/零角零分$/, '整') .replace(/零[仟佰拾]/g, '零') .replace(/零{2,}/g, '零') .replace(/零([亿|万])/g, '$1') .replace(/零+元/, '元') .replace(/亿零{0,3}万/, '亿') .replace(/^元/, "零元"); }, /** * 处理IE6中不能显示PNG的透明效果 */ fixPNG: function(myIMG) { if (!Ext.isIE6) return; var imgID = (myIMG.id) ? "id='" + myIMG.id + "' " : ""; var imgTitle = (myIMG.title) ? "title='" + myIMG.title + "' " : "title='" + myIMG.alt + "' "; var newHTML = ""; myIMG.outerHTML = newHTML; }, /** * 呈现日期,在col.renderer */ renderDate: function(value, format) { if (Ext.isString(value)) { value = value.replace('T', ' '); if (value.length == 19) { value = Date.parseDate(value, 'Y-m-d H:i:s'); } else if (value.length == 10) { value = Date.parseDate(value, 'Y-m-d'); } } return value ? Ext.util.Format.date(value, format) : ''; }, /** * 取呈现函数中的样式:renderer:value.format('Y-m-d') 或 JxUtil.renderDate(value, 'Y-m-'); */ getDateFormat: function(renderer) { var ren = renderer.toString(), form = 'Y-m-d'; if (ren.indexOf('\'Y-m-d\'') >= 0 || ren.indexOf('\"Y-m-d\"') >= 0) { form = 'Y-m-d'; } else if (ren.indexOf('\'Y-m\'') >= 0 || ren.indexOf('\"Y-m\"') >= 0) { form = 'Y-m'; } else if (ren.indexOf('\'Y\'') >= 0 || ren.indexOf('\"Y\"') >= 0) { form = 'Y'; } return form; }, //把时间戳 YYYYMMddHHmmss 解析为日期或时间 shortTime: function(ts, isbr) { if (!ts || ts.length < 14) return ts; if (ts.indexOf('-') > -1) { var re = /[-: ]/g; ts = ts.replace(re, ''); } var cur = JxUtil.getTimeStamp(); //如果是当天的时间,则只显示HH:mm,否则显示日期 /* if (cur.substr(0, 8) == ts.substr(0, 8)) { return '今天'+(isbr ? '
':' ')+ts.substr(8, 2)+':'+ts.substr(10, 2); } else { return ts.substr(4, 2)+'-'+ts.substr(6, 2)+(isbr ? '
':' ')+ts.substr(8, 2)+':'+ts.substr(10, 2);//不要年份:ts.substr(0, 4)+'-'+ }*/ return ts.substr(0, 4)+'-'+ts.substr(4, 2)+'-'+ts.substr(6, 2)+(isbr ? '
':' ')+ts.substr(8, 2)+':'+ts.substr(10, 2);//不要年份:ts.substr(0, 4)+'-'+ }, shortDate: function(ts) { if (!ts || ts.length < 14) return ts; if (ts.indexOf('-') > -1) { var re = /[-: ]/g; ts = ts.replace(re, ''); } var cur = JxUtil.getTimeStamp(); //如果是当天的时间,则只显示HH:mm,否则显示日期 /* if (cur.substr(0, 8) == ts.substr(0, 8)) { return ts.substr(8, 2)+':'+ts.substr(10, 2); } else { return ts.substr(4, 2)+'-'+ts.substr(6, 2); }*/ return ts.substr(0, 4)+'/'+ts.substr(4, 2)+'/'+ts.substr(6, 2); }, /** * 取时间戳字符串:YYYYMMddHHmmss */ getTimeStamp: function() { var d = new Date(); return d.format('YmdHis'); }, /** * 取当前年份 * inc -- 增减年份 */ getCurYear: function(inc){ var d = new Date(); var y = parseInt(d.format('Y')); if (inc != null) { y = y + inc } return y; }, /** * 取当前时间, 格式:yyyy-mm-dd hh:mm:ss */ getTodayTime: function(){ var d = new Date(); return d.format('Y-m-d H:i:s'); }, /** * 取当前日期, 格式:yyyy-mm-dd * inc -- 增减天数 */ getToday: function(inc){ var d = new Date(); if (inc != null) { d = d.add(Date.DAY, inc); } return d.format('Y-m-d'); }, /** * 取当前月份, 格式:yyyy-mm * inc -- 增减月份 */ getMonth: function(inc){ var d = new Date(); if (inc != null) { d = d.add(Date.MONTH, inc); } return d.format('Y-m'); }, /** * 取间隔月份, 格式:yyyy-mm */ getNextMonth: function(smonth, num){ if (smonth == null) return ''; smonth = smonth.split(' ')[0]; var sd = smonth.split('-'); if (sd.length == 2) { smonth = smonth + '-01'; } else if (sd.length == 1) { smonth = smonth + '-01-01'; } var dt = Date.parseDate(smonth, "Y-m-d"); dt = dt.add(Date.MONTH, num); return dt.format('Y-m'); }, /** * 取指定日期间隔值的日期, 格式:yyyy-mm-dd */ getNextDate: function (sdate, num){ if (sdate == null) return ''; sdate = sdate.split(' ')[0]; var sd = sdate.split('-'); if (sd.length == 2) { sdate = sdate + '-01'; } else if (sd.length == 1) { sdate = sdate + '-01-01'; } var dt = Date.parseDate(sdate, "Y-m-d"); dt = dt.add(Date.DAY, num); return dt.format('Y-m-d'); }, /** * 取本周的开始与结束日期,星期日是一周的第一天, 开始日期为本周日,结束日期为下周期日, 格式:yyyy-mm-dd */ getWeekDates: function(){ var d = new Date(); var w = d.getDay();//0是星期日,6是星期六 var sd = this.getNextDate(this.getToday(), -w); var ed = this.getNextDate(this.getToday(), 7-w); return [sd, ed]; }, /** * 取上周的开始与结束日期,星期日是一周的第一天, 开始日期为本周日,结束日期为下周期日, 格式:yyyy-mm-dd */ getPreWeekDates: function(){ var d = new Date(); var w = d.getDay();//0是星期日,6是星期六 var sd = this.getNextDate(this.getToday(), -w-7); var ed = this.getNextDate(this.getToday(), -w); return [sd, ed]; }, /** * 取本月的开始与结束日期,结束日期为下月第一天, 格式:yyyy-mm-dd */ getMonthDates: function(){ var smonth = this.getMonth(); var sd = smonth + '-01'; var ed = this.getNextMonth(smonth, 1) + '-01'; return [sd, ed]; }, /** * 取上月的开始与结束日期,结束日期为本月第一天, 格式:yyyy-mm-dd */ getPreMonthDates: function(){ var smonth = this.getNextMonth(this.getMonth(), -1); var sd = smonth + '-01'; var ed = this.getNextMonth(smonth, 1) + '-01'; return [sd, ed]; }, /** * 保留f小数位,做四舍五入处理;JavaScript原生toFixed在有些浏览器中没有做四舍五入 */ toFixed: function(v, f) { with(Math) { return round(v * pow(10, f)) / pow(10, f); } }, /** * 乘法运算,rec可以是record、form,a是参数1的字段名,b是参数2的字段名,c是结果的字段名, * 如:a * b = c */ multiply: function(rec, a, b, c) { var va = rec.get(a); var vb = rec.get(b); var vc = (parseFloat(va) * 100) * (parseFloat(vb) * 100); vc = vc / 10000;//防止乘法结果本来是1.4,结果为1.39999999999992 if (isNaN(vc)) { vc = 0; } else { vc = JxUtil.toFixed(vc, 2); } rec.set(c, vc); }, /** * 查看关联数据 */ showLinkWin: function(type,linkFunid,where_sql,where_value,where_type){ if(type=='grid'){ var hdcall = function(grid) { JxUtil.delay(500, function(){ Jxstar.loadData(grid, {where_sql:where_sql, where_value:where_value, where_type:where_type}); }); }; var define = Jxstar.findNode(linkFunid); Jxstar.showData({ filename: define.gridpage, title: define.nodetitle, pagetype: 'grid', nodedefine: define, callback: hdcall }); }else{ var hdcall = function(page) { var options = { where_sql: where_sql, where_type: where_type, where_value: where_value, callback: function(data) { //如果没有数据则执行新增 if (data.length == 0) { page.formNode.event.create(); } else { var r = page.formNode.event.newRecord(data[0]); page.getForm().myRecord = r; page.getForm().loadRecord(r); } } }; Jxstar.queryData(linkFunid, options) }; //显示数据 var define = Jxstar.findNode(linkFunid); Jxstar.showData({ filename: define.formpage, title: define.nodetitle, callback: hdcall }); } }, /** * 加载页面元素授权内容 */ loadPageRole: function() { var endcall = function(data){ if (!data || data.length == 0) return; for (var i = 0; i < data.length; i++) { var funid = data[i].fun_id; var subids = data[i].ext_subid; var define = Jxstar.findNode(funid); if (define && subids.length > 0) { define.subfunid = subids; } } }; var params = 'funid=sys_role&eventcode=extsubid'; Request.dataRequest(params, endcall); }, /** * 表单tab扩展事件 */ form_tabchange: function(tab, cmp){ var sgrid = cmp.getComponent(0); if (sgrid && sgrid.fkValue) { Jxstar.loadSubData(sgrid, sgrid.fkValue); } }, /** * 表单tab扩展事件 */ form_beforetabchange: function(t, newp, curp){ if (newp && newp.tabtooler && curp.tabtooler) { newp.tabtooler.show(); curp.tabtooler.hide(); } }, /** * 表单添加附件控件ID */ form_newid: function(){ return 'form_file_'+JxUtil.newId(); } });//Ext.apply })();