@@ -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 ) {
@@ -431,8 +437,8 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
431437 }
432438
433439 if ( policyID ) {
434- const sanitizedPolicyID = sanitizeSearchValue ( policyID ) ;
435- filtersString . push ( `${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ sanitizedPolicyID } ` ) ;
440+ const sanitizedPolicyIDs = Array . isArray ( policyID ) ? policyID . map ( ( id ) => sanitizeSearchValue ( id ) ) . join ( ',' ) : sanitizeSearchValue ( policyID ) ;
441+ filtersString . push ( `${ CONST . SEARCH . SYNTAX_FILTER_KEYS . POLICY_ID } :${ sanitizedPolicyIDs } ` ) ;
436442 }
437443
438444 const mappedFilters = Object . entries ( otherFilters )
@@ -481,6 +487,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
481487 filterKey === FILTER_KEYS . FEED ||
482488 filterKey === FILTER_KEYS . IN ||
483489 filterKey === FILTER_KEYS . ASSIGNEE ||
490+ filterKey === FILTER_KEYS . POLICY_ID ||
484491 filterKey === FILTER_KEYS . EXPORTER ) &&
485492 Array . isArray ( filterValue ) &&
486493 filterValue . length > 0
@@ -510,6 +517,18 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial<SearchAdvanc
510517 return filtersString . filter ( Boolean ) . join ( ' ' ) . trim ( ) ;
511518}
512519
520+ function getAllPolicyValues < T extends OnyxCollectionKey > (
521+ policyID : string [ ] | undefined ,
522+ key : T ,
523+ policyData : OnyxCollection < OnyxCollectionValuesMapping [ T ] > ,
524+ ) : Array < OnyxCollectionValuesMapping [ T ] > {
525+ if ( ! policyData || ! policyID ) {
526+ return [ ] ;
527+ }
528+
529+ return policyID . map ( ( id ) => policyData ?. [ `${ key } ${ id } ` ] ) . filter ( ( data ) => ! ! data ) as Array < OnyxCollectionValuesMapping [ T ] > ;
530+ }
531+
513532/**
514533 * Generates object with search filter values, in a format that can be consumed by SearchAdvancedFiltersForm.
515534 * Main usage of this is to generate the initial values for AdvancedFilters from existing query.
@@ -578,7 +597,9 @@ function buildFilterFormValuesFromQuery(
578597 }
579598 if ( filterKey === CONST . SEARCH . SYNTAX_FILTER_KEYS . TAG ) {
580599 const tags = policyID
581- ? getTagNamesFromTagsLists ( policyTags ?. [ `${ ONYXKEYS . COLLECTION . POLICY_TAGS } ${ policyID } ` ] ?? { } )
600+ ? getAllPolicyValues ( policyID , ONYXKEYS . COLLECTION . POLICY_TAGS , policyTags )
601+ . map ( ( tagList ) => getTagNamesFromTagsLists ( tagList ?? { } ) )
602+ . flat ( )
582603 : Object . values ( policyTags ?? { } )
583604 . filter ( ( item ) => ! ! item )
584605 . map ( ( tagList ) => getTagNamesFromTagsLists ( tagList ?? { } ) )
@@ -589,7 +610,9 @@ function buildFilterFormValuesFromQuery(
589610 }
590611 if ( filterKey === CONST . SEARCH . SYNTAX_FILTER_KEYS . CATEGORY ) {
591612 const categories = policyID
592- ? Object . values ( policyCategories ?. [ `${ ONYXKEYS . COLLECTION . POLICY_CATEGORIES } ${ policyID } ` ] ?? { } ) . map ( ( category ) => category . name )
613+ ? getAllPolicyValues ( policyID , ONYXKEYS . COLLECTION . POLICY_CATEGORIES , policyCategories )
614+ . map ( ( item ) => Object . values ( item ?? { } ) . map ( ( category ) => category . name ) )
615+ . flat ( )
593616 : Object . values ( policyCategories ?? { } )
594617 . map ( ( item ) => Object . values ( item ?? { } ) . map ( ( category ) => category . name ) )
595618 . flat ( ) ;
@@ -754,8 +777,7 @@ function buildUserReadableQueryString(
754777 }
755778
756779 if ( policyID ) {
757- const workspace = policies ?. [ `${ ONYXKEYS . COLLECTION . POLICY } ${ policyID } ` ] ?. name ?? policyID ;
758- title += ` workspace:${ sanitizeSearchValue ( workspace ) } ` ;
780+ title += ` workspace:${ policyID . map ( ( id ) => sanitizeSearchValue ( policies ?. [ `${ ONYXKEYS . COLLECTION . POLICY } ${ id } ` ] ?. name ?? id ) ) . join ( ',' ) } ` ;
759781 }
760782
761783 for ( const filterObject of filters ) {
@@ -991,4 +1013,5 @@ export {
9911013 isDefaultExpensesQuery ,
9921014 sortOptionsWithEmptyValue ,
9931015 shouldHighlight ,
1016+ getAllPolicyValues ,
9941017} ;
0 commit comments