$.extend($.fn.datagrid.defaults, { groupHeight: 28, expanderWidth: 30, groupStyler: function(value,rows){return ''} }); var groupview = $.extend({}, $.fn.datagrid.defaults.view, { render: function(target, container, frozen){ var table = []; var groups = this.groups; for(var i=0; i'); if ((frozen && (opts.rownumbers || opts.frozenColumns.length)) || (!frozen && !(opts.rownumbers || opts.frozenColumns.length))){ table.push(''); table.push(' '); table.push(''); } if ((frozen && hasFrozen) || (!frozen)){ table.push(''); table.push(opts.groupFormatter.call(target, group.value, group.rows)); table.push(''); } table.push(''); table.push(''); var index = group.startIndex; for(var j=0; j'); table.push(this.renderRow.call(this, target, fields, frozen, index, group.rows[j])); table.push(''); index++; } table.push('
'); return table.join(''); function parseCss(css, cls){ var classValue = ''; var styleValue = ''; if (typeof css == 'string'){ styleValue = css; } else if (css){ classValue = css['class'] || ''; styleValue = css['style'] || ''; } return 'class="' + cls + (classValue ? ' '+classValue : '') + '" ' + 'style="' + styleValue + '"'; } }, 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; initCss(); var groups = []; for(var i=0; i' + '.datagrid-group{height:'+opts.groupHeight+'px;overflow:hidden;font-weight:bold;border-bottom:1px solid #ccc;white-space:nowrap;word-break:normal;}' + '.datagrid-group-title,.datagrid-group-expander{display:inline-block;vertical-align:bottom;height:100%;line-height:'+opts.groupHeight+'px;padding:0 4px;}' + '.datagrid-group-title{position:relative;}' + '.datagrid-group-expander{width:'+opts.expanderWidth+'px;text-align:center;padding:0}' + '.datagrid-row-expander{margin:'+Math.floor((opts.groupHeight-16)/2)+'px 0;display:inline-block;width:16px;height:16px;cursor:pointer}' + '' ); } } }, onAfterRender: function(target){ $.fn.datagrid.defaults.view.onAfterRender.call(this, target); var view = this; var state = $.data(target, 'datagrid'); var opts = state.options; if (!state.onResizeColumn){ state.onResizeColumn = opts.onResizeColumn; } if (!state.onResize){ state.onResize = opts.onResize; } opts.onResizeColumn = function(field, width){ view.resizeGroup(target); state.onResizeColumn.call(target, field, width); } opts.onResize = function(width, height){ view.resizeGroup(target); state.onResize.call($(target).datagrid('getPanel')[0], width, height); } view.resizeGroup(target); } }); $.extend($.fn.datagrid.methods, { groups:function(jq){ return jq.datagrid('options').view.groups; }, expandGroup:function(jq, groupIndex){ return jq.each(function(){ var opts = $(this).datagrid('options'); var view = $.data(this, 'datagrid').dc.view; var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); var expander = group.find('span.datagrid-row-expander'); if (expander.hasClass('datagrid-row-expand')){ expander.removeClass('datagrid-row-expand').addClass('datagrid-row-collapse'); group.next('table').show(); } $(this).datagrid('fixRowHeight'); if (opts.onExpandGroup){ opts.onExpandGroup.call(this, groupIndex); } }); }, collapseGroup:function(jq, groupIndex){ return jq.each(function(){ var opts = $(this).datagrid('options'); var view = $.data(this, 'datagrid').dc.view; var group = view.find(groupIndex!=undefined ? 'div.datagrid-group[group-index="'+groupIndex+'"]' : 'div.datagrid-group'); var expander = group.find('span.datagrid-row-expander'); if (expander.hasClass('datagrid-row-collapse')){ expander.removeClass('datagrid-row-collapse').addClass('datagrid-row-expand'); group.next('table').hide(); } $(this).datagrid('fixRowHeight'); if (opts.onCollapseGroup){ opts.onCollapseGroup.call(this, groupIndex); } }); }, scrollToGroup: function(jq, groupIndex){ return jq.each(function(){ var state = $.data(this, 'datagrid'); var dc = state.dc; var grow = dc.body2.children('div.datagrid-group[group-index="'+groupIndex+'"]'); if (grow.length){ var groupHeight = grow.outerHeight(); var headerHeight = dc.view2.children('div.datagrid-header')._outerHeight(); var frozenHeight = dc.body2.outerHeight(true) - dc.body2.outerHeight(); var top = grow.position().top - headerHeight - frozenHeight; if (top < 0){ dc.body2.scrollTop(dc.body2.scrollTop() + top); } else if (top + groupHeight > dc.body2.height() - 18){ dc.body2.scrollTop(dc.body2.scrollTop() + top + groupHeight - dc.body2.height() + 18); } } }); } }); $.extend(groupview, { refreshGroupTitle: function(target, groupIndex){ var state = $.data(target, 'datagrid'); var opts = state.options; var dc = state.dc; var group = this.groups[groupIndex]; var span = dc.body1.add(dc.body2).children('div.datagrid-group[group-index=' + groupIndex + ']').find('span.datagrid-group-title'); span.html(opts.groupFormatter.call(target, group.value, group.rows)); }, resizeGroup: function(target, groupIndex){ var state = $.data(target, 'datagrid'); var dc = state.dc; var ht = dc.header2.find('table'); var fr = ht.find('tr.datagrid-filter-row').hide(); // var ww = ht.width(); var ww = dc.body2.children('table.datagrid-btable:first').width(); if (groupIndex == undefined){ var groupHeader = dc.body2.children('div.datagrid-group'); } else { var groupHeader = dc.body2.children('div.datagrid-group[group-index=' + groupIndex + ']'); } groupHeader._outerWidth(ww); var opts = state.options; if (opts.frozenColumns && opts.frozenColumns.length){ var width = dc.view1.width() - opts.expanderWidth; var isRtl = dc.view1.css('direction').toLowerCase()=='rtl'; groupHeader.find('.datagrid-group-title').css(isRtl?'right':'left', -width+'px'); } if (fr.length){ if (opts.showFilterBar){ fr.show(); } } // fr.show(); }, insertRow: function(target, index, row){ var state = $.data(target, 'datagrid'); var opts = state.options; var dc = state.dc; var group = null; var groupIndex; if (!state.data.rows.length){ $(target).datagrid('loadData', [row]); return; } for(var i=0; i group.startIndex + group.rows.length){ index = group.startIndex + group.rows.length; } $.fn.datagrid.defaults.view.insertRow.call(this, target, index, row); if (index >= group.startIndex + group.rows.length){ _moveTr(index, true); _moveTr(index, false); } group.rows.splice(index - group.startIndex, 0, row); } else { group = { value: row[opts.groupField], rows: [row], startIndex: state.data.rows.length } groupIndex = this.groups.length; dc.body1.append(this.renderGroup.call(this, target, groupIndex, group, true)); dc.body2.append(this.renderGroup.call(this, target, groupIndex, group, false)); this.groups.push(group); state.data.rows.push(row); } this.setGroupIndex(target); this.refreshGroupTitle(target, groupIndex); this.resizeGroup(target); function _moveTr(index,frozen){ var serno = frozen?1:2; var prevTr = opts.finder.getTr(target, index-1, 'body', serno); var tr = opts.finder.getTr(target, index, 'body', serno); tr.insertAfter(prevTr); } }, updateRow: function(target, index, row){ var opts = $.data(target, 'datagrid').options; $.fn.datagrid.defaults.view.updateRow.call(this, target, index, row); var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); var groupIndex = parseInt(tb.prev().attr('group-index')); this.refreshGroupTitle(target, groupIndex); }, deleteRow: function(target, index){ var state = $.data(target, 'datagrid'); var opts = state.options; var dc = state.dc; var body = dc.body1.add(dc.body2); var tb = opts.finder.getTr(target, index, 'body', 2).closest('table.datagrid-btable'); var groupIndex = parseInt(tb.prev().attr('group-index')); $.fn.datagrid.defaults.view.deleteRow.call(this, target, index); var group = this.groups[groupIndex]; if (group.rows.length > 1){ group.rows.splice(index-group.startIndex, 1); this.refreshGroupTitle(target, groupIndex); } else { body.children('div.datagrid-group[group-index='+groupIndex+']').remove(); for(var i=groupIndex+1; i