@@ -11,7 +11,9 @@ import type {SearchDataTypes} from '@src/types/onyx/SearchResults';
11
11
import * as CardUtils from './CardUtils' ;
12
12
import * as CurrencyUtils from './CurrencyUtils' ;
13
13
import localeCompare from './LocaleCompare' ;
14
+ import Log from './Log' ;
14
15
import { validateAmount } from './MoneyRequestUtils' ;
16
+ import * as PersonalDetailsUtils from './PersonalDetailsUtils' ;
15
17
import { getTagNamesFromTagsLists } from './PolicyUtils' ;
16
18
import * as ReportUtils from './ReportUtils' ;
17
19
import * as searchParser from './SearchParser/searchParser' ;
@@ -163,21 +165,32 @@ function getFilters(queryJSON: SearchQueryJSON) {
163
165
}
164
166
165
167
/**
166
- * Returns an updated amount value for query filters, correctly formatted to "backend" amount
168
+ * @private
169
+ * Returns an updated filter value for some query filters.
170
+ * - for `AMOUNT` it formats value to "backend" amount
171
+ * - for personal filters it tries to substitute any user emails with accountIDs
167
172
*/
168
- function getUpdatedAmountValue ( filterName : ValueOf < typeof CONST . SEARCH . SYNTAX_FILTER_KEYS > , filter : string | string [ ] ) {
169
- if ( filterName !== CONST . SEARCH . SYNTAX_FILTER_KEYS . AMOUNT ) {
170
- return filter ;
173
+ function getUpdatedFilterValue ( filterName : ValueOf < typeof CONST . SEARCH . SYNTAX_FILTER_KEYS > , filterValue : string | string [ ] ) {
174
+ if ( filterName === CONST . SEARCH . SYNTAX_FILTER_KEYS . FROM || filterName === CONST . SEARCH . SYNTAX_FILTER_KEYS . TO ) {
175
+ if ( typeof filterValue === 'string' ) {
176
+ return PersonalDetailsUtils . getPersonalDetailByEmail ( filterValue ) ?. accountID . toString ( ) ?? filterValue ;
177
+ }
178
+
179
+ return filterValue . map ( ( email ) => PersonalDetailsUtils . getPersonalDetailByEmail ( email ) ?. accountID . toString ( ) ?? email ) ;
171
180
}
172
181
173
- if ( typeof filter === 'string' ) {
174
- const backendAmount = CurrencyUtils . convertToBackendAmount ( Number ( filter ) ) ;
175
- return Number . isNaN ( backendAmount ) ? filter : backendAmount . toString ( ) ;
182
+ if ( filterName === CONST . SEARCH . SYNTAX_FILTER_KEYS . AMOUNT ) {
183
+ if ( typeof filterValue === 'string' ) {
184
+ const backendAmount = CurrencyUtils . convertToBackendAmount ( Number ( filterValue ) ) ;
185
+ return Number . isNaN ( backendAmount ) ? filterValue : backendAmount . toString ( ) ;
186
+ }
187
+ return filterValue . map ( ( amount ) => {
188
+ const backendAmount = CurrencyUtils . convertToBackendAmount ( Number ( amount ) ) ;
189
+ return Number . isNaN ( backendAmount ) ? amount : backendAmount . toString ( ) ;
190
+ } ) ;
176
191
}
177
- return filter . map ( ( amount ) => {
178
- const backendAmount = CurrencyUtils . convertToBackendAmount ( Number ( amount ) ) ;
179
- return Number . isNaN ( backendAmount ) ? amount : backendAmount . toString ( ) ;
180
- } ) ;
192
+
193
+ return filterValue ;
181
194
}
182
195
183
196
/**
@@ -266,7 +279,7 @@ function buildSearchQueryString(queryJSON?: SearchQueryJSON) {
266
279
267
280
for ( const filter of filters ) {
268
281
const filterValueString = buildFilterValuesString ( filter . key , filter . filters ) ;
269
- queryParts . push ( filterValueString ) ;
282
+ queryParts . push ( filterValueString . trim ( ) ) ;
270
283
}
271
284
272
285
return queryParts . join ( ' ' ) ;
@@ -625,6 +638,26 @@ function traverseAndUpdatedQuery(queryJSON: SearchQueryJSON, computeNodeValue: (
625
638
return standardQuery ;
626
639
}
627
640
641
+ /**
642
+ * Returns new string query, after parsing it and traversing to update some filter values.
643
+ * If there are any personal emails, it will try to substitute them with accountIDs
644
+ */
645
+ function getQueryWithUpdatedValues ( query : string , policyID ?: string ) {
646
+ const queryJSON = buildSearchQueryJSON ( query ) ;
647
+
648
+ if ( ! queryJSON ) {
649
+ Log . alert ( `${ CONST . ERROR . ENSURE_BUGBOT } user query failed to parse` , { } , false ) ;
650
+ return ;
651
+ }
652
+
653
+ if ( policyID ) {
654
+ queryJSON . policyID = policyID ;
655
+ }
656
+
657
+ const standardizedQuery = traverseAndUpdatedQuery ( queryJSON , getUpdatedFilterValue ) ;
658
+ return buildSearchQueryString ( standardizedQuery ) ;
659
+ }
660
+
628
661
export {
629
662
buildSearchQueryJSON ,
630
663
buildSearchQueryString ,
@@ -635,7 +668,6 @@ export {
635
668
getPolicyIDFromSearchQuery ,
636
669
buildCannedSearchQuery ,
637
670
isCannedSearchQuery ,
638
- traverseAndUpdatedQuery ,
639
- getUpdatedAmountValue ,
640
671
sanitizeSearchValue ,
672
+ getQueryWithUpdatedValues ,
641
673
} ;
0 commit comments