@@ -15,6 +15,7 @@ import type {
1515} from '@components/Search/types' ;
1616import CONST from '@src/CONST' ;
1717import NAVIGATORS from '@src/NAVIGATORS' ;
18+ import type { OnyxCollectionKey , OnyxCollectionValuesMapping } from '@src/ONYXKEYS' ;
1819import ONYXKEYS from '@src/ONYXKEYS' ;
1920import SCREENS from '@src/SCREENS' ;
2021import type { SearchAdvancedFiltersForm } from '@src/types/form' ;
@@ -295,7 +296,7 @@ function getQueryHashes(query: SearchQueryJSON): {primaryHash: number; recentSea
295296 orderedQuery += ` ${ CONST . SEARCH . SYNTAX_ROOT_KEYS . SORT_BY } :${ query . sortBy } ` ;
296297 orderedQuery += ` ${ CONST . SEARCH . SYNTAX_ROOT_KEYS . SORT_ORDER } :${ query . sortOrder } ` ;
297298 if ( query . policyID ) {
298- orderedQuery += ` ${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ query . policyID } ` ;
299+ orderedQuery += ` ${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ Array . isArray ( query . policyID ) ? query . policyID . join ( ',' ) : query . policyID } ` ;
299300 }
300301 const primaryHash = hashText ( orderedQuery , 2 ** 32 ) ;
301302
@@ -334,6 +335,11 @@ function buildSearchQueryJSON(query: SearchQueryString) {
334335 result . hash = primaryHash ;
335336 result . recentSearchHash = recentSearchHash ;
336337
338+ if ( result . policyID && typeof result . policyID === 'string' ) {
339+ // Ensure policyID is always an array for consistency
340+ result . policyID = [ result . policyID ] ;
341+ }
342+
337343 return result ;
338344 } catch ( e ) {
339345 console . error ( `Error when parsing SearchQuery: "${ query } "` , e ) ;
@@ -364,7 +370,7 @@ function buildSearchQueryString(queryJSON?: SearchQueryJSON) {
364370 }
365371
366372 if ( queryJSON ?. policyID ) {
367- queryParts . push ( `${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ queryJSON . policyID } ` ) ;
373+ queryParts . push ( `${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ Array . isArray ( queryJSON . policyID ) ? queryJSON . policyID . join ( ',' ) : queryJSON . policyID } ` ) ;
368374 }
369375
370376 if ( ! queryJSON ) {
@@ -402,7 +408,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
402408 } ) ;
403409
404410 // We separate type and status filters from other filters to maintain hashes consistency for saved searches
405- const { type, status, policyID , groupBy, ...otherFilters } = supportedFilterValues ;
411+ const { type, status, groupBy, ...otherFilters } = supportedFilterValues ;
406412 const filtersString : string [ ] = [ ] ;
407413
408414 filtersString . push ( `${ CONST . SEARCH . SYNTAX_ROOT_KEYS . SORT_BY } :${ CONST . SEARCH . TABLE_COLUMNS . DATE } ` ) ;
@@ -428,11 +434,6 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
428434 filtersString . push ( `${ CONST . SEARCH . SYNTAX_ROOT_KEYS . STATUS } :${ filterValueArray . map ( sanitizeSearchValue ) . join ( ',' ) } ` ) ;
429435 }
430436
431- if ( policyID ) {
432- const sanitizedPolicyID = sanitizeSearchValue ( policyID ) ;
433- filtersString . push ( `${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ sanitizedPolicyID } ` ) ;
434- }
435-
436437 const mappedFilters = Object . entries ( otherFilters )
437438 . map ( ( [ filterKey , filterValue ] ) => {
438439 if (
@@ -479,6 +480,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
479480 filterKey === FILTER_KEYS . FEED ||
480481 filterKey === FILTER_KEYS . IN ||
481482 filterKey === FILTER_KEYS . ASSIGNEE ||
483+ filterKey === FILTER_KEYS . POLICY_ID ||
482484 filterKey === FILTER_KEYS . EXPORTER ) &&
483485 Array . isArray ( filterValue ) &&
484486 filterValue . length > 0
@@ -508,6 +510,18 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
508510 return filtersString . filter ( Boolean ) . join ( ' ' ) . trim ( ) ;
509511}
510512
513+ function getAllPolicyValues < T extends OnyxCollectionKey > (
514+ policyID : string [ ] | undefined ,
515+ key : T ,
516+ policyData : OnyxCollection < OnyxCollectionValuesMapping [ T ] > ,
517+ ) : Array < OnyxCollectionValuesMapping [ T ] > {
518+ if ( ! policyData || ! policyID ) {
519+ return [ ] ;
520+ }
521+
522+ return policyID . map ( ( id ) => policyData ?. [ `${ key } ${ id } ` ] ) . filter ( ( data ) => ! ! data ) as Array < OnyxCollectionValuesMapping [ T ] > ;
523+ }
524+
511525/**
512526 * Generates object with search filter values, in a format that can be consumed by SearchAdvancedFiltersForm.
513527 * Main usage of this is to generate the initial values for AdvancedFilters from existing query.
@@ -576,7 +590,9 @@ function buildFilterFormValuesFromQuery(
576590 }
577591 if ( filterKey === CONST . SEARCH . SYNTAX_FILTER_KEYS . TAG ) {
578592 const tags = policyID
579- ? getTagNamesFromTagsLists ( policyTags ?. [ `${ ONYXKEYS . COLLECTION . POLICY_TAGS } ${ policyID } ` ] ?? { } )
593+ ? getAllPolicyValues ( policyID , ONYXKEYS . COLLECTION . POLICY_TAGS , policyTags )
594+ . map ( ( tagList ) => getTagNamesFromTagsLists ( tagList ?? { } ) )
595+ . flat ( )
580596 : Object . values ( policyTags ?? { } )
581597 . filter ( ( item ) => ! ! item )
582598 . map ( ( tagList ) => getTagNamesFromTagsLists ( tagList ?? { } ) )
@@ -587,7 +603,9 @@ function buildFilterFormValuesFromQuery(
587603 }
588604 if ( filterKey === CONST . SEARCH . SYNTAX_FILTER_KEYS . CATEGORY ) {
589605 const categories = policyID
590- ? Object . values ( policyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } ) . map ( ( category ) => category . name )
606+ ? getAllPolicyValues ( policyID , ONYXKEYS . COLLECTION . POLICY_CATEGORIES , policyCategories )
607+ . map ( ( item ) => Object . values ( item ?? { } ) . map ( ( category ) => category . name ) )
608+ . flat ( )
591609 : Object . values ( policyCategories ?? { } )
592610 . map ( ( item ) => Object . values ( item ?? { } ) . map ( ( category ) => category . name ) )
593611 . flat ( ) ;
@@ -739,9 +757,8 @@ function buildUserReadableQueryString(
739757 title += ` group-by:${ groupBy } ` ;
740758 }
741759
742- if ( policyID ) {
743- const workspace = policies ?. [ `${ ONYXKEYS . COLLECTION . POLICY } ${ policyID } ` ] ?. name ?? policyID ;
744- title += ` workspace:${ sanitizeSearchValue ( workspace ) } ` ;
760+ if ( policyID && policyID . length > 0 ) {
761+ title += ` workspace:${ policyID . map ( ( id ) => sanitizeSearchValue ( policies ?. [ `${ ONYXKEYS . COLLECTION . POLICY } ${ id } ` ] ?. name ?? id ) ) . join ( ',' ) } ` ;
745762 }
746763
747764 for ( const filterObject of filters ) {
@@ -977,4 +994,5 @@ export {
977994 isDefaultExpensesQuery ,
978995 sortOptionsWithEmptyValue ,
979996 shouldHighlight ,
997+ getAllPolicyValues ,
980998} ;
0 commit comments