diff --git a/src/components/Search/SearchFiltersAmountBase.tsx b/src/components/Search/SearchFiltersAmountBase.tsx index d7baaf1ca2f7..f5658923fc4b 100644 --- a/src/components/Search/SearchFiltersAmountBase.tsx +++ b/src/components/Search/SearchFiltersAmountBase.tsx @@ -222,6 +222,7 @@ function SearchFiltersAmountBase({title, filterKey, testID}: {title: Translation role={CONST.ROLE.PRESENTATION} ref={inputCallbackRef} inputMode={CONST.INPUT_MODE.DECIMAL} + shouldAllowNegative autoFocus uncontrolled /> diff --git a/src/libs/SearchQueryUtils.ts b/src/libs/SearchQueryUtils.ts index 17038bcf5aa6..88e117551d58 100644 --- a/src/libs/SearchQueryUtils.ts +++ b/src/libs/SearchQueryUtils.ts @@ -819,19 +819,19 @@ function buildFilterFormValuesFromQuery( // backend amount is an integer and is 2 digits longer than frontend amount filtersForm[equalToKey] = filterList - .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2)) + .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.EQUAL_TO && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2, true)) ?.value.toString() ?? filtersForm[equalToKey]; filtersForm[lessThanKey] = filterList - .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.LOWER_THAN && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2)) + .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.LOWER_THAN && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2, true)) ?.value.toString() ?? filtersForm[lessThanKey]; filtersForm[greaterThanKey] = filterList - .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.GREATER_THAN && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2)) + .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.GREATER_THAN && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2, true)) ?.value.toString() ?? filtersForm[greaterThanKey]; filtersForm[negatedKey] = filterList - .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.NOT_EQUAL_TO && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2)) + .find((filter) => filter.operator === CONST.SEARCH.SYNTAX_OPERATORS.NOT_EQUAL_TO && validateAmount(filter.value.toString(), 0, CONST.IOU.AMOUNT_MAX_LENGTH + 2, true)) ?.value.toString() ?? filtersForm[negatedKey]; } diff --git a/tests/unit/Search/SearchQueryUtilsTest.ts b/tests/unit/Search/SearchQueryUtilsTest.ts index 6b6001116118..60fc4c3fa861 100644 --- a/tests/unit/Search/SearchQueryUtilsTest.ts +++ b/tests/unit/Search/SearchQueryUtilsTest.ts @@ -335,6 +335,33 @@ describe('SearchQueryUtils', () => { action: undefined, }); }); + + test('parses negative backend amounts into filter form values', () => { + const policyCategories = {}; + const policyTags = {}; + const currencyList = {}; + const personalDetails = {}; + const cardList = {}; + const reports = {}; + const taxRates = {}; + + const queryString = 'sortBy:date sortOrder:desc type:expense amount<-12345 amount>-67890 amount:-54321'; + const queryJSON = buildSearchQueryJSON(queryString); + + if (!queryJSON) { + throw new Error('Failed to parse query string'); + } + + const result = buildFilterFormValuesFromQuery(queryJSON, policyCategories, policyTags, currencyList, personalDetails, cardList, reports, taxRates); + + expect(result).toEqual({ + type: 'expense', + status: CONST.SEARCH.STATUS.EXPENSE.ALL, + amountLessThan: '-12345', + amountGreaterThan: '-67890', + amountEqualTo: '-54321', + }); + }); }); describe('shouldHighlight', () => {