diff --git a/src/CONST/index.ts b/src/CONST/index.ts index 7e9324d82ecf..6f232b5d069b 100644 --- a/src/CONST/index.ts +++ b/src/CONST/index.ts @@ -8220,6 +8220,7 @@ const CONST = { WEEK: 'week', YEAR: 'year', QUARTER: 'quarter', + APPROVER: 'approver', }, /** * Single source of truth for which transaction-level columns are available in each column-picker surface: @@ -8568,6 +8569,12 @@ const CONST = { EXPENSES: this.TABLE_COLUMNS.GROUP_EXPENSES, TOTAL: this.TABLE_COLUMNS.GROUP_TOTAL, }, + APPROVER: { + AVATAR: this.TABLE_COLUMNS.AVATAR, + APPROVER: this.TABLE_COLUMNS.GROUP_APPROVER, + EXPENSES: this.TABLE_COLUMNS.GROUP_EXPENSES, + TOTAL: this.TABLE_COLUMNS.GROUP_TOTAL, + }, }; }, get TYPE_DEFAULT_COLUMNS() { @@ -8629,6 +8636,7 @@ const CONST = { WEEK: [this.TABLE_COLUMNS.GROUP_WEEK, this.TABLE_COLUMNS.GROUP_EXPENSES, this.TABLE_COLUMNS.GROUP_TOTAL], YEAR: [this.TABLE_COLUMNS.GROUP_YEAR, this.TABLE_COLUMNS.GROUP_EXPENSES, this.TABLE_COLUMNS.GROUP_TOTAL], QUARTER: [this.TABLE_COLUMNS.GROUP_QUARTER, this.TABLE_COLUMNS.GROUP_EXPENSES, this.TABLE_COLUMNS.GROUP_TOTAL], + APPROVER: [this.TABLE_COLUMNS.AVATAR, this.TABLE_COLUMNS.GROUP_APPROVER, this.TABLE_COLUMNS.GROUP_EXPENSES, this.TABLE_COLUMNS.GROUP_TOTAL], }; }, BOOLEAN: { @@ -8757,6 +8765,7 @@ const CONST = { GROUP_WITHDRAWAL_STATUS: 'groupWithdrawalStatus', GROUP_AMOUNT_DEBITED: 'groupAmountDebited', GROUP_AMOUNT_REIMBURSED: 'groupAmountReimbursed', + GROUP_APPROVER: 'groupApprover', START_DATE: 'startDate', END_DATE: 'endDate', TRIP_NAME: 'tripName', @@ -8869,6 +8878,7 @@ const CONST = { SUBMITTER_USER_ID: 'submitterUserID', SUBMITTER_PAYROLL_ID: 'submitterPayrollID', ORDER_DEAL_NUMBERS: 'orderDealNumbers', + APPROVER: 'approver', // The Spend footer's display selections. They travel as filters because that is where the backend reads // them from, but they never narrow the result set: only `footerTotal` changes the response, by swapping // which aggregate comes back as the search total. @@ -8963,6 +8973,7 @@ const CONST = { SUBMITTER_USER_ID: 'submitter-user-id', SUBMITTER_PAYROLL_ID: 'submitter-payroll-id', ORDER_DEAL_NUMBERS: 'order-deal-numbers', + APPROVER: 'approver', COLUMNS: 'columns', LIMIT: 'limit', FOOTER_COUNT: 'footer-count', @@ -9041,6 +9052,7 @@ const CONST = { [this.TABLE_COLUMNS.GROUP_WITHDRAWAL_STATUS]: 'group-withdrawal-status', [this.TABLE_COLUMNS.GROUP_AMOUNT_DEBITED]: 'group-amount-debited', [this.TABLE_COLUMNS.GROUP_AMOUNT_REIMBURSED]: 'group-amount-reimbursed', + [this.TABLE_COLUMNS.GROUP_APPROVER]: 'group-approver', [this.TABLE_COLUMNS.AMOUNT_DEBITED]: 'amount-debited', [this.TABLE_COLUMNS.AMOUNT_REIMBURSED]: 'amount-reimbursed', }; diff --git a/src/components/Search/FilterComponents/ListFilterContent.tsx b/src/components/Search/FilterComponents/ListFilterContent.tsx index fd97773c8762..4921979d2e02 100644 --- a/src/components/Search/FilterComponents/ListFilterContent.tsx +++ b/src/components/Search/FilterComponents/ListFilterContent.tsx @@ -299,6 +299,7 @@ function ListFilterContent({ case CONST.SEARCH.SYNTAX_FILTER_KEYS.ATTENDEE: case CONST.SEARCH.SYNTAX_FILTER_KEYS.TO: case CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER: case CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM: { content = ( ([ CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.TO, CONST.SEARCH.SYNTAX_FILTER_KEYS.ATTENDEE, CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE, diff --git a/src/components/Search/SearchList/ListItem/GroupHeader.tsx b/src/components/Search/SearchList/ListItem/GroupHeader.tsx index cdca1fe922f4..ece02a3d8bef 100644 --- a/src/components/Search/SearchList/ListItem/GroupHeader.tsx +++ b/src/components/Search/SearchList/ListItem/GroupHeader.tsx @@ -319,6 +319,15 @@ function GroupHeader({ {...commonProps} /> ); + case CONST.SEARCH.GROUP_BY.APPROVER: + return ( + + ); default: return null; } diff --git a/src/components/Search/SearchList/ListItem/MemberListItemHeader.tsx b/src/components/Search/SearchList/ListItem/MemberListItemHeader.tsx index 00776a0feff7..f3735ac5c61a 100644 --- a/src/components/Search/SearchList/ListItem/MemberListItemHeader.tsx +++ b/src/components/Search/SearchList/ListItem/MemberListItemHeader.tsx @@ -15,15 +15,22 @@ import CONST from '@src/CONST'; import React from 'react'; import {View} from 'react-native'; -import type {TransactionMemberGroupListItemType} from './types'; +import type {TransactionApproverGroupListItemType, TransactionMemberGroupListItemType} from './types'; import ExpandCollapseArrowButton from './ExpandCollapseArrowButton'; import TextCell from './TextCell'; import TotalCell from './TotalCell'; +type MemberGroupListItemType = TransactionMemberGroupListItemType | TransactionApproverGroupListItemType; + type MemberListItemHeaderProps = { - member: TransactionMemberGroupListItemType; - onCheckboxPress?: (item: TransactionMemberGroupListItemType) => void; + /** The person this group is for: the submitter when grouping by from, the approver when grouping by approver */ + member: MemberGroupListItemType; + + onCheckboxPress?: (item: MemberGroupListItemType) => void; + + /** The column that shows the member's name, which differs between the from and approver groupings */ + nameColumn?: typeof CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM | typeof CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER; /** Whether this section items disabled for selection */ isDisabled?: boolean | null; @@ -59,6 +66,7 @@ function MemberListItemHeader({ onDownArrowClick, columns, isLargeScreenWidth, + nameColumn = CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM, }: MemberListItemHeaderProps) { const styles = useThemeStyles(); const StyleUtils = useStyleUtils(); @@ -83,10 +91,10 @@ function MemberListItemHeader({ ), - [CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM]: ( + [nameColumn]: ( ), + [CONST.SEARCH.GROUP_BY.APPROVER]: (() => { + if (!isTransactionApproverGroupListItemType(groupItem)) { + return null; + } + return ( + + ); + })(), }; if (searchType === CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT) { diff --git a/src/components/Search/SearchList/ListItem/types.ts b/src/components/Search/SearchList/ListItem/types.ts index aa76674e3ecc..44061e68bedf 100644 --- a/src/components/Search/SearchList/ListItem/types.ts +++ b/src/components/Search/SearchList/ListItem/types.ts @@ -22,6 +22,7 @@ import type { } from '@src/types/onyx'; import type {Errors, Icon} from '@src/types/onyx/OnyxCommon'; import type { + SearchApproverGroup, SearchCardGroup, SearchCategoryGroup, SearchDataTypes, @@ -530,6 +531,12 @@ type TransactionQuarterGroupListItemType = TransactionGroupListItemType & {group sortKey: number; }; +type TransactionApproverGroupListItemType = TransactionGroupListItemType & {groupedBy: typeof CONST.SEARCH.GROUP_BY.APPROVER} & PersonalDetails & + SearchApproverGroup & { + /** Final and formatted approver name used for displaying and sorting */ + formattedApprover?: string; + }; + type TransactionListItemProps = ListItemProps & SearchListActionProps & { /** Whether the item's action is loading */ @@ -602,6 +609,7 @@ type GroupHeaderItemType = | (TransactionWeekGroupListItemType & GroupHeaderListItemType) | (TransactionYearGroupListItemType & GroupHeaderListItemType) | (TransactionQuarterGroupListItemType & GroupHeaderListItemType) + | (TransactionApproverGroupListItemType & GroupHeaderListItemType) | (TransactionGroupListItemType & GroupHeaderListItemType); type GroupChildrenContainerItemType = TransactionGroupListItemType & { @@ -661,6 +669,7 @@ export type { TransactionWeekGroupListItemType, TransactionYearGroupListItemType, TransactionQuarterGroupListItemType, + TransactionApproverGroupListItemType, TransactionWithdrawalIDGroupListItemType, TransactionGroupListItemProps, TransactionGroupListExpandedProps, diff --git a/src/components/Search/SearchPageHeader/SearchFilterBar.tsx b/src/components/Search/SearchPageHeader/SearchFilterBar.tsx index b387f65443b4..bd29078ce9a2 100644 --- a/src/components/Search/SearchPageHeader/SearchFilterBar.tsx +++ b/src/components/Search/SearchPageHeader/SearchFilterBar.tsx @@ -122,6 +122,7 @@ function ReportDropdown({label, value, PopoverComponent, sentryLabel, onClosePre const FILTER_COMPONENT_MAP: Partial>> = { [CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM]: UserDropdown, + [CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER]: UserDropdown, [CONST.SEARCH.SYNTAX_FILTER_KEYS.TO]: UserDropdown, [CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY]: UserDropdown, [CONST.SEARCH.SYNTAX_FILTER_KEYS.ATTENDEE]: UserDropdown, diff --git a/src/components/Search/SearchRouter/buildSubstitutionsMap.ts b/src/components/Search/SearchRouter/buildSubstitutionsMap.ts index 6678437b7aeb..dc044244545a 100644 --- a/src/components/Search/SearchRouter/buildSubstitutionsMap.ts +++ b/src/components/Search/SearchRouter/buildSubstitutionsMap.ts @@ -76,6 +76,7 @@ function buildSubstitutionsMap( } } else if ( filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM || + filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TO || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID || diff --git a/src/components/Search/SearchRouter/getQueryWithSubstitutions.ts b/src/components/Search/SearchRouter/getQueryWithSubstitutions.ts index c8e2d7971c7c..473e62f63ced 100644 --- a/src/components/Search/SearchRouter/getQueryWithSubstitutions.ts +++ b/src/components/Search/SearchRouter/getQueryWithSubstitutions.ts @@ -12,6 +12,7 @@ const getSubstitutionMapKey = (filterKey: SearchFilterKey, value: string) => `${ const USER_FILTER_KEYS = new Set([ CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.TO, CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAYER, diff --git a/src/components/Search/SearchTableHeader.tsx b/src/components/Search/SearchTableHeader.tsx index 7731c84c19be..b70bfa19ef93 100644 --- a/src/components/Search/SearchTableHeader.tsx +++ b/src/components/Search/SearchTableHeader.tsx @@ -577,6 +577,21 @@ const getTransactionGroupHeaders = (groupBy: SearchGroupBy, icons: SearchHeaderI }, ...commonGroupHeaders, ]; + case CONST.SEARCH.GROUP_BY.APPROVER: + return [ + { + columnName: CONST.SEARCH.TABLE_COLUMNS.AVATAR, + translationKey: undefined, + icon: icons.Profile, + isColumnSortable: false, + }, + { + columnName: CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, + translationKey: 'search.filters.groupBy.approver', + isColumnSortable: true, + }, + ...commonGroupHeaders, + ]; default: return []; } diff --git a/src/components/Search/chartGroupByConfig.ts b/src/components/Search/chartGroupByConfig.ts index ce188f09e56b..2e3282d96a21 100644 --- a/src/components/Search/chartGroupByConfig.ts +++ b/src/components/Search/chartGroupByConfig.ts @@ -135,6 +135,11 @@ const CHART_GROUP_BY_CONFIG: Record = { }, getDateRange: (item: GroupedItem) => (item.groupedBy === CONST.SEARCH.GROUP_BY.QUARTER ? DateUtils.getQuarterDateRange(item.year, item.quarter) : undefined), }, + [CONST.SEARCH.GROUP_BY.APPROVER]: { + titleIconName: 'Users', + getLabel: (item: GroupedItem) => (item.groupedBy === CONST.SEARCH.GROUP_BY.APPROVER ? (item.formattedApprover ?? '') : ''), + getFilterQuery: (item: GroupedItem) => (item.groupedBy === CONST.SEARCH.GROUP_BY.APPROVER ? `${CONST.SEARCH.GROUP_BY.APPROVER}:${item.accountID}` : ''), + }, }; export default CHART_GROUP_BY_CONFIG; diff --git a/src/components/Search/hooks/useGroupedItems.ts b/src/components/Search/hooks/useGroupedItems.ts index 977460020820..7989c9b962ac 100644 --- a/src/components/Search/hooks/useGroupedItems.ts +++ b/src/components/Search/hooks/useGroupedItems.ts @@ -31,7 +31,8 @@ function useGroupedItems(searchResults: OnyxEntry, queryJSON: Rea const [conciergeReportID] = useOnyx(ONYXKEYS.CONCIERGE_REPORT_ID); const [rules] = useOnyx(ONYXKEYS.COLLECTION.RULE); const groupBy = queryJSON?.groupBy; - const [onyxPersonalDetailsList] = usePersonalDetailsByIDs(groupBy === CONST.SEARCH.GROUP_BY.FROM ? getGroupedAccountIDs(searchResults?.data) : undefined); + const shouldLoadGroupPersonalDetails = groupBy === CONST.SEARCH.GROUP_BY.FROM || groupBy === CONST.SEARCH.GROUP_BY.APPROVER; + const [onyxPersonalDetailsList] = usePersonalDetailsByIDs(shouldLoadGroupPersonalDetails ? getGroupedAccountIDs(searchResults?.data) : undefined); const sortedSections = searchResults?.data && queryJSON && groupBy && login diff --git a/src/components/Search/types.ts b/src/components/Search/types.ts index 5f37822d83e6..6ac58ae6482e 100644 --- a/src/components/Search/types.ts +++ b/src/components/Search/types.ts @@ -28,6 +28,7 @@ import type { TransactionMonthGroupListItemType, TransactionQuarterGroupListItemType, TransactionTagGroupListItemType, + TransactionApproverGroupListItemType, TransactionWeekGroupListItemType, TransactionWithdrawalIDGroupListItemType, TransactionYearGroupListItemType, @@ -195,7 +196,8 @@ type SearchCustomColumnIds = | ValueOf | ValueOf | ValueOf - | ValueOf; + | ValueOf + | ValueOf; type SearchQueryContextValue = { currentSearchHash: number; @@ -477,7 +479,8 @@ type GroupedItem = | TransactionMonthGroupListItemType | TransactionWeekGroupListItemType | TransactionYearGroupListItemType - | TransactionQuarterGroupListItemType; + | TransactionQuarterGroupListItemType + | TransactionApproverGroupListItemType; type SearchChartDataRow = { /** The point plotted on the chart */ diff --git a/src/hooks/useAdvancedSearchFilters.ts b/src/hooks/useAdvancedSearchFilters.ts index c2f63fa2915e..87ce581fe2fd 100644 --- a/src/hooks/useAdvancedSearchFilters.ts +++ b/src/hooks/useAdvancedSearchFilters.ts @@ -69,6 +69,7 @@ const typeFiltersKeys = { CONST.SEARCH.SYNTAX_FILTER_KEYS.HELD, CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVED, CONST.SEARCH.SYNTAX_FILTER_KEYS.ANY_APPROVAL, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY, ], diff --git a/src/hooks/useAutocompleteSuggestions.ts b/src/hooks/useAutocompleteSuggestions.ts index aad9b76b914c..f200ed1d663b 100644 --- a/src/hooks/useAutocompleteSuggestions.ts +++ b/src/hooks/useAutocompleteSuggestions.ts @@ -251,6 +251,7 @@ function useAutocompleteSuggestions({ case CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE: case CONST.SEARCH.SYNTAX_FILTER_KEYS.TO: case CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER: case CONST.SEARCH.SYNTAX_FILTER_KEYS.PAYER: case CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY: case CONST.SEARCH.SYNTAX_FILTER_KEYS.ATTENDEE: diff --git a/src/hooks/useSearchBulkActions.ts b/src/hooks/useSearchBulkActions.ts index 6ad765446877..b603c55723a9 100644 --- a/src/hooks/useSearchBulkActions.ts +++ b/src/hooks/useSearchBulkActions.ts @@ -466,6 +466,7 @@ function getAllMatchingReportQuery(queryJSON: SearchQueryJSON, excludedTransacti */ const TEMPLATE_EXPORTABLE_GROUP_BYS = new Set([ CONST.SEARCH.GROUP_BY.FROM, + CONST.SEARCH.GROUP_BY.APPROVER, CONST.SEARCH.GROUP_BY.CARD, CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID, CONST.SEARCH.GROUP_BY.CATEGORY, diff --git a/src/languages/de.ts b/src/languages/de.ts index c7ea8d0d5807..a5676f85eb73 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -10830,6 +10830,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc [CONST.SEARCH.GROUP_BY.WEEK]: 'Woche', [CONST.SEARCH.GROUP_BY.YEAR]: 'Jahr', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Quartal', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Genehmiger', }, feed: 'Feed', withdrawalType: { @@ -10889,6 +10890,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc [CONST.SEARCH.GROUP_BY.WEEK]: 'Wochen', [CONST.SEARCH.GROUP_BY.YEAR]: 'Jahre', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Quartale', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Genehmiger', }, moneyRequestReport: {emptyStateTitle: 'Noch keine Ausgaben', accessPlaceHolder: 'Für Details öffnen'}, noCategory: 'Keine Kategorie', diff --git a/src/languages/el.ts b/src/languages/el.ts index 05a4b0d891aa..f68e7a42347b 100644 --- a/src/languages/el.ts +++ b/src/languages/el.ts @@ -11041,6 +11041,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Εβδομάδα', [CONST.SEARCH.GROUP_BY.YEAR]: 'Έτος', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Τρίμηνο', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Εγκρίνων', }, feed: 'Ροή', withdrawalType: { @@ -11104,6 +11105,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Εβδομάδες', [CONST.SEARCH.GROUP_BY.YEAR]: 'Έτη', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Τρίμηνα', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Εγκρίνοντες', }, moneyRequestReport: { emptyStateTitle: 'Καμία δαπάνη ακόμη', diff --git a/src/languages/en.ts b/src/languages/en.ts index 6d8208ee233c..284a292fa529 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -11113,6 +11113,7 @@ const translations = { [CONST.SEARCH.GROUP_BY.WEEK]: 'Week', [CONST.SEARCH.GROUP_BY.YEAR]: 'Year', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Quarter', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approver', }, feed: 'Feed', transactionStatus: { @@ -11176,6 +11177,7 @@ const translations = { [CONST.SEARCH.GROUP_BY.WEEK]: 'Weeks', [CONST.SEARCH.GROUP_BY.YEAR]: 'Years', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Quarters', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approvers', }, moneyRequestReport: { emptyStateTitle: 'No expenses yet', diff --git a/src/languages/es.ts b/src/languages/es.ts index e2997c44b545..2e324ac4280e 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -10682,6 +10682,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Semana', [CONST.SEARCH.GROUP_BY.YEAR]: 'Año', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Aprobador', }, feed: 'Feed', withdrawalType: { @@ -10727,6 +10728,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Semanas', [CONST.SEARCH.GROUP_BY.YEAR]: 'Años', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Aprobadores', }, moneyRequestReport: {emptyStateTitle: 'Aún no hay gastos', accessPlaceHolder: 'Abrir para ver detalles'}, noCategory: 'Sin categoría', diff --git a/src/languages/fr.ts b/src/languages/fr.ts index 50358123378a..41b39fe80113 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -10857,6 +10857,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e [CONST.SEARCH.GROUP_BY.WEEK]: 'Semaine', [CONST.SEARCH.GROUP_BY.YEAR]: 'Année', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approbateur', }, feed: 'Fil', withdrawalType: { @@ -10916,6 +10917,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e [CONST.SEARCH.GROUP_BY.WEEK]: 'Semaines', [CONST.SEARCH.GROUP_BY.YEAR]: 'Années', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approbateurs', }, moneyRequestReport: {emptyStateTitle: 'Aucune dépense pour l’instant', accessPlaceHolder: 'Ouvrir pour plus de détails'}, noCategory: 'Aucune catégorie', diff --git a/src/languages/it.ts b/src/languages/it.ts index c9a293f0a292..7b78548b2182 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -10783,6 +10783,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Settimana', [CONST.SEARCH.GROUP_BY.YEAR]: 'Anno', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approvatore', }, feed: 'Feed', withdrawalType: { @@ -10842,6 +10843,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Settimane', [CONST.SEARCH.GROUP_BY.YEAR]: 'Anni', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestri', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Approvatori', }, moneyRequestReport: {emptyStateTitle: 'Nessuna spesa ancora', accessPlaceHolder: 'Apri per i dettagli'}, noCategory: 'Nessuna categoria', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index a2f6cc6054d2..21bda4524961 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -10627,6 +10627,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: '週', [CONST.SEARCH.GROUP_BY.YEAR]: '年', [CONST.SEARCH.GROUP_BY.QUARTER]: '四半期', + [CONST.SEARCH.GROUP_BY.APPROVER]: '承認者', }, feed: 'フィード', withdrawalType: { @@ -10680,6 +10681,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: '週数', [CONST.SEARCH.GROUP_BY.YEAR]: '年数', [CONST.SEARCH.GROUP_BY.QUARTER]: '四半期', + [CONST.SEARCH.GROUP_BY.APPROVER]: '承認者', }, moneyRequestReport: {emptyStateTitle: 'まだ経費がありません', accessPlaceHolder: '詳細を開く'}, noCategory: 'カテゴリなし', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index 9723637e0ad0..13f0b424f392 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -10752,6 +10752,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Week', [CONST.SEARCH.GROUP_BY.YEAR]: 'Jaar', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartaal', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Goedkeurder', }, feed: 'Feed', withdrawalType: { @@ -10856,6 +10857,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Weken', [CONST.SEARCH.GROUP_BY.YEAR]: 'Jaren', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartalen', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Goedkeurders', }, spendOverTime: 'Uitgaven in de tijd', trip: { diff --git a/src/languages/pl.ts b/src/languages/pl.ts index acac974e8a83..d81e2d8eb90f 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -10774,6 +10774,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Tydzień', [CONST.SEARCH.GROUP_BY.YEAR]: 'Rok', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartał', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Osoba zatwierdzająca', }, feed: 'Kanał', withdrawalType: { @@ -10833,6 +10834,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Tygodnie', [CONST.SEARCH.GROUP_BY.YEAR]: 'Lata', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Kwartały', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Osoby zatwierdzające', }, moneyRequestReport: {emptyStateTitle: 'Brak wydatków', accessPlaceHolder: 'Otwórz, aby zobaczyć szczegóły'}, noCategory: 'Brak kategorii', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 72d4ca619210..ecb5fab9a79a 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -10754,6 +10754,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Semana', [CONST.SEARCH.GROUP_BY.YEAR]: 'Ano', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestre', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Aprovador', }, feed: 'Feed', withdrawalType: { @@ -10854,6 +10855,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, [CONST.SEARCH.GROUP_BY.WEEK]: 'Semanas', [CONST.SEARCH.GROUP_BY.YEAR]: 'Anos', [CONST.SEARCH.GROUP_BY.QUARTER]: 'Trimestres', + [CONST.SEARCH.GROUP_BY.APPROVER]: 'Aprovadores', }, moneyRequestReport: {emptyStateTitle: 'Ainda não há despesas', accessPlaceHolder: 'Abrir para ver detalhes'}, errors: { diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index d853af9d3c81..5f848b0bc8a1 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -10356,6 +10356,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: '周', [CONST.SEARCH.GROUP_BY.YEAR]: '年份', [CONST.SEARCH.GROUP_BY.QUARTER]: '季度', + [CONST.SEARCH.GROUP_BY.APPROVER]: '审批人', }, feed: '动态', withdrawalType: { @@ -10409,6 +10410,7 @@ ${reportName}`, [CONST.SEARCH.GROUP_BY.WEEK]: '周', [CONST.SEARCH.GROUP_BY.YEAR]: '年', [CONST.SEARCH.GROUP_BY.QUARTER]: '季度', + [CONST.SEARCH.GROUP_BY.APPROVER]: '审批人', }, moneyRequestReport: {emptyStateTitle: '暂时没有报销费用', accessPlaceHolder: '展开查看详情'}, noCategory: '无类别', diff --git a/src/libs/SearchAutocompleteUtils.ts b/src/libs/SearchAutocompleteUtils.ts index e5ccc06fc7b0..a68352007503 100644 --- a/src/libs/SearchAutocompleteUtils.ts +++ b/src/libs/SearchAutocompleteUtils.ts @@ -15,6 +15,7 @@ import {getUserFriendlyKey, getUserFriendlyValue} from './SearchQueryUtils'; const CONTINUATION_DETECTION_SEARCH_FILTER_KEYS: SearchFilterKey[] = [ CONST.SEARCH.SYNTAX_FILTER_KEYS.TO, CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAYER, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY, @@ -246,6 +247,7 @@ function filterOutRangesWithCorrectValue( case CONST.SEARCH.SYNTAX_FILTER_KEYS.TO: case CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM: + case CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER: case CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE: case CONST.SEARCH.SYNTAX_FILTER_KEYS.PAYER: case CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY: diff --git a/src/libs/SearchParser/autocompleteParser.js b/src/libs/SearchParser/autocompleteParser.js index d7ef2875421d..badd81501222 100644 --- a/src/libs/SearchParser/autocompleteParser.js +++ b/src/libs/SearchParser/autocompleteParser.js @@ -259,69 +259,71 @@ function peg$parse(input, options) { var peg$c73 = "submitter-payroll-id"; var peg$c74 = "orderdealnumbers"; var peg$c75 = "order-deal-numbers"; - var peg$c76 = "assignee"; - var peg$c77 = "createdby"; - var peg$c78 = "created-by"; - var peg$c79 = "action"; - var peg$c80 = "total"; - var peg$c81 = "has"; - var peg$c82 = "is"; - var peg$c83 = "purchaseamount"; - var peg$c84 = "purchase-amount"; - var peg$c85 = "purchasecurrency"; - var peg$c86 = "purchase-currency"; - var peg$c87 = "amountdebited"; - var peg$c88 = "amount-debited"; - var peg$c89 = "amountreimbursed"; - var peg$c90 = "amount-reimbursed"; - var peg$c91 = "columns"; - var peg$c92 = "view"; - var peg$c93 = "compare"; - var peg$c94 = "per-diem"; - var peg$c95 = "drafts"; - var peg$c96 = "draft"; - var peg$c97 = "tax"; - var peg$c98 = "policy-name"; - var peg$c99 = "long-report-id"; - var peg$c100 = "exported-to"; - var peg$c101 = "exportedto"; - var peg$c102 = "exchange-rate"; - var peg$c103 = "reimbursable-total"; - var peg$c104 = "non-reimbursable-total"; - var peg$c105 = "group-from"; - var peg$c106 = "group-expenses"; - var peg$c107 = "group-total"; - var peg$c108 = "group-card"; - var peg$c109 = "group-feed"; - var peg$c110 = "group-bank-account"; - var peg$c111 = "group-withdrawn"; - var peg$c112 = "group-withdrawal-id"; - var peg$c113 = "group-amount-debited"; - var peg$c114 = "group-amount-reimbursed"; - var peg$c115 = "group-category"; - var peg$c116 = "group-tag"; - var peg$c117 = "group-merchant"; - var peg$c118 = "group-day"; - var peg$c119 = "group-month"; - var peg$c120 = "group-week"; - var peg$c121 = "group-year"; - var peg$c122 = "group-quarter"; - var peg$c123 = "*:"; - var peg$c124 = "!="; - var peg$c125 = ">="; - var peg$c126 = ">"; - var peg$c127 = "<="; - var peg$c128 = "<"; - var peg$c129 = "\\"; - var peg$c130 = "\u201C"; - var peg$c131 = "\u201D"; - var peg$c132 = "\""; - var peg$c133 = "footercount"; - var peg$c134 = "footer-count"; - var peg$c135 = "footercurrency"; - var peg$c136 = "footer-currency"; - var peg$c137 = "footertotal"; - var peg$c138 = "footer-total"; + var peg$c76 = "approver"; + var peg$c77 = "assignee"; + var peg$c78 = "createdby"; + var peg$c79 = "created-by"; + var peg$c80 = "action"; + var peg$c81 = "total"; + var peg$c82 = "has"; + var peg$c83 = "is"; + var peg$c84 = "purchaseamount"; + var peg$c85 = "purchase-amount"; + var peg$c86 = "purchasecurrency"; + var peg$c87 = "purchase-currency"; + var peg$c88 = "amountdebited"; + var peg$c89 = "amount-debited"; + var peg$c90 = "amountreimbursed"; + var peg$c91 = "amount-reimbursed"; + var peg$c92 = "columns"; + var peg$c93 = "view"; + var peg$c94 = "compare"; + var peg$c95 = "per-diem"; + var peg$c96 = "drafts"; + var peg$c97 = "draft"; + var peg$c98 = "tax"; + var peg$c99 = "policy-name"; + var peg$c100 = "long-report-id"; + var peg$c101 = "exported-to"; + var peg$c102 = "exportedto"; + var peg$c103 = "exchange-rate"; + var peg$c104 = "reimbursable-total"; + var peg$c105 = "non-reimbursable-total"; + var peg$c106 = "group-from"; + var peg$c107 = "group-expenses"; + var peg$c108 = "group-total"; + var peg$c109 = "group-card"; + var peg$c110 = "group-feed"; + var peg$c111 = "group-bank-account"; + var peg$c112 = "group-withdrawn"; + var peg$c113 = "group-withdrawal-id"; + var peg$c114 = "group-amount-debited"; + var peg$c115 = "group-amount-reimbursed"; + var peg$c116 = "group-category"; + var peg$c117 = "group-tag"; + var peg$c118 = "group-merchant"; + var peg$c119 = "group-day"; + var peg$c120 = "group-month"; + var peg$c121 = "group-week"; + var peg$c122 = "group-year"; + var peg$c123 = "group-quarter"; + var peg$c124 = "group-approver"; + var peg$c125 = "*:"; + var peg$c126 = "!="; + var peg$c127 = ">="; + var peg$c128 = ">"; + var peg$c129 = "<="; + var peg$c130 = "<"; + var peg$c131 = "\\"; + var peg$c132 = "\u201C"; + var peg$c133 = "\u201D"; + var peg$c134 = "\""; + var peg$c135 = "footercount"; + var peg$c136 = "footer-count"; + var peg$c137 = "footercurrency"; + var peg$c138 = "footer-currency"; + var peg$c139 = "footertotal"; + var peg$c140 = "footer-total"; var peg$r0 = /^[ \t\r\n\xA0,:=<>!]/; var peg$r1 = /^[:=]/; @@ -417,86 +419,88 @@ function peg$parse(input, options) { var peg$e76 = peg$literalExpectation("submitter-payroll-id", true); var peg$e77 = peg$literalExpectation("orderDealNumbers", true); var peg$e78 = peg$literalExpectation("order-deal-numbers", true); - var peg$e79 = peg$literalExpectation("assignee", true); - var peg$e80 = peg$literalExpectation("createdBy", true); - var peg$e81 = peg$literalExpectation("created-by", true); - var peg$e82 = peg$literalExpectation("action", true); - var peg$e83 = peg$literalExpectation("total", true); - var peg$e84 = peg$literalExpectation("has", true); - var peg$e85 = peg$literalExpectation("is", true); - var peg$e86 = peg$literalExpectation("purchaseAmount", true); - var peg$e87 = peg$literalExpectation("purchase-amount", true); - var peg$e88 = peg$literalExpectation("purchaseCurrency", true); - var peg$e89 = peg$literalExpectation("purchase-currency", true); - var peg$e90 = peg$literalExpectation("amountDebited", true); - var peg$e91 = peg$literalExpectation("amount-debited", true); - var peg$e92 = peg$literalExpectation("amountReimbursed", true); - var peg$e93 = peg$literalExpectation("amount-reimbursed", true); - var peg$e94 = peg$literalExpectation("columns", true); - var peg$e95 = peg$literalExpectation("view", true); - var peg$e96 = peg$literalExpectation("compare", true); - var peg$e97 = peg$literalExpectation("per-diem", true); - var peg$e98 = peg$literalExpectation("drafts", true); - var peg$e99 = peg$literalExpectation("draft", true); - var peg$e100 = peg$literalExpectation("tax", true); - var peg$e101 = peg$literalExpectation("policy-name", true); - var peg$e102 = peg$literalExpectation("long-report-id", true); - var peg$e103 = peg$literalExpectation("exported-to", true); - var peg$e104 = peg$classExpectation([":", "="], false, false); - var peg$e105 = peg$literalExpectation("exportedTo", true); - var peg$e106 = peg$literalExpectation("exchange-rate", true); - var peg$e107 = peg$literalExpectation("reimbursable-total", true); - var peg$e108 = peg$literalExpectation("non-reimbursable-total", true); - var peg$e109 = peg$literalExpectation("group-from", true); - var peg$e110 = peg$literalExpectation("group-expenses", true); - var peg$e111 = peg$literalExpectation("group-total", true); - var peg$e112 = peg$literalExpectation("group-card", true); - var peg$e113 = peg$literalExpectation("group-feed", true); - var peg$e114 = peg$literalExpectation("group-bank-account", true); - var peg$e115 = peg$literalExpectation("group-withdrawn", true); - var peg$e116 = peg$literalExpectation("group-withdrawal-id", true); - var peg$e117 = peg$literalExpectation("group-amount-debited", true); - var peg$e118 = peg$literalExpectation("group-amount-reimbursed", true); - var peg$e119 = peg$literalExpectation("group-category", true); - var peg$e120 = peg$literalExpectation("group-tag", true); - var peg$e121 = peg$literalExpectation("group-merchant", true); - var peg$e122 = peg$literalExpectation("group-day", true); - var peg$e123 = peg$literalExpectation("group-month", true); - var peg$e124 = peg$literalExpectation("group-week", true); - var peg$e125 = peg$literalExpectation("group-year", true); - var peg$e126 = peg$literalExpectation("group-quarter", true); - var peg$e127 = peg$otherExpectation("operator"); - var peg$e128 = peg$literalExpectation("*:", false); - var peg$e129 = peg$literalExpectation("!=", false); - var peg$e130 = peg$literalExpectation(">=", false); - var peg$e131 = peg$literalExpectation(">", false); - var peg$e132 = peg$literalExpectation("<=", false); - var peg$e133 = peg$literalExpectation("<", false); - var peg$e134 = peg$literalExpectation("\\", false); - var peg$e135 = peg$classExpectation([",", "\"", "\u201D", "\u201C", "\\"], false, false); - var peg$e136 = peg$otherExpectation("word"); - var peg$e137 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e138 = peg$otherExpectation("whitespace"); - var peg$e139 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e140 = peg$otherExpectation("quote"); - var peg$e141 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e142 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e143 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e144 = peg$literalExpectation("\u201C", false); - var peg$e145 = peg$literalExpectation("\u201D", false); - var peg$e146 = peg$literalExpectation("\"", false); - var peg$e147 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e148 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e149 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e150 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e151 = peg$classExpectation([","], false, false); - var peg$e152 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false); - var peg$e153 = peg$literalExpectation("footerCount", true); - var peg$e154 = peg$literalExpectation("footer-count", true); - var peg$e155 = peg$literalExpectation("footerCurrency", true); - var peg$e156 = peg$literalExpectation("footer-currency", true); - var peg$e157 = peg$literalExpectation("footerTotal", true); - var peg$e158 = peg$literalExpectation("footer-total", true); + var peg$e79 = peg$literalExpectation("approver", true); + var peg$e80 = peg$literalExpectation("assignee", true); + var peg$e81 = peg$literalExpectation("createdBy", true); + var peg$e82 = peg$literalExpectation("created-by", true); + var peg$e83 = peg$literalExpectation("action", true); + var peg$e84 = peg$literalExpectation("total", true); + var peg$e85 = peg$literalExpectation("has", true); + var peg$e86 = peg$literalExpectation("is", true); + var peg$e87 = peg$literalExpectation("purchaseAmount", true); + var peg$e88 = peg$literalExpectation("purchase-amount", true); + var peg$e89 = peg$literalExpectation("purchaseCurrency", true); + var peg$e90 = peg$literalExpectation("purchase-currency", true); + var peg$e91 = peg$literalExpectation("amountDebited", true); + var peg$e92 = peg$literalExpectation("amount-debited", true); + var peg$e93 = peg$literalExpectation("amountReimbursed", true); + var peg$e94 = peg$literalExpectation("amount-reimbursed", true); + var peg$e95 = peg$literalExpectation("columns", true); + var peg$e96 = peg$literalExpectation("view", true); + var peg$e97 = peg$literalExpectation("compare", true); + var peg$e98 = peg$literalExpectation("per-diem", true); + var peg$e99 = peg$literalExpectation("drafts", true); + var peg$e100 = peg$literalExpectation("draft", true); + var peg$e101 = peg$literalExpectation("tax", true); + var peg$e102 = peg$literalExpectation("policy-name", true); + var peg$e103 = peg$literalExpectation("long-report-id", true); + var peg$e104 = peg$literalExpectation("exported-to", true); + var peg$e105 = peg$classExpectation([":", "="], false, false); + var peg$e106 = peg$literalExpectation("exportedTo", true); + var peg$e107 = peg$literalExpectation("exchange-rate", true); + var peg$e108 = peg$literalExpectation("reimbursable-total", true); + var peg$e109 = peg$literalExpectation("non-reimbursable-total", true); + var peg$e110 = peg$literalExpectation("group-from", true); + var peg$e111 = peg$literalExpectation("group-expenses", true); + var peg$e112 = peg$literalExpectation("group-total", true); + var peg$e113 = peg$literalExpectation("group-card", true); + var peg$e114 = peg$literalExpectation("group-feed", true); + var peg$e115 = peg$literalExpectation("group-bank-account", true); + var peg$e116 = peg$literalExpectation("group-withdrawn", true); + var peg$e117 = peg$literalExpectation("group-withdrawal-id", true); + var peg$e118 = peg$literalExpectation("group-amount-debited", true); + var peg$e119 = peg$literalExpectation("group-amount-reimbursed", true); + var peg$e120 = peg$literalExpectation("group-category", true); + var peg$e121 = peg$literalExpectation("group-tag", true); + var peg$e122 = peg$literalExpectation("group-merchant", true); + var peg$e123 = peg$literalExpectation("group-day", true); + var peg$e124 = peg$literalExpectation("group-month", true); + var peg$e125 = peg$literalExpectation("group-week", true); + var peg$e126 = peg$literalExpectation("group-year", true); + var peg$e127 = peg$literalExpectation("group-quarter", true); + var peg$e128 = peg$literalExpectation("group-approver", true); + var peg$e129 = peg$otherExpectation("operator"); + var peg$e130 = peg$literalExpectation("*:", false); + var peg$e131 = peg$literalExpectation("!=", false); + var peg$e132 = peg$literalExpectation(">=", false); + var peg$e133 = peg$literalExpectation(">", false); + var peg$e134 = peg$literalExpectation("<=", false); + var peg$e135 = peg$literalExpectation("<", false); + var peg$e136 = peg$literalExpectation("\\", false); + var peg$e137 = peg$classExpectation([",", "\"", "\u201D", "\u201C", "\\"], false, false); + var peg$e138 = peg$otherExpectation("word"); + var peg$e139 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e140 = peg$otherExpectation("whitespace"); + var peg$e141 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e142 = peg$otherExpectation("quote"); + var peg$e143 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e144 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e145 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e146 = peg$literalExpectation("\u201C", false); + var peg$e147 = peg$literalExpectation("\u201D", false); + var peg$e148 = peg$literalExpectation("\"", false); + var peg$e149 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e150 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e151 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e152 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e153 = peg$classExpectation([","], false, false); + var peg$e154 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false); + var peg$e155 = peg$literalExpectation("footerCount", true); + var peg$e156 = peg$literalExpectation("footer-count", true); + var peg$e157 = peg$literalExpectation("footerCurrency", true); + var peg$e158 = peg$literalExpectation("footer-currency", true); + var peg$e159 = peg$literalExpectation("footerTotal", true); + var peg$e160 = peg$literalExpectation("footer-total", true); var peg$f0 = function(ranges) { return { autocomplete, ranges }; }; var peg$f1 = function(filters) { return filters.filter(Boolean).flat(); }; @@ -619,92 +623,94 @@ function peg$parse(input, options) { var peg$f57 = function() { return "submitterUserID"; }; var peg$f58 = function() { return "submitterPayrollID"; }; var peg$f59 = function() { return "orderDealNumbers"; }; - var peg$f60 = function() { return "assignee"; }; - var peg$f61 = function() { return "createdBy"; }; - var peg$f62 = function() { return "action"; }; - var peg$f63 = function() {return "total"; }; - var peg$f64 = function() {return "has"; }; - var peg$f65 = function() {return "is"; }; - var peg$f66 = function() {return "purchaseAmount"}; - var peg$f67 = function() {return "purchaseCurrency"}; - var peg$f68 = function() {return "amountDebited"}; - var peg$f69 = function() {return "amountReimbursed"}; - var peg$f70 = function() { + var peg$f60 = function() { return "approver"; }; + var peg$f61 = function() { return "assignee"; }; + var peg$f62 = function() { return "createdBy"; }; + var peg$f63 = function() { return "action"; }; + var peg$f64 = function() {return "total"; }; + var peg$f65 = function() {return "has"; }; + var peg$f66 = function() {return "is"; }; + var peg$f67 = function() {return "purchaseAmount"}; + var peg$f68 = function() {return "purchaseCurrency"}; + var peg$f69 = function() {return "amountDebited"}; + var peg$f70 = function() {return "amountReimbursed"}; + var peg$f71 = function() { isColumnsContext = true; return "columns"; }; - var peg$f71 = function() {return "view"}; - var peg$f72 = function() {return "compare"}; - var peg$f73 = function() { return isColumnsContext; }; - var peg$f74 = function() { return "perDiem"; }; - var peg$f75 = function() { return "drafts"; }; - var peg$f76 = function() { return "originalamount"; }; - var peg$f77 = function() { return "taxAmount"; }; - var peg$f78 = function() { return "taxrate"; }; - var peg$f79 = function() { return "policyname"; }; - var peg$f80 = function() { return "withdrawalID"; }; - var peg$f81 = function() { return "bankAccount"; }; - var peg$f82 = function() { return "reportID"; }; - var peg$f83 = function() { return "base62ReportID"; }; - var peg$f84 = function() { return "exportedto"; }; - var peg$f85 = function() { return "exportedTo"; }; + var peg$f72 = function() {return "view"}; + var peg$f73 = function() {return "compare"}; + var peg$f74 = function() { return isColumnsContext; }; + var peg$f75 = function() { return "perDiem"; }; + var peg$f76 = function() { return "drafts"; }; + var peg$f77 = function() { return "originalamount"; }; + var peg$f78 = function() { return "taxAmount"; }; + var peg$f79 = function() { return "taxrate"; }; + var peg$f80 = function() { return "policyname"; }; + var peg$f81 = function() { return "withdrawalID"; }; + var peg$f82 = function() { return "bankAccount"; }; + var peg$f83 = function() { return "reportID"; }; + var peg$f84 = function() { return "base62ReportID"; }; + var peg$f85 = function() { return "exportedto"; }; var peg$f86 = function() { return "exportedTo"; }; - var peg$f87 = function() { return "exchangeRate"; }; - var peg$f88 = function() { return "reimbursableTotal"; }; - var peg$f89 = function() { return "nonReimbursableTotal"; }; - var peg$f90 = function() { return "groupFrom"; }; - var peg$f91 = function() { return "groupExpenses"; }; - var peg$f92 = function() { return "groupTotal"; }; - var peg$f93 = function() { return "groupCard"; }; - var peg$f94 = function() { return "groupFeed"; }; - var peg$f95 = function() { return "groupBankAccount"; }; - var peg$f96 = function() { return "groupWithdrawn"; }; - var peg$f97 = function() { return "groupWithdrawalID"; }; - var peg$f98 = function() { return "groupAmountDebited"; }; - var peg$f99 = function() { return "groupAmountReimbursed"; }; - var peg$f100 = function() { return "amountDebited"; }; - var peg$f101 = function() { return "amountReimbursed"; }; - var peg$f102 = function() { return "groupCategory"; }; - var peg$f103 = function() { return "groupTag"; }; - var peg$f104 = function() { return "groupMerchant"; }; - var peg$f105 = function() { return "groupday"; }; - var peg$f106 = function() { return "groupmonth"; }; - var peg$f107 = function() { return "groupweek"; }; - var peg$f108 = function() { return "groupyear"; }; - var peg$f109 = function() { return "groupquarter"; }; - var peg$f110 = function() { return "contains"; }; - var peg$f111 = function() { return "eq"; }; - var peg$f112 = function() { return "neq"; }; - var peg$f113 = function() { return "gte"; }; - var peg$f114 = function() { return "gt"; }; - var peg$f115 = function() { return "lte"; }; - var peg$f116 = function() { return "lt"; }; - var peg$f117 = function(o) { + var peg$f87 = function() { return "exportedTo"; }; + var peg$f88 = function() { return "exchangeRate"; }; + var peg$f89 = function() { return "reimbursableTotal"; }; + var peg$f90 = function() { return "nonReimbursableTotal"; }; + var peg$f91 = function() { return "groupFrom"; }; + var peg$f92 = function() { return "groupExpenses"; }; + var peg$f93 = function() { return "groupTotal"; }; + var peg$f94 = function() { return "groupCard"; }; + var peg$f95 = function() { return "groupFeed"; }; + var peg$f96 = function() { return "groupBankAccount"; }; + var peg$f97 = function() { return "groupWithdrawn"; }; + var peg$f98 = function() { return "groupWithdrawalID"; }; + var peg$f99 = function() { return "groupAmountDebited"; }; + var peg$f100 = function() { return "groupAmountReimbursed"; }; + var peg$f101 = function() { return "amountDebited"; }; + var peg$f102 = function() { return "amountReimbursed"; }; + var peg$f103 = function() { return "groupCategory"; }; + var peg$f104 = function() { return "groupTag"; }; + var peg$f105 = function() { return "groupMerchant"; }; + var peg$f106 = function() { return "groupday"; }; + var peg$f107 = function() { return "groupmonth"; }; + var peg$f108 = function() { return "groupweek"; }; + var peg$f109 = function() { return "groupyear"; }; + var peg$f110 = function() { return "groupquarter"; }; + var peg$f111 = function() { return "groupApprover"; }; + var peg$f112 = function() { return "contains"; }; + var peg$f113 = function() { return "eq"; }; + var peg$f114 = function() { return "neq"; }; + var peg$f115 = function() { return "gte"; }; + var peg$f116 = function() { return "gt"; }; + var peg$f117 = function() { return "lte"; }; + var peg$f118 = function() { return "lt"; }; + var peg$f119 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq" || o === "contains"); } isColumnsContext = false; return o; }; - var peg$f118 = function(c) { return c; }; - var peg$f119 = function(chars) { return chars.join("").trim(); }; - var peg$f120 = function() { + var peg$f120 = function(c) { return c; }; + var peg$f121 = function(chars) { return chars.join("").trim(); }; + var peg$f122 = function() { isColumnsContext = false; return "and"; }; - var peg$f121 = function() { return expectingNestedQuote; }; - var peg$f122 = function(start, inner, end) { //handle no-breaking space + var peg$f123 = function() { return expectingNestedQuote; }; + var peg$f124 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f123 = function(start) {return "“"}; - var peg$f124 = function(start) {return "”"}; - var peg$f125 = function(start) {return "\""}; - var peg$f126 = function(start, inner, end) { + var peg$f125 = function(start) {return "“"}; + var peg$f126 = function(start) {return "”"}; + var peg$f127 = function(start) {return "\""}; + var peg$f128 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; - var peg$f127 = function() { return "footerCount"; }; - var peg$f128 = function() { return "footerCurrency"; }; - var peg$f129 = function() { return "footerTotal"; }; + var peg$f129 = function() { return "footerCount"; }; + var peg$f130 = function() { return "footerCurrency"; }; + var peg$f131 = function() { return "footerTotal"; }; var peg$currPos = options.peg$currPos | 0; var peg$savedPos = peg$currPos; var peg$posDetailsCache = [{ line: 1, column: 1 }]; @@ -1233,17 +1239,20 @@ function peg$parse(input, options) { if (s1 === peg$FAILED) { s1 = peg$parseorderDealNumbers(); if (s1 === peg$FAILED) { - s1 = peg$parsereportFieldDynamic(); + s1 = peg$parseapprover(); if (s1 === peg$FAILED) { - s1 = peg$parsecolumns(); + s1 = peg$parsereportFieldDynamic(); if (s1 === peg$FAILED) { - s1 = peg$parselimit(); + s1 = peg$parsecolumns(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterCount(); + s1 = peg$parselimit(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterCurrency(); + s1 = peg$parsefooterCount(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterTotal(); + s1 = peg$parsefooterCurrency(); + if (s1 === peg$FAILED) { + s1 = peg$parsefooterTotal(); + } } } } @@ -2625,7 +2634,7 @@ function peg$parse(input, options) { return s0; } - function peg$parseassignee() { + function peg$parseapprover() { var s0, s1; s0 = peg$currPos; @@ -2645,28 +2654,48 @@ function peg$parse(input, options) { return s0; } + function peg$parseassignee() { + var s0, s1; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 8); + if (s1.toLowerCase() === peg$c77) { + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e80); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f61(); + } + s0 = s1; + + return s0; + } + function peg$parsecreatedBy() { var s0, s1; s0 = input.substr(peg$currPos, 9); - if (s0.toLowerCase() === peg$c77) { + if (s0.toLowerCase() === peg$c78) { peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e80); } + if (peg$silentFails === 0) { peg$fail(peg$e81); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c78) { + if (s1.toLowerCase() === peg$c79) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e81); } + if (peg$silentFails === 0) { peg$fail(peg$e82); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f61(); + s1 = peg$f62(); } s0 = s1; } @@ -2679,15 +2708,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c79) { + if (s1.toLowerCase() === peg$c80) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f62(); + s1 = peg$f63(); } s0 = s1; @@ -2699,15 +2728,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c80) { + if (s1.toLowerCase() === peg$c81) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f63(); + s1 = peg$f64(); } s0 = s1; @@ -2719,15 +2748,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 3); - if (s1.toLowerCase() === peg$c81) { + if (s1.toLowerCase() === peg$c82) { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e84); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f64(); + s1 = peg$f65(); } s0 = s1; @@ -2739,15 +2768,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 2); - if (s1.toLowerCase() === peg$c82) { + if (s1.toLowerCase() === peg$c83) { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e85); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f65(); + s1 = peg$f66(); } s0 = s1; @@ -2758,24 +2787,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 14); - if (s0.toLowerCase() === peg$c83) { + if (s0.toLowerCase() === peg$c84) { peg$currPos += 14; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e86); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c84) { + if (s1.toLowerCase() === peg$c85) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e87); } + if (peg$silentFails === 0) { peg$fail(peg$e88); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f66(); + s1 = peg$f67(); } s0 = s1; } @@ -2787,24 +2816,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c85) { + if (s0.toLowerCase() === peg$c86) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e88); } + if (peg$silentFails === 0) { peg$fail(peg$e89); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c86) { + if (s1.toLowerCase() === peg$c87) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e89); } + if (peg$silentFails === 0) { peg$fail(peg$e90); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f67(); + s1 = peg$f68(); } s0 = s1; } @@ -2816,24 +2845,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 13); - if (s0.toLowerCase() === peg$c87) { + if (s0.toLowerCase() === peg$c88) { peg$currPos += 13; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e90); } + if (peg$silentFails === 0) { peg$fail(peg$e91); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c88) { + if (s1.toLowerCase() === peg$c89) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e91); } + if (peg$silentFails === 0) { peg$fail(peg$e92); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f68(); + s1 = peg$f69(); } s0 = s1; } @@ -2845,24 +2874,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c89) { + if (s0.toLowerCase() === peg$c90) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e92); } + if (peg$silentFails === 0) { peg$fail(peg$e93); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c90) { + if (s1.toLowerCase() === peg$c91) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e93); } + if (peg$silentFails === 0) { peg$fail(peg$e94); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f69(); + s1 = peg$f70(); } s0 = s1; } @@ -2875,15 +2904,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 7); - if (s1.toLowerCase() === peg$c91) { + if (s1.toLowerCase() === peg$c92) { peg$currPos += 7; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e94); } + if (peg$silentFails === 0) { peg$fail(peg$e95); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f70(); + s1 = peg$f71(); } s0 = s1; @@ -2895,15 +2924,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 4); - if (s1.toLowerCase() === peg$c92) { + if (s1.toLowerCase() === peg$c93) { peg$currPos += 4; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e95); } + if (peg$silentFails === 0) { peg$fail(peg$e96); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f71(); + s1 = peg$f72(); } s0 = s1; @@ -2915,15 +2944,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 7); - if (s1.toLowerCase() === peg$c93) { + if (s1.toLowerCase() === peg$c94) { peg$currPos += 7; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e96); } + if (peg$silentFails === 0) { peg$fail(peg$e97); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f72(); + s1 = peg$f73(); } s0 = s1; @@ -2935,7 +2964,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f73(); + s1 = peg$f74(); if (s1) { s1 = undefined; } else { @@ -3030,6 +3059,9 @@ function peg$parse(input, options) { s0 = peg$parsegroupYear(); if (s0 === peg$FAILED) { s0 = peg$parsegroupQuarter(); + if (s0 === peg$FAILED) { + s0 = peg$parsegroupApprover(); + } } } } @@ -3070,11 +3102,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c94) { + if (s1.toLowerCase() === peg$c95) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e97); } + if (peg$silentFails === 0) { peg$fail(peg$e98); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3089,7 +3121,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f74(); + s0 = peg$f75(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3107,19 +3139,19 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c95) { + if (s1.toLowerCase() === peg$c96) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e98); } + if (peg$silentFails === 0) { peg$fail(peg$e99); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c96) { + if (s1.toLowerCase() === peg$c97) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e99); } + if (peg$silentFails === 0) { peg$fail(peg$e100); } } } if (s1 !== peg$FAILED) { @@ -3135,7 +3167,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f75(); + s0 = peg$f76(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3153,11 +3185,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c84) { + if (s1.toLowerCase() === peg$c85) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e87); } + if (peg$silentFails === 0) { peg$fail(peg$e88); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3172,7 +3204,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f76(); + s0 = peg$f77(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3190,11 +3222,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 3); - if (s1.toLowerCase() === peg$c97) { + if (s1.toLowerCase() === peg$c98) { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e100); } + if (peg$silentFails === 0) { peg$fail(peg$e101); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3209,7 +3241,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f77(); + s0 = peg$f78(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3246,7 +3278,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f78(); + s0 = peg$f79(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3264,11 +3296,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c98) { + if (s1.toLowerCase() === peg$c99) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e101); } + if (peg$silentFails === 0) { peg$fail(peg$e102); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3283,7 +3315,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f79(); + s0 = peg$f80(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3320,7 +3352,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f80(); + s0 = peg$f81(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3357,7 +3389,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f81(); + s0 = peg$f82(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3375,11 +3407,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c99) { + if (s1.toLowerCase() === peg$c100) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e102); } + if (peg$silentFails === 0) { peg$fail(peg$e103); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3394,7 +3426,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f82(); + s0 = peg$f83(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3431,7 +3463,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f83(); + s0 = peg$f84(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3449,11 +3481,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c100) { + if (s1.toLowerCase() === peg$c101) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e103); } + if (peg$silentFails === 0) { peg$fail(peg$e104); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3468,7 +3500,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f84(); + s0 = peg$f85(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3493,7 +3525,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e104); } + if (peg$silentFails === 0) { peg$fail(peg$e105); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -3512,11 +3544,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c101) { + if (s1.toLowerCase() === peg$c102) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e105); } + if (peg$silentFails === 0) { peg$fail(peg$e106); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3531,7 +3563,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f85(); + s0 = peg$f86(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3543,11 +3575,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c100) { + if (s1.toLowerCase() === peg$c101) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e103); } + if (peg$silentFails === 0) { peg$fail(peg$e104); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3562,7 +3594,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f86(); + s0 = peg$f87(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3581,11 +3613,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 13); - if (s1.toLowerCase() === peg$c102) { + if (s1.toLowerCase() === peg$c103) { peg$currPos += 13; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e106); } + if (peg$silentFails === 0) { peg$fail(peg$e107); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3600,7 +3632,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f87(); + s0 = peg$f88(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3618,11 +3650,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 18); - if (s1.toLowerCase() === peg$c103) { + if (s1.toLowerCase() === peg$c104) { peg$currPos += 18; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e107); } + if (peg$silentFails === 0) { peg$fail(peg$e108); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3637,7 +3669,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f88(); + s0 = peg$f89(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3655,11 +3687,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 22); - if (s1.toLowerCase() === peg$c104) { + if (s1.toLowerCase() === peg$c105) { peg$currPos += 22; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e108); } + if (peg$silentFails === 0) { peg$fail(peg$e109); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3674,7 +3706,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f89(); + s0 = peg$f90(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3692,11 +3724,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c105) { + if (s1.toLowerCase() === peg$c106) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e109); } + if (peg$silentFails === 0) { peg$fail(peg$e110); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3711,7 +3743,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f90(); + s0 = peg$f91(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3729,11 +3761,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c106) { + if (s1.toLowerCase() === peg$c107) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e110); } + if (peg$silentFails === 0) { peg$fail(peg$e111); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3748,7 +3780,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f91(); + s0 = peg$f92(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3766,11 +3798,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c107) { + if (s1.toLowerCase() === peg$c108) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e111); } + if (peg$silentFails === 0) { peg$fail(peg$e112); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3785,7 +3817,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f92(); + s0 = peg$f93(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3803,11 +3835,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c108) { + if (s1.toLowerCase() === peg$c109) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e112); } + if (peg$silentFails === 0) { peg$fail(peg$e113); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3822,7 +3854,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f93(); + s0 = peg$f94(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3840,11 +3872,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c109) { + if (s1.toLowerCase() === peg$c110) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e113); } + if (peg$silentFails === 0) { peg$fail(peg$e114); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3859,7 +3891,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f94(); + s0 = peg$f95(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3877,11 +3909,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 18); - if (s1.toLowerCase() === peg$c110) { + if (s1.toLowerCase() === peg$c111) { peg$currPos += 18; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e114); } + if (peg$silentFails === 0) { peg$fail(peg$e115); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3896,7 +3928,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f95(); + s0 = peg$f96(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3914,11 +3946,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c111) { + if (s1.toLowerCase() === peg$c112) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e115); } + if (peg$silentFails === 0) { peg$fail(peg$e116); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3933,7 +3965,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f96(); + s0 = peg$f97(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3951,11 +3983,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 19); - if (s1.toLowerCase() === peg$c112) { + if (s1.toLowerCase() === peg$c113) { peg$currPos += 19; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e116); } + if (peg$silentFails === 0) { peg$fail(peg$e117); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3970,7 +4002,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f97(); + s0 = peg$f98(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3988,11 +4020,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 20); - if (s1.toLowerCase() === peg$c113) { + if (s1.toLowerCase() === peg$c114) { peg$currPos += 20; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e117); } + if (peg$silentFails === 0) { peg$fail(peg$e118); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4007,7 +4039,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f98(); + s0 = peg$f99(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4025,11 +4057,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 23); - if (s1.toLowerCase() === peg$c114) { + if (s1.toLowerCase() === peg$c115) { peg$currPos += 23; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e118); } + if (peg$silentFails === 0) { peg$fail(peg$e119); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4044,7 +4076,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f99(); + s0 = peg$f100(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4062,11 +4094,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c88) { + if (s1.toLowerCase() === peg$c89) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e91); } + if (peg$silentFails === 0) { peg$fail(peg$e92); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4081,7 +4113,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f100(); + s0 = peg$f101(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4099,11 +4131,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c90) { + if (s1.toLowerCase() === peg$c91) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e93); } + if (peg$silentFails === 0) { peg$fail(peg$e94); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4118,7 +4150,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f101(); + s0 = peg$f102(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4136,11 +4168,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c115) { + if (s1.toLowerCase() === peg$c116) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e119); } + if (peg$silentFails === 0) { peg$fail(peg$e120); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4155,7 +4187,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f102(); + s0 = peg$f103(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4173,11 +4205,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 9); - if (s1.toLowerCase() === peg$c116) { + if (s1.toLowerCase() === peg$c117) { peg$currPos += 9; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e120); } + if (peg$silentFails === 0) { peg$fail(peg$e121); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4192,7 +4224,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f103(); + s0 = peg$f104(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4210,11 +4242,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c117) { + if (s1.toLowerCase() === peg$c118) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e121); } + if (peg$silentFails === 0) { peg$fail(peg$e122); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4229,7 +4261,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f104(); + s0 = peg$f105(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4247,11 +4279,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 9); - if (s1.toLowerCase() === peg$c118) { + if (s1.toLowerCase() === peg$c119) { peg$currPos += 9; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e122); } + if (peg$silentFails === 0) { peg$fail(peg$e123); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4266,7 +4298,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f105(); + s0 = peg$f106(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4284,11 +4316,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c119) { + if (s1.toLowerCase() === peg$c120) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e123); } + if (peg$silentFails === 0) { peg$fail(peg$e124); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4303,7 +4335,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f106(); + s0 = peg$f107(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4321,11 +4353,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c120) { + if (s1.toLowerCase() === peg$c121) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e124); } + if (peg$silentFails === 0) { peg$fail(peg$e125); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4340,7 +4372,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f107(); + s0 = peg$f108(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4358,11 +4390,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c121) { + if (s1.toLowerCase() === peg$c122) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e125); } + if (peg$silentFails === 0) { peg$fail(peg$e126); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4377,7 +4409,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f108(); + s0 = peg$f109(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4395,11 +4427,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 13); - if (s1.toLowerCase() === peg$c122) { + if (s1.toLowerCase() === peg$c123) { peg$currPos += 13; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e126); } + if (peg$silentFails === 0) { peg$fail(peg$e127); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4414,7 +4446,44 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f109(); + s0 = peg$f110(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsegroupApprover() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 14); + if (s1.toLowerCase() === peg$c124) { + peg$currPos += 14; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e128); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parsewordBoundary(); + peg$silentFails--; + if (s3 !== peg$FAILED) { + peg$currPos = s2; + s2 = undefined; + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f111(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4432,16 +4501,16 @@ function peg$parse(input, options) { peg$silentFails++; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c123) { - s1 = peg$c123; + if (input.substr(peg$currPos, 2) === peg$c125) { + s1 = peg$c125; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e128); } + if (peg$silentFails === 0) { peg$fail(peg$e130); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f110(); + s1 = peg$f112(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4451,81 +4520,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e104); } + if (peg$silentFails === 0) { peg$fail(peg$e105); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f111(); + s1 = peg$f113(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c124) { - s1 = peg$c124; + if (input.substr(peg$currPos, 2) === peg$c126) { + s1 = peg$c126; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e129); } + if (peg$silentFails === 0) { peg$fail(peg$e131); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f112(); + s1 = peg$f114(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c125) { - s1 = peg$c125; + if (input.substr(peg$currPos, 2) === peg$c127) { + s1 = peg$c127; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e130); } + if (peg$silentFails === 0) { peg$fail(peg$e132); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f113(); + s1 = peg$f115(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c126; + s1 = peg$c128; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e131); } + if (peg$silentFails === 0) { peg$fail(peg$e133); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f114(); + s1 = peg$f116(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c127) { - s1 = peg$c127; + if (input.substr(peg$currPos, 2) === peg$c129) { + s1 = peg$c129; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e132); } + if (peg$silentFails === 0) { peg$fail(peg$e134); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f115(); + s1 = peg$f117(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c128; + s1 = peg$c130; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e133); } + if (peg$silentFails === 0) { peg$fail(peg$e135); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f116(); + s1 = peg$f118(); } s0 = s1; } @@ -4537,7 +4606,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e127); } + if (peg$silentFails === 0) { peg$fail(peg$e129); } } return s0; @@ -4550,7 +4619,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f117(s1); + s1 = peg$f119(s1); } s0 = s1; @@ -4562,11 +4631,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c129; + s1 = peg$c131; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e134); } + if (peg$silentFails === 0) { peg$fail(peg$e136); } } if (s1 !== peg$FAILED) { s2 = input.charAt(peg$currPos); @@ -4574,11 +4643,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e135); } + if (peg$silentFails === 0) { peg$fail(peg$e137); } } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f118(s2); + s0 = peg$f120(s2); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4604,7 +4673,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e137); } + if (peg$silentFails === 0) { peg$fail(peg$e139); } } } if (s2 !== peg$FAILED) { @@ -4617,7 +4686,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e137); } + if (peg$silentFails === 0) { peg$fail(peg$e139); } } } } @@ -4626,13 +4695,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f119(s1); + s1 = peg$f121(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e136); } + if (peg$silentFails === 0) { peg$fail(peg$e138); } } return s0; @@ -4644,7 +4713,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f120(); + s1 = peg$f122(); s0 = s1; return s0; @@ -4660,7 +4729,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -4669,12 +4738,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e138); } + if (peg$silentFails === 0) { peg$fail(peg$e140); } return s0; } @@ -4684,7 +4753,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f121(); + s1 = peg$f123(); if (s1) { s1 = undefined; } else { @@ -4721,7 +4790,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -4730,7 +4799,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } } s2 = input.charAt(peg$currPos); @@ -4738,7 +4807,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } if (s2 !== peg$FAILED) { s3 = []; @@ -4749,7 +4818,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } } while (s4 !== peg$FAILED) { @@ -4761,7 +4830,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } } } @@ -4770,7 +4839,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } if (s4 !== peg$FAILED) { s5 = []; @@ -4779,7 +4848,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e137); } + if (peg$silentFails === 0) { peg$fail(peg$e139); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -4788,11 +4857,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e137); } + if (peg$silentFails === 0) { peg$fail(peg$e139); } } } peg$savedPos = s0; - s0 = peg$f122(s1, s3, s5); + s0 = peg$f124(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4804,7 +4873,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e140); } + if (peg$silentFails === 0) { peg$fail(peg$e142); } } return s0; @@ -4821,7 +4890,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -4830,7 +4899,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } } s2 = input.charAt(peg$currPos); @@ -4838,7 +4907,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } if (s2 !== peg$FAILED) { s3 = []; @@ -4849,7 +4918,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -4865,15 +4934,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c130; + s6 = peg$c132; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f123(s1); + s4 = peg$f125(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -4896,15 +4965,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c131; + s6 = peg$c133; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f124(s1); + s4 = peg$f126(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -4927,15 +4996,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c132; + s6 = peg$c134; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e146); } + if (peg$silentFails === 0) { peg$fail(peg$e148); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f125(s1); + s4 = peg$f127(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -4957,7 +5026,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -4973,15 +5042,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c130; + s6 = peg$c132; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f123(s1); + s4 = peg$f125(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5004,15 +5073,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c131; + s6 = peg$c133; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f124(s1); + s4 = peg$f126(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5035,15 +5104,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c132; + s6 = peg$c134; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e146); } + if (peg$silentFails === 0) { peg$fail(peg$e148); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f125(s1); + s4 = peg$f127(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5060,7 +5129,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f126(s1, s3, s4); + s0 = peg$f128(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -5072,7 +5141,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e140); } + if (peg$silentFails === 0) { peg$fail(peg$e142); } } return s0; @@ -5087,7 +5156,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -5125,7 +5194,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e147); } + if (peg$silentFails === 0) { peg$fail(peg$e149); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -5134,7 +5203,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e147); } + if (peg$silentFails === 0) { peg$fail(peg$e149); } } } s2 = []; @@ -5143,7 +5212,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e148); } + if (peg$silentFails === 0) { peg$fail(peg$e150); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -5152,7 +5221,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e148); } + if (peg$silentFails === 0) { peg$fail(peg$e150); } } } s3 = []; @@ -5161,7 +5230,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e149); } + if (peg$silentFails === 0) { peg$fail(peg$e151); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -5170,7 +5239,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e149); } + if (peg$silentFails === 0) { peg$fail(peg$e151); } } } s4 = peg$parseoperator(); @@ -5189,7 +5258,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e150); } + if (peg$silentFails === 0) { peg$fail(peg$e152); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -5198,7 +5267,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e150); } + if (peg$silentFails === 0) { peg$fail(peg$e152); } } } s2 = peg$currPos; @@ -5245,7 +5314,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e151); } + if (peg$silentFails === 0) { peg$fail(peg$e153); } } } } @@ -5261,7 +5330,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e152); } + if (peg$silentFails === 0) { peg$fail(peg$e154); } } if (s0 === peg$FAILED) { s0 = peg$currPos; @@ -5290,24 +5359,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c133) { + if (s1.toLowerCase() === peg$c135) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e153); } + if (peg$silentFails === 0) { peg$fail(peg$e155); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 12); - if (s1.toLowerCase() === peg$c134) { + if (s1.toLowerCase() === peg$c136) { peg$currPos += 12; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e154); } + if (peg$silentFails === 0) { peg$fail(peg$e156); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f127(); + s1 = peg$f129(); } s0 = s1; @@ -5319,24 +5388,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c135) { + if (s1.toLowerCase() === peg$c137) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e155); } + if (peg$silentFails === 0) { peg$fail(peg$e157); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c136) { + if (s1.toLowerCase() === peg$c138) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e156); } + if (peg$silentFails === 0) { peg$fail(peg$e158); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f128(); + s1 = peg$f130(); } s0 = s1; @@ -5348,24 +5417,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c137) { + if (s1.toLowerCase() === peg$c139) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e157); } + if (peg$silentFails === 0) { peg$fail(peg$e159); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 12); - if (s1.toLowerCase() === peg$c138) { + if (s1.toLowerCase() === peg$c140) { peg$currPos += 12; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e158); } + if (peg$silentFails === 0) { peg$fail(peg$e160); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f129(); + s1 = peg$f131(); } s0 = s1; diff --git a/src/libs/SearchParser/autocompleteParser.peggy b/src/libs/SearchParser/autocompleteParser.peggy index fe0bb9159338..750d579f0e6b 100644 --- a/src/libs/SearchParser/autocompleteParser.peggy +++ b/src/libs/SearchParser/autocompleteParser.peggy @@ -141,6 +141,7 @@ autocompleteKey "key" / submitterUserID / submitterPayrollID / orderDealNumbers + / approver / reportFieldDynamic / columns / limit diff --git a/src/libs/SearchParser/baseRules.peggy b/src/libs/SearchParser/baseRules.peggy index a94929211f36..d73dc1517c5f 100644 --- a/src/libs/SearchParser/baseRules.peggy +++ b/src/libs/SearchParser/baseRules.peggy @@ -99,6 +99,7 @@ title = "title"i { return "title"; } submitterUserID = "submitterUserID"i / "submitter-user-id"i { return "submitterUserID"; } submitterPayrollID = "submitterPayrollID"i / "submitter-payroll-id"i { return "submitterPayrollID"; } orderDealNumbers = "orderDealNumbers"i / "order-deal-numbers"i { return "orderDealNumbers"; } +approver = "approver"i { return "approver"; } assignee = "assignee"i { return "assignee"; } createdBy = "createdBy"i / "created-by"i { return "createdBy"; } action = "action"i { return "action"; } @@ -155,6 +156,7 @@ columnsValues / groupWeek / groupYear / groupQuarter + / groupApprover perDiem = "per-diem"i &wordBoundary { return "perDiem"; } draft = ("drafts"i / "draft"i) &wordBoundary { return "drafts"; } @@ -194,6 +196,7 @@ groupMonth = "group-month"i &wordBoundary { return "gr groupWeek = "group-week"i &wordBoundary { return "groupweek"; } groupYear = "group-year"i &wordBoundary { return "groupyear"; } groupQuarter = "group-quarter"i &wordBoundary { return "groupquarter"; } +groupApprover = "group-approver"i &wordBoundary { return "groupApprover"; } operator "operator" diff --git a/src/libs/SearchParser/searchParser.js b/src/libs/SearchParser/searchParser.js index 86ebf04b210e..e2b8bb23cdef 100644 --- a/src/libs/SearchParser/searchParser.js +++ b/src/libs/SearchParser/searchParser.js @@ -260,69 +260,71 @@ function peg$parse(input, options) { var peg$c73 = "submitter-payroll-id"; var peg$c74 = "orderdealnumbers"; var peg$c75 = "order-deal-numbers"; - var peg$c76 = "assignee"; - var peg$c77 = "createdby"; - var peg$c78 = "created-by"; - var peg$c79 = "action"; - var peg$c80 = "total"; - var peg$c81 = "has"; - var peg$c82 = "is"; - var peg$c83 = "purchaseamount"; - var peg$c84 = "purchase-amount"; - var peg$c85 = "purchasecurrency"; - var peg$c86 = "purchase-currency"; - var peg$c87 = "amountdebited"; - var peg$c88 = "amount-debited"; - var peg$c89 = "amountreimbursed"; - var peg$c90 = "amount-reimbursed"; - var peg$c91 = "columns"; - var peg$c92 = "view"; - var peg$c93 = "compare"; - var peg$c94 = "per-diem"; - var peg$c95 = "drafts"; - var peg$c96 = "draft"; - var peg$c97 = "tax"; - var peg$c98 = "policy-name"; - var peg$c99 = "long-report-id"; - var peg$c100 = "exported-to"; - var peg$c101 = "exportedto"; - var peg$c102 = "exchange-rate"; - var peg$c103 = "reimbursable-total"; - var peg$c104 = "non-reimbursable-total"; - var peg$c105 = "group-from"; - var peg$c106 = "group-expenses"; - var peg$c107 = "group-total"; - var peg$c108 = "group-card"; - var peg$c109 = "group-feed"; - var peg$c110 = "group-bank-account"; - var peg$c111 = "group-withdrawn"; - var peg$c112 = "group-withdrawal-id"; - var peg$c113 = "group-amount-debited"; - var peg$c114 = "group-amount-reimbursed"; - var peg$c115 = "group-category"; - var peg$c116 = "group-tag"; - var peg$c117 = "group-merchant"; - var peg$c118 = "group-day"; - var peg$c119 = "group-month"; - var peg$c120 = "group-week"; - var peg$c121 = "group-year"; - var peg$c122 = "group-quarter"; - var peg$c123 = "*:"; - var peg$c124 = "!="; - var peg$c125 = ">="; - var peg$c126 = ">"; - var peg$c127 = "<="; - var peg$c128 = "<"; - var peg$c129 = "\\"; - var peg$c130 = "\u201C"; - var peg$c131 = "\u201D"; - var peg$c132 = "\""; - var peg$c133 = "footercount"; - var peg$c134 = "footer-count"; - var peg$c135 = "footercurrency"; - var peg$c136 = "footer-currency"; - var peg$c137 = "footertotal"; - var peg$c138 = "footer-total"; + var peg$c76 = "approver"; + var peg$c77 = "assignee"; + var peg$c78 = "createdby"; + var peg$c79 = "created-by"; + var peg$c80 = "action"; + var peg$c81 = "total"; + var peg$c82 = "has"; + var peg$c83 = "is"; + var peg$c84 = "purchaseamount"; + var peg$c85 = "purchase-amount"; + var peg$c86 = "purchasecurrency"; + var peg$c87 = "purchase-currency"; + var peg$c88 = "amountdebited"; + var peg$c89 = "amount-debited"; + var peg$c90 = "amountreimbursed"; + var peg$c91 = "amount-reimbursed"; + var peg$c92 = "columns"; + var peg$c93 = "view"; + var peg$c94 = "compare"; + var peg$c95 = "per-diem"; + var peg$c96 = "drafts"; + var peg$c97 = "draft"; + var peg$c98 = "tax"; + var peg$c99 = "policy-name"; + var peg$c100 = "long-report-id"; + var peg$c101 = "exported-to"; + var peg$c102 = "exportedto"; + var peg$c103 = "exchange-rate"; + var peg$c104 = "reimbursable-total"; + var peg$c105 = "non-reimbursable-total"; + var peg$c106 = "group-from"; + var peg$c107 = "group-expenses"; + var peg$c108 = "group-total"; + var peg$c109 = "group-card"; + var peg$c110 = "group-feed"; + var peg$c111 = "group-bank-account"; + var peg$c112 = "group-withdrawn"; + var peg$c113 = "group-withdrawal-id"; + var peg$c114 = "group-amount-debited"; + var peg$c115 = "group-amount-reimbursed"; + var peg$c116 = "group-category"; + var peg$c117 = "group-tag"; + var peg$c118 = "group-merchant"; + var peg$c119 = "group-day"; + var peg$c120 = "group-month"; + var peg$c121 = "group-week"; + var peg$c122 = "group-year"; + var peg$c123 = "group-quarter"; + var peg$c124 = "group-approver"; + var peg$c125 = "*:"; + var peg$c126 = "!="; + var peg$c127 = ">="; + var peg$c128 = ">"; + var peg$c129 = "<="; + var peg$c130 = "<"; + var peg$c131 = "\\"; + var peg$c132 = "\u201C"; + var peg$c133 = "\u201D"; + var peg$c134 = "\""; + var peg$c135 = "footercount"; + var peg$c136 = "footer-count"; + var peg$c137 = "footercurrency"; + var peg$c138 = "footer-currency"; + var peg$c139 = "footertotal"; + var peg$c140 = "footer-total"; var peg$r0 = /^[^ \t\r\n\xA0]/; var peg$r1 = /^[ \t\r\n\xA0,:=<>!]/; @@ -421,86 +423,88 @@ function peg$parse(input, options) { var peg$e78 = peg$literalExpectation("submitter-payroll-id", true); var peg$e79 = peg$literalExpectation("orderDealNumbers", true); var peg$e80 = peg$literalExpectation("order-deal-numbers", true); - var peg$e81 = peg$literalExpectation("assignee", true); - var peg$e82 = peg$literalExpectation("createdBy", true); - var peg$e83 = peg$literalExpectation("created-by", true); - var peg$e84 = peg$literalExpectation("action", true); - var peg$e85 = peg$literalExpectation("total", true); - var peg$e86 = peg$literalExpectation("has", true); - var peg$e87 = peg$literalExpectation("is", true); - var peg$e88 = peg$literalExpectation("purchaseAmount", true); - var peg$e89 = peg$literalExpectation("purchase-amount", true); - var peg$e90 = peg$literalExpectation("purchaseCurrency", true); - var peg$e91 = peg$literalExpectation("purchase-currency", true); - var peg$e92 = peg$literalExpectation("amountDebited", true); - var peg$e93 = peg$literalExpectation("amount-debited", true); - var peg$e94 = peg$literalExpectation("amountReimbursed", true); - var peg$e95 = peg$literalExpectation("amount-reimbursed", true); - var peg$e96 = peg$literalExpectation("columns", true); - var peg$e97 = peg$literalExpectation("view", true); - var peg$e98 = peg$literalExpectation("compare", true); - var peg$e99 = peg$literalExpectation("per-diem", true); - var peg$e100 = peg$literalExpectation("drafts", true); - var peg$e101 = peg$literalExpectation("draft", true); - var peg$e102 = peg$literalExpectation("tax", true); - var peg$e103 = peg$literalExpectation("policy-name", true); - var peg$e104 = peg$literalExpectation("long-report-id", true); - var peg$e105 = peg$literalExpectation("exported-to", true); - var peg$e106 = peg$classExpectation([":", "="], false, false); - var peg$e107 = peg$literalExpectation("exportedTo", true); - var peg$e108 = peg$literalExpectation("exchange-rate", true); - var peg$e109 = peg$literalExpectation("reimbursable-total", true); - var peg$e110 = peg$literalExpectation("non-reimbursable-total", true); - var peg$e111 = peg$literalExpectation("group-from", true); - var peg$e112 = peg$literalExpectation("group-expenses", true); - var peg$e113 = peg$literalExpectation("group-total", true); - var peg$e114 = peg$literalExpectation("group-card", true); - var peg$e115 = peg$literalExpectation("group-feed", true); - var peg$e116 = peg$literalExpectation("group-bank-account", true); - var peg$e117 = peg$literalExpectation("group-withdrawn", true); - var peg$e118 = peg$literalExpectation("group-withdrawal-id", true); - var peg$e119 = peg$literalExpectation("group-amount-debited", true); - var peg$e120 = peg$literalExpectation("group-amount-reimbursed", true); - var peg$e121 = peg$literalExpectation("group-category", true); - var peg$e122 = peg$literalExpectation("group-tag", true); - var peg$e123 = peg$literalExpectation("group-merchant", true); - var peg$e124 = peg$literalExpectation("group-day", true); - var peg$e125 = peg$literalExpectation("group-month", true); - var peg$e126 = peg$literalExpectation("group-week", true); - var peg$e127 = peg$literalExpectation("group-year", true); - var peg$e128 = peg$literalExpectation("group-quarter", true); - var peg$e129 = peg$otherExpectation("operator"); - var peg$e130 = peg$literalExpectation("*:", false); - var peg$e131 = peg$literalExpectation("!=", false); - var peg$e132 = peg$literalExpectation(">=", false); - var peg$e133 = peg$literalExpectation(">", false); - var peg$e134 = peg$literalExpectation("<=", false); - var peg$e135 = peg$literalExpectation("<", false); - var peg$e136 = peg$literalExpectation("\\", false); - var peg$e137 = peg$classExpectation([",", "\"", "\u201D", "\u201C", "\\"], false, false); - var peg$e138 = peg$otherExpectation("word"); - var peg$e139 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e140 = peg$otherExpectation("whitespace"); - var peg$e141 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); - var peg$e142 = peg$otherExpectation("quote"); - var peg$e143 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); - var peg$e144 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); - var peg$e145 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); - var peg$e146 = peg$literalExpectation("\u201C", false); - var peg$e147 = peg$literalExpectation("\u201D", false); - var peg$e148 = peg$literalExpectation("\"", false); - var peg$e149 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e150 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); - var peg$e151 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); - var peg$e152 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); - var peg$e153 = peg$classExpectation([","], false, false); - var peg$e154 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false); - var peg$e155 = peg$literalExpectation("footerCount", true); - var peg$e156 = peg$literalExpectation("footer-count", true); - var peg$e157 = peg$literalExpectation("footerCurrency", true); - var peg$e158 = peg$literalExpectation("footer-currency", true); - var peg$e159 = peg$literalExpectation("footerTotal", true); - var peg$e160 = peg$literalExpectation("footer-total", true); + var peg$e81 = peg$literalExpectation("approver", true); + var peg$e82 = peg$literalExpectation("assignee", true); + var peg$e83 = peg$literalExpectation("createdBy", true); + var peg$e84 = peg$literalExpectation("created-by", true); + var peg$e85 = peg$literalExpectation("action", true); + var peg$e86 = peg$literalExpectation("total", true); + var peg$e87 = peg$literalExpectation("has", true); + var peg$e88 = peg$literalExpectation("is", true); + var peg$e89 = peg$literalExpectation("purchaseAmount", true); + var peg$e90 = peg$literalExpectation("purchase-amount", true); + var peg$e91 = peg$literalExpectation("purchaseCurrency", true); + var peg$e92 = peg$literalExpectation("purchase-currency", true); + var peg$e93 = peg$literalExpectation("amountDebited", true); + var peg$e94 = peg$literalExpectation("amount-debited", true); + var peg$e95 = peg$literalExpectation("amountReimbursed", true); + var peg$e96 = peg$literalExpectation("amount-reimbursed", true); + var peg$e97 = peg$literalExpectation("columns", true); + var peg$e98 = peg$literalExpectation("view", true); + var peg$e99 = peg$literalExpectation("compare", true); + var peg$e100 = peg$literalExpectation("per-diem", true); + var peg$e101 = peg$literalExpectation("drafts", true); + var peg$e102 = peg$literalExpectation("draft", true); + var peg$e103 = peg$literalExpectation("tax", true); + var peg$e104 = peg$literalExpectation("policy-name", true); + var peg$e105 = peg$literalExpectation("long-report-id", true); + var peg$e106 = peg$literalExpectation("exported-to", true); + var peg$e107 = peg$classExpectation([":", "="], false, false); + var peg$e108 = peg$literalExpectation("exportedTo", true); + var peg$e109 = peg$literalExpectation("exchange-rate", true); + var peg$e110 = peg$literalExpectation("reimbursable-total", true); + var peg$e111 = peg$literalExpectation("non-reimbursable-total", true); + var peg$e112 = peg$literalExpectation("group-from", true); + var peg$e113 = peg$literalExpectation("group-expenses", true); + var peg$e114 = peg$literalExpectation("group-total", true); + var peg$e115 = peg$literalExpectation("group-card", true); + var peg$e116 = peg$literalExpectation("group-feed", true); + var peg$e117 = peg$literalExpectation("group-bank-account", true); + var peg$e118 = peg$literalExpectation("group-withdrawn", true); + var peg$e119 = peg$literalExpectation("group-withdrawal-id", true); + var peg$e120 = peg$literalExpectation("group-amount-debited", true); + var peg$e121 = peg$literalExpectation("group-amount-reimbursed", true); + var peg$e122 = peg$literalExpectation("group-category", true); + var peg$e123 = peg$literalExpectation("group-tag", true); + var peg$e124 = peg$literalExpectation("group-merchant", true); + var peg$e125 = peg$literalExpectation("group-day", true); + var peg$e126 = peg$literalExpectation("group-month", true); + var peg$e127 = peg$literalExpectation("group-week", true); + var peg$e128 = peg$literalExpectation("group-year", true); + var peg$e129 = peg$literalExpectation("group-quarter", true); + var peg$e130 = peg$literalExpectation("group-approver", true); + var peg$e131 = peg$otherExpectation("operator"); + var peg$e132 = peg$literalExpectation("*:", false); + var peg$e133 = peg$literalExpectation("!=", false); + var peg$e134 = peg$literalExpectation(">=", false); + var peg$e135 = peg$literalExpectation(">", false); + var peg$e136 = peg$literalExpectation("<=", false); + var peg$e137 = peg$literalExpectation("<", false); + var peg$e138 = peg$literalExpectation("\\", false); + var peg$e139 = peg$classExpectation([",", "\"", "\u201D", "\u201C", "\\"], false, false); + var peg$e140 = peg$otherExpectation("word"); + var peg$e141 = peg$classExpectation([" ", ",", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e142 = peg$otherExpectation("whitespace"); + var peg$e143 = peg$classExpectation([" ", "\t", "\r", "\n", "\xA0"], false, false); + var peg$e144 = peg$otherExpectation("quote"); + var peg$e145 = peg$classExpectation([" ", ",", "\"", "\u201D", "\u201C", "\t", "\n", "\r", "\xA0"], true, false); + var peg$e146 = peg$classExpectation(["\"", ["\u201C", "\u201D"]], false, false); + var peg$e147 = peg$classExpectation(["\"", "\u201D", "\u201C", "\r", "\n"], true, false); + var peg$e148 = peg$literalExpectation("\u201C", false); + var peg$e149 = peg$literalExpectation("\u201D", false); + var peg$e150 = peg$literalExpectation("\"", false); + var peg$e151 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e152 = peg$classExpectation([["a", "z"], ["A", "Z"], ["0", "9"]], false, false); + var peg$e153 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0"], false, false); + var peg$e154 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ["a", "z"], ["A", "Z"]], false, false); + var peg$e155 = peg$classExpectation([","], false, false); + var peg$e156 = peg$classExpectation([" ", "\t", "\n", "\r", "\xA0", ","], false, false); + var peg$e157 = peg$literalExpectation("footerCount", true); + var peg$e158 = peg$literalExpectation("footer-count", true); + var peg$e159 = peg$literalExpectation("footerCurrency", true); + var peg$e160 = peg$literalExpectation("footer-currency", true); + var peg$e161 = peg$literalExpectation("footerTotal", true); + var peg$e162 = peg$literalExpectation("footer-total", true); var peg$f0 = function(filters) { return applyDefaults(filters); }; var peg$f1 = function(head, tail) { @@ -654,92 +658,94 @@ function peg$parse(input, options) { var peg$f58 = function() { return "submitterUserID"; }; var peg$f59 = function() { return "submitterPayrollID"; }; var peg$f60 = function() { return "orderDealNumbers"; }; - var peg$f61 = function() { return "assignee"; }; - var peg$f62 = function() { return "createdBy"; }; - var peg$f63 = function() { return "action"; }; - var peg$f64 = function() {return "total"; }; - var peg$f65 = function() {return "has"; }; - var peg$f66 = function() {return "is"; }; - var peg$f67 = function() {return "purchaseAmount"}; - var peg$f68 = function() {return "purchaseCurrency"}; - var peg$f69 = function() {return "amountDebited"}; - var peg$f70 = function() {return "amountReimbursed"}; - var peg$f71 = function() { + var peg$f61 = function() { return "approver"; }; + var peg$f62 = function() { return "assignee"; }; + var peg$f63 = function() { return "createdBy"; }; + var peg$f64 = function() { return "action"; }; + var peg$f65 = function() {return "total"; }; + var peg$f66 = function() {return "has"; }; + var peg$f67 = function() {return "is"; }; + var peg$f68 = function() {return "purchaseAmount"}; + var peg$f69 = function() {return "purchaseCurrency"}; + var peg$f70 = function() {return "amountDebited"}; + var peg$f71 = function() {return "amountReimbursed"}; + var peg$f72 = function() { isColumnsContext = true; return "columns"; }; - var peg$f72 = function() {return "view"}; - var peg$f73 = function() {return "compare"}; - var peg$f74 = function() { return isColumnsContext; }; - var peg$f75 = function() { return "perDiem"; }; - var peg$f76 = function() { return "drafts"; }; - var peg$f77 = function() { return "originalamount"; }; - var peg$f78 = function() { return "taxAmount"; }; - var peg$f79 = function() { return "taxrate"; }; - var peg$f80 = function() { return "policyname"; }; - var peg$f81 = function() { return "withdrawalID"; }; - var peg$f82 = function() { return "bankAccount"; }; - var peg$f83 = function() { return "reportID"; }; - var peg$f84 = function() { return "base62ReportID"; }; - var peg$f85 = function() { return "exportedto"; }; - var peg$f86 = function() { return "exportedTo"; }; + var peg$f73 = function() {return "view"}; + var peg$f74 = function() {return "compare"}; + var peg$f75 = function() { return isColumnsContext; }; + var peg$f76 = function() { return "perDiem"; }; + var peg$f77 = function() { return "drafts"; }; + var peg$f78 = function() { return "originalamount"; }; + var peg$f79 = function() { return "taxAmount"; }; + var peg$f80 = function() { return "taxrate"; }; + var peg$f81 = function() { return "policyname"; }; + var peg$f82 = function() { return "withdrawalID"; }; + var peg$f83 = function() { return "bankAccount"; }; + var peg$f84 = function() { return "reportID"; }; + var peg$f85 = function() { return "base62ReportID"; }; + var peg$f86 = function() { return "exportedto"; }; var peg$f87 = function() { return "exportedTo"; }; - var peg$f88 = function() { return "exchangeRate"; }; - var peg$f89 = function() { return "reimbursableTotal"; }; - var peg$f90 = function() { return "nonReimbursableTotal"; }; - var peg$f91 = function() { return "groupFrom"; }; - var peg$f92 = function() { return "groupExpenses"; }; - var peg$f93 = function() { return "groupTotal"; }; - var peg$f94 = function() { return "groupCard"; }; - var peg$f95 = function() { return "groupFeed"; }; - var peg$f96 = function() { return "groupBankAccount"; }; - var peg$f97 = function() { return "groupWithdrawn"; }; - var peg$f98 = function() { return "groupWithdrawalID"; }; - var peg$f99 = function() { return "groupAmountDebited"; }; - var peg$f100 = function() { return "groupAmountReimbursed"; }; - var peg$f101 = function() { return "amountDebited"; }; - var peg$f102 = function() { return "amountReimbursed"; }; - var peg$f103 = function() { return "groupCategory"; }; - var peg$f104 = function() { return "groupTag"; }; - var peg$f105 = function() { return "groupMerchant"; }; - var peg$f106 = function() { return "groupday"; }; - var peg$f107 = function() { return "groupmonth"; }; - var peg$f108 = function() { return "groupweek"; }; - var peg$f109 = function() { return "groupyear"; }; - var peg$f110 = function() { return "groupquarter"; }; - var peg$f111 = function() { return "contains"; }; - var peg$f112 = function() { return "eq"; }; - var peg$f113 = function() { return "neq"; }; - var peg$f114 = function() { return "gte"; }; - var peg$f115 = function() { return "gt"; }; - var peg$f116 = function() { return "lte"; }; - var peg$f117 = function() { return "lt"; }; - var peg$f118 = function(o) { + var peg$f88 = function() { return "exportedTo"; }; + var peg$f89 = function() { return "exchangeRate"; }; + var peg$f90 = function() { return "reimbursableTotal"; }; + var peg$f91 = function() { return "nonReimbursableTotal"; }; + var peg$f92 = function() { return "groupFrom"; }; + var peg$f93 = function() { return "groupExpenses"; }; + var peg$f94 = function() { return "groupTotal"; }; + var peg$f95 = function() { return "groupCard"; }; + var peg$f96 = function() { return "groupFeed"; }; + var peg$f97 = function() { return "groupBankAccount"; }; + var peg$f98 = function() { return "groupWithdrawn"; }; + var peg$f99 = function() { return "groupWithdrawalID"; }; + var peg$f100 = function() { return "groupAmountDebited"; }; + var peg$f101 = function() { return "groupAmountReimbursed"; }; + var peg$f102 = function() { return "amountDebited"; }; + var peg$f103 = function() { return "amountReimbursed"; }; + var peg$f104 = function() { return "groupCategory"; }; + var peg$f105 = function() { return "groupTag"; }; + var peg$f106 = function() { return "groupMerchant"; }; + var peg$f107 = function() { return "groupday"; }; + var peg$f108 = function() { return "groupmonth"; }; + var peg$f109 = function() { return "groupweek"; }; + var peg$f110 = function() { return "groupyear"; }; + var peg$f111 = function() { return "groupquarter"; }; + var peg$f112 = function() { return "groupApprover"; }; + var peg$f113 = function() { return "contains"; }; + var peg$f114 = function() { return "eq"; }; + var peg$f115 = function() { return "neq"; }; + var peg$f116 = function() { return "gte"; }; + var peg$f117 = function() { return "gt"; }; + var peg$f118 = function() { return "lte"; }; + var peg$f119 = function() { return "lt"; }; + var peg$f120 = function(o) { if (nameOperator) { expectingNestedQuote = (o === "eq" || o === "contains"); } isColumnsContext = false; return o; }; - var peg$f119 = function(c) { return c; }; - var peg$f120 = function(chars) { return chars.join("").trim(); }; - var peg$f121 = function() { + var peg$f121 = function(c) { return c; }; + var peg$f122 = function(chars) { return chars.join("").trim(); }; + var peg$f123 = function() { isColumnsContext = false; return "and"; }; - var peg$f122 = function() { return expectingNestedQuote; }; - var peg$f123 = function(start, inner, end) { //handle no-breaking space + var peg$f124 = function() { return expectingNestedQuote; }; + var peg$f125 = function(start, inner, end) { //handle no-breaking space return [...start, '"', ...inner, '"', ...end].join(""); }; - var peg$f124 = function(start) {return "“"}; - var peg$f125 = function(start) {return "”"}; - var peg$f126 = function(start) {return "\""}; - var peg$f127 = function(start, inner, end) { + var peg$f126 = function(start) {return "“"}; + var peg$f127 = function(start) {return "”"}; + var peg$f128 = function(start) {return "\""}; + var peg$f129 = function(start, inner, end) { return [...start, '"', ...inner, '"'].join(""); }; - var peg$f128 = function() { return "footerCount"; }; - var peg$f129 = function() { return "footerCurrency"; }; - var peg$f130 = function() { return "footerTotal"; }; + var peg$f130 = function() { return "footerCount"; }; + var peg$f131 = function() { return "footerCurrency"; }; + var peg$f132 = function() { return "footerTotal"; }; var peg$currPos = options.peg$currPos | 0; var peg$savedPos = peg$currPos; var peg$posDetailsCache = [{ line: 1, column: 1 }]; @@ -1327,39 +1333,42 @@ function peg$parse(input, options) { if (s1 === peg$FAILED) { s1 = peg$parseorderDealNumbers(); if (s1 === peg$FAILED) { - s1 = peg$parseassignee(); + s1 = peg$parseapprover(); 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$parsedeclined(); + s1 = peg$parsebillable(); if (s1 === peg$FAILED) { - s1 = peg$parseheld(); + s1 = peg$parsedeclined(); if (s1 === peg$FAILED) { - s1 = peg$parseaction(); + s1 = peg$parseheld(); if (s1 === peg$FAILED) { - s1 = peg$parsehas(); + s1 = peg$parseaction(); if (s1 === peg$FAILED) { - s1 = peg$parseis(); + s1 = peg$parsehas(); if (s1 === peg$FAILED) { - s1 = peg$parsepurchaseCurrency(); + s1 = peg$parseis(); if (s1 === peg$FAILED) { - s1 = peg$parsepurchaseAmount(); + s1 = peg$parsepurchaseCurrency(); if (s1 === peg$FAILED) { - s1 = peg$parsepolicyID(); + s1 = peg$parsepurchaseAmount(); if (s1 === peg$FAILED) { - s1 = peg$parsestatus(); + s1 = peg$parsepolicyID(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterCount(); + s1 = peg$parsestatus(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterCurrency(); + s1 = peg$parsefooterCount(); if (s1 === peg$FAILED) { - s1 = peg$parsefooterTotal(); + s1 = peg$parsefooterCurrency(); if (s1 === peg$FAILED) { - s1 = peg$parsereportFieldDynamic(); + s1 = peg$parsefooterTotal(); + if (s1 === peg$FAILED) { + s1 = peg$parsereportFieldDynamic(); + } } } } @@ -2829,7 +2838,7 @@ function peg$parse(input, options) { return s0; } - function peg$parseassignee() { + function peg$parseapprover() { var s0, s1; s0 = peg$currPos; @@ -2849,28 +2858,48 @@ function peg$parse(input, options) { return s0; } + function peg$parseassignee() { + var s0, s1; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 8); + if (s1.toLowerCase() === peg$c77) { + peg$currPos += 8; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e82); } + } + if (s1 !== peg$FAILED) { + peg$savedPos = s0; + s1 = peg$f62(); + } + s0 = s1; + + return s0; + } + function peg$parsecreatedBy() { var s0, s1; s0 = input.substr(peg$currPos, 9); - if (s0.toLowerCase() === peg$c77) { + if (s0.toLowerCase() === peg$c78) { peg$currPos += 9; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e82); } + if (peg$silentFails === 0) { peg$fail(peg$e83); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c78) { + if (s1.toLowerCase() === peg$c79) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e83); } + if (peg$silentFails === 0) { peg$fail(peg$e84); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f62(); + s1 = peg$f63(); } s0 = s1; } @@ -2883,15 +2912,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c79) { + if (s1.toLowerCase() === peg$c80) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e84); } + if (peg$silentFails === 0) { peg$fail(peg$e85); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f63(); + s1 = peg$f64(); } s0 = s1; @@ -2903,15 +2932,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c80) { + if (s1.toLowerCase() === peg$c81) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e85); } + if (peg$silentFails === 0) { peg$fail(peg$e86); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f64(); + s1 = peg$f65(); } s0 = s1; @@ -2923,15 +2952,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 3); - if (s1.toLowerCase() === peg$c81) { + if (s1.toLowerCase() === peg$c82) { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e86); } + if (peg$silentFails === 0) { peg$fail(peg$e87); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f65(); + s1 = peg$f66(); } s0 = s1; @@ -2943,15 +2972,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 2); - if (s1.toLowerCase() === peg$c82) { + if (s1.toLowerCase() === peg$c83) { peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e87); } + if (peg$silentFails === 0) { peg$fail(peg$e88); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f66(); + s1 = peg$f67(); } s0 = s1; @@ -2962,24 +2991,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 14); - if (s0.toLowerCase() === peg$c83) { + if (s0.toLowerCase() === peg$c84) { peg$currPos += 14; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e88); } + if (peg$silentFails === 0) { peg$fail(peg$e89); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c84) { + if (s1.toLowerCase() === peg$c85) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e89); } + if (peg$silentFails === 0) { peg$fail(peg$e90); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f67(); + s1 = peg$f68(); } s0 = s1; } @@ -2991,24 +3020,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c85) { + if (s0.toLowerCase() === peg$c86) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e90); } + if (peg$silentFails === 0) { peg$fail(peg$e91); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c86) { + if (s1.toLowerCase() === peg$c87) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e91); } + if (peg$silentFails === 0) { peg$fail(peg$e92); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f68(); + s1 = peg$f69(); } s0 = s1; } @@ -3020,24 +3049,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 13); - if (s0.toLowerCase() === peg$c87) { + if (s0.toLowerCase() === peg$c88) { peg$currPos += 13; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e92); } + if (peg$silentFails === 0) { peg$fail(peg$e93); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c88) { + if (s1.toLowerCase() === peg$c89) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e93); } + if (peg$silentFails === 0) { peg$fail(peg$e94); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f69(); + s1 = peg$f70(); } s0 = s1; } @@ -3049,24 +3078,24 @@ function peg$parse(input, options) { var s0, s1; s0 = input.substr(peg$currPos, 16); - if (s0.toLowerCase() === peg$c89) { + if (s0.toLowerCase() === peg$c90) { peg$currPos += 16; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e94); } + if (peg$silentFails === 0) { peg$fail(peg$e95); } } if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c90) { + if (s1.toLowerCase() === peg$c91) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e95); } + if (peg$silentFails === 0) { peg$fail(peg$e96); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f70(); + s1 = peg$f71(); } s0 = s1; } @@ -3079,15 +3108,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 7); - if (s1.toLowerCase() === peg$c91) { + if (s1.toLowerCase() === peg$c92) { peg$currPos += 7; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e96); } + if (peg$silentFails === 0) { peg$fail(peg$e97); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f71(); + s1 = peg$f72(); } s0 = s1; @@ -3099,15 +3128,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 4); - if (s1.toLowerCase() === peg$c92) { + if (s1.toLowerCase() === peg$c93) { peg$currPos += 4; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e97); } + if (peg$silentFails === 0) { peg$fail(peg$e98); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f72(); + s1 = peg$f73(); } s0 = s1; @@ -3119,15 +3148,15 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 7); - if (s1.toLowerCase() === peg$c93) { + if (s1.toLowerCase() === peg$c94) { peg$currPos += 7; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e98); } + if (peg$silentFails === 0) { peg$fail(peg$e99); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f73(); + s1 = peg$f74(); } s0 = s1; @@ -3139,7 +3168,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f74(); + s1 = peg$f75(); if (s1) { s1 = undefined; } else { @@ -3234,6 +3263,9 @@ function peg$parse(input, options) { s0 = peg$parsegroupYear(); if (s0 === peg$FAILED) { s0 = peg$parsegroupQuarter(); + if (s0 === peg$FAILED) { + s0 = peg$parsegroupApprover(); + } } } } @@ -3274,11 +3306,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 8); - if (s1.toLowerCase() === peg$c94) { + if (s1.toLowerCase() === peg$c95) { peg$currPos += 8; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e99); } + if (peg$silentFails === 0) { peg$fail(peg$e100); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3293,7 +3325,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f75(); + s0 = peg$f76(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3311,19 +3343,19 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 6); - if (s1.toLowerCase() === peg$c95) { + if (s1.toLowerCase() === peg$c96) { peg$currPos += 6; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e100); } + if (peg$silentFails === 0) { peg$fail(peg$e101); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 5); - if (s1.toLowerCase() === peg$c96) { + if (s1.toLowerCase() === peg$c97) { peg$currPos += 5; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e101); } + if (peg$silentFails === 0) { peg$fail(peg$e102); } } } if (s1 !== peg$FAILED) { @@ -3339,7 +3371,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f76(); + s0 = peg$f77(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3357,11 +3389,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c84) { + if (s1.toLowerCase() === peg$c85) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e89); } + if (peg$silentFails === 0) { peg$fail(peg$e90); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3376,7 +3408,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f77(); + s0 = peg$f78(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3394,11 +3426,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 3); - if (s1.toLowerCase() === peg$c97) { + if (s1.toLowerCase() === peg$c98) { peg$currPos += 3; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e102); } + if (peg$silentFails === 0) { peg$fail(peg$e103); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3413,7 +3445,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f78(); + s0 = peg$f79(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3450,7 +3482,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f79(); + s0 = peg$f80(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3468,11 +3500,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c98) { + if (s1.toLowerCase() === peg$c99) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e103); } + if (peg$silentFails === 0) { peg$fail(peg$e104); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3487,7 +3519,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f80(); + s0 = peg$f81(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3524,7 +3556,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f81(); + s0 = peg$f82(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3561,7 +3593,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f82(); + s0 = peg$f83(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3579,11 +3611,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c99) { + if (s1.toLowerCase() === peg$c100) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e104); } + if (peg$silentFails === 0) { peg$fail(peg$e105); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3598,7 +3630,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f83(); + s0 = peg$f84(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3635,7 +3667,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f84(); + s0 = peg$f85(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3653,11 +3685,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c100) { + if (s1.toLowerCase() === peg$c101) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e105); } + if (peg$silentFails === 0) { peg$fail(peg$e106); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3672,7 +3704,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f85(); + s0 = peg$f86(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3697,7 +3729,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e106); } + if (peg$silentFails === 0) { peg$fail(peg$e107); } } if (s2 !== peg$FAILED) { s1 = [s1, s2]; @@ -3716,11 +3748,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c101) { + if (s1.toLowerCase() === peg$c102) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e107); } + if (peg$silentFails === 0) { peg$fail(peg$e108); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3735,7 +3767,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f86(); + s0 = peg$f87(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3747,11 +3779,11 @@ function peg$parse(input, options) { if (s0 === peg$FAILED) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c100) { + if (s1.toLowerCase() === peg$c101) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e105); } + if (peg$silentFails === 0) { peg$fail(peg$e106); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3766,7 +3798,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f87(); + s0 = peg$f88(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3785,11 +3817,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 13); - if (s1.toLowerCase() === peg$c102) { + if (s1.toLowerCase() === peg$c103) { peg$currPos += 13; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e108); } + if (peg$silentFails === 0) { peg$fail(peg$e109); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3804,7 +3836,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f88(); + s0 = peg$f89(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3822,11 +3854,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 18); - if (s1.toLowerCase() === peg$c103) { + if (s1.toLowerCase() === peg$c104) { peg$currPos += 18; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e109); } + if (peg$silentFails === 0) { peg$fail(peg$e110); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3841,7 +3873,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f89(); + s0 = peg$f90(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3859,11 +3891,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 22); - if (s1.toLowerCase() === peg$c104) { + if (s1.toLowerCase() === peg$c105) { peg$currPos += 22; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e110); } + if (peg$silentFails === 0) { peg$fail(peg$e111); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3878,7 +3910,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f90(); + s0 = peg$f91(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3896,11 +3928,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c105) { + if (s1.toLowerCase() === peg$c106) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e111); } + if (peg$silentFails === 0) { peg$fail(peg$e112); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3915,7 +3947,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f91(); + s0 = peg$f92(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3933,11 +3965,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c106) { + if (s1.toLowerCase() === peg$c107) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e112); } + if (peg$silentFails === 0) { peg$fail(peg$e113); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3952,7 +3984,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f92(); + s0 = peg$f93(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -3970,11 +4002,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c107) { + if (s1.toLowerCase() === peg$c108) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e113); } + if (peg$silentFails === 0) { peg$fail(peg$e114); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -3989,7 +4021,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f93(); + s0 = peg$f94(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4007,11 +4039,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c108) { + if (s1.toLowerCase() === peg$c109) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e114); } + if (peg$silentFails === 0) { peg$fail(peg$e115); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4026,7 +4058,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f94(); + s0 = peg$f95(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4044,11 +4076,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c109) { + if (s1.toLowerCase() === peg$c110) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e115); } + if (peg$silentFails === 0) { peg$fail(peg$e116); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4063,7 +4095,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f95(); + s0 = peg$f96(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4081,11 +4113,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 18); - if (s1.toLowerCase() === peg$c110) { + if (s1.toLowerCase() === peg$c111) { peg$currPos += 18; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e116); } + if (peg$silentFails === 0) { peg$fail(peg$e117); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4100,7 +4132,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f96(); + s0 = peg$f97(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4118,11 +4150,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c111) { + if (s1.toLowerCase() === peg$c112) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e117); } + if (peg$silentFails === 0) { peg$fail(peg$e118); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4137,7 +4169,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f97(); + s0 = peg$f98(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4155,11 +4187,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 19); - if (s1.toLowerCase() === peg$c112) { + if (s1.toLowerCase() === peg$c113) { peg$currPos += 19; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e118); } + if (peg$silentFails === 0) { peg$fail(peg$e119); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4174,7 +4206,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f98(); + s0 = peg$f99(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4192,11 +4224,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 20); - if (s1.toLowerCase() === peg$c113) { + if (s1.toLowerCase() === peg$c114) { peg$currPos += 20; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e119); } + if (peg$silentFails === 0) { peg$fail(peg$e120); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4211,7 +4243,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f99(); + s0 = peg$f100(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4229,11 +4261,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 23); - if (s1.toLowerCase() === peg$c114) { + if (s1.toLowerCase() === peg$c115) { peg$currPos += 23; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e120); } + if (peg$silentFails === 0) { peg$fail(peg$e121); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4248,7 +4280,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f100(); + s0 = peg$f101(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4266,11 +4298,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c88) { + if (s1.toLowerCase() === peg$c89) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e93); } + if (peg$silentFails === 0) { peg$fail(peg$e94); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4285,7 +4317,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f101(); + s0 = peg$f102(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4303,11 +4335,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 17); - if (s1.toLowerCase() === peg$c90) { + if (s1.toLowerCase() === peg$c91) { peg$currPos += 17; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e95); } + if (peg$silentFails === 0) { peg$fail(peg$e96); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4322,7 +4354,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f102(); + s0 = peg$f103(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4340,11 +4372,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c115) { + if (s1.toLowerCase() === peg$c116) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e121); } + if (peg$silentFails === 0) { peg$fail(peg$e122); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4359,7 +4391,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f103(); + s0 = peg$f104(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4377,11 +4409,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 9); - if (s1.toLowerCase() === peg$c116) { + if (s1.toLowerCase() === peg$c117) { peg$currPos += 9; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e122); } + if (peg$silentFails === 0) { peg$fail(peg$e123); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4396,7 +4428,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f104(); + s0 = peg$f105(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4414,11 +4446,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c117) { + if (s1.toLowerCase() === peg$c118) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e123); } + if (peg$silentFails === 0) { peg$fail(peg$e124); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4433,7 +4465,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f105(); + s0 = peg$f106(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4451,11 +4483,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 9); - if (s1.toLowerCase() === peg$c118) { + if (s1.toLowerCase() === peg$c119) { peg$currPos += 9; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e124); } + if (peg$silentFails === 0) { peg$fail(peg$e125); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4470,7 +4502,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f106(); + s0 = peg$f107(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4488,11 +4520,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c119) { + if (s1.toLowerCase() === peg$c120) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e125); } + if (peg$silentFails === 0) { peg$fail(peg$e126); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4507,7 +4539,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f107(); + s0 = peg$f108(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4525,11 +4557,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c120) { + if (s1.toLowerCase() === peg$c121) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e126); } + if (peg$silentFails === 0) { peg$fail(peg$e127); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4544,7 +4576,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f108(); + s0 = peg$f109(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4562,11 +4594,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 10); - if (s1.toLowerCase() === peg$c121) { + if (s1.toLowerCase() === peg$c122) { peg$currPos += 10; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e127); } + if (peg$silentFails === 0) { peg$fail(peg$e128); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4581,7 +4613,7 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f109(); + s0 = peg$f110(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4599,11 +4631,11 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 13); - if (s1.toLowerCase() === peg$c122) { + if (s1.toLowerCase() === peg$c123) { peg$currPos += 13; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e128); } + if (peg$silentFails === 0) { peg$fail(peg$e129); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -4618,7 +4650,44 @@ function peg$parse(input, options) { } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f110(); + s0 = peg$f111(); + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + } else { + peg$currPos = s0; + s0 = peg$FAILED; + } + + return s0; + } + + function peg$parsegroupApprover() { + var s0, s1, s2, s3; + + s0 = peg$currPos; + s1 = input.substr(peg$currPos, 14); + if (s1.toLowerCase() === peg$c124) { + peg$currPos += 14; + } else { + s1 = peg$FAILED; + if (peg$silentFails === 0) { peg$fail(peg$e130); } + } + if (s1 !== peg$FAILED) { + s2 = peg$currPos; + peg$silentFails++; + s3 = peg$parsewordBoundary(); + peg$silentFails--; + if (s3 !== peg$FAILED) { + peg$currPos = s2; + s2 = undefined; + } else { + s2 = peg$FAILED; + } + if (s2 !== peg$FAILED) { + peg$savedPos = s0; + s0 = peg$f112(); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4636,16 +4705,16 @@ function peg$parse(input, options) { peg$silentFails++; s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c123) { - s1 = peg$c123; + if (input.substr(peg$currPos, 2) === peg$c125) { + s1 = peg$c125; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e130); } + if (peg$silentFails === 0) { peg$fail(peg$e132); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f111(); + s1 = peg$f113(); } s0 = s1; if (s0 === peg$FAILED) { @@ -4655,81 +4724,81 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e106); } + if (peg$silentFails === 0) { peg$fail(peg$e107); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f112(); + s1 = peg$f114(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c124) { - s1 = peg$c124; + if (input.substr(peg$currPos, 2) === peg$c126) { + s1 = peg$c126; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e131); } + if (peg$silentFails === 0) { peg$fail(peg$e133); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f113(); + s1 = peg$f115(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c125) { - s1 = peg$c125; + if (input.substr(peg$currPos, 2) === peg$c127) { + s1 = peg$c127; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e132); } + if (peg$silentFails === 0) { peg$fail(peg$e134); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f114(); + s1 = peg$f116(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 62) { - s1 = peg$c126; + s1 = peg$c128; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e133); } + if (peg$silentFails === 0) { peg$fail(peg$e135); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f115(); + s1 = peg$f117(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; - if (input.substr(peg$currPos, 2) === peg$c127) { - s1 = peg$c127; + if (input.substr(peg$currPos, 2) === peg$c129) { + s1 = peg$c129; peg$currPos += 2; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e134); } + if (peg$silentFails === 0) { peg$fail(peg$e136); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f116(); + s1 = peg$f118(); } s0 = s1; if (s0 === peg$FAILED) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 60) { - s1 = peg$c128; + s1 = peg$c130; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e135); } + if (peg$silentFails === 0) { peg$fail(peg$e137); } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f117(); + s1 = peg$f119(); } s0 = s1; } @@ -4741,7 +4810,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e129); } + if (peg$silentFails === 0) { peg$fail(peg$e131); } } return s0; @@ -4754,7 +4823,7 @@ function peg$parse(input, options) { s1 = peg$parseoperator(); if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f118(s1); + s1 = peg$f120(s1); } s0 = s1; @@ -4766,11 +4835,11 @@ function peg$parse(input, options) { s0 = peg$currPos; if (input.charCodeAt(peg$currPos) === 92) { - s1 = peg$c129; + s1 = peg$c131; peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e136); } + if (peg$silentFails === 0) { peg$fail(peg$e138); } } if (s1 !== peg$FAILED) { s2 = input.charAt(peg$currPos); @@ -4778,11 +4847,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e137); } + if (peg$silentFails === 0) { peg$fail(peg$e139); } } if (s2 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f119(s2); + s0 = peg$f121(s2); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -4808,7 +4877,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } } if (s2 !== peg$FAILED) { @@ -4821,7 +4890,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } } } @@ -4830,13 +4899,13 @@ function peg$parse(input, options) { } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f120(s1); + s1 = peg$f122(s1); } s0 = s1; peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e138); } + if (peg$silentFails === 0) { peg$fail(peg$e140); } } return s0; @@ -4848,7 +4917,7 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = peg$parse_(); peg$savedPos = s0; - s1 = peg$f121(); + s1 = peg$f123(); s0 = s1; return s0; @@ -4864,7 +4933,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } while (s1 !== peg$FAILED) { s0.push(s1); @@ -4873,12 +4942,12 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e141); } + if (peg$silentFails === 0) { peg$fail(peg$e143); } } } peg$silentFails--; s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e140); } + if (peg$silentFails === 0) { peg$fail(peg$e142); } return s0; } @@ -4888,7 +4957,7 @@ function peg$parse(input, options) { s0 = peg$currPos; peg$savedPos = peg$currPos; - s1 = peg$f122(); + s1 = peg$f124(); if (s1) { s1 = undefined; } else { @@ -4925,7 +4994,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -4934,7 +5003,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } } s2 = input.charAt(peg$currPos); @@ -4942,7 +5011,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s2 !== peg$FAILED) { s3 = []; @@ -4953,7 +5022,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } } while (s4 !== peg$FAILED) { @@ -4965,7 +5034,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } } } @@ -4974,7 +5043,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s4 !== peg$FAILED) { s5 = []; @@ -4983,7 +5052,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } while (s6 !== peg$FAILED) { s5.push(s6); @@ -4992,11 +5061,11 @@ function peg$parse(input, options) { peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e139); } + if (peg$silentFails === 0) { peg$fail(peg$e141); } } } peg$savedPos = s0; - s0 = peg$f123(s1, s3, s5); + s0 = peg$f125(s1, s3, s5); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -5008,7 +5077,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } return s0; @@ -5025,7 +5094,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -5034,7 +5103,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e143); } + if (peg$silentFails === 0) { peg$fail(peg$e145); } } } s2 = input.charAt(peg$currPos); @@ -5042,7 +5111,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s2 !== peg$FAILED) { s3 = []; @@ -5053,7 +5122,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -5069,15 +5138,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c130; + s6 = peg$c132; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e146); } + if (peg$silentFails === 0) { peg$fail(peg$e148); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f124(s1); + s4 = peg$f126(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5100,15 +5169,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c131; + s6 = peg$c133; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e147); } + if (peg$silentFails === 0) { peg$fail(peg$e149); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f125(s1); + s4 = peg$f127(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5131,15 +5200,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c132; + s6 = peg$c134; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e148); } + if (peg$silentFails === 0) { peg$fail(peg$e150); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f126(s1); + s4 = peg$f128(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5161,7 +5230,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e145); } + if (peg$silentFails === 0) { peg$fail(peg$e147); } } if (s4 === peg$FAILED) { s4 = peg$currPos; @@ -5177,15 +5246,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8220) { - s6 = peg$c130; + s6 = peg$c132; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e146); } + if (peg$silentFails === 0) { peg$fail(peg$e148); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f124(s1); + s4 = peg$f126(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5208,15 +5277,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 8221) { - s6 = peg$c131; + s6 = peg$c133; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e147); } + if (peg$silentFails === 0) { peg$fail(peg$e149); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f125(s1); + s4 = peg$f127(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5239,15 +5308,15 @@ function peg$parse(input, options) { } if (s5 !== peg$FAILED) { if (input.charCodeAt(peg$currPos) === 34) { - s6 = peg$c132; + s6 = peg$c134; peg$currPos++; } else { s6 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e148); } + if (peg$silentFails === 0) { peg$fail(peg$e150); } } if (s6 !== peg$FAILED) { peg$savedPos = s4; - s4 = peg$f126(s1); + s4 = peg$f128(s1); } else { peg$currPos = s4; s4 = peg$FAILED; @@ -5264,7 +5333,7 @@ function peg$parse(input, options) { s4 = peg$parseclosingQuote(); if (s4 !== peg$FAILED) { peg$savedPos = s0; - s0 = peg$f127(s1, s3, s4); + s0 = peg$f129(s1, s3, s4); } else { peg$currPos = s0; s0 = peg$FAILED; @@ -5276,7 +5345,7 @@ function peg$parse(input, options) { peg$silentFails--; if (s0 === peg$FAILED) { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e142); } + if (peg$silentFails === 0) { peg$fail(peg$e144); } } return s0; @@ -5291,7 +5360,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e144); } + if (peg$silentFails === 0) { peg$fail(peg$e146); } } if (s1 !== peg$FAILED) { s2 = peg$currPos; @@ -5329,7 +5398,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e149); } + if (peg$silentFails === 0) { peg$fail(peg$e151); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -5338,7 +5407,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e149); } + if (peg$silentFails === 0) { peg$fail(peg$e151); } } } s2 = []; @@ -5347,7 +5416,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e150); } + if (peg$silentFails === 0) { peg$fail(peg$e152); } } while (s3 !== peg$FAILED) { s2.push(s3); @@ -5356,7 +5425,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s3 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e150); } + if (peg$silentFails === 0) { peg$fail(peg$e152); } } } s3 = []; @@ -5365,7 +5434,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e151); } + if (peg$silentFails === 0) { peg$fail(peg$e153); } } while (s4 !== peg$FAILED) { s3.push(s4); @@ -5374,7 +5443,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s4 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e151); } + if (peg$silentFails === 0) { peg$fail(peg$e153); } } } s4 = peg$parseoperator(); @@ -5393,7 +5462,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e152); } + if (peg$silentFails === 0) { peg$fail(peg$e154); } } while (s2 !== peg$FAILED) { s1.push(s2); @@ -5402,7 +5471,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s2 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e152); } + if (peg$silentFails === 0) { peg$fail(peg$e154); } } } s2 = peg$currPos; @@ -5449,7 +5518,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e153); } + if (peg$silentFails === 0) { peg$fail(peg$e155); } } } } @@ -5465,7 +5534,7 @@ function peg$parse(input, options) { peg$currPos++; } else { s0 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e154); } + if (peg$silentFails === 0) { peg$fail(peg$e156); } } if (s0 === peg$FAILED) { s0 = peg$currPos; @@ -5494,24 +5563,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c133) { + if (s1.toLowerCase() === peg$c135) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e155); } + if (peg$silentFails === 0) { peg$fail(peg$e157); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 12); - if (s1.toLowerCase() === peg$c134) { + if (s1.toLowerCase() === peg$c136) { peg$currPos += 12; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e156); } + if (peg$silentFails === 0) { peg$fail(peg$e158); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f128(); + s1 = peg$f130(); } s0 = s1; @@ -5523,24 +5592,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 14); - if (s1.toLowerCase() === peg$c135) { + if (s1.toLowerCase() === peg$c137) { peg$currPos += 14; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e157); } + if (peg$silentFails === 0) { peg$fail(peg$e159); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 15); - if (s1.toLowerCase() === peg$c136) { + if (s1.toLowerCase() === peg$c138) { peg$currPos += 15; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e158); } + if (peg$silentFails === 0) { peg$fail(peg$e160); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f129(); + s1 = peg$f131(); } s0 = s1; @@ -5552,24 +5621,24 @@ function peg$parse(input, options) { s0 = peg$currPos; s1 = input.substr(peg$currPos, 11); - if (s1.toLowerCase() === peg$c137) { + if (s1.toLowerCase() === peg$c139) { peg$currPos += 11; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e159); } + if (peg$silentFails === 0) { peg$fail(peg$e161); } } if (s1 === peg$FAILED) { s1 = input.substr(peg$currPos, 12); - if (s1.toLowerCase() === peg$c138) { + if (s1.toLowerCase() === peg$c140) { peg$currPos += 12; } else { s1 = peg$FAILED; - if (peg$silentFails === 0) { peg$fail(peg$e160); } + if (peg$silentFails === 0) { peg$fail(peg$e162); } } } if (s1 !== peg$FAILED) { peg$savedPos = s0; - s1 = peg$f130(); + s1 = peg$f132(); } s0 = s1; @@ -5589,6 +5658,7 @@ function peg$parse(input, options) { week: "groupweek", year: "groupyear", quarter: "groupquarter", + approver: "groupApprover", }; const GROUP_BY_DEFAULT_SORT_ORDER = { @@ -5603,6 +5673,7 @@ function peg$parse(input, options) { week: "desc", year: "desc", quarter: "desc", + approver: "asc", }; const DEFAULT_SORT_BY_VALUES = new Set([...Object.values(GROUP_BY_DEFAULT_SORT), "date"]); diff --git a/src/libs/SearchParser/searchParser.peggy b/src/libs/SearchParser/searchParser.peggy index 60555c6d8df2..491d439ff2b6 100644 --- a/src/libs/SearchParser/searchParser.peggy +++ b/src/libs/SearchParser/searchParser.peggy @@ -40,6 +40,7 @@ week: "groupweek", year: "groupyear", quarter: "groupquarter", + approver: "groupApprover", }; const GROUP_BY_DEFAULT_SORT_ORDER = { @@ -54,6 +55,7 @@ week: "desc", year: "desc", quarter: "desc", + approver: "asc", }; const DEFAULT_SORT_BY_VALUES = new Set([...Object.values(GROUP_BY_DEFAULT_SORT), "date"]); @@ -319,6 +321,7 @@ key "key" / submitterUserID / submitterPayrollID / orderDealNumbers + / approver / assignee / createdBy / reimbursable diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index cff07de4ac5b..5fe3bfb7e5e0 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -1536,6 +1536,7 @@ function buildQueryStringFromFilterFormValues(filterValues: Partial; type TransactionYearGroupSorting = ColumnSortMapping; type TransactionQuarterGroupSorting = ColumnSortMapping; +type TransactionApproverGroupSorting = ColumnSortMapping; type GetReportSectionsParams = { data: OnyxTypes.SearchResults['data']; @@ -475,6 +477,12 @@ const transactionQuarterGroupColumnNamesToSortingProperty: TransactionQuarterGro ...transactionGroupBaseSortingProperties, }; +const transactionApproverGroupColumnNamesToSortingProperty: TransactionApproverGroupSorting = { + [CONST.SEARCH.TABLE_COLUMNS.AVATAR]: null, + [CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER]: 'formattedApprover' as const, + ...transactionGroupBaseSortingProperties, +}; + type TaskStatusPredicate = (taskReport?: OnyxTypes.Report | SearchTask) => boolean; const taskStatusActionMapping: Record = { @@ -1000,6 +1008,10 @@ function isTransactionQuarterGroupListItemType(item: ListItem): item is Transact return isTransactionGroupListItemType(item) && 'groupedBy' in item && item.groupedBy === CONST.SEARCH.GROUP_BY.QUARTER; } +function isTransactionApproverGroupListItemType(item: ListItem): item is TransactionApproverGroupListItemType { + return isTransactionGroupListItemType(item) && 'groupedBy' in item && item.groupedBy === CONST.SEARCH.GROUP_BY.APPROVER; +} + /** * Type guard that checks if a list of search items contains grouped transaction data. * When a search has a groupBy parameter, all items share the same shape, so checking the first element is sufficient. @@ -3179,6 +3191,12 @@ function getSelectedGroupFilterEntry(groupBy: string, groupData: unknown): {key: switch (groupBy) { case CONST.SEARCH.GROUP_BY.FROM: return {key: CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, value: (groupData as SearchMemberGroup).accountID}; + case CONST.SEARCH.GROUP_BY.APPROVER: { + if (!groupData || typeof groupData !== 'object' || !('accountID' in groupData) || typeof groupData.accountID !== 'number') { + return undefined; + } + return {key: CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, value: groupData.accountID}; + } case CONST.SEARCH.GROUP_BY.CARD: return {key: CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID, value: (groupData as SearchCardGroup).cardID}; case CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID: @@ -3319,6 +3337,12 @@ function getActiveGroupSearchHashes(data: OnyxTypes.SearchResults['data'] | unde } break; } + case CONST.SEARCH.GROUP_BY.APPROVER: { + if ('accountID' in group && typeof group.accountID === 'number') { + transactionsQueryJSON = buildApproverGroupQuery(queryJSON, group.accountID); + } + break; + } default: break; } @@ -3355,9 +3379,14 @@ function buildDateRangeGroupQuery(queryJSON: SearchQueryJSON, dateRange: {start: return {transactionsQueryJSON, start, end}; } +function buildApproverGroupQuery(queryJSON: SearchQueryJSON, accountID: number): SearchQueryJSON | undefined { + return buildSpecificGroupQuery(queryJSON, CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, accountID); +} + /** * @private - * Organizes data into List Sections grouped by member for display, for the TransactionGroupListItemType of Search Results. + * Organizes data into List Sections grouped by a person for display, for the TransactionGroupListItemType of Search Results: + * the submitter when grouping by from, or the approver when grouping by approver. * * Do not use directly, use only via `getSections()` facade. */ @@ -3367,25 +3396,30 @@ function getMemberSections( formatPhoneNumber: LocaleContextProps['formatPhoneNumber'], translate: LocalizedTranslate, onyxPersonalDetailsList?: OnyxTypes.PersonalDetailsList, -): [TransactionMemberGroupListItemType[], number, boolean] { - const memberSections: Record = {}; + groupBy: typeof CONST.SEARCH.GROUP_BY.FROM | typeof CONST.SEARCH.GROUP_BY.APPROVER = CONST.SEARCH.GROUP_BY.FROM, +): [Array, number, boolean] { + const memberSections: Record = {}; + const isApproverGroup = groupBy === CONST.SEARCH.GROUP_BY.APPROVER; + const filterKey = isApproverGroup ? CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER : CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM; for (const key in data) { if (isGroupEntry(key)) { const memberGroup = data[key] as SearchMemberGroup; const personalDetails = data.personalDetailsList?.[memberGroup.accountID] ?? onyxPersonalDetailsList?.[memberGroup.accountID] ?? emptyPersonalDetails; - const transactionsQueryJSON = queryJSON && memberGroup.accountID ? buildSpecificGroupQuery(queryJSON, CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, memberGroup.accountID) : undefined; - - memberSections[key] = { - groupedBy: CONST.SEARCH.GROUP_BY.FROM, + const transactionsQueryJSON = queryJSON && memberGroup.accountID ? buildSpecificGroupQuery(queryJSON, filterKey, memberGroup.accountID) : undefined; + const formattedName = temporaryGetDisplayNameOrDefault({passedPersonalDetails: personalDetails, translate, formatPhoneNumber}); + const section = { transactions: [], transactionsQueryJSON, ...personalDetails, ...memberGroup, - formattedFrom: temporaryGetDisplayNameOrDefault({passedPersonalDetails: personalDetails, translate, formatPhoneNumber}), keyForList: key, }; + + memberSections[key] = isApproverGroup + ? {...section, groupedBy: CONST.SEARCH.GROUP_BY.APPROVER, formattedApprover: formattedName} + : {...section, groupedBy: CONST.SEARCH.GROUP_BY.FROM, formattedFrom: formattedName}; } } @@ -3956,6 +3990,8 @@ function getSections({ return getYearSections(data, queryJSON); case CONST.SEARCH.GROUP_BY.QUARTER: return getQuarterSections(data, queryJSON, dateFnsLocale); + case CONST.SEARCH.GROUP_BY.APPROVER: + return getMemberSections(data, queryJSON, formatPhoneNumber, translate, onyxPersonalDetailsList, CONST.SEARCH.GROUP_BY.APPROVER); } } @@ -4016,9 +4052,12 @@ const groupBySortFunction: Record = { [CONST.SEARCH.GROUP_BY.WEEK]: createGroupSortFunction(transactionWeekGroupColumnNamesToSortingProperty, (a, b, lc) => lc(a.week, b.week)), [CONST.SEARCH.GROUP_BY.YEAR]: createGroupSortFunction(transactionYearGroupColumnNamesToSortingProperty, (a, b) => a.year - b.year), [CONST.SEARCH.GROUP_BY.QUARTER]: createGroupSortFunction(transactionQuarterGroupColumnNamesToSortingProperty, (a, b) => a.sortKey - b.sortKey), + [CONST.SEARCH.GROUP_BY.APPROVER]: createGroupSortFunction(transactionApproverGroupColumnNamesToSortingProperty, (a, b, lc) => + lc(a.formattedApprover ?? '', b.formattedApprover ?? ''), + ), }; -const groupByRequiredColumns: Partial> = { +const groupByRequiredColumns: Partial> = { [CONST.SEARCH.GROUP_BY.FROM]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM], [CONST.SEARCH.GROUP_BY.CARD]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_CARD], [CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_WITHDRAWAL_ID], @@ -4030,6 +4069,7 @@ const groupByRequiredColumns: Partial> [CONST.SEARCH.GROUP_BY.WEEK]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_WEEK], [CONST.SEARCH.GROUP_BY.YEAR]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_YEAR], [CONST.SEARCH.GROUP_BY.QUARTER]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_QUARTER], + [CONST.SEARCH.GROUP_BY.APPROVER]: [CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER], }; /** @@ -4614,6 +4654,8 @@ function getCustomColumns(value?: SearchDataTypes | SearchGroupBy): SearchCustom return Object.values(CONST.SEARCH.GROUP_CUSTOM_COLUMNS.YEAR); case CONST.SEARCH.GROUP_BY.QUARTER: return Object.values(CONST.SEARCH.GROUP_CUSTOM_COLUMNS.QUARTER); + case CONST.SEARCH.GROUP_BY.APPROVER: + return Object.values(CONST.SEARCH.GROUP_CUSTOM_COLUMNS.APPROVER); default: return []; } @@ -4655,6 +4697,8 @@ function getCustomColumnDefault(value?: SearchDataTypes | SearchGroupBy): Search return CONST.SEARCH.GROUP_DEFAULT_COLUMNS.YEAR; case CONST.SEARCH.GROUP_BY.QUARTER: return CONST.SEARCH.GROUP_DEFAULT_COLUMNS.QUARTER; + case CONST.SEARCH.GROUP_BY.APPROVER: + return CONST.SEARCH.GROUP_DEFAULT_COLUMNS.APPROVER; default: return []; } @@ -4818,6 +4862,8 @@ function getSearchColumnTranslationKey(column: SearchSortBy, type?: SearchDataTy return 'common.year'; case CONST.SEARCH.TABLE_COLUMNS.GROUP_QUARTER: return 'common.quarter'; + case CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER: + return 'search.filters.groupBy.approver'; case CONST.SEARCH.TABLE_COLUMNS.GROUP_WITHDRAWN: return 'search.filters.withdrawn'; case CONST.SEARCH.TABLE_COLUMNS.GROUP_FEED: @@ -5633,9 +5679,10 @@ function getGroupBySections(translate: LocalizedTranslate): GroupBySection[] { text: translate(`search.filters.groupBy.${groupBy}`), value: groupBy, }); - return [ + + const sections: Array> = [ { - options: [getOption(CONST.SEARCH.GROUP_BY.FROM), getOption(CONST.SEARCH.GROUP_BY.CARD)], + options: [getOption(CONST.SEARCH.GROUP_BY.FROM), getOption(CONST.SEARCH.GROUP_BY.CARD), getOption(CONST.SEARCH.GROUP_BY.APPROVER)], }, { options: [getOption(CONST.SEARCH.GROUP_BY.CATEGORY), getOption(CONST.SEARCH.GROUP_BY.MERCHANT), getOption(CONST.SEARCH.GROUP_BY.TAG)], @@ -5652,7 +5699,9 @@ function getGroupBySections(translate: LocalizedTranslate): GroupBySection[] { { options: [getOption(CONST.SEARCH.GROUP_BY.WITHDRAWAL_ID)], }, - ].map((section, sectionIndex) => ({ + ]; + + return sections.map((section, sectionIndex) => ({ ...section, sectionIndex, })); @@ -5980,6 +6029,10 @@ const FILTER_VIEW_MAP = { labelKey: 'common.from', icon: 'User', }, + [CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER]: { + labelKey: 'common.approver', + icon: 'UserCheck', + }, [CONST.SEARCH.SYNTAX_FILTER_KEYS.HAS]: { labelKey: 'search.has', icon: 'Paperclip', @@ -6344,6 +6397,8 @@ function getDisplayValue( if ( key === FILTER_KEYS.FROM || key === FILTER_KEYS.FROM_NOT || + key === FILTER_KEYS.APPROVER || + key === FILTER_KEYS.APPROVER_NOT || key === FILTER_KEYS.TO || key === FILTER_KEYS.TO_NOT || key === FILTER_KEYS.ATTENDEE || @@ -6947,6 +7002,7 @@ function getColumnsToShow({ [CONST.SEARCH.GROUP_BY.WEEK]: CONST.SEARCH.GROUP_CUSTOM_COLUMNS.WEEK, [CONST.SEARCH.GROUP_BY.YEAR]: CONST.SEARCH.GROUP_CUSTOM_COLUMNS.YEAR, [CONST.SEARCH.GROUP_BY.QUARTER]: CONST.SEARCH.GROUP_CUSTOM_COLUMNS.QUARTER, + [CONST.SEARCH.GROUP_BY.APPROVER]: CONST.SEARCH.GROUP_CUSTOM_COLUMNS.APPROVER, }[groupBy]; const defaultCustomColumns = { @@ -6961,6 +7017,7 @@ function getColumnsToShow({ [CONST.SEARCH.GROUP_BY.WEEK]: CONST.SEARCH.GROUP_DEFAULT_COLUMNS.WEEK, [CONST.SEARCH.GROUP_BY.YEAR]: CONST.SEARCH.GROUP_DEFAULT_COLUMNS.YEAR, [CONST.SEARCH.GROUP_BY.QUARTER]: CONST.SEARCH.GROUP_DEFAULT_COLUMNS.QUARTER, + [CONST.SEARCH.GROUP_BY.APPROVER]: CONST.SEARCH.GROUP_DEFAULT_COLUMNS.APPROVER, }[groupBy]; const filteredVisibleColumns = customColumns ? visibleColumns.filter((column) => Object.values(customColumns).includes(column as ValueOf)) : []; @@ -7749,6 +7806,9 @@ function isTransactionMatchWithGroupItem(transaction: OnyxTypes.Transaction, gro const transactionQuarter = Math.floor((transactionMonth - 1) / 3) + 1; return transactionYear === quarterGroup.year && transactionQuarter === quarterGroup.quarter; } + if (groupBy === CONST.SEARCH.GROUP_BY.APPROVER) { + return !!transaction.transactionID; + } return false; } @@ -7776,6 +7836,7 @@ export { isTransactionWeekGroupListItemType, isTransactionYearGroupListItemType, isTransactionQuarterGroupListItemType, + isTransactionApproverGroupListItemType, isGroupedItemArray, isGroupEntry, isReportEntry, @@ -7841,6 +7902,7 @@ export { getCustomColumns, getCustomColumnDefault, filterValidHasValues, + groupByRequiredColumns, navigateToSearchRHP, shouldShowDeleteOption, getToFieldValueForTransaction, diff --git a/src/pages/Search/SearchColumnsPage.tsx b/src/pages/Search/SearchColumnsPage.tsx index 9f98854b6fa0..51aa8e1a4fca 100644 --- a/src/pages/Search/SearchColumnsPage.tsx +++ b/src/pages/Search/SearchColumnsPage.tsx @@ -11,7 +11,7 @@ import useShouldReturnTripRooms from '@hooks/useShouldReturnTripRooms'; import Navigation from '@libs/Navigation/Navigation'; import {buildQueryStringFromFilterFormValues, getCurrentSearchQueryJSON, hasValuesIncludeViolationFilter} from '@libs/SearchQueryUtils'; -import {getCustomColumnDefault, getCustomColumns, getValidGroupBy, insertColumnBeforeTotalAmount, isSearchDataLoaded} from '@libs/SearchUIUtils'; +import {getCustomColumnDefault, getCustomColumns, getValidGroupBy, insertColumnBeforeTotalAmount, isSearchDataLoaded, groupByRequiredColumns} from '@libs/SearchUIUtils'; import CONST from '@src/CONST'; import ONYXKEYS from '@src/ONYXKEYS'; @@ -48,21 +48,7 @@ function SearchColumnsPage() { // We need at least one element with flex1 in the table to ensure the table looks good in the UI, so we don't allow removing the total columns // since it makes sense for them to show up in an expense management App and it fixes the layout issues. - const requiredColumns = new Set([ - CONST.SEARCH.TABLE_COLUMNS.TOTAL_AMOUNT, - CONST.SEARCH.TABLE_COLUMNS.TOTAL, - CONST.SEARCH.TABLE_COLUMNS.GROUP_CARD, - CONST.SEARCH.TABLE_COLUMNS.GROUP_WITHDRAWAL_ID, - CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM, - CONST.SEARCH.TABLE_COLUMNS.GROUP_CATEGORY, - CONST.SEARCH.TABLE_COLUMNS.GROUP_MERCHANT, - CONST.SEARCH.TABLE_COLUMNS.GROUP_TAG, - CONST.SEARCH.TABLE_COLUMNS.GROUP_DAY, - CONST.SEARCH.TABLE_COLUMNS.GROUP_MONTH, - CONST.SEARCH.TABLE_COLUMNS.GROUP_WEEK, - CONST.SEARCH.TABLE_COLUMNS.GROUP_YEAR, - CONST.SEARCH.TABLE_COLUMNS.GROUP_QUARTER, - ]); + const requiredColumns = new Set([CONST.SEARCH.TABLE_COLUMNS.TOTAL_AMOUNT, CONST.SEARCH.TABLE_COLUMNS.TOTAL, ...Object.values(groupByRequiredColumns).flat()]); if (shouldRequireViolationsColumn) { requiredColumns.add(CONST.SEARCH.TABLE_COLUMNS.VIOLATIONS); diff --git a/src/pages/Search/SearchSavePage.tsx b/src/pages/Search/SearchSavePage.tsx index 7237b4cf5f57..86d3cefe31df 100644 --- a/src/pages/Search/SearchSavePage.tsx +++ b/src/pages/Search/SearchSavePage.tsx @@ -83,6 +83,7 @@ function FilterBankAccountValue({value}: FilterValueProps) { function FilterValue({filterKey, value}: FilterValueWithKeyProps) { if ( filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM || + filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TO || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.ATTENDEE || filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.ASSIGNEE || diff --git a/src/styles/utils/index.ts b/src/styles/utils/index.ts index f5a3115109bd..e1f84ef18f56 100644 --- a/src/styles/utils/index.ts +++ b/src/styles/utils/index.ts @@ -2167,6 +2167,7 @@ const createStyleUtils = (theme: ThemeColors, styles: ThemeStyles) => ({ case CONST.SEARCH.TABLE_COLUMNS.GROUP_WITHDRAWAL_ID: case CONST.SEARCH.TABLE_COLUMNS.GROUP_CARD: case CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM: + case CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER: case CONST.SEARCH.TABLE_COLUMNS.FEED: case CONST.SEARCH.TABLE_COLUMNS.BANK_ACCOUNT: case CONST.SEARCH.TABLE_COLUMNS.WITHDRAWAL_ID: diff --git a/src/types/form/SearchAdvancedFiltersForm.ts b/src/types/form/SearchAdvancedFiltersForm.ts index c1c42a6a435b..055ff06f55dd 100644 --- a/src/types/form/SearchAdvancedFiltersForm.ts +++ b/src/types/form/SearchAdvancedFiltersForm.ts @@ -58,6 +58,7 @@ const AMOUNT_FILTER_KEYS: SearchAmountFilterKeys[] = [ const NEGATABLE_FILTER_KEYS = [ CONST.SEARCH.SYNTAX_FILTER_KEYS.TO, CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY, CONST.SEARCH.SYNTAX_FILTER_KEYS.HAS, CONST.SEARCH.SYNTAX_FILTER_KEYS.CURRENCY, @@ -211,6 +212,9 @@ const FILTER_KEYS = { FROM_NOT: 'fromNot', FROM: 'from', + APPROVER_NOT: 'approverNot', + APPROVER: 'approver', + TO_NOT: 'toNot', TO: 'to', @@ -296,6 +300,8 @@ const ALLOWED_TYPE_FILTERS: Record> = { FILTER_KEYS.STATUS_NOT, FILTER_KEYS.FROM, FILTER_KEYS.FROM_NOT, + FILTER_KEYS.APPROVER, + FILTER_KEYS.APPROVER_NOT, FILTER_KEYS.TO, FILTER_KEYS.TO_NOT, FILTER_KEYS.KEYWORD, @@ -910,6 +916,9 @@ type SearchAdvancedFiltersForm = Form< [FILTER_KEYS.FROM]: string[]; [FILTER_KEYS.FROM_NOT]: string[]; + [FILTER_KEYS.APPROVER]: string[]; + [FILTER_KEYS.APPROVER_NOT]: string[]; + [FILTER_KEYS.PAYER]: string; [FILTER_KEYS.PAYER_NOT]: string; diff --git a/src/types/onyx/SearchResults.ts b/src/types/onyx/SearchResults.ts index 0e94821d27bd..8e0352140ceb 100644 --- a/src/types/onyx/SearchResults.ts +++ b/src/types/onyx/SearchResults.ts @@ -303,6 +303,12 @@ type SearchQuarterGroup = SearchGroupBase & { quarter: number; }; +/** Model of approver grouped search result */ +type SearchApproverGroup = SearchGroupBase & { + /** Account ID of the approver */ + accountID: number; +}; + /** Model of an expense in the search results */ type SearchTransaction = Transaction & { /** Whether the expense was ever rejected, only returned when the Rejected column is shown or sorted by */ @@ -339,6 +345,7 @@ type SearchResultDataType = PrefixedRecord; /** Model of search results */ @@ -377,4 +384,5 @@ export type { SearchWeekGroup, SearchYearGroup, SearchQuarterGroup, + SearchApproverGroup, }; diff --git a/tests/ui/MemberListItemHeaderTest.tsx b/tests/ui/MemberListItemHeaderTest.tsx index c7add5455a57..d7bc47ccdd56 100644 --- a/tests/ui/MemberListItemHeaderTest.tsx +++ b/tests/ui/MemberListItemHeaderTest.tsx @@ -5,7 +5,7 @@ import {CurrencyListContextProvider} from '@components/CurrencyListContextProvid import {LocaleContextProvider} from '@components/LocaleContextProvider'; import OnyxListItemProvider from '@components/OnyxListItemProvider'; import MemberListItemHeader from '@components/Search/SearchList/ListItem/MemberListItemHeader'; -import type {TransactionMemberGroupListItemType} from '@components/Search/SearchList/ListItem/types'; +import type {TransactionApproverGroupListItemType, TransactionMemberGroupListItemType} from '@components/Search/SearchList/ListItem/types'; import useResponsiveLayout from '@hooks/useResponsiveLayout'; @@ -41,7 +41,25 @@ const createMemberItem = (overrides: Partial ...overrides, }); -function renderHeader(item: TransactionMemberGroupListItemType, props: Partial[0], 'member'>> = {}) { +/** Either row the header renders: a submitter when grouping by from, an approver when grouping by approver */ +type MemberHeaderItem = Parameters[0]['member']; + +// SearchUIUtils builds the approver row the same way, from the approver's personal details. +const createApproverItem = (): TransactionApproverGroupListItemType => + createMock({ + groupedBy: CONST.SEARCH.GROUP_BY.APPROVER, + accountID: 456, + displayName: 'Jordan Lee', + login: 'jordan@example.com', + keyForList: 'group_456', + transactions: [], + count: 7, + total: 12345, + currency: 'USD', + formattedApprover: 'Jordan Lee', + }); + +function renderHeader(item: MemberHeaderItem, props: Partial[0], 'member'>> = {}) { const {state, actions} = createMockSearchContext(); return render( @@ -72,7 +90,7 @@ describe('MemberListItemHeader', () => { jest.clearAllMocks(); }); - testSearchGroupHeader({ + testSearchGroupHeader({ createItem: createMemberItem, renderHeader: (item, props, onCheckboxPress) => renderHeader(item, {...props, onCheckboxPress}), identifyingColumn: CONST.SEARCH.TABLE_COLUMNS.GROUP_FROM, @@ -80,6 +98,17 @@ describe('MemberListItemHeader', () => { cellText: /^(\$123\.45|Alex Rivera|7)$/, }); + describe('when grouped by approver', () => { + // The approver grouping reuses this header and only swaps the column that shows the name. + testSearchGroupHeader({ + createItem: createApproverItem, + renderHeader: (item, props, onCheckboxPress) => renderHeader(item, {...props, onCheckboxPress, nameColumn: CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER}), + identifyingColumn: CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, + identifyingText: 'Jordan Lee', + cellText: /^(\$123\.45|Jordan Lee|7)$/, + }); + }); + it('uses the explicit narrow prop and falls back to the display name for an empty login', async () => { // Given the member header uses its prop even when the responsive hook reports a wide screen. const item = createMemberItem({login: ''}); diff --git a/tests/unit/Search/ColumnAvailabilityTest.ts b/tests/unit/Search/ColumnAvailabilityTest.ts index 6e8d320f463b..0129169b8f22 100644 --- a/tests/unit/Search/ColumnAvailabilityTest.ts +++ b/tests/unit/Search/ColumnAvailabilityTest.ts @@ -65,6 +65,7 @@ describe('Column availability single source of truth', () => { TABLE_COLUMNS.GROUP_WITHDRAWAL_STATUS, TABLE_COLUMNS.GROUP_AMOUNT_DEBITED, TABLE_COLUMNS.GROUP_AMOUNT_REIMBURSED, + TABLE_COLUMNS.GROUP_APPROVER, ]); test('every TABLE_COLUMNS value is classified in COLUMN_AVAILABILITY or owned by another surface', () => { diff --git a/tests/unit/Search/SearchQueryUtilsTest.ts b/tests/unit/Search/SearchQueryUtilsTest.ts index d91ebe233c62..19d33503740a 100644 --- a/tests/unit/Search/SearchQueryUtilsTest.ts +++ b/tests/unit/Search/SearchQueryUtilsTest.ts @@ -1059,6 +1059,20 @@ describe('SearchQueryUtils', () => { expect(result).toEqual('type:expense from:user1@gmail.com,user2@gmail.com to:user3@gmail.com'); }); + test('array of approver', () => { + // Given form values holding the approver picked from the filter bar + const filterValues: Partial = { + type: 'expense', + approver: ['12345', '67890'], + }; + + // When the query string is rebuilt from the form + const result = buildQueryStringFromFilterFormValues(filterValues); + + // Then the approver filter is written back to the query so the search keeps narrowing by it + expect(result).toEqual('type:expense approver:12345,67890'); + }); + test('complex filter values', () => { const filterValues: Partial = { type: 'expense', @@ -1923,6 +1937,21 @@ describe('SearchQueryUtils', () => { expect(result).toEqual({type: 'expense', merchant: 'Uber', merchantOperator}); }); + test('approver filter is kept when the approver has personal details', () => { + // Given a query from an approver chart drill-down, where only one of the approvers is a known user + const queryJSON = buildSearchQueryJSON('sortBy:date sortOrder:desc type:expense approver:12345,99999'); + if (!queryJSON) { + throw new Error('Failed to parse query string'); + } + const personalDetails = {12345: {accountID: 12345, login: 'approver@expensify.com'}}; + + // When the form values are built from the query + const result = buildFilterFormValuesFromQuery(queryJSON, {}, {}, personalDetails, {}, {}, {}); + + // Then the known approver is kept like a from filter, so changing another filter does not drop it + expect(result).toEqual({type: 'expense', approver: ['12345']}); + }); + test('category filter includes empty values', () => { const policyID = generatePolicyID(); const queryString = 'sortBy:date sortOrder:desc type:expense category:none,Uncategorized,Maintenance'; @@ -4426,6 +4455,37 @@ describe('SearchQueryUtils', () => { expect(queryJSON?.sortBy).toBe(CONST.SEARCH.TABLE_COLUMNS.GROUP_WEEK); expect(queryJSON?.sortOrder).toBe(CONST.SEARCH.SORT_ORDER.DESC); }); + + test('switching to approver from the Display menu derives sort-by:group-approver and sort-order:asc', () => { + // Given a category grouping whose sort is the category default + // When the Display menu switches group by to approver + const result = buildFilterQueryWithSortDefaults( + {type: 'expense', groupBy: CONST.SEARCH.GROUP_BY.APPROVER, view: CONST.SEARCH.VIEW.TABLE}, + {view: CONST.SEARCH.VIEW.TABLE, groupBy: CONST.SEARCH.GROUP_BY.CATEGORY}, + {sortBy: CONST.SEARCH.TABLE_COLUMNS.GROUP_CATEGORY, sortOrder: CONST.SEARCH.SORT_ORDER.ASC}, + ); + const queryJSON = buildSearchQueryJSON(result ?? ''); + + // Then the parser re-derives the approver defaults from GROUP_BY_DEFAULT_SORT and GROUP_BY_DEFAULT_SORT_ORDER + expect(queryJSON?.sortBy).toBe(CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER); + expect(queryJSON?.sortOrder).toBe(CONST.SEARCH.SORT_ORDER.ASC); + }); + }); + + describe('group-by:approver parser round trip', () => { + test('round-trips group-by:approver and a customized group column list', () => { + // Given a query that groups by approver and customizes the group columns + const query = `type:expense group-by:${CONST.SEARCH.GROUP_BY.APPROVER} columns:group-approver,group-expenses,group-total`; + + // When it is parsed and then rebuilt into a query string and parsed again + const parsed = buildSearchQueryJSON(query); + const rebuilt = buildSearchQueryString(parsed); + const roundTripped = buildSearchQueryJSON(rebuilt); + + // Then the group by and customized columns survive the round trip + expect(roundTripped?.groupBy).toBe(CONST.SEARCH.GROUP_BY.APPROVER); + expect(roundTripped?.columns).toEqual([CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, CONST.SEARCH.TABLE_COLUMNS.GROUP_EXPENSES, CONST.SEARCH.TABLE_COLUMNS.GROUP_TOTAL]); + }); }); describe('shouldResetSort', () => { diff --git a/tests/unit/Search/SearchUIUtilsTest.ts b/tests/unit/Search/SearchUIUtilsTest.ts index ba95023d565c..61ff402eba55 100644 --- a/tests/unit/Search/SearchUIUtilsTest.ts +++ b/tests/unit/Search/SearchUIUtilsTest.ts @@ -756,6 +756,38 @@ const searchResultsGroupByCategory: OnyxTypes.SearchResults = { }, }; +const groupedApproverAccountID = 22982540; +const searchResultsGroupByApprover: OnyxTypes.SearchResults = { + data: { + personalDetailsList: { + [groupedApproverAccountID]: { + accountID: groupedApproverAccountID, + displayName: 'Approver', + login: 'approver@policy.com', + }, + }, + [`${CONST.SEARCH.GROUP_PREFIX}${groupedApproverAccountID}` as const]: { + accountID: groupedApproverAccountID, + count: 3, + currency: 'USD', + total: 150, + }, + }, + search: { + count: 3, + currency: 'USD', + hasMoreResults: false, + hasResults: true, + offset: 0, + hash: 0, + sortBy: 'date', + sortOrder: 'desc', + total: 150, + isLoading: false, + type: 'expense', + }, +}; + const withoutReportActionErrors = (reportAction: T): Omit => { const reportActionWithoutErrors = {...reportAction}; delete reportActionWithoutErrors.errors; @@ -4052,6 +4084,50 @@ describe('SearchUIUtils', () => { expect(categorySection.transactionsQueryJSON?.inputQuery).not.toContain('limit:'); }); + it('should build an approver drill-down for an approver group', () => { + // Given an approver-grouped query whose limit is meant to bound how many groups are shown + const parsedQuery = buildSearchQueryJSON(`type:expense group-by:${CONST.SEARCH.GROUP_BY.APPROVER} limit:10`); + if (!parsedQuery) { + throw new Error('Failed to parse approver grouped search query'); + } + expect(parsedQuery.limit).toBe(10); + + // When the approver sections are built + const [sections] = getSectionsByType( + SearchUIUtils.getSections({ + dateFnsLocale: undefined, + type: CONST.SEARCH.DATA_TYPES.EXPENSE, + data: searchResultsGroupByApprover.data, + currentAccountID: 2074551, + currentUserEmail: '', + translate: translateLocal, + formatPhoneNumber, + bankAccountList: {}, + rules: undefined, + groupBy: CONST.SEARCH.GROUP_BY.APPROVER, + conciergeReportID: undefined, + convertToDisplayString, + reportAttributesDerivedValue: {}, + queryJSON: {...parsedQuery}, + }), + SearchUIUtils.isTransactionApproverGroupListItemType, + ); + + // Then the per-group query drops the grouping and limit, and filters by the approver as a syntax filter + const approverSection = sections.at(0); + if (!approverSection) { + throw new Error('Expected an approver group section'); + } + expect(approverSection.transactionsQueryJSON?.groupBy).toBeUndefined(); + expect(approverSection.transactionsQueryJSON?.limit).toBeUndefined(); + expect(approverSection.transactionsQueryJSON?.inputQuery).not.toContain('limit:'); + expect(approverSection.transactionsQueryJSON?.filters).toEqual({ + operator: CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO, + left: CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, + right: String(groupedApproverAccountID), + }); + }); + // Every date granularity drills down through the same `buildDateRangeGroupQuery` builder, so they are // covered together: a regression that reintroduced `limit` in that one builder would break all five. it.each([ @@ -16735,6 +16811,25 @@ describe('hasFilterContentValuesChanged', () => { }); }); +describe('getGroupBySections', () => { + function getGroupByValues() { + return SearchUIUtils.getGroupBySections(translateLocal) + .flatMap((section) => section.options) + .map((option) => option.value); + } + + it('always offers approver grouping alongside from and card', () => { + // Given the Display menu group-by sections + // When they are built + const options = getGroupByValues(); + + // Then approver is offered with the other person groupings, with no has-filter requirement + expect(options).toContain(CONST.SEARCH.GROUP_BY.FROM); + expect(options).toContain(CONST.SEARCH.GROUP_BY.CARD); + expect(options).toContain(CONST.SEARCH.GROUP_BY.APPROVER); + }); +}); + describe('getDatePresets', () => { it('offers never for anyApproval', () => { // Given anyApproval, where Auth matches never against reports with no approve or forward action diff --git a/tests/unit/SearchParserTest.ts b/tests/unit/SearchParserTest.ts index 7509efde0cee..66e5ae339b80 100644 --- a/tests/unit/SearchParserTest.ts +++ b/tests/unit/SearchParserTest.ts @@ -954,6 +954,51 @@ const tests = [ filters: null, }, }, + { + query: 'type:expense group-by:approver', + expected: { + type: CONST.SEARCH.DATA_TYPES.EXPENSE, + sortBy: CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, + sortOrder: CONST.SEARCH.SORT_ORDER.ASC, + view: 'table', + groupBy: CONST.SEARCH.GROUP_BY.APPROVER, + filters: null, + }, + }, + { + query: 'type:expense group-by:approver columns:group-approver,group-expenses,group-total', + expected: { + type: CONST.SEARCH.DATA_TYPES.EXPENSE, + sortBy: CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, + sortOrder: CONST.SEARCH.SORT_ORDER.ASC, + view: 'table', + groupBy: CONST.SEARCH.GROUP_BY.APPROVER, + columns: [CONST.SEARCH.TABLE_COLUMNS.GROUP_APPROVER, CONST.SEARCH.TABLE_COLUMNS.GROUP_EXPENSES, CONST.SEARCH.TABLE_COLUMNS.GROUP_TOTAL], + filters: null, + }, + }, + { + query: 'type:expense has:approved-violation approver:22982540', + expected: { + type: CONST.SEARCH.DATA_TYPES.EXPENSE, + sortBy: CONST.SEARCH.SYNTAX_FILTER_KEYS.DATE, + sortOrder: CONST.SEARCH.SORT_ORDER.DESC, + view: 'table', + filters: { + operator: CONST.SEARCH.SYNTAX_OPERATORS.AND, + left: { + operator: CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO, + left: CONST.SEARCH.SYNTAX_FILTER_KEYS.HAS, + right: CONST.SEARCH.HAS_VALUES.APPROVED_VIOLATION, + }, + right: { + operator: CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO, + left: CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, + right: '22982540', + }, + }, + }, + }, { query: 'type:chat is:read', expected: { diff --git a/tests/unit/TransactionGroupListItemTest.tsx b/tests/unit/TransactionGroupListItemTest.tsx index 8e1ef4f69438..dd7157dff5e6 100644 --- a/tests/unit/TransactionGroupListItemTest.tsx +++ b/tests/unit/TransactionGroupListItemTest.tsx @@ -61,6 +61,7 @@ jest.mock('@libs/SearchUIUtils', () => ({ getGroupTableScrollLayout: jest.fn(() => ({dataColumns: [], minTableWidth: 0, shouldScrollHorizontally: false})), getViolationsForTransaction: jest.fn(() => ''), isTransactionDayGroupListItemType: jest.fn((item: Record) => item.groupedBy === 'day'), + isTransactionApproverGroupListItemType: jest.fn((item: Record) => item.groupedBy === 'approver'), })); jest.mock('@react-navigation/native', () => ({ diff --git a/tests/unit/hooks/useAdvancedSearchFilters.test.ts b/tests/unit/hooks/useAdvancedSearchFilters.test.ts index 329330a3c976..3bd888245149 100644 --- a/tests/unit/hooks/useAdvancedSearchFilters.test.ts +++ b/tests/unit/hooks/useAdvancedSearchFilters.test.ts @@ -541,6 +541,21 @@ describe('useAdvancedSearchFilters', () => { }); }); + describe('approver filter visibility', () => { + it('offers Approver on expenses but not on reports', async () => { + // Given the backend only translates the approver filter for expense searches, so a report search with it fails + // When the expense and report filters are listed + const {result: expenseResult} = renderHook(() => useAdvancedSearchFilters(CONST.SEARCH.DATA_TYPES.EXPENSE), {wrapper}); + const {result: reportResult} = renderHook(() => useAdvancedSearchFilters(CONST.SEARCH.DATA_TYPES.EXPENSE_REPORT), {wrapper}); + + // Then only the expense filters offer Approver + await waitFor(() => { + expect(expenseResult.current.flat()).toContain(CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER); + expect(reportResult.current.flat()).not.toContain(CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER); + }); + }); + }); + describe('section order', () => { it('groups expense filters into sections and keeps Keyword with the core filters', async () => { // Given no cards, so the card transactions section has nothing to show @@ -558,6 +573,7 @@ describe('useAdvancedSearchFilters', () => { CONST.SEARCH.SYNTAX_FILTER_KEYS.HELD, CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVED, CONST.SEARCH.SYNTAX_FILTER_KEYS.ANY_APPROVAL, + CONST.SEARCH.SYNTAX_FILTER_KEYS.APPROVER, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID, CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID_BY, ]);