diff --git a/CHANGE.md b/CHANGE.md index 7495941c..8c51cbc4 100755 --- a/CHANGE.md +++ b/CHANGE.md @@ -5,6 +5,8 @@ Change Log: `yii2-grid` **Date:** _under development_ +- (enh #846): Enhance Grid Grouping to better parse multi level group footers. +- (enh #840): Update Persian Translations. - (enh #839): Enhancements to export form functionality. ## Version 3.2.6 @@ -41,7 +43,7 @@ Change Log: `yii2-grid` - Enhance ExpandRowColumn default row css for Bootstrap 4.x. - Enhance styling and behavior for Bootstrap 4.x. -- (bug #826): Update Ukrainian Translations. +- (enh #826): Update Ukrainian Translations. ## Version 3.2.1 diff --git a/src/assets/js/kv-grid-group.js b/src/assets/js/kv-grid-group.js index 59cc6903..5b25a4be 100644 --- a/src/assets/js/kv-grid-group.js +++ b/src/assets/js/kv-grid-group.js @@ -16,8 +16,8 @@ var kvGridGroup; "use strict"; kvGridGroup = function (gridId) { var $grid, data, groups, $groupRows, i, n, colCount, $pageSum, $firstRow, $lastRow, isEmpty, initPageSummary, - formatNumber, getParentGroup, getLastGroupRow, getColValue, getSummarySource, getSummaryContent, addRowSpan, - adjustLastRow, createSummary, calculate; + formatNumber, getParentGroup, getLastGroupRow, getCellValue, getSummarySource, getSummaryContent, addRowSpan, + adjustLastRow, adjustFooterGroups, createSummary, calculateSummaryContent, calculate; $grid = $('#' + gridId); data = {}; groups = []; @@ -94,17 +94,15 @@ var kvGridGroup; } return $endRow.length ? $endRow : $lastRow; }; - getColValue = function ($col, decPoint, thousandSep) { + getCellValue = function ($cell, decPoint, thousandSep) { var flag, out; - if (!$col || !$col.length) { + if (!$cell || !$cell.length) { return 0; } - if ($col.is('[data-raw-value]')) { - out = $col.attr('data-raw-value'); + if ($cell.is('[data-raw-value]')) { + out = $cell.attr('data-raw-value'); } else { - out = $col.text(); - flag = new RegExp('[\\s' + thousandSep + ']', 'g'); - out = out.replace(flag, ''); + out = $cell.text().split(thousandSep || ',').join(''); if (decPoint && decPoint !== '.') { out = out.replace(decPoint, '.'); } @@ -119,7 +117,7 @@ var kvGridGroup; $row = $row.next(':not(.kv-grid-group-row)'); while (!j && $row.length) { $row.find('td[data-col-seq="' + i + '"]').each(function () { - data.push(getColValue($(this), decPoint, thousandSep)); + data.push(getCellValue($(this), decPoint, thousandSep)); }); // jshint ignore:line j = $row.hasClass('kv-grid-group-row'); $row = $row.next(); @@ -127,7 +125,7 @@ var kvGridGroup; } else { while (j <= rowspan && $row.length) { $row.find('td[data-col-seq="' + i + '"]').each(function () { - data.push(getColValue($(this), decPoint, thousandSep)); + data.push(getCellValue($(this), decPoint, thousandSep)); }); // jshint ignore:line $row = $row.next(); j++; @@ -136,24 +134,24 @@ var kvGridGroup; return data; }; getSummaryContent = function (source, $tr, $td, i, config) { - var out, fmt, decimals, decPoint, thousandSep, data, func; - /** @namespace config.thousandSep */ - /** @namespace config.decPoint */ - /** @namespace config.func */ - /** @namespace config.format */ - /** @namespace config.func */ - decimals = config.decimals || 0; - decPoint = config.decPoint || '.'; - thousandSep = config.thousandSep || ','; - fmt = config.format || ''; - func = config.func ? window[config.func] : ''; + // noinspection JSUnresolvedVariable + var fmt = config.format || '', func = config.func ? window[config.func] : '', + decPoint = config.decPoint || '.', thousandSep = config.thousandSep || ',', + data = (fmt === 'number' || fmt === 'callback' && typeof func === 'function') ? + getSummarySource($tr, $td, i, decPoint, thousandSep) : + source; + return calculateSummaryContent(source, data, config); + }; + calculateSummaryContent = function (source, data, config) { + // noinspection JSUnresolvedVariable + var decimals = config.decimals || 0, decPoint = config.decPoint || '.', + thousandSep = config.thousandSep || ',', fmt = config.format || '', + func = config.func ? window[config.func] : '', out; if (fmt === 'number') { - data = getSummarySource($tr, $td, i, decPoint, thousandSep); out = calculate(data, source); return formatNumber(out, decimals, decPoint, thousandSep); } if (fmt === 'callback' && typeof func === 'function') { - data = getSummarySource($tr, $td, i, decPoint, thousandSep); return func(data); } return source; @@ -205,6 +203,64 @@ var kvGridGroup; }); } }; + adjustFooterGroups = function () { + var len = groups.length, $tbody = $grid.find('tbody:first'), j, + hasFooter = $tbody.find('tr.kv-group-footer').length; + if (len < 3 || !hasFooter) { + return; + } + $tbody.find(' > tr[data-group-key]').each(function () { + var $row = $(this); + $row.find('td.kv-grid-group').each(function () { + var $td = $(this), grpSeq = $td.attr('data-sub-group-of') || '0', rowspan = 0, proceed = true; + $row.nextAll().each(function () { + if (!proceed) { + return; + } + rowspan++; + if ($(this).attr('data-group-seq') === grpSeq) { + proceed = false; + } + }); + $td.attr('rowspan', rowspan); + }); + }); + $tbody.find(' > tr.kv-group-footer').each(function () { + var $tr = $(this), i = parseInt($tr.attr('data-group-seq') || 0); + for (j = 1; j <= i; j++) { + $tr.find('td[data-summary-col-seq=' + j + ']').remove(); + } + }); + // summary correction for multi group footers + $tbody.find(' > tr.kv-group-footer > td').each(function () { + var $td = $(this), sumData = $td.data('groupSummary') || null, config, data = [], seq, grpSeq, + $tr, proceed = true, out; + if (!sumData) { + return; + } + config = sumData.config; + // noinspection JSUnresolvedVariable + if (!config.format && !config.func) { + return; + } + seq = $td.attr('data-summary-col-seq'); + $tr = $td.closest('tr'); + grpSeq = $tr.attr('data-group-seq'); + $tr.prevAll().each(function () { + var $row = $(this), i = $row.attr('data-group-seq') || '-1', content; + if (!proceed) { + return; + } + content = getCellValue($row.find('td[data-col-seq=' + seq + ']'), config.decPoint, config.thousandSep); + data.push(content); + if (i === grpSeq) { + proceed = false; + } + }); + out = calculateSummaryContent(sumData.source || '', data, config); + $td.html(out); + }); + }; createSummary = function ($cell, type) { var data = $cell.data(type), $parent, key, $tr, $td, i, j, $row, $col, $target, content, config, isGroupedRow = false, css = (type === 'groupHeader') ? 'kv-group-header' : 'kv-group-footer'; @@ -221,20 +277,23 @@ var kvGridGroup; key = $parent && $parent.length ? $parent.attr('data-col-seq') : null; $row = $(document.createElement('tr')); if (data.options) { - $row.attr(data.options).addClass(css); + $row.attr(data.options); } + $row.addClass(css).attr({'data-group-seq': key || '0'}); $firstRow.find('td').each(function () { + var summary; $td = $(this); i = $td.attr('data-col-seq'); - if (!key || i != key || isGroupedRow) { // jshint ignore:line + if (!key || i !== key || isGroupedRow) { // jshint ignore:line $col = $(document.createElement('td')).attr('data-summary-col-seq', i); if (data.content && data.content[i]) { - /** @namespace data.contentFormats */ - /** @namespace data.contentOptions */ + // noinspection JSUnresolvedVariable config = data.contentFormats && data.contentFormats[i] || {}; content = getSummaryContent(data.content[i], $tr, $cell, i, config); - $col.html(content); + summary = {source: data.content[i], config: config}; + $col.html(content).data('groupSummary', summary); } + // noinspection JSUnresolvedVariable if (data.contentOptions && data.contentOptions[i]) { $col.attr(data.contentOptions[i]); } @@ -247,7 +306,7 @@ var kvGridGroup; $col.appendTo($row); } }); - if ($parent && $parent.length && !isGroupedRow) { + if ($parent && $parent.length && !isGroupedRow && groups.length < 3) { addRowSpan($parent); } if (type === 'groupHeader') { @@ -277,7 +336,7 @@ var kvGridGroup; $target.after($row); } } - /** @namespace data.mergeColumns */ + // noinspection JSUnresolvedVariable if (data.mergeColumns && data.mergeColumns.length) { $.each(data.mergeColumns, function (i, cols) { var from = cols[0], to = cols[1], cspan = 0, merged = ''; @@ -294,11 +353,11 @@ var kvGridGroup; }); $row.find('td').each(function () { var $td = $(this); - j = $td.attr('data-summary-col-seq'); + j = parseInt($td.attr('data-summary-col-seq') || -1); if (j > from && j <= to) { $td.remove(); } else { - if (j == from) { // jshint ignore:line + if (j === from) { // jshint ignore:line $td.attr('colspan', cspan).html(merged); } } @@ -337,9 +396,11 @@ var kvGridGroup; cellKeyCurr = txtCurr; } $cell.attr('data-cell-key', cellKeyCurr); - if (cellKeyCurr == cellKeyPrev) { // jshint ignore:line + if (cellKeyCurr === cellKeyPrev) { rowspan++; - $gCell.attr('rowspan', rowspan); + if (groups.length < 3) { + $gCell.attr('rowspan', rowspan); + } $cell.addClass('kv-temp-cells').hide(); } else { gCol = j; @@ -398,5 +459,6 @@ var kvGridGroup; }); // jshint ignore:line } adjustLastRow(); + adjustFooterGroups(); }; })(window.jQuery); \ No newline at end of file diff --git a/src/assets/js/kv-grid-group.min.js b/src/assets/js/kv-grid-group.min.js index 0d984841..648bbd19 100644 --- a/src/assets/js/kv-grid-group.min.js +++ b/src/assets/js/kv-grid-group.min.js @@ -5,9 +5,10 @@ * @version 3.2.7 * * Grid grouping jquery library created for yii2-grid. - * + * * Author: Kartik Visweswaran * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com * For more JQuery plugins visit http://plugins.krajee.com * For more Yii related demos visit http://demos.krajee.com - */var kvGridGroup;!function(t){"use strict";kvGridGroup=function(a){var r,e,n,o,d,i,s,u,c,l,f,g,h,p,v,m,k,y,w,x,C,q;for(r=t("#"+a),e={},n=[],s=0,u=r.find("tr.kv-page-summary"),c=r.find("tr[data-key]:first"),l=r.find("tr[data-key]:last"),f=function(t){return void 0===t||null===t||0===t.length},g=function(){var a=0;u.length&&u.find("td").each(function(){t(this).attr("data-col-seq",a),a++})},h=function(t,a,r,e,n){var o,d="\\d(?=(\\d{"+(n||3)+"})+"+(a>0?"\\D":"$")+")",i=parseFloat(t),s=parseInt(a);return isNaN(i)?"":(o=i+"",r=r||".",e=e||",",-1===o.indexOf(".")&&s>0&&(i=parseFloat(i+".0")),o=i.toFixed(isNaN(s)||0>s?0:s),o=o.replace(".",r),o.replace(new RegExp(d,"g"),"$&"+e))},p=function(t){var a,r,e,n,o=t.attr("data-sub-group-of");if(f(o))return null;if(n='td[data-col-seq="'+o+'"]',a=t.closest("tr"),r=a.find(n),e=r.length,e>0)return r;for(;0===e&&a.length;)a=a.prev(),r=a.find(n),e=r.length;return 0===e?null:r},v=function(t,a){var r=t.attr("data-group-key"),e=0,n=a;if(a.attr("data-last-row"))return a;for(;0===e&&n.length;)n=a,a=a.next(),e=a.find('td[data-group-key="'+r+'"]').length;return n.length?n:l},m=function(t,a,r){var e,n;return t&&t.length?(t.is("[data-raw-value]")?n=t.attr("data-raw-value"):(n=t.text(),e=new RegExp("[\\s"+r+"]","g"),n=n.replace(e,""),a&&"."!==a&&(n=n.replace(a,"."))),n?parseFloat(n):0):0},k=function(a,r,e,n,o){var d=1,i=[],s=a,u=s.hasClass("kv-grid-group-row"),c=r.attr("rowspan")||1;if(u)for(d=!1,s=s.next(":not(.kv-grid-group-row)");!d&&s.length;)s.find('td[data-col-seq="'+e+'"]').each(function(){i.push(m(t(this),n,o))}),d=s.hasClass("kv-grid-group-row"),s=s.next();else for(;c>=d&&s.length;)s.find('td[data-col-seq="'+e+'"]').each(function(){i.push(m(t(this),n,o))}),s=s.next(),d++;return i},y=function(t,a,r,e,n){var o,d,i,s,u,c,l;return i=n.decimals||0,s=n.decPoint||".",u=n.thousandSep||",",d=n.format||"",l=n.func?window[n.func]:"","number"===d?(c=k(a,r,e,s,u),o=q(c,t),h(o,i,s,u)):"callback"===d&&"function"==typeof l?(c=k(a,r,e,s,u),l(c)):t},q=function(t,a){var r,e,n=0,o=t&&t.length||0;if(!o)return"";switch(a){case"f_count":return o;case"f_sum":case"f_avg":for(r=0;o>r;r++)n+=t[r];return"f_sum"===a?n:n/o;case"f_max":case"f_min":return e="f_max"===a?"max":"min",Math[e].apply(null,t);default:return""}},w=function(t,a){a=a||1;var r=t.attr("rowspan")||1;r=parseInt(r)+a,t.attr("rowspan",r)},x=function(){var a,r=[];if(l.nextAll("tr.kv-group-footer").each(function(){r.push(t(this))}),r.length)for(a=0;an&&a.before(e))})):(f=v(a,o),k&&f.hasClass("kv-grid-group-row")?f.before(u):f.after(u)),m.mergeColumns&&m.mergeColumns.length&&t.each(m.mergeColumns,function(a,r){var e=r[0],n=r[1],o=0,d="";e>-1&&n>-1&&(u.find("td").each(function(){var a=t(this);s=a.attr("data-summary-col-seq"),s>=e&&n>=s&&(d+=a.html(),o++)}),u.find("td").each(function(){var a=t(this);s=a.attr("data-summary-col-seq"),s>e&&n>=s?a.remove():s==e&&a.attr("colspan",o).html(d)}))}))},g(),r.find("td.kv-grid-group").each(function(){var a=t(this),r=t(this).attr("data-group-key");r&&(t.inArray(r,n)<0&&n.push(r),void 0===e[r]?e[r]=[a]:e[r].push(a))}),t.each(n,function(a,r){var n,o,d=e[r],i=1,s=0,u="",c="",l="",f="";t.each(d,function(t,r){u=r.text().trim(),n=d[s],a>0?(o=p(r),o&&o.length&&(c=o.attr("data-cell-key")),f=c?c+"-"+u:u):f=u,r.attr("data-cell-key",f),f==l?(i++,n.attr("rowspan",i),r.addClass("kv-temp-cells").hide()):(s=t,i=1),l=f})}),r.find("td.kv-grid-group.kv-temp-cells").remove(),t.each(n,function(a,e){var n=0;r.find('td[data-group-key="'+e+'"]').each(function(){var a,r=t(this),e=n%2>0?r.attr("data-odd-css"):r.attr("data-even-css");e&&r.removeClass(e).addClass(e),r.is("[data-grouped-row]")&&(a=t(document.createElement("tr")).addClass("kv-grid-group-row"),r.closest("tr").before(a),r.removeAttr("rowspan").appendTo(a).css("width","auto")),n++})}),o=r.find("tr.kv-grid-group-row"),o.length&&(s=r.find("tr[data-key]:first > td").length,s&&o.each(function(){t(this).find(">td").attr("colspan",s)}),o.find("td[data-group-key]").each(function(){var a=t(this).data("groupKey"),e=r.find(".kv-grid-group-header[data-group-key]"),n=r.find(".kv-grid-group-filter[data-group-key]");t(this).closest("tr").data("groupKey",a),e.length&&r.find('.kv-grid-group-header[data-group-key="'+a+'"]').remove(),n.length&&r.find('.kv-grid-group-filter[data-group-key="'+a+'"]').remove()})),l.attr("data-last-row",1),i=n.length-1,d=i;d>=0;d--)r.find('td[data-group-key="'+n[d]+'"]').each(function(){C(t(this),"groupFooter")});for(d=0;i>=d;d++)r.find('td[data-group-key="'+n[d]+'"]').each(function(){C(t(this),"groupHeader")});x()}}(window.jQuery); \ No newline at end of file + */ +var kvGridGroup;!function(t){"use strict";kvGridGroup=function(a){var r,e,n,o,d,i,s,u,c,f,l,g,h,p,v,m,k,y,w,q,x,C,b;for(r=t("#"+a),e={},n=[],s=0,u=r.find("tr.kv-page-summary"),c=r.find("tr[data-key]:first"),f=r.find("tr[data-key]:last"),l=function(t){return null==t||0===t.length},g=function(t,a,r,e,n){var o="\\d(?=(\\d{"+(n||3)+"})+"+(a>0?"\\D":"$")+")",d=parseFloat(t),i=parseInt(a);return isNaN(d)?"":(r=r||".",e=e||",",-1===(d+"").indexOf(".")&&i>0&&(d=parseFloat(d+".0")),d.toFixed(isNaN(i)||i<0?0:i).replace(".",r).replace(new RegExp(o,"g"),"$&"+e))},h=function(t){var a,r,e,n,o=t.attr("data-sub-group-of");if(l(o))return null;if(n='td[data-col-seq="'+o+'"]',(e=(r=(a=t.closest("tr")).find(n)).length)>0)return r;for(;0===e&&a.length;)e=(r=(a=a.prev()).find(n)).length;return 0===e?null:r},p=function(t,a){var r=t.attr("data-group-key"),e=0,n=a;if(a.attr("data-last-row"))return a;for(;0===e&&n.length;)n=a,e=(a=a.next()).find('td[data-group-key="'+r+'"]').length;return n.length?n:f},v=function(t,a,r){var e;return t&&t.length?(t.is("[data-raw-value]")?e=t.attr("data-raw-value"):(e=t.text().split(r||",").join(""),a&&"."!==a&&(e=e.replace(a,"."))),e?parseFloat(e):0):0},m=function(a,r,e,n,o){var d=1,i=[],s=a,u=s.hasClass("kv-grid-group-row"),c=r.attr("rowspan")||1;if(u)for(d=!1,s=s.next(":not(.kv-grid-group-row)");!d&&s.length;)s.find('td[data-col-seq="'+e+'"]').each(function(){i.push(v(t(this),n,o))}),d=s.hasClass("kv-grid-group-row"),s=s.next();else for(;d<=c&&s.length;)s.find('td[data-col-seq="'+e+'"]').each(function(){i.push(v(t(this),n,o))}),s=s.next(),d++;return i},k=function(t,a,r,e,n){var o=n.format||"",d=n.func?window[n.func]:"",i=n.decPoint||".",s=n.thousandSep||",",u="number"===o||"callback"===o&&"function"==typeof d?m(a,r,e,i,s):t;return C(t,u,n)},C=function(t,a,r){var e,n=r.decimals||0,o=r.decPoint||".",d=r.thousandSep||",",i=r.format||"",s=r.func?window[r.func]:"";return"number"===i?(e=b(a,t),g(e,n,o,d)):"callback"===i&&"function"==typeof s?s(a):t},b=function(t,a){var r,e=0,n=t&&t.length||0;if(!n)return"";switch(a){case"f_count":return n;case"f_sum":case"f_avg":for(r=0;r tr[data-group-key]").each(function(){var a=t(this);a.find("td.kv-grid-group").each(function(){var r=t(this),e=r.attr("data-sub-group-of")||"0",n=0,o=!0;a.nextAll().each(function(){o&&(n++,t(this).attr("data-group-seq")===e&&(o=!1))}),r.attr("rowspan",n)})}),o.find(" > tr.kv-group-footer").each(function(){var r=t(this),e=parseInt(r.attr("data-group-seq")||0);for(a=1;a<=e;a++)r.find("td[data-summary-col-seq="+a+"]").remove()}),o.find(" > tr.kv-group-footer > td").each(function(){var a,r,e,n,o,d=t(this),i=d.data("groupSummary")||null,s=[],u=!0;i&&((a=i.config).format||a.func)&&(r=d.attr("data-summary-col-seq"),n=d.closest("tr"),e=n.attr("data-group-seq"),n.prevAll().each(function(){var n,o=t(this),d=o.attr("data-group-seq")||"-1";u&&(n=v(o.find("td[data-col-seq="+r+"]"),a.decPoint,a.thousandSep),s.push(n),d===e&&(u=!1))}),o=C(i.source||"",s,a),d.html(o))}))},x=function(a,r){var e,o,d,i,s,u,f,l,g,v,m,w,q=a.data(r),x="groupHeader"===r?"kv-group-header":"kv-group-footer";q&&(o=a.attr("data-group-key"),d=a.closest("tr"),o&&d.attr("data-group-key",o),e=a.attr("data-sub-group-of")?h(a):null,w=e&&e.length&&e.is("[data-grouped-row]"),o=e&&e.length?e.attr("data-col-seq"):null,f=t(document.createElement("tr")),q.options&&f.attr(q.options),f.addClass(x).attr({"data-group-seq":o||"0"}),c.find("td").each(function(){var r;i=t(this),s=i.attr("data-col-seq"),o&&s===o&&!w||(l=t(document.createElement("td")).attr("data-summary-col-seq",s),q.content&&q.content[s]&&(m=q.contentFormats&&q.contentFormats[s]||{},v=k(q.content[s],d,a,s,m),r={source:q.content[s],config:m},l.html(v).data("groupSummary",r)),q.contentOptions&&q.contentOptions[s]&&l.attr(q.contentOptions[s]),i.hasClass("kv-grid-hide")&&l.addClass("kv-grid-hide"),i.hasClass("skip-export")&&l.addClass("skip-export"),l.appendTo(f))}),e&&e.length&&!w&&n.length<3&&y(e),"groupHeader"===r?(d.before(f),d.find('td[data-col-seq="'+o+'"]').length&&f.find("td").each(function(){var a=t(this),r=parseInt(a.attr("data-summary-col-seq"));r!==(o=parseInt(o))-1?r!==o+1?r>o&&a.before(e):a.before(e):a.after(e)})):(g=p(a,d),w&&g.hasClass("kv-grid-group-row")?g.before(f):g.after(f)),q.mergeColumns&&q.mergeColumns.length&&t.each(q.mergeColumns,function(a,r){var e=r[0],n=r[1],o=0,d="";e>-1&&n>-1&&(f.find("td").each(function(){var a=t(this);(u=a.attr("data-summary-col-seq"))>=e&&u<=n&&(d+=a.html(),o++)}),f.find("td").each(function(){var a=t(this);(u=parseInt(a.attr("data-summary-col-seq")||-1))>e&&u<=n?a.remove():u===e&&a.attr("colspan",o).html(d)}))}))},function(){var a=0;u.length&&u.find("td").each(function(){t(this).attr("data-col-seq",a),a++})}(),r.find("td.kv-grid-group").each(function(){var a=t(this),r=t(this).attr("data-group-key");r&&(t.inArray(r,n)<0&&n.push(r),void 0===e[r]?e[r]=[a]:e[r].push(a))}),t.each(n,function(a,r){var o,d,i=e[r],s=1,u=0,c="",f="",l="",g="";t.each(i,function(t,r){c=r.text().trim(),o=i[u],a>0?((d=h(r))&&d.length&&(f=d.attr("data-cell-key")),g=f?f+"-"+c:c):g=c,r.attr("data-cell-key",g),g===l?(s++,n.length<3&&o.attr("rowspan",s),r.addClass("kv-temp-cells").hide()):(u=t,s=1),l=g})}),r.find("td.kv-grid-group.kv-temp-cells").remove(),t.each(n,function(a,e){var n=0;r.find('td[data-group-key="'+e+'"]').each(function(){var a,r=t(this),e=n%2>0?r.attr("data-odd-css"):r.attr("data-even-css");e&&r.removeClass(e).addClass(e),r.is("[data-grouped-row]")&&(a=t(document.createElement("tr")).addClass("kv-grid-group-row"),r.closest("tr").before(a),r.removeAttr("rowspan").appendTo(a).css("width","auto")),n++})}),(o=r.find("tr.kv-grid-group-row")).length&&((s=r.find("tr[data-key]:first > td").length)&&o.each(function(){t(this).find(">td").attr("colspan",s)}),o.find("td[data-group-key]").each(function(){var a=t(this).data("groupKey"),e=r.find(".kv-grid-group-header[data-group-key]"),n=r.find(".kv-grid-group-filter[data-group-key]");t(this).closest("tr").data("groupKey",a),e.length&&r.find('.kv-grid-group-header[data-group-key="'+a+'"]').remove(),n.length&&r.find('.kv-grid-group-filter[data-group-key="'+a+'"]').remove()})),f.attr("data-last-row",1),d=i=n.length-1;d>=0;d--)r.find('td[data-group-key="'+n[d]+'"]').each(function(){x(t(this),"groupFooter")});for(d=0;d<=i;d++)r.find('td[data-group-key="'+n[d]+'"]').each(function(){x(t(this),"groupHeader")});w(),q()}}(window.jQuery); \ No newline at end of file