bootstrap-table-rails 1.8.2 → 1.8.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (65) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +68 -29
  3. data/bootstrap-table-rails-1.8.2.gem +0 -0
  4. data/lib/bootstrap-table-rails/version.rb +1 -1
  5. data/vendor/assets/javascripts/bootstrap-table-all.js +5177 -9
  6. data/vendor/assets/javascripts/bootstrap-table-locale-all.js +1500 -6
  7. data/vendor/assets/javascripts/bootstrap-table.js +2506 -8
  8. data/vendor/assets/javascripts/extensions/bootstrap-table-angular.js +105 -7
  9. data/vendor/assets/javascripts/extensions/bootstrap-table-cookie.js +318 -7
  10. data/vendor/assets/javascripts/extensions/bootstrap-table-editable.js +107 -7
  11. data/vendor/assets/javascripts/extensions/bootstrap-table-export.js +103 -7
  12. data/vendor/assets/javascripts/extensions/bootstrap-table-filter-control.js +458 -7
  13. data/vendor/assets/javascripts/extensions/bootstrap-table-filter.js +67 -7
  14. data/vendor/assets/javascripts/extensions/bootstrap-table-flat-json.js +62 -7
  15. data/vendor/assets/javascripts/extensions/bootstrap-table-group-by.js +228 -0
  16. data/vendor/assets/javascripts/extensions/bootstrap-table-key-events.js +80 -7
  17. data/vendor/assets/javascripts/extensions/bootstrap-table-mobile.js +142 -7
  18. data/vendor/assets/javascripts/extensions/bootstrap-table-multiple-sort.js +378 -7
  19. data/vendor/assets/javascripts/extensions/bootstrap-table-natural-sorting.js +47 -7
  20. data/vendor/assets/javascripts/extensions/bootstrap-table-reorder-columns.js +130 -7
  21. data/vendor/assets/javascripts/extensions/bootstrap-table-reorder-rows.js +115 -7
  22. data/vendor/assets/javascripts/extensions/bootstrap-table-resizable.js +74 -7
  23. data/vendor/assets/javascripts/extensions/bootstrap-table-toolbar.js +245 -7
  24. data/vendor/assets/javascripts/locale/bootstrap-table-ar-SA.js +40 -0
  25. data/vendor/assets/javascripts/locale/bootstrap-table-ca-ES.js +43 -0
  26. data/vendor/assets/javascripts/locale/bootstrap-table-cs-CZ.js +44 -0
  27. data/vendor/assets/javascripts/locale/bootstrap-table-da-DK.js +37 -0
  28. data/vendor/assets/javascripts/locale/bootstrap-table-de-DE.js +37 -0
  29. data/vendor/assets/javascripts/locale/bootstrap-table-el-GR.js +28 -0
  30. data/vendor/assets/javascripts/locale/bootstrap-table-en-US.js +43 -0
  31. data/vendor/assets/javascripts/locale/bootstrap-table-es-AR.js +31 -0
  32. data/vendor/assets/javascripts/locale/bootstrap-table-es-CR.js +40 -0
  33. data/vendor/assets/javascripts/locale/bootstrap-table-es-ES.js +43 -0
  34. data/vendor/assets/javascripts/locale/bootstrap-table-es-MX.js +32 -0
  35. data/vendor/assets/javascripts/locale/bootstrap-table-es-NI.js +40 -0
  36. data/vendor/assets/javascripts/locale/bootstrap-table-es-SP.js +40 -0
  37. data/vendor/assets/javascripts/locale/bootstrap-table-fa-IR.js +43 -0
  38. data/vendor/assets/javascripts/locale/bootstrap-table-fr-BE.js +28 -0
  39. data/vendor/assets/javascripts/locale/bootstrap-table-fr-FR.js +41 -0
  40. data/vendor/assets/javascripts/locale/bootstrap-table-hr-HR.js +44 -0
  41. data/vendor/assets/javascripts/locale/bootstrap-table-hu-HU.js +43 -0
  42. data/vendor/assets/javascripts/locale/bootstrap-table-it-IT.js +37 -0
  43. data/vendor/assets/javascripts/locale/bootstrap-table-ja-JP.js +40 -0
  44. data/vendor/assets/javascripts/locale/bootstrap-table-ka-GE.js +40 -0
  45. data/vendor/assets/javascripts/locale/bootstrap-table-ko-KR.js +37 -0
  46. data/vendor/assets/javascripts/locale/bootstrap-table-ms-MY.js +40 -0
  47. data/vendor/assets/javascripts/locale/bootstrap-table-nb-NO.js +37 -0
  48. data/vendor/assets/javascripts/locale/bootstrap-table-nl-NL.js +28 -0
  49. data/vendor/assets/javascripts/locale/bootstrap-table-pl-PL.js +37 -0
  50. data/vendor/assets/javascripts/locale/bootstrap-table-pt-BR.js +41 -0
  51. data/vendor/assets/javascripts/locale/bootstrap-table-pt-PT.js +28 -0
  52. data/vendor/assets/javascripts/locale/bootstrap-table-ro-RO.js +43 -0
  53. data/vendor/assets/javascripts/locale/bootstrap-table-ru-RU.js +36 -0
  54. data/vendor/assets/javascripts/locale/bootstrap-table-sk-SK.js +37 -0
  55. data/vendor/assets/javascripts/locale/bootstrap-table-sv-SE.js +37 -0
  56. data/vendor/assets/javascripts/locale/bootstrap-table-th-TH.js +37 -0
  57. data/vendor/assets/javascripts/locale/bootstrap-table-tr-TR.js +41 -0
  58. data/vendor/assets/javascripts/locale/bootstrap-table-uk-UA.js +37 -0
  59. data/vendor/assets/javascripts/locale/bootstrap-table-ur-PK.js +37 -0
  60. data/vendor/assets/javascripts/locale/bootstrap-table-vi-VN.js +28 -0
  61. data/vendor/assets/javascripts/locale/bootstrap-table-zh-CN.js +40 -0
  62. data/vendor/assets/javascripts/locale/bootstrap-table-zh-TW.js +40 -0
  63. data/vendor/assets/stylesheets/bootstrap-table.css +297 -1
  64. data/vendor/assets/stylesheets/extensions/bootstrap-table-group-by.css +53 -0
  65. metadata +44 -2
@@ -1,7 +1,142 @@
1
- /*
2
- * bootstrap-table - v1.8.1 - 2015-05-29
3
- * https://github.com/wenzhixin/bootstrap-table
4
- * Copyright (c) 2015 zhixin wen
5
- * Licensed MIT License
6
- */
7
- !function(a){"use strict";var b=function(a){(a.options.height||a.options.showFooter)&&setTimeout(a.resetView(),1)},c=function(a,c,h){a.options.minHeight?d(c,a.options.minWidth)&&d(h,a.options.minHeight)?f(a):e(c,a.options.minWidth)&&e(h,a.options.minHeight)&&g(a):d(c,a.options.minWidth)?f(a):e(c,a.options.minWidth)&&g(a),b(a)},d=function(a,b){return b>=a},e=function(a,b){return a>b},f=function(a){h(a,!1)},g=function(a){h(a,!0)},h=function(a,b){a.options.cardView=b,a.toggleView()};a.extend(a.fn.bootstrapTable.defaults,{mobileResponsive:!1,minWidth:562,minHeight:void 0,checkOnInit:!0,toggled:!1});var i=a.fn.bootstrapTable.Constructor,j=i.prototype.init;i.prototype.init=function(){if(j.apply(this,Array.prototype.slice.apply(arguments)),this.options.mobileResponsive&&this.options.minWidth){var b=this;a(window).resize(function(){c(b,a(this).width(),a(this).height())}),this.options.checkOnInit&&c(this,a(window).width(),a(window).height())}}}(jQuery);
1
+ /**
2
+ * @author: Dennis Hernández
3
+ * @webSite: http://djhvscf.github.io/Blog
4
+ * @version: v1.1.0
5
+ */
6
+
7
+ !function ($) {
8
+
9
+ 'use strict';
10
+
11
+ var getFieldIndex = function (columns, field) {
12
+ var index = -1;
13
+
14
+ $.each(columns, function (i, column) {
15
+ if (column.field === field) {
16
+ index = i;
17
+ return false;
18
+ }
19
+ return true;
20
+ });
21
+ return index;
22
+ };
23
+
24
+ var showHideColumns = function (that, checked) {
25
+ if (that.options.columnsHidden.length > 0 ) {
26
+ $.each(that.columns, function (i, column) {
27
+ if (that.options.columnsHidden.indexOf(column.field) !== -1) {
28
+ if (column.visible !== checked) {
29
+ that.toggleColumn(getFieldIndex(that.columns, column.field), checked, true);
30
+ }
31
+ }
32
+ });
33
+ }
34
+ };
35
+
36
+ var resetView = function (that) {
37
+ if (that.options.height || that.options.showFooter) {
38
+ setTimeout(that.resetView, 1);
39
+ }
40
+ };
41
+
42
+ var changeView = function (that, width, height) {
43
+ if (that.options.minHeight) {
44
+ if ((width <= that.options.minWidth) && (height <= that.options.minHeight)) {
45
+ conditionCardView(that);
46
+ } else if ((width > that.options.minWidth) && (height > that.options.minHeight)) {
47
+ conditionFullView(that);
48
+ }
49
+ } else {
50
+ if (width <= that.options.minWidth) {
51
+ conditionCardView(that);
52
+ } else if (width > that.options.minWidth) {
53
+ conditionFullView(that);
54
+ }
55
+ }
56
+
57
+ resetView(that);
58
+ };
59
+
60
+ var conditionCardView = function (that) {
61
+ changeTableView(that, false);
62
+ showHideColumns(that, false);
63
+ };
64
+
65
+ var conditionFullView = function (that) {
66
+ changeTableView(that, true);
67
+ showHideColumns(that, true);
68
+ };
69
+
70
+ var changeTableView = function (that, cardViewState) {
71
+ that.options.cardView = cardViewState;
72
+ that.toggleView();
73
+ };
74
+
75
+ var debounce = function(func,wait) {
76
+ var timeout;
77
+ return function() {
78
+ var context = this,
79
+ args = arguments;
80
+ var later = function() {
81
+ timeout = null;
82
+ func.apply(context,args);
83
+ };
84
+ clearTimeout(timeout);
85
+ timeout = setTimeout(later, wait);
86
+ };
87
+ };
88
+
89
+ $.extend($.fn.bootstrapTable.defaults, {
90
+ mobileResponsive: false,
91
+ minWidth: 562,
92
+ minHeight: undefined,
93
+ heightThreshold: 100, // just slightly larger than mobile chrome's auto-hiding toolbar
94
+ checkOnInit: true,
95
+ columnsHidden: []
96
+ });
97
+
98
+ var BootstrapTable = $.fn.bootstrapTable.Constructor,
99
+ _init = BootstrapTable.prototype.init;
100
+
101
+ BootstrapTable.prototype.init = function () {
102
+ _init.apply(this, Array.prototype.slice.apply(arguments));
103
+
104
+ if (!this.options.mobileResponsive) {
105
+ return;
106
+ }
107
+
108
+ if (!this.options.minWidth) {
109
+ return;
110
+ }
111
+
112
+ var that = this,
113
+ old = {
114
+ width: $(window).width(),
115
+ height: $(window).height()
116
+ };
117
+
118
+ $(window).on('resize orientationchange',debounce(function (evt) {
119
+ // reset view if height has only changed by at least the threshold.
120
+ var height = $(this).height(),
121
+ width = $(this).width();
122
+
123
+ if (Math.abs(old.height - height) > that.options.heightThreshold || old.width != width) {
124
+ changeView(that, width, height);
125
+ old = {
126
+ width: width,
127
+ height: height
128
+ };
129
+ }
130
+ },200));
131
+
132
+ if (this.options.checkOnInit) {
133
+ var height = $(window).height(),
134
+ width = $(window).width();
135
+ changeView(this, width, height);
136
+ old = {
137
+ width: width,
138
+ height: height
139
+ };
140
+ }
141
+ };
142
+ }(jQuery);
@@ -1,7 +1,378 @@
1
- /*
2
- * bootstrap-table - v1.8.1 - 2015-05-29
3
- * https://github.com/wenzhixin/bootstrap-table
4
- * Copyright (c) 2015 zhixin wen
5
- * Licensed MIT License
6
- */
7
- !function(a){"use strict";var b=!1,c={asc:"Ascending",desc:"Descending"},d="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg==",e="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= ",f=function(b){if(!a("#sortModal").hasClass("modal")){var c=' <div class="modal fade" id="sortModal" tabindex="-1" role="dialog" aria-labelledby="sortModalLabel" aria-hidden="true">';c+=' <div class="modal-dialog">',c+=' <div class="modal-content">',c+=' <div class="modal-header">',c+=' <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>',c+=' <h4 class="modal-title" id="sortModalLabel">'+b.options.formatMultipleSort()+"</h4>",c+=" </div>",c+=' <div class="modal-body">',c+=' <div class="bootstrap-table">',c+=' <div class="fixed-table-toolbar">',c+=' <div class="bars">',c+=' <div id="toolbar">',c+=' <button id="add" type="button" class="btn btn-default"><i class="'+b.options.iconsPrefix+" "+b.options.icons.plus+'"></i> '+b.options.formatAddLevel()+"</button>",c+=' <button id="delete" type="button" class="btn btn-default" disabled><i class="'+b.options.iconsPrefix+" "+b.options.icons.minus+'"></i> '+b.options.formatDeleteLevel()+"</button>",c+=" </div>",c+=" </div>",c+=" </div>",c+=' <div class="fixed-table-container">',c+=' <table id="multi-sort" class="table">',c+=" <thead>",c+=" <tr>",c+=" <th></th>",c+=' <th><div class="th-inner">'+b.options.formatColumn()+"</div></th>",c+=' <th><div class="th-inner">'+b.options.formatOrder()+"</div></th>",c+=" </tr>",c+=" </thead>",c+=" <tbody></tbody>",c+=" </table>",c+=" </div>",c+=" </div>",c+=" </div>",c+=' <div class="modal-footer">',c+=' <button type="button" class="btn btn-default" data-dismiss="modal">'+b.options.formatCancel()+"</button>",c+=' <button type="button" class="btn btn-primary">'+b.options.formatSort()+"</button>",c+=" </div>",c+=" </div>",c+=" </div>",c+=" </div>",a("body").append(a(c));var d=a("#sortModal"),e=d.find("tbody > tr");if(d.off("click","#add").on("click","#add",function(){var a=d.find(".multi-sort-name:first option").length,c=d.find("tbody tr").length;a>c&&(c++,b.addLevel(),b.setButtonStates())}),d.off("click","#delete").on("click","#delete",function(){var a=d.find(".multi-sort-name:first option").length,c=d.find("tbody tr").length;c>1&&a>=c&&(c--,d.find("tbody tr:last").remove(),b.setButtonStates())}),d.off("click",".btn-primary").on("click",".btn-primary",function(){var c=d.find("tbody > tr"),e=d.find("div.alert"),f=[],g=[];b.options.sortPriority=a.map(c,function(b){var c=a(b),d=c.find(".multi-sort-name").val(),e=c.find(".multi-sort-order").val();return f.push(d),{sortName:d,sortOrder:e}});for(var h=f.sort(),i=0;i<f.length-1;i++)h[i+1]==h[i]&&g.push(h[i]);g.length>0?0===e.length&&(e='<div class="alert alert-danger" role="alert"><strong>'+b.options.formatDuplicateAlertTitle()+"</strong> "+b.options.formatDuplicateAlertDescription()+"</div>",a(e).insertBefore(d.find(".bars"))):(1===e.length&&a(e).remove(),b.options.sortName="",b.onMultipleSort(),d.modal("hide"))}),null===b.options.sortPriority&&b.options.sortName&&(b.options.sortPriority=[{sortName:b.options.sortName,sortOrder:b.options.sortOrder}]),null!==b.options.sortPriority){if(e.length<b.options.sortPriority.length&&"object"==typeof b.options.sortPriority)for(var f=0;f<b.options.sortPriority.length;f++)b.addLevel(f,b.options.sortPriority[f])}else b.addLevel(0);b.setButtonStates()}};a.extend(a.fn.bootstrapTable.defaults,{showMultiSort:!1,sortPriority:null,onMultipleSort:function(){return!1}}),a.extend(a.fn.bootstrapTable.defaults.icons,{sort:"glyphicon-sort",plus:"glyphicon-plus",minus:"glyphicon-minus"}),a.extend(a.fn.bootstrapTable.Constructor.EVENTS,{"multiple-sort.bs.table":"onMultipleSort"}),a.extend(a.fn.bootstrapTable.locales,{formatMultipleSort:function(){return"Multiple Sort"},formatAddLevel:function(){return"Add Level"},formatDeleteLevel:function(){return"Delete Level"},formatColumn:function(){return"Column"},formatOrder:function(){return"Order"},formatSortBy:function(){return"Sort by"},formatThenBy:function(){return"Then by"},formatSort:function(){return"Sort"},formatCancel:function(){return"Cancel"},formatDuplicateAlertTitle:function(){return"Duplicate(s) detected!"},formatDuplicateAlertDescription:function(){return"Please remove or change any duplicate column."}}),a.extend(a.fn.bootstrapTable.defaults,a.fn.bootstrapTable.locales);var g=a.fn.bootstrapTable.Constructor,h=g.prototype.initToolbar;g.prototype.initToolbar=function(){this.showToolbar=!0;var c=this;if(h.apply(this,Array.prototype.slice.apply(arguments)),this.options.showMultiSort){var d=this.$toolbar.find(">.btn-group"),e=d.find("div.multi-sort");e.length||(e=' <button class="multi-sort btn btn-default'+(void 0===this.options.iconSize?"":" btn-"+this.options.iconSize)+'" type="button" data-toggle="modal" data-target="#sortModal" title="'+this.options.formatMultipleSort()+'">',e+=' <i class="'+this.options.iconsPrefix+" "+this.options.icons.sort+'"></i>',e+="</button>",d.append(e),f(c)),this.$el.one("sort.bs.table",function(){b=!0}),this.$el.on("multiple-sort.bs.table",function(){b=!1}),this.$el.on("load-success.bs.table",function(){b||null===c.options.sortPriority||"object"!=typeof c.options.sortPriority||c.onMultipleSort()}),this.$el.on("column-table.bs.table",function(){c.options.sortPriority=null,a("#sortModal").remove(),f(c)})}},g.prototype.onMultipleSort=function(){var b=this,c=function(a,b){return a>b?1:b>a?-1:0},d=function(d,e){for(var f=[],g=[],h=0;h<b.options.sortPriority.length;h++){var i="desc"===b.options.sortPriority[h].sortOrder?-1:1,j=d[b.options.sortPriority[h].sortName],k=e[b.options.sortPriority[h].sortName];(void 0===j||null===j)&&(j=""),(void 0===k||null===k)&&(k=""),a.isNumeric(j)&&a.isNumeric(k)&&(j=parseFloat(j),k=parseFloat(k)),"string"!=typeof j&&(j=j.toString()),f.push(i*c(j,k)),g.push(i*c(k,j))}return c(f,g)};this.data.sort(function(a,b){return d(a,b)}),this.initBody(),this.assignSortableArrows(),this.trigger("multiple-sort")},g.prototype.addLevel=function(b,d){var e=a("#sortModal"),f=0===b?this.options.formatSortBy():this.options.formatThenBy();e.find("tbody").append(a("<tr>").append(a("<td>").text(f)).append(a("<td>").append(a('<select class="form-control multi-sort-name">'))).append(a("<td>").append(a('<select class="form-control multi-sort-order">'))));var g=e.find(".multi-sort-name").last(),h=e.find(".multi-sort-order").last();this.options.columns.forEach(function(a){return a.sortable===!1||a.visible===!1?!0:void g.append('<option value="'+a.field+'">'+a.title+"</option>")}),a.each(c,function(a,b){h.append('<option value="'+a+'">'+b+"</option>")}),void 0!==d&&(g.find('option[value="'+d.sortName+'"]').attr("selected",!0),h.find('option[value="'+d.sortOrder+'"]').attr("selected",!0))},g.prototype.assignSortableArrows=function(){for(var b=this,c=b.$header.find("th"),f=0;f<c.length;f++)for(var g=0;g<b.options.sortPriority.length;g++)a(c[f]).data("field")===b.options.sortPriority[g].sortName&&a(c[f]).find(".sortable").css("background-image","url("+("desc"===b.options.sortPriority[g].sortOrder?e:d)+")")},g.prototype.setButtonStates=function(){var b=a("#sortModal"),c=b.find(".multi-sort-name:first option").length,d=b.find("tbody tr").length;d==c&&b.find("#add").attr("disabled","disabled"),d>1&&b.find("#delete").removeAttr("disabled"),c>d&&b.find("#add").removeAttr("disabled"),1==d&&b.find("#delete").attr("disabled","disabled")}}(jQuery);
1
+ /**
2
+ * @author Nadim Basalamah <dimbslmh@gmail.com>
3
+ * @version: v1.0.0
4
+ * https://github.com/dimbslmh/bootstrap-table/tree/master/src/extensions/multiple-sort/bootstrap-table-multiple-sort.js
5
+ */
6
+
7
+ (function($) {
8
+ 'use strict';
9
+
10
+ var isSingleSort = false;
11
+
12
+ var sort_order = {
13
+ asc: 'Ascending',
14
+ desc: 'Descending'
15
+ };
16
+
17
+ var showSortModal = function(that) {
18
+ var _selector = that.$sortModal.selector,
19
+ _id = _selector.substr(1);
20
+
21
+ if (!$(_id).hasClass("modal")) {
22
+ var sModal = ' <div class="modal fade" id="' + _id + '" tabindex="-1" role="dialog" aria-labelledby="' + _id + 'Label" aria-hidden="true">';
23
+ sModal += ' <div class="modal-dialog">';
24
+ sModal += ' <div class="modal-content">';
25
+ sModal += ' <div class="modal-header">';
26
+ sModal += ' <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>';
27
+ sModal += ' <h4 class="modal-title" id="' + _id + 'Label">' + that.options.formatMultipleSort() + '</h4>';
28
+ sModal += ' </div>';
29
+ sModal += ' <div class="modal-body">';
30
+ sModal += ' <div class="bootstrap-table">';
31
+ sModal += ' <div class="fixed-table-toolbar">';
32
+ sModal += ' <div class="bars">';
33
+ sModal += ' <div id="toolbar">';
34
+ sModal += ' <button id="add" type="button" class="btn btn-default"><i class="' + that.options.iconsPrefix + ' ' + that.options.icons.plus + '"></i> ' + that.options.formatAddLevel() + '</button>';
35
+ sModal += ' <button id="delete" type="button" class="btn btn-default" disabled><i class="' + that.options.iconsPrefix + ' ' + that.options.icons.minus + '"></i> ' + that.options.formatDeleteLevel() + '</button>';
36
+ sModal += ' </div>';
37
+ sModal += ' </div>';
38
+ sModal += ' </div>';
39
+ sModal += ' <div class="fixed-table-container">';
40
+ sModal += ' <table id="multi-sort" class="table">';
41
+ sModal += ' <thead>';
42
+ sModal += ' <tr>';
43
+ sModal += ' <th></th>';
44
+ sModal += ' <th><div class="th-inner">' + that.options.formatColumn() + '</div></th>';
45
+ sModal += ' <th><div class="th-inner">' + that.options.formatOrder() + '</div></th>';
46
+ sModal += ' </tr>';
47
+ sModal += ' </thead>';
48
+ sModal += ' <tbody></tbody>';
49
+ sModal += ' </table>';
50
+ sModal += ' </div>';
51
+ sModal += ' </div>';
52
+ sModal += ' </div>';
53
+ sModal += ' <div class="modal-footer">';
54
+ sModal += ' <button type="button" class="btn btn-default" data-dismiss="modal">' + that.options.formatCancel() + '</button>';
55
+ sModal += ' <button type="button" class="btn btn-primary">' + that.options.formatSort() + '</button>';
56
+ sModal += ' </div>';
57
+ sModal += ' </div>';
58
+ sModal += ' </div>';
59
+ sModal += ' </div>';
60
+
61
+ $("body").append($(sModal));
62
+
63
+ that.$sortModal = $(_selector);
64
+ var $rows = that.$sortModal.find("tbody > tr");
65
+
66
+ that.$sortModal.off('click', '#add').on('click', '#add', function() {
67
+ var total = that.$sortModal.find('.multi-sort-name:first option').length,
68
+ current = that.$sortModal.find('tbody tr').length;
69
+
70
+ if (current < total) {
71
+ current++;
72
+ that.addLevel();
73
+ that.setButtonStates();
74
+ }
75
+ });
76
+
77
+ that.$sortModal.off('click', '#delete').on('click', '#delete', function() {
78
+ var total = that.$sortModal.find('.multi-sort-name:first option').length,
79
+ current = that.$sortModal.find('tbody tr').length;
80
+
81
+ if (current > 1 && current <= total) {
82
+ current--;
83
+ that.$sortModal.find('tbody tr:last').remove();
84
+ that.setButtonStates();
85
+ }
86
+ });
87
+
88
+ that.$sortModal.off('click', '.btn-primary').on('click', '.btn-primary', function() {
89
+ var $rows = that.$sortModal.find("tbody > tr"),
90
+ $alert = that.$sortModal.find('div.alert'),
91
+ fields = [],
92
+ results = [];
93
+
94
+
95
+ that.options.sortPriority = $.map($rows, function(row) {
96
+ var $row = $(row),
97
+ name = $row.find('.multi-sort-name').val(),
98
+ order = $row.find('.multi-sort-order').val();
99
+
100
+ fields.push(name);
101
+
102
+ return {
103
+ sortName: name,
104
+ sortOrder: order
105
+ };
106
+ });
107
+
108
+ var sorted_fields = fields.sort();
109
+
110
+ for (var i = 0; i < fields.length - 1; i++) {
111
+ if (sorted_fields[i + 1] == sorted_fields[i]) {
112
+ results.push(sorted_fields[i]);
113
+ }
114
+ }
115
+
116
+ if (results.length > 0) {
117
+ if ($alert.length === 0) {
118
+ $alert = '<div class="alert alert-danger" role="alert"><strong>' + that.options.formatDuplicateAlertTitle() + '</strong> ' + that.options.formatDuplicateAlertDescription() + '</div>';
119
+ $($alert).insertBefore(that.$sortModal.find('.bars'));
120
+ }
121
+ } else {
122
+ if ($alert.length === 1) {
123
+ $($alert).remove();
124
+ }
125
+
126
+ that.options.sortName = "";
127
+ that.onMultipleSort();
128
+ that.$sortModal.modal('hide');
129
+ }
130
+ });
131
+
132
+ if (that.options.sortPriority === null || that.options.sortPriority.length === 0) {
133
+ if (that.options.sortName) {
134
+ that.options.sortPriority = [{
135
+ sortName: that.options.sortName,
136
+ sortOrder: that.options.sortOrder
137
+ }];
138
+ }
139
+ }
140
+
141
+ if (that.options.sortPriority !== null && that.options.sortPriority.length > 0) {
142
+ if ($rows.length < that.options.sortPriority.length && typeof that.options.sortPriority === 'object') {
143
+ for (var i = 0; i < that.options.sortPriority.length; i++) {
144
+ that.addLevel(i, that.options.sortPriority[i]);
145
+ }
146
+ }
147
+ } else {
148
+ that.addLevel(0);
149
+ }
150
+
151
+ that.setButtonStates();
152
+ }
153
+ };
154
+
155
+ $.extend($.fn.bootstrapTable.defaults, {
156
+ showMultiSort: false,
157
+ sortPriority: null,
158
+ onMultipleSort: function() {
159
+ return false;
160
+ }
161
+ });
162
+
163
+ $.extend($.fn.bootstrapTable.defaults.icons, {
164
+ sort: 'glyphicon-sort',
165
+ plus: 'glyphicon-plus',
166
+ minus: 'glyphicon-minus'
167
+ });
168
+
169
+ $.extend($.fn.bootstrapTable.Constructor.EVENTS, {
170
+ 'multiple-sort.bs.table': 'onMultipleSort'
171
+ });
172
+
173
+ $.extend($.fn.bootstrapTable.locales, {
174
+ formatMultipleSort: function() {
175
+ return 'Multiple Sort';
176
+ },
177
+ formatAddLevel: function() {
178
+ return "Add Level";
179
+ },
180
+ formatDeleteLevel: function() {
181
+ return "Delete Level";
182
+ },
183
+ formatColumn: function() {
184
+ return "Column";
185
+ },
186
+ formatOrder: function() {
187
+ return "Order";
188
+ },
189
+ formatSortBy: function() {
190
+ return "Sort by";
191
+ },
192
+ formatThenBy: function() {
193
+ return "Then by";
194
+ },
195
+ formatSort: function() {
196
+ return "Sort";
197
+ },
198
+ formatCancel: function() {
199
+ return "Cancel";
200
+ },
201
+ formatDuplicateAlertTitle: function() {
202
+ return "Duplicate(s) detected!";
203
+ },
204
+ formatDuplicateAlertDescription: function() {
205
+ return "Please remove or change any duplicate column.";
206
+ }
207
+ });
208
+
209
+ $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales);
210
+
211
+ var BootstrapTable = $.fn.bootstrapTable.Constructor,
212
+ _initToolbar = BootstrapTable.prototype.initToolbar;
213
+
214
+ BootstrapTable.prototype.initToolbar = function() {
215
+ this.showToolbar = true;
216
+ var that = this,
217
+ sortModalId = '#sortModal_' + this.$el.attr('id');
218
+ this.$sortModal = $(sortModalId);
219
+
220
+ _initToolbar.apply(this, Array.prototype.slice.apply(arguments));
221
+
222
+ if (this.options.showMultiSort) {
223
+ var $btnGroup = this.$toolbar.find('>.btn-group').first(),
224
+ $multiSortBtn = this.$toolbar.find('div.multi-sort');
225
+
226
+ if (!$multiSortBtn.length) {
227
+ $multiSortBtn = ' <button class="multi-sort btn btn-default' + (this.options.iconSize === undefined ? '' : ' btn-' + this.options.iconSize) + '" type="button" data-toggle="modal" data-target="' + sortModalId + '" title="' + this.options.formatMultipleSort() + '">';
228
+ $multiSortBtn += ' <i class="' + this.options.iconsPrefix + ' ' + this.options.icons.sort + '"></i>';
229
+ $multiSortBtn += '</button>';
230
+
231
+ $btnGroup.append($multiSortBtn);
232
+
233
+ showSortModal(that);
234
+ }
235
+
236
+ this.$el.on('sort.bs.table', function() {
237
+ isSingleSort = true;
238
+ });
239
+
240
+ this.$el.on('multiple-sort.bs.table', function() {
241
+ isSingleSort = false;
242
+ });
243
+
244
+ this.$el.on('load-success.bs.table', function() {
245
+ if (!isSingleSort && that.options.sortPriority !== null && typeof that.options.sortPriority === 'object') {
246
+ that.onMultipleSort();
247
+ }
248
+ });
249
+
250
+ this.$el.on('column-switch.bs.table', function(field, checked) {
251
+ for (var i = 0; i < that.options.sortPriority.length; i++) {
252
+ if (that.options.sortPriority[i].sortName === checked) {
253
+ that.options.sortPriority.splice(i, 1);
254
+ }
255
+ }
256
+
257
+ that.assignSortableArrows();
258
+ that.$sortModal.remove();
259
+ showSortModal(that);
260
+ });
261
+
262
+ this.$el.on('reset-view.bs.table', function() {
263
+ if (!isSingleSort && that.options.sortPriority !== null && typeof that.options.sortPriority === 'object') {
264
+ that.assignSortableArrows();
265
+ }
266
+ });
267
+ }
268
+ };
269
+
270
+ BootstrapTable.prototype.onMultipleSort = function() {
271
+ var that = this;
272
+
273
+ var cmp = function(x, y) {
274
+ return x > y ? 1 : x < y ? -1 : 0;
275
+ };
276
+
277
+ var arrayCmp = function(a, b) {
278
+ var arr1 = [],
279
+ arr2 = [];
280
+
281
+ for (var i = 0; i < that.options.sortPriority.length; i++) {
282
+ var order = that.options.sortPriority[i].sortOrder === 'desc' ? -1 : 1,
283
+ aa = a[that.options.sortPriority[i].sortName],
284
+ bb = b[that.options.sortPriority[i].sortName];
285
+
286
+ if (aa === undefined || aa === null) {
287
+ aa = '';
288
+ }
289
+ if (bb === undefined || bb === null) {
290
+ bb = '';
291
+ }
292
+ if ($.isNumeric(aa) && $.isNumeric(bb)) {
293
+ aa = parseFloat(aa);
294
+ bb = parseFloat(bb);
295
+ }
296
+ if (typeof aa !== 'string') {
297
+ aa = aa.toString();
298
+ }
299
+
300
+ arr1.push(
301
+ order * cmp(aa, bb));
302
+ arr2.push(
303
+ order * cmp(bb, aa));
304
+ }
305
+
306
+ return cmp(arr1, arr2);
307
+ };
308
+
309
+ this.data.sort(function(a, b) {
310
+ return arrayCmp(a, b);
311
+ });
312
+
313
+ this.initBody();
314
+ this.assignSortableArrows();
315
+ this.trigger('multiple-sort');
316
+ };
317
+
318
+ BootstrapTable.prototype.addLevel = function(index, sortPriority) {
319
+ var text = index === 0 ? this.options.formatSortBy() : this.options.formatThenBy();
320
+
321
+ this.$sortModal.find('tbody')
322
+ .append($('<tr>')
323
+ .append($('<td>').text(text))
324
+ .append($('<td>').append($('<select class="form-control multi-sort-name">')))
325
+ .append($('<td>').append($('<select class="form-control multi-sort-order">')))
326
+ );
327
+
328
+ var $multiSortName = this.$sortModal.find('.multi-sort-name').last(),
329
+ $multiSortOrder = this.$sortModal.find('.multi-sort-order').last();
330
+
331
+ $.each(this.columns, function (i, column) {
332
+ if (column.sortable === false || column.visible === false) {
333
+ return true;
334
+ }
335
+ $multiSortName.append('<option value="' + column.field + '">' + column.title + '</option>');
336
+ });
337
+
338
+ $.each(sort_order, function(value, order) {
339
+ $multiSortOrder.append('<option value="' + value + '">' + order + '</option>');
340
+ });
341
+
342
+ if (sortPriority !== undefined) {
343
+ $multiSortName.find('option[value="' + sortPriority.sortName + '"]').attr("selected", true);
344
+ $multiSortOrder.find('option[value="' + sortPriority.sortOrder + '"]').attr("selected", true);
345
+ }
346
+ };
347
+
348
+ BootstrapTable.prototype.assignSortableArrows = function() {
349
+ var that = this,
350
+ headers = that.$header.find('th');
351
+
352
+ for (var i = 0; i < headers.length; i++) {
353
+ for (var c = 0; c < that.options.sortPriority.length; c++) {
354
+ if ($(headers[i]).data('field') === that.options.sortPriority[c].sortName) {
355
+ $(headers[i]).find('.sortable').removeClass('desc asc').addClass(that.options.sortPriority[c].sortOrder);
356
+ }
357
+ }
358
+ }
359
+ };
360
+
361
+ BootstrapTable.prototype.setButtonStates = function() {
362
+ var total = this.$sortModal.find('.multi-sort-name:first option').length,
363
+ current = this.$sortModal.find('tbody tr').length;
364
+
365
+ if (current == total) {
366
+ this.$sortModal.find('#add').attr('disabled', 'disabled');
367
+ }
368
+ if (current > 1) {
369
+ this.$sortModal.find('#delete').removeAttr('disabled');
370
+ }
371
+ if (current < total) {
372
+ this.$sortModal.find('#add').removeAttr('disabled');
373
+ }
374
+ if (current == 1) {
375
+ this.$sortModal.find('#delete').attr('disabled', 'disabled');
376
+ }
377
+ };
378
+ })(jQuery);