/** * @author zhixin wen * version: 1.10.0 * https://github.com/wenzhixin/bootstrap-table/ */ !(function($) { "use strict"; // TOOLS DEFINITION // ====================== var cachedWidth = null; // it only does '%s', and return '' when arguments are undefined var sprintf = function(str) { var args = arguments, flag = true, i = 1; str = str.replace(/%s/g, function() { var arg = args[i++]; if (typeof arg === "undefined") { flag = false; return ""; } return arg; }); return flag ? str : ""; }; var getPropertyFromOther = function(list, from, to, value) { var result = ""; $.each(list, function(i, item) { if (item[from] === value) { result = item[to]; return false; } return true; }); return result; }; var getFieldIndex = function(columns, field) { var index = -1; $.each(columns, function(i, column) { if (column.field === field) { index = i; return false; } return true; }); return index; }; // http://jsfiddle.net/wenyi/47nz7ez9/3/ var setFieldIndex = function(columns) { var i, j, k, totalCol = 0, flag = []; for (i = 0; i < columns[0].length; i++) { totalCol += columns[0][i].colspan || 1; } for (i = 0; i < columns.length; i++) { flag[i] = []; for (j = 0; j < totalCol; j++) { flag[i][j] = false; } } for (i = 0; i < columns.length; i++) { for (j = 0; j < columns[i].length; j++) { var r = columns[i][j], rowspan = r.rowspan || 1, colspan = r.colspan || 1, index = $.inArray(false, flag[i]); if (colspan === 1) { r.fieldIndex = index; // when field is undefined, use index instead if (typeof r.field === "undefined") { r.field = index; } } for (k = 0; k < rowspan; k++) { flag[i + k][index] = true; } for (k = 0; k < colspan; k++) { flag[i][index + k] = true; } } } }; var getScrollBarWidth = function() { if (cachedWidth === null) { var inner = $("

").addClass("fixed-table-scroll-inner"), outer = $("

").addClass("fixed-table-scroll-outer"), w1, w2; outer.append(inner); $("body").append(outer); w1 = inner[0].offsetWidth; outer.css("overflow", "scroll"); w2 = inner[0].offsetWidth; if (w1 === w2) { w2 = outer[0].clientWidth; } outer.remove(); cachedWidth = w1 - w2; } return cachedWidth; }; var calculateObjectValue = function(self, name, args, defaultValue) { var func = name; if (typeof name === "string") { // support obj.func1.func2 var names = name.split("."); if (names.length > 1) { func = window; $.each(names, function(i, f) { func = func[f]; }); } else { func = window[name]; } } if (typeof func === "object") { return func; } if (typeof func === "function") { return func.apply(self, args); } if (!func && typeof name === "string" && sprintf.apply(this, [name].concat(args)) ) { return sprintf.apply(this, [name].concat(args)); } return defaultValue; }; var compareObjects = function(objectA, objectB, compareLength) { // Create arrays of property names var objectAProperties = Object.getOwnPropertyNames(objectA), objectBProperties = Object.getOwnPropertyNames(objectB), propName = ""; if (compareLength) { // If number of properties is different, objects are not equivalent if (objectAProperties.length !== objectBProperties.length) { return false; } } for (var i = 0; i < objectAProperties.length; i++) { propName = objectAProperties[i]; // If the property is not in the object B properties, continue with the next property if ($.inArray(propName, objectBProperties) > -1) { // If values of same property are not equal, objects are not equivalent if (objectA[propName] !== objectB[propName]) { return false; } } } // If we made it this far, objects are considered equivalent return true; }; var escapeHTML = function(text) { if (typeof text === "string") { return text .replace(/&/g, "&") .replace(//g, ">") .replace(/"/g, """) .replace(/'/g, "'") .replace(/`/g, "`"); } return text; }; var getRealHeight = function($el) { var height = 0; $el.children().each(function() { if (height < $(this).outerHeight(true)) { height = $(this).outerHeight(true); } }); return height; }; var getRealDataAttr = function(dataAttr) { for (var attr in dataAttr) { var auxAttr = attr .split(/(?=[A-Z])/) .join("-") .toLowerCase(); if (auxAttr !== attr) { dataAttr[auxAttr] = dataAttr[attr]; delete dataAttr[attr]; } } return dataAttr; }; var getItemField = function(item, field, escape) { var value = item; if (typeof field !== "string" || item.hasOwnProperty(field)) { return escape ? escapeHTML(item[field]) : item[field]; } var props = field.split("."); for (var p in props) { value = value && value[props[p]]; } return escape ? escapeHTML(value) : value; }; var isIEBrowser = function() { return !!( navigator.userAgent.indexOf("MSIE ") > 0 || !!navigator.userAgent.match(/Trident.*rv\:11\./) ); }; // BOOTSTRAP TABLE CLASS DEFINITION // ====================== var BootstrapTable = function(el, options) { this.options = options; this.$el = $(el); this.$el_ = this.$el.clone(); this.timeoutId_ = 0; this.timeoutFooter_ = 0; this.init(); }; BootstrapTable.DEFAULTS = { classes: "table table-hover", locale: undefined, height: undefined, undefinedText: "-", sortName: undefined, sortOrder: "asc", striped: false, columns: [ [] ], data: [], dataField: "rows", method: "get", url: undefined, ajax: undefined, cache: true, contentType: "application/json", dataType: "json", ajaxOptions: {}, queryParams: function(params) { return params; }, queryParamsType: "limit", // undefined responseHandler: function(res) { return res; }, pagination: false, onlyInfoPagination: false, sidePagination: "client", // client or server totalRows: 0, // server side need to set pageNumber: 1, pageSize: 10, pageList: [10, 25, 50, 100], paginationHAlign: "right", //right, left paginationVAlign: "bottom", //bottom, top, both paginationDetailHAlign: "left", //right, left paginationPreText: "‹", paginationNextText: "›", search: false, searchOnEnterKey: false, strictSearch: false, searchAlign: "right", selectItemName: "btSelectItem", showHeader: true, showFooter: false, showColumns: false, showPaginationSwitch: false, showRefresh: false, showToggle: false, buttonsAlign: "right", smartDisplay: true, escape: true, minimumCountColumns: 1, idField: undefined, uniqueId: undefined, cardView: false, detailView: false, detailFormatter: function(index, row) { return ""; }, trimOnSearch: true, clickToSelect: false, singleSelect: false, toolbar: undefined, toolbarAlign: "left", checkboxHeader: true, sortable: true, silentSort: true, maintainSelected: false, searchTimeOut: 500, searchText: "", iconSize: undefined, iconsPrefix: "glyphicon", // glyphicon of fa (font awesome) icons: { paginationSwitchDown: "glyphicon-collapse-down icon-chevron-down", paginationSwitchUp: "glyphicon-collapse-up icon-chevron-up", refresh: "glyphicon-refresh icon-refresh", toggle: "glyphicon-list-alt icon-list-alt", columns: "glyphicon-th icon-th", detailOpen: "glyphicon-plus icon-plus", detailClose: "glyphicon-minus icon-minus", }, rowStyle: function(row, index) { return {}; }, rowAttributes: function(row, index) { return {}; }, onAll: function(name, args) { return false; }, onClickCell: function(field, value, row, $element) { return false; }, onDblClickCell: function(field, value, row, $element) { return false; }, onClickRow: function(item, $element) { return false; }, onDblClickRow: function(item, $element) { return false; }, onSort: function(name, order) { return false; }, onCheck: function(row) { return false; }, onUncheck: function(row) { return false; }, onCheckAll: function(rows) { return false; }, onUncheckAll: function(rows) { return false; }, onCheckSome: function(rows) { return false; }, onUncheckSome: function(rows) { return false; }, onLoadSuccess: function(data) { return false; }, onLoadError: function(status) { return false; }, onColumnSwitch: function(field, checked) { return false; }, onPageChange: function(number, size) { return false; }, onSearch: function(text) { return false; }, onToggle: function(cardView) { return false; }, onPreBody: function(data) { return false; }, onPostBody: function() { return false; }, onPostHeader: function() { return false; }, onExpandRow: function(index, row, $detail) { return false; }, onCollapseRow: function(index, row) { return false; }, onRefreshOptions: function(options) { return false; }, onResetView: function() { return false; }, }; BootstrapTable.LOCALES = []; BootstrapTable.LOCALES["en-US"] = BootstrapTable.LOCALES["en"] = { formatLoadingMessage: function() { return "Loading, please wait..."; }, formatRecordsPerPage: function(pageNumber) { return sprintf("%s records per page", pageNumber); }, formatShowingRows: function(pageFrom, pageTo, totalRows) { return sprintf( "Showing %s to %s of %s rows", pageFrom, pageTo, totalRows ); }, formatDetailPagination: function(totalRows) { return sprintf("Showing %s rows", totalRows); }, formatSearch: function() { return "Search"; }, formatNoMatches: function() { return "No matching records found"; }, formatPaginationSwitch: function() { return "Hide/Show pagination"; }, formatRefresh: function() { return "Refresh"; }, formatToggle: function() { return "Toggle"; }, formatColumns: function() { return "Columns"; }, formatAllRows: function() { return "All"; }, }; $.extend(BootstrapTable.DEFAULTS, BootstrapTable.LOCALES["en-US"]); BootstrapTable.COLUMN_DEFAULTS = { radio: false, checkbox: false, checkboxEnabled: true, field: undefined, title: undefined, titleTooltip: undefined, class: undefined, align: undefined, // left, right, center halign: undefined, // left, right, center falign: undefined, // left, right, center valign: undefined, // top, middle, bottom width: undefined, sortable: false, order: "asc", // asc, desc visible: true, switchable: true, clickToSelect: true, formatter: undefined, footerFormatter: undefined, events: undefined, sorter: undefined, sortName: undefined, cellStyle: undefined, searchable: true, searchFormatter: true, cardVisible: true, }; BootstrapTable.EVENTS = { "all.bs.table": "onAll", "click-cell.bs.table": "onClickCell", "dbl-click-cell.bs.table": "onDblClickCell", "click-row.bs.table": "onClickRow", "dbl-click-row.bs.table": "onDblClickRow", "sort.bs.table": "onSort", "check.bs.table": "onCheck", "uncheck.bs.table": "onUncheck", "check-all.bs.table": "onCheckAll", "uncheck-all.bs.table": "onUncheckAll", "check-some.bs.table": "onCheckSome", "uncheck-some.bs.table": "onUncheckSome", "load-success.bs.table": "onLoadSuccess", "load-error.bs.table": "onLoadError", "column-switch.bs.table": "onColumnSwitch", "page-change.bs.table": "onPageChange", "search.bs.table": "onSearch", "toggle.bs.table": "onToggle", "pre-body.bs.table": "onPreBody", "post-body.bs.table": "onPostBody", "post-header.bs.table": "onPostHeader", "expand-row.bs.table": "onExpandRow", "collapse-row.bs.table": "onCollapseRow", "refresh-options.bs.table": "onRefreshOptions", "reset-view.bs.table": "onResetView", }; BootstrapTable.prototype.init = function() { this.initLocale(); this.initContainer(); this.initTable(); this.initHeader(); this.initData(); this.initFooter(); this.initToolbar(); this.initPagination(); this.initBody(); this.initSearchText(); this.initServer(); }; BootstrapTable.prototype.initLocale = function() { if (this.options.locale) { var parts = this.options.locale.split(/-|_/); parts[0].toLowerCase(); parts[1] && parts[1].toUpperCase(); if ($.fn.bootstrapTable.locales[this.options.locale]) { // locale as requested $.extend( this.options, $.fn.bootstrapTable.locales[this.options.locale] ); } else if ($.fn.bootstrapTable.locales[parts.join("-")]) { // locale with sep set to - (in case original was specified with _) $.extend(this.options, $.fn.bootstrapTable.locales[parts.join("-")]); } else if ($.fn.bootstrapTable.locales[parts[0]]) { // short locale language code (i.e. 'en') $.extend(this.options, $.fn.bootstrapTable.locales[parts[0]]); } } }; BootstrapTable.prototype.initContainer = function() { this.$container = $( [ '
', '
', this.options.paginationVAlign === "top" || this.options.paginationVAlign === "both" ? '
' : "", '
', '
', '
', '
', this.options.formatLoadingMessage(), "
", "
", '', this.options.paginationVAlign === "bottom" || this.options.paginationVAlign === "both" ? '
' : "", "
", "
", ].join("") ); this.$container.insertAfter(this.$el); this.$tableContainer = this.$container.find(".fixed-table-container"); this.$tableHeader = this.$container.find(".fixed-table-header"); this.$tableBody = this.$container.find(".fixed-table-body"); this.$tableLoading = this.$container.find(".fixed-table-loading"); this.$tableFooter = this.$container.find(".fixed-table-footer"); this.$toolbar = this.$container.find(".fixed-table-toolbar"); this.$pagination = this.$container.find(".fixed-table-pagination"); this.$tableBody.append(this.$el); this.$container.after('
'); this.$el.addClass(this.options.classes); if (this.options.striped) { this.$el.addClass("table-striped"); } if ( $.inArray("table-no-bordered", this.options.classes.split(" ")) !== -1 ) { this.$tableContainer.addClass("table-no-bordered"); } }; BootstrapTable.prototype.initTable = function() { var that = this, columns = [], data = []; this.$header = this.$el.find(">thead"); if (!this.$header.length) { this.$header = $("").appendTo(this.$el); } this.$header.find("tr").each(function() { var column = []; $(this) .find("th") .each(function() { column.push( $.extend({}, { title: $(this).html(), class: $(this).attr("class"), titleTooltip: $(this).attr("title"), rowspan: $(this).attr("rowspan") ? +$(this).attr("rowspan") : undefined, colspan: $(this).attr("colspan") ? +$(this).attr("colspan") : undefined, }, $(this).data() ) ); }); columns.push(column); }); if (!$.isArray(this.options.columns[0])) { this.options.columns = [this.options.columns]; } this.options.columns = $.extend(true, [], columns, this.options.columns); this.columns = []; setFieldIndex(this.options.columns); $.each(this.options.columns, function(i, columns) { $.each(columns, function(j, column) { column = $.extend({}, BootstrapTable.COLUMN_DEFAULTS, column); if (typeof column.fieldIndex !== "undefined") { that.columns[column.fieldIndex] = column; } that.options.columns[i][j] = column; }); }); // if options.data is setting, do not process tbody data if (this.options.data.length) { return; } this.$el.find(">tbody>tr").each(function() { var row = {}; // save tr's id, class and data-* attributes row._id = $(this).attr("id"); row._class = $(this).attr("class"); row._data = getRealDataAttr($(this).data()); $(this) .find("td") .each(function(i) { var field = that.columns[i].field; row[field] = $(this).html(); // save td's id, class and data-* attributes row["_" + field + "_id"] = $(this).attr("id"); row["_" + field + "_class"] = $(this).attr("class"); row["_" + field + "_rowspan"] = $(this).attr("rowspan"); row["_" + field + "_title"] = $(this).attr("title"); row["_" + field + "_data"] = getRealDataAttr($(this).data()); }); data.push(row); }); this.options.data = data; }; BootstrapTable.prototype.initHeader = function() { var that = this, visibleColumns = {}, html = []; this.header = { fields: [], styles: [], classes: [], formatters: [], events: [], sorters: [], sortNames: [], cellStyles: [], searchables: [], }; $.each(this.options.columns, function(i, columns) { html.push(""); if (i == 0 && !that.options.cardView && that.options.detailView) { html.push( sprintf( '
', that.options.columns.length ) ); } $.each(columns, function(j, column) { var text = "", halign = "", // header align style align = "", // body align style style = "", class_ = sprintf(' class="%s"', column["class"]), order = that.options.sortOrder || column.order, unitWidth = "px", width = column.width; if (column.width !== undefined && !that.options.cardView) { if (typeof column.width === "string") { if (column.width.indexOf("%") !== -1) { unitWidth = "%"; } } } if (column.width && typeof column.width === "string") { width = column.width.replace("%", "").replace("px", ""); } halign = sprintf( "text-align: %s; ", column.halign ? column.halign : column.align ); align = sprintf("text-align: %s; ", column.align); style = sprintf("vertical-align: %s; ", column.valign); style += sprintf( "width: %s; ", (column.checkbox || column.radio) && !width ? "36px" : width ? width + unitWidth : undefined ); if (typeof column.fieldIndex !== "undefined") { that.header.fields[column.fieldIndex] = column.field; that.header.styles[column.fieldIndex] = align + style; that.header.classes[column.fieldIndex] = class_; that.header.formatters[column.fieldIndex] = column.formatter; that.header.events[column.fieldIndex] = column.events; that.header.sorters[column.fieldIndex] = column.sorter; that.header.sortNames[column.fieldIndex] = column.sortName; that.header.cellStyles[column.fieldIndex] = column.cellStyle; that.header.searchables[column.fieldIndex] = column.searchable; if (!column.visible) { return; } if (that.options.cardView && !column.cardVisible) { return; } visibleColumns[column.field] = column; } html.push( "" ); html.push( sprintf( '
', that.options.sortable && column.sortable ? "sortable both" : "" ) ); text = column.title; if (column.checkbox) { if (!that.options.singleSelect && that.options.checkboxHeader) { text = ''; } that.header.stateField = column.field; } if (column.radio) { text = ""; that.header.stateField = column.field; that.options.singleSelect = true; } html.push(text); html.push("
"); html.push('
'); html.push("
"); html.push(""); }); html.push(""); }); this.$header.html(html.join("")); this.$header.find("th[data-field]").each(function(i) { $(this).data(visibleColumns[$(this).data("field")]); }); this.$container .off("click", ".th-inner") .on("click", ".th-inner", function(event) { var target = $(this); if (target.closest(".bootstrap-table")[0] !== that.$container[0]) return false; if (that.options.sortable && target.parent().data().sortable) { that.onSort(event); } }); this.$header .children() .children() .off("keypress") .on("keypress", function(event) { if (that.options.sortable && $(this).data().sortable) { var code = event.keyCode || event.which; if (code == 13) { //Enter keycode that.onSort(event); } } }); if (!this.options.showHeader || this.options.cardView) { this.$header.hide(); this.$tableHeader.hide(); this.$tableLoading.css("top", 0); } else { this.$header.show(); this.$tableHeader.show(); this.$tableLoading.css("top", this.$header.outerHeight() + 1); // Assign the correct sortable arrow this.getCaret(); } this.$selectAll = this.$header.find('[name="btSelectAll"]'); this.$selectAll.off("click").on("click", function() { var checked = $(this).prop("checked"); that[checked ? "checkAll" : "uncheckAll"](); that.updateSelected(); }); }; BootstrapTable.prototype.initFooter = function() { if (!this.options.showFooter || this.options.cardView) { this.$tableFooter.hide(); } else { this.$tableFooter.show(); } }; /** * @param data * @param type: append / prepend */ BootstrapTable.prototype.initData = function(data, type) { if (type === "append") { this.data = this.data.concat(data); } else if (type === "prepend") { this.data = [].concat(data).concat(this.data); } else { this.data = data || this.options.data; } // Fix #839 Records deleted when adding new row on filtered table if (type === "append") { this.options.data = this.options.data.concat(data); } else if (type === "prepend") { this.options.data = [].concat(data).concat(this.options.data); } else { this.options.data = this.data; } if (this.options.sidePagination === "server") { return; } this.initSort(); }; BootstrapTable.prototype.initSort = function() { var that = this, name = this.options.sortName, order = this.options.sortOrder === "desc" ? -1 : 1, index = $.inArray(this.options.sortName, this.header.fields); if (index !== -1) { this.data.sort(function(a, b) { if (that.header.sortNames[index]) { name = that.header.sortNames[index]; } var aa = getItemField(a, name, that.options.escape), bb = getItemField(b, name, that.options.escape), value = calculateObjectValue( that.header, that.header.sorters[index], [aa, bb] ); if (value !== undefined) { return order * value; } // Fix #161: undefined or null string sort bug. if (aa === undefined || aa === null) { aa = ""; } if (bb === undefined || bb === null) { bb = ""; } // IF both values are numeric, do a numeric comparison if ($.isNumeric(aa) && $.isNumeric(bb)) { // Convert numerical values form string to float. aa = parseFloat(aa); bb = parseFloat(bb); if (aa < bb) { return order * -1; } return order; } if (aa === bb) { return 0; } // If value is not a string, convert to string if (typeof aa !== "string") { aa = aa.toString(); } if (aa.localeCompare(bb) === -1) { return order * -1; } return order; }); } }; BootstrapTable.prototype.onSort = function(event) { var $this = event.type === "keypress" ? $(event.currentTarget) : $(event.currentTarget).parent(), $this_ = this.$header.find("th").eq($this.index()); this.$header.add(this.$header_).find("span.order").remove(); if (this.options.sortName === $this.data("field")) { this.options.sortOrder = this.options.sortOrder === "asc" ? "desc" : "asc"; } else { this.options.sortName = $this.data("field"); this.options.sortOrder = $this.data("order") === "asc" ? "desc" : "asc"; } this.trigger("sort", this.options.sortName, this.options.sortOrder); $this.add($this_).data("order", this.options.sortOrder); // Assign the correct sortable arrow this.getCaret(); if (this.options.sidePagination === "server") { this.initServer(this.options.silentSort); return; } this.initSort(); this.initBody(); }; BootstrapTable.prototype.initToolbar = function() { var that = this, html = [], timeoutId = 0, $keepOpen, $search, switchableCount = 0; if (this.$toolbar.find(".bars").children().length) { $("body").append($(this.options.toolbar)); } this.$toolbar.html(""); if ( typeof this.options.toolbar === "string" || typeof this.options.toolbar === "object" ) { $(sprintf('
', this.options.toolbarAlign)) .appendTo(this.$toolbar) .append($(this.options.toolbar)); } // showColumns, showToggle, showRefresh html = [ sprintf( '
', this.options.buttonsAlign, this.options.buttonsAlign ), ]; if (typeof this.options.icons === "string") { this.options.icons = calculateObjectValue(null, this.options.icons); } if (this.options.showPaginationSwitch) { html.push( sprintf( '" ); } if (this.options.showRefresh) { html.push( sprintf( '" ); } if (this.options.showToggle) { html.push( sprintf( '" ); } if (this.options.showColumns) { html.push( sprintf( '
', this.options.formatColumns() ), '", '", "
"); } html.push("
"); // Fix #188: this.showToolbar is for extensions if (this.showToolbar || html.length > 2) { this.$toolbar.append(html.join("")); } if (this.options.showPaginationSwitch) { this.$toolbar .find('button[name="paginationSwitch"]') .off("click") .on("click", $.proxy(this.togglePagination, this)); } if (this.options.showRefresh) { this.$toolbar .find('button[name="refresh"]') .off("click") .on("click", $.proxy(this.refresh, this)); } if (this.options.showToggle) { this.$toolbar .find('button[name="toggle"]') .off("click") .on("click", function() { that.toggleView(); }); } if (this.options.showColumns) { $keepOpen = this.$toolbar.find(".keep-open"); if (switchableCount <= this.options.minimumCountColumns) { $keepOpen.find("input").prop("disabled", true); } $keepOpen .find("li") .off("click") .on("click", function(event) { event.stopImmediatePropagation(); }); $keepOpen .find("input") .off("click") .on("click", function() { var $this = $(this); that.toggleColumn( getFieldIndex(that.columns, $(this).data("field")), $this.prop("checked"), false ); that.trigger( "column-switch", $(this).data("field"), $this.prop("checked") ); }); } if (this.options.search) { html = []; html.push( '" ); this.$toolbar.append(html.join("")); $search = this.$toolbar.find(".search input"); $search.off("keyup drop").on("keyup drop", function(event) { if (that.options.searchOnEnterKey) { if (event.keyCode !== 13) { return; } } clearTimeout(timeoutId); // doesn't matter if it's 0 timeoutId = setTimeout(function() { that.onSearch(event); }, that.options.searchTimeOut); }); if (isIEBrowser()) { $search.off("mouseup").on("mouseup", function(event) { clearTimeout(timeoutId); // doesn't matter if it's 0 timeoutId = setTimeout(function() { that.onSearch(event); }, that.options.searchTimeOut); }); } } }; BootstrapTable.prototype.onSearch = function(event) { var text = $.trim($(event.currentTarget).val()); // trim search input if (this.options.trimOnSearch && $(event.currentTarget).val() !== text) { $(event.currentTarget).val(text); } if (text === this.searchText) { return; } this.searchText = text; this.options.searchText = text; this.options.pageNumber = 1; this.initSearch(); this.updatePagination(); this.trigger("search", text); }; BootstrapTable.prototype.initSearch = function() { var that = this; if (this.options.sidePagination !== "server") { var s = this.searchText && this.searchText.toLowerCase(); var f = $.isEmptyObject(this.filterColumns) ? null : this.filterColumns; // Check filter this.data = f ? $.grep(this.options.data, function(item, i) { for (var key in f) { if ($.isArray(f[key])) { if ($.inArray(item[key], f[key]) === -1) { return false; } } else if (item[key] !== f[key]) { return false; } } return true; }) : this.options.data; this.data = s ? $.grep(this.data, function(item, i) { for (var key in item) { key = $.isNumeric(key) ? parseInt(key, 10) : key; var value = item[key], column = that.columns[getFieldIndex(that.columns, key)], j = $.inArray(key, that.header.fields); // Fix #142: search use formatted data if (column && column.searchFormatter) { value = calculateObjectValue( column, that.header.formatters[j], [value, item, i], value ); } var index = $.inArray(key, that.header.fields); if ( index !== -1 && that.header.searchables[index] && (typeof value === "string" || typeof value === "number") ) { if (that.options.strictSearch) { if ((value + "").toLowerCase() === s) { return true; } } else { if ((value + "").toLowerCase().indexOf(s) !== -1) { return true; } } } } return false; }) : this.data; } }; BootstrapTable.prototype.initPagination = function() { if (!this.options.pagination) { this.$pagination.hide(); return; } else { this.$pagination.show(); } var that = this, html = [], $allSelected = false, i, from, to, $pageList, $first, $pre, $next, $last, $number, data = this.getData(); if (this.options.sidePagination !== "server") { this.options.totalRows = data.length; } this.totalPages = 0; if (this.options.totalRows) { if (this.options.pageSize === this.options.formatAllRows()) { this.options.pageSize = this.options.totalRows; $allSelected = true; } else if (this.options.pageSize === this.options.totalRows) { // Fix #667 Table with pagination, // multiple pages and a search that matches to one page throws exception var pageLst = typeof this.options.pageList === "string" ? this.options.pageList .replace("[", "") .replace("]", "") .replace(/ /g, "") .toLowerCase() .split(",") : this.options.pageList; if ( $.inArray(this.options.formatAllRows().toLowerCase(), pageLst) > -1 ) { $allSelected = true; } } this.totalPages = ~~((this.options.totalRows - 1) / this.options.pageSize) + 1; this.options.totalPages = this.totalPages; } if (this.totalPages > 0 && this.options.pageNumber > this.totalPages) { this.options.pageNumber = this.totalPages; } this.pageFrom = (this.options.pageNumber - 1) * this.options.pageSize + 1; this.pageTo = this.options.pageNumber * this.options.pageSize; if (this.pageTo > this.options.totalRows) { this.pageTo = this.options.totalRows; } html.push( '
', '', this.options.onlyInfoPagination ? this.options.formatDetailPagination(this.options.totalRows) : this.options.formatShowingRows( this.pageFrom, this.pageTo, this.options.totalRows ), "" ); if (!this.options.onlyInfoPagination) { html.push(''); var pageNumber = [ sprintf( '', this.options.paginationVAlign === "top" || this.options.paginationVAlign === "both" ? "dropdown" : "dropup" ), '", '"); html.push(this.options.formatRecordsPerPage(pageNumber.join(""))); html.push(""); html.push( "
", '" ); } this.$pagination.html(html.join("")); if (!this.options.onlyInfoPagination) { $pageList = this.$pagination.find(".page-list a"); $first = this.$pagination.find(".page-first"); $pre = this.$pagination.find(".page-pre"); $next = this.$pagination.find(".page-next"); $last = this.$pagination.find(".page-last"); $number = this.$pagination.find(".page-number"); if (this.options.smartDisplay) { if (this.totalPages <= 1) { this.$pagination.find("div.pagination").hide(); } if (pageList.length < 2 || this.options.totalRows <= pageList[0]) { this.$pagination.find("span.page-list").hide(); } // when data is empty, hide the pagination this.$pagination[this.getData().length ? "show" : "hide"](); } if ($allSelected) { this.options.pageSize = this.options.formatAllRows(); } $pageList.off("click").on("click", $.proxy(this.onPageListChange, this)); $first.off("click").on("click", $.proxy(this.onPageFirst, this)); $pre.off("click").on("click", $.proxy(this.onPagePre, this)); $next.off("click").on("click", $.proxy(this.onPageNext, this)); $last.off("click").on("click", $.proxy(this.onPageLast, this)); $number.off("click").on("click", $.proxy(this.onPageNumber, this)); } }; BootstrapTable.prototype.updatePagination = function(event) { // Fix #171: IE disabled button can be clicked bug. if (event && $(event.currentTarget).hasClass("disabled")) { return; } if (!this.options.maintainSelected) { this.resetRows(); } this.initPagination(); if (this.options.sidePagination === "server") { this.initServer(); } else { this.initBody(); } this.trigger("page-change", this.options.pageNumber, this.options.pageSize); }; BootstrapTable.prototype.onPageListChange = function(event) { var $this = $(event.currentTarget); $this.parent().addClass("active").siblings().removeClass("active"); this.options.pageSize = $this.text().toUpperCase() === this.options.formatAllRows().toUpperCase() ? this.options.formatAllRows() : +$this.text(); this.$toolbar.find(".page-size").text(this.options.pageSize); this.updatePagination(event); }; BootstrapTable.prototype.onPageFirst = function(event) { this.options.pageNumber = 1; this.updatePagination(event); }; BootstrapTable.prototype.onPagePre = function(event) { if (this.options.pageNumber - 1 == 0) { this.options.pageNumber = this.options.totalPages; } else { this.options.pageNumber--; } this.updatePagination(event); }; BootstrapTable.prototype.onPageNext = function(event) { if (this.options.pageNumber + 1 > this.options.totalPages) { this.options.pageNumber = 1; } else { this.options.pageNumber++; } this.updatePagination(event); }; BootstrapTable.prototype.onPageLast = function(event) { this.options.pageNumber = this.totalPages; this.updatePagination(event); }; BootstrapTable.prototype.onPageNumber = function(event) { if (this.options.pageNumber === +$(event.currentTarget).text()) { return; } this.options.pageNumber = +$(event.currentTarget).text(); this.updatePagination(event); }; BootstrapTable.prototype.initBody = function(fixedScroll) { var that = this, html = [], data = this.getData(); this.trigger("pre-body", data); this.$body = this.$el.find(">tbody"); if (!this.$body.length) { this.$body = $("").appendTo(this.$el); } //Fix #389 Bootstrap-table-flatJSON is not working if (!this.options.pagination || this.options.sidePagination === "server") { this.pageFrom = 1; this.pageTo = data.length; } for (var i = this.pageFrom - 1; i < this.pageTo; i++) { var key, item = data[i], style = {}, csses = [], data_ = "", attributes = {}, htmlAttributes = []; style = calculateObjectValue( this.options, this.options.rowStyle, [item, i], style ); if (style && style.css) { for (key in style.css) { csses.push(key + ": " + style.css[key]); } } attributes = calculateObjectValue( this.options, this.options.rowAttributes, [item, i], attributes ); if (attributes) { for (key in attributes) { htmlAttributes.push( sprintf('%s="%s"', key, escapeHTML(attributes[key])) ); } } if (item._data && !$.isEmptyObject(item._data)) { $.each(item._data, function(k, v) { // ignore data-index if (k === "index") { return; } data_ += sprintf(' data-%s="%s"', k, v); }); } html.push( "" ); if (this.options.cardView) { html.push(sprintf('', this.header.fields.length)); } if (!this.options.cardView && this.options.detailView) { html.push( "", '', sprintf( '', this.options.iconsPrefix, this.options.icons.detailOpen ), "", "" ); } $.each(this.header.fields, function(j, field) { var text = "", value = getItemField(item, field, that.options.escape), type = "", cellStyle = {}, id_ = "", class_ = that.header.classes[j], data_ = "", rowspan_ = "", title_ = "", column = that.columns[getFieldIndex(that.columns, field)]; if (!column.visible) { return; } style = sprintf( 'style="%s"', csses.concat(that.header.styles[j]).join("; ") ); value = calculateObjectValue( column, that.header.formatters[j], [value, item, i], value ); // handle td's id and class if (item["_" + field + "_id"]) { id_ = sprintf(' id="%s"', item["_" + field + "_id"]); } if (item["_" + field + "_class"]) { class_ = sprintf(' class="%s"', item["_" + field + "_class"]); } if (item["_" + field + "_rowspan"]) { rowspan_ = sprintf(' rowspan="%s"', item["_" + field + "_rowspan"]); } if (item["_" + field + "_title"]) { title_ = sprintf(' title="%s"', item["_" + field + "_title"]); } cellStyle = calculateObjectValue( that.header, that.header.cellStyles[j], [value, item, i], cellStyle ); if (cellStyle.classes) { class_ = sprintf(' class="%s"', cellStyle.classes); } if (cellStyle.css) { var csses_ = []; for (var key in cellStyle.css) { csses_.push(key + ": " + cellStyle.css[key]); } style = sprintf( 'style="%s"', csses_.concat(that.header.styles[j]).join("; ") ); } if ( item["_" + field + "_data"] && !$.isEmptyObject(item["_" + field + "_data"]) ) { $.each(item["_" + field + "_data"], function(k, v) { // ignore data-index if (k === "index") { return; } data_ += sprintf(' data-%s="%s"', k, v); }); } if (column.checkbox || column.radio) { type = column.checkbox ? "checkbox" : type; type = column.radio ? "radio" : type; text = [ sprintf( that.options.cardView ? '
' : '', column["class"] || "" ), "", that.header.formatters[j] && typeof value === "string" ? value : "", that.options.cardView ? "
" : "", ].join(""); item[that.header.stateField] = value === true || (value && value.checked); } else { value = typeof value === "undefined" || value === null ? that.options.undefinedText : value; text = that.options.cardView ? [ '
', that.options.showHeader ? sprintf( '%s', style, getPropertyFromOther( that.columns, "field", "title", field ) ) : "", sprintf('%s', value), "
", ].join("") : [ sprintf( "", id_, class_, style, data_, rowspan_, title_ ), value, "", ].join(""); // Hide empty data on Card view when smartDisplay is set to true. if ( that.options.cardView && that.options.smartDisplay && value === "" ) { // Should set a placeholder for event binding correct fieldIndex text = '
'; } } html.push(text); }); if (this.options.cardView) { html.push(""); } html.push(""); } // show no records if (!html.length) { html.push( '', sprintf( '%s', this.$header.find("th").length, this.options.formatNoMatches() ), "" ); } this.$body.html(html.join("")); if (!fixedScroll) { this.scrollTo(0); } // click to select by column this.$body .find("> tr[data-index] > td") .off("click dblclick") .on("click dblclick", function(e) { var $td = $(this), $tr = $td.parent(), item = that.data[$tr.data("index")], index = $td[0].cellIndex, field = that.header.fields[ that.options.detailView && !that.options.cardView ? index - 1 : index ], column = that.columns[getFieldIndex(that.columns, field)], value = getItemField(item, field, that.options.escape); if ($td.find(".detail-icon").length) { return; } that.trigger( e.type === "click" ? "click-cell" : "dbl-click-cell", field, value, item, $td ); that.trigger( e.type === "click" ? "click-row" : "dbl-click-row", item, $tr ); // if click to select - then trigger the checkbox/radio click if ( e.type === "click" && that.options.clickToSelect && column.clickToSelect ) { var $selectItem = $tr.find( sprintf('[name="%s"]', that.options.selectItemName) ); if ($selectItem.length) { $selectItem[0].click(); // #144: .trigger('click') bug } } }); this.$body .find("> tr[data-index] > td > .detail-icon") .off("click") .on("click", function() { var $this = $(this), $tr = $this.parent().parent(), index = $tr.data("index"), row = data[index]; // Fix #980 Detail view, when searching, returns wrong row // remove and update if ($tr.next().is("tr.detail-view")) { $this .find("i") .attr( "class", sprintf( "%s %s", that.options.iconsPrefix, that.options.icons.detailOpen ) ); $tr.next().remove(); that.trigger("collapse-row", index, row); } else { $this .find("i") .attr( "class", sprintf( "%s %s", that.options.iconsPrefix, that.options.icons.detailClose ) ); $tr.after( sprintf( '', $tr.find("td").length ) ); var $element = $tr.next().find("td"); var content = calculateObjectValue( that.options, that.options.detailFormatter, [index, row, $element], "" ); if ($element.length === 1) { $element.append(content); } that.trigger("expand-row", index, row, $element); } that.resetView(); }); this.$selectItem = this.$body.find( sprintf('[name="%s"]', this.options.selectItemName) ); this.$selectItem.off("click").on("click", function(event) { event.stopImmediatePropagation(); var $this = $(this), checked = $this.prop("checked"), row = that.data[$this.data("index")]; if (that.options.maintainSelected && $(this).is(":radio")) { $.each(that.options.data, function(i, row) { row[that.header.stateField] = false; }); } row[that.header.stateField] = checked; if (that.options.singleSelect) { that.$selectItem.not(this).each(function() { that.data[$(this).data("index")][that.header.stateField] = false; }); that.$selectItem.filter(":checked").not(this).prop("checked", false); } that.updateSelected(); that.trigger(checked ? "check" : "uncheck", row, $this); }); $.each(this.header.events, function(i, events) { if (!events) { return; } // fix bug, if events is defined with namespace if (typeof events === "string") { events = calculateObjectValue(null, events); } var field = that.header.fields[i], fieldIndex = $.inArray(field, that.getVisibleFields()); if (that.options.detailView && !that.options.cardView) { fieldIndex += 1; } for (var key in events) { that.$body.find(">tr:not(.no-records-found)").each(function() { var $tr = $(this), $td = $tr .find(that.options.cardView ? ".card-view" : "td") .eq(fieldIndex), index = key.indexOf(" "), name = key.substring(0, index), el = key.substring(index + 1), func = events[key]; $td .find(el) .off(name) .on(name, function(e) { var index = $tr.data("index"), row = that.data[index], value = row[field]; func.apply(this, [e, value, row, index]); }); }); } }); this.updateSelected(); this.resetView(); this.trigger("post-body"); }; BootstrapTable.prototype.initServer = function(silent, query) { var that = this, data = {}, params = { searchText: this.searchText, sortName: this.options.sortName, sortOrder: this.options.sortOrder, }, request; if (this.options.pagination) { params.pageSize = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize; params.pageNumber = this.options.pageNumber; } if (!this.options.url && !this.options.ajax) { return; } if (this.options.queryParamsType === "limit") { params = { search: params.searchText, sort: params.sortName, order: params.sortOrder, }; if (this.options.pagination) { params.limit = this.options.pageSize === this.options.formatAllRows() ? this.options.totalRows : this.options.pageSize; params.offset = this.options.pageSize === this.options.formatAllRows() ? 0 : this.options.pageSize * (this.options.pageNumber - 1); } } if (!$.isEmptyObject(this.filterColumnsPartial)) { params["filter"] = JSON.stringify(this.filterColumnsPartial, null); } data = calculateObjectValue( this.options, this.options.queryParams, [params], data ); $.extend(data, query || {}); // false to stop request if (data === false) { return; } if (!silent) { this.$tableLoading.show(); } request = $.extend({}, calculateObjectValue(null, this.options.ajaxOptions), { type: this.options.method, url: this.options.url, data: this.options.contentType === "application/json" && this.options.method === "post" ? JSON.stringify(data) : data, cache: this.options.cache, contentType: this.options.contentType, dataType: this.options.dataType, success: function(res) { res = calculateObjectValue( that.options, that.options.responseHandler, [res], res ); that.load(res); that.trigger("load-success", res); if (!silent) that.$tableLoading.hide(); }, error: function(res) { that.trigger("load-error", res.status, res); if (!silent) that.$tableLoading.hide(); }, } ); if (this.options.ajax) { calculateObjectValue(this, this.options.ajax, [request], null); } else { $.ajax(request); } }; BootstrapTable.prototype.initSearchText = function() { if (this.options.search) { if (this.options.searchText !== "") { var $search = this.$toolbar.find(".search input"); $search.val(this.options.searchText); this.onSearch({ currentTarget: $search }); } } }; BootstrapTable.prototype.getCaret = function() { var that = this; $.each(this.$header.find("th"), function(i, th) { $(th) .find(".sortable") .removeClass("desc asc") .addClass( $(th).data("field") === that.options.sortName ? that.options.sortOrder : "both" ); }); }; BootstrapTable.prototype.updateSelected = function() { var checkAll = this.$selectItem.filter(":enabled").length && this.$selectItem.filter(":enabled").length === this.$selectItem.filter(":enabled").filter(":checked").length; this.$selectAll.add(this.$selectAll_).prop("checked", checkAll); this.$selectItem.each(function() { $(this) .closest("tr")[$(this).prop("checked") ? "addClass" : "removeClass"]("selected"); }); }; BootstrapTable.prototype.updateRows = function() { var that = this; this.$selectItem.each(function() { that.data[$(this).data("index")][that.header.stateField] = $(this).prop( "checked" ); }); }; BootstrapTable.prototype.resetRows = function() { var that = this; $.each(this.data, function(i, row) { that.$selectAll.prop("checked", false); that.$selectItem.prop("checked", false); if (that.header.stateField) { row[that.header.stateField] = false; } }); }; BootstrapTable.prototype.trigger = function(name) { var args = Array.prototype.slice.call(arguments, 1); name += ".bs.table"; this.options[BootstrapTable.EVENTS[name]].apply(this.options, args); this.$el.trigger($.Event(name), args); this.options.onAll(name, args); this.$el.trigger($.Event("all.bs.table"), [name, args]); }; BootstrapTable.prototype.resetHeader = function() { // fix #61: the hidden table reset header bug. // fix bug: get $el.css('width') error sometime (height = 500) clearTimeout(this.timeoutId_); this.timeoutId_ = setTimeout( $.proxy(this.fitHeader, this), this.$el.is(":hidden") ? 100 : 0 ); }; BootstrapTable.prototype.fitHeader = function() { var that = this, fixedBody, scrollWidth, focused, focusedTemp; if (that.$el.is(":hidden")) { that.timeoutId_ = setTimeout($.proxy(that.fitHeader, that), 100); return; } fixedBody = this.$tableBody.get(0); scrollWidth = fixedBody.scrollWidth > fixedBody.clientWidth && fixedBody.scrollHeight > fixedBody.clientHeight + this.$header.outerHeight() ? getScrollBarWidth() : 0; this.$el.css("margin-top", -this.$header.outerHeight()); focused = $(":focus"); if (focused.length > 0) { var $th = focused.parents("th"); if ($th.length > 0) { var dataField = $th.attr("data-field"); if (dataField !== undefined) { var $headerTh = this.$header.find("[data-field='" + dataField + "']"); if ($headerTh.length > 0) { $headerTh.find(":input").addClass("focus-temp"); } } } } this.$header_ = this.$header.clone(true, true); this.$selectAll_ = this.$header_.find('[name="btSelectAll"]'); this.$tableHeader .css({ "margin-right": scrollWidth, }) .find("table") .css("width", this.$el.outerWidth()) .html("") .attr("class", this.$el.attr("class")) .append(this.$header_); focusedTemp = $(".focus-temp:visible:eq(0)"); if (focusedTemp.length > 0) { focusedTemp.focus(); this.$header.find(".focus-temp").removeClass("focus-temp"); } // fix bug: $.data() is not working as expected after $.append() this.$header.find("th[data-field]").each(function(i) { that.$header_ .find(sprintf('th[data-field="%s"]', $(this).data("field"))) .data($(this).data()); }); var visibleFields = this.getVisibleFields(); this.$body .find(">tr:first-child:not(.no-records-found) > *") .each(function(i) { var $this = $(this), index = i; if (that.options.detailView && !that.options.cardView) { if (i === 0) { that.$header_ .find("th.detail") .find(".fht-cell") .width($this.innerWidth()); } index = i - 1; } that.$header_ .find(sprintf('th[data-field="%s"]', visibleFields[index])) .find(".fht-cell") .width($this.innerWidth()); }); // horizontal scroll event // TODO: it's probably better improving the layout than binding to scroll event this.$tableBody.off("scroll").on("scroll", function() { that.$tableHeader.scrollLeft($(this).scrollLeft()); if (that.options.showFooter && !that.options.cardView) { that.$tableFooter.scrollLeft($(this).scrollLeft()); } }); that.trigger("post-header"); }; BootstrapTable.prototype.resetFooter = function() { var that = this, data = that.getData(), html = []; if (!this.options.showFooter || this.options.cardView) { //do nothing return; } if (!this.options.cardView && this.options.detailView) { html.push( '
 
' ); } $.each(this.columns, function(i, column) { var falign = "", // footer align style style = "", class_ = sprintf(' class="%s"', column["class"]); if (!column.visible) { return; } if (that.options.cardView && !column.cardVisible) { return; } falign = sprintf( "text-align: %s; ", column.falign ? column.falign : column.align ); style = sprintf("vertical-align: %s; ", column.valign); html.push(""); html.push('
'); html.push( calculateObjectValue( column, column.footerFormatter, [data], " " ) || " " ); html.push("
"); html.push('
'); html.push(""); html.push(""); }); this.$tableFooter.find("tr").html(html.join("")); clearTimeout(this.timeoutFooter_); this.timeoutFooter_ = setTimeout( $.proxy(this.fitFooter, this), this.$el.is(":hidden") ? 100 : 0 ); }; BootstrapTable.prototype.fitFooter = function() { var that = this, $footerTd, elWidth, scrollWidth; clearTimeout(this.timeoutFooter_); if (this.$el.is(":hidden")) { this.timeoutFooter_ = setTimeout($.proxy(this.fitFooter, this), 100); return; } elWidth = this.$el.css("width"); scrollWidth = elWidth > this.$tableBody.width() ? getScrollBarWidth() : 0; this.$tableFooter .css({ "margin-right": scrollWidth, }) .find("table") .css("width", elWidth) .attr("class", this.$el.attr("class")); $footerTd = this.$tableFooter.find("td"); this.$body .find(">tr:first-child:not(.no-records-found) > *") .each(function(i) { var $this = $(this); $footerTd.eq(i).find(".fht-cell").width($this.innerWidth()); }); }; BootstrapTable.prototype.toggleColumn = function( index, checked, needUpdate ) { if (index === -1) { return; } this.columns[index].visible = checked; this.initHeader(); this.initSearch(); this.initPagination(); this.initBody(); if (this.options.showColumns) { var $items = this.$toolbar .find(".keep-open input") .prop("disabled", false); if (needUpdate) { $items.filter(sprintf('[value="%s"]', index)).prop("checked", checked); } if ( $items.filter(":checked").length <= this.options.minimumCountColumns ) { $items.filter(":checked").prop("disabled", true); } } }; BootstrapTable.prototype.toggleRow = function(index, uniqueId, visible) { if (index === -1) { return; } this.$body .find( typeof index !== "undefined" ? sprintf('tr[data-index="%s"]', index) : sprintf('tr[data-uniqueid="%s"]', uniqueId) )[visible ? "show" : "hide"](); }; BootstrapTable.prototype.getVisibleFields = function() { var that = this, visibleFields = []; $.each(this.header.fields, function(j, field) { var column = that.columns[getFieldIndex(that.columns, field)]; if (!column.visible) { return; } visibleFields.push(field); }); return visibleFields; }; // PUBLIC FUNCTION DEFINITION // ======================= BootstrapTable.prototype.resetView = function(params) { var padding = 0; if (params && params.height) { this.options.height = params.height; } this.$selectAll.prop( "checked", this.$selectItem.length > 0 && this.$selectItem.length === this.$selectItem.filter(":checked").length ); if (this.options.height) { var toolbarHeight = getRealHeight(this.$toolbar), paginationHeight = getRealHeight(this.$pagination), height = this.options.height - toolbarHeight - paginationHeight; this.$tableContainer.css("height", height + "px"); } if (this.options.cardView) { // remove the element css this.$el.css("margin-top", "0"); this.$tableContainer.css("padding-bottom", "0"); return; } if (this.options.showHeader && this.options.height) { this.$tableHeader.show(); this.resetHeader(); padding += this.$header.outerHeight(); } else { this.$tableHeader.hide(); this.trigger("post-header"); } if (this.options.showFooter) { this.resetFooter(); if (this.options.height) { padding += this.$tableFooter.outerHeight() + 1; } } // Assign the correct sortable arrow this.getCaret(); this.$tableContainer.css("padding-bottom", padding + "px"); this.trigger("reset-view"); }; BootstrapTable.prototype.getData = function(useCurrentPage) { return this.searchText || !$.isEmptyObject(this.filterColumns) || !$.isEmptyObject(this.filterColumnsPartial) ? useCurrentPage ? this.data.slice(this.pageFrom - 1, this.pageTo) : this.data : useCurrentPage ? this.options.data.slice(this.pageFrom - 1, this.pageTo) : this.options.data; }; BootstrapTable.prototype.load = function(data) { var fixedScroll = false; // #431: support pagination if (this.options.sidePagination === "server") { this.options.totalRows = data.total; fixedScroll = data.fixedScroll; data = data[this.options.dataField]; } else if (!$.isArray(data)) { // support fixedScroll fixedScroll = data.fixedScroll; data = data.data; } this.initData(data); this.initSearch(); this.initPagination(); this.initBody(fixedScroll); }; BootstrapTable.prototype.append = function(data) { this.initData(data, "append"); this.initSearch(); this.initPagination(); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.prepend = function(data) { this.initData(data, "prepend"); this.initSearch(); this.initPagination(); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.remove = function(params) { var len = this.options.data.length, i, row; if (!params.hasOwnProperty("field") || !params.hasOwnProperty("values")) { return; } for (i = len - 1; i >= 0; i--) { row = this.options.data[i]; if (!row.hasOwnProperty(params.field)) { continue; } if ($.inArray(row[params.field], params.values) !== -1) { this.options.data.splice(i, 1); } } if (len === this.options.data.length) { return; } this.initSearch(); this.initPagination(); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.removeAll = function() { if (this.options.data.length > 0) { this.options.data.splice(0, this.options.data.length); this.initSearch(); this.initPagination(); this.initBody(true); } }; BootstrapTable.prototype.getRowByUniqueId = function(id) { var uniqueId = this.options.uniqueId, len = this.options.data.length, dataRow = null, i, row, rowUniqueId; for (i = len - 1; i >= 0; i--) { row = this.options.data[i]; if (row.hasOwnProperty(uniqueId)) { // uniqueId is a column rowUniqueId = row[uniqueId]; } else if (row._data.hasOwnProperty(uniqueId)) { // uniqueId is a row data property rowUniqueId = row._data[uniqueId]; } else { continue; } if (typeof rowUniqueId === "string") { id = id.toString(); } else if (typeof rowUniqueId === "number") { if (Number(rowUniqueId) === rowUniqueId && rowUniqueId % 1 === 0) { id = parseInt(id); } else if (rowUniqueId === Number(rowUniqueId) && rowUniqueId !== 0) { id = parseFloat(id); } } if (rowUniqueId === id) { dataRow = row; break; } } return dataRow; }; BootstrapTable.prototype.removeByUniqueId = function(id) { var len = this.options.data.length, row = this.getRowByUniqueId(id); if (row) { this.options.data.splice(this.options.data.indexOf(row), 1); } if (len === this.options.data.length) { return; } this.initSearch(); this.initPagination(); this.initBody(true); }; BootstrapTable.prototype.updateByUniqueId = function(params) { var rowId; if (!params.hasOwnProperty("id") || !params.hasOwnProperty("row")) { return; } rowId = $.inArray(this.getRowByUniqueId(params.id), this.options.data); if (rowId === -1) { return; } $.extend(this.data[rowId], params.row); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.insertRow = function(params) { if (!params.hasOwnProperty("index") || !params.hasOwnProperty("row")) { return; } this.data.splice(params.index, 0, params.row); this.initSearch(); this.initPagination(); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.updateRow = function(params) { if (!params.hasOwnProperty("index") || !params.hasOwnProperty("row")) { return; } $.extend(this.data[params.index], params.row); this.initSort(); this.initBody(true); }; BootstrapTable.prototype.showRow = function(params) { if (!params.hasOwnProperty("index") && !params.hasOwnProperty("uniqueId")) { return; } this.toggleRow(params.index, params.uniqueId, true); }; BootstrapTable.prototype.hideRow = function(params) { if (!params.hasOwnProperty("index") && !params.hasOwnProperty("uniqueId")) { return; } this.toggleRow(params.index, params.uniqueId, false); }; BootstrapTable.prototype.getRowsHidden = function(show) { var rows = $(this.$body[0]).children().filter(":hidden"), i = 0; if (show) { for (; i < rows.length; i++) { $(rows[i]).show(); } } return rows; }; BootstrapTable.prototype.mergeCells = function(options) { var row = options.index, col = $.inArray(options.field, this.getVisibleFields()), rowspan = options.rowspan || 1, colspan = options.colspan || 1, i, j, $tr = this.$body.find(">tr"), $td; if (this.options.detailView && !this.options.cardView) { col += 1; } $td = $tr.eq(row).find(">td").eq(col); if (row < 0 || col < 0 || row >= this.data.length) { return; } for (i = row; i < row + rowspan; i++) { for (j = col; j < col + colspan; j++) { $tr.eq(i).find(">td").eq(j).hide(); } } $td.attr("rowspan", rowspan).attr("colspan", colspan).show(); }; BootstrapTable.prototype.updateCell = function(params) { if (!params.hasOwnProperty("index") || !params.hasOwnProperty("field") || !params.hasOwnProperty("value") ) { return; } this.data[params.index][params.field] = params.value; if (params.reinit === false) { return; } this.initSort(); this.initBody(true); }; BootstrapTable.prototype.getOptions = function() { return this.options; }; BootstrapTable.prototype.getSelections = function() { var that = this; return $.grep(this.data, function(row) { return row[that.header.stateField]; }); }; BootstrapTable.prototype.getAllSelections = function() { var that = this; return $.grep(this.options.data, function(row) { return row[that.header.stateField]; }); }; BootstrapTable.prototype.checkAll = function() { this.checkAll_(true); }; BootstrapTable.prototype.uncheckAll = function() { this.checkAll_(false); }; BootstrapTable.prototype.checkAll_ = function(checked) { var rows; if (!checked) { rows = this.getSelections(); } this.$selectAll.add(this.$selectAll_).prop("checked", checked); this.$selectItem.filter(":enabled").prop("checked", checked); this.updateRows(); if (checked) { rows = this.getSelections(); } this.trigger(checked ? "check-all" : "uncheck-all", rows); }; BootstrapTable.prototype.check = function(index) { this.check_(true, index); }; BootstrapTable.prototype.uncheck = function(index) { this.check_(false, index); }; BootstrapTable.prototype.check_ = function(checked, index) { var $el = this.$selectItem .filter(sprintf('[data-index="%s"]', index)) .prop("checked", checked); this.data[index][this.header.stateField] = checked; this.updateSelected(); this.trigger(checked ? "check" : "uncheck", this.data[index], $el); }; BootstrapTable.prototype.checkBy = function(obj) { this.checkBy_(true, obj); }; BootstrapTable.prototype.uncheckBy = function(obj) { this.checkBy_(false, obj); }; BootstrapTable.prototype.checkBy_ = function(checked, obj) { if (!obj.hasOwnProperty("field") || !obj.hasOwnProperty("values")) { return; } var that = this, rows = []; $.each(this.options.data, function(index, row) { if (!row.hasOwnProperty(obj.field)) { return false; } if ($.inArray(row[obj.field], obj.values) !== -1) { var $el = that.$selectItem .filter(":enabled") .filter(sprintf('[data-index="%s"]', index)) .prop("checked", checked); row[that.header.stateField] = checked; rows.push(row); that.trigger(checked ? "check" : "uncheck", row, $el); } }); this.updateSelected(); this.trigger(checked ? "check-some" : "uncheck-some", rows); }; BootstrapTable.prototype.destroy = function() { this.$el.insertBefore(this.$container); $(this.options.toolbar).insertBefore(this.$el); this.$container.next().remove(); this.$container.remove(); this.$el .html(this.$el_.html()) .css("margin-top", "0") .attr("class", this.$el_.attr("class") || ""); // reset the class }; BootstrapTable.prototype.showLoading = function() { this.$tableLoading.show(); }; BootstrapTable.prototype.hideLoading = function() { this.$tableLoading.hide(); }; BootstrapTable.prototype.togglePagination = function() { this.options.pagination = !this.options.pagination; var button = this.$toolbar.find('button[name="paginationSwitch"] i'); if (this.options.pagination) { button.attr( "class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchDown ); } else { button.attr( "class", this.options.iconsPrefix + " " + this.options.icons.paginationSwitchUp ); } this.updatePagination(); }; BootstrapTable.prototype.refresh = function(params) { if (params && params.url) { this.options.url = params.url; this.options.pageNumber = 1; } this.initServer(params && params.silent, params && params.query); }; BootstrapTable.prototype.resetWidth = function() { if (this.options.showHeader && this.options.height) { this.fitHeader(); } if (this.options.showFooter) { this.fitFooter(); } }; BootstrapTable.prototype.showColumn = function(field) { this.toggleColumn(getFieldIndex(this.columns, field), true, true); }; BootstrapTable.prototype.hideColumn = function(field) { this.toggleColumn(getFieldIndex(this.columns, field), false, true); }; BootstrapTable.prototype.getHiddenColumns = function() { return $.grep(this.columns, function(column) { return !column.visible; }); }; BootstrapTable.prototype.filterBy = function(columns) { this.filterColumns = $.isEmptyObject(columns) ? {} : columns; this.options.pageNumber = 1; this.initSearch(); this.updatePagination(); }; BootstrapTable.prototype.scrollTo = function(value) { if (typeof value === "string") { value = value === "bottom" ? this.$tableBody[0].scrollHeight : 0; } if (typeof value === "number") { this.$tableBody.scrollTop(value); } if (typeof value === "undefined") { return this.$tableBody.scrollTop(); } }; BootstrapTable.prototype.getScrollPosition = function() { return this.scrollTo(); }; BootstrapTable.prototype.selectPage = function(page) { if (page > 0 && page <= this.options.totalPages) { this.options.pageNumber = page; this.updatePagination(); } }; BootstrapTable.prototype.prevPage = function() { if (this.options.pageNumber > 1) { this.options.pageNumber--; this.updatePagination(); } }; BootstrapTable.prototype.nextPage = function() { if (this.options.pageNumber < this.options.totalPages) { this.options.pageNumber++; this.updatePagination(); } }; BootstrapTable.prototype.toggleView = function() { this.options.cardView = !this.options.cardView; this.initHeader(); // Fixed remove toolbar when click cardView button. //that.initToolbar(); this.initBody(); this.trigger("toggle", this.options.cardView); }; BootstrapTable.prototype.refreshOptions = function(options) { //If the objects are equivalent then avoid the call of destroy / init methods if (compareObjects(this.options, options, true)) { return; } this.options = $.extend(this.options, options); this.trigger("refresh-options", this.options); this.destroy(); this.init(); }; BootstrapTable.prototype.resetSearch = function(text) { var $search = this.$toolbar.find(".search input"); $search.val(text || ""); this.onSearch({ currentTarget: $search }); }; BootstrapTable.prototype.expandRow_ = function(expand, index) { var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', index)); if ($tr.next().is("tr.detail-view") === (expand ? false : true)) { $tr.find("> td > .detail-icon").click(); } }; BootstrapTable.prototype.expandRow = function(index) { this.expandRow_(true, index); }; BootstrapTable.prototype.collapseRow = function(index) { this.expandRow_(false, index); }; BootstrapTable.prototype.expandAllRows = function(isSubTable) { if (isSubTable) { var $tr = this.$body.find(sprintf('> tr[data-index="%s"]', 0)), that = this, detailIcon = null, executeInterval = false, idInterval = -1; if (!$tr.next().is("tr.detail-view")) { $tr.find("> td > .detail-icon").click(); executeInterval = true; } else if (!$tr.next().next().is("tr.detail-view")) { $tr.next().find(".detail-icon").click(); executeInterval = true; } if (executeInterval) { try { idInterval = setInterval(function() { detailIcon = that.$body .find("tr.detail-view") .last() .find(".detail-icon"); if (detailIcon.length > 0) { detailIcon.click(); } else { clearInterval(idInterval); } }, 1); } catch (ex) { clearInterval(idInterval); } } } else { var trs = this.$body.children(); for (var i = 0; i < trs.length; i++) { this.expandRow_(true, $(trs[i]).data("index")); } } }; BootstrapTable.prototype.collapseAllRows = function(isSubTable) { if (isSubTable) { this.expandRow_(false, 0); } else { var trs = this.$body.children(); for (var i = 0; i < trs.length; i++) { this.expandRow_(false, $(trs[i]).data("index")); } } }; BootstrapTable.prototype.updateFormatText = function(name, text) { if (this.options[sprintf("format%s", name)]) { if (typeof text === "string") { this.options[sprintf("format%s", name)] = function() { return text; }; } else if (typeof text === "function") { this.options[sprintf("format%s", name)] = text; } } this.initToolbar(); this.initPagination(); this.initBody(); }; // BOOTSTRAP TABLE PLUGIN DEFINITION // ======================= var allowedMethods = [ "getOptions", "getSelections", "getAllSelections", "getData", "load", "append", "prepend", "remove", "removeAll", "insertRow", "updateRow", "updateCell", "updateByUniqueId", "removeByUniqueId", "getRowByUniqueId", "showRow", "hideRow", "getRowsHidden", "mergeCells", "checkAll", "uncheckAll", "check", "uncheck", "checkBy", "uncheckBy", "refresh", "resetView", "resetWidth", "destroy", "showLoading", "hideLoading", "showColumn", "hideColumn", "getHiddenColumns", "filterBy", "scrollTo", "getScrollPosition", "selectPage", "prevPage", "nextPage", "togglePagination", "toggleView", "refreshOptions", "resetSearch", "expandRow", "collapseRow", "expandAllRows", "collapseAllRows", "updateFormatText", ]; $.fn.bootstrapTable = function(option) { var value, args = Array.prototype.slice.call(arguments, 1); this.each(function() { var $this = $(this), data = $this.data("bootstrap.table"), options = $.extend({}, BootstrapTable.DEFAULTS, $this.data(), typeof option === "object" && option ); if (typeof option === "string") { if ($.inArray(option, allowedMethods) < 0) { throw new Error("Unknown method: " + option); } if (!data) { return; } value = data[option].apply(data, args); if (option === "destroy") { $this.removeData("bootstrap.table"); } } if (!data) { $this.data( "bootstrap.table", (data = new BootstrapTable(this, options)) ); } }); return typeof value === "undefined" ? this : value; }; $.fn.bootstrapTable.Constructor = BootstrapTable; $.fn.bootstrapTable.defaults = BootstrapTable.DEFAULTS; $.fn.bootstrapTable.columnDefaults = BootstrapTable.COLUMN_DEFAULTS; $.fn.bootstrapTable.locales = BootstrapTable.LOCALES; $.fn.bootstrapTable.methods = allowedMethods; $.fn.bootstrapTable.utils = { sprintf: sprintf, getFieldIndex: getFieldIndex, compareObjects: compareObjects, calculateObjectValue: calculateObjectValue, }; // BOOTSTRAP TABLE INIT // ======================= $(function() { $('[data-toggle="table"]').bootstrapTable(); }); })(jQuery);