From 67831a6216476b9c01703f1025f1c48b584276d9 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 2 Sep 2024 20:19:14 -0700 Subject: [PATCH] Lagacy support for FILTER_HAS_CUSTOM_FIELDS_ANY and FILTER_HAS_CUSTOM_FIELDS_ALL --- src-ui/src/app/utils/query-params.spec.ts | 60 ++++++++++++++++++++++- src-ui/src/app/utils/query-params.ts | 50 ++++++++++++++++++- 2 files changed, 107 insertions(+), 3 deletions(-) diff --git a/src-ui/src/app/utils/query-params.spec.ts b/src-ui/src/app/utils/query-params.spec.ts index a1bc0cdcd..67f57423e 100644 --- a/src-ui/src/app/utils/query-params.spec.ts +++ b/src-ui/src/app/utils/query-params.spec.ts @@ -2,13 +2,17 @@ import { convertToParamMap } from '@angular/router' import { FilterRule } from '../data/filter-rule' import { FILTER_CORRESPONDENT, + FILTER_CUSTOM_FIELDS_LOOKUP, FILTER_HAS_ANY_TAG, + FILTER_HAS_CUSTOM_FIELDS_ALL, + FILTER_HAS_CUSTOM_FIELDS_ANY, FILTER_HAS_TAGS_ALL, } from '../data/filter-rule-type' -import { paramsToViewState } from './query-params' +import { paramsToViewState, transformLegacyFilterRules } from './query-params' import { paramsFromViewState } from './query-params' import { queryParamsFromFilterRules } from './query-params' import { filterRulesFromQueryParams } from './query-params' +import { CustomFieldQueryLogicalOperator } from '../components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component' const tags__id__all = '9' const filterRules: FilterRule[] = [ @@ -193,4 +197,58 @@ describe('QueryParams Utils', () => { }, ]) }) + + it('should transform legacy filter rules', () => { + let filterRules: FilterRule[] = [ + { + rule_type: FILTER_HAS_CUSTOM_FIELDS_ANY, + value: '1', + }, + { + rule_type: FILTER_HAS_CUSTOM_FIELDS_ANY, + value: '2', + }, + ] + + let transformedFilterRules = transformLegacyFilterRules(filterRules) + + expect(transformedFilterRules).toEqual([ + { + rule_type: FILTER_CUSTOM_FIELDS_LOOKUP, + value: JSON.stringify([ + CustomFieldQueryLogicalOperator.Or, + [ + [1, 'exists', true], + [2, 'exists', true], + ], + ]), + }, + ]) + + filterRules = [ + { + rule_type: FILTER_HAS_CUSTOM_FIELDS_ALL, + value: '3', + }, + { + rule_type: FILTER_HAS_CUSTOM_FIELDS_ALL, + value: '4', + }, + ] + + transformedFilterRules = transformLegacyFilterRules(filterRules) + + expect(transformedFilterRules).toEqual([ + { + rule_type: FILTER_CUSTOM_FIELDS_LOOKUP, + value: JSON.stringify([ + CustomFieldQueryLogicalOperator.And, + [ + [3, 'exists', true], + [4, 'exists', true], + ], + ]), + }, + ]) + }) }) diff --git a/src-ui/src/app/utils/query-params.ts b/src-ui/src/app/utils/query-params.ts index 1121bd6a3..ac54efd15 100644 --- a/src-ui/src/app/utils/query-params.ts +++ b/src-ui/src/app/utils/query-params.ts @@ -1,7 +1,14 @@ import { ParamMap, Params } from '@angular/router' import { FilterRule } from '../data/filter-rule' -import { FilterRuleType, FILTER_RULE_TYPES } from '../data/filter-rule-type' +import { + FilterRuleType, + FILTER_RULE_TYPES, + FILTER_HAS_CUSTOM_FIELDS_ANY, + FILTER_CUSTOM_FIELDS_LOOKUP, + FILTER_HAS_CUSTOM_FIELDS_ALL, +} from '../data/filter-rule-type' import { ListViewState } from '../services/document-list-view.service' +import { CustomFieldQueryLogicalOperator } from '../components/common/custom-fields-query-dropdown/custom-fields-query-dropdown.component' const SORT_FIELD_PARAMETER = 'sort' const SORT_REVERSE_PARAMETER = 'reverse' @@ -40,6 +47,43 @@ export function paramsToViewState(queryParams: ParamMap): ListViewState { } } +export function transformLegacyFilterRules( + filterRules: FilterRule[] +): FilterRule[] { + const LEGACY_CUSTOM_FIELD_FILTER_RULE_TYPES = [ + FILTER_HAS_CUSTOM_FIELDS_ANY, + FILTER_HAS_CUSTOM_FIELDS_ALL, + ] + if ( + filterRules.filter((rule) => + LEGACY_CUSTOM_FIELD_FILTER_RULE_TYPES.includes(rule.rule_type) + ).length + ) { + const anyRules = filterRules.filter( + (rule) => rule.rule_type === FILTER_HAS_CUSTOM_FIELDS_ANY + ) + const allRules = filterRules.filter( + (rule) => rule.rule_type === FILTER_HAS_CUSTOM_FIELDS_ALL + ) + const customFieldQueryLogicalOperator = allRules.length + ? CustomFieldQueryLogicalOperator.And + : CustomFieldQueryLogicalOperator.Or + const valueRules = allRules.length ? allRules : anyRules + const customFieldQueryExpression = [ + customFieldQueryLogicalOperator, + [...valueRules.map((rule) => [parseInt(rule.value), 'exists', true])], + ] + filterRules.push({ + rule_type: FILTER_CUSTOM_FIELDS_LOOKUP, + value: JSON.stringify(customFieldQueryExpression), + }) + } + // TODO: can we support FILTER_DOES_NOT_HAVE_CUSTOM_FIELDS or FILTER_HAS_ANY_CUSTOM_FIELDS? + return filterRules.filter( + (rule) => !LEGACY_CUSTOM_FIELD_FILTER_RULE_TYPES.includes(rule.rule_type) + ) +} + export function filterRulesFromQueryParams( queryParams: ParamMap ): FilterRule[] { @@ -77,7 +121,9 @@ export function filterRulesFromQueryParams( }) ) }) - + filterRulesFromQueryParams = transformLegacyFilterRules( + filterRulesFromQueryParams + ) return filterRulesFromQueryParams }