diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 7e26203b746f..ef37d6e2cab3 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6554,6 +6554,8 @@ const CONST = { BILLABLE: 'billable', POLICY_ID: 'policyID', ACTION: 'action', + PURCHASE_AMOUNT: 'purchaseAmount', + PURCHASE_CURRENCY: 'purchaseCurrency', WITHDRAWAL_ID: 'withdrawalID', }, TAG_EMPTY_VALUE: 'none', @@ -6602,10 +6604,10 @@ const CONST = { REIMBURSABLE: 'reimbursable', BILLABLE: 'billable', ACTION: 'action', + PURCHASE_AMOUNT: 'purchase-amount', + PURCHASE_CURRENCY: 'purchase-currency', WITHDRAWAL_ID: 'withdrawal-id', }, - - // Maps an internal search value to the user friendly display text, e.g. `perDiem` -> `per-diem` get SEARCH_USER_FRIENDLY_VALUES_MAP() { return { [this.TRANSACTION_TYPE.PER_DIEM]: 'per-diem', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 46a307919378..bb08624ed6c6 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -75,6 +75,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/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index bff140229063..43522a55ddb0 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -329,7 +329,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/components/Search/SearchFiltersAmountBase.tsx b/src/components/Search/SearchFiltersAmountBase.tsx index 73359b97a24f..4f669c55c0c5 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 new file mode 100644 index 000000000000..ed30e7add886 --- /dev/null +++ b/src/components/Search/SearchFiltersCurrencyBase.tsx @@ -0,0 +1,97 @@ +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 {SearchSingleSelectionPickerItem} from './SearchSingleSelectionPicker'; +import SearchSingleSelectionPicker from './SearchSingleSelectionPicker'; +import type {SearchCurrencyFilterKeys} from './types'; + +type SearchFiltersCurrencyBaseProps = { + multiselect?: boolean; + title: TranslationPaths; + filterKey: SearchCurrencyFilterKeys; +}; + +function SearchFiltersCurrencyBase({title, filterKey, multiselect = false}: SearchFiltersCurrencyBaseProps) { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + 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(() => { + const currencies: SearchSingleSelectionPickerItem[] = []; + const selectedCurrencies: SearchSingleSelectionPickerItem[] = []; + + Object.keys(currencyList ?? {}).forEach((currencyCode) => { + if (currencyList?.[currencyCode]?.retired) { + return; + } + + 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}); + } + + if (!currencies.some((item) => item.value === currencyCode)) { + currencies.push({name: `${currencyCode} - ${getCurrencySymbol(currencyCode)}`, value: currencyCode}); + } + }); + + return {selectedCurrenciesItems: selectedCurrencies, currencyItems: currencies}; + }, [currencyList, selectedCurrencyData]); + + const handleOnSubmit = (values: string[] | string | undefined) => { + updateAdvancedFilters({[filterKey]: values ?? null}); + }; + + return ( + + { + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS.getRoute()); + }} + /> + + {multiselect && ( + + )} + {!multiselect && ( + + )} + + + ); +} + +SearchFiltersCurrencyBase.displayName = 'SearchFiltersCurrencyBase'; + +export default SearchFiltersCurrencyBase; diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index a232e7692001..7d1e3db5e509 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -129,7 +129,12 @@ 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 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 @@ -218,5 +223,6 @@ export type { SingularSearchStatus, SearchDatePreset, SearchWithdrawalType, + SearchCurrencyFilterKeys, UserFriendlyValue, }; diff --git a/src/hooks/useAdvancedSearchFilters.ts b/src/hooks/useAdvancedSearchFilters.ts index e917014b279d..1324c271084a 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, @@ -70,6 +72,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 +109,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/languages/de.ts b/src/languages/de.ts index ba3f793b4c27..cb7a9eb82bbf 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -658,6 +658,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', @@ -6166,6 +6167,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 ac4e10d604e0..c7dd9e6d6806 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -649,6 +649,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', @@ -6140,6 +6141,7 @@ const translations = { withdrawn: 'Withdrawn', billable: 'Billable', reimbursable: 'Reimbursable', + purchaseCurrency: 'Purchase currency', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: 'Report', [CONST.SEARCH.GROUP_BY.FROM]: 'From', diff --git a/src/languages/es.ts b/src/languages/es.ts index 61853490bbdc..9bfaf3c2337d 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -639,6 +639,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', @@ -6161,6 +6162,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 047fe59c6275..64031835ab05 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -658,6 +658,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', @@ -6180,6 +6181,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 c60dd6b95fa2..0f22467f6da2 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -658,6 +658,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', @@ -6181,6 +6182,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 737c6653133c..69966cfb877e 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -658,6 +658,7 @@ const translations = { merge: 'マージ', unstableInternetConnection: 'インターネット接続が不安定です。ネットワークを確認してもう一度お試しください。', enableGlobalReimbursements: 'グローバル払い戻しを有効にする', + purchaseAmount: '購入金額', }, supportalNoAccess: { title: 'ちょっと待ってください', @@ -6138,6 +6139,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 f26ba4ac5805..17ae5ace914a 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -657,6 +657,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', @@ -6173,6 +6174,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 3d6fa3c682de..bc8877d68617 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -658,6 +658,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', @@ -6159,6 +6160,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 0f3dd7569f80..0ac762bb856e 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -658,6 +658,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', @@ -6174,6 +6175,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 7f38613ba121..9a2118621866 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -657,6 +657,7 @@ const translations = { merge: '合并', unstableInternetConnection: '互联网连接不稳定。请检查你的网络,然后重试。', enableGlobalReimbursements: '启用全球报销', + purchaseAmount: '购买金额', }, supportalNoAccess: { title: '慢一点', @@ -6056,6 +6057,7 @@ const translations = { withdrawn: '撤回', billable: '可计费的', reimbursable: '可报销的', + purchaseCurrency: '购买货币', groupBy: { [CONST.SEARCH.GROUP_BY.REPORTS]: '报告', [CONST.SEARCH.GROUP_BY.FROM]: '从', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 34f47b9a70cf..f6644277f573 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -796,6 +796,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, [SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_ID_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalIDPage').default, }); 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.getRoute(CONST.SEARCH.SYNTAX_FILTER_KEYS.BILLABLE), [SCREENS.SEARCH.ADVANCED_FILTERS_REIMBURSABLE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SYNTAX_FILTER_KEYS.REIMBURSABLE), [SCREENS.SEARCH.ADVANCED_FILTERS_WORKSPACE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.POLICY_ID), + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_AMOUNT_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.PURCHASE_AMOUNT), + [SCREENS.SEARCH.ADVANCED_FILTERS_PURCHASE_CURRENCY_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.PURCHASE_CURRENCY), }, }, [SCREENS.RIGHT_MODAL.SEARCH_SAVED_SEARCH]: { 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/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index 33640165409e..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; @@ -806,6 +816,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(); + } + } } } } @@ -1834,6 +1850,64 @@ function peg$parse(input, options) { return s0; } + function peg$parsepurchaseAmount() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c53) { + 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$c54) { + 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$c55) { + 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$c56) { + 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; @@ -1852,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; } @@ -1881,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; } @@ -1910,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; } @@ -1945,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; } @@ -2030,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; @@ -2043,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; @@ -2061,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) { @@ -2071,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 { @@ -2079,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; @@ -2097,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; @@ -2113,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); @@ -2122,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; } @@ -2137,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 { @@ -2174,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); @@ -2183,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); @@ -2191,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 = []; @@ -2200,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); @@ -2209,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); @@ -2217,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 = []; @@ -2226,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); @@ -2235,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; @@ -2251,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; @@ -2268,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); @@ -2277,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); @@ -2285,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 = []; @@ -2294,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; @@ -2310,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; @@ -2341,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; @@ -2372,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; @@ -2399,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; @@ -2415,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; @@ -2446,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; @@ -2477,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; @@ -2501,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; @@ -2513,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; @@ -2528,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; @@ -2566,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); @@ -2575,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 = []; @@ -2584,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); @@ -2593,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 = []; @@ -2602,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); @@ -2611,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(); @@ -2630,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); @@ -2639,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; @@ -2660,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) { @@ -2686,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/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 de6fe7bba3ee..9438e0cc2328 100644 --- a/src/libs/SearchParser/baseRules.peggy +++ b/src/libs/SearchParser/baseRules.peggy @@ -73,6 +73,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 671c6501d57a..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(); + } + } } } } @@ -2028,6 +2044,64 @@ function peg$parse(input, options) { return s0; } + function peg$parsepurchaseAmount() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c53) { + peg$currPos += 14; + } else { + s0 = peg$FAILED; + 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$c54) { + peg$currPos += 15; + } 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$parsepurchaseCurrency() { + var s0, s1; + + s0 = input.substr(peg$currPos, 16); + if (s0.toLowerCase() === peg$c55) { + peg$currPos += 16; + } else { + s0 = peg$FAILED; + 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$c56) { + peg$currPos += 17; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e59); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f48(); + } + s0 = s1; + } + + return s0; + } + function peg$parsevalues() { var s0; @@ -2046,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; } @@ -2075,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; } @@ -2104,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; } @@ -2139,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; } @@ -2224,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; @@ -2237,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; @@ -2255,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) { @@ -2265,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 { @@ -2273,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; @@ -2291,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; @@ -2307,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); @@ -2316,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; } @@ -2331,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 { @@ -2368,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); @@ -2377,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); @@ -2385,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 = []; @@ -2394,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); @@ -2403,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); @@ -2411,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 = []; @@ -2420,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); @@ -2429,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; @@ -2445,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; @@ -2462,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); @@ -2471,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); @@ -2479,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 = []; @@ -2488,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; @@ -2504,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; @@ -2535,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; @@ -2566,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; @@ -2593,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; @@ -2609,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; @@ -2640,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; @@ -2671,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; @@ -2695,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; @@ -2707,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; @@ -2722,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; @@ -2760,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); @@ -2769,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 = []; @@ -2778,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); @@ -2787,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 = []; @@ -2796,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); @@ -2805,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(); @@ -2824,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); @@ -2833,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; @@ -2854,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) { @@ -2880,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); } } } } diff --git a/src/libs/SearchParser/searchParser.peggy b/src/libs/SearchParser/searchParser.peggy index f76f3f9e6245..8b9fd03b3493 100644 --- a/src/libs/SearchParser/searchParser.peggy +++ b/src/libs/SearchParser/searchParser.peggy @@ -147,6 +147,8 @@ key "key" / reimbursable / billable / action + / purchaseCurrency + / purchaseAmount ) filterKey diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index 6a05c485f7d8..691bb0efa36f 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -253,7 +253,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(); @@ -524,6 +524,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); }); @@ -643,7 +644,7 @@ function buildFilterFormValuesFromQuery( if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.PAYER) { filtersForm[filterKey] = filterValues.find((id) => 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)); } @@ -703,7 +704,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 +780,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 8d5e70752efb..b51c4194793d 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -215,6 +215,16 @@ const baseFilterConfig = { description: 'workspace.common.workspace' as const, route: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.POLICY_ID), }, + purchaseAmount: { + getTitle: getFilterDisplayTitle, + description: 'common.purchaseAmount' as const, + 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.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.PURCHASE_CURRENCY), + }, }; function getFilterWorkspaceDisplayTitle(filters: SearchAdvancedFiltersForm, policies: WorkspaceListItem[]) { @@ -303,7 +313,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; @@ -326,7 +340,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(', '); } @@ -515,6 +529,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.PURCHASE_AMOUNT || + key === CONST.SEARCH.SYNTAX_FILTER_KEYS.PURCHASE_CURRENCY || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_ID || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TYPE ) { diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx index 55f6bcbaada6..1c1df4db1c2d 100644 --- a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage.tsx @@ -1,71 +1,14 @@ -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, {canBeMissing: false}); - const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true}); - 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.getRoute()); - }} - /> - - - - + ); } diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersGroupCurrencyPage.tsx index 465b0ffda1b5..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.getRoute()); - }} - /> - - - - + ); } diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseAmountPage.tsx new file mode 100644 index 000000000000..3e766d0c1bbe --- /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; diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx new file mode 100644 index 000000000000..6458b3afbbad --- /dev/null +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersPurchaseCurrencyPage.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +import SearchFiltersCurrencyBase from '@components/Search/SearchFiltersCurrencyBase'; +import CONST from '@src/CONST'; + +function SearchFiltersPurchaseCurrencyPage() { + return ( + + ); +} + +SearchFiltersPurchaseCurrencyPage.displayName = 'SearchFiltersPurchaseCurrencyPage'; + +export default SearchFiltersPurchaseCurrencyPage; diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index 24975066ed90..392fc549e41a 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', WITHDRAWAL_ID: 'withdrawalID', } as const; @@ -122,6 +125,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, FILTER_KEYS.WITHDRAWAL_ID, ], [CONST.SEARCH.DATA_TYPES.INVOICE]: [ @@ -169,6 +175,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, FILTER_KEYS.WITHDRAWAL_ID, ], [CONST.SEARCH.DATA_TYPES.TRIP]: [ @@ -215,6 +224,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, @@ -299,6 +311,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[]; [FILTER_KEYS.WITHDRAWAL_ID]: string; } >;