Skip to content

Commit 5cbff0b

Browse files
authored
Merge pull request #47918 from software-mansion-labs/289Adam289/47497-advanced-filters-has
create advanced filters has
2 parents 4b1f992 + 4ce3a1d commit 5cbff0b

File tree

15 files changed

+302
-115
lines changed

15 files changed

+302
-115
lines changed

src/CONST.ts

+6
Original file line numberDiff line numberDiff line change
@@ -5229,6 +5229,7 @@ const CONST = {
52295229
EXPENSE: 'expense',
52305230
INVOICE: 'invoice',
52315231
TRIP: 'trip',
5232+
CHAT: 'chat',
52325233
},
52335234
ACTION_TYPES: {
52345235
VIEW: 'view',
@@ -5272,6 +5273,10 @@ const CONST = {
52725273
PAID: 'paid',
52735274
},
52745275
},
5276+
CHAT_TYPES: {
5277+
LINK: 'link',
5278+
ATTACHMENT: 'attachment',
5279+
},
52755280
TABLE_COLUMNS: {
52765281
RECEIPT: 'receipt',
52775282
DATE: 'date',
@@ -5318,6 +5323,7 @@ const CONST = {
53185323
CARD_ID: 'cardID',
53195324
REPORT_ID: 'reportID',
53205325
KEYWORD: 'keyword',
5326+
HAS: 'has',
53215327
},
53225328
},
53235329

src/ROUTES.ts

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ const ROUTES = {
5252
SEARCH_ADVANCED_FILTERS_TAG: 'search/filters/tag',
5353
SEARCH_ADVANCED_FILTERS_FROM: 'search/filters/from',
5454
SEARCH_ADVANCED_FILTERS_TO: 'search/filters/to',
55+
SEARCH_ADVANCED_FILTERS_HAS: 'search/filters/has',
5556

5657
SEARCH_REPORT: {
5758
route: 'search/view/:reportID',

src/SCREENS.ts

+1
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ const SCREENS = {
4646
ADVANCED_FILTERS_TAG_RHP: 'Search_Advanced_Filters_Tag_RHP',
4747
ADVANCED_FILTERS_FROM_RHP: 'Search_Advanced_Filters_From_RHP',
4848
ADVANCED_FILTERS_TO_RHP: 'Search_Advanced_Filters_To_RHP',
49+
ADVANCED_FILTERS_HAS_RHP: 'Search_Advanced_Filters_Has_RHP',
4950
TRANSACTION_HOLD_REASON_RHP: 'Search_Transaction_Hold_Reason_RHP',
5051
BOTTOM_TAB: 'Search_Bottom_Tab',
5152
},

src/components/Search/SearchMultipleSelectionPicker.tsx

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, {useCallback, useMemo, useState} from 'react';
1+
import React, {useCallback, useEffect, useMemo, useState} from 'react';
22
import Button from '@components/Button';
33
import SelectionList from '@components/SelectionList';
44
import SelectableListItem from '@components/SelectionList/SelectableListItem';
@@ -28,6 +28,10 @@ function SearchMultipleSelectionPicker({items, initiallySelectedItems, pickerTit
2828
const [searchTerm, debouncedSearchTerm, setSearchTerm] = useDebouncedState('');
2929
const [selectedItems, setSelectedItems] = useState<SearchMultipleSelectionPickerItem[]>(initiallySelectedItems ?? []);
3030

31+
useEffect(() => {
32+
setSelectedItems(initiallySelectedItems ?? []);
33+
}, [initiallySelectedItems]);
34+
3135
const {sections, noResultsFound} = useMemo(() => {
3236
const selectedItemsSection = selectedItems
3337
.filter((item) => item?.name.toLowerCase().includes(debouncedSearchTerm?.toLowerCase()))

src/languages/en.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3801,6 +3801,8 @@ export default {
38013801
keyword: 'Keyword',
38023802
hasKeywords: 'Has keywords',
38033803
currency: 'Currency',
3804+
has: 'Has',
3805+
link: 'Link',
38043806
amount: {
38053807
lessThan: (amount?: string) => `Less than ${amount ?? ''}`,
38063808
greaterThan: (amount?: string) => `Greater than ${amount ?? ''}`,

src/languages/es.ts

+2
Original file line numberDiff line numberDiff line change
@@ -3851,6 +3851,8 @@ export default {
38513851
keyword: 'Palabra clave',
38523852
hasKeywords: 'Tiene palabras clave',
38533853
currency: 'Divisa',
3854+
has: 'Tiene',
3855+
link: 'Enlace',
38543856
amount: {
38553857
lessThan: (amount?: string) => `Menos de ${amount ?? ''}`,
38563858
greaterThan: (amount?: string) => `Más que ${amount ?? ''}`,

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

+1
Original file line numberDiff line numberDiff line change
@@ -533,6 +533,7 @@ const SearchAdvancedFiltersModalStackNavigator = createModalStackNavigator<Searc
533533
[SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: () => require<ReactComponentModule>('../../../../pages/Search/SearchAdvancedFiltersPage/SearchFiltersTagPage').default,
534534
[SCREENS.SEARCH.ADVANCED_FILTERS_FROM_RHP]: () => require<ReactComponentModule>('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersFromPage').default,
535535
[SCREENS.SEARCH.ADVANCED_FILTERS_TO_RHP]: () => require<ReactComponentModule>('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersToPage').default,
536+
[SCREENS.SEARCH.ADVANCED_FILTERS_HAS_RHP]: () => require<ReactComponentModule>('@pages/Search/SearchAdvancedFiltersPage/SearchFiltersHasPage').default,
536537
});
537538

538539
const RestrictedActionModalStackNavigator = createModalStackNavigator<SearchReportParamList>({

src/libs/Navigation/linkingConfig/config.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1053,6 +1053,7 @@ const config: LinkingOptions<RootStackParamList>['config'] = {
10531053
[SCREENS.SEARCH.ADVANCED_FILTERS_TAG_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_TAG,
10541054
[SCREENS.SEARCH.ADVANCED_FILTERS_FROM_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_FROM,
10551055
[SCREENS.SEARCH.ADVANCED_FILTERS_TO_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_TO,
1056+
[SCREENS.SEARCH.ADVANCED_FILTERS_HAS_RHP]: ROUTES.SEARCH_ADVANCED_FILTERS_HAS,
10561057
},
10571058
},
10581059
[SCREENS.RIGHT_MODAL.RESTRICTED_ACTION]: {

src/libs/SearchParser/searchParser.js

+42-24
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,8 @@ function peg$parse(input, options) {
200200
var peg$c22 = "sortBy";
201201
var peg$c23 = "sortOrder";
202202
var peg$c24 = "policyID";
203-
var peg$c25 = "\"";
203+
var peg$c25 = "has";
204+
var peg$c26 = "\"";
204205

205206
var peg$r0 = /^[:=]/;
206207
var peg$r1 = /^[^"\r\n]/;
@@ -233,11 +234,12 @@ function peg$parse(input, options) {
233234
var peg$e23 = peg$literalExpectation("sortBy", false);
234235
var peg$e24 = peg$literalExpectation("sortOrder", false);
235236
var peg$e25 = peg$literalExpectation("policyID", false);
236-
var peg$e26 = peg$literalExpectation("\"", false);
237-
var peg$e27 = peg$classExpectation(["\"", "\r", "\n"], true, false);
238-
var peg$e28 = peg$classExpectation([["A", "Z"], ["a", "z"], ["0", "9"], "_", "@", ".", "/", "#", "&", "+", "-", "\\", "'", ",", ";"], false, false);
239-
var peg$e29 = peg$otherExpectation("whitespace");
240-
var peg$e30 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false);
237+
var peg$e26 = peg$literalExpectation("has", false);
238+
var peg$e27 = peg$literalExpectation("\"", false);
239+
var peg$e28 = peg$classExpectation(["\"", "\r", "\n"], true, false);
240+
var peg$e29 = peg$classExpectation([["A", "Z"], ["a", "z"], ["0", "9"], "_", "@", ".", "/", "#", "&", "+", "-", "\\", "'", ",", ";"], false, false);
241+
var peg$e30 = peg$otherExpectation("whitespace");
242+
var peg$e31 = peg$classExpectation([" ", "\t", "\r", "\n"], false, false);
241243

242244
var peg$f0 = function(filters) {
243245
const withDefaults = applyDefaults(filters);
@@ -311,10 +313,11 @@ function peg$parse(input, options) {
311313
var peg$f26 = function() { return "sortBy"; };
312314
var peg$f27 = function() { return "sortOrder"; };
313315
var peg$f28 = function() { return "policyID"; };
314-
var peg$f29 = function(parts) { return parts.join(''); };
315-
var peg$f30 = function(chars) { return chars.join(''); };
316+
var peg$f29 = function() { return "has"; };
317+
var peg$f30 = function(parts) { return parts.join(''); };
316318
var peg$f31 = function(chars) { return chars.join(''); };
317-
var peg$f32 = function() { return "and"; };
319+
var peg$f32 = function(chars) { return chars.join(''); };
320+
var peg$f33 = function() { return "and"; };
318321
var peg$currPos = options.peg$currPos | 0;
319322
var peg$savedPos = peg$currPos;
320323
var peg$posDetailsCache = [{ line: 1, column: 1 }];
@@ -937,6 +940,21 @@ function peg$parse(input, options) {
937940
s1 = peg$f28();
938941
}
939942
s0 = s1;
943+
if (s0 === peg$FAILED) {
944+
s0 = peg$currPos;
945+
if (input.substr(peg$currPos, 3) === peg$c25) {
946+
s1 = peg$c25;
947+
peg$currPos += 3;
948+
} else {
949+
s1 = peg$FAILED;
950+
if (peg$silentFails === 0) { peg$fail(peg$e26); }
951+
}
952+
if (s1 !== peg$FAILED) {
953+
peg$savedPos = s0;
954+
s1 = peg$f29();
955+
}
956+
s0 = s1;
957+
}
940958
}
941959
}
942960
}
@@ -982,7 +1000,7 @@ function peg$parse(input, options) {
9821000
}
9831001
if (s1 !== peg$FAILED) {
9841002
peg$savedPos = s0;
985-
s1 = peg$f29(s1);
1003+
s1 = peg$f30(s1);
9861004
}
9871005
s0 = s1;
9881006

@@ -994,11 +1012,11 @@ function peg$parse(input, options) {
9941012

9951013
s0 = peg$currPos;
9961014
if (input.charCodeAt(peg$currPos) === 34) {
997-
s1 = peg$c25;
1015+
s1 = peg$c26;
9981016
peg$currPos++;
9991017
} else {
10001018
s1 = peg$FAILED;
1001-
if (peg$silentFails === 0) { peg$fail(peg$e26); }
1019+
if (peg$silentFails === 0) { peg$fail(peg$e27); }
10021020
}
10031021
if (s1 !== peg$FAILED) {
10041022
s2 = [];
@@ -1007,7 +1025,7 @@ function peg$parse(input, options) {
10071025
peg$currPos++;
10081026
} else {
10091027
s3 = peg$FAILED;
1010-
if (peg$silentFails === 0) { peg$fail(peg$e27); }
1028+
if (peg$silentFails === 0) { peg$fail(peg$e28); }
10111029
}
10121030
while (s3 !== peg$FAILED) {
10131031
s2.push(s3);
@@ -1016,19 +1034,19 @@ function peg$parse(input, options) {
10161034
peg$currPos++;
10171035
} else {
10181036
s3 = peg$FAILED;
1019-
if (peg$silentFails === 0) { peg$fail(peg$e27); }
1037+
if (peg$silentFails === 0) { peg$fail(peg$e28); }
10201038
}
10211039
}
10221040
if (input.charCodeAt(peg$currPos) === 34) {
1023-
s3 = peg$c25;
1041+
s3 = peg$c26;
10241042
peg$currPos++;
10251043
} else {
10261044
s3 = peg$FAILED;
1027-
if (peg$silentFails === 0) { peg$fail(peg$e26); }
1045+
if (peg$silentFails === 0) { peg$fail(peg$e27); }
10281046
}
10291047
if (s3 !== peg$FAILED) {
10301048
peg$savedPos = s0;
1031-
s0 = peg$f30(s2);
1049+
s0 = peg$f31(s2);
10321050
} else {
10331051
peg$currPos = s0;
10341052
s0 = peg$FAILED;
@@ -1051,7 +1069,7 @@ function peg$parse(input, options) {
10511069
peg$currPos++;
10521070
} else {
10531071
s2 = peg$FAILED;
1054-
if (peg$silentFails === 0) { peg$fail(peg$e28); }
1072+
if (peg$silentFails === 0) { peg$fail(peg$e29); }
10551073
}
10561074
if (s2 !== peg$FAILED) {
10571075
while (s2 !== peg$FAILED) {
@@ -1061,15 +1079,15 @@ function peg$parse(input, options) {
10611079
peg$currPos++;
10621080
} else {
10631081
s2 = peg$FAILED;
1064-
if (peg$silentFails === 0) { peg$fail(peg$e28); }
1082+
if (peg$silentFails === 0) { peg$fail(peg$e29); }
10651083
}
10661084
}
10671085
} else {
10681086
s1 = peg$FAILED;
10691087
}
10701088
if (s1 !== peg$FAILED) {
10711089
peg$savedPos = s0;
1072-
s1 = peg$f31(s1);
1090+
s1 = peg$f32(s1);
10731091
}
10741092
s0 = s1;
10751093

@@ -1082,7 +1100,7 @@ function peg$parse(input, options) {
10821100
s0 = peg$currPos;
10831101
s1 = peg$parse_();
10841102
peg$savedPos = s0;
1085-
s1 = peg$f32();
1103+
s1 = peg$f33();
10861104
s0 = s1;
10871105

10881106
return s0;
@@ -1098,7 +1116,7 @@ function peg$parse(input, options) {
10981116
peg$currPos++;
10991117
} else {
11001118
s1 = peg$FAILED;
1101-
if (peg$silentFails === 0) { peg$fail(peg$e30); }
1119+
if (peg$silentFails === 0) { peg$fail(peg$e31); }
11021120
}
11031121
while (s1 !== peg$FAILED) {
11041122
s0.push(s1);
@@ -1107,12 +1125,12 @@ function peg$parse(input, options) {
11071125
peg$currPos++;
11081126
} else {
11091127
s1 = peg$FAILED;
1110-
if (peg$silentFails === 0) { peg$fail(peg$e30); }
1128+
if (peg$silentFails === 0) { peg$fail(peg$e31); }
11111129
}
11121130
}
11131131
peg$silentFails--;
11141132
s1 = peg$FAILED;
1115-
if (peg$silentFails === 0) { peg$fail(peg$e29); }
1133+
if (peg$silentFails === 0) { peg$fail(peg$e30); }
11161134

11171135
return s0;
11181136
}

src/libs/SearchParser/searchParser.peggy

+1
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ key
134134
/ "sortBy" { return "sortBy"; }
135135
/ "sortOrder" { return "sortOrder"; }
136136
/ "policyID" { return "policyID"; }
137+
/ "has" { return "has"; }
137138

138139
identifier
139140
= parts:(quotedString / alphanumeric)+ { return parts.join(''); }

src/libs/SearchUtils.ts

+13-1
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,16 @@ function getExpenseTypeTranslationKey(expenseType: ValueOf<typeof CONST.SEARCH.T
427427
}
428428
}
429429

430+
function getChatFiltersTranslationKey(has: ValueOf<typeof CONST.SEARCH.CHAT_TYPES>): TranslationPaths {
431+
// eslint-disable-next-line default-case
432+
switch (has) {
433+
case CONST.SEARCH.CHAT_TYPES.LINK:
434+
return 'search.filters.link';
435+
case CONST.SEARCH.CHAT_TYPES.ATTACHMENT:
436+
return 'common.attachment';
437+
}
438+
}
439+
430440
/**
431441
* Given object with chosen search filters builds correct query string from them
432442
*/
@@ -453,7 +463,8 @@ function buildQueryStringFromFilters(filterValues: Partial<SearchAdvancedFilters
453463
filterKey === FILTER_KEYS.TAG ||
454464
filterKey === FILTER_KEYS.CURRENCY ||
455465
filterKey === FILTER_KEYS.FROM ||
456-
filterKey === FILTER_KEYS.TO) &&
466+
filterKey === FILTER_KEYS.TO ||
467+
filterKey === FILTER_KEYS.HAS) &&
457468
Array.isArray(filterValue) &&
458469
filterValue.length > 0
459470
) {
@@ -588,4 +599,5 @@ export {
588599
shouldShowYear,
589600
buildCannedSearchQuery,
590601
getExpenseTypeTranslationKey,
602+
getChatFiltersTranslationKey,
591603
};

0 commit comments

Comments
 (0)