Skip to content

Commit 5e86e48

Browse files
authored
Merge pull request Expensify#88246 from wildan-m/wildan/87965-withdrawal-status-filter
Add withdrawal-status search filter
2 parents 03b612d + 21b46b3 commit 5e86e48

25 files changed

Lines changed: 1497 additions & 1069 deletions

src/CONST/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8020,6 +8020,7 @@ const CONST = {
80208020
EXPORTED: 'exported',
80218021
POSTED: 'posted',
80228022
WITHDRAWAL_TYPE: 'withdrawalType',
8023+
WITHDRAWAL_STATUS: 'withdrawalStatus',
80238024
WITHDRAWN: 'withdrawn',
80248025
TOTAL: 'total',
80258026
TITLE: 'title',
@@ -8092,6 +8093,7 @@ const CONST = {
80928093
EXPORTED: 'exported',
80938094
POSTED: 'posted',
80948095
WITHDRAWAL_TYPE: 'withdrawal-type',
8096+
WITHDRAWAL_STATUS: 'withdrawal-status',
80958097
WITHDRAWN: 'withdrawn',
80968098
TITLE: 'title',
80978099
ASSIGNEE: 'assignee',

src/SCREENS.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ const SCREENS = {
7474
ADVANCED_FILTERS_TAX_RATE_RHP: 'Search_Advanced_Filters_Tax_Rate_RHP',
7575
ADVANCED_FILTERS_EXPENSE_TYPE_RHP: 'Search_Advanced_Filters_Expense_Type_RHP',
7676
ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP: 'Search_Advanced_Filters_Withdrawal_Type_RHP',
77+
ADVANCED_FILTERS_WITHDRAWAL_STATUS_RHP: 'Search_Advanced_Filters_Withdrawal_Status_RHP',
7778
ADVANCED_FILTERS_IS_RHP: 'Search_Advanced_Filters_Is_RHP',
7879
ADVANCED_FILTERS_WITHDRAWAL_ID_RHP: 'Search_Advanced_Filters_Withdrawal_ID_RHP',
7980
ADVANCED_FILTERS_TAG_RHP: 'Search_Advanced_Filters_Tag_RHP',

src/components/Search/SearchPageHeader/useSearchFiltersBar.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import TextInputPopup from '@components/Search/FilterDropdowns/TextInputPopup';
1717
import UserSelectPopup from '@components/Search/FilterDropdowns/UserSelectPopup';
1818
import WorkspaceSelectPopup from '@components/Search/FilterDropdowns/WorkspaceSelectPopup';
1919
import {useSearchStateContext} from '@components/Search/SearchContext';
20-
import type {ReportFieldKey, SearchAmountFilterKeys, SearchDateFilterKeys, SearchFilterKey, SearchQueryJSON} from '@components/Search/types';
20+
import type {ReportFieldKey, SearchAmountFilterKeys, SearchDateFilterKeys, SearchFilterKey, SearchQueryJSON, SearchWithdrawalStatus} from '@components/Search/types';
2121
import {useCurrencyListActions} from '@hooks/useCurrencyList';
2222
import useLocalize from '@hooks/useLocalize';
2323
import useNetwork from '@hooks/useNetwork';
@@ -359,6 +359,7 @@ function useSearchFiltersBar(queryJSON: SearchQueryJSON): UseSearchFiltersBarRes
359359
case FILTER_KEYS.HAS:
360360
case FILTER_KEYS.IS:
361361
case FILTER_KEYS.EXPENSE_TYPE:
362+
case FILTER_KEYS.WITHDRAWAL_STATUS:
362363
case FILTER_KEYS.STATUS: {
363364
let formValues = searchAdvancedFiltersForm[filterKey] ?? [];
364365

@@ -381,7 +382,7 @@ function useSearchFiltersBar(queryJSON: SearchQueryJSON): UseSearchFiltersBarRes
381382
return;
382383
}
383384
const update: Partial<SearchAdvancedFiltersForm> = {};
384-
update[filterKey] = selectedItems.map((item) => item.value) as ExpenseTypeValues & HasFilterValues & IsFilterValues;
385+
update[filterKey] = selectedItems.map((item) => item.value) as ExpenseTypeValues & HasFilterValues & IsFilterValues & SearchWithdrawalStatus;
385386
updateFilterForm(update);
386387
}}
387388
/>

src/components/Search/types.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ type ChartView = Exclude<SearchView, 'table'>;
149149
type TableColumnSize = ValueOf<typeof CONST.SEARCH.TABLE_COLUMN_SIZES>;
150150
type SearchDatePreset = ValueOf<typeof CONST.SEARCH.DATE_PRESETS>;
151151
type SearchWithdrawalType = ValueOf<typeof CONST.SEARCH.WITHDRAWAL_TYPE>;
152+
type SearchWithdrawalStatus = Array<ValueOf<typeof CONST.SEARCH.SETTLEMENT_STATUS>>;
152153
type SearchAction = ValueOf<typeof CONST.SEARCH.ACTION_FILTERS>;
153154

154155
type SearchCustomColumnIds =
@@ -419,6 +420,7 @@ export type {
419420
SingularSearchStatus,
420421
SearchDatePreset,
421422
SearchWithdrawalType,
423+
SearchWithdrawalStatus,
422424
SearchAction,
423425
SearchCurrencyFilterKeys,
424426
UserFriendlyValue,

src/hooks/useAdvancedSearchFilters.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ const typeFiltersKeys = {
5353
CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED,
5454
CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED_TO,
5555
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE,
56+
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_STATUS,
5657
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_ID,
5758
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN,
5859
],
@@ -77,6 +78,7 @@ const typeFiltersKeys = {
7778
CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED,
7879
CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED_TO,
7980
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE,
81+
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_STATUS,
8082
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_ID,
8183
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN,
8284
CONST.SEARCH.SYNTAX_FILTER_KEYS.TITLE,
@@ -114,6 +116,7 @@ const typeFiltersKeys = {
114116
CONST.SEARCH.SYNTAX_FILTER_KEYS.PAID,
115117
CONST.SEARCH.SYNTAX_FILTER_KEYS.EXPORTED,
116118
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE,
119+
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_STATUS,
117120
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_ID,
118121
CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWN,
119122
CONST.SEARCH.SYNTAX_FILTER_KEYS.TITLE,

src/hooks/useAutocompleteSuggestions.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ const GROUP_BY_FRIENDLY_VALUES = Object.values(CONST.SEARCH.GROUP_BY).map((value
6464
const VIEW_FRIENDLY_VALUES = Object.values(CONST.SEARCH.VIEW).map((value) => getUserFriendlyValue(value));
6565
const EXPENSE_TYPE_FRIENDLY_VALUES = Object.values(CONST.SEARCH.TRANSACTION_TYPE).map((value) => getUserFriendlyValue(value));
6666
const WITHDRAWAL_TYPE_VALUES = Object.values(CONST.SEARCH.WITHDRAWAL_TYPE);
67+
const WITHDRAWAL_STATUS_VALUES = Object.values(CONST.SEARCH.SETTLEMENT_STATUS);
6768
const BOOLEAN_VALUES = Object.values(CONST.SEARCH.BOOLEAN);
6869
const ACTION_FILTER_VALUES = Object.values(CONST.SEARCH.ACTION_FILTERS);
6970
const IS_VALUES_LIST = Object.values(CONST.SEARCH.IS_VALUES);
@@ -368,6 +369,16 @@ function useAutocompleteSuggestions({
368369
text: withdrawalType,
369370
}));
370371
}
372+
case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_STATUS: {
373+
const filteredWithdrawalStatuses = WITHDRAWAL_STATUS_VALUES.filter(
374+
(withdrawalStatus) => withdrawalStatus.includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.has(withdrawalStatus),
375+
).sort();
376+
377+
return filteredWithdrawalStatuses.map((withdrawalStatus) => ({
378+
filterKey: CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.WITHDRAWAL_STATUS,
379+
text: withdrawalStatus,
380+
}));
381+
}
371382
case CONST.SEARCH.SYNTAX_FILTER_KEYS.FEED: {
372383
// We don't want to show the "Expensify Card" feeds in the autocomplete suggestion list as they don't have real "Statements"
373384
// Thus passing an empty object to the `allCards` parameter.

src/libs/Navigation/AppNavigator/ModalStackNavigators/index.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1108,6 +1108,8 @@ const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator<Searc
11081108
[SCREENS.SEARCH.ADVANCED_FILTERS_TAX_RATE_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersTaxRatePage').default,
11091109
[SCREENS.SEARCH.ADVANCED_FILTERS_EXPENSE_TYPE_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersExpenseTypePage').default,
11101110
[SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalTypePage').default,
1111+
[SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_STATUS_RHP]: () =>
1112+
require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersWithdrawalStatusPage').default,
11111113
[SCREENS.SEARCH.ADVANCED_FILTERS_IS_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersIsPage').default,
11121114
[SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersTagPage').default,
11131115
[SCREENS.SEARCH.ADVANCED_FILTERS_HAS_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersHasPage').default,

src/libs/Navigation/linkingConfig/RELATIONS/SEARCH_TO_RHP.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ const SEARCH_TO_RHP: Partial<Record<keyof SearchFullscreenNavigatorParamList, st
3333
SCREENS.SEARCH.ADVANCED_FILTERS_TAX_RATE_RHP,
3434
SCREENS.SEARCH.ADVANCED_FILTERS_EXPENSE_TYPE_RHP,
3535
SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP,
36+
SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_STATUS_RHP,
3637
SCREENS.SEARCH.ADVANCED_FILTERS_IS_RHP,
3738
SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP,
3839
SCREENS.SEARCH.ADVANCED_FILTERS_HAS_RHP,

src/libs/Navigation/linkingConfig/config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1977,6 +1977,7 @@ const config: LinkingOptions<RootNavigatorParamList>['config'] = {
19771977
[SCREENS.SEARCH.ADVANCED_FILTERS_TAX_RATE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.TAX_RATE),
19781978
[SCREENS.SEARCH.ADVANCED_FILTERS_EXPENSE_TYPE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.EXPENSE_TYPE),
19791979
[SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_TYPE_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.WITHDRAWAL_TYPE),
1980+
[SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_STATUS_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.WITHDRAWAL_STATUS),
19801981
[SCREENS.SEARCH.ADVANCED_FILTERS_IS_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.IS),
19811982
[SCREENS.SEARCH.ADVANCED_FILTERS_WITHDRAWAL_ID_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.WITHDRAWAL_ID),
19821983
[SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS.getRoute(CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG),

src/libs/SearchAutocompleteUtils.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@ function filterOutRangesWithCorrectValue(
160160
const typeList = Object.values(CONST.SEARCH.DATA_TYPES) as string[];
161161
const expenseTypeList = userFriendlyExpenseTypeList;
162162
const withdrawalTypeList = Object.values(CONST.SEARCH.WITHDRAWAL_TYPE) as string[];
163+
const withdrawalStatusList = Object.values(CONST.SEARCH.SETTLEMENT_STATUS) as string[];
163164
const statusList = userFriendlyStatusList;
164165
const groupByList = userFriendlyGroupByList;
165166
const viewList = userFriendlyViewList;
@@ -198,6 +199,8 @@ function filterOutRangesWithCorrectValue(
198199
return expenseTypeList.includes(range.value);
199200
case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_TYPE:
200201
return withdrawalTypeList.includes(range.value);
202+
case CONST.SEARCH.SYNTAX_FILTER_KEYS.WITHDRAWAL_STATUS:
203+
return withdrawalStatusList.includes(range.value);
201204
case CONST.SEARCH.SYNTAX_ROOT_KEYS.STATUS:
202205
return statusList.includes(range.value);
203206
case CONST.SEARCH.SYNTAX_FILTER_KEYS.ACTION:

0 commit comments

Comments
 (0)