diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 2baafa94be12..adeed5dc1aa4 100755 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -6399,6 +6399,7 @@ const CONST = { PAID: 'paid', EXPORTED: 'exported', POSTED: 'posted', + WITHDRAWN: 'withdrawn', TITLE: 'title', ASSIGNEE: 'assignee', REIMBURSABLE: 'reimbursable', @@ -6443,6 +6444,7 @@ const CONST = { PAID: 'paid', EXPORTED: 'exported', POSTED: 'posted', + WITHDRAWN: 'withdrawn', TITLE: 'title', ASSIGNEE: 'assignee', REIMBURSABLE: 'reimbursable', diff --git a/src/ROUTES.ts b/src/ROUTES.ts index 470c6f6dc251..77afb5942a08 100644 --- a/src/ROUTES.ts +++ b/src/ROUTES.ts @@ -82,6 +82,7 @@ const ROUTES = { SEARCH_ADVANCED_FILTERS_PAID: 'search/filters/paid', SEARCH_ADVANCED_FILTERS_EXPORTED: 'search/filters/exported', SEARCH_ADVANCED_FILTERS_POSTED: 'search/filters/posted', + SEARCH_ADVANCED_FILTERS_WITHDRAWN: 'search/filters/withdrawn', SEARCH_ADVANCED_FILTERS_TITLE: 'search/filters/title', SEARCH_ADVANCED_FILTERS_ASSIGNEE: 'search/filters/assignee', SEARCH_ADVANCED_FILTERS_REIMBURSABLE: 'search/filters/reimbursable', diff --git a/src/SCREENS.ts b/src/SCREENS.ts index 3190d019f814..49215b426ee8 100644 --- a/src/SCREENS.ts +++ b/src/SCREENS.ts @@ -52,6 +52,7 @@ const SCREENS = { ADVANCED_FILTERS_PAID_RHP: 'Search_Advanced_Filters_Paid_RHP', ADVANCED_FILTERS_EXPORTED_RHP: 'Search_Advanced_Filters_Exported_RHP', ADVANCED_FILTERS_POSTED_RHP: 'Search_Advanced_Filters_Posted_RHP', + ADVANCED_FILTERS_WITHDRAWN_RHP: 'Search_Advanced_Filters_Withdrawn_RHP', ADVANCED_FILTERS_CURRENCY_RHP: 'Search_Advanced_Filters_Currency_RHP', ADVANCED_FILTERS_DESCRIPTION_RHP: 'Search_Advanced_Filters_Description_RHP', ADVANCED_FILTERS_MERCHANT_RHP: 'Search_Advanced_Filters_Merchant_RHP', diff --git a/src/components/Search/SearchAutocompleteList.tsx b/src/components/Search/SearchAutocompleteList.tsx index 7c167dfc68bb..b0b05944c84d 100644 --- a/src/components/Search/SearchAutocompleteList.tsx +++ b/src/components/Search/SearchAutocompleteList.tsx @@ -432,6 +432,7 @@ function SearchAutocompleteList( text: status, })); } + case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN: case CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED: case CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED: { const filteredDatePresets = (getDatePresets(autocompleteKey, true) ?? []) diff --git a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx index c00ab90864df..52052ad37e57 100644 --- a/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx +++ b/src/components/Search/SearchPageHeader/SearchFiltersBar.tsx @@ -17,7 +17,7 @@ import SingleSelectPopup from '@components/Search/FilterDropdowns/SingleSelectPo import UserSelectPopup from '@components/Search/FilterDropdowns/UserSelectPopup'; import {useSearchContext} from '@components/Search/SearchContext'; import type {SearchDateValues} from '@components/Search/SearchDatePresetFilterBase'; -import type {SearchQueryJSON, SingularSearchStatus} from '@components/Search/types'; +import type {SearchDateFilterKeys, SearchQueryJSON, SingularSearchStatus} from '@components/Search/types'; import SearchFiltersSkeleton from '@components/Skeletons/SearchFiltersSkeleton'; import useEnvironment from '@hooks/useEnvironment'; import useLocalize from '@hooks/useLocalize'; @@ -42,6 +42,7 @@ import { } from '@libs/SearchQueryUtils'; import {getDatePresets, getFeedOptions, getGroupByOptions, getStatusOptions, getTypeOptions} from '@libs/SearchUIUtils'; import CONST from '@src/CONST'; +import type {TranslationPaths} from '@src/languages/types'; import ONYXKEYS from '@src/ONYXKEYS'; import ROUTES from '@src/ROUTES'; import type {SearchAdvancedFiltersForm} from '@src/types/form'; @@ -142,26 +143,51 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod return [value, displayText]; }, [filterFormValues.dateOn, filterFormValues.dateAfter, filterFormValues.dateBefore, translate]); - const [posted, displayPosted] = useMemo(() => { - const value: SearchDateValues = { - [CONST.SEARCH.DATE_MODIFIERS.ON]: filterFormValues.postedOn, - [CONST.SEARCH.DATE_MODIFIERS.AFTER]: filterFormValues.postedAfter, - [CONST.SEARCH.DATE_MODIFIERS.BEFORE]: filterFormValues.postedBefore, - }; + const createDateDisplayValue = useCallback( + (filterValues: {on?: string; after?: string; before?: string}): [SearchDateValues, string[]] => { + const value: SearchDateValues = { + [CONST.SEARCH.DATE_MODIFIERS.ON]: filterValues.on, + [CONST.SEARCH.DATE_MODIFIERS.AFTER]: filterValues.after, + [CONST.SEARCH.DATE_MODIFIERS.BEFORE]: filterValues.before, + }; - const displayText: string[] = []; - if (value.On) { - displayText.push(isSearchDatePreset(value.On) ? translate(`search.filters.date.presets.${value.On}`) : `${translate('common.on')} ${DateUtils.formatToReadableString(value.On)}`); - } - if (value.After) { - displayText.push(`${translate('common.after')} ${DateUtils.formatToReadableString(value.After)}`); - } - if (value.Before) { - displayText.push(`${translate('common.before')} ${DateUtils.formatToReadableString(value.Before)}`); - } + const displayText: string[] = []; + if (value.On) { + displayText.push( + isSearchDatePreset(value.On) ? translate(`search.filters.date.presets.${value.On}`) : `${translate('common.on')} ${DateUtils.formatToReadableString(value.On)}`, + ); + } + if (value.After) { + displayText.push(`${translate('common.after')} ${DateUtils.formatToReadableString(value.After)}`); + } + if (value.Before) { + displayText.push(`${translate('common.before')} ${DateUtils.formatToReadableString(value.Before)}`); + } - return [value, displayText]; - }, [filterFormValues.postedOn, filterFormValues.postedAfter, filterFormValues.postedBefore, translate]); + return [value, displayText]; + }, + [translate], + ); + + const [posted, displayPosted] = useMemo( + () => + createDateDisplayValue({ + on: filterFormValues.postedOn, + after: filterFormValues.postedAfter, + before: filterFormValues.postedBefore, + }), + [filterFormValues.postedOn, filterFormValues.postedAfter, filterFormValues.postedBefore, createDateDisplayValue], + ); + + const [withdrawn, displayWithdrawn] = useMemo( + () => + createDateDisplayValue({ + on: filterFormValues.withdrawnOn, + after: filterFormValues.withdrawnAfter, + before: filterFormValues.withdrawnBefore, + }), + [filterFormValues.withdrawnOn, filterFormValues.withdrawnAfter, filterFormValues.withdrawnBefore, createDateDisplayValue], + ); const updateFilterForm = useCallback( (values: Partial) => { @@ -236,29 +262,38 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod [translate, feedOptions, feed, updateFilterForm], ); - const postedPickerComponent = useCallback( - ({closeOverlay}: PopoverComponentProps) => { - const onChange = (selectedDates: SearchDateValues) => { - const dateFormValues = { - postedOn: selectedDates[CONST.SEARCH.DATE_MODIFIERS.ON], - postedAfter: selectedDates[CONST.SEARCH.DATE_MODIFIERS.AFTER], - postedBefore: selectedDates[CONST.SEARCH.DATE_MODIFIERS.BEFORE], + const createDatePickerComponent = useCallback( + (filterKey: SearchDateFilterKeys, value: SearchDateValues, translationKey: TranslationPaths) => { + return ({closeOverlay}: PopoverComponentProps) => { + const onChange = (selectedDates: SearchDateValues) => { + const dateFormValues = { + [`${filterKey}On`]: selectedDates[CONST.SEARCH.DATE_MODIFIERS.ON], + [`${filterKey}After`]: selectedDates[CONST.SEARCH.DATE_MODIFIERS.AFTER], + [`${filterKey}Before`]: selectedDates[CONST.SEARCH.DATE_MODIFIERS.BEFORE], + }; + + updateFilterForm(dateFormValues); }; - updateFilterForm(dateFormValues); + return ( + + ); }; - - return ( - - ); }, - [posted, translate, updateFilterForm], + [translate, updateFilterForm], + ); + + const postedPickerComponent = useMemo(() => createDatePickerComponent(CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED, posted, 'search.filters.posted'), [createDatePickerComponent, posted]); + + const withdrawnPickerComponent = useMemo( + () => createDatePickerComponent(CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN, withdrawn, 'search.filters.withdrawn'), + [createDatePickerComponent, withdrawn], ); const statusComponent = useCallback( @@ -331,6 +366,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 shouldDisplayWithdrawnFilter = !!filterFormValues.withdrawnOn || !!filterFormValues.withdrawnAfter || !!filterFormValues.withdrawnBefore; const filterList = [ { @@ -369,6 +405,16 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod }, ] : []), + ...(shouldDisplayWithdrawnFilter + ? [ + { + label: translate('search.filters.withdrawn'), + PopoverComponent: withdrawnPickerComponent, + value: displayWithdrawn, + filterKey: FILTER_KEYS.WITHDRAWN_ON, + }, + ] + : []), { label: translate('common.status'), PopoverComponent: statusComponent, @@ -395,11 +441,15 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod groupBy, displayDate, displayPosted, + displayWithdrawn, filterFormValues.from, filterFormValues.feed, filterFormValues.postedOn, filterFormValues.postedAfter, filterFormValues.postedBefore, + filterFormValues.withdrawnOn, + filterFormValues.withdrawnAfter, + filterFormValues.withdrawnBefore, translate, typeComponent, groupByComponent, @@ -407,6 +457,7 @@ function SearchFiltersBar({queryJSON, headerButtonsOptions, isMobileSelectionMod datePickerComponent, userPickerComponent, postedPickerComponent, + withdrawnPickerComponent, status, personalDetails, isDevelopment, diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index 717c923f75f1..d08d09baf48f 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -120,7 +120,8 @@ type SearchDateFilterKeys = | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVED | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED - | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED; + | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED + | typeof CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN; type SearchFilterKey = | ValueOf diff --git a/src/languages/de.ts b/src/languages/de.ts index 510388a1c595..d83f86541ecc 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -6003,6 +6003,7 @@ const translations = { paid: 'Zahlungsdatum', exported: 'Exportiertes Datum', posted: 'Buchungsdatum', + withdrawn: 'Storniert', billable: 'Abrechenbar', reimbursable: 'Erstattungsfähig', groupBy: { diff --git a/src/languages/en.ts b/src/languages/en.ts index c1b64fd90c3e..0d0cf80bb15c 100755 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -5975,6 +5975,7 @@ const translations = { paid: 'Paid date', exported: 'Exported date', posted: 'Posted date', + withdrawn: 'Withdrawn date', billable: 'Billable', reimbursable: 'Reimbursable', groupBy: { diff --git a/src/languages/es.ts b/src/languages/es.ts index 1cec26eedf33..86a80fdc5eae 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -5997,6 +5997,7 @@ const translations = { paid: 'Fecha de pago', exported: 'Fecha de exportación', posted: 'Fecha de contabilización', + withdrawn: 'Fecha de retirada', billable: 'Facturable', reimbursable: 'Reembolsable', groupBy: { diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 399e69fc4cf6..009368de6af2 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -6016,6 +6016,7 @@ const translations = { paid: 'Date de paiement', exported: 'Date exportée', posted: 'Date de publication', + withdrawn: 'Date de retrait', billable: 'Facturable', reimbursable: 'Remboursable', groupBy: { diff --git a/src/languages/it.ts b/src/languages/it.ts index 7caa2fc45a5d..7ed56cd402d6 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -6018,6 +6018,7 @@ const translations = { paid: 'Data di pagamento', exported: 'Data esportata', posted: 'Data di pubblicazione', + withdrawn: 'Data di ritiro', billable: 'Fatturabile', reimbursable: 'Rimborsabile', groupBy: { diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 450f8a966491..cf9312ee7bfb 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -5976,6 +5976,7 @@ const translations = { paid: '支払日', exported: 'エクスポートされた日付', posted: '投稿日', + withdrawn: '取り消し日', billable: 'ビラブル', reimbursable: '払い戻し可能', groupBy: { diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 245b4f2e8d76..5a7fe463c8ae 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -6010,6 +6010,7 @@ const translations = { paid: 'Betaaldatum', exported: 'Geëxporteerde datum', posted: 'Geplaatste datum', + withdrawn: 'Teruggetrokken datum', billable: 'Factureerbaar', reimbursable: 'Vergoedbaar', groupBy: { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 995293f52e9d..ca1e0693ac61 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -5995,6 +5995,7 @@ const translations = { paid: 'Data płatności', exported: 'Data eksportu', posted: 'Data opublikowania', + withdrawn: 'Data wycofania', billable: 'Podlegające fakturowaniu', reimbursable: 'Podlegające zwrotowi', groupBy: { diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7a1050116aa3..a2da45b0ac3c 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -6009,6 +6009,7 @@ const translations = { paid: 'Data de pagamento', exported: 'Data exportada', posted: 'Data de postagem', + withdrawn: 'Data de retirada', billable: 'Faturável', reimbursable: 'Reembolsável', groupBy: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index 9b10f31594c8..d0e7aa58328b 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -5900,6 +5900,7 @@ const translations = { paid: '支付日期', exported: '导出日期', posted: '发布日期', + withdrawn: '撤回日期', billable: '可计费的', reimbursable: '可报销的', groupBy: { diff --git a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx index 47d350738df6..335b80e151e3 100644 --- a/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx +++ b/src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx @@ -738,6 +738,7 @@ const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersPaidPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_EXPORTED_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersExportedPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_POSTED_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersPostedPage').default, + [SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWN_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawnPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_CURRENCY_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersCurrencyPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_DESCRIPTION_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersDescriptionPage').default, [SCREENS.SEARCH.ADVANCED_FILTERS_MERCHANT_RHP]: () => require('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersMerchantPage').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..8e8e1ed36ef4 100644 --- a/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts +++ b/src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts @@ -18,6 +18,7 @@ const SEARCH_TO_RHP: Partial['config'] = { [SCREENS.SEARCH.ADVANCED_FILTERS_PAID_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_PAID, [SCREENS.SEARCH.ADVANCED_FILTERS_EXPORTED_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_EXPORTED, [SCREENS.SEARCH.ADVANCED_FILTERS_POSTED_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_POSTED, + [SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWN_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_WITHDRAWN, [SCREENS.SEARCH.ADVANCED_FILTERS_CURRENCY_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_CURRENCY, [SCREENS.SEARCH.ADVANCED_FILTERS_MERCHANT_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_MERCHANT, [SCREENS.SEARCH.ADVANCED_FILTERS_DESCRIPTION_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_DESCRIPTION, diff --git a/src/libs/SearchAutocompleteUtils.ts b/src/libs/SearchAutocompleteUtils.ts index 3bb01e2dd901..340ac9fe873c 100644 --- a/src/libs/SearchAutocompleteUtils.ts +++ b/src/libs/SearchAutocompleteUtils.ts @@ -171,6 +171,7 @@ function filterOutRangesWithCorrectValue( case CONST.SEARCH.SYNTAX_FILTER_KEYS.REIMBURSABLE: return booleanList.includes(range.value); case CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN: case CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED: return datePresetList.includes(range.value); default: diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index e384114eabe1..8b8de13d2f99 100644 --- a/src/libs/SearchParser/autocompleteParser.js +++ b/src/libs/SearchParser/autocompleteParser.js @@ -219,22 +219,23 @@ function peg$parse(input, options) { var peg$c33 = "paid"; var peg$c34 = "exported"; var peg$c35 = "posted"; - var peg$c36 = "groupby"; - var peg$c37 = "group-by"; - var peg$c38 = "feed"; - var peg$c39 = "title"; - var peg$c40 = "assignee"; - 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$c36 = "withdrawn"; + var peg$c37 = "groupby"; + var peg$c38 = "group-by"; + var peg$c39 = "feed"; + var peg$c40 = "title"; + var peg$c41 = "assignee"; + var peg$c42 = "createdby"; + var peg$c43 = "created-by"; + var peg$c44 = "action"; + var peg$c45 = "!="; + var peg$c46 = ">="; + var peg$c47 = ">"; + var peg$c48 = "<="; + var peg$c49 = "<"; + var peg$c50 = "\u201C"; + var peg$c51 = "\u201D"; + var peg$c52 = "\""; var peg$r0 = /^[:=]/; var peg$r1 = /^[^ ,\t\n\r\xA0]/; @@ -285,38 +286,39 @@ function peg$parse(input, options) { var peg$e34 = peg$literalExpectation("paid", true); var peg$e35 = peg$literalExpectation("exported", true); var peg$e36 = peg$literalExpectation("posted", true); - var peg$e37 = peg$literalExpectation("groupBy", true); - var peg$e38 = peg$literalExpectation("group-by", true); - var peg$e39 = peg$literalExpectation("feed", true); - var peg$e40 = peg$literalExpectation("title", true); - var peg$e41 = peg$literalExpectation("assignee", true); - 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$e37 = peg$literalExpectation("withdrawn", true); + var peg$e38 = peg$literalExpectation("groupBy", true); + var peg$e39 = peg$literalExpectation("group-by", true); + var peg$e40 = peg$literalExpectation("feed", true); + var peg$e41 = peg$literalExpectation("title", true); + var peg$e42 = peg$literalExpectation("assignee", true); + var peg$e43 = peg$literalExpectation("createdBy", true); + var peg$e44 = peg$literalExpectation("created-by", true); + var peg$e45 = peg$literalExpectation("action", true); + var peg$e46 = peg$otherExpectation("operator"); + var peg$e47 = peg$classExpectation([":", "="], false, 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$literalExpectation("<", false); + var peg$e53 = peg$otherExpectation("word"); + var peg$e54 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e55 = peg$otherExpectation("whitespace"); + var peg$e56 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e57 = peg$otherExpectation("quote"); + var peg$e58 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e59 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e60 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e61 = peg$literalExpectation("\u201C", false); + var peg$e62 = peg$literalExpectation("\u201D", false); + var peg$e63 = peg$literalExpectation("\"", false); + var peg$e64 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e65 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e66 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e67 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e68 = peg$anyExpectation(); + var peg$e69 = peg$classExpectation([","], false, false); var peg$f0 = function(ranges) { return { autocomplete, ranges }; }; var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); }; @@ -400,34 +402,35 @@ function peg$parse(input, options) { var peg$f32 = function() { return "paid"; }; var peg$f33 = function() { return "exported"; }; var peg$f34 = function() { return "posted"; }; - var peg$f35 = function() { return "groupBy"; }; - var peg$f36 = function() { return "feed"; }; - var peg$f37 = function() { return "title"; }; - 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$f35 = function() { return "withdrawn"; }; + var peg$f36 = function() { return "groupBy"; }; + var peg$f37 = function() { return "feed"; }; + var peg$f38 = function() { return "title"; }; + 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) { 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; @@ -753,7 +756,10 @@ function peg$parse(input, options) { if (s1 === peg$FAILED) { s1 = peg$parseposted(); if (s1 === peg$FAILED) { - s1 = peg$parseexported(); + s1 = peg$parsewithdrawn(); + if (s1 === peg$FAILED) { + s1 = peg$parseexported(); + } } } } @@ -1501,28 +1507,48 @@ function peg$parse(input, options) { return s0; } + function peg$parsewithdrawn() { + var s0, s1; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 9); + if (s1.toLowerCase() === peg$c36) { + peg$currPos += 9; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e37); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f35(); + } + s0 = s1; + + return s0; + } + function peg$parsegroupBy() { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c36) { + if (s0.toLowerCase() === peg$c37) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e37); } + if (peg$silentFails === 0) { peg$fail(peg$e38); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c37) { + if (s1.toLowerCase() === peg$c38) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e38); } + if (peg$silentFails === 0) { peg$fail(peg$e39); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f35(); + s1 = peg$f36(); } s0 = s1; } @@ -1535,15 +1561,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 4); - if (s1.toLowerCase() === peg$c38) { + if (s1.toLowerCase() === peg$c39) { peg$currPos += 4; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e39); } + if (peg$silentFails === 0) { peg$fail(peg$e40); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f36(); + s1 = peg$f37(); } s0 = s1; @@ -1555,15 +1581,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c39) { + if (s1.toLowerCase() === peg$c40) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e40); } + if (peg$silentFails === 0) { peg$fail(peg$e41); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f37(); + s1 = peg$f38(); } s0 = s1; @@ -1575,15 +1601,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c40) { + if (s1.toLowerCase() === peg$c41) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e41); } + if (peg$silentFails === 0) { peg$fail(peg$e42); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f38(); + s1 = peg$f39(); } s0 = s1; @@ -1594,24 +1620,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 9); - if (s0.toLowerCase() === peg$c41) { + if (s0.toLowerCase() === peg$c42) { peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e42); } + if (peg$silentFails === 0) { peg$fail(peg$e43); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c42) { + if (s1.toLowerCase() === peg$c43) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f39(); + s1 = peg$f40(); } s0 = s1; } @@ -1624,15 +1650,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c43) { + if (s1.toLowerCase() === peg$c44) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f40(); + s1 = peg$f41(); } s0 = s1; @@ -1649,81 +1675,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$e47); } } 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$c45) { + s1 = peg$c45; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e47); } + if (peg$silentFails === 0) { peg$fail(peg$e48); } } 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$c46) { + s1 = peg$c46; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e48); } + if (peg$silentFails === 0) { peg$fail(peg$e49); } } 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$c47; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e49); } + if (peg$silentFails === 0) { peg$fail(peg$e50); } } 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$c48) { + s1 = peg$c48; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e50); } + if (peg$silentFails === 0) { peg$fail(peg$e51); } } 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$c49; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e51); } + if (peg$silentFails === 0) { peg$fail(peg$e52); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f46(); + s1 = peg$f47(); } s0 = s1; } @@ -1734,7 +1760,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$e46); } } return s0; @@ -1747,7 +1773,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 +1791,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$e54); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -1775,7 +1801,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$e54); } } } } else { @@ -1783,13 +1809,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$e53); } } return s0; @@ -1801,7 +1827,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 +1843,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$e56); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -1826,12 +1852,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$e56); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e54); } + if (peg$silentFails === 0) { peg$fail(peg$e55); } return s0; } @@ -1841,7 +1867,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 +1904,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$e58); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -1887,7 +1913,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$e58); } } } s2 = input.charAt(peg$currPos); @@ -1895,7 +1921,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$e59); } } if (s2 !== peg$FAILED) { s3 = []; @@ -1904,7 +1930,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$e60); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -1913,7 +1939,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$e60); } } } s4 = input.charAt(peg$currPos); @@ -1921,7 +1947,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$e59); } } if (s4 !== peg$FAILED) { s5 = []; @@ -1930,7 +1956,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$e54); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -1939,11 +1965,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$e54); } } } peg$savedPos = s0; - s0 = peg$f51(s1, s3, s5); + s0 = peg$f52(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -1955,7 +1981,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$e57); } } return s0; @@ -1972,7 +1998,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$e58); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -1981,7 +2007,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$e58); } } } s2 = input.charAt(peg$currPos); @@ -1989,7 +2015,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$e59); } } if (s2 !== peg$FAILED) { s3 = []; @@ -1998,7 +2024,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$e60); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2014,15 +2040,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c50; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f52(s1); + s4 = peg$f53(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2045,15 +2071,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2076,15 +2102,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2103,7 +2129,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$e60); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2119,15 +2145,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c50; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e60); } + if (peg$silentFails === 0) { peg$fail(peg$e61); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f52(s1); + s4 = peg$f53(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2150,15 +2176,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e61); } + if (peg$silentFails === 0) { peg$fail(peg$e62); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f53(s1); + s4 = peg$f54(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2181,15 +2207,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + if (peg$silentFails === 0) { peg$fail(peg$e63); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f54(s1); + s4 = peg$f55(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2205,7 +2231,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 +2243,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$e57); } } return s0; @@ -2232,7 +2258,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$e59); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2270,7 +2296,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$e64); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2279,7 +2305,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$e64); } } } s2 = []; @@ -2288,7 +2314,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$e65); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2297,7 +2323,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$e65); } } } s3 = []; @@ -2306,7 +2332,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$e66); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2315,7 +2341,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$e66); } } } s4 = peg$parseoperator(); @@ -2334,7 +2360,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$e67); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2343,7 +2369,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$e67); } } } s2 = peg$currPos; @@ -2364,7 +2390,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$e68); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2390,7 +2416,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$e69); } } } } diff --git a/src/libs/SearchParser/autocompleteParser.peggy b/src/libs/SearchParser/autocompleteParser.peggy index 5b3f2480db2c..6ee0cb144038 100644 --- a/src/libs/SearchParser/autocompleteParser.peggy +++ b/src/libs/SearchParser/autocompleteParser.peggy @@ -79,6 +79,7 @@ autocompleteKey "key" / policyID / action / posted + / withdrawn / exported ) diff --git a/src/libs/SearchParser/baseRules.peggy b/src/libs/SearchParser/baseRules.peggy index fe4b8afd047f..80511cb601fb 100644 --- a/src/libs/SearchParser/baseRules.peggy +++ b/src/libs/SearchParser/baseRules.peggy @@ -56,6 +56,7 @@ approved = "approved"i { return "approved"; } paid = "paid"i { return "paid"; } exported = "exported"i { return "exported"; } posted = "posted"i { return "posted"; } +withdrawn = "withdrawn"i { return "withdrawn"; } groupBy = "groupBy"i / "group-by"i { return "groupBy"; } feed = "feed"i { return "feed"; } title = "title"i { return "title"; } diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js index d189aa0dc8ee..7ca3eb537fd9 100644 --- a/src/libs/SearchParser/searchParser.js +++ b/src/libs/SearchParser/searchParser.js @@ -220,22 +220,23 @@ function peg$parse(input, options) { var peg$c33 = "paid"; var peg$c34 = "exported"; var peg$c35 = "posted"; - var peg$c36 = "groupby"; - var peg$c37 = "group-by"; - var peg$c38 = "feed"; - var peg$c39 = "title"; - var peg$c40 = "assignee"; - 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$c36 = "withdrawn"; + var peg$c37 = "groupby"; + var peg$c38 = "group-by"; + var peg$c39 = "feed"; + var peg$c40 = "title"; + var peg$c41 = "assignee"; + var peg$c42 = "createdby"; + var peg$c43 = "created-by"; + var peg$c44 = "action"; + var peg$c45 = "!="; + var peg$c46 = ">="; + var peg$c47 = ">"; + var peg$c48 = "<="; + var peg$c49 = "<"; + var peg$c50 = "\u201C"; + var peg$c51 = "\u201D"; + var peg$c52 = "\""; var peg$r0 = /^[^ \t\r\n\xA0]/; var peg$r1 = /^[:=]/; @@ -289,38 +290,39 @@ function peg$parse(input, options) { var peg$e36 = peg$literalExpectation("paid", true); var peg$e37 = peg$literalExpectation("exported", true); var peg$e38 = peg$literalExpectation("posted", true); - var peg$e39 = peg$literalExpectation("groupBy", true); - var peg$e40 = peg$literalExpectation("group-by", true); - var peg$e41 = peg$literalExpectation("feed", true); - var peg$e42 = peg$literalExpectation("title", true); - var peg$e43 = peg$literalExpectation("assignee", true); - 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$e39 = peg$literalExpectation("withdrawn", true); + var peg$e40 = peg$literalExpectation("groupBy", true); + var peg$e41 = peg$literalExpectation("group-by", true); + var peg$e42 = peg$literalExpectation("feed", true); + var peg$e43 = peg$literalExpectation("title", true); + var peg$e44 = peg$literalExpectation("assignee", true); + var peg$e45 = peg$literalExpectation("createdBy", true); + var peg$e46 = peg$literalExpectation("created-by", true); + var peg$e47 = peg$literalExpectation("action", true); + var peg$e48 = peg$otherExpectation("operator"); + var peg$e49 = peg$classExpectation([":", "="], false, 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$literalExpectation("<", false); + var peg$e55 = peg$otherExpectation("word"); + var peg$e56 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e57 = peg$otherExpectation("whitespace"); + var peg$e58 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e59 = peg$otherExpectation("quote"); + var peg$e60 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e61 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e62 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e63 = peg$literalExpectation("\u201C", false); + var peg$e64 = peg$literalExpectation("\u201D", false); + var peg$e65 = peg$literalExpectation("\"", false); + var peg$e66 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e67 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e68 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e69 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e70 = peg$anyExpectation(); + var peg$e71 = peg$classExpectation([","], false, false); var peg$f0 = function(filters) { return applyDefaults(filters); }; var peg$f1 = function(head, tail) { @@ -416,34 +418,35 @@ function peg$parse(input, options) { var peg$f33 = function() { return "paid"; }; var peg$f34 = function() { return "exported"; }; var peg$f35 = function() { return "posted"; }; - var peg$f36 = function() { return "groupBy"; }; - var peg$f37 = function() { return "feed"; }; - var peg$f38 = function() { return "title"; }; - 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$f36 = function() { return "withdrawn"; }; + var peg$f37 = function() { return "groupBy"; }; + var peg$f38 = function() { return "feed"; }; + var peg$f39 = function() { return "title"; }; + var peg$f40 = function() { return "assignee"; }; + var peg$f41 = function() { return "createdBy"; }; + var peg$f42 = function() { return "action"; }; + 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; @@ -838,19 +841,22 @@ function peg$parse(input, options) { if (s1 === peg$FAILED) { s1 = peg$parseposted(); if (s1 === peg$FAILED) { - s1 = peg$parsefeed(); + s1 = peg$parsewithdrawn(); if (s1 === peg$FAILED) { - s1 = peg$parsetitle(); + s1 = peg$parsefeed(); if (s1 === peg$FAILED) { - s1 = peg$parseassignee(); + s1 = peg$parsetitle(); if (s1 === peg$FAILED) { - s1 = peg$parsecreatedBy(); + s1 = peg$parseassignee(); if (s1 === peg$FAILED) { - s1 = peg$parsereimbursable(); + s1 = peg$parsecreatedBy(); if (s1 === peg$FAILED) { - s1 = peg$parsebillable(); + s1 = peg$parsereimbursable(); if (s1 === peg$FAILED) { - s1 = peg$parseaction(); + s1 = peg$parsebillable(); + if (s1 === peg$FAILED) { + s1 = peg$parseaction(); + } } } } @@ -1695,28 +1701,48 @@ function peg$parse(input, options) { return s0; } + function peg$parsewithdrawn() { + var s0, s1; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 9); + if (s1.toLowerCase() === peg$c36) { + peg$currPos += 9; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e39); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f36(); + } + s0 = s1; + + return s0; + } + function peg$parsegroupBy() { var s0, s1; s0 = input.substr(peg$currPos, 7); - if (s0.toLowerCase() === peg$c36) { + if (s0.toLowerCase() === peg$c37) { peg$currPos += 7; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e39); } + if (peg$silentFails === 0) { peg$fail(peg$e40); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c37) { + if (s1.toLowerCase() === peg$c38) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e40); } + if (peg$silentFails === 0) { peg$fail(peg$e41); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f36(); + s1 = peg$f37(); } s0 = s1; } @@ -1729,15 +1755,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 4); - if (s1.toLowerCase() === peg$c38) { + if (s1.toLowerCase() === peg$c39) { peg$currPos += 4; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e41); } + if (peg$silentFails === 0) { peg$fail(peg$e42); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f37(); + s1 = peg$f38(); } s0 = s1; @@ -1749,15 +1775,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c39) { + if (s1.toLowerCase() === peg$c40) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e42); } + if (peg$silentFails === 0) { peg$fail(peg$e43); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f38(); + s1 = peg$f39(); } s0 = s1; @@ -1769,15 +1795,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c40) { + if (s1.toLowerCase() === peg$c41) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e43); } + if (peg$silentFails === 0) { peg$fail(peg$e44); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f39(); + s1 = peg$f40(); } s0 = s1; @@ -1788,24 +1814,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 9); - if (s0.toLowerCase() === peg$c41) { + if (s0.toLowerCase() === peg$c42) { peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e44); } + if (peg$silentFails === 0) { peg$fail(peg$e45); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c42) { + if (s1.toLowerCase() === peg$c43) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e45); } + if (peg$silentFails === 0) { peg$fail(peg$e46); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f40(); + s1 = peg$f41(); } s0 = s1; } @@ -1818,15 +1844,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c43) { + if (s1.toLowerCase() === peg$c44) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e46); } + if (peg$silentFails === 0) { peg$fail(peg$e47); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f41(); + s1 = peg$f42(); } s0 = s1; @@ -1843,81 +1869,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$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$c44) { - s1 = peg$c44; + if (input.substr(peg$currPos, 2) === peg$c45) { + s1 = peg$c45; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e49); } + 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.substr(peg$currPos, 2) === peg$c45) { - s1 = peg$c45; + 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$e50); } + 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.charCodeAt(peg$currPos) === 62) { - s1 = peg$c46; + s1 = peg$c47; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e51); } + 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.substr(peg$currPos, 2) === peg$c47) { - s1 = peg$c47; + if (input.substr(peg$currPos, 2) === peg$c48) { + s1 = peg$c48; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e52); } + if (peg$silentFails === 0) { peg$fail(peg$e53); } } 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$c49; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e53); } + if (peg$silentFails === 0) { peg$fail(peg$e54); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f47(); + s1 = peg$f48(); } s0 = s1; } @@ -1928,7 +1954,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$e48); } } return s0; @@ -1941,7 +1967,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 +1985,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$e56); } } if (s2 !== peg$FAILED) { while (s2 !== peg$FAILED) { @@ -1969,7 +1995,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$e56); } } } } else { @@ -1977,13 +2003,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$e55); } } return s0; @@ -1995,7 +2021,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 +2037,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$e58); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -2020,12 +2046,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$e58); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e56); } + if (peg$silentFails === 0) { peg$fail(peg$e57); } return s0; } @@ -2035,7 +2061,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 +2098,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$e60); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2081,7 +2107,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$e60); } } } s2 = input.charAt(peg$currPos); @@ -2089,7 +2115,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$e61); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2098,7 +2124,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$e62); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2107,7 +2133,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$e62); } } } s4 = input.charAt(peg$currPos); @@ -2115,7 +2141,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$e61); } } if (s4 !== peg$FAILED) { s5 = []; @@ -2124,7 +2150,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$e56); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -2133,11 +2159,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$e56); } } } peg$savedPos = s0; - s0 = peg$f52(s1, s3, s5); + s0 = peg$f53(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -2149,7 +2175,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$e59); } } return s0; @@ -2166,7 +2192,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$e60); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2175,7 +2201,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$e60); } } } s2 = input.charAt(peg$currPos); @@ -2183,7 +2209,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$e61); } } if (s2 !== peg$FAILED) { s3 = []; @@ -2192,7 +2218,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$e62); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2208,15 +2234,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c50; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + 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; @@ -2239,15 +2265,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + 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; @@ -2270,15 +2296,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f55(s1); + s4 = peg$f56(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2297,7 +2323,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$e62); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -2313,15 +2339,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c49; + s6 = peg$c50; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e62); } + 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; @@ -2344,15 +2370,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c50; + s6 = peg$c51; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e63); } + 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; @@ -2375,15 +2401,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c51; + s6 = peg$c52; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e64); } + if (peg$silentFails === 0) { peg$fail(peg$e65); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f55(s1); + s4 = peg$f56(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -2399,7 +2425,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 +2437,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$e59); } } return s0; @@ -2426,7 +2452,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$e61); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -2464,7 +2490,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$e66); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2473,7 +2499,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$e66); } } } s2 = []; @@ -2482,7 +2508,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$e67); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -2491,7 +2517,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$e67); } } } s3 = []; @@ -2500,7 +2526,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$e68); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -2509,7 +2535,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$e68); } } } s4 = peg$parseoperator(); @@ -2528,7 +2554,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$e69); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -2537,7 +2563,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$e69); } } } s2 = peg$currPos; @@ -2558,7 +2584,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$e70); } } peg$silentFails--; if (s4 === peg$FAILED) { @@ -2584,7 +2610,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$e71); } } } } diff --git a/src/libs/SearchParser/searchParser.peggy b/src/libs/SearchParser/searchParser.peggy index e2fb25d13be2..1acac10d9f53 100644 --- a/src/libs/SearchParser/searchParser.peggy +++ b/src/libs/SearchParser/searchParser.peggy @@ -131,6 +131,7 @@ key "key" / paid / exported / posted + / withdrawn / feed / title / assignee diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index 1396889c6973..611a187fdfbc 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -87,6 +87,7 @@ const UserFriendlyKeyMap: Record + ); +} + +SearchFiltersWithdrawnPage.displayName = 'SearchFiltersWithdrawnPage'; + +export default SearchFiltersWithdrawnPage; diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index f7e5199abfb7..972f8f60099d 100644 --- a/src/types/form/SearchAdvancedFiltersForm.ts +++ b/src/types/form/SearchAdvancedFiltersForm.ts @@ -11,6 +11,7 @@ const DATE_FILTER_KEYS: SearchDateFilterKeys[] = [ CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID, CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED, CONST.SEARCH.SYNTAX_FILTER_KEYS.POSTED, + CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN, ]; const FILTER_KEYS = { @@ -35,6 +36,9 @@ const FILTER_KEYS = { POSTED_ON: 'postedOn', POSTED_AFTER: 'postedAfter', POSTED_BEFORE: 'postedBefore', + WITHDRAWN_ON: 'withdrawnOn', + WITHDRAWN_AFTER: 'withdrawnAfter', + WITHDRAWN_BEFORE: 'withdrawnBefore', CURRENCY: 'currency', CATEGORY: 'category', POLICY_ID: 'policyID', @@ -86,6 +90,9 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.POSTED_AFTER, FILTER_KEYS.POSTED_BEFORE, FILTER_KEYS.POSTED_ON, + FILTER_KEYS.WITHDRAWN_AFTER, + FILTER_KEYS.WITHDRAWN_BEFORE, + FILTER_KEYS.WITHDRAWN_ON, FILTER_KEYS.TAX_RATE, FILTER_KEYS.REIMBURSABLE, FILTER_KEYS.BILLABLE, @@ -130,6 +137,9 @@ const ALLOWED_TYPE_FILTERS = { FILTER_KEYS.POSTED_AFTER, FILTER_KEYS.POSTED_BEFORE, FILTER_KEYS.POSTED_ON, + FILTER_KEYS.WITHDRAWN_AFTER, + FILTER_KEYS.WITHDRAWN_BEFORE, + FILTER_KEYS.WITHDRAWN_ON, FILTER_KEYS.TAX_RATE, FILTER_KEYS.REPORT_ID, FILTER_KEYS.SUBMITTED_ON, @@ -241,6 +251,9 @@ type SearchAdvancedFiltersForm = Form< [FILTER_KEYS.POSTED_ON]: string; [FILTER_KEYS.POSTED_AFTER]: string; [FILTER_KEYS.POSTED_BEFORE]: string; + [FILTER_KEYS.WITHDRAWN_ON]: string; + [FILTER_KEYS.WITHDRAWN_AFTER]: string; + [FILTER_KEYS.WITHDRAWN_BEFORE]: string; [FILTER_KEYS.CURRENCY]: string[]; [FILTER_KEYS.CATEGORY]: string[]; [FILTER_KEYS.POLICY_ID]: string[]; diff --git a/tests/unit/Search/SearchQueryUtilsTest.ts b/tests/unit/Search/SearchQueryUtilsTest.ts index f74e3fbc6918..979fe2ccf735 100644 --- a/tests/unit/Search/SearchQueryUtilsTest.ts +++ b/tests/unit/Search/SearchQueryUtilsTest.ts @@ -188,6 +188,18 @@ describe('SearchQueryUtils', () => { ); expect(result).not.toMatch(CONST.VALIDATE_FOR_HTML_TAG_REGEX); }); + + test('with withdrawn filter', () => { + const filterValues: Partial = { + type: 'expense', + status: CONST.SEARCH.STATUS.EXPENSE.ALL, + withdrawnOn: CONST.SEARCH.DATE_PRESETS.LAST_MONTH, + }; + + const result = buildQueryStringFromFilterFormValues(filterValues); + + expect(result).toEqual('sortBy:date sortOrder:desc type:expense withdrawn:last-month'); + }); }); describe('buildFilterFormValuesFromQuery', () => { diff --git a/tests/unit/SearchParserTest.ts b/tests/unit/SearchParserTest.ts index 43cf35a676b0..117945b8ec3d 100644 --- a/tests/unit/SearchParserTest.ts +++ b/tests/unit/SearchParserTest.ts @@ -588,6 +588,20 @@ const keywordTests = [ }, }, }, + { + query: 'type:expense withdrawn:last-month', + expected: { + type: CONST.SEARCH.DATA_TYPES.EXPENSE, + status: CONST.SEARCH.STATUS.EXPENSE.ALL, + sortBy: CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, + sortOrder: CONST.SEARCH.SORT_ORDER.DESC, + filters: { + operator: CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO, + left: CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN, + right: CONST.SEARCH.DATE_PRESETS.LAST_MONTH, + }, + }, + }, ]; describe('search parser', () => {