From 6cf8e91c6dff55141eea5a66f285c3285c42f44f Mon Sep 17 00:00:00 2001 From: Costin Grigore Date: Thu, 11 Jan 2024 13:28:33 +0200 Subject: [PATCH] ValueFilter's keys with the special field '*' will match all values and filter them out (true) or show (false). Now works in both vue-pivottable-ui and vue-pivottable. Sample: ``` valueFilter: { field1: { '*': true, // filter out all values 'value1': true, // filter out value1 'value2': false // select to display value2 }, field2: { '*': false, // select to display all values 'value1': true, // filter out value1 'value2': false // select to display value2 } } ``` --- src/PivottableUi.js | 45 +++++++++++++++++++++++++++++++++++++++------ src/helper/utils.js | 17 ++++++++++++++--- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/PivottableUi.js b/src/PivottableUi.js index f2379d97..9efd7f92 100644 --- a/src/PivottableUi.js +++ b/src/PivottableUi.js @@ -108,6 +108,24 @@ export default { cols: [], rows: [], attributes: [], + /** + * ValueFilter's keys with the special field '*' will match all values and filter them out (true) or show (false). + Sample: + ``` + valueFilter: { + field1: { + '*': true, // filter out all values + 'value1': true, // filter out value1 + 'value2': false // select to display value2 + }, + field2: { + '*': false, // select to display all values + 'value1': true, // filter out value1 + 'value2': false // select to display value2 + } + } + ``` + */ valueFilter: {}, renderer: null }, @@ -237,15 +255,30 @@ export default { this.propsData.aggregatorName = this.aggregatorName this.propsData.attributes = this.attributes.length > 0 ? this.attributes : Object.keys(this.attrValues) this.unusedOrder = this.unusedAttrs - Object.keys(this.attrValues).forEach(key => { - let valueFilter = {} - const values = this.valueFilter && this.valueFilter[key] - if (values && Object.keys(values).length) { - valueFilter = this.valueFilter[key] + const allSelector = '*' + Object.entries(this.attrValues).forEach(([key, values]) => { + let attributes = {} + const valueFilterItem = this.valueFilter && this.valueFilter[key] + if (valueFilterItem && Object.keys(valueFilterItem).length) { + if (valueFilterItem[allSelector] === true) { + // add all keys to be filtered out + Object.keys(values).forEach(k => { + if (k !== allSelector) { + const keyPresent = valueFilterItem[k] + if (keyPresent === undefined || keyPresent === true) { + attributes[k] = true + } else { + // attributes[k] = false + } + } + }) + } else { + attributes = valueFilterItem + } } this.updateValueFilter({ attribute: key, - valueFilter + valueFilter: attributes }) }) }, diff --git a/src/helper/utils.js b/src/helper/utils.js index c6ea9022..f45e6aa6 100644 --- a/src/helper/utils.js +++ b/src/helper/utils.js @@ -568,15 +568,26 @@ class PivotData { } ) } - filter (record) { + + filter(record) { + const allSelector = '*' for (const k in this.props.valueFilter) { - if (record[k] in this.props.valueFilter[k]) { - return false + if (k !== allSelector) { + const valueFilterItem = this.props.valueFilter && this.props.valueFilter[k] + if (record[k] in valueFilterItem) { + const existingKey = valueFilterItem[record[k]] + if (existingKey === true) { + return false + } + } else if (valueFilterItem[allSelector] === true) { + return false + } } } return true } + forEachMatchingRecord (criteria, callback) { return PivotData.forEachRecord( this.props.data,