Ext.define('erp.util.GridUtil',{ /** * 取grid配置及数据 * 包括dbfind的配置 * @param no 需要自动编号的字段 */ getGridColumnsAndStore: function(grid, url, param, no){ var me = this; grid.setLoading(true); Ext.Ajax.request({//拿到grid的columns url : basePath + url, params: param, async: (grid.sync ? false : true), method : 'post', callback : function(options,success,response){ grid.setLoading(false); if (!response) return; var res = new Ext.decode(response.responseText); if(res.exceptionInfo){ showError(res.exceptionInfo);return; } if(res.columns){ var limits = res.limits, limitArr = new Array(); if(limits != null && limits.length > 0) {//权限外字段 limitArr = Ext.Array.pluck(limits, 'lf_field'); } Ext.each(res.columns, function(column, y){ // column有取别名 if(column.dataIndex.indexOf(' ') > -1) { column.dataIndex = column.dataIndex.split(' ')[1]; } //power if(limitArr.length > 0 && Ext.Array.contains(limitArr, column.dataIndex)) { column.hidden = true; } //renderer me.setRenderer(grid, column); //logictype me.setLogicType(grid, column, { headerColor: res.necessaryFieldColor }); }); //data var data = []; if(!res.data || res.data.length == 2){ if (grid.buffered) { me.add10EmptyData(grid.detno, data); me.add10EmptyData(grid.detno, data);//添加20条空白数据 } else { grid.on('reconfigure', function(){// 改为Grid加载后再添加空行,节约200~700ms me.add10EmptyItems(grid, 40, false); }); } } else { data = Ext.decode(res.data.replace(/,}/g, '}').replace(/,]/g, ']')); } //store var store = me.setStore(grid, res.fields, data, grid.groupField, grid.necessaryField); //view if(grid.selModel && grid.selModel.views == null){ grid.selModel.views = []; } //dbfind if(res.dbfinds && res.dbfinds.length > 0){ grid.dbfinds = res.dbfinds; } //reconfigure if(grid.sync) {//同步加载的Grid grid.reconfigure(store, res.columns); grid.on('afterrender', function(){ me.setToolbar(grid, grid.columns, grid.necessaryField, limitArr); }); } else { //toolbar if (grid.generateSummaryData === undefined) {// 改为Grid加载后再添加合计,节约60ms me.setToolbar(grid, res.columns, grid.necessaryField, limitArr); } grid.reconfigure(store, res.columns); } if(grid.buffered) {//缓冲数据的Grid grid.verticalScroller = Ext.create('Ext.grid.PagingScroller', { activePrefetch: false, store: store }); store.guaranteeRange(0, Math.min(store.pageSize, store.prefetchData.length) - 1); } var form = Ext.ComponentQuery.query('form'); if(form && form.length > 0){ grid.readOnly = form[0].readOnly;//grid不可编辑 } } else { grid.hide(); var form = Ext.ComponentQuery.query('form')[0]; if(form && !form.isStatic) { if(form.items.items.length == 0) { form.on('afterload', function(){ me.updateFormPosition(form);//字段较少时,修改form布局 }); } else { me.updateFormPosition(form);//字段较少时,修改form布局 } } } } }); }, setRenderer: function(grid, column){ if(!column.haveRendered){ if(column.renderer != null && column.renderer != "") { if(!grid.RenderUtil){ grid.RenderUtil = Ext.create('erp.util.RenderUtil'); } var renderName = column.renderer; if(contains(column.renderer, ':', true)){ var args = new Array(); Ext.each(column.renderer.split(':'), function(a, index){ if(index == 0){ renderName = a; } else { args.push(a); } }); if(!grid.RenderUtil.args[renderName]){ grid.RenderUtil.args[renderName] = new Object(); } grid.RenderUtil.args[renderName][column.dataIndex] = args; } column.renderer = grid.RenderUtil[renderName]; column.haveRendered = true; } else if(column.readOnly){ column.renderer = function(val, meta, record, x, y, store, view){ meta.style = "background: #e0e0e0;"; var c = this.columns[y]; if(val != null && val.toString().trim() != ''){ if(c.xtype == 'datecolumn' && typeof val === 'object'){ val = Ext.Date.format(val, 'Y-m-d'); } else if(c.xtype == 'numbercolumn' && val.toString().trim() == '0') { val = ''; } return val; } else { if(c.xtype == 'datecolumn'){ val = ''; } return val; } } column.haveRendered = true; } } }, setLogicType: function(grid, column, headerCss){ var logic = column.logic; if(logic != null){ if(logic == 'detno'){ grid.detno = column.dataIndex; column.width = 40; column.align = 'center'; column.renderer = function(val, meta) { meta.tdCls = Ext.baseCSSPrefix + 'grid-cell-special'; return val; }; } else if(logic == 'keyField'){ grid.keyField = column.dataIndex; } else if(logic == 'mainField'){ grid.mainField = column.dataIndex; }else if(logic == 'orNecessField'){ if(!grid.orNecessField){ grid.orNecessField = new Array(); } grid.orNecessField.push(column.dataIndex); }else if(logic == 'necessaryField'){ grid.necessaryField = column.dataIndex; if(!grid.necessaryFields){ grid.necessaryFields = new Array(); } grid.necessaryFields.push(column.dataIndex); if(!column.haveRendered){ column.renderer = function(val, meta, record, x, y, store, view){ var c = this.columns[y]; if(val != null && val.toString().trim() != ''){ if(c.xtype == 'datecolumn' && typeof val === 'object'){ val = Ext.Date.format(val, 'Y-m-d'); } else if(c.xtype == 'numbercolumn') { val = Ext.util.Format.number(val, c.format || '0,000.00'); } else if(c.xtype == 'combocolumn'){ if(!Ext.isEmpty(val)) { var g = view.ownerCt,h = g.columns[y],f = h.field, k; if ((k = (h.editor || h.filter)) && k.store) { var t = null,dd = k.store.data; t = Ext.Array.filter(dd, function(d, index){ return d.value == val; }); if (t && t.length > 0) { return t[0].display; } } else if (f) { if(f.store) { var t = f.store.findRecord('value', val); if (t) return t.get('display'); } else return f.rawValue; } return val; } } return val; } else { if(c.xtype == 'datecolumn'){ val = ''; } return '' + '' + val + ''; } }; } if(headerCss.headerColor) column.style = 'color:#' + headerCss.headerColor; } else if(logic == 'groupField'){ grid.groupField = column.dataIndex; } } }, setStore: function(grid, fields, data, groupField, necessaryField){ Ext.each(fields, function(f){ if(f.name.indexOf(' ') > -1) {// column有取别名 f.name = f.name.split(' ')[1]; } if(!Ext.isChrome){ if(f.type == 'date'){ f.dateFormat = 'Y-m-d H:m:s'; } } }); var modelName = 'ext-model-' + grid.id; Ext.define(modelName, { extend: 'Ext.data.Model', fields: fields }); var config = { model: modelName, groupField: groupField, getSum: function(records, field) { if (arguments.length < 2) { return 0; } var total = 0, i = 0, len = records.length; if(necessaryField) { for (; i < len; ++i) {//重写getSum,grid在合计时,只合计填写了必要信息的行 var necessary = records[i].get(necessaryField); if(necessary != null && necessary != ''){ total += records[i].get(field); } } } else { for (; i < len; ++i) { total += records[i].get(field); } } return total; }, getCount: function() { if(necessaryField) { var count = 0; Ext.each(this.data.items, function(item){//重写getCount,grid在合计时,只合计填写了必要信息的行 if(item.data[necessaryField] != null && item.data[necessaryField] != ''){ count++; } }); return count; } return this.data.items.length; } }; if(grid.buffered) {//grid数据缓存 config.buffered = true; config.pageSize = 200; config.purgePageCount = 0; config.proxy = { type: 'memory' }; } else { config.data = data; } var store = Ext.create('Ext.data.Store', config); store.each(function(item, x){ item.index = x; }); if(grid.buffered) { var ln = data.length, records = [], i = 0; for (; i < ln; i++) { records.push(Ext.create(modelName, data[i])); } store.cacheRecords(records); } return store; }, setToolbar: function(grid, columns, necessaryField, limitArr){ var items = []; var bool = true; if(!grid.dockedItems) return; Ext.each(grid.dockedItems.items, function(item){ if(item.dock == 'bottom' && item.items){//bbar已存在 bool = false; } }); if(bool){ Ext.each(columns, function(column){ if(limitArr.length == 0 || !Ext.Array.contains(limitArr, column.dataIndex)) { if(column.summaryType == 'sum'){ items.push('-',{ id: column.dataIndex + '_sum', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(sum):0' }); } else if(column.summaryType == 'average') { items.push('-',{ id: column.dataIndex + '_average', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(average):0' }); } else if(column.summaryType == 'count') { items.push('-',{ id: column.dataIndex + '_count', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(count):0' }); } else if(column.summaryType == 'results') { items.push('-',{ id: column.dataIndex + '_results', itemId: column.dataIndex, xtype: 'tbtext', text: '筛选结果:0条' }); } } if(column.dataIndex == necessaryField){ column.renderer = function(val){ if(val != null && val.toString().trim() != ''){ return val; } else { return '' + '' + val + ''; } }; } }); grid.addDocked({ xtype: 'toolbar', dock: 'bottom', items: items }); } else { var bars = Ext.ComponentQuery.query('erpToolbar'); if(bars.length > 0){ Ext.each(columns, function(column){ if(column.summaryType == 'sum'){ bars[0].add('-'); bars[0].add({ id: column.dataIndex + '_sum', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(sum):0' }); } else if(column.summaryType == 'average') { bars[0].add('-'); bars[0].add({ id: column.dataIndex + '_average', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(average):0' }); } else if(column.summaryType == 'count') { bars[0].add('-'); bars[0].add({ id: column.dataIndex + '_count', itemId: column.dataIndex, xtype: 'tbtext', text: column.text + '(count):0' }); } }); } } }, updateFormPosition: function(form){ var height = window.innerHeight; var width = window.innerWidth; if(Ext.isIE){ height = screen.height*0.75; width = screen.width*0.75; } if(form){ if(form.items.items.length > 12){ form.setHeight(height); } else {//少于12个字段的单form页面,强制居中显示 if(form.items.items == 0){ form.on('afterlayout', function(){ if(0 < form.items.items.length <= 12){ Ext.each(form.items.items, function(item){ if(item.columnWidth >= 0.25 && item.columnWidth < 0.6){ item.setWidth(width*0.65*0.5); item.columnWidth = 0.5; } else if(item.columnWidth >= 0.6) { item.setWidth(width*0.65); item.columnWidth = 1; } }); } }); } else { Ext.each(form.items.items, function(item){ if(item.columnWidth >= 0.25 && item.columnWidth < 0.6){ item.setWidth(width*0.65*0.5); item.columnWidth = 0.5; } else if(item.columnWidth >= 0.6) { item.setWidth(width*0.65); item.columnWidth = 1; } }); } form.setHeight('60%'); form.setWidth('70%'); form.el.applyStyles('margin:10% auto;border-width: 0 1px 1px 1px;'); } } }, loadNewStore: function(grid, param){ var me = this; grid.setLoading(true);//loading... Ext.Ajax.request({//拿到grid的columns url : basePath + "common/loadNewGridStore.action", params: param, method : 'post', callback : function(options,success,response){ grid.setLoading(false); var res = new Ext.decode(response.responseText); if(res.exceptionInfo){ showError(res.exceptionInfo);return; } var data = res.data; if(!data || data.length == 0){ grid.store.removeAll(); me.add10EmptyItems(grid); } else { if(grid.buffered) { var ln = data.length, records = [], i = 0; for (; i < ln; i++) { records.push(Ext.create(grid.store.model.getName(), data[i])); } grid.store.purgeRecords(); grid.store.cacheRecords(records); grid.store.totalCount = ln; grid.store.guaranteedStart = -1; grid.store.guaranteedEnd = -1; var a = grid.store.pageSize - 1; a = a > ln - 1 ? ln - 1 : a; grid.store.guaranteeRange(0, a); } else { grid.store.loadData(data); } } //自定义event grid.addEvents({ storeloaded: true }); grid.fireEvent('storeloaded', grid, data); } }); }, /** * 从index行开始,往grid里面加十空行 * @param detno 编号字段 * @param data 需要添加空白数据的data */ add10EmptyData: function(detno, data){ if(detno){ var index = data.length == 0 ? 0 : Number(data[data.length-1][detno]); for(var i=0;i<20;i++){ var o = new Object(); o[detno] = index + i + 1; data.push(o); } } else { for(var i=0;i<20;i++){ var o = new Object(); data.push(o); } } }, /** * 从index行开始,往grid里面加十空行 * @param grid */ add10EmptyItems: function(grid, count, append){ var store = grid.store, items = store.data.items, arr = new Array(); var detno = grid.detno; count = count || 10; append = append === undefined ? true : false; if(typeof grid.sequenceFn === 'function') grid.sequenceFn.call(grid, count); else { if(detno){ var index = items.length == 0 ? 0 : Number(store.last().get(detno)); for(var i=0;i < count;i++ ){ var o = new Object(); o[detno] = index + i + 1; arr.push(o); } } else { for(var i=0;i < count;i++ ){ var o = new Object(); arr.push(o); } } store.loadData(arr, append); var i = 0; store.each(function(item, x){ if(item.index) { i = item.index; } else { if (i) { i++; item.index = i; } else { item.index = x; } } }); } }, isBlank: function(grid, data) { if(typeof grid.isEmptyRecord === 'function') { return grid.isEmptyRecord.call(grid, data); } else { var ff = grid.necessaryFields,bool = true; var of = grid.orNecessField, c; if(ff) { bool = false; Ext.each(ff, function(f) { c = grid.down('gridcolumn[dataIndex=' + f + ']'); if(Ext.isEmpty(data[f]) || (data[f] == 0 && c && c.xtype != 'ynnvcolumn' && c.xtype != 'yncolumn')) { bool = true;return; } }); } else if(of){ Ext.each(of,function(f){ if(!Ext.isEmpty(data[f]) && data[f] != 0){ bool = false; return; } }); } else { if(!grid.necessaryField || !Ext.isEmpty(data[grid.necessaryField])) { bool = false; } } return bool; } }, isEmpty: function(grid) { if(grid == null){ grid = Ext.getCmp('grid'); } var me = this, i = 0, items = grid.getStore().data.items, l = items.length; for(;i < l;i++) { if(!me.isBlank(grid, items[i].data)) { return false; } } return true; }, isDirty: function(grid) { if(grid == null){ grid = Ext.getCmp('grid'); } var i = 0, items = grid.getStore().data.items, l = items.length; for(;i < l;i++) { if( items[i].dirty ) { return true; } } return false; }, /** * 获取grid已编辑但部分必填字段没填写的行,并提示 */ getUnFinish: function(grid) { var me = this, cols = {}; Ext.Array.each(grid.columns, function(c){ if(c.dataIndex) cols[c.dataIndex] = c.text || c.header; }); var errs = []; grid.store.each(function(record){ if(record.dirty && me.isBlank(grid, record.data)) { var ff = grid.necessaryFields, s = ''; if(ff) { Ext.each(ff, function(f) { c = grid.down('gridcolumn[dataIndex=' + f + ']'); if(c.logic != 'ignore' && (Ext.isEmpty(record.get(f)) || (record.get(f) == 0 && c && c.xtype != 'ynnvcolumn' && c.xtype != 'yncolumn'))) { s += ' ' + (c.text || c.header) + ' '; } }); } else if(grid.necessaryField) { var f = grid.necessaryField, c = grid.down('gridcolumn[dataIndex=' + f + ']'); if(c.logic != 'ignore' && (Ext.isEmpty(record.get(f)) || (record.get(f) == 0 && c && c.xtype != 'ynnvcolumn' && c.xtype != 'yncolumn'))) { s += ' ' + (c.text || c.header) + ' '; } } if(s.length > 0) errs.push((grid.detno ? ('行: ' + record.get(grid.detno) + ', ') : '') + s); } }); return errs.join('
'); }, /** * 获取grid已保存但部分必填字段没填写的行,并提示 */ getInvalid: function(grid) { if(grid.keyField) { var me = this, cols = {}; Ext.Array.each(grid.columns, function(c){ if(c.dataIndex) cols[c.dataIndex] = c.text || c.header; }); var errs = []; grid.store.each(function(record){ var key = record.get(grid.keyField); if(key && key > 0 && me.isBlank(grid, record.data)) { var ff = grid.necessaryFields, s = ''; if(ff) { Ext.each(ff, function(f) { c = grid.down('gridcolumn[dataIndex=' + f + ']'); if(c.logic != 'ignore' && (Ext.isEmpty(record.get(f)) || (record.get(f) == 0 && c && c.xtype != 'ynnvcolumn' && c.xtype != 'yncolumn'))) { s += ' ' + (c.text || c.header) + ' '; } }); } else if(grid.necessaryField) { var f = grid.necessaryField, c = grid.down('gridcolumn[dataIndex=' + f + ']'); if(c.logic != 'ignore' && (Ext.isEmpty(record.get(f)) || (record.get(f) == 0 && c && c.xtype != 'ynnvcolumn' && c.xtype != 'yncolumn'))) { s += ' ' + (c.text || c.header) + ' '; } } if(s.length > 0) errs.push((grid.detno ? ('行: ' + record.get(grid.detno) + ', ') : '') + s); } }); return errs.join('
'); } return null; }, /** * 拿到grid里面要提交的数据 */ getGridStore: function(grid){ if(grid == null){ grid = Ext.getCmp('grid'); } var me = this, jsonGridData = new Array(); var form = Ext.getCmp('form'); if(grid!=null){ var s = grid.getStore().data.items;//获取store里面的数据 var dd; for(var i=0;i '; } } }); } if(s != '') msg += s; } } if(msg != '' && msg != ';'){//明细行被修改过哦 msg = "明细行" + msg.substring(0, msg.length-1) + "已编辑过"; } else { msg = ''; } return msg; }, getRecordByCode: function(param){ Ext.Ajax.request({ url : basePath + 'common/getRecordByCode.action', params: param, method : 'post', callback : function(options,success,response){ //var res = new Ext.decode(response.responseText); } }); }, onGridItemClick: function(selModel, record, id){ var me = this.GridUtil || this; var grid = selModel.ownerCt; if(grid && !grid.readOnly && !grid.NoAdd){ var index = grid.store.indexOf(record); if(index == grid.store.indexOf(grid.store.last())){ me.add10EmptyItems(grid);//就再加10行 } var btn = grid.down('erpDeleteDetailButton'); if(btn) btn.setDisabled(false); btn = grid.down('erpAddDetailButton'); if(btn) btn.setDisabled(false); btn = grid.down('copydetail'); if(btn) btn.setDisabled(false); btn = grid.down('pastedetail'); if(btn) btn.setDisabled(false); btn = grid.down('updetail'); if(btn) btn.setDisabled(false); btn = grid.down('downdetail'); if(btn) btn.setDisabled(false); if(grid.down('tbtext[name=row]')){ grid.down('tbtext[name=row]').setText(index); } } }, onGridItemClickForEditGrid: function(selModel, record, id){ var grid = id == null ? Ext.getCmp('grid') : Ext.getCmp(id); var index = null; if(grid.detno){ index = record.data[grid.detno]; index = index == null ? (record.index + 1) : index; if(index.toString() == 'NaN'){ index = ''; } if(index == grid.store.data.items[grid.store.data.items.length-1].data[grid.detno]){//如果选择了最后一行 this.add10EmptyItems(grid);//就再加10行 } } else { index = record.index + 1; if(index.toString() == 'NaN'){ index = ''; } if(index == grid.store.data.items[grid.store.data.items.length-1].index + 1){//如果选择了最后一行 this.add10EmptyItems(grid);//就再加10行 } } // var btn = grid.down('erpDeleteButton'); // btn.setDisabled(false); }, deleteDetailForEditGrid:function(btn){ var grid = btn.ownerCt.ownerCt; var records = grid.selModel.getSelection(); if(records.length > 0){ if(grid.keyField){ if(records[0].data[grid.keyField] != null && records[0].data[grid.keyField] > 0){ warnMsg($I18N.common.msg.ask_del, function(btn){ if(btn == 'yes'){ grid.BaseUtil.getActiveTab().setLoading(true);//loading... Ext.Ajax.request({ url : basePath + "common/deleteDetail.action", params: { caller: caller, condition: grid.keyField + "=" + records[0].data[grid.keyField] }, method : 'post', callback : function(options,success,response){ grid.BaseUtil.getActiveTab().setLoading(false); var localJson = new Ext.decode(response.responseText); if(localJson.exceptionInfo){ showError(localJson.exceptionInfo);return; } if(localJson.success){ grid.store.remove(records[0]); delSuccess(function(){ });//@i18n/i18n.js } else { delFailure(); } } }); } }); } else { grid.store.remove(records[0]); } } else { if(records[0].data[grid.keyField] != null && records[0].data[grid.keyField] > 0){ showError("grid未配置keyField,无法删除该行数据!"); } else { grid.store.remove(records[0]); } } } }, onSave: function(grid, saveUrl){ var me = this; if(grid){ var param = me.getGridStore(); if(grid.necessaryField.length > 0 && (param == null || param == '')){ showError('明细表还未添加数据');return; } else { var url = saveUrl || grid.saveUrl || Ext.getCmp('form').saveUrl; me.getActiveTab().setLoading(true);//loading... Ext.Ajax.request({ url : basePath + url, params : { param: unescape(param.toString().replace(/\\/g,"%")) }, method : 'post', callback : function(options,success,response){ me.getActiveTab().setLoading(false); var localJson = new Ext.decode(response.responseText); if(localJson.success){ saveSuccess(function(){ //add成功后刷新grid me.loadNewStore(grid, { caller: caller, condition: grid.mainField + '=' + Ext.getCmp(Ext.getCmp('form').keyField).value }); }); } else if(localJson.exceptionInfo){ var str = localJson.exceptionInfo; if(str.trim().substr(0, 12) == 'AFTERSUCCESS'){ str = str.replace('AFTERSUCCESS', ''); saveSuccess(function(){ //add成功后刷新grid me.loadNewStore(grid, { caller: caller, condition: grid.mainField + '=' + Ext.getCmp(Ext.getCmp('form').keyField).value }); }); showError(str); } else { showError(str); return; } } else{ saveFailure();//@i18n/i18n.js } } }); } } }, onUpdate: function(grid, updateUrl){ var me = this; if(grid){ var param = me.getGridStore(); if(grid.necessaryField.length > 0 && (param == null || param == '')){ showError('明细表还未添加数据');return; } else { var url = updateUrl || grid.updateUrl || Ext.getCmp('form').updateUrl; me.update(param, url, function(){ me.loadNewStore(grid, { caller: caller, condition: grid.mainField + '=' + Ext.getCmp(Ext.getCmp('form').keyField).value }); }); } } }, /** * @param param * @param param2 * ... * @param updateUrl * @param callback */ update: function() { if(arguments.length < 3) return; var me = this, params = {}, url = arguments[arguments.length - 2], callback = arguments[arguments.length - 1]; params.param = unescape(arguments[0].toString().replace(/\\/g,"%")); for(var i=1; i 0){ tab = win[win.length-1]; } } return tab; }, getGridSelected:function(grid){ var items = grid.selModel.getSelection(),data = new Array(); Ext.each(items, function(item, index){ if(this.data[grid.keyField] != null && this.data[grid.keyField] != '' && this.data[grid.keyField] != '0' && this.data[grid.keyField] != 0){ var o = new Object(); if(grid.keyField){ o[grid.keyField] = item.data[grid.keyField]; } if(grid.toField){ Ext.each(grid.toField, function(f, index){ var v = Ext.getCmp(f).value; if(v != null && v.toString().trim() != '' && v.toString().trim() != 'null'){ if(Ext.isDate(v)){ v = Ext.Date.toString(v); } o[f] = v; } else { o[f] = ''; } }); } if(grid.necessaryFields){ Ext.each(grid.necessaryFields, function(f, index){ var v = item.data[f]; if(Ext.isDate(v)){ v = Ext.Date.toString(v); } if(Ext.isNumber(v)){ v = (v).toString(); } o[f] = v; }); } data.push(o); } }); return data; } });