|
|
@@ -5,9 +5,9 @@
|
|
|
*/
|
|
|
|
|
|
!function ($) {
|
|
|
-
|
|
|
'use strict';
|
|
|
|
|
|
+ var cellHeight = 37; // update css if changed
|
|
|
// TOOLS DEFINITION
|
|
|
// ======================
|
|
|
|
|
|
@@ -54,24 +54,28 @@
|
|
|
return index;
|
|
|
};
|
|
|
|
|
|
+ var cachedWidth = null;
|
|
|
var getScrollBarWidth = function () {
|
|
|
- var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
|
|
|
- outer = $('<div/>').addClass('fixed-table-scroll-outer'),
|
|
|
- w1, w2;
|
|
|
+ if (cachedWidth === null) {
|
|
|
+ var inner = $('<p/>').addClass('fixed-table-scroll-inner'),
|
|
|
+ outer = $('<div/>').addClass('fixed-table-scroll-outer'),
|
|
|
+ w1, w2;
|
|
|
|
|
|
- outer.append(inner);
|
|
|
- $('body').append(outer);
|
|
|
+ outer.append(inner);
|
|
|
+ $('body').append(outer);
|
|
|
|
|
|
- w1 = inner[0].offsetWidth;
|
|
|
- outer.css('overflow', 'scroll');
|
|
|
- w2 = inner[0].offsetWidth;
|
|
|
+ w1 = inner[0].offsetWidth;
|
|
|
+ outer.css('overflow', 'scroll');
|
|
|
+ w2 = inner[0].offsetWidth;
|
|
|
|
|
|
- if (w1 === w2) {
|
|
|
- w2 = outer[0].clientWidth;
|
|
|
- }
|
|
|
+ if (w1 === w2) {
|
|
|
+ w2 = outer[0].clientWidth;
|
|
|
+ }
|
|
|
|
|
|
- outer.remove();
|
|
|
- return w1 - w2;
|
|
|
+ outer.remove();
|
|
|
+ cachedWidth = w1 - w2;
|
|
|
+ }
|
|
|
+ return cachedWidth;
|
|
|
};
|
|
|
|
|
|
var calculateObjectValue = function (self, name, args, defaultValue) {
|
|
|
@@ -455,7 +459,7 @@
|
|
|
} else {
|
|
|
this.$header.show();
|
|
|
this.$container.find('.fixed-table-header').show();
|
|
|
- this.$loading.css('top', '37px');
|
|
|
+ this.$loading.css('top', cellHeight + 'px');
|
|
|
}
|
|
|
|
|
|
this.$selectAll = this.$header.find('[name="btSelectAll"]');
|
|
|
@@ -517,21 +521,21 @@
|
|
|
if (bb === undefined || bb === null) {
|
|
|
bb = '';
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if ($.isNumeric(aa) && $.isNumeric(bb)) {
|
|
|
if (aa < bb) {
|
|
|
return order * -1;
|
|
|
}
|
|
|
return order;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
if (aa === bb) {
|
|
|
return 0;
|
|
|
}
|
|
|
if (aa.localeCompare(bb) === -1) {
|
|
|
return order * -1;
|
|
|
}
|
|
|
-
|
|
|
+
|
|
|
return order;
|
|
|
});
|
|
|
}
|
|
|
@@ -978,7 +982,8 @@
|
|
|
}
|
|
|
|
|
|
for (var i = this.pageFrom - 1; i < this.pageTo; i++) {
|
|
|
- var item = data[i],
|
|
|
+ var key,
|
|
|
+ item = data[i],
|
|
|
style = {},
|
|
|
csses = [],
|
|
|
attributes = {},
|
|
|
@@ -987,7 +992,7 @@
|
|
|
style = calculateObjectValue(this.options, this.options.rowStyle, [item, i], style);
|
|
|
|
|
|
if (style && style.css) {
|
|
|
- for (var key in style.css) {
|
|
|
+ for (key in style.css) {
|
|
|
csses.push(key + ': ' + style.css[key]);
|
|
|
}
|
|
|
}
|
|
|
@@ -996,7 +1001,7 @@
|
|
|
this.options.rowAttributes, [item, i], attributes);
|
|
|
|
|
|
if (attributes) {
|
|
|
- for (var key in attributes) {
|
|
|
+ for (key in attributes) {
|
|
|
htmlAttributes.push(sprintf('%s="%s"', key, escapeHTML(attributes[key])));
|
|
|
}
|
|
|
}
|
|
|
@@ -1293,46 +1298,48 @@
|
|
|
};
|
|
|
|
|
|
BootstrapTable.prototype.resetHeader = function () {
|
|
|
- var that = this,
|
|
|
- $fixedHeader = this.$container.find('.fixed-table-header'),
|
|
|
- $fixedBody = this.$container.find('.fixed-table-body'),
|
|
|
- scrollWidth = this.$el.width() > $fixedBody.width() ? getScrollBarWidth() : 0;
|
|
|
-
|
|
|
+ this.$el.css('margin-top', -this.$header.height());
|
|
|
// fix #61: the hidden table reset header bug.
|
|
|
- if (this.$el.is(':hidden')) {
|
|
|
- clearTimeout(this.timeoutId_); // doesn't matter if it's 0
|
|
|
- this.timeoutId_ = setTimeout($.proxy(this.resetHeader, this), 100); // 100ms
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- this.$header_ = this.$header.clone(true, true);
|
|
|
- this.$selectAll_ = this.$header_.find('[name="btSelectAll"]');
|
|
|
-
|
|
|
// fix bug: get $el.css('width') error sometime (height = 500)
|
|
|
- setTimeout(function () {
|
|
|
- $fixedHeader.css({
|
|
|
- 'height': '37px',
|
|
|
- 'border-bottom': '1px solid #dddddd',
|
|
|
- 'margin-right': scrollWidth
|
|
|
- }).find('table').css('width', that.$el.css('width'))
|
|
|
- .html('').attr('class', that.$el.attr('class'))
|
|
|
- .append(that.$header_);
|
|
|
-
|
|
|
- // fix bug: $.data() is not working as expected after $.append()
|
|
|
- that.$header.find('th').each(function (i) {
|
|
|
- that.$header_.find('th').eq(i).data($(this).data());
|
|
|
- });
|
|
|
+ clearTimeout(this.timeoutId_);
|
|
|
+ this.timeoutId_ = setTimeout($.proxy(this.fitHeader, this), this.$el.is(':hidden') ? 100 : 0);
|
|
|
+ return;
|
|
|
+ };
|
|
|
|
|
|
- that.$body.find('tr:first-child:not(.no-records-found) > *').each(function(i) {
|
|
|
- that.$header_.find('div.fht-cell').eq(i).width($(this).innerWidth());
|
|
|
- });
|
|
|
+ BootstrapTable.prototype.fitHeader = function () {
|
|
|
+ var bt = this,
|
|
|
+ $fixedHeader,
|
|
|
+ $fixedBody,
|
|
|
+ scrollWidth;
|
|
|
|
|
|
- that.$el.css('margin-top', -that.$header.height());
|
|
|
+ if (bt.$el.is(':hidden')) {
|
|
|
+ bt.timeoutFooter_ = setTimeout($.proxy(bt.fitHeader, bt), 100);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $fixedHeader = bt.$container.find('.fixed-table-header'),
|
|
|
+ $fixedBody = bt.$container.find('.fixed-table-body'),
|
|
|
+ scrollWidth = bt.$el.width() > $fixedBody.width() ? getScrollBarWidth() : 0;
|
|
|
+
|
|
|
+ bt.$header_ = bt.$header.clone(true, true);
|
|
|
+ bt.$selectAll_ = bt.$header_.find('[name="btSelectAll"]');
|
|
|
+ $fixedHeader.css({
|
|
|
+ 'margin-right': scrollWidth
|
|
|
+ }).find('table').css('width', bt.$el.css('width'))
|
|
|
+ .html('').attr('class', bt.$el.attr('class'))
|
|
|
+ .append(bt.$header_);
|
|
|
+
|
|
|
+ // fix bug: $.data() is not working as expected after $.append()
|
|
|
+ bt.$header.find('th').each(function (i) {
|
|
|
+ bt.$header_.find('th').eq(i).data($(this).data());
|
|
|
+ });
|
|
|
|
|
|
- // horizontal scroll event
|
|
|
- $fixedBody.off('scroll').on('scroll', function () {
|
|
|
- $fixedHeader.scrollLeft($(this).scrollLeft());
|
|
|
- });
|
|
|
+ bt.$body.find('tr:first-child:not(.no-records-found) > *').each(function(i) {
|
|
|
+ bt.$header_.find('div.fht-cell').eq(i).width($(this).innerWidth());
|
|
|
+ });
|
|
|
+ // horizontal scroll event
|
|
|
+ // TODO: it's probably better improving the layout than binding to scroll event
|
|
|
+ $fixedBody.off('scroll').on('scroll', function () {
|
|
|
+ $fixedHeader.scrollLeft($(this).scrollLeft());
|
|
|
});
|
|
|
};
|
|
|
|
|
|
@@ -1364,7 +1371,8 @@
|
|
|
|
|
|
BootstrapTable.prototype.resetView = function (params) {
|
|
|
var that = this,
|
|
|
- header = this.header;
|
|
|
+ padding = 0,
|
|
|
+ $tableContainer = that.$container.find('.fixed-table-container');
|
|
|
|
|
|
if (params && params.height) {
|
|
|
this.options.height = params.height;
|
|
|
@@ -1378,23 +1386,22 @@
|
|
|
paginationHeight = +this.$pagination.children().outerHeight(true),
|
|
|
height = this.options.height - toolbarHeight - paginationHeight;
|
|
|
|
|
|
- this.$container.find('.fixed-table-container').css('height', height + 'px');
|
|
|
+ $tableContainer.css('height', height + 'px');
|
|
|
}
|
|
|
|
|
|
if (this.options.cardView) {
|
|
|
// remove the element css
|
|
|
that.$el.css('margin-top', '0');
|
|
|
- that.$container.find('.fixed-table-container').css('padding-bottom', '0');
|
|
|
+ $tableContainer.css('padding-bottom', '0');
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
if (this.options.showHeader && this.options.height) {
|
|
|
this.resetHeader();
|
|
|
+ padding += cellHeight;
|
|
|
}
|
|
|
|
|
|
- if (this.options.height && this.options.showHeader) {
|
|
|
- this.$container.find('.fixed-table-container').css('padding-bottom', '37px');
|
|
|
- }
|
|
|
+ $tableContainer.css('padding-bottom', padding + 'px');
|
|
|
};
|
|
|
|
|
|
BootstrapTable.prototype.getData = function () {
|