From 22f19020807ebe591742a5639672a9529fbf5d73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cornelius=20Wei=C3=9F?= Date: Tue, 25 Feb 2025 13:15:52 +0100 Subject: [PATCH] fix(Tinebase) filtering for empty foreign records not working e.g. contact->sites equals '' (show all contacts having no site set) --- .../js/widgets/grid/ForeignRecordFilter.js | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/tine20/Tinebase/js/widgets/grid/ForeignRecordFilter.js b/tine20/Tinebase/js/widgets/grid/ForeignRecordFilter.js index 2e7d3e20f2..91a710d018 100644 --- a/tine20/Tinebase/js/widgets/grid/ForeignRecordFilter.js +++ b/tine20/Tinebase/js/widgets/grid/ForeignRecordFilter.js @@ -308,6 +308,7 @@ Tine.widgets.grid.ForeignRecordFilter = Ext.extend(Tine.widgets.grid.FilterModel var operator = filter.get('operator') || filter.formFields.operator.origGetValue(), registeredOperator = _.get(_.find(this.operators, function(o) { return _.get(o, 'operator.filterName') == operator;}), 'operator', false); + let [op, options] = me.parseOperator(filter.get('operator')); if (registeredOperator) { value.push({ @@ -318,8 +319,6 @@ Tine.widgets.grid.ForeignRecordFilter = Ext.extend(Tine.widgets.grid.FilterModel }); } else { // get value for idField if our own operator is not definedBy - - let [op, options] = me.parseOperator(filter.get('operator')); let opMap = { not: 'equals', // we auto switch definedBy to notDefinedBy for not filters notin: 'in', // we auto switch definedBy to notDefinedBy for notin filters @@ -344,10 +343,14 @@ Tine.widgets.grid.ForeignRecordFilter = Ext.extend(Tine.widgets.grid.FilterModel }, this); } if (this.crossRecordClass) { - value = [{'field': this.crossRecordForeignField, operator: 'definedBy?condition=and&setOperator=one0f', value: value}] + value = [{'field': this.crossRecordForeignField, operator: 'definedBy?condition=and&setOperator=oneOf', value: value}] } else if (this.metaDataForField && operator !== 'definedBy') { - value = [{'field': this.metaDataForField, operator: 'definedBy?condition=and&setOperator=one0f', value: value}] + value = [{'field': this.metaDataForField, operator: 'definedBy?condition=and&setOperator=oneOf', value: value}] + } + if ((me.crossRecordClass || me.metaDataForField) && op !== 'definedBy' && !filter.formFields.value.value) { + value = null; } + } return value; @@ -366,7 +369,11 @@ Tine.widgets.grid.ForeignRecordFilter = Ext.extend(Tine.widgets.grid.FilterModel if (isRegisteredOperator || ['equals', 'not', 'in', 'notin', 'allOf'].indexOf(operator) >= 0) { // NOTE: if setValue got called in the valueField internally, value is arguments[1] (createCallback) - return filter.formFields.value.origSetValue(arguments.length ? arguments[1] : value); + value = arguments.length ? arguments[1] : value; + if ((me.crossRecordClass || me.metaDataForField) && _.isArray(value) && ! value.length) { + value = ''; + } + return filter.formFields.value.origSetValue(value); } // generic: choose right operator : appname -> generic filters have no subfilters an if one day, no left hand once! @@ -609,6 +616,10 @@ Tine.widgets.grid.ForeignRecordFilter = Ext.extend(Tine.widgets.grid.FilterModel allOf: 'definedBy?condition=and&setOperator=allOf' }; + if ((me.crossRecordClass || me.metaDataForField) && op !== 'definedBy' && !filter.formFields.value.value) { + return op; + } + if (_.isFunction(me.getCustomOperators)) { me.getCustomOperators().map((def) => { opMap[def.operator] = def.opValue || def.operator;