//对datagrid的参数进行扩展,增加了以下3个参数 $.extend($.fn.datagrid.defaults, { groupHeight: 25,//分组区域出现时的高度 expanderWidth: 30,//分组左侧的+-号的宽度 groupStyler: function(value,rows){return ''}//组的css样式 }); //定义全新的分组样式的grid视图,继承默认的视图 var groupview = $.extend({}, $.fn.datagrid.defaults.view, { //会执行2次,第一次是冻结列,第二次是指标列(非冻结) render: function(target, container, frozen){ var state = $.data(target, 'datagrid'); var table = []; this.currentIndex = 0; var opts = state.options; var groupFields = opts.groupField;//分组字段 if(typeof groupFields == 'string'){ groupFields = groupFields.split(','); } //每个汇总字段的计数 this.fieldCountMap = {}; for(var i=0;i<groupFields.length;i++){ this.fieldCountMap[groupFields[i]] = 0; } var groupOrder = this.groupOrder; table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>'); for(var i=0; i<groupOrder.length; i++){ var nextOrderIndex = []; //默认下一个为空 if(i < groupOrder.length - 1){ nextOrderIndex = groupOrder[i+1]; } //上一个,默认也为空 var lastOrderIndex = []; if(i>0){ lastOrderIndex = groupOrder[i-1]; } if(lastOrderIndex.length == 0 || lastOrderIndex[0]!==groupOrder[i][0]){ //table.push('<table class="datagrid-btable" cellspacing="0" cellpadding="0" border="0"><tbody>'); } table.push(this.renderGroup.call(this, target, groupOrder[i],nextOrderIndex, frozen)); if(nextOrderIndex.length==0 || nextOrderIndex[0]!==groupOrder[i][0]){ //table.push('</tbody></table>'); } } table.push('</tbody></table>'); if(!frozen){ state.data.rows = this.newRows; } $(container).html(table.join('')); }, renderGroup: function(target, groupIndexArray,nextGroupIndexArray, frozen){ var state = $.data(target, 'datagrid'); var opts = state.options; var fields = $(target).datagrid('getColumnFields', frozen); var frozenFields = $(target).datagrid('getColumnFields', true); var hasFrozen = opts.frozenColumns && opts.frozenColumns.length; var groups = this.groups; if (frozen){ if (!(opts.rownumbers || hasFrozen)){ return ''; } } var groupFields = opts.groupField;//分组字段 if(typeof groupFields == 'string'){ groupFields = groupFields.split(','); } var table = []; var nestedObj = groups; var groupname = ''; var groupPos = -1; //获取当前小组的数据 for(var i=0;i<groupIndexArray.length;i++){ groupname = groupIndexArray[i]; groupPos = i; nestedObj = nestedObj[groupname]; } var dataLen = nestedObj.length; if(true){ //是否添加小计: dataLen++; } for(var j=0; j<dataLen; j++) { var rowData = null; var isSum = false; if(j==nestedObj.length){ var jo = opts.sumFormatter.call(target, groupname, nestedObj); rowData = buildFrozenSumRow(nestedObj,groupPos,groupname,jo); isSum = true; }else{ //if ((frozen && hasFrozen)){ // var oldval = this.fieldCountMap[groupFields[groupPos]]; // this.fieldCountMap[groupFields[groupPos]] = oldval+1; //} rowData = nestedObj[j]; } if (!(frozen && hasFrozen)){ this.newRows.push(rowData); } var htmltr = renderRowExt(this,rowData,isSum); table.push(htmltr); this.currentIndex++; } //判断是否需要上级(上上级)的小计: for(var m=groupIndexArray.length-2;m>=0;m--){ //倒数第二个开始 var isAddExtraRow = false; var curGroup = groupIndexArray[m]; if(nextGroupIndexArray.length == 0){ isAddExtraRow = true; }else{ var nextGroup = nextGroupIndexArray[m]; if(curGroup == nextGroup){ break; }else{ isAddExtraRow = true; } } //如果需要添加合计页 if(isAddExtraRow == true){ var jo = opts.sumFormatter.call(target, curGroup, nestedObj); var rowData = buildFrozenSumRow(nestedObj,m,curGroup,jo); var htmltr = renderRowExt(this,rowData,true); table.push(htmltr); this.currentIndex++; if (!(frozen && hasFrozen)){ this.newRows.push(rowData); } } } return table.join(''); /** * [buildFrozenSumRow 构建冻结区块的合计信息] * @param {[type]} rows [description] * @param {[type]} groupPos [description] * @param {[type]} title [description] * @return {[type]} [description] */ function buildFrozenSumRow(rows,groupPos,title,jo){ var keyField = ''; if(frozenFields.length>groupPos+1){ keyField = frozenFields[groupPos+1]; } if(!jo){ jo = {}; } if(rows.length>0){ jo = $.extend(jo,rows[0]); } if(keyField){ jo[keyField] = title+' 小计'; } if(frozenFields.length>groupPos+2){ for(var i=groupPos+2;i<fields.length;i++){ jo[frozenFields[i]] = '';//清空后续的列的值 } } return jo; } function renderRowExt(that,rowData,isSumRow){ var innerTable= []; var css = opts.rowStyler ? opts.rowStyler.call(target, that.currentIndex, rowData) : ''; var classValue = ''; var styleValue = ''; if (typeof css == 'string'){ styleValue = css; } else if (css){ classValue = css['class'] || ''; styleValue = css['style'] || ''; } if(isSumRow && isSumRow == true){ //TODO 临时 classValue = 'row-sum' } var cls = 'class="datagrid-row ' + (that.currentIndex % 2 && opts.striped ? 'datagrid-row-alt ' : ' ') + classValue + '"'; var style = styleValue ? 'style="' + styleValue + '"' : ''; var rowId = state.rowIdPrefix + '-' + (frozen?1:2) + '-' + that.currentIndex; innerTable.push('<tr id="' + rowId + '" datagrid-row-index="' + that.currentIndex + '" ' + cls + ' ' + style + '>'); innerTable.push(that.renderRow.call(this, target, fields, frozen, that.currentIndex, rowData)); innerTable.push('</tr>'); return innerTable.join(''); } /* function getSumTitle(groupIndexArray,thisPath){ var title = ''; var index = -1; for(var i=0;i<groupIndexArray.length;i++){ if(thisPath == groupIndexArray[i]){ index = i-1; break; } } if(index>=0){ title = groupIndexArray[index]; } return title + '小计'; }*/ }, /* bindEvents: function(target){ var state = $.data(target, 'datagrid'); var dc = state.dc; var body = dc.body1.add(dc.body2); var clickHandler = ($.data(body[0],'events')||$._data(body[0],'events')).click[0].handler; body.unbind('click').bind('click', function(e){ var tt = $(e.target); var expander = tt.closest('span.datagrid-row-expander'); if (expander.length){ var gindex = expander.closest('div.datagrid-group').attr('group-index'); if (expander.hasClass('datagrid-row-collapse')){ $(target).datagrid('collapseGroup', gindex); } else { $(target).datagrid('expandGroup', gindex); } } else { clickHandler(e); } e.stopPropagation(); }); },*/ //渲染前的事件 onBeforeRender: function(target, rows){ var state = $.data(target, 'datagrid'); var opts = state.options; var groupFields = opts.groupField;//分组字段 if(typeof groupFields == 'string'){ groupFields = groupFields.split(','); } var groups = {};//分组信息 var groupOrder = [];//分组顺序 initCss(); groupRows(rows,groupFields); //state.data.rows = newRows; this.groups = groups; this.groupOrder = groupOrder; this.newRows = [];//新数据 /* var that = this; setTimeout(function(){ that.bindEvents(target); },0);*/ function groupRows(rows,groupFields){ var groupOrderStr = []; for(var i=0; i<rows.length; i++){ var row = rows[i]; var oldVal = groups; var path = []; for(var j=0; j<groupFields.length; j++){ path.push(row[groupFields[j]]); if(!oldVal[row[groupFields[j]]]){ if(j == groupFields.length-1){ oldVal[row[groupFields[j]]] = []; }else{ oldVal[row[groupFields[j]]] = {}; } } oldVal = oldVal[row[groupFields[j]]]; } oldVal.push(row); var pathStr = path.join('&#'); if($.inArray(pathStr,groupOrderStr) == -1){ groupOrder.push(path); groupOrderStr.push(pathStr); } } } function initCss(){ if (!$('#datagrid-group-style').length){ $('head').append( '<style id="datagrid-group-style">' + '.row-sum{/*background-color:#34d7d9 !important;*/ font-weight:700;}'+ '.datagrid-td-rownumber{font-weight:400;}'+ '</style>' ); } } }, onAfterRender: function(target){ $.fn.datagrid.defaults.view.onAfterRender.call(this, target); //合并单元格; //$(target).datagrid('autoMergeCells', ['company','brand']); } });