bootstrap-table-rails 1.11.0 → 1.11.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +25 -4
  3. data/lib/bootstrap-table-rails/version.rb +1 -1
  4. data/vendor/assets/images/icon.png +0 -0
  5. data/vendor/assets/javascripts/bootstrap-table.js +300 -225
  6. data/vendor/assets/javascripts/extensions/bootstrap-table-accent-neutralise.js +0 -0
  7. data/vendor/assets/javascripts/extensions/bootstrap-table-angular.js +0 -0
  8. data/vendor/assets/javascripts/extensions/bootstrap-table-auto-refresh.js +84 -0
  9. data/vendor/assets/javascripts/extensions/bootstrap-table-click-edit-row.js +142 -0
  10. data/vendor/assets/javascripts/extensions/bootstrap-table-cookie.js +78 -36
  11. data/vendor/assets/javascripts/extensions/bootstrap-table-copy-rows.js +0 -0
  12. data/vendor/assets/javascripts/extensions/bootstrap-table-editable.js +0 -0
  13. data/vendor/assets/javascripts/extensions/bootstrap-table-export.js +12 -2
  14. data/vendor/assets/javascripts/extensions/bootstrap-table-filter-control.js +36 -11
  15. data/vendor/assets/javascripts/extensions/bootstrap-table-filter.js +0 -0
  16. data/vendor/assets/javascripts/extensions/bootstrap-table-flat-json.js +0 -0
  17. data/vendor/assets/javascripts/extensions/{bootstrap-table-group-by 2.js → bootstrap-table-group-by-v2.js} +0 -0
  18. data/vendor/assets/javascripts/extensions/bootstrap-table-group-by.js +0 -0
  19. data/vendor/assets/javascripts/extensions/bootstrap-table-i18n-enhance.js +0 -0
  20. data/vendor/assets/javascripts/extensions/bootstrap-table-key-events.js +0 -0
  21. data/vendor/assets/javascripts/extensions/bootstrap-table-mobile.js +0 -0
  22. data/vendor/assets/javascripts/extensions/bootstrap-table-multi-toggle.js +0 -0
  23. data/vendor/assets/javascripts/extensions/bootstrap-table-multiple-search.js +0 -0
  24. data/vendor/assets/javascripts/extensions/bootstrap-table-multiple-selection-row.js +127 -0
  25. data/vendor/assets/javascripts/extensions/bootstrap-table-multiple-sort.js +1 -1
  26. data/vendor/assets/javascripts/extensions/bootstrap-table-natural-sorting.js +0 -0
  27. data/vendor/assets/javascripts/extensions/bootstrap-table-print.js +133 -0
  28. data/vendor/assets/javascripts/extensions/bootstrap-table-reorder-columns.js +4 -0
  29. data/vendor/assets/javascripts/extensions/bootstrap-table-reorder-rows.js +6 -4
  30. data/vendor/assets/javascripts/extensions/bootstrap-table-resizable.js +0 -0
  31. data/vendor/assets/javascripts/extensions/bootstrap-table-select2-filter.js +0 -0
  32. data/vendor/assets/javascripts/extensions/bootstrap-table-sticky-header.js +0 -0
  33. data/vendor/assets/javascripts/extensions/bootstrap-table-toolbar.js +2 -2
  34. data/vendor/assets/javascripts/extensions/bootstrap-table-tree-column.js +130 -0
  35. data/vendor/assets/javascripts/locale/README.md +179 -0
  36. data/vendor/assets/javascripts/locale/bootstrap-table-af-ZA.js +0 -0
  37. data/vendor/assets/javascripts/locale/bootstrap-table-ar-SA.js +0 -0
  38. data/vendor/assets/javascripts/locale/bootstrap-table-ca-ES.js +0 -0
  39. data/vendor/assets/javascripts/locale/bootstrap-table-cs-CZ.js +0 -0
  40. data/vendor/assets/javascripts/locale/bootstrap-table-da-DK.js +0 -0
  41. data/vendor/assets/javascripts/locale/bootstrap-table-de-DE.js +10 -4
  42. data/vendor/assets/javascripts/locale/bootstrap-table-el-GR.js +0 -0
  43. data/vendor/assets/javascripts/locale/bootstrap-table-en-US.js +0 -0
  44. data/vendor/assets/javascripts/locale/bootstrap-table-en-US.js.template +49 -0
  45. data/vendor/assets/javascripts/locale/bootstrap-table-es-AR.js +0 -0
  46. data/vendor/assets/javascripts/locale/bootstrap-table-es-CL.js +44 -0
  47. data/vendor/assets/javascripts/locale/bootstrap-table-es-CR.js +0 -0
  48. data/vendor/assets/javascripts/locale/bootstrap-table-es-ES.js +0 -0
  49. data/vendor/assets/javascripts/locale/bootstrap-table-es-MX.js +0 -0
  50. data/vendor/assets/javascripts/locale/bootstrap-table-es-NI.js +0 -0
  51. data/vendor/assets/javascripts/locale/bootstrap-table-es-SP.js +0 -0
  52. data/vendor/assets/javascripts/locale/bootstrap-table-et-EE.js +0 -0
  53. data/vendor/assets/javascripts/locale/bootstrap-table-fa-IR.js +0 -0
  54. data/vendor/assets/javascripts/locale/bootstrap-table-fr-BE.js +0 -0
  55. data/vendor/assets/javascripts/locale/bootstrap-table-fr-FR.js +0 -0
  56. data/vendor/assets/javascripts/locale/bootstrap-table-he-IL.js +0 -0
  57. data/vendor/assets/javascripts/locale/bootstrap-table-hr-HR.js +0 -0
  58. data/vendor/assets/javascripts/locale/bootstrap-table-hu-HU.js +0 -0
  59. data/vendor/assets/javascripts/locale/bootstrap-table-id-ID.js +49 -0
  60. data/vendor/assets/javascripts/locale/bootstrap-table-it-IT.js +12 -2
  61. data/vendor/assets/javascripts/locale/bootstrap-table-ja-JP.js +0 -0
  62. data/vendor/assets/javascripts/locale/bootstrap-table-ka-GE.js +0 -0
  63. data/vendor/assets/javascripts/locale/bootstrap-table-ko-KR.js +0 -0
  64. data/vendor/assets/javascripts/locale/bootstrap-table-ms-MY.js +0 -0
  65. data/vendor/assets/javascripts/locale/bootstrap-table-nb-NO.js +0 -0
  66. data/vendor/assets/javascripts/locale/bootstrap-table-nl-NL.js +0 -0
  67. data/vendor/assets/javascripts/locale/bootstrap-table-pl-PL.js +0 -0
  68. data/vendor/assets/javascripts/locale/bootstrap-table-pt-BR.js +0 -0
  69. data/vendor/assets/javascripts/locale/bootstrap-table-pt-PT.js +0 -0
  70. data/vendor/assets/javascripts/locale/bootstrap-table-ro-RO.js +0 -0
  71. data/vendor/assets/javascripts/locale/bootstrap-table-ru-RU.js +33 -0
  72. data/vendor/assets/javascripts/locale/bootstrap-table-sk-SK.js +0 -0
  73. data/vendor/assets/javascripts/locale/bootstrap-table-sv-SE.js +0 -0
  74. data/vendor/assets/javascripts/locale/bootstrap-table-th-TH.js +0 -0
  75. data/vendor/assets/javascripts/locale/bootstrap-table-tr-TR.js +0 -0
  76. data/vendor/assets/javascripts/locale/bootstrap-table-uk-UA.js +36 -0
  77. data/vendor/assets/javascripts/locale/bootstrap-table-ur-PK.js +0 -0
  78. data/vendor/assets/javascripts/locale/bootstrap-table-uz-Latn-UZ.js +49 -0
  79. data/vendor/assets/javascripts/locale/bootstrap-table-vi-VN.js +0 -0
  80. data/vendor/assets/javascripts/locale/bootstrap-table-zh-CN.js +0 -0
  81. data/vendor/assets/javascripts/locale/bootstrap-table-zh-TW.js +0 -0
  82. data/vendor/assets/stylesheets/bootstrap-table.css +9 -5
  83. data/vendor/assets/stylesheets/extensions/bootstrap-table-auto-refresh.css +3 -0
  84. data/vendor/assets/stylesheets/extensions/bootstrap-table-click-edit-row.css +21 -0
  85. data/vendor/assets/stylesheets/extensions/bootstrap-table-filter-control.css +13 -0
  86. data/vendor/assets/stylesheets/extensions/{bootstrap-table-group-by 2.css → bootstrap-table-group-by-v2.css} +0 -0
  87. data/vendor/assets/stylesheets/extensions/bootstrap-table-group-by.css +0 -0
  88. data/vendor/assets/stylesheets/extensions/bootstrap-table-multiple-selection-row.css +17 -0
  89. data/vendor/assets/stylesheets/extensions/bootstrap-table-reorder-rows.css +0 -0
  90. data/vendor/assets/stylesheets/extensions/bootstrap-table-sticky-header.css +0 -0
  91. data/vendor/assets/stylesheets/extensions/bootstrap-table-tree-column.css +1 -0
  92. metadata +20 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c05b4195ad766c3b26f0f2485f0b973862ef2728
4
- data.tar.gz: 25a78fa1c75f7eef2d54392fd72d1414353ed683
3
+ metadata.gz: 178cc246caf26c90aa810577dfd6766f427a8bd5
4
+ data.tar.gz: 92f4035d61f532fe493fbc82c57945bd0b9a127b
5
5
  SHA512:
6
- metadata.gz: 039327619e54a229bc6ea5841c8709c6119cfaf394f3af7e080373605e33fa21b5934406f2886ff0ac326650522f670529f05af389a59432c0fa56a32ea88fae
7
- data.tar.gz: 3c06f123c2e71d448bce802383704186a118147215cd30ce2fe5da2747ec5ce1e56b2a61e82317c18c2b6dd19177a579e4d49ff26b6b1d57eaa814c2463c18a6
6
+ metadata.gz: 7fb78f807132c4f1aec587921f16deacf771fb2d20ef815247bcb51f32e3ce6fcdb3a56a452905928119efc39b8ca5cbbe1ba76ca863fad49b6bab69a4e7bb55
7
+ data.tar.gz: 11a070cfdadf4005392abb30caadc247793f53f70c322263a9a30a7b44c987d9c14506a60fe70edb22907ed23d02a228cd4ede3b4f23b0d84f7d3ffe0f4e7f54
data/README.md CHANGED
@@ -34,31 +34,43 @@ Dir tree:
34
34
  ``` tree
35
35
  vendor/
36
36
  └── assets
37
+ ├── images
38
+ │   └── icon.png
37
39
  ├── javascripts
38
40
  │   ├── bootstrap-table-locale-all.js
39
41
  │   ├── bootstrap-table.js
40
42
  │   ├── extensions
41
43
  │   │   ├── bootstrap-table-accent-neutralise.js
42
44
  │   │   ├── bootstrap-table-angular.js
45
+ │   │   ├── bootstrap-table-auto-refresh.js
46
+ │   │   ├── bootstrap-table-click-edit-row.js
43
47
  │   │   ├── bootstrap-table-cookie.js
48
+ │   │   ├── bootstrap-table-copy-rows.js
44
49
  │   │   ├── bootstrap-table-editable.js
45
50
  │   │   ├── bootstrap-table-export.js
46
51
  │   │   ├── bootstrap-table-filter-control.js
47
52
  │   │   ├── bootstrap-table-filter.js
48
53
  │   │   ├── bootstrap-table-flat-json.js
49
- │   │   ├── bootstrap-table-group-by\ 2.js
54
+ │   │   ├── bootstrap-table-group-by-v2.js
50
55
  │   │   ├── bootstrap-table-group-by.js
56
+ │   │   ├── bootstrap-table-i18n-enhance.js
51
57
  │   │   ├── bootstrap-table-key-events.js
52
58
  │   │   ├── bootstrap-table-mobile.js
59
+ │   │   ├── bootstrap-table-multi-toggle.js
53
60
  │   │   ├── bootstrap-table-multiple-search.js
61
+ │   │   ├── bootstrap-table-multiple-selection-row.js
54
62
  │   │   ├── bootstrap-table-multiple-sort.js
55
63
  │   │   ├── bootstrap-table-natural-sorting.js
64
+ │   │   ├── bootstrap-table-print.js
56
65
  │   │   ├── bootstrap-table-reorder-columns.js
57
66
  │   │   ├── bootstrap-table-reorder-rows.js
58
67
  │   │   ├── bootstrap-table-resizable.js
68
+ │   │   ├── bootstrap-table-select2-filter.js
59
69
  │   │   ├── bootstrap-table-sticky-header.js
60
- │   │   └── bootstrap-table-toolbar.js
70
+ │   │   ├── bootstrap-table-toolbar.js
71
+ │   │   └── bootstrap-table-tree-column.js
61
72
  │   └── locale
73
+ │   ├── README.md
62
74
  │   ├── bootstrap-table-af-ZA.js
63
75
  │   ├── bootstrap-table-ar-SA.js
64
76
  │   ├── bootstrap-table-ca-ES.js
@@ -67,7 +79,9 @@ vendor/
67
79
  │   ├── bootstrap-table-de-DE.js
68
80
  │   ├── bootstrap-table-el-GR.js
69
81
  │   ├── bootstrap-table-en-US.js
82
+ │   ├── bootstrap-table-en-US.js.template
70
83
  │   ├── bootstrap-table-es-AR.js
84
+ │   ├── bootstrap-table-es-CL.js
71
85
  │   ├── bootstrap-table-es-CR.js
72
86
  │   ├── bootstrap-table-es-ES.js
73
87
  │   ├── bootstrap-table-es-MX.js
@@ -80,6 +94,7 @@ vendor/
80
94
  │   ├── bootstrap-table-he-IL.js
81
95
  │   ├── bootstrap-table-hr-HR.js
82
96
  │   ├── bootstrap-table-hu-HU.js
97
+ │   ├── bootstrap-table-id-ID.js
83
98
  │   ├── bootstrap-table-it-IT.js
84
99
  │   ├── bootstrap-table-ja-JP.js
85
100
  │   ├── bootstrap-table-ka-GE.js
@@ -98,16 +113,22 @@ vendor/
98
113
  │   ├── bootstrap-table-tr-TR.js
99
114
  │   ├── bootstrap-table-uk-UA.js
100
115
  │   ├── bootstrap-table-ur-PK.js
116
+ │   ├── bootstrap-table-uz-Latn-UZ.js
101
117
  │   ├── bootstrap-table-vi-VN.js
102
118
  │   ├── bootstrap-table-zh-CN.js
103
119
  │   └── bootstrap-table-zh-TW.js
104
120
  └── stylesheets
105
121
  ├── bootstrap-table.css
106
122
  └── extensions
107
- ├── bootstrap-table-group-by\ 2.css
123
+ ├── bootstrap-table-auto-refresh.css
124
+ ├── bootstrap-table-click-edit-row.css
125
+ ├── bootstrap-table-filter-control.css
126
+ ├── bootstrap-table-group-by-v2.css
108
127
  ├── bootstrap-table-group-by.css
128
+ ├── bootstrap-table-multiple-selection-row.css
109
129
  ├── bootstrap-table-reorder-rows.css
110
- └── bootstrap-table-sticky-header.css
130
+ ├── bootstrap-table-sticky-header.css
131
+ └── bootstrap-table-tree-column.css
111
132
  ```
112
133
 
113
134
 
@@ -1,7 +1,7 @@
1
1
  module Bootstrap
2
2
  module Table
3
3
  module Rails
4
- VERSION = "1.11.0"
4
+ VERSION = "1.11.1.1"
5
5
  end
6
6
  end
7
7
  end
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * @author zhixin wen <wenzhixin2010@gmail.com>
3
- * version: 1.11.0
3
+ * version: 1.11.1
4
4
  * https://github.com/wenzhixin/bootstrap-table/
5
5
  */
6
6
 
@@ -140,7 +140,7 @@
140
140
  return func;
141
141
  }
142
142
  if (typeof func === 'function') {
143
- return func.apply(self, args);
143
+ return func.apply(self, args || []);
144
144
  }
145
145
  if (!func && typeof name === 'string' && sprintf.apply(this, [name].concat(args))) {
146
146
  return sprintf.apply(this, [name].concat(args));
@@ -190,16 +190,6 @@
190
190
  return text;
191
191
  };
192
192
 
193
- var getRealHeight = function ($el) {
194
- var height = 0;
195
- $el.children().each(function () {
196
- if (height < $(this).outerHeight(true)) {
197
- height = $(this).outerHeight(true);
198
- }
199
- });
200
- return height;
201
- };
202
-
203
193
  var getRealDataAttr = function (dataAttr) {
204
194
  for (var attr in dataAttr) {
205
195
  var auxAttr = attr.split(/(?=[A-Z])/).join('-').toLowerCase();
@@ -220,7 +210,9 @@
220
210
  }
221
211
  var props = field.split('.');
222
212
  for (var p in props) {
223
- value = value && value[props[p]];
213
+ if (props.hasOwnProperty(p)) {
214
+ value = value && value[props[p]];
215
+ }
224
216
  }
225
217
  return escape ? escapeHTML(value) : value;
226
218
  };
@@ -287,6 +279,7 @@
287
279
 
288
280
  BootstrapTable.DEFAULTS = {
289
281
  classes: 'table table-hover',
282
+ sortClass: undefined,
290
283
  locale: undefined,
291
284
  height: undefined,
292
285
  undefinedText: '-',
@@ -296,6 +289,7 @@
296
289
  striped: false,
297
290
  columns: [[]],
298
291
  data: [],
292
+ totalField: 'total',
299
293
  dataField: 'rows',
300
294
  method: 'get',
301
295
  url: undefined,
@@ -313,6 +307,7 @@
313
307
  },
314
308
  pagination: false,
315
309
  onlyInfoPagination: false,
310
+ paginationLoop: true,
316
311
  sidePagination: 'client', // client or server
317
312
  totalRows: 0, // server side need to set
318
313
  pageNumber: 1,
@@ -531,7 +526,8 @@
531
526
  cellStyle: undefined,
532
527
  searchable: true,
533
528
  searchFormatter: true,
534
- cardVisible: true
529
+ cardVisible: true,
530
+ escape : false
535
531
  };
536
532
 
537
533
  BootstrapTable.EVENTS = {
@@ -569,6 +565,7 @@
569
565
  this.initTable();
570
566
  this.initHeader();
571
567
  this.initData();
568
+ this.initHiddenRows();
572
569
  this.initFooter();
573
570
  this.initToolbar();
574
571
  this.initPagination();
@@ -814,13 +811,12 @@
814
811
  sprintf(' rowspan="%s"', column.rowspan),
815
812
  sprintf(' colspan="%s"', column.colspan),
816
813
  sprintf(' data-field="%s"', column.field),
817
- "tabindex='0'",
818
814
  '>');
819
815
 
820
816
  html.push(sprintf('<div class="th-inner %s">', that.options.sortable && column.sortable ?
821
817
  'sortable both' : ''));
822
818
 
823
- text = column.title;
819
+ text = that.options.escape ? escapeHTML(column.title) : column.title;
824
820
 
825
821
  if (column.checkbox) {
826
822
  if (!that.options.singleSelect && that.options.checkboxHeader) {
@@ -931,7 +927,8 @@
931
927
  var that = this,
932
928
  name = this.options.sortName,
933
929
  order = this.options.sortOrder === 'desc' ? -1 : 1,
934
- index = $.inArray(this.options.sortName, this.header.fields);
930
+ index = $.inArray(this.options.sortName, this.header.fields),
931
+ timeoutId = 0;
935
932
 
936
933
  if (this.options.customSort !== $.noop) {
937
934
  this.options.customSort.apply(this, [this.options.sortName, this.options.sortOrder]);
@@ -996,6 +993,17 @@
996
993
 
997
994
  return order;
998
995
  });
996
+
997
+ if (this.options.sortClass !== undefined) {
998
+ clearTimeout(timeoutId);
999
+ timeoutId = setTimeout(function () {
1000
+ that.$el.removeClass(that.options.sortClass);
1001
+ var index = that.$header.find(sprintf('[data-field="%s"]',
1002
+ that.options.sortName).index() + 1);
1003
+ that.$el.find(sprintf('tr td:nth-child(%s)', index))
1004
+ .addClass(that.options.sortClass);
1005
+ }, 250);
1006
+ }
999
1007
  }
1000
1008
  };
1001
1009
 
@@ -1058,7 +1066,7 @@
1058
1066
  html.push(sprintf('<button class="btn' +
1059
1067
  sprintf(' btn-%s', this.options.buttonsClass) +
1060
1068
  sprintf(' btn-%s', this.options.iconSize) +
1061
- '" type="button" name="paginationSwitch" title="%s">',
1069
+ '" type="button" name="paginationSwitch" aria-label="pagination Switch" title="%s">',
1062
1070
  this.options.formatPaginationSwitch()),
1063
1071
  sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.paginationSwitchDown),
1064
1072
  '</button>');
@@ -1068,7 +1076,7 @@
1068
1076
  html.push(sprintf('<button class="btn' +
1069
1077
  sprintf(' btn-%s', this.options.buttonsClass) +
1070
1078
  sprintf(' btn-%s', this.options.iconSize) +
1071
- '" type="button" name="refresh" title="%s">',
1079
+ '" type="button" name="refresh" aria-label="refresh" title="%s">',
1072
1080
  this.options.formatRefresh()),
1073
1081
  sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.refresh),
1074
1082
  '</button>');
@@ -1078,7 +1086,7 @@
1078
1086
  html.push(sprintf('<button class="btn' +
1079
1087
  sprintf(' btn-%s', this.options.buttonsClass) +
1080
1088
  sprintf(' btn-%s', this.options.iconSize) +
1081
- '" type="button" name="toggle" title="%s">',
1089
+ '" type="button" name="toggle" aria-label="toggle" title="%s">',
1082
1090
  this.options.formatToggle()),
1083
1091
  sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.toggle),
1084
1092
  '</button>');
@@ -1087,7 +1095,7 @@
1087
1095
  if (this.options.showColumns) {
1088
1096
  html.push(sprintf('<div class="keep-open btn-group" title="%s">',
1089
1097
  this.options.formatColumns()),
1090
- '<button type="button" class="btn' +
1098
+ '<button type="button" aria-label="columns" class="btn' +
1091
1099
  sprintf(' btn-%s', this.options.buttonsClass) +
1092
1100
  sprintf(' btn-%s', this.options.iconSize) +
1093
1101
  ' dropdown-toggle" data-toggle="dropdown">',
@@ -1108,7 +1116,7 @@
1108
1116
  var checked = column.visible ? ' checked="checked"' : '';
1109
1117
 
1110
1118
  if (column.switchable) {
1111
- html.push(sprintf('<li>' +
1119
+ html.push(sprintf('<li role="menuitem">' +
1112
1120
  '<label><input type="checkbox" data-field="%s" value="%s"%s> %s</label>' +
1113
1121
  '</li>', column.field, i, checked, column.title));
1114
1122
  switchableCount++;
@@ -1172,7 +1180,7 @@
1172
1180
 
1173
1181
  this.$toolbar.append(html.join(''));
1174
1182
  $search = this.$toolbar.find('.search input');
1175
- $search.off('keyup drop').on('keyup drop', function (event) {
1183
+ $search.off('keyup drop blur').on('keyup drop blur', function (event) {
1176
1184
  if (that.options.searchOnEnterKey && event.keyCode !== 13) {
1177
1185
  return;
1178
1186
  }
@@ -1235,7 +1243,7 @@
1235
1243
  this.data = f ? $.grep(this.options.data, function (item, i) {
1236
1244
  for (var key in f) {
1237
1245
  if ($.isArray(f[key]) && $.inArray(item[key], f[key]) === -1 ||
1238
- item[key] !== f[key]) {
1246
+ !$.isArray(f[key]) && item[key] !== f[key]) {
1239
1247
  return false;
1240
1248
  }
1241
1249
  }
@@ -1377,14 +1385,14 @@
1377
1385
  }
1378
1386
 
1379
1387
  $.each(pageList, function (i, page) {
1380
- if (!that.options.smartDisplay || i === 0 || pageList[i - 1] <= that.options.totalRows) {
1388
+ if (!that.options.smartDisplay || i === 0 || pageList[i - 1] < that.options.totalRows) {
1381
1389
  var active;
1382
1390
  if ($allSelected) {
1383
1391
  active = page === that.options.formatAllRows() ? ' class="active"' : '';
1384
1392
  } else {
1385
1393
  active = page === that.options.pageSize ? ' class="active"' : '';
1386
1394
  }
1387
- pageNumber.push(sprintf('<li%s><a href="javascript:void(0)">%s</a></li>', active, page));
1395
+ pageNumber.push(sprintf('<li role="menuitem"%s><a href="#">%s</a></li>', active, page));
1388
1396
  }
1389
1397
  });
1390
1398
  pageNumber.push('</ul></span>');
@@ -1395,7 +1403,7 @@
1395
1403
  html.push('</div>',
1396
1404
  '<div class="pull-' + this.options.paginationHAlign + ' pagination">',
1397
1405
  '<ul class="pagination' + sprintf(' pagination-%s', this.options.iconSize) + '">',
1398
- '<li class="page-pre"><a href="javascript:void(0)">' + this.options.paginationPreText + '</a></li>');
1406
+ '<li class="page-pre"><a href="#">' + this.options.paginationPreText + '</a></li>');
1399
1407
 
1400
1408
  if (this.totalPages < 5) {
1401
1409
  from = 1;
@@ -1416,7 +1424,7 @@
1416
1424
  if (this.totalPages >= 6) {
1417
1425
  if (this.options.pageNumber >= 3) {
1418
1426
  html.push('<li class="page-first' + (1 === this.options.pageNumber ? ' active' : '') + '">',
1419
- '<a href="javascript:void(0)">', 1, '</a>',
1427
+ '<a href="#">', 1, '</a>',
1420
1428
  '</li>');
1421
1429
 
1422
1430
  from++;
@@ -1427,7 +1435,7 @@
1427
1435
  from--;
1428
1436
  } else {
1429
1437
  html.push('<li class="page-first-separator disabled">',
1430
- '<a href="javascript:void(0)">...</a>',
1438
+ '<a href="#">...</a>',
1431
1439
  '</li>');
1432
1440
  }
1433
1441
 
@@ -1453,14 +1461,14 @@
1453
1461
 
1454
1462
  for (i = from; i <= to; i++) {
1455
1463
  html.push('<li class="page-number' + (i === this.options.pageNumber ? ' active' : '') + '">',
1456
- '<a href="javascript:void(0)">', i, '</a>',
1464
+ '<a href="#">', i, '</a>',
1457
1465
  '</li>');
1458
1466
  }
1459
1467
 
1460
1468
  if (this.totalPages >= 8) {
1461
1469
  if (this.options.pageNumber <= (this.totalPages - 4)) {
1462
1470
  html.push('<li class="page-last-separator disabled">',
1463
- '<a href="javascript:void(0)">...</a>',
1471
+ '<a href="#">...</a>',
1464
1472
  '</li>');
1465
1473
  }
1466
1474
  }
@@ -1468,13 +1476,13 @@
1468
1476
  if (this.totalPages >= 6) {
1469
1477
  if (this.options.pageNumber <= (this.totalPages - 3)) {
1470
1478
  html.push('<li class="page-last' + (this.totalPages === this.options.pageNumber ? ' active' : '') + '">',
1471
- '<a href="javascript:void(0)">', this.totalPages, '</a>',
1479
+ '<a href="#">', this.totalPages, '</a>',
1472
1480
  '</li>');
1473
1481
  }
1474
1482
  }
1475
1483
 
1476
1484
  html.push(
1477
- '<li class="page-next"><a href="javascript:void(0)">' + this.options.paginationNextText + '</a></li>',
1485
+ '<li class="page-next"><a href="#">' + this.options.paginationNextText + '</a></li>',
1478
1486
  '</ul>',
1479
1487
  '</div>');
1480
1488
  }
@@ -1499,6 +1507,16 @@
1499
1507
  // when data is empty, hide the pagination
1500
1508
  this.$pagination[this.getData().length ? 'show' : 'hide']();
1501
1509
  }
1510
+
1511
+ if (!this.options.paginationLoop) {
1512
+ if (this.options.pageNumber === 1) {
1513
+ $pre.addClass('disabled');
1514
+ }
1515
+ if (this.options.pageNumber === this.totalPages) {
1516
+ $next.addClass('disabled');
1517
+ }
1518
+ }
1519
+
1502
1520
  if ($allSelected) {
1503
1521
  this.options.pageSize = this.options.formatAllRows();
1504
1522
  }
@@ -1540,11 +1558,13 @@
1540
1558
  this.$toolbar.find('.page-size').text(this.options.pageSize);
1541
1559
 
1542
1560
  this.updatePagination(event);
1561
+ return false;
1543
1562
  };
1544
1563
 
1545
1564
  BootstrapTable.prototype.onPageFirst = function (event) {
1546
1565
  this.options.pageNumber = 1;
1547
1566
  this.updatePagination(event);
1567
+ return false;
1548
1568
  };
1549
1569
 
1550
1570
  BootstrapTable.prototype.onPagePre = function (event) {
@@ -1554,6 +1574,7 @@
1554
1574
  this.options.pageNumber--;
1555
1575
  }
1556
1576
  this.updatePagination(event);
1577
+ return false;
1557
1578
  };
1558
1579
 
1559
1580
  BootstrapTable.prototype.onPageNext = function (event) {
@@ -1563,11 +1584,13 @@
1563
1584
  this.options.pageNumber++;
1564
1585
  }
1565
1586
  this.updatePagination(event);
1587
+ return false;
1566
1588
  };
1567
1589
 
1568
1590
  BootstrapTable.prototype.onPageLast = function (event) {
1569
1591
  this.options.pageNumber = this.totalPages;
1570
1592
  this.updatePagination(event);
1593
+ return false;
1571
1594
  };
1572
1595
 
1573
1596
  BootstrapTable.prototype.onPageNumber = function (event) {
@@ -1576,55 +1599,138 @@
1576
1599
  }
1577
1600
  this.options.pageNumber = +$(event.currentTarget).text();
1578
1601
  this.updatePagination(event);
1602
+ return false;
1579
1603
  };
1580
1604
 
1581
- BootstrapTable.prototype.initBody = function (fixedScroll) {
1582
- var that = this,
1605
+ BootstrapTable.prototype.initRow = function(item, i, data, parentDom) {
1606
+ var that=this,
1607
+ key,
1583
1608
  html = [],
1584
- data = this.getData();
1609
+ style = {},
1610
+ csses = [],
1611
+ data_ = '',
1612
+ attributes = {},
1613
+ htmlAttributes = [];
1585
1614
 
1586
- this.trigger('pre-body', data);
1615
+ if ($.inArray(item, this.hiddenRows) > -1) {
1616
+ return;
1617
+ }
1587
1618
 
1588
- this.$body = this.$el.find('>tbody');
1589
- if (!this.$body.length) {
1590
- this.$body = $('<tbody></tbody>').appendTo(this.$el);
1619
+ style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
1620
+
1621
+ if (style && style.css) {
1622
+ for (key in style.css) {
1623
+ csses.push(key + ': ' + style.css[key]);
1624
+ }
1591
1625
  }
1592
1626
 
1593
- //Fix #389 Bootstrap-table-flatJSON is not working
1627
+ attributes = calculateObjectValue(this.options,
1628
+ this.options.rowAttributes, [item, i], attributes);
1594
1629
 
1595
- if (!this.options.pagination || this.options.sidePagination === 'server') {
1596
- this.pageFrom = 1;
1597
- this.pageTo = data.length;
1630
+ if (attributes) {
1631
+ for (key in attributes) {
1632
+ htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
1633
+ }
1598
1634
  }
1599
1635
 
1600
- for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
1601
- var key,
1602
- item = data[i],
1603
- style = {},
1604
- csses = [],
1636
+ if (item._data && !$.isEmptyObject(item._data)) {
1637
+ $.each(item._data, function(k, v) {
1638
+ // ignore data-index
1639
+ if (k === 'index') {
1640
+ return;
1641
+ }
1642
+ data_ += sprintf(' data-%s="%s"', k, v);
1643
+ });
1644
+ }
1645
+
1646
+ html.push('<tr',
1647
+ sprintf(' %s', htmlAttributes.join(' ')),
1648
+ sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
1649
+ sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
1650
+ sprintf(' data-index="%s"', i),
1651
+ sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
1652
+ sprintf('%s', data_),
1653
+ '>'
1654
+ );
1655
+
1656
+ if (this.options.cardView) {
1657
+ html.push(sprintf('<td colspan="%s"><div class="card-views">', this.header.fields.length));
1658
+ }
1659
+
1660
+ if (!this.options.cardView && this.options.detailView) {
1661
+ html.push('<td>',
1662
+ '<a class="detail-icon" href="#">',
1663
+ sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
1664
+ '</a>',
1665
+ '</td>');
1666
+ }
1667
+
1668
+ $.each(this.header.fields, function(j, field) {
1669
+ var text = '',
1670
+ value_ = getItemField(item, field, that.options.escape),
1671
+ value = '',
1672
+ type = '',
1673
+ cellStyle = {},
1674
+ id_ = '',
1675
+ class_ = that.header.classes[j],
1605
1676
  data_ = '',
1606
- attributes = {},
1607
- htmlAttributes = [];
1677
+ rowspan_ = '',
1678
+ colspan_ = '',
1679
+ title_ = '',
1680
+ column = that.columns[j];
1608
1681
 
1609
- style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
1682
+ if (that.fromHtml && typeof value_ === 'undefined') {
1683
+ return;
1684
+ }
1610
1685
 
1611
- if (style && style.css) {
1612
- for (key in style.css) {
1613
- csses.push(key + ': ' + style.css[key]);
1614
- }
1686
+ if (!column.visible) {
1687
+ return;
1615
1688
  }
1616
1689
 
1617
- attributes = calculateObjectValue(this.options,
1618
- this.options.rowAttributes, [item, i], attributes);
1690
+ if (that.options.cardView && (!column.cardVisible)) {
1691
+ return;
1692
+ }
1619
1693
 
1620
- if (attributes) {
1621
- for (key in attributes) {
1622
- htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
1694
+ if (column.escape) {
1695
+ value_ = escapeHTML(value_);
1696
+ }
1697
+
1698
+ style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
1699
+
1700
+ // handle td's id and class
1701
+ if (item['_' + field + '_id']) {
1702
+ id_ = sprintf(' id="%s"', item['_' + field + '_id']);
1703
+ }
1704
+ if (item['_' + field + '_class']) {
1705
+ class_ = sprintf(' class="%s"', item['_' + field + '_class']);
1706
+ }
1707
+ if (item['_' + field + '_rowspan']) {
1708
+ rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
1709
+ }
1710
+ if (item['_' + field + '_colspan']) {
1711
+ colspan_ = sprintf(' colspan="%s"', item['_' + field + '_colspan']);
1712
+ }
1713
+ if (item['_' + field + '_title']) {
1714
+ title_ = sprintf(' title="%s"', item['_' + field + '_title']);
1715
+ }
1716
+ cellStyle = calculateObjectValue(that.header,
1717
+ that.header.cellStyles[j], [value_, item, i, field], cellStyle);
1718
+ if (cellStyle.classes) {
1719
+ class_ = sprintf(' class="%s"', cellStyle.classes);
1720
+ }
1721
+ if (cellStyle.css) {
1722
+ var csses_ = [];
1723
+ for (var key in cellStyle.css) {
1724
+ csses_.push(key + ': ' + cellStyle.css[key]);
1623
1725
  }
1726
+ style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
1624
1727
  }
1625
1728
 
1626
- if (item._data && !$.isEmptyObject(item._data)) {
1627
- $.each(item._data, function (k, v) {
1729
+ value = calculateObjectValue(column,
1730
+ that.header.formatters[j], [value_, item, i], value_);
1731
+
1732
+ if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
1733
+ $.each(item['_' + field + '_data'], function(k, v) {
1628
1734
  // ignore data-index
1629
1735
  if (k === 'index') {
1630
1736
  return;
@@ -1633,159 +1739,101 @@
1633
1739
  });
1634
1740
  }
1635
1741
 
1636
- html.push('<tr',
1637
- sprintf(' %s', htmlAttributes.join(' ')),
1638
- sprintf(' id="%s"', $.isArray(item) ? undefined : item._id),
1639
- sprintf(' class="%s"', style.classes || ($.isArray(item) ? undefined : item._class)),
1640
- sprintf(' data-index="%s"', i),
1641
- sprintf(' data-uniqueid="%s"', item[this.options.uniqueId]),
1642
- sprintf('%s', data_),
1643
- '>'
1644
- );
1742
+ if (column.checkbox || column.radio) {
1743
+ type = column.checkbox ? 'checkbox' : type;
1744
+ type = column.radio ? 'radio' : type;
1645
1745
 
1646
- if (this.options.cardView) {
1647
- html.push(sprintf('<td colspan="%s"><div class="card-views">', this.header.fields.length));
1648
- }
1746
+ text = [sprintf(that.options.cardView ?
1747
+ '<div class="card-view %s">' : '<td class="bs-checkbox %s">', column['class'] || ''),
1748
+ '<input' +
1749
+ sprintf(' data-index="%s"', i) +
1750
+ sprintf(' name="%s"', that.options.selectItemName) +
1751
+ sprintf(' type="%s"', type) +
1752
+ sprintf(' value="%s"', item[that.options.idField]) +
1753
+ sprintf(' checked="%s"', value === true ||
1754
+ (value_ || value && value.checked) ? 'checked' : undefined) +
1755
+ sprintf(' disabled="%s"', !column.checkboxEnabled ||
1756
+ (value && value.disabled) ? 'disabled' : undefined) +
1757
+ ' />',
1758
+ that.header.formatters[j] && typeof value === 'string' ? value : '',
1759
+ that.options.cardView ? '</div>' : '</td>'
1760
+ ].join('');
1649
1761
 
1650
- if (!this.options.cardView && this.options.detailView) {
1651
- html.push('<td>',
1652
- '<a class="detail-icon" href="javascript:">',
1653
- sprintf('<i class="%s %s"></i>', this.options.iconsPrefix, this.options.icons.detailOpen),
1654
- '</a>',
1655
- '</td>');
1656
- }
1762
+ item[that.header.stateField] = value === true || (value && value.checked);
1763
+ } else {
1764
+ value = typeof value === 'undefined' || value === null ?
1765
+ that.options.undefinedText : value;
1766
+
1767
+ text = that.options.cardView ? ['<div class="card-view">',
1768
+ that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
1769
+ getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
1770
+ sprintf('<span class="value">%s</span>', value),
1771
+ '</div>'
1772
+ ].join('') : [sprintf('<td%s %s %s %s %s %s %s>',
1773
+ id_, class_, style, data_, rowspan_, colspan_, title_),
1774
+ value,
1775
+ '</td>'
1776
+ ].join('');
1657
1777
 
1658
- $.each(this.header.fields, function (j, field) {
1659
- var text = '',
1660
- value = getItemField(item, field, that.options.escape),
1661
- type = '',
1662
- cellStyle = {},
1663
- id_ = '',
1664
- class_ = that.header.classes[j],
1665
- data_ = '',
1666
- rowspan_ = '',
1667
- colspan_ = '',
1668
- title_ = '',
1669
- column = that.columns[j];
1670
-
1671
- if (that.fromHtml && typeof value === 'undefined') {
1672
- return;
1778
+ // Hide empty data on Card view when smartDisplay is set to true.
1779
+ if (that.options.cardView && that.options.smartDisplay && value === '') {
1780
+ // Should set a placeholder for event binding correct fieldIndex
1781
+ text = '<div class="card-view"></div>';
1673
1782
  }
1783
+ }
1674
1784
 
1675
- if (!column.visible) {
1676
- return;
1677
- }
1785
+ html.push(text);
1786
+ });
1678
1787
 
1679
- if (that.options.cardView && !column.cardVisible) {
1680
- return;
1681
- }
1788
+ if (this.options.cardView) {
1789
+ html.push('</div></td>');
1790
+ }
1791
+ html.push('</tr>');
1682
1792
 
1683
- style = sprintf('style="%s"', csses.concat(that.header.styles[j]).join('; '));
1793
+ return html.join(' ');
1794
+ };
1684
1795
 
1685
- // handle td's id and class
1686
- if (item['_' + field + '_id']) {
1687
- id_ = sprintf(' id="%s"', item['_' + field + '_id']);
1688
- }
1689
- if (item['_' + field + '_class']) {
1690
- class_ = sprintf(' class="%s"', item['_' + field + '_class']);
1691
- }
1692
- if (item['_' + field + '_rowspan']) {
1693
- rowspan_ = sprintf(' rowspan="%s"', item['_' + field + '_rowspan']);
1694
- }
1695
- if (item['_' + field + '_colspan']) {
1696
- colspan_ = sprintf(' colspan="%s"', item['_' + field + '_colspan']);
1697
- }
1698
- if (item['_' + field + '_title']) {
1699
- title_ = sprintf(' title="%s"', item['_' + field + '_title']);
1700
- }
1701
- cellStyle = calculateObjectValue(that.header,
1702
- that.header.cellStyles[j], [value, item, i, field], cellStyle);
1703
- if (cellStyle.classes) {
1704
- class_ = sprintf(' class="%s"', cellStyle.classes);
1705
- }
1706
- if (cellStyle.css) {
1707
- var csses_ = [];
1708
- for (var key in cellStyle.css) {
1709
- csses_.push(key + ': ' + cellStyle.css[key]);
1710
- }
1711
- style = sprintf('style="%s"', csses_.concat(that.header.styles[j]).join('; '));
1712
- }
1796
+ BootstrapTable.prototype.initBody = function (fixedScroll) {
1797
+ var that = this,
1798
+ html = [],
1799
+ data = this.getData();
1713
1800
 
1714
- value = calculateObjectValue(column,
1715
- that.header.formatters[j], [value, item, i], value);
1801
+ this.trigger('pre-body', data);
1716
1802
 
1717
- if (item['_' + field + '_data'] && !$.isEmptyObject(item['_' + field + '_data'])) {
1718
- $.each(item['_' + field + '_data'], function (k, v) {
1719
- // ignore data-index
1720
- if (k === 'index') {
1721
- return;
1722
- }
1723
- data_ += sprintf(' data-%s="%s"', k, v);
1724
- });
1725
- }
1803
+ this.$body = this.$el.find('>tbody');
1804
+ if (!this.$body.length) {
1805
+ this.$body = $('<tbody></tbody>').appendTo(this.$el);
1806
+ }
1726
1807
 
1727
- if (column.checkbox || column.radio) {
1728
- type = column.checkbox ? 'checkbox' : type;
1729
- type = column.radio ? 'radio' : type;
1808
+ //Fix #389 Bootstrap-table-flatJSON is not working
1730
1809
 
1731
- text = [sprintf(that.options.cardView ?
1732
- '<div class="card-view %s">' : '<td class="bs-checkbox %s">', column['class'] || ''),
1733
- '<input' +
1734
- sprintf(' data-index="%s"', i) +
1735
- sprintf(' name="%s"', that.options.selectItemName) +
1736
- sprintf(' type="%s"', type) +
1737
- sprintf(' value="%s"', item[that.options.idField]) +
1738
- sprintf(' checked="%s"', value === true ||
1739
- (value && value.checked) ? 'checked' : undefined) +
1740
- sprintf(' disabled="%s"', !column.checkboxEnabled ||
1741
- (value && value.disabled) ? 'disabled' : undefined) +
1742
- ' />',
1743
- that.header.formatters[j] && typeof value === 'string' ? value : '',
1744
- that.options.cardView ? '</div>' : '</td>'
1745
- ].join('');
1746
-
1747
- item[that.header.stateField] = value === true || (value && value.checked);
1748
- } else {
1749
- value = typeof value === 'undefined' || value === null ?
1750
- that.options.undefinedText : value;
1751
-
1752
- text = that.options.cardView ? ['<div class="card-view">',
1753
- that.options.showHeader ? sprintf('<span class="title" %s>%s</span>', style,
1754
- getPropertyFromOther(that.columns, 'field', 'title', field)) : '',
1755
- sprintf('<span class="value">%s</span>', value),
1756
- '</div>'
1757
- ].join('') : [sprintf('<td%s %s %s %s %s %s %s>',
1758
- id_, class_, style, data_, rowspan_, colspan_, title_),
1759
- value,
1760
- '</td>'
1761
- ].join('');
1762
-
1763
- // Hide empty data on Card view when smartDisplay is set to true.
1764
- if (that.options.cardView && that.options.smartDisplay && value === '') {
1765
- // Should set a placeholder for event binding correct fieldIndex
1766
- text = '<div class="card-view"></div>';
1767
- }
1768
- }
1810
+ if (!this.options.pagination || this.options.sidePagination === 'server') {
1811
+ this.pageFrom = 1;
1812
+ this.pageTo = data.length;
1813
+ }
1769
1814
 
1770
- html.push(text);
1771
- });
1815
+ var trFragments = $(document.createDocumentFragment());
1816
+ var hasTr;
1772
1817
 
1773
- if (this.options.cardView) {
1774
- html.push('</div></td>');
1818
+ for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
1819
+ var item = data[i];
1820
+ var tr = this.initRow(item, i, data, trFragments);
1821
+ hasTr = hasTr || !!tr;
1822
+ if (tr&&tr!==true) {
1823
+ trFragments.append(tr);
1775
1824
  }
1776
-
1777
- html.push('</tr>');
1778
1825
  }
1779
1826
 
1780
1827
  // show no records
1781
- if (!html.length) {
1782
- html.push('<tr class="no-records-found">',
1828
+ if (!hasTr) {
1829
+ trFragments.append('<tr class="no-records-found">' +
1783
1830
  sprintf('<td colspan="%s">%s</td>',
1784
- this.$header.find('th').length, this.options.formatNoMatches()),
1831
+ this.$header.find('th').length,
1832
+ this.options.formatNoMatches()) +
1785
1833
  '</tr>');
1786
1834
  }
1787
1835
 
1788
- this.$body.html(html.join(''));
1836
+ this.$body.html(trFragments);
1789
1837
 
1790
1838
  if (!fixedScroll) {
1791
1839
  this.scrollTo(0);
@@ -1827,8 +1875,8 @@
1827
1875
  // remove and update
1828
1876
  if ($tr.next().is('tr.detail-view')) {
1829
1877
  $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailOpen));
1830
- $tr.next().remove();
1831
1878
  that.trigger('collapse-row', index, row);
1879
+ $tr.next().remove();
1832
1880
  } else {
1833
1881
  $this.find('i').attr('class', sprintf('%s %s', that.options.iconsPrefix, that.options.icons.detailClose));
1834
1882
  $tr.after(sprintf('<tr class="detail-view"><td colspan="%s"></td></tr>', $tr.find('td').length));
@@ -1840,6 +1888,7 @@
1840
1888
  that.trigger('expand-row', index, row, $element);
1841
1889
  }
1842
1890
  that.resetView();
1891
+ return false;
1843
1892
  });
1844
1893
 
1845
1894
  this.$selectItem = this.$body.find(sprintf('[name="%s"]', this.options.selectItemName));
@@ -2041,6 +2090,7 @@
2041
2090
  row[that.header.stateField] = false;
2042
2091
  }
2043
2092
  });
2093
+ this.initHiddenRows();
2044
2094
  };
2045
2095
 
2046
2096
  BootstrapTable.prototype.trigger = function (name) {
@@ -2257,17 +2307,6 @@
2257
2307
  }
2258
2308
  };
2259
2309
 
2260
- BootstrapTable.prototype.toggleRow = function (index, uniqueId, visible) {
2261
- if (index === -1) {
2262
- return;
2263
- }
2264
-
2265
- this.$body.find(typeof index !== 'undefined' ?
2266
- sprintf('tr[data-index="%s"]', index) :
2267
- sprintf('tr[data-uniqueid="%s"]', uniqueId))
2268
- [visible ? 'show' : 'hide']();
2269
- };
2270
-
2271
2310
  BootstrapTable.prototype.getVisibleFields = function () {
2272
2311
  var that = this,
2273
2312
  visibleFields = [];
@@ -2297,8 +2336,8 @@
2297
2336
  this.$selectItem.length === this.$selectItem.filter(':checked').length);
2298
2337
 
2299
2338
  if (this.options.height) {
2300
- var toolbarHeight = getRealHeight(this.$toolbar),
2301
- paginationHeight = getRealHeight(this.$pagination),
2339
+ var toolbarHeight = this.$toolbar.outerHeight(true),
2340
+ paginationHeight = this.$pagination.outerHeight(true),
2302
2341
  height = this.options.height - toolbarHeight - paginationHeight;
2303
2342
 
2304
2343
  this.$tableContainer.css('height', height + 'px');
@@ -2345,7 +2384,7 @@
2345
2384
 
2346
2385
  // #431: support pagination
2347
2386
  if (this.options.sidePagination === 'server') {
2348
- this.options.totalRows = data.total;
2387
+ this.options.totalRows = data[this.options.totalField];
2349
2388
  fixedScroll = data.fixedScroll;
2350
2389
  data = data[this.options.dataField];
2351
2390
  } else if (!$.isArray(data)) { // support fixedScroll
@@ -2391,6 +2430,9 @@
2391
2430
  }
2392
2431
  if ($.inArray(row[params.field], params.values) !== -1) {
2393
2432
  this.options.data.splice(i, 1);
2433
+ if (this.options.sidePagination === 'server') {
2434
+ this.options.totalRows -= 1;
2435
+ }
2394
2436
  }
2395
2437
  }
2396
2438
 
@@ -2486,6 +2528,7 @@
2486
2528
  });
2487
2529
 
2488
2530
  this.initSearch();
2531
+ this.initPagination();
2489
2532
  this.initSort();
2490
2533
  this.initBody(true);
2491
2534
  };
@@ -2513,32 +2556,57 @@
2513
2556
  });
2514
2557
 
2515
2558
  this.initSearch();
2559
+ this.initPagination();
2516
2560
  this.initSort();
2517
2561
  this.initBody(true);
2518
2562
  };
2519
2563
 
2564
+ BootstrapTable.prototype.initHiddenRows = function () {
2565
+ this.hiddenRows = [];
2566
+ };
2567
+
2520
2568
  BootstrapTable.prototype.showRow = function (params) {
2521
- if (!params.hasOwnProperty('index') && !params.hasOwnProperty('uniqueId')) {
2522
- return;
2523
- }
2524
- this.toggleRow(params.index, params.uniqueId, true);
2569
+ this.toggleRow(params, true);
2525
2570
  };
2526
2571
 
2527
2572
  BootstrapTable.prototype.hideRow = function (params) {
2528
- if (!params.hasOwnProperty('index') && !params.hasOwnProperty('uniqueId')) {
2573
+ this.toggleRow(params, false);
2574
+ };
2575
+
2576
+ BootstrapTable.prototype.toggleRow = function (params, visible) {
2577
+ var row, index;
2578
+
2579
+ if (params.hasOwnProperty('index')) {
2580
+ row = this.getData()[params.index];
2581
+ } else if (params.hasOwnProperty('uniqueId')) {
2582
+ row = this.getRowByUniqueId(params.uniqueId);
2583
+ }
2584
+
2585
+ if (!row) {
2529
2586
  return;
2530
2587
  }
2531
- this.toggleRow(params.index, params.uniqueId, false);
2588
+
2589
+ index = $.inArray(row, this.hiddenRows);
2590
+
2591
+ if (!visible && index === -1) {
2592
+ this.hiddenRows.push(row);
2593
+ } else if (visible && index > -1) {
2594
+ this.hiddenRows.splice(index, 1);
2595
+ }
2596
+ this.initBody(true);
2532
2597
  };
2533
2598
 
2534
- BootstrapTable.prototype.getRowsHidden = function (show) {
2535
- var rows = $(this.$body[0]).children().filter(':hidden'),
2536
- i = 0;
2537
- if (show) {
2538
- for (; i < rows.length; i++) {
2539
- $(rows[i]).show();
2599
+ BootstrapTable.prototype.getHiddenRows = function (show) {
2600
+ var that = this,
2601
+ data = this.getData(),
2602
+ rows = [];
2603
+
2604
+ $.each(data, function (i, row) {
2605
+ if ($.inArray(row, that.hiddenRows) > -1) {
2606
+ rows.push(row);
2540
2607
  }
2541
- }
2608
+ });
2609
+ this.hiddenRows = rows;
2542
2610
  return rows;
2543
2611
  };
2544
2612
 
@@ -2593,7 +2661,8 @@
2593
2661
  var that = this;
2594
2662
 
2595
2663
  return $.grep(this.options.data, function (row) {
2596
- return row[that.header.stateField];
2664
+ // fix #2424: from html with checkbox
2665
+ return row[that.header.stateField] === true;
2597
2666
  });
2598
2667
  };
2599
2668
 
@@ -2718,7 +2787,13 @@
2718
2787
 
2719
2788
  BootstrapTable.prototype.refresh = function (params) {
2720
2789
  if (params && params.url) {
2721
- this.options.pageNumber = 1;
2790
+ this.options.url = params.url;
2791
+ }
2792
+ if (params && params.pageNumber) {
2793
+ this.options.pageNumber = params.pageNumber;
2794
+ }
2795
+ if (params && params.pageSize) {
2796
+ this.options.pageSize = params.pageSize;
2722
2797
  }
2723
2798
  this.initServer(params && params.silent,
2724
2799
  params && params.query, params && params.url);
@@ -2937,7 +3012,7 @@
2937
3012
  'getSelections', 'getAllSelections', 'getData',
2938
3013
  'load', 'append', 'prepend', 'remove', 'removeAll',
2939
3014
  'insertRow', 'updateRow', 'updateCell', 'updateByUniqueId', 'removeByUniqueId',
2940
- 'getRowByUniqueId', 'showRow', 'hideRow', 'getRowsHidden',
3015
+ 'getRowByUniqueId', 'showRow', 'hideRow', 'getHiddenRows',
2941
3016
  'mergeCells',
2942
3017
  'checkAll', 'uncheckAll', 'checkInvert',
2943
3018
  'check', 'uncheck',