diff --git a/src/defaults.js b/src/defaults.js index 359f8e8..83fc831 100644 --- a/src/defaults.js +++ b/src/defaults.js @@ -51,6 +51,7 @@ export default function getDefaultOptions(instance) { // ColumnManager: CustomColumnManager }, filterRows: filterRows, + filterMatchStrategy: 'strict', // strict, fuzzy, tokens freezeMessage: '', getEditor: null, serialNoColumn: true, diff --git a/src/filterRows.js b/src/filterRows.js index 11b0aa3..1d13a85 100644 --- a/src/filterRows.js +++ b/src/filterRows.js @@ -17,7 +17,7 @@ export default function filterRows(rows, filters, data) { const cells = filteredRows.map(row => row[colIndex]); - let filter = guessFilter(keyword); + let filter = guessFilter(keyword, data); let filterMethod = getFilterMethod(rows, data, filter); if (filterMethod) { @@ -76,6 +76,31 @@ function getFilterMethod(rows, allData, filter) { .map(cell => cell.rowIndex); }, + fuzzy(keyword, cells) { + const terms = keyword.split(/\s+/).filter(term => term.length > 0); + return cells + .filter(cell => { + if (terms.length === 0) return true; + const cellValue = stringCompareValue(cell); + return terms.every(term => cellValue.includes(term)); + }) + .map(cell => cell.rowIndex); + }, + + tokens(keyword, cells) { + const terms = keyword.split(/\s+/).filter(term => term.length > 0); + return cells + .filter(cell => { + if (terms.length === 0) return true; + const cellValue = stringCompareValue(cell); + return terms.every(term => { + const regex = new RegExp(`\\b${term}\\b`, 'i'); + return regex.test(cellValue); + }); + }) + .map(cell => cell.rowIndex); + }, + greaterThan(keyword, cells) { return cells .filter(cell => { @@ -140,7 +165,7 @@ function getFilterMethod(rows, allData, filter) { return filterMethodMap[filter.type]; } -function guessFilter(keyword = '') { +function guessFilter(keyword = '', data) { if (keyword.length === 0) return {}; let compareString = keyword; @@ -202,6 +227,20 @@ function guessFilter(keyword = '') { }; } + const filterMatchStrategy = data && data.options && data.options.filterMatchStrategy; + if (filterMatchStrategy === 'fuzzy' && keyword.includes(' ')) { + return { + type: 'fuzzy', + text: compareString.toLowerCase() + }; + } + if (filterMatchStrategy === 'tokens' && keyword.includes(' ')) { + return { + type: 'tokens', + text: compareString.toLowerCase() + }; + } + return { type: 'contains', text: compareString.toLowerCase() diff --git a/src/translations/index.js b/src/translations/index.js index 55d7a32..0657a35 100644 --- a/src/translations/index.js +++ b/src/translations/index.js @@ -2,6 +2,7 @@ import en from './en.json'; import de from './de.json'; import fr from './fr.json'; import it from './it.json'; +import sr from './sr.json'; export default function getTranslations() { return { @@ -9,5 +10,6 @@ export default function getTranslations() { de, fr, it, + sr, }; }; diff --git a/src/translations/sr.json b/src/translations/sr.json new file mode 100644 index 0000000..8a3fee3 --- /dev/null +++ b/src/translations/sr.json @@ -0,0 +1,15 @@ +{ + "Sort Ascending": "Sortiraj rastući", + "Sort Descending": "Sortiraj opadajući", + "Reset sorting": "Resetuj sortiranje", + "Remove column": "Ukloni kolonu", + "No Data": "Nema podataka", + "{count} cells copied": { + "1": "{count} polje kopirano", + "default": "{count} polja kopirano" + }, + "{count} rows selected": { + "1": "{count} red izabran", + "default": "{count} redova izabrano" + } +}