From 6e9c660d536de1ffccab99a163817440231dc10e Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Thu, 28 Aug 2025 12:27:39 -0400 Subject: [PATCH 01/19] add to filters --- src/CONST/index.ts | 4 ++++ src/types/form/SearchAdvancedFiltersForm.ts | 6 ++++++ 2 files changed, 10 insertions(+) diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 9d63fec91d0d..a02013eb544a 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6513,6 +6513,8 @@ const CONST = { BILLABLE: 'billable', POLICY_ID: 'policyID', ACTION: 'action', + PURCHASE_AMOUNT: 'purchaseAmount', + PURCHASE_CURRENCY: 'purchaseCurrency', }, TAG_EMPTY_VALUE: 'none', CATEGORY_EMPTY_VALUE: 'none,Uncategorized', @@ -6560,6 +6562,8 @@ const CONST = { REIMBURSABLE: 'reimbursable', BILLABLE: 'billable', ACTION: 'action', + PURCHASE_AMOUNT: 'purchase-amount', + PURCHASE_CURRENCY: 'purchase-currency', }, // Maps an internal search value to the user friendly display text, e.g. `perDiem` -> `per-diem` diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index 7682d63e5536..bcc56c9e1b85 100644 --- a/src/types/form/SearchAdvancedFiltersForm.ts +++ b/src/types/form/SearchAdvancedFiltersForm.ts @@ -67,6 +67,9 @@ const FILTER_KEYS = { REIMBURSABLE: 'reimbursable', BILLABLE: 'billable', ACTION: 'action', + PURCHASE_AMOUNT_LESS_THAN: 'purchaseAmountLessThan', + PURCHASE_AMOUNT_GREATER_THAN: 'purchaseAmountGreaterThan', + PURCHASE_CURRENCY: 'purchaseCurrency', } as const; const ALLOWED_TYPE_FILTERS = { @@ -296,6 +299,9 @@ type SearchAdvancedFiltersForm = Form< [FILTER_KEYS.REIMBURSABLE]: string; [FILTER_KEYS.BILLABLE]: string; [FILTER_KEYS.ACTION]: string; + [FILTER_KEYS.PURCHASE_AMOUNT_GREATER_THAN]: string; + [FILTER_KEYS.PURCHASE_AMOUNT_LESS_THAN]: string; + [FILTER_KEYS.PURCHASE_CURRENCY]: string[]; } >; From e8d577e0ed4e21c822c3efda6029c24970538a4f Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Thu, 28 Aug 2025 12:28:29 -0400 Subject: [PATCH 02/19] add to consts --- src/types/form/SearchAdvancedFiltersForm.ts | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index bcc56c9e1b85..80298336c313 100644 --- a/src/types/form/SearchAdvancedFiltersForm.ts +++ b/src/types/form/SearchAdvancedFiltersForm.ts @@ -124,6 +124,9 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.GROUP_BY, FILTER_KEYS.FEED, FILTER_KEYS.ACTION, + FILTER_KEYS.PURCHASE_AMOUNT_GREATER_THAN, + FILTER_KEYS.PURCHASE_AMOUNT_LESS_THAN, + FILTER_KEYS.PURCHASE_CURRENCY, ], [CONST.SEARCH.DATA_TYPES.INVOICE]: [ FILTER_KEYS.TYPE, @@ -170,6 +173,9 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.EXPORTED_ON, FILTER_KEYS.EXPORTER, FILTER_KEYS.ACTION, + FILTER_KEYS.PURCHASE_AMOUNT_GREATER_THAN, + FILTER_KEYS.PURCHASE_AMOUNT_LESS_THAN, + FILTER_KEYS.PURCHASE_CURRENCY, ], [CONST.SEARCH.DATA_TYPES.TRIP]: [ FILTER_KEYS.TYPE, @@ -215,6 +221,9 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.GROUP_BY, FILTER_KEYS.FEED, FILTER_KEYS.ACTION, + FILTER_KEYS.PURCHASE_AMOUNT_GREATER_THAN, + FILTER_KEYS.PURCHASE_AMOUNT_LESS_THAN, + FILTER_KEYS.PURCHASE_CURRENCY, ], [CONST.SEARCH.DATA_TYPES.CHAT]: [ FILTER_KEYS.TYPE, From e24f6fd7e66acdd3247f4d8e3410f3041b126e1d Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Thu, 28 Aug 2025 12:33:42 -0400 Subject: [PATCH 03/19] add purchase amount to display didle --- src/ROUTES.ts | 2 ++ src/languages/en.ts | 7 +++++++ src/pages/Search/AdvancedSearchFilters.tsx | 18 ++++++++++++++++-- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 4acbbe6c2f51..203f434700f3 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -92,6 +92,8 @@ const ROUTES = { SEARCH_ADVANCED_FILTERS_REIMBURSABLE: 'search/filters/reimbursable', SEARCH_ADVANCED_FILTERS_BILLABLE: 'search/filters/billable', SEARCH_ADVANCED_FILTERS_WORKSPACE: 'search/filters/workspace', + SEARCH_ADVANCED_FILTERS_PURCHASE_AMOUNT: 'search/filters/purchase-amount', + SEARCH_ADVANCED_FILTERS_PURCHASE_CURRENCY: 'search/filters/purchase-currency', SEARCH_REPORT: { route: 'search/view/:reportID/:reportActionID?', getRoute: ({ diff --git a/src/languages/en.ts b/src/languages/en.ts index b6dcca1f04c5..1bd24619f38f 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -648,6 +648,7 @@ const translations = { merge: 'Merge', unstableInternetConnection: 'Unstable internet connection. Please check your network and try again.', enableGlobalReimbursements: 'Enable Global Reimbursements', + purchaseAmount: 'Purchase amount', }, supportalNoAccess: { title: 'Not so fast', @@ -6104,6 +6105,12 @@ const translations = { withdrawn: 'Withdrawn', billable: 'Billable', reimbursable: 'Reimbursable', + purchaseAmount: { + lessThan: ({amount}: OptionalParam = {}) => `Less than ${amount ?? ''}`, + greaterThan: ({amount}: OptionalParam = {}) => `Greater than ${amount ?? ''}`, + between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Between ${greaterThan} and ${lessThan}`, + }, + purchaseCurrency: 'Purchase currency', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Report', [CONST.SEARCH.GROUP_BY.FROM]: 'From', diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index b88abf87438d..f300c14fffcd 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -210,6 +210,16 @@ const baseFilterConfig = { description: 'workspace.common.workspace' as const, route: ROUTES.SEARCH_ADVANCED_FILTERS_WORKSPACE, }, + purchaseAmount: { + getTitle: getFilterDisplayTitle, + description: 'common.purchaseAmount' as const, + route: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_AMOUNT, + }, + purchaseCurrency: { + getTitle: getFilterDisplayTitle, + description: 'search.filters.purchaseCurrency' as const, + route: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_CURRENCY, + }, }; function getFilterWorkspaceDisplayTitle(filters: SearchAdvancedFiltersForm, policies: WorkspaceListItem[]) { @@ -298,7 +308,11 @@ function getFilterDisplayTitle( const nonDateFilterKey = filterKey as Exclude; - if (nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL) { + if ( + nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || + nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL || + nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT + ) { const lessThanKey = `${nonDateFilterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.LESS_THAN}` as keyof SearchAdvancedFiltersForm; const greaterThanKey = `${nonDateFilterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.GREATER_THAN}` as keyof SearchAdvancedFiltersForm; @@ -321,7 +335,7 @@ function getFilterDisplayTitle( return; } - if (nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY && filters[nonDateFilterKey]) { + if ((nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY || nonDateFilterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY) && filters[nonDateFilterKey]) { const filterArray = filters[nonDateFilterKey] ?? []; return filterArray.sort(localeCompare).join(', '); } From b107ee1ec7a8a67d3ac107acdb636b276ea3236f Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Thu, 28 Aug 2025 14:37:52 -0400 Subject: [PATCH 04/19] add more amount params --- src/components/Search/types.ts | 2 +- src/hooks/useAdvancedSearchFilters.ts | 2 ++ src/libs/SearchQueryUtils.ts | 8 ++++---- src/pages/Search/AdvancedSearchFilters.tsx | 3 ++- .../SearchFiltersPurchaseAmountPage.tsx | 17 +++++++++++++++++ 5 files changed, 26 insertions(+), 6 deletions(-) create mode 100644 src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index 45abeb4cb8f6..dbbe2207afd8 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -127,7 +127,7 @@ type SearchDateFilterKeys = | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN; -type SearchAmountFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL; +type SearchAmountFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT; type SearchFilterKey = | ValueOf diff --git a/src/hooks/useAdvancedSearchFilters.ts b/src/hooks/useAdvancedSearchFilters.ts index 38e78db2c71c..2454343f0763 100644 --- a/src/hooks/useAdvancedSearchFilters.ts +++ b/src/hooks/useAdvancedSearchFilters.ts @@ -35,6 +35,8 @@ const typeFiltersKeys = { CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT, CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY, CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY, CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG, CONST.SEARCH.SYNTAX_FILTER_KEYS.DESCRIPTION, diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index 9dd0aeb51dd0..f4c30f2dfbaa 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -255,7 +255,7 @@ function getUpdatedFilterValue(filterName: ValueOf getPersonalDetailByEmail(email)?.accountID.toString() ?? email); } - if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL) { + if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT) { if (typeof filterValue === 'string') { const backendAmount = convertToBackendAmount(Number(filterValue)); return Number.isNaN(backendAmount) ? filterValue : backendAmount.toString(); @@ -555,7 +555,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial { + [CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL, CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT, CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT].forEach((filterKey) => { const amountFilter = buildAmountFilterQuery(filterKey, supportedFilterValues); filtersString.push(amountFilter); }); @@ -703,7 +703,7 @@ function buildFilterFormValuesFromQuery( filtersForm[afterKey] = afterFilter?.value.toString() ?? filtersForm[afterKey]; filtersForm[onKey] = onFilter?.value.toString() ?? filtersForm[onKey]; } - if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL) { + if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT) { // backend amount is an integer and is 2 digits longer than frontend amount filtersForm[`${filterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.LESS_THAN}`] = filterList.find((filter) => filter.operator === 'lt' && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2))?.value.toString() ?? @@ -779,7 +779,7 @@ function getFilterDisplayValue( if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN) { return getReportName(reports?.[`${ONYXKEYS.COLLECTION.REPORT}${filterValue}`]) || filterValue; } - if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL) { + if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL || filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT) { const frontendAmount = convertToFrontendAmountAsInteger(Number(filterValue)); return Number.isNaN(frontendAmount) ? filterValue : frontendAmount.toString(); } diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index f300c14fffcd..d8310e127ae6 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -524,7 +524,8 @@ function AdvancedSearchFilters() { key === CONST.SEARCH.SYNTAX_FILTER_KEYS.REIMBURSABLE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.BILLABLE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE || - key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TYPE + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TYPE || + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT ) { filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, key, translate, localeCompare); } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY) { diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx new file mode 100644 index 000000000000..4c04a6440981 --- /dev/null +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import SearchFiltersPurchaseAmountBase from '@components/Search/SearchFiltersAmountBase'; +import CONST from '@src/CONST'; + +function SearchFiltersPurchaseAmountPage() { + return ( + + ); +} + +SearchFiltersPurchaseAmountPage.displayName = 'SearchFiltersPurchaseAmountPage'; + +export default SearchFiltersPurchaseAmountPage; From ac5559fddab98d3a47c87019b47be72e1d5b6b90 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 07:27:05 -0400 Subject: [PATCH 05/19] add currency --- src/components/Search/SearchAutocompleteList.tsx | 3 ++- src/hooks/useAdvancedSearchFilters.ts | 4 ++++ src/libs/SearchAutocompleteUtils.ts | 1 + src/libs/SearchQueryUtils.ts | 3 ++- src/pages/Search/AdvancedSearchFilters.tsx | 3 ++- 5 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 8508bc2527f7..a37b5aafef2f 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -331,7 +331,8 @@ function SearchAutocompleteList( })); } case CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY: - case CONST.SEARCH.SYNTAX_FILTER_KEYS.GROUP_CURRENCY: { + case CONST.SEARCH.SYNTAX_FILTER_KEYS.GROUP_CURRENCY: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY: { const autocompleteList = autocompleteValue ? currencyAutocompleteList : (recentCurrencyAutocompleteList ?? []); const filteredCurrencies = autocompleteList .filter((currency) => currency.toLowerCase().includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.includes(currency.toLowerCase())) diff --git a/src/hooks/useAdvancedSearchFilters.ts b/src/hooks/useAdvancedSearchFilters.ts index 2454343f0763..c594430bc219 100644 --- a/src/hooks/useAdvancedSearchFilters.ts +++ b/src/hooks/useAdvancedSearchFilters.ts @@ -71,6 +71,8 @@ const typeFiltersKeys = { CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT, CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY, CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY, CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG, CONST.SEARCH.SYNTAX_FILTER_KEYS.DESCRIPTION, @@ -105,6 +107,8 @@ const typeFiltersKeys = { CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT, CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT, + CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY, CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY, CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG, CONST.SEARCH.SYNTAX_FILTER_KEYS.DESCRIPTION, diff --git a/src/libs/SearchAutocompleteUtils.ts b/src/libs/SearchAutocompleteUtils.ts index 2306c2e34c74..8659fafd9752 100644 --- a/src/libs/SearchAutocompleteUtils.ts +++ b/src/libs/SearchAutocompleteUtils.ts @@ -159,6 +159,7 @@ function filterOutRangesWithCorrectValue( case CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY: case CONST.SEARCH.SYNTAX_FILTER_KEYS.GROUP_CURRENCY: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY: return currencyList.get().includes(range.value); case CONST.SEARCH.SYNTAX_ROOT_KEYS.TYPE: return typeList.includes(range.value); diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index f4c30f2dfbaa..e223fd3a936f 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -526,6 +526,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial personalDetails && personalDetails[id]); } - if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY) { + if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY) { const validCurrency = new Set(Object.keys(currencyList)); filtersForm[filterKey] = filterValues.filter((currency) => validCurrency.has(currency)); } diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index d8310e127ae6..0ccb1a07934c 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -525,7 +525,8 @@ function AdvancedSearchFilters() { key === CONST.SEARCH.SYNTAX_FILTER_KEYS.BILLABLE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TYPE || - key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT || + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY ) { filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, key, translate, localeCompare); } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY) { From d04199ad859cf5c70851dbe6157b52029024f289 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 07:29:18 -0400 Subject: [PATCH 06/19] add peggy --- src/libs/SearchParser/autocompleteParser.js | 382 +++++++++++------- .../SearchParser/autocompleteParser.peggy | 2 + src/libs/SearchParser/baseRules.peggy | 2 + src/libs/SearchParser/searchParser.js | 382 +++++++++++------- src/libs/SearchParser/searchParser.peggy | 2 + 5 files changed, 462 insertions(+), 308 deletions(-) diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index 0a721edbce00..76db4aca8f6c 100644 --- a/src/libs/SearchParser/autocompleteParser.js +++ b/src/libs/SearchParser/autocompleteParser.js @@ -234,20 +234,24 @@ function peg$parse(input, options) { var peg$c48 = "created-by"; var peg$c49 = "action"; var peg$c50 = "total"; - var peg$c51 = "perdiem"; - var peg$c52 = "per-diem"; - var peg$c53 = "reports"; - var peg$c54 = "report"; - var peg$c55 = "drafts"; - var peg$c56 = "draft"; - var peg$c57 = "!="; - var peg$c58 = ">="; - var peg$c59 = ">"; - var peg$c60 = "<="; - var peg$c61 = "<"; - var peg$c62 = "\u201C"; - var peg$c63 = "\u201D"; - var peg$c64 = "\""; + var peg$c51 = "purchaseamount"; + var peg$c52 = "purchase-amount"; + var peg$c53 = "purchasecurrency"; + var peg$c54 = "purchase-currency"; + var peg$c55 = "perdiem"; + var peg$c56 = "per-diem"; + var peg$c57 = "reports"; + var peg$c58 = "report"; + var peg$c59 = "drafts"; + var peg$c60 = "draft"; + var peg$c61 = "!="; + var peg$c62 = ">="; + var peg$c63 = ">"; + var peg$c64 = "<="; + var peg$c65 = "<"; + var peg$c66 = "\u201C"; + var peg$c67 = "\u201D"; + var peg$c68 = "\""; var peg$r0 = /^[:=]/; var peg$r1 = /^[^ ,\t\n\r\xA0]/; @@ -313,36 +317,40 @@ function peg$parse(input, options) { var peg$e49 = peg$literalExpectation("created-by", true); var peg$e50 = peg$literalExpectation("action", true); var peg$e51 = peg$literalExpectation("total", true); - var peg$e52 = peg$literalExpectation("perDiem", true); - var peg$e53 = peg$literalExpectation("per-diem", true); - var peg$e54 = peg$literalExpectation("reports", true); - var peg$e55 = peg$literalExpectation("report", true); - var peg$e56 = peg$literalExpectation("drafts", true); - var peg$e57 = peg$literalExpectation("draft", true); - var peg$e58 = peg$otherExpectation("operator"); - var peg$e59 = peg$classExpectation([":", "="], false, false); - var peg$e60 = peg$literalExpectation("!=", false); - var peg$e61 = peg$literalExpectation(">=", false); - var peg$e62 = peg$literalExpectation(">", false); - var peg$e63 = peg$literalExpectation("<=", false); - var peg$e64 = peg$literalExpectation("<", false); - var peg$e65 = peg$otherExpectation("word"); - var peg$e66 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e67 = peg$otherExpectation("whitespace"); - var peg$e68 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e69 = peg$otherExpectation("quote"); - var peg$e70 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e71 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e72 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e73 = peg$literalExpectation("\u201C", false); - var peg$e74 = peg$literalExpectation("\u201D", false); - var peg$e75 = peg$literalExpectation("\"", false); - var peg$e76 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e77 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e78 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e79 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e80 = peg$anyExpectation(); - var peg$e81 = peg$classExpectation([","], false, false); + var peg$e52 = peg$literalExpectation("purchaseAmount", true); + var peg$e53 = peg$literalExpectation("purchase-amount", true); + var peg$e54 = peg$literalExpectation("purchaseCurrency", true); + var peg$e55 = peg$literalExpectation("purchase-currency", true); + var peg$e56 = peg$literalExpectation("perDiem", true); + var peg$e57 = peg$literalExpectation("per-diem", true); + var peg$e58 = peg$literalExpectation("reports", true); + var peg$e59 = peg$literalExpectation("report", true); + var peg$e60 = peg$literalExpectation("drafts", true); + var peg$e61 = peg$literalExpectation("draft", true); + var peg$e62 = peg$otherExpectation("operator"); + var peg$e63 = peg$classExpectation([":", "="], false, false); + var peg$e64 = peg$literalExpectation("!=", false); + var peg$e65 = peg$literalExpectation(">=", false); + var peg$e66 = peg$literalExpectation(">", false); + var peg$e67 = peg$literalExpectation("<=", false); + var peg$e68 = peg$literalExpectation("<", false); + var peg$e69 = peg$otherExpectation("word"); + var peg$e70 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e71 = peg$otherExpectation("whitespace"); + var peg$e72 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e73 = peg$otherExpectation("quote"); + var peg$e74 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e75 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e76 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e77 = peg$literalExpectation("\u201C", false); + var peg$e78 = peg$literalExpectation("\u201D", false); + var peg$e79 = peg$literalExpectation("\"", false); + var peg$e80 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e81 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e82 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e83 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e84 = peg$anyExpectation(); + var peg$e85 = peg$classExpectation([","], false, false); var peg$f0 = function(ranges) { return { autocomplete, ranges }; }; var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); }; @@ -436,31 +444,33 @@ function peg$parse(input, options) { var peg$f42 = function() { return "createdBy"; }; var peg$f43 = function() { return "action"; }; var peg$f44 = function() {return "total"; }; - var peg$f45 = function() { return "perDiem"; }; - var peg$f46 = function() {return "reports"; }; - var peg$f47 = function() {return "drafts"; }; - var peg$f48 = function() { return "eq"; }; - var peg$f49 = function() { return "neq"; }; - var peg$f50 = function() { return "gte"; }; - var peg$f51 = function() { return "gt"; }; - var peg$f52 = function() { return "lte"; }; - var peg$f53 = function() { return "lt"; }; - var peg$f54 = function(o) { + var peg$f45 = function() {return "purchaseAmount"}; + var peg$f46 = function() {return "purchaseCurrency"}; + var peg$f47 = function() { return "perDiem"; }; + var peg$f48 = function() {return "reports"; }; + var peg$f49 = function() {return "drafts"; }; + var peg$f50 = function() { return "eq"; }; + var peg$f51 = function() { return "neq"; }; + var peg$f52 = function() { return "gte"; }; + var peg$f53 = function() { return "gt"; }; + var peg$f54 = function() { return "lte"; }; + var peg$f55 = function() { return "lt"; }; + var peg$f56 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f55 = function(chars) { return chars.join("").trim(); }; - var peg$f56 = function() { return "and"; }; - var peg$f57 = function() { return expectingNestedQuote; }; - var peg$f58 = function(start, inner, end) { //handle no-breaking space + var peg$f57 = function(chars) { return chars.join("").trim(); }; + var peg$f58 = function() { return "and"; }; + var peg$f59 = function() { return expectingNestedQuote; }; + var peg$f60 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f59 = function(start) {return "“"}; - var peg$f60 = function(start) {return "”"}; - var peg$f61 = function(start) {return "\""}; - var peg$f62 = function(start, inner, end) { + var peg$f61 = function(start) {return "“"}; + var peg$f62 = function(start) {return "”"}; + var peg$f63 = function(start) {return "\""}; + var peg$f64 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -801,6 +811,12 @@ function peg$parse(input, options) { s1 = peg$parsewithdrawn(); if (s1 === peg$FAILED) { s1 = peg$parseposted(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseCurrency(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseAmount(); + } + } } } } @@ -1800,6 +1816,64 @@ function peg$parse(input, options) { return s0; } + function peg$parsepurchaseAmount() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c51) { + peg$currPos += 14; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e52); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 15); + if (s1.toLowerCase() === peg$c52) { + peg$currPos += 15; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e53); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f45(); + } + s0 = s1; + } + + return s0; + } + + function peg$parsepurchaseCurrency() { + var s0, s1; + + s0 = input.substr(peg$currPos, 16); + if (s0.toLowerCase() === peg$c53) { + peg$currPos += 16; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e54); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 17); + if (s1.toLowerCase() === peg$c54) { + peg$currPos += 17; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e55); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f46(); + } + s0 = s1; + } + + return s0; + } + function peg$parsevalues() { var s0; @@ -1818,24 +1892,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c51) { + if (s0.toLowerCase() === peg$c55) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c52) { + if (s1.toLowerCase() === peg$c56) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f45(); + s1 = peg$f47(); } s0 = s1; } @@ -1847,24 +1921,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c57) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c58) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f48(); } s0 = s1; } @@ -1876,24 +1950,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 6); - if (s0.toLowerCase() === peg$c55) { + if (s0.toLowerCase() === peg$c59) { peg$currPos += 6; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c56) { + if (s1.toLowerCase() === peg$c60) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f49(); } s0 = s1; } @@ -1911,81 +1985,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(); + s1 = peg$f50(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c57) { - s1 = peg$c57; + if (input.substr(peg$currPos, 2) === peg$c61) { + s1 = peg$c61; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f49(); + s1 = peg$f51(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c58) { - s1 = peg$c58; + if (input.substr(peg$currPos, 2) === peg$c62) { + s1 = peg$c62; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f50(); + s1 = peg$f52(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c59; + s1 = peg$c63; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f51(); + s1 = peg$f53(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c60) { - s1 = peg$c60; + if (input.substr(peg$currPos, 2) === peg$c64) { + s1 = peg$c64; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f52(); + s1 = peg$f54(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c61; + s1 = peg$c65; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f53(); + s1 = peg$f55(); } s0 = s1; } @@ -1996,7 +2070,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } return s0; @@ -2009,7 +2083,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f54(s1); + s1 = peg$f56(s1); } s0 = s1; @@ -2027,7 +2101,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -2037,7 +2111,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } } } else { @@ -2045,13 +2119,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f55(s1); + s1 = peg$f57(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } return s0; @@ -2063,7 +2137,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f56(); + s1 = peg$f58(); s0 = s1; return s0; @@ -2079,7 +2153,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2088,12 +2162,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } return s0; } @@ -2103,7 +2177,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f57(); + s1 = peg$f59(); if (s1) { s1 = undefined; } else { @@ -2140,7 +2214,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2149,7 +2223,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } s2 = input.charAt(peg$currPos); @@ -2157,7 +2231,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2166,7 +2240,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2175,7 +2249,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } s4 = input.charAt(peg$currPos); @@ -2183,7 +2257,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2192,7 +2266,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2201,11 +2275,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } } peg$savedPos = s0; - s0 = peg$f58(s1, s3, s5); + s0 = peg$f60(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2217,7 +2291,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } } return s0; @@ -2234,7 +2308,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2243,7 +2317,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } s2 = input.charAt(peg$currPos); @@ -2251,7 +2325,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2260,7 +2334,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2276,15 +2350,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c62; + s6 = peg$c66; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f59(s1); + s4 = peg$f61(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2307,15 +2381,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c63; + s6 = peg$c67; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2338,15 +2412,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2365,7 +2439,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2381,15 +2455,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c62; + s6 = peg$c66; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f59(s1); + s4 = peg$f61(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2412,15 +2486,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c63; + s6 = peg$c67; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2443,15 +2517,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2467,7 +2541,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f62(s1, s3, s4); + s0 = peg$f64(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2479,7 +2553,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } } return s0; @@ -2494,7 +2568,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2532,7 +2606,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2541,7 +2615,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } } s2 = []; @@ -2550,7 +2624,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2559,7 +2633,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } } s3 = []; @@ -2568,7 +2642,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2577,7 +2651,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } } s4 = peg$parseoperator(); @@ -2596,7 +2670,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2605,7 +2679,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } } s2 = peg$currPos; @@ -2626,7 +2700,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2652,7 +2726,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } } } diff --git a/src/libs/SearchParser/autocompleteParser.peggy b/src/libs/SearchParser/autocompleteParser.peggy index ed86288bcacd..c77eee6d3b69 100644 --- a/src/libs/SearchParser/autocompleteParser.peggy +++ b/src/libs/SearchParser/autocompleteParser.peggy @@ -87,6 +87,8 @@ autocompleteKey "key" / exported / withdrawn / posted + / purchaseCurrency + / purchaseAmount ) filterKey diff --git a/src/libs/SearchParser/baseRules.peggy b/src/libs/SearchParser/baseRules.peggy index 01aa5f652954..cad60048814b 100644 --- a/src/libs/SearchParser/baseRules.peggy +++ b/src/libs/SearchParser/baseRules.peggy @@ -70,6 +70,8 @@ assignee = "assignee"i { return "assignee"; } createdBy = "createdBy"i / "created-by"i { return "createdBy"; } action = "action"i { return "action"; } total = "total"i {return "total"; } +purchaseAmount = "purchaseAmount"i / "purchase-amount"i {return "purchaseAmount"} +purchaseCurrency = "purchaseCurrency"i / "purchase-currency"i {return "purchaseCurrency"} // Value transformation rules values diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js index af24e646b83e..3b9a06c6bc81 100644 --- a/src/libs/SearchParser/searchParser.js +++ b/src/libs/SearchParser/searchParser.js @@ -235,20 +235,24 @@ function peg$parse(input, options) { var peg$c48 = "created-by"; var peg$c49 = "action"; var peg$c50 = "total"; - var peg$c51 = "perdiem"; - var peg$c52 = "per-diem"; - var peg$c53 = "reports"; - var peg$c54 = "report"; - var peg$c55 = "drafts"; - var peg$c56 = "draft"; - var peg$c57 = "!="; - var peg$c58 = ">="; - var peg$c59 = ">"; - var peg$c60 = "<="; - var peg$c61 = "<"; - var peg$c62 = "\u201C"; - var peg$c63 = "\u201D"; - var peg$c64 = "\""; + var peg$c51 = "purchaseamount"; + var peg$c52 = "purchase-amount"; + var peg$c53 = "purchasecurrency"; + var peg$c54 = "purchase-currency"; + var peg$c55 = "perdiem"; + var peg$c56 = "per-diem"; + var peg$c57 = "reports"; + var peg$c58 = "report"; + var peg$c59 = "drafts"; + var peg$c60 = "draft"; + var peg$c61 = "!="; + var peg$c62 = ">="; + var peg$c63 = ">"; + var peg$c64 = "<="; + var peg$c65 = "<"; + var peg$c66 = "\u201C"; + var peg$c67 = "\u201D"; + var peg$c68 = "\""; var peg$r0 = /^[^ \t\r\n\xA0]/; var peg$r1 = /^[:=]/; @@ -317,36 +321,40 @@ function peg$parse(input, options) { var peg$e51 = peg$literalExpectation("created-by", true); var peg$e52 = peg$literalExpectation("action", true); var peg$e53 = peg$literalExpectation("total", true); - var peg$e54 = peg$literalExpectation("perDiem", true); - var peg$e55 = peg$literalExpectation("per-diem", true); - var peg$e56 = peg$literalExpectation("reports", true); - var peg$e57 = peg$literalExpectation("report", true); - var peg$e58 = peg$literalExpectation("drafts", true); - var peg$e59 = peg$literalExpectation("draft", true); - var peg$e60 = peg$otherExpectation("operator"); - var peg$e61 = peg$classExpectation([":", "="], false, false); - var peg$e62 = peg$literalExpectation("!=", false); - var peg$e63 = peg$literalExpectation(">=", false); - var peg$e64 = peg$literalExpectation(">", false); - var peg$e65 = peg$literalExpectation("<=", false); - var peg$e66 = peg$literalExpectation("<", false); - var peg$e67 = peg$otherExpectation("word"); - var peg$e68 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e69 = peg$otherExpectation("whitespace"); - var peg$e70 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e71 = peg$otherExpectation("quote"); - var peg$e72 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e73 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e74 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e75 = peg$literalExpectation("\u201C", false); - var peg$e76 = peg$literalExpectation("\u201D", false); - var peg$e77 = peg$literalExpectation("\"", false); - var peg$e78 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e79 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e80 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e81 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e82 = peg$anyExpectation(); - var peg$e83 = peg$classExpectation([","], false, false); + var peg$e54 = peg$literalExpectation("purchaseAmount", true); + var peg$e55 = peg$literalExpectation("purchase-amount", true); + var peg$e56 = peg$literalExpectation("purchaseCurrency", true); + var peg$e57 = peg$literalExpectation("purchase-currency", true); + var peg$e58 = peg$literalExpectation("perDiem", true); + var peg$e59 = peg$literalExpectation("per-diem", true); + var peg$e60 = peg$literalExpectation("reports", true); + var peg$e61 = peg$literalExpectation("report", true); + var peg$e62 = peg$literalExpectation("drafts", true); + var peg$e63 = peg$literalExpectation("draft", true); + var peg$e64 = peg$otherExpectation("operator"); + var peg$e65 = peg$classExpectation([":", "="], false, false); + var peg$e66 = peg$literalExpectation("!=", false); + var peg$e67 = peg$literalExpectation(">=", false); + var peg$e68 = peg$literalExpectation(">", false); + var peg$e69 = peg$literalExpectation("<=", false); + var peg$e70 = peg$literalExpectation("<", false); + var peg$e71 = peg$otherExpectation("word"); + var peg$e72 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e73 = peg$otherExpectation("whitespace"); + var peg$e74 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e75 = peg$otherExpectation("quote"); + var peg$e76 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e77 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e78 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e79 = peg$literalExpectation("\u201C", false); + var peg$e80 = peg$literalExpectation("\u201D", false); + var peg$e81 = peg$literalExpectation("\"", false); + var peg$e82 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e83 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e84 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e85 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e86 = peg$anyExpectation(); + var peg$e87 = peg$classExpectation([","], false, false); var peg$f0 = function(filters) { return applyDefaults(filters); }; var peg$f1 = function(head, tail) { @@ -452,31 +460,33 @@ function peg$parse(input, options) { var peg$f43 = function() { return "createdBy"; }; var peg$f44 = function() { return "action"; }; var peg$f45 = function() {return "total"; }; - var peg$f46 = function() { return "perDiem"; }; - var peg$f47 = function() {return "reports"; }; - var peg$f48 = function() {return "drafts"; }; - var peg$f49 = function() { return "eq"; }; - var peg$f50 = function() { return "neq"; }; - var peg$f51 = function() { return "gte"; }; - var peg$f52 = function() { return "gt"; }; - var peg$f53 = function() { return "lte"; }; - var peg$f54 = function() { return "lt"; }; - var peg$f55 = function(o) { + var peg$f46 = function() {return "purchaseAmount"}; + var peg$f47 = function() {return "purchaseCurrency"}; + var peg$f48 = function() { return "perDiem"; }; + var peg$f49 = function() {return "reports"; }; + var peg$f50 = function() {return "drafts"; }; + var peg$f51 = function() { return "eq"; }; + var peg$f52 = function() { return "neq"; }; + var peg$f53 = function() { return "gte"; }; + var peg$f54 = function() { return "gt"; }; + var peg$f55 = function() { return "lte"; }; + var peg$f56 = function() { return "lt"; }; + var peg$f57 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f56 = function(chars) { return chars.join("").trim(); }; - var peg$f57 = function() { return "and"; }; - var peg$f58 = function() { return expectingNestedQuote; }; - var peg$f59 = function(start, inner, end) { //handle no-breaking space + var peg$f58 = function(chars) { return chars.join("").trim(); }; + var peg$f59 = function() { return "and"; }; + var peg$f60 = function() { return expectingNestedQuote; }; + var peg$f61 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f60 = function(start) {return "“"}; - var peg$f61 = function(start) {return "”"}; - var peg$f62 = function(start) {return "\""}; - var peg$f63 = function(start, inner, end) { + var peg$f62 = function(start) {return "“"}; + var peg$f63 = function(start) {return "”"}; + var peg$f64 = function(start) {return "\""}; + var peg$f65 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -892,6 +902,12 @@ function peg$parse(input, options) { s1 = peg$parsebillable(); if (s1 === peg$FAILED) { s1 = peg$parseaction(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseCurrency(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseAmount(); + } + } } } } @@ -1991,6 +2007,64 @@ function peg$parse(input, options) { return s0; } + function peg$parsepurchaseAmount() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c51) { + peg$currPos += 14; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e54); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 15); + if (s1.toLowerCase() === peg$c52) { + peg$currPos += 15; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e55); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f46(); + } + s0 = s1; + } + + return s0; + } + + function peg$parsepurchaseCurrency() { + var s0, s1; + + s0 = input.substr(peg$currPos, 16); + if (s0.toLowerCase() === peg$c53) { + peg$currPos += 16; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e56); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 17); + if (s1.toLowerCase() === peg$c54) { + peg$currPos += 17; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e57); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f47(); + } + s0 = s1; + } + + return s0; + } + function peg$parsevalues() { var s0; @@ -2009,24 +2083,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c51) { + if (s0.toLowerCase() === peg$c55) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c52) { + if (s1.toLowerCase() === peg$c56) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f48(); } s0 = s1; } @@ -2038,24 +2112,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c57) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c58) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f49(); } s0 = s1; } @@ -2067,24 +2141,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 6); - if (s0.toLowerCase() === peg$c55) { + if (s0.toLowerCase() === peg$c59) { peg$currPos += 6; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c56) { + if (s1.toLowerCase() === peg$c60) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(); + s1 = peg$f50(); } s0 = s1; } @@ -2102,81 +2176,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f49(); + s1 = peg$f51(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c57) { - s1 = peg$c57; + if (input.substr(peg$currPos, 2) === peg$c61) { + s1 = peg$c61; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f50(); + s1 = peg$f52(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c58) { - s1 = peg$c58; + if (input.substr(peg$currPos, 2) === peg$c62) { + s1 = peg$c62; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f51(); + s1 = peg$f53(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c59; + s1 = peg$c63; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f52(); + s1 = peg$f54(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c60) { - s1 = peg$c60; + if (input.substr(peg$currPos, 2) === peg$c64) { + s1 = peg$c64; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f53(); + s1 = peg$f55(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c61; + s1 = peg$c65; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f54(); + s1 = peg$f56(); } s0 = s1; } @@ -2187,7 +2261,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } return s0; @@ -2200,7 +2274,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f55(s1); + s1 = peg$f57(s1); } s0 = s1; @@ -2218,7 +2292,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -2228,7 +2302,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } } else { @@ -2236,13 +2310,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f56(s1); + s1 = peg$f58(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } } return s0; @@ -2254,7 +2328,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f57(); + s1 = peg$f59(); s0 = s1; return s0; @@ -2270,7 +2344,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2279,12 +2353,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } return s0; } @@ -2294,7 +2368,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f58(); + s1 = peg$f60(); if (s1) { s1 = undefined; } else { @@ -2331,7 +2405,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2340,7 +2414,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } s2 = input.charAt(peg$currPos); @@ -2348,7 +2422,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2357,7 +2431,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2366,7 +2440,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } } s4 = input.charAt(peg$currPos); @@ -2374,7 +2448,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2383,7 +2457,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2392,11 +2466,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } peg$savedPos = s0; - s0 = peg$f59(s1, s3, s5); + s0 = peg$f61(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2408,7 +2482,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } return s0; @@ -2425,7 +2499,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2434,7 +2508,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } s2 = input.charAt(peg$currPos); @@ -2442,7 +2516,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2451,7 +2525,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2467,15 +2541,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c62; + s6 = peg$c66; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2498,15 +2572,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c63; + s6 = peg$c67; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2529,15 +2603,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2556,7 +2630,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2572,15 +2646,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c62; + s6 = peg$c66; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2603,15 +2677,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c63; + s6 = peg$c67; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2634,15 +2708,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2658,7 +2732,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f63(s1, s3, s4); + s0 = peg$f65(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2670,7 +2744,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } return s0; @@ -2685,7 +2759,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2723,7 +2797,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2732,7 +2806,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } } s2 = []; @@ -2741,7 +2815,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2750,7 +2824,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } } s3 = []; @@ -2759,7 +2833,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2768,7 +2842,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } } s4 = peg$parseoperator(); @@ -2787,7 +2861,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2796,7 +2870,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } } s2 = peg$currPos; @@ -2817,7 +2891,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2843,7 +2917,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } } } diff --git a/src/libs/SearchParser/searchParser.peggy b/src/libs/SearchParser/searchParser.peggy index cc82e5eb27bb..2f2e49b6f3df 100644 --- a/src/libs/SearchParser/searchParser.peggy +++ b/src/libs/SearchParser/searchParser.peggy @@ -146,6 +146,8 @@ key "key" / reimbursable / billable / action + / purchaseCurrency + / purchaseAmount ) filterKey From f737a8c01eefc88eb0bcae7b24c925e58f870f63 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 07:34:46 -0400 Subject: [PATCH 07/19] add linking --- src/SCREENS.ts | 2 + .../ModalStackNavigators/index.tsx | 2 + .../linkingConfig/RELATIONS/SEARCH_TO_RHP.ts | 2 + src/libs/Navigation/linkingConfig/config.ts | 2 + .../SearchFiltersPurchaseCurrencyPage.tsx | 75 +++++++++++++++++++ 5 files changed, 83 insertions(+) create mode 100644 src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 14c1b4a1f883..da3e82214fd2 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -74,6 +74,8 @@ const SCREENS = { ADVANCED_FILTERS_REIMBURSABLE_RHP: 'Search_Advanced_Filters_Reimbursable_RHP', ADVANCED_FILTERS_BILLABLE_RHP: 'Search_Advanced_Filters_Billable_RHP', ADVANCED_FILTERS_WORKSPACE_RHP: 'Search_Advanced_Filters_Workspace_RHP', + ADVANCED_FILTERS_PURCHASE_CURRENCY_RHP: 'Search_Advanced_Filters_Purchase_Currency_RHP', + ADVANCED_FILTERS_PURCHASE_AMOUNT_RHP: 'Search_Advanced_Filters_Purchase_Amount_RHP', SAVED_SEARCH_RENAME_RHP: 'Search_Saved_Search_Rename_RHP', ADVANCED_FILTERS_IN_RHP: 'Search_Advanced_Filters_In_RHP', TRANSACTION_HOLD_REASON_RHP: 'Search_Transaction_Hold_Reason_RHP', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 92ac7af5493c..fcdea9870a99 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -782,6 +782,8 @@ const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersBillablePage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_REIMBURSABLE_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersReimbursablePage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_WORKSPACE_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersWorkspacePage').default, + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_AMOUNT_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage').default, + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_CURRENCY_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage').default, }); const SearchSavedSearchModalStackNavigator = createModalStackNavigator({ diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts index 15467e5dd36c..bbf34fd1b5df 100644 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts @@ -40,6 +40,8 @@ const SEARCH_TO_RHP: Partial['config'] = { [SCREENS.SEARCH.ADVANCED_FILTERS_BILLABLE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_BILLABLE, [SCREENS.SEARCH.ADVANCED_FILTERS_REIMBURSABLE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_REIMBURSABLE, [SCREENS.SEARCH.ADVANCED_FILTERS_WORKSPACE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_WORKSPACE, + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_AMOUNT_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_AMOUNT, + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_CURRENCY_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_CURRENCY, }, }, [SCREENS.RIGHT_MODAL.SEARCH_SAVED_SEARCH]: { diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx new file mode 100644 index 000000000000..e6a1c2afe80d --- /dev/null +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx @@ -0,0 +1,75 @@ +import React, {useMemo} from 'react'; +import {View} from 'react-native'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SearchMultipleSelectionPicker from '@components/Search/SearchMultipleSelectionPicker'; +import type {SearchMultipleSelectionPickerItem} from '@components/Search/SearchMultipleSelectionPicker'; +import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {updateAdvancedFilters} from '@libs/actions/Search'; +import {getCurrencySymbol} from '@libs/CurrencyUtils'; +import Navigation from '@libs/Navigation/Navigation'; +import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; + +function SearchFiltersPurchaseCurrencyPage() { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); + const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); + const selectedCurrenciesCodes = searchAdvancedFiltersForm?.purchaseCurrency; + + const {selectedCurrenciesItems, currencyItems} = useMemo(() => { + const selectedCurrencies: SearchMultipleSelectionPickerItem[] = []; + const currencies: SearchMultipleSelectionPickerItem[] = []; + + Object.keys(currencyList ?? {}).forEach((currencyCode) => { + if (currencyList?.[currencyCode]?.retired) { + return; + } + + if (selectedCurrenciesCodes?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { + selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + + if (!currencies.some((item) => item.value === currencyCode)) { + currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + }); + + return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; + }, [currencyList, selectedCurrenciesCodes]); + + const handleOnSubmit = (values: string[]) => { + updateAdvancedFilters({currency: values}); + }; + + return ( + + { + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); + }} + /> + + + + + ); +} + +SearchFiltersPurchaseCurrencyPage.displayName = 'SearchFiltersPurchaseCurrencyPage'; + +export default SearchFiltersPurchaseCurrencyPage; From 0927261b5bba0b6801a7b2e3effa2d22b4ff132b Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 07:41:20 -0400 Subject: [PATCH 08/19] update titles --- .../SearchFiltersPurchaseAmountPage.tsx | 2 +- .../SearchFiltersPurchaseCurrencyPage.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx index 4c04a6440981..3e766d0c1bbe 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx @@ -6,7 +6,7 @@ function SearchFiltersPurchaseAmountPage() { return ( ); diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx index e6a1c2afe80d..03f8c9f044f6 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx @@ -42,7 +42,7 @@ function SearchFiltersPurchaseCurrencyPage() { }, [currencyList, selectedCurrenciesCodes]); const handleOnSubmit = (values: string[]) => { - updateAdvancedFilters({currency: values}); + updateAdvancedFilters({purchaseCurrency: values}); }; return ( From be89f27284d8b4298123b064673c6972d5970f72 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 07:48:03 -0400 Subject: [PATCH 09/19] make a currency base component --- .../Search/SearchFiltersCurrencyBase.tsx | 82 +++++++++++++++++++ src/components/Search/types.ts | 3 + .../SearchFiltersCurrencyPage.tsx | 72 ++-------------- .../SearchFiltersPurchaseCurrencyPage.tsx | 73 ++--------------- 4 files changed, 99 insertions(+), 131 deletions(-) create mode 100644 src/components/Search/SearchFiltersCurrencyBase.tsx diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx new file mode 100644 index 000000000000..4ed85d0db496 --- /dev/null +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -0,0 +1,82 @@ +import React, {useMemo} from 'react'; +import {View} from 'react-native'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import ScreenWrapper from '@components/ScreenWrapper'; +import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {updateAdvancedFilters} from '@libs/actions/Search'; +import {getCurrencySymbol} from '@libs/CurrencyUtils'; +import Navigation from '@libs/Navigation/Navigation'; +import type {TranslationPaths} from '@src/languages/types'; +import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; +import SearchMultipleSelectionPicker from './SearchMultipleSelectionPicker'; +import type {SearchMultipleSelectionPickerItem} from './SearchMultipleSelectionPicker'; +import type {SearchCurrencyFilterKeys} from './types'; + +type SearchFiltersCurrencyBaseProps = { + title: TranslationPaths; + filterKey: SearchCurrencyFilterKeys; +}; + +function SearchFiltersCurrencyBase({title, filterKey}: SearchFiltersCurrencyBaseProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); + const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); + const selectedCurrenciesCodes = searchAdvancedFiltersForm?.[filterKey]; + + const {selectedCurrenciesItems, currencyItems} = useMemo(() => { + const selectedCurrencies: SearchMultipleSelectionPickerItem[] = []; + const currencies: SearchMultipleSelectionPickerItem[] = []; + + Object.keys(currencyList ?? {}).forEach((currencyCode) => { + if (currencyList?.[currencyCode]?.retired) { + return; + } + + if (selectedCurrenciesCodes?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { + selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + + if (!currencies.some((item) => item.value === currencyCode)) { + currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + }); + + return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; + }, [currencyList, selectedCurrenciesCodes]); + + const handleOnSubmit = (values: string[]) => { + updateAdvancedFilters({[filterKey]: values}); + }; + + return ( + + { + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); + }} + /> + + + + + ); +} + +SearchFiltersCurrencyBase.displayName = 'SearchFiltersCurrencyBase'; + +export default SearchFiltersCurrencyBase; diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index dbbe2207afd8..30ef99a3a990 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -129,6 +129,8 @@ type SearchDateFilterKeys = type SearchAmountFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT; +type SearchCurrencyFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY; + type SearchFilterKey = | ValueOf | typeof CONST.SEARCH.SYNTAX_ROOT_KEYS.TYPE @@ -216,5 +218,6 @@ export type { SingularSearchStatus, SearchDatePreset, SearchWithdrawalType, + SearchCurrencyFilterKeys, UserFriendlyValue, }; diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx index 950c6db55455..11e89363f241 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx @@ -1,71 +1,13 @@ -import React, {useMemo} from 'react'; -import {View} from 'react-native'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import SearchMultipleSelectionPicker from '@components/Search/SearchMultipleSelectionPicker'; -import type {SearchMultipleSelectionPickerItem} from '@components/Search/SearchMultipleSelectionPicker'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {updateAdvancedFilters} from '@libs/actions/Search'; -import {getCurrencySymbol} from '@libs/CurrencyUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import React from 'react'; +import SearchFiltersCurrencyBase from '@components/Search/SearchFiltersCurrencyBase'; +import CONST from '@src/CONST'; function SearchFiltersCurrencyPage() { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); - const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); - const selectedCurrenciesCodes = searchAdvancedFiltersForm?.currency; - - const {selectedCurrenciesItems, currencyItems} = useMemo(() => { - const selectedCurrencies: SearchMultipleSelectionPickerItem[] = []; - const currencies: SearchMultipleSelectionPickerItem[] = []; - - Object.keys(currencyList ?? {}).forEach((currencyCode) => { - if (currencyList?.[currencyCode]?.retired) { - return; - } - - if (selectedCurrenciesCodes?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { - selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); - } - - if (!currencies.some((item) => item.value === currencyCode)) { - currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); - } - }); - - return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; - }, [currencyList, selectedCurrenciesCodes]); - const handleOnSubmit = (values: string[]) => { - updateAdvancedFilters({currency: values}); - }; - return ( - - { - Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); - }} - /> - - - - + ); } diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx index 03f8c9f044f6..15a8ed251ac1 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx @@ -1,72 +1,13 @@ -import React, {useMemo} from 'react'; -import {View} from 'react-native'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import SearchMultipleSelectionPicker from '@components/Search/SearchMultipleSelectionPicker'; -import type {SearchMultipleSelectionPickerItem} from '@components/Search/SearchMultipleSelectionPicker'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {updateAdvancedFilters} from '@libs/actions/Search'; -import {getCurrencySymbol} from '@libs/CurrencyUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; +import React from 'react'; +import SearchFiltersCurrencyBase from '@components/Search/SearchFiltersCurrencyBase'; +import CONST from '@src/CONST'; function SearchFiltersPurchaseCurrencyPage() { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); - const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); - const selectedCurrenciesCodes = searchAdvancedFiltersForm?.purchaseCurrency; - - const {selectedCurrenciesItems, currencyItems} = useMemo(() => { - const selectedCurrencies: SearchMultipleSelectionPickerItem[] = []; - const currencies: SearchMultipleSelectionPickerItem[] = []; - - Object.keys(currencyList ?? {}).forEach((currencyCode) => { - if (currencyList?.[currencyCode]?.retired) { - return; - } - - if (selectedCurrenciesCodes?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { - selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); - } - - if (!currencies.some((item) => item.value === currencyCode)) { - currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); - } - }); - - return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; - }, [currencyList, selectedCurrenciesCodes]); - - const handleOnSubmit = (values: string[]) => { - updateAdvancedFilters({purchaseCurrency: values}); - }; - return ( - - { - Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); - }} - /> - - - - + ); } From 0adc3c6788cd2e23794ace25941b96cd802083e6 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:15:15 -0400 Subject: [PATCH 10/19] update currency base to support multi/single selcet --- .../Search/SearchFiltersCurrencyBase.tsx | 41 +++++++++++++------ src/components/Search/types.ts | 5 ++- .../SearchFiltersCurrencyPage.tsx | 1 + .../SearchFiltersPurchaseCurrencyPage.tsx | 1 + 4 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx index 4ed85d0db496..64f60fd1075e 100644 --- a/src/components/Search/SearchFiltersCurrencyBase.tsx +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -12,31 +12,37 @@ import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import SearchMultipleSelectionPicker from './SearchMultipleSelectionPicker'; -import type {SearchMultipleSelectionPickerItem} from './SearchMultipleSelectionPicker'; +import type {SearchSingleSelectionPickerItem} from './SearchSingleSelectionPicker'; +import SearchSingleSelectionPicker from './SearchSingleSelectionPicker'; import type {SearchCurrencyFilterKeys} from './types'; type SearchFiltersCurrencyBaseProps = { + multiselect?: boolean; title: TranslationPaths; filterKey: SearchCurrencyFilterKeys; }; -function SearchFiltersCurrencyBase({title, filterKey}: SearchFiltersCurrencyBaseProps) { +function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: SearchFiltersCurrencyBaseProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); - const selectedCurrenciesCodes = searchAdvancedFiltersForm?.[filterKey]; + const selectedCurrencyData = searchAdvancedFiltersForm?.[filterKey]; const {selectedCurrenciesItems, currencyItems} = useMemo(() => { - const selectedCurrencies: SearchMultipleSelectionPickerItem[] = []; - const currencies: SearchMultipleSelectionPickerItem[] = []; + const currencies: SearchSingleSelectionPickerItem[] = []; + const selectedCurrencies: SearchSingleSelectionPickerItem[] = []; Object.keys(currencyList ?? {}).forEach((currencyCode) => { if (currencyList?.[currencyCode]?.retired) { return; } - if (selectedCurrenciesCodes?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { + if (Array.isArray(selectedCurrencyData) && selectedCurrencyData?.includes(currencyCode) && !selectedCurrencies.some((currencyItem) => currencyItem.value === currencyCode)) { + selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + + if (!Array.isArray(selectedCurrencyData) && selectedCurrencyData === currencyCode) { selectedCurrencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); } @@ -46,9 +52,9 @@ function SearchFiltersCurrencyBase({title, filterKey}: SearchFiltersCurrencyBase }); return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; - }, [currencyList, selectedCurrenciesCodes]); + }, [currencyList, selectedCurrencyData]); - const handleOnSubmit = (values: string[]) => { + const handleOnSubmit = (values: string[] | string | undefined) => { updateAdvancedFilters({[filterKey]: values}); }; @@ -67,11 +73,20 @@ function SearchFiltersCurrencyBase({title, filterKey}: SearchFiltersCurrencyBase }} /> - + {multiselect && ( + + )} + {!multiselect && ( + + )} ); diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index 30ef99a3a990..d47ca0451170 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -129,7 +129,10 @@ type SearchDateFilterKeys = type SearchAmountFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.TOTAL | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT; -type SearchCurrencyFilterKeys = typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY; +type SearchCurrencyFilterKeys = + | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY + | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY + | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.GROUP_CURRENCY; type SearchFilterKey = | ValueOf diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx index 11e89363f241..1c1df4db1c2d 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx @@ -5,6 +5,7 @@ import CONST from '@src/CONST'; function SearchFiltersCurrencyPage() { return ( diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx index 15a8ed251ac1..6458b3afbbad 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx @@ -5,6 +5,7 @@ import CONST from '@src/CONST'; function SearchFiltersPurchaseCurrencyPage() { return ( From 14cc50732696f898fc874c4bed30b912a434862f Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:18:46 -0400 Subject: [PATCH 11/19] update group currency to use same component --- .../Search/SearchFiltersCurrencyBase.tsx | 2 +- .../SearchFiltersGroupCurrencyPage.tsx | 75 ++----------------- 2 files changed, 8 insertions(+), 69 deletions(-) diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx index 64f60fd1075e..09615352000e 100644 --- a/src/components/Search/SearchFiltersCurrencyBase.tsx +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -55,7 +55,7 @@ function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: Sear }, [currencyList, selectedCurrencyData]); const handleOnSubmit = (values: string[] | string | undefined) => { - updateAdvancedFilters({[filterKey]: values}); + updateAdvancedFilters({[filterKey]: values ?? null}); }; return ( diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx index e4e78f0e007a..afdf9d17992e 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx @@ -1,74 +1,13 @@ -import React, {useMemo} from 'react'; -import {View} from 'react-native'; -import HeaderWithBackButton from '@components/HeaderWithBackButton'; -import ScreenWrapper from '@components/ScreenWrapper'; -import SearchSingleSelectionPicker from '@components/Search/SearchSingleSelectionPicker'; -import type {SearchSingleSelectionPickerItem} from '@components/Search/SearchSingleSelectionPicker'; -import useLocalize from '@hooks/useLocalize'; -import useOnyx from '@hooks/useOnyx'; -import useThemeStyles from '@hooks/useThemeStyles'; -import {updateAdvancedFilters} from '@libs/actions/Search'; -import {getCurrencySymbol} from '@libs/CurrencyUtils'; -import Navigation from '@libs/Navigation/Navigation'; -import ONYXKEYS from '@src/ONYXKEYS'; -import ROUTES from '@src/ROUTES'; -import type {CurrencyList} from '@src/types/onyx'; -import {getEmptyObject} from '@src/types/utils/EmptyObject'; +import React from 'react'; +import SearchFiltersCurrencyBase from '@components/Search/SearchFiltersCurrencyBase'; +import CONST from '@src/CONST'; function SearchFiltersGroupCurrencyPage() { - const styles = useThemeStyles(); - const {translate} = useLocalize(); - const [currencyList = getEmptyObject()] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: true}); - const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true}); - - const {selectedCurrencyItem, currencyItems} = useMemo(() => { - let selectedCurrency: SearchSingleSelectionPickerItem | undefined; - const currencies: SearchSingleSelectionPickerItem[] = []; - - Object.keys(currencyList ?? {}).forEach((currencyCode) => { - if (currencyList?.[currencyCode]?.retired) { - return; - } - - if (currencyCode === searchAdvancedFiltersForm?.groupCurrency) { - selectedCurrency = { - name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, - value: currencyCode, - }; - } - - currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); - }); - - return {selectedCurrencyItem: selectedCurrency, currencyItems: currencies}; - }, [currencyList, searchAdvancedFiltersForm?.groupCurrency]); - - const handleOnSubmit = (value: string | undefined) => { - updateAdvancedFilters({groupCurrency: value ?? null}); - }; - return ( - - { - Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); - }} - /> - - - - + ); } From b17c4687a2eacb9428f51f9d3aee40b06c353348 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:24:04 -0400 Subject: [PATCH 12/19] fix or --- Mobile-Expensify | 2 +- src/pages/Search/AdvancedSearchFilters.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mobile-Expensify b/Mobile-Expensify index 29fc015b8f22..a98bfef7f41e 160000 --- a/Mobile-Expensify +++ b/Mobile-Expensify @@ -1 +1 @@ -Subproject commit 29fc015b8f22aebd3072fa7621a41ed116f3ce99 +Subproject commit a98bfef7f41e3856323c249252379f6ac07f9556 diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index 923a2cbc3273..3c27d515a663 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -530,7 +530,7 @@ function AdvancedSearchFilters() { key === CONST.SEARCH.SYNTAX_FILTER_KEYS.BILLABLE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_AMOUNT || - key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_ID || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TYPE ) { From 4c140ef010835e96b906b86d8a1e506092fbcf53 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:24:23 -0400 Subject: [PATCH 13/19] generate search parser w/o merge conflicts --- src/libs/SearchParser/autocompleteParser.js | 338 +++++++++---------- src/libs/SearchParser/searchParser.js | 344 ++++++++++---------- 2 files changed, 354 insertions(+), 328 deletions(-) diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index c15a03ba7a43..a2077352a79f 100644 --- a/src/libs/SearchParser/autocompleteParser.js +++ b/src/libs/SearchParser/autocompleteParser.js @@ -236,20 +236,24 @@ function peg$parse(input, options) { var peg$c50 = "created-by"; var peg$c51 = "action"; var peg$c52 = "total"; - var peg$c53 = "perdiem"; - var peg$c54 = "per-diem"; - var peg$c55 = "reports"; - var peg$c56 = "report"; - var peg$c57 = "drafts"; - var peg$c58 = "draft"; - var peg$c59 = "!="; - var peg$c60 = ">="; - var peg$c61 = ">"; - var peg$c62 = "<="; - var peg$c63 = "<"; - var peg$c64 = "\u201C"; - var peg$c65 = "\u201D"; - var peg$c66 = "\""; + var peg$c53 = "purchaseamount"; + var peg$c54 = "purchase-amount"; + var peg$c55 = "purchasecurrency"; + var peg$c56 = "purchase-currency"; + var peg$c57 = "perdiem"; + var peg$c58 = "per-diem"; + var peg$c59 = "reports"; + var peg$c60 = "report"; + var peg$c61 = "drafts"; + var peg$c62 = "draft"; + var peg$c63 = "!="; + var peg$c64 = ">="; + var peg$c65 = ">"; + var peg$c66 = "<="; + var peg$c67 = "<"; + var peg$c68 = "\u201C"; + var peg$c69 = "\u201D"; + var peg$c70 = "\""; var peg$r0 = /^[:=]/; var peg$r1 = /^[^ ,\t\n\r\xA0]/; @@ -317,36 +321,40 @@ function peg$parse(input, options) { var peg$e51 = peg$literalExpectation("created-by", true); var peg$e52 = peg$literalExpectation("action", true); var peg$e53 = peg$literalExpectation("total", true); - var peg$e54 = peg$literalExpectation("perDiem", true); - var peg$e55 = peg$literalExpectation("per-diem", true); - var peg$e56 = peg$literalExpectation("reports", true); - var peg$e57 = peg$literalExpectation("report", true); - var peg$e58 = peg$literalExpectation("drafts", true); - var peg$e59 = peg$literalExpectation("draft", true); - var peg$e60 = peg$otherExpectation("operator"); - var peg$e61 = peg$classExpectation([":", "="], false, false); - var peg$e62 = peg$literalExpectation("!=", false); - var peg$e63 = peg$literalExpectation(">=", false); - var peg$e64 = peg$literalExpectation(">", false); - var peg$e65 = peg$literalExpectation("<=", false); - var peg$e66 = peg$literalExpectation("<", false); - var peg$e67 = peg$otherExpectation("word"); - var peg$e68 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e69 = peg$otherExpectation("whitespace"); - var peg$e70 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e71 = peg$otherExpectation("quote"); - var peg$e72 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e73 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e74 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e75 = peg$literalExpectation("\u201C", false); - var peg$e76 = peg$literalExpectation("\u201D", false); - var peg$e77 = peg$literalExpectation("\"", false); - var peg$e78 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e79 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e80 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e81 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e82 = peg$anyExpectation(); - var peg$e83 = peg$classExpectation([","], false, false); + var peg$e54 = peg$literalExpectation("purchaseAmount", true); + var peg$e55 = peg$literalExpectation("purchase-amount", true); + var peg$e56 = peg$literalExpectation("purchaseCurrency", true); + var peg$e57 = peg$literalExpectation("purchase-currency", true); + var peg$e58 = peg$literalExpectation("perDiem", true); + var peg$e59 = peg$literalExpectation("per-diem", true); + var peg$e60 = peg$literalExpectation("reports", true); + var peg$e61 = peg$literalExpectation("report", true); + var peg$e62 = peg$literalExpectation("drafts", true); + var peg$e63 = peg$literalExpectation("draft", true); + var peg$e64 = peg$otherExpectation("operator"); + var peg$e65 = peg$classExpectation([":", "="], false, false); + var peg$e66 = peg$literalExpectation("!=", false); + var peg$e67 = peg$literalExpectation(">=", false); + var peg$e68 = peg$literalExpectation(">", false); + var peg$e69 = peg$literalExpectation("<=", false); + var peg$e70 = peg$literalExpectation("<", false); + var peg$e71 = peg$otherExpectation("word"); + var peg$e72 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e73 = peg$otherExpectation("whitespace"); + var peg$e74 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e75 = peg$otherExpectation("quote"); + var peg$e76 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e77 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e78 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e79 = peg$literalExpectation("\u201C", false); + var peg$e80 = peg$literalExpectation("\u201D", false); + var peg$e81 = peg$literalExpectation("\"", false); + var peg$e82 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e83 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e84 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e85 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e86 = peg$anyExpectation(); + var peg$e87 = peg$classExpectation([","], false, false); var peg$f0 = function(ranges) { return { autocomplete, ranges }; }; var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); }; @@ -441,31 +449,33 @@ function peg$parse(input, options) { var peg$f43 = function() { return "createdBy"; }; var peg$f44 = function() { return "action"; }; var peg$f45 = function() {return "total"; }; - var peg$f46 = function() { return "perDiem"; }; - var peg$f47 = function() {return "reports"; }; - var peg$f48 = function() {return "drafts"; }; - var peg$f49 = function() { return "eq"; }; - var peg$f50 = function() { return "neq"; }; - var peg$f51 = function() { return "gte"; }; - var peg$f52 = function() { return "gt"; }; - var peg$f53 = function() { return "lte"; }; - var peg$f54 = function() { return "lt"; }; - var peg$f55 = function(o) { + var peg$f46 = function() {return "purchaseAmount"}; + var peg$f47 = function() {return "purchaseCurrency"}; + var peg$f48 = function() { return "perDiem"; }; + var peg$f49 = function() {return "reports"; }; + var peg$f50 = function() {return "drafts"; }; + var peg$f51 = function() { return "eq"; }; + var peg$f52 = function() { return "neq"; }; + var peg$f53 = function() { return "gte"; }; + var peg$f54 = function() { return "gt"; }; + var peg$f55 = function() { return "lte"; }; + var peg$f56 = function() { return "lt"; }; + var peg$f57 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f56 = function(chars) { return chars.join("").trim(); }; - var peg$f57 = function() { return "and"; }; - var peg$f58 = function() { return expectingNestedQuote; }; - var peg$f59 = function(start, inner, end) { //handle no-breaking space + var peg$f58 = function(chars) { return chars.join("").trim(); }; + var peg$f59 = function() { return "and"; }; + var peg$f60 = function() { return expectingNestedQuote; }; + var peg$f61 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f60 = function(start) {return "“"}; - var peg$f61 = function(start) {return "”"}; - var peg$f62 = function(start) {return "\""}; - var peg$f63 = function(start, inner, end) { + var peg$f62 = function(start) {return "“"}; + var peg$f63 = function(start) {return "”"}; + var peg$f64 = function(start) {return "\""}; + var peg$f65 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -1844,24 +1854,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 14); - if (s0.toLowerCase() === peg$c51) { + if (s0.toLowerCase() === peg$c53) { peg$currPos += 14; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e54); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c52) { + if (s1.toLowerCase() === peg$c54) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f45(); + s1 = peg$f46(); } s0 = s1; } @@ -1873,24 +1883,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c55) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c56) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f47(); } s0 = s1; } @@ -1916,24 +1926,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c57) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c58) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f48(); } s0 = s1; } @@ -1945,24 +1955,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c55) { + if (s0.toLowerCase() === peg$c59) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c56) { + if (s1.toLowerCase() === peg$c60) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f49(); } s0 = s1; } @@ -1974,24 +1984,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 6); - if (s0.toLowerCase() === peg$c57) { + if (s0.toLowerCase() === peg$c61) { peg$currPos += 6; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c58) { + if (s1.toLowerCase() === peg$c62) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(); + s1 = peg$f50(); } s0 = s1; } @@ -2009,81 +2019,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f49(); + s1 = peg$f51(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c59) { - s1 = peg$c59; + if (input.substr(peg$currPos, 2) === peg$c63) { + s1 = peg$c63; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f50(); + s1 = peg$f52(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c60) { - s1 = peg$c60; + if (input.substr(peg$currPos, 2) === peg$c64) { + s1 = peg$c64; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f51(); + s1 = peg$f53(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c61; + s1 = peg$c65; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f52(); + s1 = peg$f54(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c62) { - s1 = peg$c62; + if (input.substr(peg$currPos, 2) === peg$c66) { + s1 = peg$c66; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f53(); + s1 = peg$f55(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c63; + s1 = peg$c67; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f54(); + s1 = peg$f56(); } s0 = s1; } @@ -2094,7 +2104,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } return s0; @@ -2107,7 +2117,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f55(s1); + s1 = peg$f57(s1); } s0 = s1; @@ -2125,7 +2135,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -2135,7 +2145,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } } else { @@ -2143,13 +2153,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f56(s1); + s1 = peg$f58(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } } return s0; @@ -2161,7 +2171,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f57(); + s1 = peg$f59(); s0 = s1; return s0; @@ -2177,7 +2187,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2186,12 +2196,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } return s0; } @@ -2201,7 +2211,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f58(); + s1 = peg$f60(); if (s1) { s1 = undefined; } else { @@ -2238,7 +2248,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2247,7 +2257,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } s2 = input.charAt(peg$currPos); @@ -2255,7 +2265,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2264,7 +2274,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2273,7 +2283,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } } s4 = input.charAt(peg$currPos); @@ -2281,7 +2291,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2290,7 +2300,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2299,11 +2309,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } peg$savedPos = s0; - s0 = peg$f59(s1, s3, s5); + s0 = peg$f61(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2315,7 +2325,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } return s0; @@ -2332,7 +2342,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2341,7 +2351,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } s2 = input.charAt(peg$currPos); @@ -2349,7 +2359,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2358,7 +2368,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2374,15 +2384,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2405,15 +2415,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c65; + s6 = peg$c69; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2436,15 +2446,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c66; + s6 = peg$c70; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2463,7 +2473,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2479,15 +2489,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f60(s1); + s4 = peg$f62(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2510,15 +2520,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c65; + s6 = peg$c69; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2541,15 +2551,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c66; + s6 = peg$c70; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2565,7 +2575,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f63(s1, s3, s4); + s0 = peg$f65(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2577,7 +2587,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } } return s0; @@ -2592,7 +2602,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2630,7 +2640,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2639,7 +2649,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } } s2 = []; @@ -2648,7 +2658,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2657,7 +2667,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } } s3 = []; @@ -2666,7 +2676,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2675,7 +2685,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } } s4 = peg$parseoperator(); @@ -2694,7 +2704,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2703,7 +2713,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } } s2 = peg$currPos; @@ -2724,7 +2734,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2750,7 +2760,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } } } diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js index 4e1e606d863b..d34e79cbd472 100644 --- a/src/libs/SearchParser/searchParser.js +++ b/src/libs/SearchParser/searchParser.js @@ -237,20 +237,24 @@ function peg$parse(input, options) { var peg$c50 = "created-by"; var peg$c51 = "action"; var peg$c52 = "total"; - var peg$c53 = "perdiem"; - var peg$c54 = "per-diem"; - var peg$c55 = "reports"; - var peg$c56 = "report"; - var peg$c57 = "drafts"; - var peg$c58 = "draft"; - var peg$c59 = "!="; - var peg$c60 = ">="; - var peg$c61 = ">"; - var peg$c62 = "<="; - var peg$c63 = "<"; - var peg$c64 = "\u201C"; - var peg$c65 = "\u201D"; - var peg$c66 = "\""; + var peg$c53 = "purchaseamount"; + var peg$c54 = "purchase-amount"; + var peg$c55 = "purchasecurrency"; + var peg$c56 = "purchase-currency"; + var peg$c57 = "perdiem"; + var peg$c58 = "per-diem"; + var peg$c59 = "reports"; + var peg$c60 = "report"; + var peg$c61 = "drafts"; + var peg$c62 = "draft"; + var peg$c63 = "!="; + var peg$c64 = ">="; + var peg$c65 = ">"; + var peg$c66 = "<="; + var peg$c67 = "<"; + var peg$c68 = "\u201C"; + var peg$c69 = "\u201D"; + var peg$c70 = "\""; var peg$r0 = /^[^ \t\r\n\xA0]/; var peg$r1 = /^[:=]/; @@ -321,36 +325,40 @@ function peg$parse(input, options) { var peg$e53 = peg$literalExpectation("created-by", true); var peg$e54 = peg$literalExpectation("action", true); var peg$e55 = peg$literalExpectation("total", true); - var peg$e56 = peg$literalExpectation("perDiem", true); - var peg$e57 = peg$literalExpectation("per-diem", true); - var peg$e58 = peg$literalExpectation("reports", true); - var peg$e59 = peg$literalExpectation("report", true); - var peg$e60 = peg$literalExpectation("drafts", true); - var peg$e61 = peg$literalExpectation("draft", true); - var peg$e62 = peg$otherExpectation("operator"); - var peg$e63 = peg$classExpectation([":", "="], false, false); - var peg$e64 = peg$literalExpectation("!=", false); - var peg$e65 = peg$literalExpectation(">=", false); - var peg$e66 = peg$literalExpectation(">", false); - var peg$e67 = peg$literalExpectation("<=", false); - var peg$e68 = peg$literalExpectation("<", false); - var peg$e69 = peg$otherExpectation("word"); - var peg$e70 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e71 = peg$otherExpectation("whitespace"); - var peg$e72 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e73 = peg$otherExpectation("quote"); - var peg$e74 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e75 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e76 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e77 = peg$literalExpectation("\u201C", false); - var peg$e78 = peg$literalExpectation("\u201D", false); - var peg$e79 = peg$literalExpectation("\"", false); - var peg$e80 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e81 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e82 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e83 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e84 = peg$anyExpectation(); - var peg$e85 = peg$classExpectation([","], false, false); + var peg$e56 = peg$literalExpectation("purchaseAmount", true); + var peg$e57 = peg$literalExpectation("purchase-amount", true); + var peg$e58 = peg$literalExpectation("purchaseCurrency", true); + var peg$e59 = peg$literalExpectation("purchase-currency", true); + var peg$e60 = peg$literalExpectation("perDiem", true); + var peg$e61 = peg$literalExpectation("per-diem", true); + var peg$e62 = peg$literalExpectation("reports", true); + var peg$e63 = peg$literalExpectation("report", true); + var peg$e64 = peg$literalExpectation("drafts", true); + var peg$e65 = peg$literalExpectation("draft", true); + var peg$e66 = peg$otherExpectation("operator"); + var peg$e67 = peg$classExpectation([":", "="], false, false); + var peg$e68 = peg$literalExpectation("!=", false); + var peg$e69 = peg$literalExpectation(">=", false); + var peg$e70 = peg$literalExpectation(">", false); + var peg$e71 = peg$literalExpectation("<=", false); + var peg$e72 = peg$literalExpectation("<", false); + var peg$e73 = peg$otherExpectation("word"); + var peg$e74 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e75 = peg$otherExpectation("whitespace"); + var peg$e76 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e77 = peg$otherExpectation("quote"); + var peg$e78 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e79 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e80 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e81 = peg$literalExpectation("\u201C", false); + var peg$e82 = peg$literalExpectation("\u201D", false); + var peg$e83 = peg$literalExpectation("\"", false); + var peg$e84 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e85 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e86 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e87 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e88 = peg$anyExpectation(); + var peg$e89 = peg$classExpectation([","], false, false); var peg$f0 = function(filters) { return applyDefaults(filters); }; var peg$f1 = function(head, tail) { @@ -457,31 +465,33 @@ function peg$parse(input, options) { var peg$f44 = function() { return "createdBy"; }; var peg$f45 = function() { return "action"; }; var peg$f46 = function() {return "total"; }; - var peg$f47 = function() { return "perDiem"; }; - var peg$f48 = function() {return "reports"; }; - var peg$f49 = function() {return "drafts"; }; - var peg$f50 = function() { return "eq"; }; - var peg$f51 = function() { return "neq"; }; - var peg$f52 = function() { return "gte"; }; - var peg$f53 = function() { return "gt"; }; - var peg$f54 = function() { return "lte"; }; - var peg$f55 = function() { return "lt"; }; - var peg$f56 = function(o) { + var peg$f47 = function() {return "purchaseAmount"}; + var peg$f48 = function() {return "purchaseCurrency"}; + var peg$f49 = function() { return "perDiem"; }; + var peg$f50 = function() {return "reports"; }; + var peg$f51 = function() {return "drafts"; }; + var peg$f52 = function() { return "eq"; }; + var peg$f53 = function() { return "neq"; }; + var peg$f54 = function() { return "gte"; }; + var peg$f55 = function() { return "gt"; }; + var peg$f56 = function() { return "lte"; }; + var peg$f57 = function() { return "lt"; }; + var peg$f58 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f57 = function(chars) { return chars.join("").trim(); }; - var peg$f58 = function() { return "and"; }; - var peg$f59 = function() { return expectingNestedQuote; }; - var peg$f60 = function(start, inner, end) { //handle no-breaking space + var peg$f59 = function(chars) { return chars.join("").trim(); }; + var peg$f60 = function() { return "and"; }; + var peg$f61 = function() { return expectingNestedQuote; }; + var peg$f62 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f61 = function(start) {return "“"}; - var peg$f62 = function(start) {return "”"}; - var peg$f63 = function(start) {return "\""}; - var peg$f64 = function(start, inner, end) { + var peg$f63 = function(start) {return "“"}; + var peg$f64 = function(start) {return "”"}; + var peg$f65 = function(start) {return "\""}; + var peg$f66 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -899,6 +909,12 @@ function peg$parse(input, options) { s1 = peg$parsebillable(); if (s1 === peg$FAILED) { s1 = peg$parseaction(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseCurrency(); + if (s1 === peg$FAILED) { + s1 = peg$parsepurchaseAmount(); + } + } } } } @@ -2032,24 +2048,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 14); - if (s0.toLowerCase() === peg$c51) { + if (s0.toLowerCase() === peg$c53) { peg$currPos += 14; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c52) { + if (s1.toLowerCase() === peg$c54) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f47(); } s0 = s1; } @@ -2061,24 +2077,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c55) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c56) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f48(); } s0 = s1; } @@ -2104,24 +2120,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c53) { + if (s0.toLowerCase() === peg$c57) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c54) { + if (s1.toLowerCase() === peg$c58) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f49(); } s0 = s1; } @@ -2133,24 +2149,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c55) { + if (s0.toLowerCase() === peg$c59) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c56) { + if (s1.toLowerCase() === peg$c60) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(); + s1 = peg$f50(); } s0 = s1; } @@ -2162,24 +2178,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 6); - if (s0.toLowerCase() === peg$c57) { + if (s0.toLowerCase() === peg$c61) { peg$currPos += 6; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c58) { + if (s1.toLowerCase() === peg$c62) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f49(); + s1 = peg$f51(); } s0 = s1; } @@ -2197,81 +2213,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f50(); + s1 = peg$f52(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c59) { - s1 = peg$c59; + if (input.substr(peg$currPos, 2) === peg$c63) { + s1 = peg$c63; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f51(); + s1 = peg$f53(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c60) { - s1 = peg$c60; + if (input.substr(peg$currPos, 2) === peg$c64) { + s1 = peg$c64; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f52(); + s1 = peg$f54(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c61; + s1 = peg$c65; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f53(); + s1 = peg$f55(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c62) { - s1 = peg$c62; + if (input.substr(peg$currPos, 2) === peg$c66) { + s1 = peg$c66; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f54(); + s1 = peg$f56(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c63; + s1 = peg$c67; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f55(); + s1 = peg$f57(); } s0 = s1; } @@ -2282,7 +2298,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } return s0; @@ -2295,7 +2311,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f56(s1); + s1 = peg$f58(s1); } s0 = s1; @@ -2313,7 +2329,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -2323,7 +2339,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } } else { @@ -2331,13 +2347,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f57(s1); + s1 = peg$f59(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e73); } } return s0; @@ -2349,7 +2365,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f58(); + s1 = peg$f60(); s0 = s1; return s0; @@ -2365,7 +2381,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2374,12 +2390,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e72); } + if (peg$silentFails === 0) { peg$fail(peg$e76); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e71); } + if (peg$silentFails === 0) { peg$fail(peg$e75); } return s0; } @@ -2389,7 +2405,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f59(); + s1 = peg$f61(); if (s1) { s1 = undefined; } else { @@ -2426,7 +2442,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2435,7 +2451,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } } s2 = input.charAt(peg$currPos); @@ -2443,7 +2459,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2452,7 +2468,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2461,7 +2477,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } } s4 = input.charAt(peg$currPos); @@ -2469,7 +2485,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2478,7 +2494,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2487,11 +2503,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e74); } } } peg$savedPos = s0; - s0 = peg$f60(s1, s3, s5); + s0 = peg$f62(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2503,7 +2519,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } return s0; @@ -2520,7 +2536,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2529,7 +2545,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e74); } + if (peg$silentFails === 0) { peg$fail(peg$e78); } } } s2 = input.charAt(peg$currPos); @@ -2537,7 +2553,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2546,7 +2562,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2562,15 +2578,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2593,15 +2609,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c65; + s6 = peg$c69; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2624,15 +2640,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c66; + s6 = peg$c70; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f63(s1); + s4 = peg$f65(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2651,7 +2667,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e76); } + if (peg$silentFails === 0) { peg$fail(peg$e80); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2667,15 +2683,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c64; + s6 = peg$c68; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e77); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f61(s1); + s4 = peg$f63(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2698,15 +2714,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c65; + s6 = peg$c69; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e78); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f62(s1); + s4 = peg$f64(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2729,15 +2745,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c66; + s6 = peg$c70; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e79); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f63(s1); + s4 = peg$f65(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2753,7 +2769,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f64(s1, s3, s4); + s0 = peg$f66(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2765,7 +2781,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e73); } + if (peg$silentFails === 0) { peg$fail(peg$e77); } } return s0; @@ -2780,7 +2796,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e75); } + if (peg$silentFails === 0) { peg$fail(peg$e79); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2818,7 +2834,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2827,7 +2843,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } } s2 = []; @@ -2836,7 +2852,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2845,7 +2861,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } } s3 = []; @@ -2854,7 +2870,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2863,7 +2879,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } } s4 = peg$parseoperator(); @@ -2882,7 +2898,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2891,7 +2907,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } } s2 = peg$currPos; @@ -2912,7 +2928,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e84); } + if (peg$silentFails === 0) { peg$fail(peg$e88); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2938,7 +2954,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e85); } + if (peg$silentFails === 0) { peg$fail(peg$e89); } } } } From 335ca3657ca3e18c5c4f49460bc66cd735f3af6d Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:31:08 -0400 Subject: [PATCH 14/19] eslint fix --- src/components/Search/SearchFiltersAmountBase.tsx | 3 +-- src/components/Search/SearchFiltersCurrencyBase.tsx | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/components/Search/SearchFiltersAmountBase.tsx b/src/components/Search/SearchFiltersAmountBase.tsx index 47fda2f5d901..a106c0caefec 100644 --- a/src/components/Search/SearchFiltersAmountBase.tsx +++ b/src/components/Search/SearchFiltersAmountBase.tsx @@ -21,15 +21,14 @@ import type {SearchAmountFilterKeys} from './types'; function SearchFiltersAmountBase({title, filterKey, testID}: {title: TranslationPaths; filterKey: SearchAmountFilterKeys; testID: string}) { const styles = useThemeStyles(); - const {translate} = useLocalize(); + const {inputCallbackRef} = useAutoFocusInput(); const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: false}); const greaterThan = searchAdvancedFiltersForm?.[`${filterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.GREATER_THAN}`]; const greaterThanFormattedAmount = greaterThan ? convertToFrontendAmountAsString(Number(greaterThan)) : undefined; const lessThan = searchAdvancedFiltersForm?.[`${filterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.LESS_THAN}`]; const lessThanFormattedAmount = lessThan ? convertToFrontendAmountAsString(Number(lessThan)) : undefined; - const {inputCallbackRef} = useAutoFocusInput(); const updateAmountFilter = (values: FormOnyxValues) => { const greater = values[`${filterKey}${CONST.SEARCH.AMOUNT_MODIFIERS.GREATER_THAN}`]; diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx index 09615352000e..6a71930cf78d 100644 --- a/src/components/Search/SearchFiltersCurrencyBase.tsx +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -25,8 +25,8 @@ type SearchFiltersCurrencyBaseProps = { function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: SearchFiltersCurrencyBaseProps) { const styles = useThemeStyles(); const {translate} = useLocalize(); - const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST); - const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM); + const [currencyList] = useOnyx(ONYXKEYS.CURRENCY_LIST, {canBeMissing: false}); + const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: false}); const selectedCurrencyData = searchAdvancedFiltersForm?.[filterKey]; const {selectedCurrenciesItems, currencyItems} = useMemo(() => { From c0c42407c0e6988c44f876343bf7af1c122ad5c2 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 08:40:47 -0400 Subject: [PATCH 15/19] translations --- src/languages/de.ts | 2 ++ src/languages/en.ts | 5 ----- src/languages/es.ts | 2 ++ src/languages/fr.ts | 2 ++ src/languages/it.ts | 2 ++ src/languages/ja.ts | 2 ++ src/languages/nl.ts | 2 ++ src/languages/pl.ts | 2 ++ src/languages/pt-BR.ts | 2 ++ src/languages/zh-hans.ts | 2 ++ 10 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 5ba2da4e5b5b..83a4dc5191d5 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -657,6 +657,7 @@ const translations = { merge: 'Zusammenführen', unstableInternetConnection: 'Instabile Internetverbindung. Bitte überprüfe dein Netzwerk und versuche es erneut.', enableGlobalReimbursements: 'Globale Rückerstattungen aktivieren', + purchaseAmount: 'Kaufbetrag', }, supportalNoAccess: { title: 'Nicht so schnell', @@ -6132,6 +6133,7 @@ const translations = { withdrawn: 'Storniert', billable: 'Abrechenbar', reimbursable: 'Erstattungsfähig', + purchaseCurrency: 'Kaufwährung', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Bericht', [CONST.SEARCH.GROUP_BY.FROM]: 'Von', diff --git a/src/languages/en.ts b/src/languages/en.ts index 625c852b359c..e8ae46044c67 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -6107,11 +6107,6 @@ const translations = { withdrawn: 'Withdrawn', billable: 'Billable', reimbursable: 'Reimbursable', - purchaseAmount: { - lessThan: ({amount}: OptionalParam = {}) => `Less than ${amount ?? ''}`, - greaterThan: ({amount}: OptionalParam = {}) => `Greater than ${amount ?? ''}`, - between: ({greaterThan, lessThan}: FiltersAmountBetweenParams) => `Between ${greaterThan} and ${lessThan}`, - }, purchaseCurrency: 'Purchase currency', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Report', diff --git a/src/languages/es.ts b/src/languages/es.ts index 8d43ce337cae..7acad11973f5 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -638,6 +638,7 @@ const translations = { merge: 'Fusionar', unstableInternetConnection: 'Conexión a internet inestable. Por favor, revisa tu red e inténtalo de nuevo.', enableGlobalReimbursements: 'Habilitar Reembolsos Globales', + purchaseAmount: 'Importe de compra', }, supportalNoAccess: { title: 'No tan rápido', @@ -6127,6 +6128,7 @@ const translations = { withdrawn: 'Retirada', billable: 'Facturable', reimbursable: 'Reembolsable', + purchaseCurrency: 'Moneda de compra', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Informe', [CONST.SEARCH.GROUP_BY.FROM]: 'De', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index d861462a7b87..29487b00efc9 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -657,6 +657,7 @@ const translations = { merge: 'Fusionner', unstableInternetConnection: 'Connexion Internet instable. Veuillez vérifier votre réseau et réessayer.', enableGlobalReimbursements: 'Activer les remboursements globaux', + purchaseAmount: "Montant de l'achat", }, supportalNoAccess: { title: 'Pas si vite', @@ -6146,6 +6147,7 @@ const translations = { withdrawn: 'Retiré', billable: 'Facturable', reimbursable: 'Remboursable', + purchaseCurrency: "Devise d'achat", groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Rapport', [CONST.SEARCH.GROUP_BY.FROM]: 'De', diff --git a/src/languages/it.ts b/src/languages/it.ts index c19f95806416..df4ed5dc4627 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -657,6 +657,7 @@ const translations = { merge: 'Unisci', unstableInternetConnection: 'Connessione Internet instabile. Controlla la tua rete e riprova.', enableGlobalReimbursements: 'Abilita i rimborsi globali', + purchaseAmount: 'Importo di acquisto', }, supportalNoAccess: { title: 'Non così in fretta', @@ -6147,6 +6148,7 @@ const translations = { withdrawn: 'Ritirato', billable: 'Fatturabile', reimbursable: 'Rimborsabile', + purchaseCurrency: 'Valuta di acquisto', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Rapporto', [CONST.SEARCH.GROUP_BY.FROM]: 'Da', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 379984c60a8f..3c3f4ea6f96d 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -657,6 +657,7 @@ const translations = { merge: 'マージ', unstableInternetConnection: 'インターネット接続が不安定です。ネットワークを確認してもう一度お試しください。', enableGlobalReimbursements: 'グローバル払い戻しを有効にする', + purchaseAmount: '購入金額', }, supportalNoAccess: { title: 'ちょっと待ってください', @@ -6104,6 +6105,7 @@ const translations = { withdrawn: '取り消し', billable: 'ビラブル', reimbursable: '払い戻し可能', + purchaseCurrency: '購入通貨', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: '報告', [CONST.SEARCH.GROUP_BY.FROM]: 'から', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index bd66797b27ab..b17761cc09c0 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -656,6 +656,7 @@ const translations = { merge: 'Samenvoegen', unstableInternetConnection: 'Onstabiele internetverbinding. Controleer je netwerk en probeer het opnieuw.', enableGlobalReimbursements: 'Wereldwijde terugbetalingen inschakelen', + purchaseAmount: 'Aankoopbedrag', }, supportalNoAccess: { title: 'Niet zo snel', @@ -6139,6 +6140,7 @@ const translations = { withdrawn: 'Teruggetrokken', billable: 'Factureerbaar', reimbursable: 'Vergoedbaar', + purchaseCurrency: 'Aankoopvaluta', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Verslag', [CONST.SEARCH.GROUP_BY.FROM]: 'Van', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index b1927f87e9a1..cc4a2c0664a5 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -657,6 +657,7 @@ const translations = { merge: 'Scal', unstableInternetConnection: 'Niestabilne połączenie internetowe. Sprawdź swoją sieć i spróbuj ponownie.', enableGlobalReimbursements: 'Włącz globalne zwroty', + purchaseAmount: 'Kwota zakupu', }, supportalNoAccess: { title: 'Nie tak szybko', @@ -6125,6 +6126,7 @@ const translations = { withdrawn: 'Wycofane', billable: 'Podlegające fakturowaniu', reimbursable: 'Podlegające zwrotowi', + purchaseCurrency: 'Waluta zakupu', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Raport', [CONST.SEARCH.GROUP_BY.FROM]: 'Od', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index f2efdf0d23ec..2b9974695c29 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -657,6 +657,7 @@ const translations = { merge: 'Mesclar', unstableInternetConnection: 'Conexão de internet instável. Verifique sua rede e tente novamente.', enableGlobalReimbursements: 'Ativar reembolsos globais', + purchaseAmount: 'Valor da compra', }, supportalNoAccess: { title: 'Não tão rápido', @@ -6140,6 +6141,7 @@ const translations = { withdrawn: 'Retirado', billable: 'Faturável', reimbursable: 'Reembolsável', + purchaseCurrency: 'Moeda da compra', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Relatório', [CONST.SEARCH.GROUP_BY.FROM]: 'De', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 687f98907e13..c81034074958 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -656,6 +656,7 @@ const translations = { merge: '合并', unstableInternetConnection: '互联网连接不稳定。请检查你的网络,然后重试。', enableGlobalReimbursements: '启用全球报销', + purchaseAmount: '购买金额', }, supportalNoAccess: { title: '慢一点', @@ -6022,6 +6023,7 @@ const translations = { withdrawn: '撤回', billable: '可计费的', reimbursable: '可报销的', + purchaseCurrency: '购买货币', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: '报告', [CONST.SEARCH.GROUP_BY.FROM]: '从', From 2e9a92fc9ac9249d9ac2625223dfa2d4428c60ab Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Fri, 29 Aug 2025 12:00:11 -0400 Subject: [PATCH 16/19] get rid of submodule --- Mobile-Expensify | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mobile-Expensify b/Mobile-Expensify index a98bfef7f41e..29fc015b8f22 160000 --- a/Mobile-Expensify +++ b/Mobile-Expensify @@ -1 +1 @@ -Subproject commit a98bfef7f41e3856323c249252379f6ac07f9556 +Subproject commit 29fc015b8f22aebd3072fa7621a41ed116f3ce99 From 77d50a99d55569b1cb2681d295fe951001e86888 Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Tue, 2 Sep 2025 12:16:29 -0400 Subject: [PATCH 17/19] fix currency base route --- Mobile-Expensify | 2 +- src/components/Search/SearchFiltersCurrencyBase.tsx | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Mobile-Expensify b/Mobile-Expensify index 9ee5a9685140..29fc015b8f22 160000 --- a/Mobile-Expensify +++ b/Mobile-Expensify @@ -1 +1 @@ -Subproject commit 9ee5a96851400e644afc2bad922e275ad3d02fe7 +Subproject commit 29fc015b8f22aebd3072fa7621a41ed116f3ce99 diff --git a/src/components/Search/SearchFiltersCurrencyBase.tsx b/src/components/Search/SearchFiltersCurrencyBase.tsx index 6a71930cf78d..ed30e7add886 100644 --- a/src/components/Search/SearchFiltersCurrencyBase.tsx +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -69,7 +69,7 @@ function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: Sear { - Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS.getRoute()); }} /> From 3b1e2a0a7dd2ea74d908b0b1a927e0d568d43d6d Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Tue, 2 Sep 2025 13:15:05 -0400 Subject: [PATCH 18/19] update filter routes --- src/pages/Search/AdvancedSearchFilters.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index e9d2a6fa892e..b51c4194793d 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -218,12 +218,12 @@ const baseFilterConfig = { purchaseAmount: { getTitle: getFilterDisplayTitle, description: 'common.purchaseAmount' as const, - route: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_AMOUNT, + route: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.PURCHASE_AMOUNT), }, purchaseCurrency: { getTitle: getFilterDisplayTitle, description: 'search.filters.purchaseCurrency' as const, - route: ROUTES.SEARCH_ADVANCED_FILTERS_PURCHASE_CURRENCY, + route: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.PURCHASE_CURRENCY), }, }; From 61c6d6099a1db3fcb3e18aaf1ffe0c4bbcf8542e Mon Sep 17 00:00:00 2001 From: Jack Senyitko Date: Wed, 3 Sep 2025 07:27:35 -0400 Subject: [PATCH 19/19] fix mobile-e --- Mobile-Expensify | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mobile-Expensify b/Mobile-Expensify index 29fc015b8f22..a7c62b32632f 160000 --- a/Mobile-Expensify +++ b/Mobile-Expensify @@ -1 +1 @@ -Subproject commit 29fc015b8f22aebd3072fa7621a41ed116f3ce99 +Subproject commit a7c62b32632fce591d18adcd3ad658d96cfab7b5