diff --git a/src/columnmanager.js b/src/columnmanager.js index 0bbddf7..570a8f7 100644 --- a/src/columnmanager.js +++ b/src/columnmanager.js @@ -270,13 +270,8 @@ export default class ColumnManager { bindFilter() { if (!this.options.inlineFilters) return; - this.appliedFilters = this.appliedFilters || {}; const handler = e => { - this.$filterCell = $.closest('.dt-cell', e.target); - const { colIndex } = $.data(this.$filterCell); - const keyword = e.target.value; - this.appliedFilters[colIndex] = keyword; - this.applyFilter(this.appliedFilters); + this.applyFilter(this.getAppliedFilters()); }; $.on(this.header, 'keydown', '.dt-filter', debounce(handler, 300)); } @@ -290,6 +285,17 @@ export default class ColumnManager { }); } + getAppliedFilters() { + const filters = {}; + $.each('.dt-filter', this.header).map((input) => { + const value = input.value; + if (value) { + filters[input.dataset.colIndex] = value; + } + }); + return filters; + } + applyDefaultSortOrder() { // sort rows if any 1 column has a default sortOrder set const columnsToSort = this.getColumns().filter(col => col.sortOrder !== 'none'); diff --git a/src/filterRows.js b/src/filterRows.js index 0adbdad..3a19874 100644 --- a/src/filterRows.js +++ b/src/filterRows.js @@ -3,6 +3,10 @@ import { isNumber, stripHTML } from './utils'; export default function filterRows(rows, filters) { let filteredRowIndices = []; + if (Object.keys(filters).length === 0) { + return rows.map(row => row.meta.rowIndex); + } + for (let colIndex in filters) { const keyword = filters[colIndex]; @@ -40,7 +44,7 @@ function getFilterMethod(filter) { greaterThan(keyword, cells) { return cells .filter(cell => { - const value = parseFloat(cell.content); + const value = cell.content; return value > keyword; }) .map(cell => cell.rowIndex); @@ -49,7 +53,7 @@ function getFilterMethod(filter) { lessThan(keyword, cells) { return cells .filter(cell => { - const value = parseFloat(cell.content); + const value = cell.content; return value < keyword; }) .map(cell => cell.rowIndex); @@ -67,7 +71,7 @@ function getFilterMethod(filter) { range(rangeValues, cells) { return cells .filter(cell => { - const value = parseFloat(cell.content); + const value = cell.content; return value >= rangeValues[0] && value <= rangeValues[1]; }) .map(cell => cell.rowIndex); @@ -80,48 +84,49 @@ function getFilterMethod(filter) { function guessFilter(keyword = '') { if (keyword.length === 0) return {}; + let compareString = keyword; + + if (['>', '<', '='].includes(compareString[0])) { + compareString = keyword.slice(1); + } + if (keyword.startsWith('>')) { - if (isNumber(keyword.slice(1))) { + if (compareString) { return { type: 'greaterThan', - text: Number(keyword.slice(1).trim()) + text: compareString.trim() }; } - - keyword = keyword.slice(1); } if (keyword.startsWith('<')) { - if (isNumber(keyword.slice(1))) { + if (compareString) { return { type: 'lessThan', - text: Number(keyword.slice(1).trim()) + text: compareString.trim() }; } - - keyword = keyword.slice(1); - } - - if (keyword.split(':').length === 2 && keyword.split(':').every(isNumber)) { - return { - type: 'range', - text: keyword.split(':').map(v => v.trim()).map(Number) - }; } if (keyword.startsWith('=')) { - if (isNumber(keyword.slice(1))) { + if (isNumber(compareString)) { return { type: 'equals', text: Number(keyword.slice(1).trim()) }; } + } - keyword = keyword.slice(1); + if (keyword.split(':').length === 2) { + compareString = keyword.split(':'); + return { + type: 'range', + text: compareString.map(v => v.trim()) + }; } return { type: 'contains', - text: keyword.toLowerCase() + text: compareString.toLowerCase() }; }