UNPKG

bootstrap-table

Version:

An extended table to integration with some of the most widely used CSS frameworks. (Supports Bootstrap, Semantic UI, Bulma, Material Design, Foundation)

214 lines (181 loc) 7.26 kB
import Utils from '../utils/index.js' export default { initSearchText () { if (this.options.search) { this.searchText = '' if (this.options.searchText !== '') { const search = Utils.getSearchInput(this) $(search).val(this.options.searchText) this.onSearch({ currentTarget: search, firedByInitSearchText: true }) } } }, initSearch () { this.filterOptions = this.filterOptions || this.options.filterOptions if (this.options.sidePagination !== 'server') { if (this.options.customSearch) { this.data = Utils.calculateObjectValue(this.options, this.options.customSearch, [this.options.data, this.searchText, this.filterColumns]) if (this.options.sortReset) { this.unsortedData = [...this.data] } this.initSort() return } const rawSearchText = this.searchText && (this.fromHtml ? Utils.escapeHTML(this.searchText) : this.searchText) let searchText = rawSearchText ? rawSearchText.toLowerCase() : '' const f = Utils.isEmptyObject(this.filterColumns) ? null : this.filterColumns if (this.options.searchAccentNeutralise) { searchText = Utils.normalizeAccent(searchText) } // Check filter if (typeof this.filterOptions.filterAlgorithm === 'function') { this.data = this.options.data.filter(item => this.filterOptions.filterAlgorithm.apply(null, [item, f])) } else if (typeof this.filterOptions.filterAlgorithm === 'string') { this.data = f ? this.options.data.filter(item => { const filterAlgorithm = this.filterOptions.filterAlgorithm if (!['and', 'or'].includes(filterAlgorithm)) { return true } for (const key in f) { if (!Object.prototype.hasOwnProperty.call(f, key)) { continue } const value = Utils.getItemField(item, key, false) const isArray = Array.isArray(f[key]) const match = !isArray && f[key] === value || isArray && f[key].includes(value) if (match && filterAlgorithm === 'or') { return true } if (!match && filterAlgorithm === 'and') { return false } } return filterAlgorithm === 'and' }) : [...this.options.data] } const visibleFields = this.getVisibleFields() this.data = searchText ? this.data.filter((item, i) => { for (let j = 0; j < this.header.fields.length; j++) { if (!this.header.searchables[j] || this.options.visibleSearch && visibleFields.indexOf(this.header.fields[j]) === -1) { continue } const key = Utils.isNumeric(this.header.fields[j]) ? parseInt(this.header.fields[j], 10) : this.header.fields[j] const column = this.columns[this.fieldsColumnsIndex[key]] let value = Utils.getItemField(item, key, false) if (this.options.searchAccentNeutralise) { value = Utils.normalizeAccent(value) } // Fix #142: respect searchFormatter boolean if (column && column.searchFormatter) { value = Utils.calculateObjectValue(column, this.header.formatters[j], [value, item, i, column.field], value) if (this.header.formatters[j] && typeof value !== 'number') { // search innerText value = $('<div>').html(value).text() } } if (typeof value === 'string' || typeof value === 'number') { if (this.options.strictSearch) { if (`${value}`.toLowerCase() === searchText) { return true } } else if (this.options.regexSearch) { if (Utils.regexCompare(value, rawSearchText)) { return true } } else { const largerSmallerEqualsRegex = /(?:(<=|=>|=<|>=|>|<)(?:\s+)?(-?\d+)?|(-?\d+)?(\s+)?(<=|=>|=<|>=|>|<))/gm const matches = largerSmallerEqualsRegex.exec(this.searchText) let comparisonCheck = false if (matches) { const operator = matches[1] || `${matches[5]}l` const comparisonValue = matches[2] || matches[3] const int = parseInt(value, 10) const comparisonInt = parseInt(comparisonValue, 10) switch (operator) { case '>': case '<l': comparisonCheck = int > comparisonInt break case '<': case '>l': comparisonCheck = int < comparisonInt break case '<=': case '=<': case '>=l': case '=>l': comparisonCheck = int <= comparisonInt break case '>=': case '=>': case '<=l': case '=<l': comparisonCheck = int >= comparisonInt break default: break } } if (comparisonCheck || `${value}`.toLowerCase().includes(searchText)) { return true } } } } return false }) : this.data if (this.options.sortReset) { this.unsortedData = [...this.data] } this.initSort() } }, onSearch ({ currentTarget, firedByInitSearchText } = {}, overwriteSearchText = true) { if (currentTarget !== undefined && $(currentTarget).length && overwriteSearchText) { const text = $(currentTarget).val().trim() if (this.options.trimOnSearch && $(currentTarget).val() !== text) { $(currentTarget).val(text) } if (this.searchText === text) { return } const searchInput = Utils.getSearchInput(this) const $searchInput = $(searchInput) const $currentTarget = currentTarget instanceof jQuery ? currentTarget : $(currentTarget) if ($currentTarget.is($searchInput) || $currentTarget.hasClass('search-input')) { this.searchText = text this.options.searchText = text } } if (!firedByInitSearchText) { this.options.pageNumber = 1 } this.initSearch() if (firedByInitSearchText) { if (this.options.sidePagination === 'client') { this.updatePagination() } } else { this.updatePagination() } this.trigger('search', this.searchText) }, resetSearch (text) { const search = Utils.getSearchInput(this) const textToUse = text || '' $(search).val(textToUse) this.searchText = textToUse this.options.searchText = textToUse this.onSearch({ currentTarget: search }, false) }, filterBy (columns, options) { this.filterOptions = Utils.isEmptyObject(options) ? this.options.filterOptions : Utils.extend({}, this.options.filterOptions, options) this.filterColumns = Utils.isEmptyObject(columns) ? {} : columns this.options.pageNumber = 1 this.initSearch() this.updatePagination() } }