Skip to content

Commit f80369b

Browse files
authored
Merge pull request Expensify#90540 from Expensify/claude-fixZeroLimitValidation
Allow $0 as valid card limit when editing Expensify Card
2 parents 5164183 + 203fc76 commit f80369b

3 files changed

Lines changed: 11 additions & 11 deletions

File tree

src/libs/CardUtils.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1060,12 +1060,8 @@ function filterAllInactiveCards(cards: CardList | undefined, includeDeactivated
10601060

10611061
const closedStates = new Set<number>([CONST.EXPENSIFY_CARD.STATE.CLOSED, CONST.EXPENSIFY_CARD.STATE.STATE_DEACTIVATED]);
10621062
return filterObject(cards, (_key, card) => {
1063-
const isAdminZeroedExpensifyCard = isExpensifyCard(card) && isCardWithCustomZeroLimit(card);
10641063
if (card.state === CONST.EXPENSIFY_CARD.STATE.STATE_SUSPENDED) {
1065-
return !!card.nameValuePairs?.frozen || (includeDeactivated && isAdminZeroedExpensifyCard);
1066-
}
1067-
if (card.state === CONST.EXPENSIFY_CARD.STATE.STATE_DEACTIVATED) {
1068-
return includeDeactivated && isAdminZeroedExpensifyCard;
1064+
return !!card.nameValuePairs?.frozen || includeDeactivated;
10691065
}
10701066
return !closedStates.has(card.state);
10711067
});
@@ -1083,7 +1079,7 @@ function filterInactiveCards(cardsList: WorkspaceCardsList | undefined) {
10831079

10841080
/**
10851081
* Onyx selector for workspace Expensify Card management pages. Same as `filterInactiveCards`, but also
1086-
* keeps issued deactivated cards and zero-limit suspended cards so admins can view and edit them.
1082+
* keeps all suspended cards so admins can view and edit them.
10871083
*/
10881084
function filterInactiveCardsForWorkspace(cardsList: WorkspaceCardsList | undefined) {
10891085
const {cardList, ...assignedCards} = cardsList ?? {};

src/pages/workspace/expensifyCard/DynamicExpensifyCardLimitPage.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ function DynamicExpensifyCardLimitPage({route}: DynamicExpensifyCardLimitPagePro
105105
(values: FormOnyxValues<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM>): FormInputErrors<typeof ONYXKEYS.FORMS.EDIT_EXPENSIFY_CARD_LIMIT_FORM> => {
106106
const errors = getFieldRequiredErrors(values, [INPUT_IDS.LIMIT], translate);
107107

108-
if (!Number(values.limit)) {
108+
if (Number.isNaN(Number(values.limit))) {
109109
errors.limit = translate('iou.error.invalidAmount');
110110
} else if (!Number.isInteger(Number(values.limit))) {
111111
errors.limit = translate('iou.error.invalidIntegerAmount');

tests/unit/CardUtilsTest.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3441,10 +3441,12 @@ describe('CardUtils', () => {
34413441
} as unknown as CardList;
34423442

34433443
const ids = Object.values(filterAllInactiveCards(cards, true)).map((c) => c.cardID);
3444-
expect(ids).toEqual(expect.arrayContaining([1, 3, 5]));
3444+
// All suspended cards are kept when includeDeactivated is true (admins can view/edit them)
3445+
expect(ids).toEqual(expect.arrayContaining([1, 5, 6]));
34453446
expect(ids).not.toContain(2);
3447+
// STATE_DEACTIVATED cards are always excluded (server rejects limit updates with 403)
3448+
expect(ids).not.toContain(3);
34463449
expect(ids).not.toContain(4);
3447-
expect(ids).not.toContain(6);
34483450
expect(ids).not.toContain(7);
34493451
expect(ids).not.toContain(8);
34503452
});
@@ -3495,11 +3497,13 @@ describe('CardUtils', () => {
34953497

34963498
const result = filterInactiveCardsForWorkspace(cardsList);
34973499
expect(result.active).toBeDefined();
3498-
expect(result.adminZeroedDeactivated).toBeDefined();
3500+
// All suspended cards are kept so admins can view and edit them
34993501
expect(result.adminZeroedSuspended).toBeDefined();
3502+
expect(result.nonZeroSuspended).toBeDefined();
35003503
expect(result.closed).toBeUndefined();
3504+
// STATE_DEACTIVATED cards are always excluded (server rejects limit updates with 403)
3505+
expect(result.adminZeroedDeactivated).toBeUndefined();
35013506
expect(result.deactivatedNonZero).toBeUndefined();
3502-
expect(result.nonZeroSuspended).toBeUndefined();
35033507
expect(result.deactivatedNoCustomFlag).toBeUndefined();
35043508
expect(result.cardList).toBeDefined();
35053509
});

0 commit comments

Comments
 (0)