Skip to content

Commit 9a4a13e

Browse files
authored
Merge pull request #55360 from jaydamani/search/always-show-clean-tag-names--53465
fix(search): tag names with colon showed \: instead of :
2 parents 6dd0f7c + 0772774 commit 9a4a13e

File tree

7 files changed

+27
-17
lines changed

7 files changed

+27
-17
lines changed

src/components/Search/SearchRouter/SearchRouterList.tsx

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import {getCardDescription, isCard, isCardHiddenFromSearch, mergeCardListWithWor
2222
import {combineOrderingOfReportsAndPersonalDetails, getSearchOptions, getValidOptions} from '@libs/OptionsListUtils';
2323
import type {Options, SearchOption} from '@libs/OptionsListUtils';
2424
import Performance from '@libs/Performance';
25-
import {getAllTaxRates} from '@libs/PolicyUtils';
25+
import {getAllTaxRates, getCleanedTagName} from '@libs/PolicyUtils';
2626
import type {OptionData} from '@libs/ReportUtils';
2727
import {
2828
getAutocompleteCategories,
@@ -229,13 +229,17 @@ function SearchRouterList(
229229
case CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG: {
230230
const autocompleteList = autocompleteValue ? tagAutocompleteList : recentTagsAutocompleteList ?? [];
231231
const filteredTags = autocompleteList
232-
.filter((tag) => tag.toLowerCase().includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.includes(tag))
232+
.filter(
233+
(tag) => getCleanedTagName(tag).toLowerCase().includes(autocompleteValue.toLowerCase()) && !alreadyAutocompletedKeys.includes(getCleanedTagName(tag).toLowerCase()),
234+
)
233235
.sort()
234236
.slice(0, 10);
235237

236238
return filteredTags.map((tagName) => ({
237239
filterKey: CONST.SEARCH.SEARCH_USER_FRIENDLY_KEYS.TAG,
238-
text: tagName,
240+
text: getCleanedTagName(tagName),
241+
autocompleteID: tagName,
242+
mapKey: CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG,
239243
}));
240244
}
241245
case CONST.SEARCH.SYNTAX_FILTER_KEYS.CATEGORY: {

src/components/Search/SearchRouter/buildSubstitutionsMap.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,8 @@ function buildSubstitutionsMap(
6060
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.FROM ||
6161
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TO ||
6262
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.IN ||
63-
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID
63+
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.CARD_ID ||
64+
filterKey === CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG
6465
) {
6566
const displayValue = getFilterDisplayValue(filterKey, filterValue, personalDetails, reports, cardList);
6667

src/components/Search/SearchRouter/getQueryWithSubstitutions.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import type {SearchAutocompleteQueryRange, SearchFilterKey} from '@components/Search/types';
2-
import * as parser from '@libs/SearchParser/autocompleteParser';
2+
import {parse} from '@libs/SearchParser/autocompleteParser';
3+
import {sanitizeSearchValue} from '@libs/SearchQueryUtils';
34

45
type SubstitutionMap = Record<string, string>;
56

@@ -18,7 +19,7 @@ const getSubstitutionMapKey = (filterKey: SearchFilterKey, value: string) => `${
1819
* return: `A from:9876 A`
1920
*/
2021
function getQueryWithSubstitutions(changedQuery: string, substitutions: SubstitutionMap) {
21-
const parsed = parser.parse(changedQuery) as {ranges: SearchAutocompleteQueryRange[]};
22+
const parsed = parse(changedQuery) as {ranges: SearchAutocompleteQueryRange[]};
2223

2324
const searchAutocompleteQueryRanges = parsed.ranges;
2425

@@ -31,11 +32,12 @@ function getQueryWithSubstitutions(changedQuery: string, substitutions: Substitu
3132

3233
for (const range of searchAutocompleteQueryRanges) {
3334
const itemKey = getSubstitutionMapKey(range.key, range.value);
34-
const substitutionEntry = substitutions[itemKey];
35+
let substitutionEntry = substitutions[itemKey];
3536

3637
if (substitutionEntry) {
3738
const substitutionStart = range.start + lengthDiff;
3839
const substitutionEnd = range.start + range.length;
40+
substitutionEntry = sanitizeSearchValue(substitutionEntry);
3941

4042
// generate new query but substituting "user-typed" value with the entity id/email from substitutions
4143
resultQuery = resultQuery.slice(0, substitutionStart) + substitutionEntry + changedQuery.slice(substitutionEnd);

src/libs/PolicyUtils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -363,7 +363,7 @@ function getTagNamesFromTagsLists(policyTagLists: PolicyTagLists): string[] {
363363

364364
for (const policyTagList of Object.values(policyTagLists ?? {})) {
365365
for (const tag of Object.values(policyTagList.tags ?? {})) {
366-
uniqueTagNames.add(getCleanedTagName(tag.name));
366+
uniqueTagNames.add(tag.name);
367367
}
368368
}
369369
return Array.from(uniqueTagNames);

src/libs/SearchQueryUtils.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import localeCompare from './LocaleCompare';
1414
import Log from './Log';
1515
import {validateAmount} from './MoneyRequestUtils';
1616
import {getPersonalDetailByEmail} from './PersonalDetailsUtils';
17-
import {getTagNamesFromTagsLists} from './PolicyUtils';
17+
import {getCleanedTagName, getTagNamesFromTagsLists} from './PolicyUtils';
1818
import {getReportName} from './ReportUtils';
1919
import {parse as parseSearchQuery} from './SearchParser/searchParser';
2020
import {hashText} from './UserUtils';
@@ -559,6 +559,9 @@ function getFilterDisplayValue(
559559
const frontendAmount = convertToFrontendAmountAsInteger(Number(filterValue));
560560
return Number.isNaN(frontendAmount) ? filterValue : frontendAmount.toString();
561561
}
562+
if (filterName === CONST.SEARCH.SYNTAX_FILTER_KEYS.TAG) {
563+
return getCleanedTagName(filterValue);
564+
}
562565
return filterValue;
563566
}
564567

src/pages/Search/AdvancedSearchFilters.tsx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ import {convertToDisplayStringWithoutCurrency} from '@libs/CurrencyUtils';
2121
import localeCompare from '@libs/LocaleCompare';
2222
import Navigation from '@libs/Navigation/Navigation';
2323
import {createDisplayName} from '@libs/PersonalDetailsUtils';
24-
import {getAllTaxRates, getTagNamesFromTagsLists, isPolicyFeatureEnabled} from '@libs/PolicyUtils';
24+
import {getAllTaxRates, getCleanedTagName, getTagNamesFromTagsLists, isPolicyFeatureEnabled} from '@libs/PolicyUtils';
2525
import {getReportName} from '@libs/ReportUtils';
2626
import {buildCannedSearchQuery, buildQueryStringFromFilterFormValues, buildSearchQueryJSON, isCannedSearchQuery} from '@libs/SearchQueryUtils';
2727
import {getExpenseTypeTranslationKey} from '@libs/SearchUIUtils';
@@ -306,7 +306,7 @@ function getFilterDisplayTitle(filters: Partial<SearchAdvancedFiltersForm>, filt
306306
const filterArray = filters[nonDateFilterKey] ?? [];
307307
return filterArray
308308
.sort(sortOptionsWithEmptyValue)
309-
.map((value) => (value === CONST.SEARCH.EMPTY_VALUE ? translate('search.noTag') : value))
309+
.map((value) => (value === CONST.SEARCH.EMPTY_VALUE ? translate('search.noTag') : getCleanedTagName(value)))
310310
.join(', ');
311311
}
312312

src/pages/Search/SearchAdvancedFiltersPage/SearchFiltersTagPage.tsx

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,9 @@ import ScreenWrapper from '@components/ScreenWrapper';
66
import SearchMultipleSelectionPicker from '@components/Search/SearchMultipleSelectionPicker';
77
import useLocalize from '@hooks/useLocalize';
88
import useThemeStyles from '@hooks/useThemeStyles';
9+
import {updateAdvancedFilters} from '@libs/actions/Search';
910
import Navigation from '@libs/Navigation/Navigation';
10-
import {getTagNamesFromTagsLists} from '@libs/PolicyUtils';
11-
import * as SearchActions from '@userActions/Search';
11+
import {getCleanedTagName, getTagNamesFromTagsLists} from '@libs/PolicyUtils';
1212
import CONST from '@src/CONST';
1313
import ONYXKEYS from '@src/ONYXKEYS';
1414
import ROUTES from '@src/ROUTES';
@@ -23,7 +23,7 @@ function SearchFiltersTagPage() {
2323
if (tag === CONST.SEARCH.EMPTY_VALUE) {
2424
return {name: translate('search.noTag'), value: tag};
2525
}
26-
return {name: tag, value: tag};
26+
return {name: getCleanedTagName(tag), value: tag};
2727
});
2828
const policyID = searchAdvancedFiltersForm?.policyID;
2929
const [allPolicyTagLists = {}] = useOnyx(ONYXKEYS.COLLECTION.POLICY_TAGS);
@@ -38,14 +38,14 @@ function SearchFiltersTagPage() {
3838
.map(getTagNamesFromTagsLists)
3939
.flat()
4040
.forEach((tag) => uniqueTagNames.add(tag));
41-
items.push(...Array.from(uniqueTagNames).map((tagName) => ({name: tagName, value: tagName})));
41+
items.push(...Array.from(uniqueTagNames).map((tagName) => ({name: getCleanedTagName(tagName), value: tagName})));
4242
} else {
43-
items.push(...getTagNamesFromTagsLists(singlePolicyTagLists).map((name) => ({name, value: name})));
43+
items.push(...getTagNamesFromTagsLists(singlePolicyTagLists).map((name) => ({name: getCleanedTagName(name), value: name})));
4444
}
4545
return items;
4646
}, [allPolicyTagLists, singlePolicyTagLists, translate]);
4747

48-
const updateTagFilter = useCallback((values: string[]) => SearchActions.updateAdvancedFilters({tag: values}), []);
48+
const updateTagFilter = useCallback((values: string[]) => updateAdvancedFilters({tag: values}), []);
4949

5050
return (
5151
<ScreenWrapper

0 commit comments

Comments
 (0)