diff --git a/CHANGELOG.md b/CHANGELOG.md index 928c580..3a7d587 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,17 @@ # Changelog +## 1.2.0 + +### Enhancements & Features +- Fixed table headers +- Fixed table column +- Sorted header column CSS class +- Improved ajax request settings [#27](http://github.com/rstaib/jquery-bootgrid/issues/27) +- Nested object support [#46](http://github.com/rstaib/jquery-bootgrid/issues/46) + +### Bug Fixes +- ... + ## 1.1.1 ### Bug Fixes diff --git a/README.md b/README.md index 082e03d..53535ac 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -jQuery Bootgrid Plugin [![Build Status](https://travis-ci.org/rstaib/jquery-bootgrid.svg?branch=master)](https://travis-ci.org/rstaib/jquery-bootgrid) [![Bower version](https://badge.fury.io/bo/jquery.bootgrid.svg)](http://badge.fury.io/bo/jquery.bootgrid) [![NuGet version](https://badge.fury.io/nu/jquery.bootgrid.svg)](http://badge.fury.io/nu/jquery.bootgrid) +jQuery Bootgrid Plugin [![Build Status](http://img.shields.io/travis/rstaib/jquery-bootgrid/master.svg?style=flat-square)](https://travis-ci.org/rstaib/jquery-bootgrid) ![Bower version](http://img.shields.io/bower/v/jquery.bootgrid.svg?style=flat-square) ![NuGet version](http://img.shields.io/nuget/v/jquery.bootgrid.svg?style=flat-square) ![NPM version](http://img.shields.io/npm/v/jquery-bootgrid.svg?style=flat-square) ============ Nice, sleek and intuitive. A grid control especially designed for bootstrap. diff --git a/bootgrid.jquery.json b/bootgrid.jquery.json index 130089c..d3a203e 100644 --- a/bootgrid.jquery.json +++ b/bootgrid.jquery.json @@ -14,7 +14,7 @@ "accessibility", "bootstrap" ], - "version": "1.1.1", + "version": "1.2.0", "author": { "name": "Rafael Staib", "email": "me@rafaelstaib.com", diff --git a/bower.json b/bower.json index 20d0bad..42e0c35 100644 --- a/bower.json +++ b/bower.json @@ -13,7 +13,7 @@ "accessibility", "bootstrap" ], - "version": "1.1.1", + "version": "1.2.0", "authors": [ { "name": "Rafael Staib", "email": "me@rafaelstaib.com", "url": "http://www.rafaelstaib.com" } ], diff --git a/build/jQuery.Bootgrid.1.1.1.nupkg b/build/jQuery.Bootgrid.1.1.1.nupkg deleted file mode 100644 index 39b36bf..0000000 Binary files a/build/jQuery.Bootgrid.1.1.1.nupkg and /dev/null differ diff --git a/build/jQuery.Bootgrid.1.2.0.nupkg b/build/jQuery.Bootgrid.1.2.0.nupkg new file mode 100644 index 0000000..79ec814 Binary files /dev/null and b/build/jQuery.Bootgrid.1.2.0.nupkg differ diff --git a/build/jquery.bootgrid-1.1.1.zip b/build/jquery.bootgrid-1.1.1.zip deleted file mode 100644 index 1e90486..0000000 Binary files a/build/jquery.bootgrid-1.1.1.zip and /dev/null differ diff --git a/build/jquery.bootgrid-1.2.0.zip b/build/jquery.bootgrid-1.2.0.zip new file mode 100644 index 0000000..f1fdd8c Binary files /dev/null and b/build/jquery.bootgrid-1.2.0.zip differ diff --git a/build/jquery.bootgrid.css b/build/jquery.bootgrid.css index 652d291..ba75f66 100644 --- a/build/jquery.bootgrid.css +++ b/build/jquery.bootgrid.css @@ -94,8 +94,9 @@ top: 2px; } .bootgrid-table th:hover, -.bootgrid-table th:active { - background: #fafafa; +.bootgrid-table th:active, +.bootgrid-table th.active { + background: #fafafa !important; } .bootgrid-table td { overflow: hidden; diff --git a/build/jquery.bootgrid.js b/build/jquery.bootgrid.js index e3a4190..77d6a73 100644 --- a/build/jquery.bootgrid.js +++ b/build/jquery.bootgrid.js @@ -1,5 +1,5 @@ /*! - * jQuery Bootgrid v1.1.1 - 09/24/2014 + * jQuery Bootgrid v1.2.0 - 09/24/2014 * Copyright (c) 2014 Rafael Staib (http://www.jquery-bootgrid.com) * Licensed under MIT http://www.opensource.org/licenses/MIT */ @@ -133,7 +133,7 @@ } // ensures that only the first order will be applied in case of multi sorting is disabled - if (!that.options.multiSort && column.order !== null) + if (!that.options.multiSort && column.order != null) { sorted = true; } @@ -751,7 +751,8 @@ (sorting && sortOrder && sortOrder === "desc") ? css.iconDown : ""), icon = tpl.icon.resolve(getParams.call(that, { iconCss: iconCss })), align = column.headerAlign, - cssClass = (column.headerCssClass.length > 0) ? " " + column.headerCssClass : ""; + cssClass = ((column.headerCssClass.length > 0) ? " " + column.headerCssClass : "") + + ((that.options.highlightColumns && column.order != null) ? " " + that.options.css.active : ""); html += tpl.headerCell.resolve(getParams.call(that, { column: column, icon: icon, sortable: sorting && column.sortable && css.sortable || "", css: ((align === "right") ? css.right : (align === "center") ? @@ -764,7 +765,8 @@ // todo: create a own function for that piece of code if (sorting) { - var sortingSelector = getCssSelector(css.sortable), + var activeSelector = getCssSelector(css.active), + sortingSelector = getCssSelector(css.sortable), iconSelector = getCssSelector(css.icon); headerRow.off("click" + namespace, sortingSelector) .on("click" + namespace, sortingSelector, function (e) @@ -772,19 +774,20 @@ e.preventDefault(); var $this = $(this), columnId = $this.data("column-id") || $this.parents("th").first().data("column-id"), - sortOrder = that.sort[columnId], - icon = $this.find(iconSelector); + sortOrder = that.sort[columnId]; if (!that.options.multiSort) { - $this.parents("tr").first().find(iconSelector).removeClass(css.iconDown + " " + css.iconUp); + $this.parents("tr:first").find(iconSelector).removeClass(css.iconDown + " " + css.iconUp) + .end().find(activeSelector).removeClass(css.active); that.sort = {}; } if (sortOrder && sortOrder === "asc") { that.sort[columnId] = "desc"; - icon.removeClass(css.iconUp).addClass(css.iconDown); + $this.parent().addClass(css.active).find(iconSelector) + .removeClass(css.iconUp).addClass(css.iconDown); } else if (sortOrder && sortOrder === "desc") { @@ -799,18 +802,21 @@ } } that.sort = newSort; - icon.removeClass(css.iconDown); + $this.parent().removeClass(css.active).find(iconSelector) + .removeClass(css.iconDown); } else { that.sort[columnId] = "asc"; - icon.removeClass(css.iconDown).addClass(css.iconUp); + $this.parent().addClass(css.active).find(iconSelector) + .removeClass(css.iconDown).addClass(css.iconUp); } } else { that.sort[columnId] = "asc"; - icon.addClass(css.iconUp); + $this.parent().addClass(css.active).find(iconSelector) + .addClass(css.iconUp); } sortRows.call(that); @@ -951,6 +957,7 @@ this.header = null; this.footer = null; this.xqr = null; + this.original = this.element.clone(); // todo: implement cache }; @@ -1021,6 +1028,17 @@ **/ keepSelection: false, + /** + * Defines whether the columns which are filtered or sorted should be highlighted or not. + * + * @property highlightColumns + * @type Boolean + * @default false + * @for defaults + * @since 1.2.0 + **/ + highlightColumns: false, + highlightRows: false, // highlights new rows (find the page of the first new row) sorting: true, multiSort: false, @@ -1113,6 +1131,18 @@ **/ css: { actions: "actions btn-group", // must be a unique class name or constellation of class names within the header and footer + + /** + * CSS class to highlight active parts like sorted or filtered columns. + * + * @property active + * @type String + * @default "active" + * @for css + * @since 1.2.0 + **/ + active: "active", + center: "text-center", columnHeaderAnchor: "column-header-anchor", // must be a unique class name or constellation of class names within the column header cell columnHeaderText: "text", @@ -1234,7 +1264,7 @@ { if (this.options.ajax) { - // todo: implement ajax DELETE + // todo: implement ajax POST } else { @@ -1298,7 +1328,7 @@ { this.footer.remove(); } - this.element.remove("tbody").off(namespace).removeData(namespace); + this.element.before(this.original).remove(); return this; }; diff --git a/build/jquery.bootgrid.min.js b/build/jquery.bootgrid.min.js index 4daf3f1..f59047f 100644 --- a/build/jquery.bootgrid.min.js +++ b/build/jquery.bootgrid.min.js @@ -1,6 +1,6 @@ /*! - * jQuery Bootgrid v1.1.1 - 09/24/2014 + * jQuery Bootgrid v1.2.0 - 09/24/2014 * Copyright (c) 2014 Rafael Staib (http://www.jquery-bootgrid.com) * Licensed under MIT http://www.opensource.org/licenses/MIT */ -!function(a,b){"use strict";function c(a){function b(b){return c.identifier&&b[c.identifier]===a[c.identifier]}var c=this;return this.rows.contains(b)?!1:(this.rows.push(a),!0)}function d(b){return b?a.extend({},this.cachedParams,{ctx:b}):this.cachedParams}function e(){var b={current:this.current,rowCount:this.rowCount,sort:this.sort,searchPhrase:this.searchPhrase},c=this.options.post;return c=a.isFunction(c)?c():c,this.options.requestHandler(a.extend(!0,b,c))}function f(b){return"."+a.trim(b).replace(/\s+/gm,".")}function g(){var b=this.options.url;return a.isFunction(b)?b():b}function h(){this.element.trigger("initialize"+C),k.call(this),m.call(this),n.call(this),y.call(this),x.call(this),o.call(this),l.call(this),this.element.trigger("initialized"+C)}function i(){this.options.highlightRows}function j(a){return a.visible}function k(){var b=this,c=this.element.find("thead > tr").first(),d=!1;c.children().each(function(){var c=a(this),e=c.data(),f={id:e.columnId,identifier:null==b.identifier&&e.identifier||!1,converter:b.options.converters[e.converter||e.type]||b.options.converters.string,text:c.text(),align:e.align||"left",headerAlign:e.headerAlign||"left",cssClass:e.cssClass||"",headerCssClass:e.headerCssClass||"",formatter:b.options.formatters[e.formatter]||null,order:d||"asc"!==e.order&&"desc"!==e.order?null:e.order,searchable:!(e.searchable===!1),sortable:!(e.sortable===!1),visible:!(e.visible===!1)};b.columns.push(f),null!=f.order&&(b.sort[f.id]=f.order),f.identifier&&(b.identifier=f.id,b.converter=f.converter),b.options.multiSort||null===f.order||(d=!0)})}function l(){function c(a){for(var b,c=new RegExp(f.searchPhrase,f.options.caseSensitive?"g":"gi"),d=0;d-1)return!0;return!1}function d(a,b){f.currentRows=a,f.total=b,f.totalPages=Math.ceil(b/f.rowCount),f.options.keepSelection||(f.selectedRows=[]),v.call(f,a),q.call(f),s.call(f),f.element._bgBusyAria(!1).trigger("loaded"+C)}var f=this,h=e.call(this),i=g.call(this);if(this.options.ajax&&(null==i||"string"!=typeof i||0===i.length))throw new Error("Url setting must be a none empty string or a function that returns one.");if(this.element._bgBusyAria(!0).trigger("load"+C),A.call(this),this.options.ajax)f.xqr&&f.xqr.abort(),f.xqr=a.post(i,h,function(b){f.xqr=null,"string"==typeof b&&(b=a.parseJSON(b)),b=f.options.responseHandler(b),f.current=b.current,d(b.rows,b.total)}).fail(function(a,b){f.xqr=null,"abort"!==b&&(r.call(f),f.element._bgBusyAria(!1).trigger("loaded"+C))});else{var j=this.searchPhrase.length>0?this.rows.where(c):this.rows,k=j.length;-1!==this.rowCount&&(j=j.page(this.current,this.rowCount)),b.setTimeout(function(){d(j,k)},10)}}function m(){if(!this.options.ajax){var b=this,d=this.element.find("tbody > tr");d.each(function(){var d=a(this),e=d.children("td"),f={};a.each(b.columns,function(a,b){f[b.id]=b.converter.from(e.eq(a).text())}),c.call(b,f)}),this.total=this.rows.length,this.totalPages=-1===this.rowCount?1:Math.ceil(this.total/this.rowCount),B.call(this)}}function n(){var b=this.options.templates,c=this.element.parent().hasClass(this.options.css.responsiveTable)?this.element.parent():this.element;this.element.addClass(this.options.css.table),0===this.element.children("tbody").length&&this.element.append(b.body),1&this.options.navigation&&(this.header=a(b.header.resolve(d.call(this,{id:this.element._bgId()+"-header"}))),c.before(this.header)),2&this.options.navigation&&(this.footer=a(b.footer.resolve(d.call(this,{id:this.element._bgId()+"-footer"}))),c.after(this.footer))}function o(){if(0!==this.options.navigation){var b=this.options.css,c=f(b.actions),e=this.header.find(c),g=this.footer.find(c);if(e.length+g.length>0){var h=this,i=this.options.templates,j=a(i.actions.resolve(d.call(this)));if(this.options.ajax){var k=i.icon.resolve(d.call(this,{iconCss:b.iconRefresh})),m=a(i.actionButton.resolve(d.call(this,{content:k,text:this.options.labels.refresh}))).on("click"+C,function(a){a.stopPropagation(),h.current=1,l.call(h)});j.append(m)}u.call(this,j),p.call(this,j),z.call(this,e,j,1),z.call(this,g,j,2)}}}function p(b){if(this.options.columnSelection&&this.columns.length>1){var c=this,e=this.options.css,g=this.options.templates,h=g.icon.resolve(d.call(this,{iconCss:e.iconColumns})),i=a(g.actionDropDown.resolve(d.call(this,{content:h}))),k=f(e.dropDownItem),m=f(e.dropDownItemCheckbox),n=f(e.dropDownMenuItems);a.each(this.columns,function(b,h){var o=a(g.actionDropDownCheckboxItem.resolve(d.call(c,{name:h.id,label:h.text,checked:h.visible}))).on("click"+C,k,function(b){b.stopPropagation();var d=a(this),e=d.find(m);if(!e.prop("disabled")){h.visible=e.prop("checked");var f=c.columns.where(j).length>1;d.parents(n).find(k+":has("+m+":checked)")._bgEnableAria(f).find(m)._bgEnableField(f),c.element.find("tbody").empty(),y.call(c),l.call(c)}});i.find(f(e.dropDownMenuItems)).append(o)}),b.append(i)}}function q(){if(0!==this.options.navigation){var b=f(this.options.css.infos),c=this.header.find(b),e=this.footer.find(b);if(c.length+e.length>0){var g=this.current*this.rowCount,h=a(this.options.templates.infos.resolve(d.call(this,{end:0===this.total||-1===g||g>this.total?this.total:g,start:0===this.total?0:g-this.rowCount+1,total:this.total})));z.call(this,c,h,1),z.call(this,e,h,2)}}}function r(){var a=this.element.children("tbody").first(),b=this.options.templates,c=this.columns.where(j).length;this.options.selection&&null!=this.identifier&&(c+=1),a.html(b.noResults.resolve(d.call(this,{columns:c})))}function s(){if(0!==this.options.navigation){var b=f(this.options.css.pagination),c=this.header.find(b)._bgShowAria(-1!==this.rowCount),e=this.footer.find(b)._bgShowAria(-1!==this.rowCount);if(-1!==this.rowCount&&c.length+e.length>0){var g=this.options.templates,h=this.current,i=this.totalPages,j=a(g.pagination.resolve(d.call(this))),k=i-h,l=-1*(this.options.padding-h),m=k>=this.options.padding?Math.max(l,1):Math.max(l-this.options.padding+k,1),n=2*this.options.padding+1,o=i>=n?n:i;t.call(this,j,"first","«","first")._bgEnableAria(h>1),t.call(this,j,"prev","<","prev")._bgEnableAria(h>1);for(var p=0;o>p;p++){var q=p+m;t.call(this,j,q,q,"page-"+q)._bgEnableAria()._bgSelectAria(q===h)}0===o&&t.call(this,j,1,1,"page-1")._bgEnableAria(!1)._bgSelectAria(),t.call(this,j,"next",">","next")._bgEnableAria(i>h),t.call(this,j,"last","»","last")._bgEnableAria(i>h),z.call(this,c,j,1),z.call(this,e,j,2)}}}function t(b,c,e,g){var h=this,i=this.options.templates,j=this.options.css,k=d.call(this,{css:g,text:e,uri:"#"+c}),m=a(i.paginationItem.resolve(k)).on("click"+C,f(j.paginationButton),function(b){b.stopPropagation();var c=a(this),d=c.parent();if(!d.hasClass("active")&&!d.hasClass("disabled")){var e={first:1,prev:h.current-1,next:h.current+1,last:h.totalPages},f=c.attr("href").substr(1);h.current=e[f]||+f,l.call(h)}c.trigger("blur")});return b.append(m),m}function u(b){function c(a){return-1===a?e.options.labels.all:a}var e=this,g=this.options.rowCount;if(a.isArray(g)){var h=this.options.css,i=this.options.templates,j=a(i.actionDropDown.resolve(d.call(this,{content:this.rowCount}))),k=f(h.dropDownMenu),m=f(h.dropDownMenuText),n=f(h.dropDownMenuItems),o=f(h.dropDownItemButton);a.each(g,function(b,f){var g=a(i.actionDropDownItem.resolve(d.call(e,{text:c(f),uri:"#"+f})))._bgSelectAria(f===e.rowCount).on("click"+C,o,function(b){b.preventDefault();var d=a(this),f=+d.attr("href").substr(1);f!==e.rowCount&&(e.current=1,e.rowCount=f,d.parents(n).children().each(function(){var b=a(this),c=+b.find(o).attr("href").substr(1);b._bgSelectAria(c===f)}),d.parents(k).find(m).text(c(f)),l.call(e))});j.find(n).append(g)}),b.append(j)}}function v(b){if(b.length>0){var c=this,e=this.options.css,g=this.options.templates,h=this.element.children("tbody").first(),i=this.options.selection&&null!=this.identifier,j=!0,k="",l="",m="",n="";a.each(b,function(b,f){if(l="",m=' data-row-id="'+(null==c.identifier?b:f[c.identifier])+'"',n="",i){var h=-1!==a.inArray(f[c.identifier],c.selectedRows),o=g.select.resolve(d.call(c,{type:"checkbox",value:f[c.identifier],checked:h}));l+=g.cell.resolve(d.call(c,{content:o,css:e.selectCell})),j=j&&h,h&&(n+=e.selected,m+=' aria-selected="true"')}a.each(c.columns,function(b,h){if(h.visible){var i=a.isFunction(h.formatter)?h.formatter.call(c,h,f):h.converter.to(f[h.id]),j=h.cssClass.length>0?" "+h.cssClass:"";l+=g.cell.resolve(d.call(c,{content:null==i||""===i?" ":i,css:("right"===h.align?e.right:"center"===h.align?e.center:e.left)+j}))}}),n.length>0&&(m+=' class="'+n+'"'),k+=g.row.resolve(d.call(c,{attr:m,cells:l}))}),c.element.find("thead "+f(c.options.css.selectBox)).prop("checked",j),h.html(k),w.call(this,h)}else r.call(this)}function w(b){var c=this,d=this.options.selection&&null!=this.identifier,e=f(this.options.css.selectBox);d&&b.off("click"+C,e).on("click"+C,e,function(b){b.stopPropagation();var d=a(this),e=c.converter.from(d.val());d.prop("checked")?c.select([e]):c.deselect([e])}),b.off("click"+C,"> tr").on("click"+C,"> tr",function(b){b.stopPropagation();var e=a(this),f=c.converter.from(e.data("row-id")),g=null==this.identifier?c.currentRows[f]:c.currentRows.first(function(a){return a[c.identifier]===f});d&&c.options.rowSelect&&(e.hasClass(c.options.css.selected)?c.deselect([f]):c.select([f])),c.element.trigger("click"+C,[c.columns,g])})}function x(){if(0!==this.options.navigation){var c=this.options.css,e=f(c.search),g=this.header.find(e),h=this.footer.find(e);if(g.length+h.length>0){var i=this,j=this.options.templates,k=null,l="",m=f(c.searchField),n=a(j.search.resolve(d.call(this))),o=n.is(m)?n:n.find(m);o.on("keyup"+C,function(c){c.stopPropagation();var d=a(this).val();l!==d&&(l=d,b.clearTimeout(k),k=b.setTimeout(function(){i.search(d)},250))}),z.call(this,g,n,1),z.call(this,h,n,2)}}}function y(){var b=this,c=this.element.find("thead > tr"),e=this.options.css,g=this.options.templates,h="",i=this.options.sorting,j=this.options.selection&&null!=this.identifier;if(j){var k=this.options.multiSelect?g.select.resolve(d.call(b,{type:"checkbox",value:"all"})):"";h+=g.rawHeaderCell.resolve(d.call(b,{content:k,css:e.selectCell}))}if(a.each(this.columns,function(a,c){if(c.visible){var f=b.sort[c.id],j=i&&f&&"asc"===f?e.iconUp:i&&f&&"desc"===f?e.iconDown:"",k=g.icon.resolve(d.call(b,{iconCss:j})),l=c.headerAlign,m=c.headerCssClass.length>0?" "+c.headerCssClass:"";h+=g.headerCell.resolve(d.call(b,{column:c,icon:k,sortable:i&&c.sortable&&e.sortable||"",css:("right"===l?e.right:"center"===l?e.center:e.left)+m}))}}),c.html(h),i){var m=f(e.sortable),n=f(e.icon);c.off("click"+C,m).on("click"+C,m,function(c){c.preventDefault();var d=a(this),f=d.data("column-id")||d.parents("th").first().data("column-id"),g=b.sort[f],h=d.find(n);if(b.options.multiSort||(d.parents("tr").first().find(n).removeClass(e.iconDown+" "+e.iconUp),b.sort={}),g&&"asc"===g)b.sort[f]="desc",h.removeClass(e.iconUp).addClass(e.iconDown);else if(g&&"desc"===g)if(b.options.multiSort){var i={};for(var j in b.sort)j!==f&&(i[j]=b.sort[j]);b.sort=i,h.removeClass(e.iconDown)}else b.sort[f]="asc",h.removeClass(e.iconDown).addClass(e.iconUp);else b.sort[f]="asc",h.addClass(e.iconUp);B.call(b),l.call(b)})}if(j&&this.options.multiSelect){var o=f(e.selectBox);c.off("click"+C,o).on("click"+C,o,function(c){c.stopPropagation(),a(this).prop("checked")?b.select():b.deselect()})}}function z(b,c,d){this.options.navigation&d&&b.each(function(b,d){a(d).before(c.clone(!0)).remove()})}function A(){var a=this.options.templates,b=this.element.children("thead").first(),c=this.element.children("tbody").first(),e=c.find("tr > td").first(),f=this.element.height()-b.height()-(e.height()+20),g=this.columns.where(j).length;this.options.selection&&null!=this.identifier&&(g+=1),c.html(a.loading.resolve(d.call(this,{columns:g}))),-1!==this.rowCount&&f>0&&c.find("tr > td").css("padding","20px 0 "+f+"px")}function B(){function a(c,d,e){function f(a){return"asc"===h.order?a:-1*a}e=e||0;var g=e+1,h=b[e];return c[h.id]>d[h.id]?f(1):c[h.id]g?a(c,d,g):0}var b=[];if(!this.options.ajax){for(var c in this.sort)(this.options.multiSort||0===b.length)&&b.push({id:c,order:this.sort[c]});b.length>0&&this.rows.sort(a)}}var C=".rs.jquery.bootgrid",D=function(b,c){this.element=a(b),this.options=a.extend(!0,{},D.defaults,this.element.data(),c);var d=this.options.rowCount=this.element.data().rowCount||c.rowCount||this.options.rowCount;this.columns=[],this.current=1,this.currentRows=[],this.identifier=null,this.converter=null,this.rowCount=a.isArray(d)?d[0]:d,this.rows=[],this.searchPhrase="",this.selectedRows=[],this.sort={},this.total=0,this.totalPages=0,this.cachedParams={lbl:this.options.labels,css:this.options.css,ctx:{}},this.header=null,this.footer=null,this.xqr=null};if(D.defaults={navigation:3,padding:2,columnSelection:!0,rowCount:[10,25,50,-1],selection:!1,multiSelect:!1,rowSelect:!1,keepSelection:!1,highlightRows:!1,sorting:!0,multiSort:!1,ajax:!1,post:{},url:"",caseSensitive:!0,requestHandler:function(a){return a},responseHandler:function(a){return a},converters:{numeric:{from:function(a){return+a},to:function(a){return a+""}},string:{from:function(a){return a},to:function(a){return a}}},css:{actions:"actions btn-group",center:"text-center",columnHeaderAnchor:"column-header-anchor",columnHeaderText:"text",dropDownItem:"dropdown-item",dropDownItemButton:"dropdown-item-button",dropDownItemCheckbox:"dropdown-item-checkbox",dropDownMenu:"dropdown btn-group",dropDownMenuItems:"dropdown-menu pull-right",dropDownMenuText:"dropdown-text",footer:"bootgrid-footer container-fluid",header:"bootgrid-header container-fluid",icon:"icon glyphicon",iconColumns:"glyphicon-th-list",iconDown:"glyphicon-chevron-down",iconRefresh:"glyphicon-refresh",iconUp:"glyphicon-chevron-up",infos:"infos",left:"text-left",pagination:"pagination",paginationButton:"button",responsiveTable:"table-responsive",right:"text-right",search:"search form-group",searchField:"search-field form-control",selectBox:"select-box",selectCell:"select-cell",selected:"active",sortable:"sortable",table:"bootgrid-table table"},formatters:{},labels:{all:"All",infos:"Showing {{ctx.start}} to {{ctx.end}} of {{ctx.total}} entries",loading:"Loading...",noResults:"No results found!",refresh:"Refresh",search:"Search"},templates:{actionButton:'',actionDropDown:'
',actionDropDownItem:'
  • {{ctx.text}}
  • ',actionDropDownCheckboxItem:'
  • ',actions:'
    ',body:"",cell:'{{ctx.content}}',footer:'

    ',header:'

    ',headerCell:'{{ctx.column.text}}{{ctx.icon}}',icon:'',infos:'
    {{lbl.infos}}
    ',loading:'{{lbl.loading}}',noResults:'{{lbl.noResults}}',pagination:'',paginationItem:'
  • {{ctx.text}}
  • ',rawHeaderCell:'{{ctx.content}}',row:"{{ctx.cells}}",search:'
    ',select:''}},D.prototype.append=function(a){if(this.options.ajax);else{for(var b=[],d=0;d0&&(this.options.multiSelect||1!==e.length);)if(c=b.pop(),-1===a.inArray(c,this.selectedRows))for(d=0;d0){var g=f(this.options.css.selectBox),h=this.selectedRows.length>=this.currentRows.length;for(d=0;!this.options.keepSelection&&h&&d tr "+g+":checked").trigger("click"+C),d=0;d tr[data-row-id="'+this.selectedRows[d]+'"]').addClass(this.options.css.selected)._bgAria("selected","true").find(g).prop("checked",!0);this.element.trigger("selected"+C,[e])}}return this},D.prototype.deselect=function(b){if(this.options.selection&&null!=this.identifier){b=b||this.currentRows.propValues(this.identifier);for(var c,d,e,g=[];b.length>0;)if(c=b.pop(),e=a.inArray(c,this.selectedRows),-1!==e)for(d=0;d0){var h=f(this.options.css.selectBox);for(this.element.find("thead "+h).prop("checked",!1),d=0;d tr[data-row-id="'+g[d][this.identifier]+'"]').removeClass(this.options.css.selected)._bgAria("selected","false").find(h).prop("checked",!1);this.element.trigger("deselected"+C,[g])}}return this},D.prototype.sort=function(b){var c=b?a.extend({},b):{};return c===this.sort?this:(this.sort=c,y.call(this),B.call(this),l.call(this),this)},a.fn.extend({_bgAria:function(a,b){return this.attr("aria-"+a,b)},_bgBusyAria:function(a){return null==a||a?this._bgAria("busy","true"):this._bgAria("busy","false")},_bgRemoveAria:function(a){return this.removeAttr("aria-"+a)},_bgEnableAria:function(a){return null==a||a?this.removeClass("disabled")._bgAria("disabled","false"):this.addClass("disabled")._bgAria("disabled","true")},_bgEnableField:function(a){return null==a||a?this.removeAttr("disabled"):this.attr("disabled","disable")},_bgShowAria:function(a){return null==a||a?this.show()._bgAria("hidden","false"):this.hide()._bgAria("hidden","true")},_bgSelectAria:function(a){return null==a||a?this.addClass("active")._bgAria("selected","true"):this.removeClass("active")._bgAria("selected","false")},_bgId:function(a){return a?this.attr("id",a):this.attr("id")}}),!String.prototype.resolve){var E={checked:function(a){return"boolean"==typeof a?a?'checked="checked"':"":a}};String.prototype.resolve=function(b,c){var d=this;return a.each(b,function(b,e){if(null!=e&&"function"!=typeof e)if("object"==typeof e){var f=c?a.extend([],c):[];f.push(b),d=d.resolve(e,f)+""}else{E&&E[b]&&"function"==typeof E[b]&&(e=E[b](e)),b=c?c.join(".")+"."+b:b;var g=new RegExp("\\{\\{"+b+"\\}\\}","gm");d=d.replace(g,e.replace?e.replace(/\$/gi,"$"):e)}}),d}}Array.prototype.first||(Array.prototype.first=function(a){for(var b=0;bc?this.length>d?this.slice(c,d):this.slice(c):[]}),Array.prototype.where||(Array.prototype.where=function(a){for(var b=[],c=0;c tr").first(),d=!1;c.children().each(function(){var c=a(this),e=c.data(),f={id:e.columnId,identifier:null==b.identifier&&e.identifier||!1,converter:b.options.converters[e.converter||e.type]||b.options.converters.string,text:c.text(),align:e.align||"left",headerAlign:e.headerAlign||"left",cssClass:e.cssClass||"",headerCssClass:e.headerCssClass||"",formatter:b.options.formatters[e.formatter]||null,order:d||"asc"!==e.order&&"desc"!==e.order?null:e.order,searchable:!(e.searchable===!1),sortable:!(e.sortable===!1),visible:!(e.visible===!1)};b.columns.push(f),null!=f.order&&(b.sort[f.id]=f.order),f.identifier&&(b.identifier=f.id,b.converter=f.converter),b.options.multiSort||null==f.order||(d=!0)})}function l(){function c(a){for(var b,c=new RegExp(f.searchPhrase,f.options.caseSensitive?"g":"gi"),d=0;d-1)return!0;return!1}function d(a,b){f.currentRows=a,f.total=b,f.totalPages=Math.ceil(b/f.rowCount),f.options.keepSelection||(f.selectedRows=[]),v.call(f,a),q.call(f),s.call(f),f.element._bgBusyAria(!1).trigger("loaded"+C)}var f=this,h=e.call(this),i=g.call(this);if(this.options.ajax&&(null==i||"string"!=typeof i||0===i.length))throw new Error("Url setting must be a none empty string or a function that returns one.");if(this.element._bgBusyAria(!0).trigger("load"+C),A.call(this),this.options.ajax)f.xqr&&f.xqr.abort(),f.xqr=a.post(i,h,function(b){f.xqr=null,"string"==typeof b&&(b=a.parseJSON(b)),b=f.options.responseHandler(b),f.current=b.current,d(b.rows,b.total)}).fail(function(a,b){f.xqr=null,"abort"!==b&&(r.call(f),f.element._bgBusyAria(!1).trigger("loaded"+C))});else{var j=this.searchPhrase.length>0?this.rows.where(c):this.rows,k=j.length;-1!==this.rowCount&&(j=j.page(this.current,this.rowCount)),b.setTimeout(function(){d(j,k)},10)}}function m(){if(!this.options.ajax){var b=this,d=this.element.find("tbody > tr");d.each(function(){var d=a(this),e=d.children("td"),f={};a.each(b.columns,function(a,b){f[b.id]=b.converter.from(e.eq(a).text())}),c.call(b,f)}),this.total=this.rows.length,this.totalPages=-1===this.rowCount?1:Math.ceil(this.total/this.rowCount),B.call(this)}}function n(){var b=this.options.templates,c=this.element.parent().hasClass(this.options.css.responsiveTable)?this.element.parent():this.element;this.element.addClass(this.options.css.table),0===this.element.children("tbody").length&&this.element.append(b.body),1&this.options.navigation&&(this.header=a(b.header.resolve(d.call(this,{id:this.element._bgId()+"-header"}))),c.before(this.header)),2&this.options.navigation&&(this.footer=a(b.footer.resolve(d.call(this,{id:this.element._bgId()+"-footer"}))),c.after(this.footer))}function o(){if(0!==this.options.navigation){var b=this.options.css,c=f(b.actions),e=this.header.find(c),g=this.footer.find(c);if(e.length+g.length>0){var h=this,i=this.options.templates,j=a(i.actions.resolve(d.call(this)));if(this.options.ajax){var k=i.icon.resolve(d.call(this,{iconCss:b.iconRefresh})),m=a(i.actionButton.resolve(d.call(this,{content:k,text:this.options.labels.refresh}))).on("click"+C,function(a){a.stopPropagation(),h.current=1,l.call(h)});j.append(m)}u.call(this,j),p.call(this,j),z.call(this,e,j,1),z.call(this,g,j,2)}}}function p(b){if(this.options.columnSelection&&this.columns.length>1){var c=this,e=this.options.css,g=this.options.templates,h=g.icon.resolve(d.call(this,{iconCss:e.iconColumns})),i=a(g.actionDropDown.resolve(d.call(this,{content:h}))),k=f(e.dropDownItem),m=f(e.dropDownItemCheckbox),n=f(e.dropDownMenuItems);a.each(this.columns,function(b,h){var o=a(g.actionDropDownCheckboxItem.resolve(d.call(c,{name:h.id,label:h.text,checked:h.visible}))).on("click"+C,k,function(b){b.stopPropagation();var d=a(this),e=d.find(m);if(!e.prop("disabled")){h.visible=e.prop("checked");var f=c.columns.where(j).length>1;d.parents(n).find(k+":has("+m+":checked)")._bgEnableAria(f).find(m)._bgEnableField(f),c.element.find("tbody").empty(),y.call(c),l.call(c)}});i.find(f(e.dropDownMenuItems)).append(o)}),b.append(i)}}function q(){if(0!==this.options.navigation){var b=f(this.options.css.infos),c=this.header.find(b),e=this.footer.find(b);if(c.length+e.length>0){var g=this.current*this.rowCount,h=a(this.options.templates.infos.resolve(d.call(this,{end:0===this.total||-1===g||g>this.total?this.total:g,start:0===this.total?0:g-this.rowCount+1,total:this.total})));z.call(this,c,h,1),z.call(this,e,h,2)}}}function r(){var a=this.element.children("tbody").first(),b=this.options.templates,c=this.columns.where(j).length;this.options.selection&&null!=this.identifier&&(c+=1),a.html(b.noResults.resolve(d.call(this,{columns:c})))}function s(){if(0!==this.options.navigation){var b=f(this.options.css.pagination),c=this.header.find(b)._bgShowAria(-1!==this.rowCount),e=this.footer.find(b)._bgShowAria(-1!==this.rowCount);if(-1!==this.rowCount&&c.length+e.length>0){var g=this.options.templates,h=this.current,i=this.totalPages,j=a(g.pagination.resolve(d.call(this))),k=i-h,l=-1*(this.options.padding-h),m=k>=this.options.padding?Math.max(l,1):Math.max(l-this.options.padding+k,1),n=2*this.options.padding+1,o=i>=n?n:i;t.call(this,j,"first","«","first")._bgEnableAria(h>1),t.call(this,j,"prev","<","prev")._bgEnableAria(h>1);for(var p=0;o>p;p++){var q=p+m;t.call(this,j,q,q,"page-"+q)._bgEnableAria()._bgSelectAria(q===h)}0===o&&t.call(this,j,1,1,"page-1")._bgEnableAria(!1)._bgSelectAria(),t.call(this,j,"next",">","next")._bgEnableAria(i>h),t.call(this,j,"last","»","last")._bgEnableAria(i>h),z.call(this,c,j,1),z.call(this,e,j,2)}}}function t(b,c,e,g){var h=this,i=this.options.templates,j=this.options.css,k=d.call(this,{css:g,text:e,uri:"#"+c}),m=a(i.paginationItem.resolve(k)).on("click"+C,f(j.paginationButton),function(b){b.stopPropagation();var c=a(this),d=c.parent();if(!d.hasClass("active")&&!d.hasClass("disabled")){var e={first:1,prev:h.current-1,next:h.current+1,last:h.totalPages},f=c.attr("href").substr(1);h.current=e[f]||+f,l.call(h)}c.trigger("blur")});return b.append(m),m}function u(b){function c(a){return-1===a?e.options.labels.all:a}var e=this,g=this.options.rowCount;if(a.isArray(g)){var h=this.options.css,i=this.options.templates,j=a(i.actionDropDown.resolve(d.call(this,{content:this.rowCount}))),k=f(h.dropDownMenu),m=f(h.dropDownMenuText),n=f(h.dropDownMenuItems),o=f(h.dropDownItemButton);a.each(g,function(b,f){var g=a(i.actionDropDownItem.resolve(d.call(e,{text:c(f),uri:"#"+f})))._bgSelectAria(f===e.rowCount).on("click"+C,o,function(b){b.preventDefault();var d=a(this),f=+d.attr("href").substr(1);f!==e.rowCount&&(e.current=1,e.rowCount=f,d.parents(n).children().each(function(){var b=a(this),c=+b.find(o).attr("href").substr(1);b._bgSelectAria(c===f)}),d.parents(k).find(m).text(c(f)),l.call(e))});j.find(n).append(g)}),b.append(j)}}function v(b){if(b.length>0){var c=this,e=this.options.css,g=this.options.templates,h=this.element.children("tbody").first(),i=this.options.selection&&null!=this.identifier,j=!0,k="",l="",m="",n="";a.each(b,function(b,f){if(l="",m=' data-row-id="'+(null==c.identifier?b:f[c.identifier])+'"',n="",i){var h=-1!==a.inArray(f[c.identifier],c.selectedRows),o=g.select.resolve(d.call(c,{type:"checkbox",value:f[c.identifier],checked:h}));l+=g.cell.resolve(d.call(c,{content:o,css:e.selectCell})),j=j&&h,h&&(n+=e.selected,m+=' aria-selected="true"')}a.each(c.columns,function(b,h){if(h.visible){var i=a.isFunction(h.formatter)?h.formatter.call(c,h,f):h.converter.to(f[h.id]),j=h.cssClass.length>0?" "+h.cssClass:"";l+=g.cell.resolve(d.call(c,{content:null==i||""===i?" ":i,css:("right"===h.align?e.right:"center"===h.align?e.center:e.left)+j}))}}),n.length>0&&(m+=' class="'+n+'"'),k+=g.row.resolve(d.call(c,{attr:m,cells:l}))}),c.element.find("thead "+f(c.options.css.selectBox)).prop("checked",j),h.html(k),w.call(this,h)}else r.call(this)}function w(b){var c=this,d=this.options.selection&&null!=this.identifier,e=f(this.options.css.selectBox);d&&b.off("click"+C,e).on("click"+C,e,function(b){b.stopPropagation();var d=a(this),e=c.converter.from(d.val());d.prop("checked")?c.select([e]):c.deselect([e])}),b.off("click"+C,"> tr").on("click"+C,"> tr",function(b){b.stopPropagation();var e=a(this),f=c.converter.from(e.data("row-id")),g=null==this.identifier?c.currentRows[f]:c.currentRows.first(function(a){return a[c.identifier]===f});d&&c.options.rowSelect&&(e.hasClass(c.options.css.selected)?c.deselect([f]):c.select([f])),c.element.trigger("click"+C,[c.columns,g])})}function x(){if(0!==this.options.navigation){var c=this.options.css,e=f(c.search),g=this.header.find(e),h=this.footer.find(e);if(g.length+h.length>0){var i=this,j=this.options.templates,k=null,l="",m=f(c.searchField),n=a(j.search.resolve(d.call(this))),o=n.is(m)?n:n.find(m);o.on("keyup"+C,function(c){c.stopPropagation();var d=a(this).val();l!==d&&(l=d,b.clearTimeout(k),k=b.setTimeout(function(){i.search(d)},250))}),z.call(this,g,n,1),z.call(this,h,n,2)}}}function y(){var b=this,c=this.element.find("thead > tr"),e=this.options.css,g=this.options.templates,h="",i=this.options.sorting,j=this.options.selection&&null!=this.identifier;if(j){var k=this.options.multiSelect?g.select.resolve(d.call(b,{type:"checkbox",value:"all"})):"";h+=g.rawHeaderCell.resolve(d.call(b,{content:k,css:e.selectCell}))}if(a.each(this.columns,function(a,c){if(c.visible){var f=b.sort[c.id],j=i&&f&&"asc"===f?e.iconUp:i&&f&&"desc"===f?e.iconDown:"",k=g.icon.resolve(d.call(b,{iconCss:j})),l=c.headerAlign,m=(c.headerCssClass.length>0?" "+c.headerCssClass:"")+(b.options.highlightColumns&&null!=c.order?" "+b.options.css.active:"");h+=g.headerCell.resolve(d.call(b,{column:c,icon:k,sortable:i&&c.sortable&&e.sortable||"",css:("right"===l?e.right:"center"===l?e.center:e.left)+m}))}}),c.html(h),i){var m=f(e.active),n=f(e.sortable),o=f(e.icon);c.off("click"+C,n).on("click"+C,n,function(c){c.preventDefault();var d=a(this),f=d.data("column-id")||d.parents("th").first().data("column-id"),g=b.sort[f];if(b.options.multiSort||(d.parents("tr:first").find(o).removeClass(e.iconDown+" "+e.iconUp).end().find(m).removeClass(e.active),b.sort={}),g&&"asc"===g)b.sort[f]="desc",d.parent().addClass(e.active).find(o).removeClass(e.iconUp).addClass(e.iconDown);else if(g&&"desc"===g)if(b.options.multiSort){var h={};for(var i in b.sort)i!==f&&(h[i]=b.sort[i]);b.sort=h,d.parent().removeClass(e.active).find(o).removeClass(e.iconDown)}else b.sort[f]="asc",d.parent().addClass(e.active).find(o).removeClass(e.iconDown).addClass(e.iconUp);else b.sort[f]="asc",d.parent().addClass(e.active).find(o).addClass(e.iconUp);B.call(b),l.call(b)})}if(j&&this.options.multiSelect){var p=f(e.selectBox);c.off("click"+C,p).on("click"+C,p,function(c){c.stopPropagation(),a(this).prop("checked")?b.select():b.deselect()})}}function z(b,c,d){this.options.navigation&d&&b.each(function(b,d){a(d).before(c.clone(!0)).remove()})}function A(){var a=this.options.templates,b=this.element.children("thead").first(),c=this.element.children("tbody").first(),e=c.find("tr > td").first(),f=this.element.height()-b.height()-(e.height()+20),g=this.columns.where(j).length;this.options.selection&&null!=this.identifier&&(g+=1),c.html(a.loading.resolve(d.call(this,{columns:g}))),-1!==this.rowCount&&f>0&&c.find("tr > td").css("padding","20px 0 "+f+"px")}function B(){function a(c,d,e){function f(a){return"asc"===h.order?a:-1*a}e=e||0;var g=e+1,h=b[e];return c[h.id]>d[h.id]?f(1):c[h.id]g?a(c,d,g):0}var b=[];if(!this.options.ajax){for(var c in this.sort)(this.options.multiSort||0===b.length)&&b.push({id:c,order:this.sort[c]});b.length>0&&this.rows.sort(a)}}var C=".rs.jquery.bootgrid",D=function(b,c){this.element=a(b),this.options=a.extend(!0,{},D.defaults,this.element.data(),c);var d=this.options.rowCount=this.element.data().rowCount||c.rowCount||this.options.rowCount;this.columns=[],this.current=1,this.currentRows=[],this.identifier=null,this.converter=null,this.rowCount=a.isArray(d)?d[0]:d,this.rows=[],this.searchPhrase="",this.selectedRows=[],this.sort={},this.total=0,this.totalPages=0,this.cachedParams={lbl:this.options.labels,css:this.options.css,ctx:{}},this.header=null,this.footer=null,this.xqr=null,this.original=this.element.clone()};if(D.defaults={navigation:3,padding:2,columnSelection:!0,rowCount:[10,25,50,-1],selection:!1,multiSelect:!1,rowSelect:!1,keepSelection:!1,highlightColumns:!1,highlightRows:!1,sorting:!0,multiSort:!1,ajax:!1,post:{},url:"",caseSensitive:!0,requestHandler:function(a){return a},responseHandler:function(a){return a},converters:{numeric:{from:function(a){return+a},to:function(a){return a+""}},string:{from:function(a){return a},to:function(a){return a}}},css:{actions:"actions btn-group",active:"active",center:"text-center",columnHeaderAnchor:"column-header-anchor",columnHeaderText:"text",dropDownItem:"dropdown-item",dropDownItemButton:"dropdown-item-button",dropDownItemCheckbox:"dropdown-item-checkbox",dropDownMenu:"dropdown btn-group",dropDownMenuItems:"dropdown-menu pull-right",dropDownMenuText:"dropdown-text",footer:"bootgrid-footer container-fluid",header:"bootgrid-header container-fluid",icon:"icon glyphicon",iconColumns:"glyphicon-th-list",iconDown:"glyphicon-chevron-down",iconRefresh:"glyphicon-refresh",iconUp:"glyphicon-chevron-up",infos:"infos",left:"text-left",pagination:"pagination",paginationButton:"button",responsiveTable:"table-responsive",right:"text-right",search:"search form-group",searchField:"search-field form-control",selectBox:"select-box",selectCell:"select-cell",selected:"active",sortable:"sortable",table:"bootgrid-table table"},formatters:{},labels:{all:"All",infos:"Showing {{ctx.start}} to {{ctx.end}} of {{ctx.total}} entries",loading:"Loading...",noResults:"No results found!",refresh:"Refresh",search:"Search"},templates:{actionButton:'',actionDropDown:'
    ',actionDropDownItem:'
  • {{ctx.text}}
  • ',actionDropDownCheckboxItem:'
  • ',actions:'
    ',body:"",cell:'{{ctx.content}}',footer:'

    ',header:'

    ',headerCell:'{{ctx.column.text}}{{ctx.icon}}',icon:'',infos:'
    {{lbl.infos}}
    ',loading:'{{lbl.loading}}',noResults:'{{lbl.noResults}}',pagination:'
      ',paginationItem:'
    • {{ctx.text}}
    • ',rawHeaderCell:'{{ctx.content}}',row:"{{ctx.cells}}",search:'
      ',select:''}},D.prototype.append=function(a){if(this.options.ajax);else{for(var b=[],d=0;d0&&(this.options.multiSelect||1!==e.length);)if(c=b.pop(),-1===a.inArray(c,this.selectedRows))for(d=0;d0){var g=f(this.options.css.selectBox),h=this.selectedRows.length>=this.currentRows.length;for(d=0;!this.options.keepSelection&&h&&d tr "+g+":checked").trigger("click"+C),d=0;d tr[data-row-id="'+this.selectedRows[d]+'"]').addClass(this.options.css.selected)._bgAria("selected","true").find(g).prop("checked",!0);this.element.trigger("selected"+C,[e])}}return this},D.prototype.deselect=function(b){if(this.options.selection&&null!=this.identifier){b=b||this.currentRows.propValues(this.identifier);for(var c,d,e,g=[];b.length>0;)if(c=b.pop(),e=a.inArray(c,this.selectedRows),-1!==e)for(d=0;d0){var h=f(this.options.css.selectBox);for(this.element.find("thead "+h).prop("checked",!1),d=0;d tr[data-row-id="'+g[d][this.identifier]+'"]').removeClass(this.options.css.selected)._bgAria("selected","false").find(h).prop("checked",!1);this.element.trigger("deselected"+C,[g])}}return this},D.prototype.sort=function(b){var c=b?a.extend({},b):{};return c===this.sort?this:(this.sort=c,y.call(this),B.call(this),l.call(this),this)},a.fn.extend({_bgAria:function(a,b){return this.attr("aria-"+a,b)},_bgBusyAria:function(a){return null==a||a?this._bgAria("busy","true"):this._bgAria("busy","false")},_bgRemoveAria:function(a){return this.removeAttr("aria-"+a)},_bgEnableAria:function(a){return null==a||a?this.removeClass("disabled")._bgAria("disabled","false"):this.addClass("disabled")._bgAria("disabled","true")},_bgEnableField:function(a){return null==a||a?this.removeAttr("disabled"):this.attr("disabled","disable")},_bgShowAria:function(a){return null==a||a?this.show()._bgAria("hidden","false"):this.hide()._bgAria("hidden","true")},_bgSelectAria:function(a){return null==a||a?this.addClass("active")._bgAria("selected","true"):this.removeClass("active")._bgAria("selected","false")},_bgId:function(a){return a?this.attr("id",a):this.attr("id")}}),!String.prototype.resolve){var E={checked:function(a){return"boolean"==typeof a?a?'checked="checked"':"":a}};String.prototype.resolve=function(b,c){var d=this;return a.each(b,function(b,e){if(null!=e&&"function"!=typeof e)if("object"==typeof e){var f=c?a.extend([],c):[];f.push(b),d=d.resolve(e,f)+""}else{E&&E[b]&&"function"==typeof E[b]&&(e=E[b](e)),b=c?c.join(".")+"."+b:b;var g=new RegExp("\\{\\{"+b+"\\}\\}","gm");d=d.replace(g,e.replace?e.replace(/\$/gi,"$"):e)}}),d}}Array.prototype.first||(Array.prototype.first=function(a){for(var b=0;bc?this.length>d?this.slice(c,d):this.slice(c):[]}),Array.prototype.where||(Array.prototype.where=function(a){for(var b=[],c=0;c - +
      - - + + @@ -66,7 +66,7 @@ - + diff --git a/package.json b/package.json index 7c9b894..5b5be85 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jquery-bootgrid", "namespace": "jquery.bootgrid", "title": "jQuery Bootgrid", - "version": "1.1.1", + "version": "1.2.0", "description": "Nice, sleek and intuitive. A grid control especially designed for bootstrap.", "homepage": "http://www.jquery-bootgrid.com", "author": { diff --git a/src/internal.js b/src/internal.js index 26c8202..61bc6fd 100644 --- a/src/internal.js +++ b/src/internal.js @@ -123,7 +123,7 @@ function loadColumns() } // ensures that only the first order will be applied in case of multi sorting is disabled - if (!that.options.multiSort && column.order !== null) + if (!that.options.multiSort && column.order != null) { sorted = true; } @@ -741,7 +741,8 @@ function renderTableHeader() (sorting && sortOrder && sortOrder === "desc") ? css.iconDown : ""), icon = tpl.icon.resolve(getParams.call(that, { iconCss: iconCss })), align = column.headerAlign, - cssClass = (column.headerCssClass.length > 0) ? " " + column.headerCssClass : ""; + cssClass = ((column.headerCssClass.length > 0) ? " " + column.headerCssClass : "") + + ((that.options.highlightColumns && column.order != null) ? " " + that.options.css.active : ""); html += tpl.headerCell.resolve(getParams.call(that, { column: column, icon: icon, sortable: sorting && column.sortable && css.sortable || "", css: ((align === "right") ? css.right : (align === "center") ? @@ -754,7 +755,8 @@ function renderTableHeader() // todo: create a own function for that piece of code if (sorting) { - var sortingSelector = getCssSelector(css.sortable), + var activeSelector = getCssSelector(css.active), + sortingSelector = getCssSelector(css.sortable), iconSelector = getCssSelector(css.icon); headerRow.off("click" + namespace, sortingSelector) .on("click" + namespace, sortingSelector, function (e) @@ -762,19 +764,20 @@ function renderTableHeader() e.preventDefault(); var $this = $(this), columnId = $this.data("column-id") || $this.parents("th").first().data("column-id"), - sortOrder = that.sort[columnId], - icon = $this.find(iconSelector); + sortOrder = that.sort[columnId]; if (!that.options.multiSort) { - $this.parents("tr").first().find(iconSelector).removeClass(css.iconDown + " " + css.iconUp); + $this.parents("tr:first").find(iconSelector).removeClass(css.iconDown + " " + css.iconUp) + .end().find(activeSelector).removeClass(css.active); that.sort = {}; } if (sortOrder && sortOrder === "asc") { that.sort[columnId] = "desc"; - icon.removeClass(css.iconUp).addClass(css.iconDown); + $this.parent().addClass(css.active).find(iconSelector) + .removeClass(css.iconUp).addClass(css.iconDown); } else if (sortOrder && sortOrder === "desc") { @@ -789,18 +792,21 @@ function renderTableHeader() } } that.sort = newSort; - icon.removeClass(css.iconDown); + $this.parent().removeClass(css.active).find(iconSelector) + .removeClass(css.iconDown); } else { that.sort[columnId] = "asc"; - icon.removeClass(css.iconDown).addClass(css.iconUp); + $this.parent().addClass(css.active).find(iconSelector) + .removeClass(css.iconDown).addClass(css.iconUp); } } else { that.sort[columnId] = "asc"; - icon.addClass(css.iconUp); + $this.parent().addClass(css.active).find(iconSelector) + .addClass(css.iconUp); } sortRows.call(that); diff --git a/src/jquery.bootgrid.less b/src/jquery.bootgrid.less index c516f17..bd3f7d0 100644 --- a/src/jquery.bootgrid.less +++ b/src/jquery.bootgrid.less @@ -36,7 +36,7 @@ vertical-align: middle; width: 180px; - .glyphicon { top: 0; } + .icon { top: 0; } &.search-field, .search-field { @@ -123,7 +123,7 @@ } } - &:hover, &:active { background: #fafafa; } + &:hover, &:active, &.active { background: #fafafa !important; } } td diff --git a/src/public.js b/src/public.js index 5bce9cb..c970123 100644 --- a/src/public.js +++ b/src/public.js @@ -36,6 +36,7 @@ var Grid = function(element, options) this.header = null; this.footer = null; this.xqr = null; + this.original = this.element.clone(); // todo: implement cache }; @@ -106,6 +107,17 @@ Grid.defaults = { **/ keepSelection: false, + /** + * Defines whether the columns which are filtered or sorted should be highlighted or not. + * + * @property highlightColumns + * @type Boolean + * @default false + * @for defaults + * @since 1.2.0 + **/ + highlightColumns: false, + highlightRows: false, // highlights new rows (find the page of the first new row) sorting: true, multiSort: false, @@ -198,6 +210,18 @@ Grid.defaults = { **/ css: { actions: "actions btn-group", // must be a unique class name or constellation of class names within the header and footer + + /** + * CSS class to highlight active parts like sorted or filtered columns. + * + * @property active + * @type String + * @default "active" + * @for css + * @since 1.2.0 + **/ + active: "active", + center: "text-center", columnHeaderAnchor: "column-header-anchor", // must be a unique class name or constellation of class names within the column header cell columnHeaderText: "text", @@ -319,7 +343,7 @@ Grid.prototype.append = function(rows) { if (this.options.ajax) { - // todo: implement ajax DELETE + // todo: implement ajax POST } else { @@ -383,7 +407,7 @@ Grid.prototype.destroy = function() { this.footer.remove(); } - this.element.remove("tbody").off(namespace).removeData(namespace); + this.element.before(this.original).remove(); return this; };
      IDSenderIDSender Received Link
      1 me@rafaelstaib.com11.12.2014$0.00 Link