diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 217f7d1e7c88..c0c6cd67419c 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6308,6 +6308,10 @@ const CONST = { YES: 'yes', NO: 'no', }, + WITHDRAWAL_TYPE: { + REIMBURSEMENT: 'reimbursement', + EXPENSIFY_CARD: 'expensify-card', + }, TABLE_COLUMN_SIZES: { NORMAL: 'normal', WIDE: 'wide', @@ -6412,6 +6416,7 @@ const CONST = { BILLABLE: 'billable', POLICY_ID: 'policyID', ACTION: 'action', + WITHDRAWAL_TYPE: 'withdrawalType', }, TAG_EMPTY_VALUE: 'none', CATEGORY_EMPTY_VALUE: 'none,Uncategorized', @@ -6430,6 +6435,7 @@ const CONST = { DATE: 'date', AMOUNT: 'amount', EXPENSE_TYPE: 'expense-type', + WITHDRAWAL_TYPE: 'withdrawal-type', CURRENCY: 'currency', MERCHANT: 'merchant', DESCRIPTION: 'description', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index e79811f5dd9e..1e4ef8bea087 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -73,6 +73,7 @@ const ROUTES = { SEARCH_ADVANCED_FILTERS_CARD: 'search/filters/card', SEARCH_ADVANCED_FILTERS_TAX_RATE: 'search/filters/taxRate', SEARCH_ADVANCED_FILTERS_EXPENSE_TYPE: 'search/filters/expenseType', + SEARCH_ADVANCED_FILTERS_WITHDRAWAL_TYPE: 'search/filters/withdrawalType', SEARCH_ADVANCED_FILTERS_TAG: 'search/filters/tag', SEARCH_ADVANCED_FILTERS_FROM: 'search/filters/from', SEARCH_ADVANCED_FILTERS_TO: 'search/filters/to', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 6e05d7a0fcfa..6d537718c685 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -62,6 +62,7 @@ const SCREENS = { ADVANCED_FILTERS_CARD_RHP: 'Search_Advanced_Filters_Card_RHP', ADVANCED_FILTERS_TAX_RATE_RHP: 'Search_Advanced_Filters_Tax_Rate_RHP', ADVANCED_FILTERS_EXPENSE_TYPE_RHP: 'Search_Advanced_Filters_Expense_Type_RHP', + ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP: 'Search_Advanced_Filters_Withdrawal_Type_RHP', ADVANCED_FILTERS_TAG_RHP: 'Search_Advanced_Filters_Tag_RHP', ADVANCED_FILTERS_FROM_RHP: 'Search_Advanced_Filters_From_RHP', ADVANCED_FILTERS_TO_RHP: 'Search_Advanced_Filters_To_RHP', diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 7c167dfc68bb..4bd5b59b7e73 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -205,6 +205,7 @@ function SearchAutocompleteList( }, [autocompleteQueryValue]); const expenseTypes = Object.values(CONST.SEARCH.TRANSACTION_TYPE); + const withdrawalTypes = Object.values(CONST.SEARCH.WITHDRAWAL_TYPE); const booleanTypes = Object.values(CONST.SEARCH.BOOLEAN); const cardAutocompleteList = useMemo(() => Object.values(allCards), [allCards]); @@ -374,6 +375,16 @@ function SearchAutocompleteList( text: expenseType, })); } + case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE: { + const filteredWithdrawalTypes = withdrawalTypes + .filter((withdrawalType) => withdrawalType.includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.includes(withdrawalType)) + .sort(); + + return filteredWithdrawalTypes.map((withdrawalType) => ({ + filterKey: CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.WITHDRAWAL_TYPE, + text: withdrawalType, + })); + } case CONST.SEARCH.SYNTAX_FILTER_KEYS.FEED: { const filteredFeeds = feedAutoCompleteList .filter((feed) => feed.name.toLowerCase().includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.includes(feed.name.toLowerCase())) diff --git a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx index c00ab90864df..bea809d31dff 100644 --- a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx +++ b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx @@ -163,6 +163,27 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod return [value, displayText]; }, [filterFormValues.postedOn, filterFormValues.postedAfter, filterFormValues.postedBefore, translate]); + const [withdrawalTypeOptions, withdrawalType] = useMemo(() => { + const options = Object.values(CONST.SEARCH.WITHDRAWAL_TYPE).map((value) => { + const getTranslationKey = () => { + switch (value) { + case CONST.SEARCH.WITHDRAWAL_TYPE.REIMBURSEMENT: + return 'search.withdrawalType.reimbursement' as const; + case CONST.SEARCH.WITHDRAWAL_TYPE.EXPENSIFY_CARD: + return 'search.withdrawalType.expensifyCard' as const; + default: + return 'search.withdrawalType.reimbursement' as const; + } + }; + return { + value, + text: translate(getTranslationKey()), + }; + }); + const value = options.find((option) => option.value === filterFormValues.withdrawalType) ?? null; + return [options, value]; + }, [filterFormValues.withdrawalType, translate]); + const updateFilterForm = useCallback( (values: Partial) => { const updatedFilterFormValues: Partial = { @@ -221,6 +242,21 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod [translate, groupByOptions, groupBy, updateFilterForm], ); + const withdrawalTypeComponent = useCallback( + ({closeOverlay}: PopoverComponentProps) => { + return ( + updateFilterForm({withdrawalType: item?.value ?? ''})} + /> + ); + }, + [translate, withdrawalTypeOptions, withdrawalType, updateFilterForm], + ); + const feedComponent = useCallback( ({closeOverlay}: PopoverComponentProps) => { return ( @@ -331,6 +367,7 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod const shouldDisplayGroupByFilter = isDevelopment; const shouldDisplayFeedFilter = feedOptions.length > 1 && !!filterFormValues.feed; const shouldDisplayPostedFilter = !!filterFormValues.feed && (!!filterFormValues.postedOn || !!filterFormValues.postedAfter || !!filterFormValues.postedBefore); + const shouldDisplayWithdrawalTypeFilter = !!filterFormValues.withdrawalType; const filterList = [ { @@ -375,6 +412,16 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod value: status.map((option) => option.text), filterKey: FILTER_KEYS.STATUS, }, + ...(shouldDisplayWithdrawalTypeFilter + ? [ + { + label: translate('search.withdrawalType.title'), + PopoverComponent: withdrawalTypeComponent, + value: withdrawalType?.text ?? '', + filterKey: FILTER_KEYS.WITHDRAWAL_TYPE, + }, + ] + : []), { label: translate('common.date'), PopoverComponent: datePickerComponent, @@ -413,6 +460,8 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod feed, feedComponent, feedOptions.length, + withdrawalType, + withdrawalTypeComponent, ]); if (hasErrors) { diff --git a/src/languages/de.ts b/src/languages/de.ts index ed6c1f598675..5f0c376ccbdc 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6019,6 +6019,11 @@ const translations = { noCategory: 'Keine Kategorie', noTag: 'Kein Tag', expenseType: 'Ausgabentyp', + withdrawalType: { + title: 'Auszahlungstyp', + reimbursement: 'Erstattung', + expensifyCard: 'Expensify card', + }, recentSearches: 'Letzte Suchanfragen', recentChats: 'Letzte Chats', searchIn: 'Suche in', diff --git a/src/languages/en.ts b/src/languages/en.ts index ef7b9e4908b5..3b8fc246f0cc 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5991,6 +5991,11 @@ const translations = { noCategory: 'No category', noTag: 'No tag', expenseType: 'Expense type', + withdrawalType: { + title: 'Withdrawal type', + reimbursement: 'Reimbursement', + expensifyCard: 'Expensify card', + }, recentSearches: 'Recent searches', recentChats: 'Recent chats', searchIn: 'Search in', diff --git a/src/languages/es.ts b/src/languages/es.ts index e8f9f1bf89eb..73ecbce67238 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -6014,6 +6014,11 @@ const translations = { noCategory: 'Sin categoría', noTag: 'Sin etiqueta', expenseType: 'Tipo de gasto', + withdrawalType: { + title: 'Tipo de retiro', + reimbursement: 'Reembolso', + expensifyCard: 'Tarjeta de Expensify', + }, recentSearches: 'Búsquedas recientes', recentChats: 'Chats recientes', searchIn: 'Buscar en', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index a5fc1643ff78..df80f757f9cd 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6033,6 +6033,11 @@ const translations = { noCategory: 'Aucune catégorie', noTag: 'Aucun tag', expenseType: 'Type de dépense', + withdrawalType: { + title: 'Type de retrait', + reimbursement: 'Remboursement', + expensifyCard: 'Expensify card', + }, recentSearches: 'Recherches récentes', recentChats: 'Discussions récentes', searchIn: 'Rechercher dans', diff --git a/src/languages/it.ts b/src/languages/it.ts index 1371ec2a2989..362fa011dc9f 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6035,6 +6035,11 @@ const translations = { noCategory: 'Nessuna categoria', noTag: 'Nessun tag', expenseType: 'Tipo di spesa', + withdrawalType: { + title: 'Tipo di prelievo', + reimbursement: 'Rimborso', + expensifyCard: 'Expensify card', + }, recentSearches: 'Ricerche recenti', recentChats: 'Chat recenti', searchIn: 'Cerca in', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index aebcef05c0a9..79c9164a92b6 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -5992,6 +5992,11 @@ const translations = { noCategory: 'カテゴリなし', noTag: 'タグなし', expenseType: '経費タイプ', + withdrawalType: { + title: '出金タイプ', + reimbursement: '払い戻し', + expensifyCard: 'Expensify card', + }, recentSearches: '最近の検索', recentChats: '最近のチャット', searchIn: 'で検索', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index d43856e80f63..341b6deaacc7 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6027,6 +6027,11 @@ const translations = { noCategory: 'Geen categorie', noTag: 'Geen tag', expenseType: 'Uitgavetype', + withdrawalType: { + title: 'Type opname', + reimbursement: 'Terugbetaling', + expensifyCard: 'Expensify card', + }, recentSearches: 'Recente zoekopdrachten', recentChats: 'Recente chats', searchIn: 'Zoeken in', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index d8977ee43551..1c9fbef53a30 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -6012,6 +6012,11 @@ const translations = { noCategory: 'Brak kategorii', noTag: 'Brak tagu', expenseType: 'Typ wydatku', + withdrawalType: { + title: 'Typ wypłaty', + reimbursement: 'Zwrot', + expensifyCard: 'Expensify card', + }, recentSearches: 'Ostatnie wyszukiwania', recentChats: 'Ostatnie czaty', searchIn: 'Szukaj w', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index c81252be63bb..2d49d9a54a7c 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6026,6 +6026,11 @@ const translations = { noCategory: 'Sem categoria', noTag: 'Sem etiqueta', expenseType: 'Tipo de despesa', + withdrawalType: { + title: 'Tipo de saque', + reimbursement: 'Reembolso', + expensifyCard: 'Expensify card', + }, recentSearches: 'Pesquisas recentes', recentChats: 'Chats recentes', searchIn: 'Pesquisar em', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 799557f2ca9f..585599910753 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -5915,6 +5915,11 @@ const translations = { noCategory: '无类别', noTag: '无标签', expenseType: '费用类型', + withdrawalType: { + title: '提款类型', + reimbursement: '报销', + expensifyCard: 'Expensify card', + }, recentSearches: '最近的搜索', recentChats: '最近的聊天记录', searchIn: '搜索在', diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 58e1ae6a08b9..546aa7605011 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -749,6 +749,7 @@ const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersCardPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_TAX_RATE_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersTaxRatePage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_EXPENSE_TYPE_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersExpenseTypePage').default, + [SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalTypePage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersTagPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_FROM_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersFromPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_TO_RHP]: () => require('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersToPage').default, diff --git a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts index 23a058770ffb..3c8e6daa65b2 100644 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts @@ -26,6 +26,7 @@ const SEARCH_TO_RHP: Partial['config'] = { [SCREENS.SEARCH.ADVANCED_FILTERS_CARD_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_CARD, [SCREENS.SEARCH.ADVANCED_FILTERS_TAX_RATE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_TAX_RATE, [SCREENS.SEARCH.ADVANCED_FILTERS_EXPENSE_TYPE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_EXPENSE_TYPE, + [SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_WITHDRAWAL_TYPE, [SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_TAG, [SCREENS.SEARCH.ADVANCED_FILTERS_FROM_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_FROM, [SCREENS.SEARCH.ADVANCED_FILTERS_TO_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_TO, diff --git a/src/libs/SearchAutocompleteUtils.ts b/src/libs/SearchAutocompleteUtils.ts index 3bb01e2dd901..a356883b8556 100644 --- a/src/libs/SearchAutocompleteUtils.ts +++ b/src/libs/SearchAutocompleteUtils.ts @@ -124,6 +124,7 @@ function filterOutRangesWithCorrectValue( const typeList = Object.values(CONST.SEARCH.DATA_TYPES) as string[]; const expenseTypeList = Object.values(CONST.SEARCH.TRANSACTION_TYPE) as string[]; + const withdrawalTypeList = Object.values(CONST.SEARCH.WITHDRAWAL_TYPE) as string[]; const statusList = Object.values({ ...CONST.SEARCH.STATUS.EXPENSE, ...CONST.SEARCH.STATUS.INVOICE, @@ -157,6 +158,8 @@ function filterOutRangesWithCorrectValue( return typeList.includes(range.value); case CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPENSE_TYPE: return expenseTypeList.includes(range.value); + case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE: + return withdrawalTypeList.includes(range.value); case CONST.SEARCH.SYNTAX_ROOT_KEYS.STATUS: return statusList.includes(range.value); case CONST.SEARCH.SYNTAX_FILTER_KEYS.ACTION: diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index e384114eabe1..1dd4771a555a 100644 --- a/src/libs/SearchParser/autocompleteParser.js +++ b/src/libs/SearchParser/autocompleteParser.js @@ -227,14 +227,16 @@ function peg$parse(input, options) { var peg$c41 = "createdby"; var peg$c42 = "created-by"; var peg$c43 = "action"; - var peg$c44 = "!="; - var peg$c45 = ">="; - var peg$c46 = ">"; - var peg$c47 = "<="; - var peg$c48 = "<"; - var peg$c49 = "\u201C"; - var peg$c50 = "\u201D"; - var peg$c51 = "\""; + var peg$c44 = "withdrawaltype"; + var peg$c45 = "withdrawal-type"; + var peg$c46 = "!="; + var peg$c47 = ">="; + var peg$c48 = ">"; + var peg$c49 = "<="; + var peg$c50 = "<"; + var peg$c51 = "\u201C"; + var peg$c52 = "\u201D"; + var peg$c53 = "\""; var peg$r0 = /^[:=]/; var peg$r1 = /^[^ ,\t\n\r\xA0]/; @@ -293,30 +295,32 @@ function peg$parse(input, options) { var peg$e42 = peg$literalExpectation("createdBy", true); var peg$e43 = peg$literalExpectation("created-by", true); var peg$e44 = peg$literalExpectation("action", true); - var peg$e45 = peg$otherExpectation("operator"); - var peg$e46 = peg$classExpectation([":", "="], false, false); - var peg$e47 = peg$literalExpectation("!=", false); - var peg$e48 = peg$literalExpectation(">=", false); - var peg$e49 = peg$literalExpectation(">", false); - var peg$e50 = peg$literalExpectation("<=", false); - var peg$e51 = peg$literalExpectation("<", false); - var peg$e52 = peg$otherExpectation("word"); - var peg$e53 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e54 = peg$otherExpectation("whitespace"); - var peg$e55 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e56 = peg$otherExpectation("quote"); - var peg$e57 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e58 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e59 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e60 = peg$literalExpectation("\u201C", false); - var peg$e61 = peg$literalExpectation("\u201D", false); - var peg$e62 = peg$literalExpectation("\"", false); - var peg$e63 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e64 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e65 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e66 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e67 = peg$anyExpectation(); - var peg$e68 = peg$classExpectation([","], false, false); + var peg$e45 = peg$literalExpectation("withdrawalType", true); + var peg$e46 = peg$literalExpectation("withdrawal-type", true); + var peg$e47 = peg$otherExpectation("operator"); + var peg$e48 = peg$classExpectation([":", "="], false, false); + var peg$e49 = peg$literalExpectation("!=", false); + var peg$e50 = peg$literalExpectation(">=", false); + var peg$e51 = peg$literalExpectation(">", false); + var peg$e52 = peg$literalExpectation("<=", false); + var peg$e53 = peg$literalExpectation("<", false); + var peg$e54 = peg$otherExpectation("word"); + var peg$e55 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e56 = peg$otherExpectation("whitespace"); + var peg$e57 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e58 = peg$otherExpectation("quote"); + var peg$e59 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e60 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e61 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e62 = peg$literalExpectation("\u201C", false); + var peg$e63 = peg$literalExpectation("\u201D", false); + var peg$e64 = peg$literalExpectation("\"", false); + var peg$e65 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e66 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e67 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e68 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e69 = peg$anyExpectation(); + var peg$e70 = peg$classExpectation([","], false, false); var peg$f0 = function(ranges) { return { autocomplete, ranges }; }; var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); }; @@ -406,28 +410,29 @@ function peg$parse(input, options) { var peg$f38 = function() { return "assignee"; }; var peg$f39 = function() { return "createdBy"; }; var peg$f40 = function() { return "action"; }; - var peg$f41 = function() { return "eq"; }; - var peg$f42 = function() { return "neq"; }; - var peg$f43 = function() { return "gte"; }; - var peg$f44 = function() { return "gt"; }; - var peg$f45 = function() { return "lte"; }; - var peg$f46 = function() { return "lt"; }; - var peg$f47 = function(o) { + var peg$f41 = function() {return "withdrawalType"; }; + var peg$f42 = function() { return "eq"; }; + var peg$f43 = function() { return "neq"; }; + var peg$f44 = function() { return "gte"; }; + var peg$f45 = function() { return "gt"; }; + var peg$f46 = function() { return "lte"; }; + var peg$f47 = function() { return "lt"; }; + var peg$f48 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f48 = function(chars) { return chars.join("").trim(); }; - var peg$f49 = function() { return "and"; }; - var peg$f50 = function() { return expectingNestedQuote; }; - var peg$f51 = function(start, inner, end) { //handle no-breaking space + var peg$f49 = function(chars) { return chars.join("").trim(); }; + var peg$f50 = function() { return "and"; }; + var peg$f51 = function() { return expectingNestedQuote; }; + var peg$f52 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f52 = function(start) {return "“"}; - var peg$f53 = function(start) {return "”"}; - var peg$f54 = function(start) {return "\""}; - var peg$f55 = function(start, inner, end) { + var peg$f53 = function(start) {return "“"}; + var peg$f54 = function(start) {return "”"}; + var peg$f55 = function(start) {return "\""}; + var peg$f56 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -754,6 +759,9 @@ function peg$parse(input, options) { s1 = peg$parseposted(); if (s1 === peg$FAILED) { s1 = peg$parseexported(); + if (s1 === peg$FAILED) { + s1 = peg$parsewithdrawalType(); + } } } } @@ -1639,6 +1647,35 @@ function peg$parse(input, options) { return s0; } + function peg$parsewithdrawalType() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c44) { + peg$currPos += 14; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e45); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 15); + if (s1.toLowerCase() === peg$c45) { + peg$currPos += 15; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e46); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f41(); + } + s0 = s1; + } + + return s0; + } + function peg$parseoperator() { var s0, s1; @@ -1649,81 +1686,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e46); } + if (peg$silentFails === 0) { peg$fail(peg$e48); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f41(); + s1 = peg$f42(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c44) { - s1 = peg$c44; + if (input.substr(peg$currPos, 2) === peg$c46) { + s1 = peg$c46; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e47); } + if (peg$silentFails === 0) { peg$fail(peg$e49); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f42(); + s1 = peg$f43(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c45) { - s1 = peg$c45; + if (input.substr(peg$currPos, 2) === peg$c47) { + s1 = peg$c47; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e48); } + if (peg$silentFails === 0) { peg$fail(peg$e50); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f43(); + s1 = peg$f44(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c46; + s1 = peg$c48; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e49); } + if (peg$silentFails === 0) { peg$fail(peg$e51); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f44(); + s1 = peg$f45(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c47) { - s1 = peg$c47; + if (input.substr(peg$currPos, 2) === peg$c49) { + s1 = peg$c49; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e50); } + if (peg$silentFails === 0) { peg$fail(peg$e52); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f45(); + s1 = peg$f46(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c48; + s1 = peg$c50; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e51); } + if (peg$silentFails === 0) { peg$fail(peg$e53); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f47(); } s0 = s1; } @@ -1734,7 +1771,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e45); } + if (peg$silentFails === 0) { peg$fail(peg$e47); } } return s0; @@ -1747,7 +1784,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(s1); + s1 = peg$f48(s1); } s0 = s1; @@ -1765,7 +1802,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -1775,7 +1812,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } } } else { @@ -1783,13 +1820,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(s1); + s1 = peg$f49(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e54); } } return s0; @@ -1801,7 +1838,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f49(); + s1 = peg$f50(); s0 = s1; return s0; @@ -1817,7 +1854,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -1826,12 +1863,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } return s0; } @@ -1841,7 +1878,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f50(); + s1 = peg$f51(); if (s1) { s1 = undefined; } else { @@ -1878,7 +1915,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -1887,7 +1924,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } } s2 = input.charAt(peg$currPos); @@ -1895,7 +1932,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s2 !== peg$FAILED) { s3 = []; @@ -1904,7 +1941,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -1913,7 +1950,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } } s4 = input.charAt(peg$currPos); @@ -1921,7 +1958,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s4 !== peg$FAILED) { s5 = []; @@ -1930,7 +1967,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -1939,11 +1976,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } } } peg$savedPos = s0; - s0 = peg$f51(s1, s3, s5); + s0 = peg$f52(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1955,7 +1992,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } return s0; @@ -1972,7 +2009,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -1981,7 +2018,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } } s2 = input.charAt(peg$currPos); @@ -1989,7 +2026,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s2 !== peg$FAILED) { s3 = []; @@ -1998,7 +2035,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2014,15 +2051,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f52(s1); + s4 = peg$f53(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2045,15 +2082,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2076,15 +2113,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c53; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2103,7 +2140,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2119,15 +2156,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f52(s1); + s4 = peg$f53(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2150,15 +2187,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2181,15 +2218,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c53; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2205,7 +2242,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f55(s1, s3, s4); + s0 = peg$f56(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2217,7 +2254,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } } return s0; @@ -2232,7 +2269,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e58); } + if (peg$silentFails === 0) { peg$fail(peg$e60); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2270,7 +2307,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2279,7 +2316,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } } s2 = []; @@ -2288,7 +2325,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2297,7 +2334,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } } s3 = []; @@ -2306,7 +2343,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2315,7 +2352,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } } s4 = peg$parseoperator(); @@ -2334,7 +2371,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$e68); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2343,7 +2380,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$e68); } } } s2 = peg$currPos; @@ -2364,7 +2401,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2390,7 +2427,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e68); } + if (peg$silentFails === 0) { peg$fail(peg$e70); } } } } diff --git a/src/libs/SearchParser/autocompleteParser.peggy b/src/libs/SearchParser/autocompleteParser.peggy index 5b3f2480db2c..baa566ba7244 100644 --- a/src/libs/SearchParser/autocompleteParser.peggy +++ b/src/libs/SearchParser/autocompleteParser.peggy @@ -80,6 +80,7 @@ autocompleteKey "key" / action / posted / exported + / withdrawalType ) filterKey diff --git a/src/libs/SearchParser/baseRules.peggy b/src/libs/SearchParser/baseRules.peggy index fe4b8afd047f..a126978fa393 100644 --- a/src/libs/SearchParser/baseRules.peggy +++ b/src/libs/SearchParser/baseRules.peggy @@ -62,6 +62,7 @@ title = "title"i { return "title"; } assignee = "assignee"i { return "assignee"; } createdBy = "createdBy"i / "created-by"i { return "createdBy"; } action = "action"i { return "action"; } +withdrawalType = "withdrawalType"i / "withdrawal-type"i {return "withdrawalType"; } operator "operator" = (":" / "=") { return "eq"; } diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js index d189aa0dc8ee..2aa99f08961a 100644 --- a/src/libs/SearchParser/searchParser.js +++ b/src/libs/SearchParser/searchParser.js @@ -228,14 +228,16 @@ function peg$parse(input, options) { var peg$c41 = "createdby"; var peg$c42 = "created-by"; var peg$c43 = "action"; - var peg$c44 = "!="; - var peg$c45 = ">="; - var peg$c46 = ">"; - var peg$c47 = "<="; - var peg$c48 = "<"; - var peg$c49 = "\u201C"; - var peg$c50 = "\u201D"; - var peg$c51 = "\""; + var peg$c44 = "withdrawaltype"; + var peg$c45 = "withdrawal-type"; + var peg$c46 = "!="; + var peg$c47 = ">="; + var peg$c48 = ">"; + var peg$c49 = "<="; + var peg$c50 = "<"; + var peg$c51 = "\u201C"; + var peg$c52 = "\u201D"; + var peg$c53 = "\""; var peg$r0 = /^[^ \t\r\n\xA0]/; var peg$r1 = /^[:=]/; @@ -297,30 +299,32 @@ function peg$parse(input, options) { var peg$e44 = peg$literalExpectation("createdBy", true); var peg$e45 = peg$literalExpectation("created-by", true); var peg$e46 = peg$literalExpectation("action", true); - var peg$e47 = peg$otherExpectation("operator"); - var peg$e48 = peg$classExpectation([":", "="], false, false); - var peg$e49 = peg$literalExpectation("!=", false); - var peg$e50 = peg$literalExpectation(">=", false); - var peg$e51 = peg$literalExpectation(">", false); - var peg$e52 = peg$literalExpectation("<=", false); - var peg$e53 = peg$literalExpectation("<", false); - var peg$e54 = peg$otherExpectation("word"); - var peg$e55 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e56 = peg$otherExpectation("whitespace"); - var peg$e57 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e58 = peg$otherExpectation("quote"); - var peg$e59 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e60 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e61 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e62 = peg$literalExpectation("\u201C", false); - var peg$e63 = peg$literalExpectation("\u201D", false); - var peg$e64 = peg$literalExpectation("\"", false); - var peg$e65 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e66 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e67 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e68 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e69 = peg$anyExpectation(); - var peg$e70 = peg$classExpectation([","], false, false); + var peg$e47 = peg$literalExpectation("withdrawalType", true); + var peg$e48 = peg$literalExpectation("withdrawal-type", true); + var peg$e49 = peg$otherExpectation("operator"); + var peg$e50 = peg$classExpectation([":", "="], false, false); + var peg$e51 = peg$literalExpectation("!=", false); + var peg$e52 = peg$literalExpectation(">=", false); + var peg$e53 = peg$literalExpectation(">", false); + var peg$e54 = peg$literalExpectation("<=", false); + var peg$e55 = peg$literalExpectation("<", false); + var peg$e56 = peg$otherExpectation("word"); + var peg$e57 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e58 = peg$otherExpectation("whitespace"); + var peg$e59 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e60 = peg$otherExpectation("quote"); + var peg$e61 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e62 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e63 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e64 = peg$literalExpectation("\u201C", false); + var peg$e65 = peg$literalExpectation("\u201D", false); + var peg$e66 = peg$literalExpectation("\"", false); + var peg$e67 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e68 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e69 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e70 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e71 = peg$anyExpectation(); + var peg$e72 = peg$classExpectation([","], false, false); var peg$f0 = function(filters) { return applyDefaults(filters); }; var peg$f1 = function(head, tail) { @@ -422,28 +426,29 @@ function peg$parse(input, options) { var peg$f39 = function() { return "assignee"; }; var peg$f40 = function() { return "createdBy"; }; var peg$f41 = function() { return "action"; }; - var peg$f42 = function() { return "eq"; }; - var peg$f43 = function() { return "neq"; }; - var peg$f44 = function() { return "gte"; }; - var peg$f45 = function() { return "gt"; }; - var peg$f46 = function() { return "lte"; }; - var peg$f47 = function() { return "lt"; }; - var peg$f48 = function(o) { + var peg$f42 = function() {return "withdrawalType"; }; + var peg$f43 = function() { return "eq"; }; + var peg$f44 = function() { return "neq"; }; + var peg$f45 = function() { return "gte"; }; + var peg$f46 = function() { return "gt"; }; + var peg$f47 = function() { return "lte"; }; + var peg$f48 = function() { return "lt"; }; + var peg$f49 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq"); // Use simple parser if no valid operator is found } return o; }; - var peg$f49 = function(chars) { return chars.join("").trim(); }; - var peg$f50 = function() { return "and"; }; - var peg$f51 = function() { return expectingNestedQuote; }; - var peg$f52 = function(start, inner, end) { //handle no-breaking space + var peg$f50 = function(chars) { return chars.join("").trim(); }; + var peg$f51 = function() { return "and"; }; + var peg$f52 = function() { return expectingNestedQuote; }; + var peg$f53 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f53 = function(start) {return "“"}; - var peg$f54 = function(start) {return "”"}; - var peg$f55 = function(start) {return "\""}; - var peg$f56 = function(start, inner, end) { + var peg$f54 = function(start) {return "“"}; + var peg$f55 = function(start) {return "”"}; + var peg$f56 = function(start) {return "\""}; + var peg$f57 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; var peg$currPos = options.peg$currPos | 0; @@ -851,6 +856,9 @@ function peg$parse(input, options) { s1 = peg$parsebillable(); if (s1 === peg$FAILED) { s1 = peg$parseaction(); + if (s1 === peg$FAILED) { + s1 = peg$parsewithdrawalType(); + } } } } @@ -1833,6 +1841,35 @@ function peg$parse(input, options) { return s0; } + function peg$parsewithdrawalType() { + var s0, s1; + + s0 = input.substr(peg$currPos, 14); + if (s0.toLowerCase() === peg$c44) { + peg$currPos += 14; + } else { + s0 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e47); } + } + if (s0 === peg$FAILED) { + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 15); + if (s1.toLowerCase() === peg$c45) { + peg$currPos += 15; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e48); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f42(); + } + s0 = s1; + } + + return s0; + } + function peg$parseoperator() { var s0, s1; @@ -1843,81 +1880,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e48); } + if (peg$silentFails === 0) { peg$fail(peg$e50); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f42(); + s1 = peg$f43(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c44) { - s1 = peg$c44; + if (input.substr(peg$currPos, 2) === peg$c46) { + s1 = peg$c46; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e49); } + if (peg$silentFails === 0) { peg$fail(peg$e51); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f43(); + s1 = peg$f44(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c45) { - s1 = peg$c45; + if (input.substr(peg$currPos, 2) === peg$c47) { + s1 = peg$c47; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e50); } + if (peg$silentFails === 0) { peg$fail(peg$e52); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f44(); + s1 = peg$f45(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c46; + s1 = peg$c48; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e51); } + if (peg$silentFails === 0) { peg$fail(peg$e53); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f45(); + s1 = peg$f46(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c47) { - s1 = peg$c47; + if (input.substr(peg$currPos, 2) === peg$c49) { + s1 = peg$c49; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e54); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f47(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c48; + s1 = peg$c50; peg$currPos++; } 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$f47(); + s1 = peg$f48(); } s0 = s1; } @@ -1928,7 +1965,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e47); } + if (peg$silentFails === 0) { peg$fail(peg$e49); } } return s0; @@ -1941,7 +1978,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f48(s1); + s1 = peg$f49(s1); } s0 = s1; @@ -1959,7 +1996,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -1969,7 +2006,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } } } else { @@ -1977,13 +2014,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f49(s1); + s1 = peg$f50(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e56); } } return s0; @@ -1995,7 +2032,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f50(); + s1 = peg$f51(); s0 = s1; return s0; @@ -2011,7 +2048,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2020,12 +2057,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e57); } + if (peg$silentFails === 0) { peg$fail(peg$e59); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e58); } return s0; } @@ -2035,7 +2072,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f51(); + s1 = peg$f52(); if (s1) { s1 = undefined; } else { @@ -2072,7 +2109,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2081,7 +2118,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } } s2 = input.charAt(peg$currPos); @@ -2089,7 +2126,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2098,7 +2135,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2107,7 +2144,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } } s4 = input.charAt(peg$currPos); @@ -2115,7 +2152,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2124,7 +2161,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2133,11 +2170,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e55); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } } } peg$savedPos = s0; - s0 = peg$f52(s1, s3, s5); + s0 = peg$f53(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2149,7 +2186,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$e60); } } return s0; @@ -2166,7 +2203,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2175,7 +2212,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e59); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } } s2 = input.charAt(peg$currPos); @@ -2183,7 +2220,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2192,7 +2229,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2208,15 +2245,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2239,15 +2276,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2270,15 +2307,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c53; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f55(s1); + s4 = peg$f56(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2297,7 +2334,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2313,15 +2350,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e64); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2344,15 +2381,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2375,15 +2412,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c53; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e66); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f55(s1); + s4 = peg$f56(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2399,7 +2436,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f56(s1, s3, s4); + s0 = peg$f57(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2411,7 +2448,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$e60); } } return s0; @@ -2426,7 +2463,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2464,7 +2501,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2473,7 +2510,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e65); } + if (peg$silentFails === 0) { peg$fail(peg$e67); } } } s2 = []; @@ -2482,7 +2519,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2491,7 +2528,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e66); } + if (peg$silentFails === 0) { peg$fail(peg$e68); } } } s3 = []; @@ -2500,7 +2537,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2509,7 +2546,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e67); } + if (peg$silentFails === 0) { peg$fail(peg$e69); } } } s4 = peg$parseoperator(); @@ -2528,7 +2565,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$e70); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2537,7 +2574,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$e70); } } } s2 = peg$currPos; @@ -2558,7 +2595,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e69); } + if (peg$silentFails === 0) { peg$fail(peg$e71); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2584,7 +2621,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e70); } + if (peg$silentFails === 0) { peg$fail(peg$e72); } } } } diff --git a/src/libs/SearchParser/searchParser.peggy b/src/libs/SearchParser/searchParser.peggy index e2fb25d13be2..d8d5d07dd26c 100644 --- a/src/libs/SearchParser/searchParser.peggy +++ b/src/libs/SearchParser/searchParser.peggy @@ -138,6 +138,7 @@ key "key" / reimbursable / billable / action + / withdrawalType ) filterKey diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index 1396889c6973..506bf8154e69 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -66,6 +66,7 @@ const UserFriendlyKeyMap: Record CONST.SEARCH.SYNTAX_FILTER_KEYS[key] === filterKey); + if (keyInCorrectForm) { + return `${CONST.SEARCH.SYNTAX_FILTER_KEYS[keyInCorrectForm]}:${sanitizeSearchValue(filterValue as string)}`; + } + } + if ( (filterKey === FILTER_KEYS.CATEGORY || filterKey === FILTER_KEYS.CARD_ID || @@ -565,10 +573,18 @@ function buildFilterFormValuesFromQuery( ) { filtersForm[filterKey] = filterValues.at(0); } + if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE) { + const withdrawalType = filterValues.at(0); + const validWithdrawalTypes = new Set(Object.values(CONST.SEARCH.WITHDRAWAL_TYPE)); + if (withdrawalType && validWithdrawalTypes.has(withdrawalType as ValueOf)) { + filtersForm[filterKey] = withdrawalType; + } + } if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPENSE_TYPE) { const validExpenseTypes = new Set(Object.values(CONST.SEARCH.TRANSACTION_TYPE)); filtersForm[filterKey] = filterValues.filter((expenseType) => validExpenseTypes.has(expenseType as ValueOf)); } + if (filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID) { filtersForm[filterKey] = filterValues.filter((card) => cardList[card]); } diff --git a/src/libs/SearchUIUtils.ts b/src/libs/SearchUIUtils.ts index 817062312faf..b25417e7d947 100644 --- a/src/libs/SearchUIUtils.ts +++ b/src/libs/SearchUIUtils.ts @@ -1480,6 +1480,19 @@ function getExpenseTypeTranslationKey(expenseType: ValueOf): TranslationPaths { + // eslint-disable-next-line default-case + switch (withdrawalType) { + case CONST.SEARCH.WITHDRAWAL_TYPE.REIMBURSEMENT: + return 'search.withdrawalType.reimbursement'; + case CONST.SEARCH.WITHDRAWAL_TYPE.EXPENSIFY_CARD: + return 'search.withdrawalType.expensifyCard'; + } +} + /** * Constructs and configures the overflow menu for search items, handling interactions such as renaming or deleting items. */ @@ -1790,6 +1803,7 @@ export { isReportActionListItemType, shouldShowYear, getExpenseTypeTranslationKey, + getWithdrawalTypeTranslationKey, getOverflowMenu, isCorrectSearchUserName, isReportActionEntry, diff --git a/src/pages/Search/AdvancedSearchFilters.tsx b/src/pages/Search/AdvancedSearchFilters.tsx index f03ef09415ed..34a96b2354dd 100644 --- a/src/pages/Search/AdvancedSearchFilters.tsx +++ b/src/pages/Search/AdvancedSearchFilters.tsx @@ -36,7 +36,7 @@ import { isSearchDatePreset, sortOptionsWithEmptyValue, } from '@libs/SearchQueryUtils'; -import {getExpenseTypeTranslationKey, getStatusOptions} from '@libs/SearchUIUtils'; +import {getExpenseTypeTranslationKey, getStatusOptions, getWithdrawalTypeTranslationKey} from '@libs/SearchUIUtils'; import CONST from '@src/CONST'; import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -154,6 +154,11 @@ const baseFilterConfig = { description: 'search.expenseType' as const, route: ROUTES.SEARCH_ADVANCED_FILTERS_EXPENSE_TYPE, }, + withdrawalType: { + getTitle: getFilterWithdrawalTypeDisplayTitle, + description: 'search.withdrawalType.title' as const, + route: ROUTES.SEARCH_ADVANCED_FILTERS_WITHDRAWAL_TYPE, + }, tag: { getTitle: getFilterDisplayTitle, description: 'common.tag' as const, @@ -218,6 +223,7 @@ const typeFiltersKeys = { ], [ CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPENSE_TYPE, + CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE, CONST.SEARCH.SYNTAX_FILTER_KEYS.MERCHANT, CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, CONST.SEARCH.SYNTAX_FILTER_KEYS.AMOUNT, @@ -522,6 +528,13 @@ function getFilterExpenseDisplayTitle(filters: Partial, translate: LocaleContextProps['translate']) { + const filterValue = filters[CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE]; + return filterValue && Object.values(CONST.SEARCH.WITHDRAWAL_TYPE).includes(filterValue as ValueOf) + ? translate(getWithdrawalTypeTranslationKey(filterValue as ValueOf)) + : undefined; +} + function getFilterInDisplayTitle(filters: Partial, _: LocaleContextProps['translate'], reports?: OnyxCollection) { return filters.in ? filters.in @@ -696,6 +709,8 @@ function AdvancedSearchFilters() { filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, taxRates); } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPENSE_TYPE) { filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, translate); + } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE) { + filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters, translate); } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.TO || key === CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE) { filterTitle = baseFilterConfig[key].getTitle(searchAdvancedFilters[key] ?? [], personalDetails, formatPhoneNumber); } else if (key === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN) { diff --git a/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalTypePage.tsx b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalTypePage.tsx new file mode 100644 index 000000000000..71a3020d3bfd --- /dev/null +++ b/src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalTypePage.tsx @@ -0,0 +1,89 @@ +import React, {useCallback, useMemo, useState} from 'react'; +import {View} from 'react-native'; +import type {ValueOf} from 'type-fest'; +import FixedFooter from '@components/FixedFooter'; +import HeaderWithBackButton from '@components/HeaderWithBackButton'; +import ScreenWrapper from '@components/ScreenWrapper'; +import SearchFilterPageFooterButtons from '@components/Search/SearchFilterPageFooterButtons'; +import SelectionList from '@components/SelectionList'; +import SingleSelectListItem from '@components/SelectionList/SingleSelectListItem'; +import type {ListItem} from '@components/SelectionList/types'; +import useLocalize from '@hooks/useLocalize'; +import useOnyx from '@hooks/useOnyx'; +import useThemeStyles from '@hooks/useThemeStyles'; +import {updateAdvancedFilters} from '@libs/actions/Search'; +import Navigation from '@libs/Navigation/Navigation'; +import {getWithdrawalTypeTranslationKey} from '@libs/SearchUIUtils'; +import CONST from '@src/CONST'; +import ONYXKEYS from '@src/ONYXKEYS'; +import ROUTES from '@src/ROUTES'; + +function SearchFiltersWithdrawalTypePage() { + const styles = useThemeStyles(); + const {translate} = useLocalize(); + + + + const [searchAdvancedFiltersForm] = useOnyx(ONYXKEYS.FORMS.SEARCH_ADVANCED_FILTERS_FORM, {canBeMissing: true}); + const [selectedItem, setSelectedItem] = useState(() => { + const currentValue = searchAdvancedFiltersForm?.withdrawalType; + return Object.values(CONST.SEARCH.WITHDRAWAL_TYPE).includes(currentValue as ValueOf) + ? currentValue + : null; + }); + + const listData: Array>> = useMemo(() => { + return Object.values(CONST.SEARCH.WITHDRAWAL_TYPE).map((withdrawalType) => ({ + text: translate(getWithdrawalTypeTranslationKey(withdrawalType)), + keyForList: withdrawalType, + isSelected: selectedItem === withdrawalType, + })); + }, [selectedItem, translate]); + + const updateSelectedItem = useCallback((item: ListItem>) => { + setSelectedItem(item?.keyForList ?? null); + }, []); + + const resetChanges = useCallback(() => { + setSelectedItem(null); + }, []); + + const applyChanges = useCallback(() => { + updateAdvancedFilters({withdrawalType: selectedItem ?? ''}); + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); + }, [selectedItem]); + + return ( + + { + Navigation.goBack(ROUTES.SEARCH_ADVANCED_FILTERS); + }} + /> + + + + + + + + ); +} + +SearchFiltersWithdrawalTypePage.displayName = 'SearchFiltersWithdrawalTypePage'; + +export default SearchFiltersWithdrawalTypePage; diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index f7e5199abfb7..af2ea1d1eb4a 100644 --- a/src/types/form/SearchAdvancedFiltersForm.ts +++ b/src/types/form/SearchAdvancedFiltersForm.ts @@ -59,6 +59,7 @@ const FILTER_KEYS = { REIMBURSABLE: 'reimbursable', BILLABLE: 'billable', ACTION: 'action', + WITHDRAWAL_TYPE: 'withdrawalType', } as const; const ALLOWED_TYPE_FILTERS = { @@ -70,6 +71,7 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.KEYWORD, FILTER_KEYS.POLICY_ID, FILTER_KEYS.EXPENSE_TYPE, + FILTER_KEYS.WITHDRAWAL_TYPE, FILTER_KEYS.MERCHANT, FILTER_KEYS.DATE_ON, FILTER_KEYS.DATE_AFTER, @@ -265,6 +267,7 @@ type SearchAdvancedFiltersForm = Form< [FILTER_KEYS.REIMBURSABLE]: string; [FILTER_KEYS.BILLABLE]: string; [FILTER_KEYS.ACTION]: string; + [FILTER_KEYS.WITHDRAWAL_TYPE]: string; } >;