From b34a7bfabc16c357526bc4dd9f457779d66e1920 Mon Sep 17 00:00:00 2001 From: ma0048 Date: Tue, 3 Dec 2024 16:13:48 +0100 Subject: [PATCH 1/2] - custom filter tabulator --- public/js/components/filter/Filter.js | 84 +++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 1508fb72a..73d2a10e3 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -206,6 +206,7 @@ export const CoreFilterCmpt = { movableColumns: true, columnDefaults:{ tooltip: true, + headerFilterFunc: this.customFilterFunction, }, placeholder, reactiveData: true, @@ -465,6 +466,89 @@ export const CoreFilterCmpt = { this.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true; }, + parseFilterExpression(expression){ + const includeGroups = []; + const excludeTerms = []; + const comparisons = []; + + const andParts = expression.split('&&').map(part => part.trim()); + + andParts.forEach(part => { + const orTerms = part.split('||').map(p => p.trim()); + const orRegexes = []; + + orTerms.forEach(term => { + + const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+)$/); + + if (comparisonMatch) + { + const operator = comparisonMatch[1]; + const number = parseFloat(comparisonMatch[2]); + + comparisons.push({ operator, number }); + } + else if (term.startsWith('!')) + { + const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*'); + excludeTerms.push(new RegExp(excludeTerm, 'i')); + } + else + { + const includeTerm = term.replace(/\*/g, '.*'); + orRegexes.push(new RegExp(includeTerm, 'i')); + } + }); + + if (orRegexes.length > 0) + { + includeGroups.push(orRegexes); + } + }); + + return { includeGroups, excludeTerms, comparisons }; + }, + + customFilterFunction(headerValue, rowValue) + { + const { includeGroups, excludeTerms, comparisons } = this.parseFilterExpression(headerValue); + + const includes = includeGroups.every(group => + group.some(regex => regex.test(rowValue)) + ); + + const excludes = excludeTerms.every(regex => !regex.test(rowValue)); + + const comparisonCheck = comparisons.every(({ operator, number }) => { + let value = rowValue; + + if (!isNaN(number)) + { + value = parseFloat(rowValue); + if (isNaN(value)) return false; + } + + switch (operator) { + case '<': + return value < number; + case '>': + return value > number; + case '<=': + return value <= number; + case '>=': + return value >= number; + case '=': + return value === number; + case '!=': + return value !== number; + default: + return false; + } + }); + + return includes && excludes && comparisonCheck; + }, + // ------------------------------------------------------------------------------------------------------------------ // Event handlers From 6a1e518da17da063835601c05223251401fe10bc Mon Sep 17 00:00:00 2001 From: ma0048 Date: Wed, 11 Dec 2024 13:44:19 +0100 Subject: [PATCH 2/2] - defaultheaderfilter function in eigenes file verschoben --- public/js/components/filter/Filter.js | 86 +------------------ .../tabulator/filters/defaultHeaderFilter.js | 82 ++++++++++++++++++ 2 files changed, 84 insertions(+), 84 deletions(-) create mode 100644 public/js/tabulator/filters/defaultHeaderFilter.js diff --git a/public/js/components/filter/Filter.js b/public/js/components/filter/Filter.js index 73d2a10e3..42a697d03 100644 --- a/public/js/components/filter/Filter.js +++ b/public/js/components/filter/Filter.js @@ -20,6 +20,7 @@ import FilterConfig from './Filter/Config.js'; import FilterColumns from './Filter/Columns.js'; import TableDownload from './Table/Download.js'; import collapseAutoClose from '../../directives/collapseAutoClose.js'; +import { defaultHeaderFilter } from '../../tabulator/filters/defaultHeaderFilter.js'; // const FILTER_COMPONENT_NEW_FILTER = 'Filter Component New Filter'; @@ -206,7 +207,7 @@ export const CoreFilterCmpt = { movableColumns: true, columnDefaults:{ tooltip: true, - headerFilterFunc: this.customFilterFunction, + headerFilterFunc: defaultHeaderFilter, }, placeholder, reactiveData: true, @@ -466,89 +467,6 @@ export const CoreFilterCmpt = { this.fetchCmptRefresh === true ? this.fetchCmptRefresh = false : this.fetchCmptRefresh = true; }, - parseFilterExpression(expression){ - const includeGroups = []; - const excludeTerms = []; - const comparisons = []; - - const andParts = expression.split('&&').map(part => part.trim()); - - andParts.forEach(part => { - const orTerms = part.split('||').map(p => p.trim()); - const orRegexes = []; - - orTerms.forEach(term => { - - const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+)$/); - - if (comparisonMatch) - { - const operator = comparisonMatch[1]; - const number = parseFloat(comparisonMatch[2]); - - comparisons.push({ operator, number }); - } - else if (term.startsWith('!')) - { - const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*'); - excludeTerms.push(new RegExp(excludeTerm, 'i')); - } - else - { - const includeTerm = term.replace(/\*/g, '.*'); - orRegexes.push(new RegExp(includeTerm, 'i')); - } - }); - - if (orRegexes.length > 0) - { - includeGroups.push(orRegexes); - } - }); - - return { includeGroups, excludeTerms, comparisons }; - }, - - customFilterFunction(headerValue, rowValue) - { - const { includeGroups, excludeTerms, comparisons } = this.parseFilterExpression(headerValue); - - const includes = includeGroups.every(group => - group.some(regex => regex.test(rowValue)) - ); - - const excludes = excludeTerms.every(regex => !regex.test(rowValue)); - - const comparisonCheck = comparisons.every(({ operator, number }) => { - let value = rowValue; - - if (!isNaN(number)) - { - value = parseFloat(rowValue); - if (isNaN(value)) return false; - } - - switch (operator) { - case '<': - return value < number; - case '>': - return value > number; - case '<=': - return value <= number; - case '>=': - return value >= number; - case '=': - return value === number; - case '!=': - return value !== number; - default: - return false; - } - }); - - return includes && excludes && comparisonCheck; - }, - // ------------------------------------------------------------------------------------------------------------------ // Event handlers diff --git a/public/js/tabulator/filters/defaultHeaderFilter.js b/public/js/tabulator/filters/defaultHeaderFilter.js new file mode 100644 index 000000000..7e463921b --- /dev/null +++ b/public/js/tabulator/filters/defaultHeaderFilter.js @@ -0,0 +1,82 @@ +function parseFilterExpression(expression){ + const includeGroups = []; + const excludeTerms = []; + const comparisons = []; + + const andParts = expression.split('&&').map(part => part.trim()); + + andParts.forEach(part => { + const orTerms = part.split('||').map(p => p.trim()); + const orRegexes = []; + + orTerms.forEach(term => { + + const comparisonMatch = term.match(/^(<=|>=|<|>|=|!=)\s*(\d+)$/); + + if (comparisonMatch) + { + const operator = comparisonMatch[1]; + const number = parseFloat(comparisonMatch[2]); + + comparisons.push({ operator, number }); + } + else if (term.startsWith('!')) + { + const excludeTerm = term.substring(1).trim().replace(/\*/g, '.*'); + excludeTerms.push(new RegExp(excludeTerm, 'i')); + } + else + { + const includeTerm = term.replace(/\*/g, '.*'); + orRegexes.push(new RegExp(includeTerm, 'i')); + } + }); + + if (orRegexes.length > 0) + { + includeGroups.push(orRegexes); + } + }); + + return { includeGroups, excludeTerms, comparisons }; +} + +export function defaultHeaderFilter(headerValue, rowValue) +{ + const { includeGroups, excludeTerms, comparisons } = parseFilterExpression(headerValue); + + const includes = includeGroups.every(group => + group.some(regex => regex.test(rowValue)) + ); + + const excludes = excludeTerms.every(regex => !regex.test(rowValue)); + + const comparisonCheck = comparisons.every(({ operator, number }) => { + let value = rowValue; + + if (!isNaN(number)) + { + value = parseFloat(rowValue); + if (isNaN(value)) return false; + } + + switch (operator) { + case '<': + return value < number; + case '>': + return value > number; + case '<=': + return value <= number; + case '>=': + return value >= number; + case '=': + return value === number; + case '!=': + return value !== number; + default: + return false; + } + }); + + return includes && excludes && comparisonCheck; +}