/** * @author: Dennis Hernández * @webSite: http://djhvscf.github.io/Blog * @version: v1.0.0 */ !function ($) { 'use strict'; 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 getFieldIndex = function (columns, field) { var index = -1; $.each(columns, function (i, column) { if (column.field === field) { index = i; return false; } return true; }); return index; }; var calculateObjectValue = function (self, name, args, defaultValue) { if (typeof name === 'string') { // support obj.func1.func2 var names = name.split('.'); if (names.length > 1) { name = window; $.each(names, function (i, f) { name = name[f]; }); } else { name = window[name]; } } if (typeof name === 'object') { return name; } if (typeof name === 'function') { return name.apply(self, args); } return defaultValue; }; $.extend($.fn.bootstrapTable.defaults, { filterControl: false, onColumnSearch: function (field, text) { return false; } }); $.extend($.fn.bootstrapTable.COLUMN_DEFAULTS, { filterControl: undefined, filterData: undefined }); $.extend($.fn.bootstrapTable.Constructor.EVENTS, { 'column-search.bs.table': 'onColumnSearch' }); var BootstrapTable = $.fn.bootstrapTable.Constructor, _initHeader = BootstrapTable.prototype.initHeader, _initBody = BootstrapTable.prototype.initBody, _initSearch = BootstrapTable.prototype.initSearch; BootstrapTable.prototype.initHeader = function () { _initHeader.apply(this, Array.prototype.slice.apply(arguments)); if (!this.options.filterControl) { return; } var addedFilterControl = false, that = this, isVisible, html, timeoutId = 0; $.each(this.options.columns, function (i, column) { isVisible = 'hidden'; html = []; if (!column.visible) { return; } if (!column.filterControl) { html.push('
'); } else { html.push('
'); if (column.filterControl && column.searchable) { addedFilterControl = true; isVisible = 'visible' } switch (column.filterControl.toLowerCase()) { case 'input' : html.push(sprintf('', isVisible)); break; case 'select': html.push(sprintf('', column.field, isVisible)) break; } } that.$header.find(sprintf('.th-inner:eq("%s")', i)).next().append(html.join('')); if (column.filterData !== undefined && column.filterData.toLowerCase() !== 'column') { var filterDataType = column.filterData.substring(0, 3); var filterDataSource = column.filterData.substring(4, column.filterData.length); var selectControl = $('.' + column.field); selectControl.append($("") .attr("value", '') .text('')); switch (filterDataType) { case 'url': $.ajax({ url: filterDataSource, dataType: 'json', success: function (data) { $.each(data, function (key, value) { selectControl.append($("") .attr("value", key) .text(value)); }); } }); break; case 'var': var variableValues = window[filterDataSource]; for (var key in variableValues) { selectControl.append($("") .attr("value", key) .text(variableValues[key])); }; break; } } }); if (addedFilterControl) { this.$header.off('keyup', 'input').on('keyup', 'input', function (event) { clearTimeout(timeoutId); timeoutId = setTimeout(function () { that.onColumnSearch(event); }, that.options.searchTimeOut); }); this.$header.off('change', 'select').on('change', 'select', function (event) { clearTimeout(timeoutId); timeoutId = setTimeout(function () { that.onColumnSearch(event); }, that.options.searchTimeOut); }); } else { this.$header.find('.filterControl').hide(); } }; BootstrapTable.prototype.initBody = function () { _initBody.apply(this, Array.prototype.slice.apply(arguments)); var that = this, data = this.getData(); for (var i = this.pageFrom - 1; i < this.pageTo; i++) { var key, item = data[i]; $.each(this.header.fields, function (j, field) { var value = item[field], column = that.options.columns[getFieldIndex(that.options.columns, field)]; value = calculateObjectValue(that.header, that.header.formatters[j], [value, item, i], value); if ((!column.checkbox) || (!column.radio)) { if (column.filterControl !== undefined && column.filterControl.toLowerCase() === 'select' && column.searchable) { if (column.filterData === undefined || column.filterData.toLowerCase() === 'column') { var selectControl = $('.' + column.field), iOpt = 0, exitsOpt = false, options; if (selectControl !== undefined) { options = selectControl.get(0).options; if (options.length === 0) { //Added the default option selectControl.append($("") .attr("value", '') .text('')); selectControl.append($("") .attr("value", value) .text(value)); } else { for (; iOpt < options.length; iOpt++) { if (options[iOpt].value === value) { exitsOpt = true; break; } } if (!exitsOpt) { selectControl.append($("") .attr("value", value) .text(value)); } } } } } } }); } }; BootstrapTable.prototype.initSearch = function () { _initSearch.apply(this, Array.prototype.slice.apply(arguments)); var that = this; var fp = $.isEmptyObject(this.filterColumnsPartial) ? null : this.filterColumnsPartial; //Check partial column filter this.data = fp ? $.grep(this.data, function (item, i) { for (var key in fp) { var fval = fp[key].toLowerCase(); var value = item[key]; value = calculateObjectValue(that.header, that.header.formatters[$.inArray(key, that.header.fields)], [value, item, i], value); if (!($.inArray(key, that.header.fields) !== -1 && (typeof value === 'string' || typeof value === 'number') && (value + '').toLowerCase().indexOf(fval) !== -1)) { return false; } } return true; }) : this.data; }; BootstrapTable.prototype.onColumnSearch = function (event) { var text = $.trim($(event.currentTarget).val()); var $field = $(event.currentTarget).parent().parent().parent().data('field') if ($.isEmptyObject(this.filterColumnsPartial)) { this.filterColumnsPartial = {}; } if (text) { this.filterColumnsPartial[$field] = text; } else { delete this.filterColumnsPartial[$field]; } this.options.pageNumber = 1; this.onSearch(event); this.updatePagination(); this.trigger('column-search', $field, text); }; }(jQuery);