Add Status column to Expensify Card table#95651
Conversation
Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
🦜 Polyglot Parrot! 🦜Squawk! Looks like you added some shiny new English strings. Allow me to parrot them back to you in other tongues: View the translation diffdiff --git a/src/languages/de.ts b/src/languages/de.ts
index 5cc68dbd72e..d0377158724 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5735,7 +5734,7 @@ _Für ausführlichere Anweisungen [besuchen Sie unsere Hilfeseite](${CONST.NETSU
newCard: 'Neue Karte',
name: 'Name',
lastFour: 'Letzte 4',
- statusPendingOrder: 'Bestellung ausstehend',
+ statusPendingOrder: 'Ausstehende Bestellung',
statusShipped: 'Versendet',
statusActive: 'Aktiv',
statusInactive: 'Inaktiv',
diff --git a/src/languages/es.ts b/src/languages/es.ts
index d38fad624b2..2fcbd5c9037 100644
--- a/src/languages/es.ts
+++ b/src/languages/es.ts
@@ -1,6 +1,3 @@
-import CONST from '@src/CONST';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -12,12 +9,14 @@ import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import CONST from '@src/CONST';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import type en from './en';
import type {ConciergeBrokenCardConnectionParams, PaidElsewhereParams, RemoveCopilotAccessConfirmationParams, UnsupportedFormulaValueErrorParams} from './params';
import type {TranslationDeepObject} from './types';
-
const translations: TranslationDeepObject<typeof en> = {
common: {
count: 'Contar',
@@ -5558,9 +5557,9 @@ ${amount} para ${merchant} - ${date}`,
name: 'Nombre',
lastFour: '4 últimos',
statusPendingOrder: 'Pedido pendiente',
- statusShipped: 'Enviada',
- statusActive: 'Activa',
- statusInactive: 'Inactiva',
+ statusShipped: 'Enviado',
+ statusActive: 'Activo',
+ statusInactive: 'Inactivo',
limit: 'Limite',
currentBalance: 'Saldo actual',
currentBalanceDescription:
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index 4d1fb3726ea..34876d68ec1 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5746,9 +5745,9 @@ _Pour des instructions plus détaillées, [visitez notre site d’aide](${CONST.
newCard: 'Nouvelle carte',
name: 'Nom',
statusPendingOrder: 'Commande en attente',
- statusShipped: 'Expédiée',
- statusActive: 'Active',
- statusInactive: 'Inactive',
+ statusShipped: 'Expédié',
+ statusActive: 'Actif',
+ statusInactive: 'Inactif',
lastFour: '4 derniers',
limit: 'Limite',
currentBalance: 'Solde actuel',
diff --git a/src/languages/it.ts b/src/languages/it.ts
index 3ed4e2702f5..d4dd20ccfd5 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5715,10 +5714,10 @@ _Per istruzioni più dettagliate, [visita il nostro sito di assistenza](${CONST.
newCard: 'Nuova carta',
name: 'Nome',
lastFour: 'Ultime 4',
- statusPendingOrder: 'Ordine in attesa',
- statusShipped: 'Spedita',
- statusActive: 'Attiva',
- statusInactive: 'Inattiva',
+ statusPendingOrder: 'Ordine in sospeso',
+ statusShipped: 'Spedito',
+ statusActive: 'Attivo',
+ statusInactive: 'Inattivo',
limit: 'Limite',
currentBalance: 'Saldo attuale',
currentBalanceDescription: 'Il saldo attuale è la somma di tutte le transazioni contabilizzate della Carta Expensify che si sono verificate dalla data dell’ultima liquidazione.',
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 2a14471188b..3fb1261bed0 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5655,7 +5654,7 @@ _詳しい手順については、[ヘルプサイトをご覧ください](${CO
newCard: '新しいカード',
name: '名前',
lastFour: '下4桁',
- statusPendingOrder: '注文待ち',
+ statusPendingOrder: '保留中の注文',
statusShipped: '発送済み',
statusActive: '有効',
statusInactive: '無効',
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 193d9520a93..8a75bbd745b 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5705,7 +5704,7 @@ _Voor meer gedetailleerde instructies, [bezoek onze help-site](${CONST.NETSUITE_
newCard: 'Nieuwe kaart',
name: 'Naam',
lastFour: 'Laatste 4',
- statusPendingOrder: 'Bestelling in behandeling',
+ statusPendingOrder: 'In afwachting bestelling',
statusShipped: 'Verzonden',
statusActive: 'Actief',
statusInactive: 'Inactief',
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index a4346cb9f78..1d724c5d731 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5689,9 +5688,9 @@ _Aby uzyskać bardziej szczegółowe instrukcje, [odwiedź naszą stronę pomocy
name: 'Nazwa',
lastFour: 'Ostatnie 4',
statusPendingOrder: 'Oczekujące zamówienie',
- statusShipped: 'Wysłana',
- statusActive: 'Aktywna',
- statusInactive: 'Nieaktywna',
+ statusShipped: 'Wysłano',
+ statusActive: 'Aktywne',
+ statusInactive: 'Nieaktywne',
limit: 'Limit',
currentBalance: 'Bieżące saldo',
currentBalanceDescription: 'Bieżące saldo to suma wszystkich zaksięgowanych transakcji Kartą Expensify, które miały miejsce od ostatniej daty rozliczenia.',
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index cb0b631d0bc..7aa6cc9b78c 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index 7176d00883b..a40538b4f4b 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -1,13 +1,3 @@
-import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
-import StringUtils from '@libs/StringUtils';
-
-import CONST from '@src/CONST';
-import type {Country} from '@src/CONST';
-import type OriginalMessage from '@src/types/onyx/OriginalMessage';
-import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
-
-import type {ValueOf} from 'type-fest';
-
/**
* _____ __ __
* / ___/__ ___ ___ _______ _/ /____ ___/ /
@@ -19,6 +9,16 @@ import type {ValueOf} from 'type-fest';
* - Improve the prompts in prompts/translation, or
* - Improve context annotations in src/languages/en.ts
*/
+import type {OnboardingTask} from '@libs/actions/Welcome/OnboardingFlow';
+import StringUtils from '@libs/StringUtils';
+
+import CONST from '@src/CONST';
+import type {Country} from '@src/CONST';
+import type OriginalMessage from '@src/types/onyx/OriginalMessage';
+import type {OriginalMessageSettlementAccountLocked, PersonalRulesModifiedFields, PolicyRulesModifiedFields} from '@src/types/onyx/OriginalMessage';
+
+import type {ValueOf} from 'type-fest';
+
import {CONST as COMMON_CONST, Str} from 'expensify-common';
import startCase from 'lodash/startCase';
@@ -63,7 +63,6 @@ import type {
YourPlanPriceParams,
} from './params';
import type {TranslationDeepObject} from './types';
-
type StateValue = {
stateISO: string;
stateName: string;
@@ -5544,10 +5543,10 @@ _如需更详细的说明,请[访问我们的帮助网站](${CONST.NETSUITE_IM
newCard: '新卡片',
name: '姓名',
lastFour: '最后 4 位',
- statusPendingOrder: '待下单',
+ statusPendingOrder: '待处理订单',
statusShipped: '已发货',
- statusActive: '有效',
- statusInactive: '无效',
+ statusActive: '启用',
+ statusInactive: '未启用',
limit: '限额',
currentBalance: '当前余额',
currentBalanceDescription: '当前余额是上次结算日期以来已入账的所有 Expensify 卡交易的总和。',
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report✅ Changes either increased or maintained existing code coverage, great job!
|
|
@hoangzinh Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
@joekaufmanexpensify do you have a workspace with ECards you could add me on as an admin for testing? Thanks! |
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
This comment has been minimized.
This comment has been minimized.
|
🤖 I analyzed the failing checks. The only failing check is What happened: The Why it's not this PR:
What to do: This is the PR Author Checklist gate, which stays red until a human co-author fills out the checklist boxes in the PR description — so there's nothing for me to commit here. Once the co-author checks the boxes and the checklist action re-runs (picking up the template cleanly), it'll go green. |
|
@joekaufmanexpensify is leading this one. |
Yep, I just added shawn@cardtest.expensify.com as an admin for the cardtest.expensify.com card feed workspace. If you try logging in to that Expensify account, the magic code should be sent to your real email by default. Let me know if you run into any issues. |
|
@MelvinBot can you make the status column use the same width as the Limit type column? |
Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
Done — pushed What I changed: Both the Status and Limit type columns were already configured identically (each takes a The fix adds
Local checks pass on the changed files: One caveat: I couldn't visually confirm the result myself since I don't have access to a workspace with Expensify Cards. Please double-check on the next adhoc build — if the two columns still don't match, let me know and I can pin both to an explicit equal width instead. |
|
@chuckdries Please copy/paste the Reviewer Checklist from here into a new comment on this PR and complete it. If you have the K2 extension, you can simply click: [this button] |
|
I analyzed the checks on this PR. All CI checks pass except one — and that one isn't a code failure. The only failing check is
This check has no code fix — it fails simply because the PR Author Checklist boxes in the description are still unchecked (they're intentionally left for the human co-author). It's also affected by the runner not being able to verify engineering membership for Every actual code/build/test check is green: What's needed to make it pass: |
|
🚧 shawnborton has triggered a test Expensify/App build. You can view the workflow run here. |
sure @shawnborton |
Reviewer Checklist
Screenshots/VideosMacOS: Chrome / SafariScreen.Recording.2026-07-10.at.05.34.38.mov |
|
🤖 No new action needed — the check state is unchanged since my earlier comments. The only failing check is The checklist job fails for two reasons, neither fixable by a code push:
To clear it: |
|
@shawnborton can you review the design in the recording below? Screen.Recording.2026-07-09.at.22.04.51.mov |
|
Looks good to me 👍 |
@joekaufmanexpensify @shawnborton When there is a card that does not fall into the above cases (e.g., bad data or a virtual card that somehow has the status |
| sortable: true, | ||
| styling: { | ||
| // minWidth: 0 lets the grid track size purely from its 1fr share instead of the cell content, | ||
| // so the Limit type and Status columns always render at the same width. |
There was a problem hiding this comment.
@shawnborton do you agree with this: "Limit type and Status columns always render at the same width."
There was a problem hiding this comment.
Yeah I had asked it to do that, so that this way those columns are a bit smaller than the name column.
I think I agree with that, let's see what Joe thinks! |
Yep, that's good with me. I don't think we need to force a status in for this situation. Whenever this happens, it would be a bug. |
joekaufmanexpensify
left a comment
There was a problem hiding this comment.
Tested and works well from my perspective. Excited for this!
|
@MelvinBot When there is a card that does not fall into the above cases (e.g., bad data or a virtual card that somehow has the status NOT_ACTIVATED (4)), you are assuming we will default to displaying "Active," but I think we should show the status as an empty string instead. Can you please implement? |
…ulting to Active Co-authored-by: Shawn Borton <shawnborton@users.noreply.github.com>
|
Done — pushed Cards that don't fall into a recognized state now render a blank status instead of defaulting to
Changes
Local checks passing: |
|
Sweet, final review please! |
|
Re-checked after the latest push (
Both are human checklist gates, not something I can fix with code, so I've pushed nothing. To clear them: the author checklist boxes need checking in the description, and the reviewer checklist will clear during the review pass you just requested. No code changes required. |
|
@MelvinBot can you re-add original PR Author Checklist and check-off all checklist please. |
|
Done ✅ — re-added the full original PR Author Checklist (the previous version was truncated, missing items like code patterns, CSS, assets, markdown, Storybook, deeplink, UI/design, and the post-merge re-test) and checked off every item. The rest of the PR description (Explanation, Fixed Issues, Tests, QA, Screenshots sections) was left unchanged. |
|
🚧 chuckdries has triggered a test Expensify/App build. You can view the workflow run here. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/chuckdries in version: 9.4.33-0 🚀
|
📝 Help site update requiredThis PR adds a user-facing Status column to the workspace Expensify Card list (Pending order / Shipped / Active / Inactive, sortable, hidden on narrow/medium screens). The help site's Set-Up-and-Manage-the-Expensify-Card.md article describes the Monitor and Manage Cards list but didn't document this column, so an update is warranted. I created a draft help site PR: #95845 It adds a What the Status column shows in the Expensify Card list section explaining each status, that the column is sortable, and that it's hidden on narrow/medium screens. All labels match the UI strings from this PR ( @shawnborton, please review the linked help site PR and confirm it reflects the current behavior. Then mark the linked help site PR |




Explanation of Change
Adds a Status column to the workspace Expensify Card table so admins can tell a card's lifecycle state at a glance without opening each card.
The status label is derived from
card.state(CONST.EXPENSIFY_CARD.STATE), which is already in Onyx — no backend changes are required. A newgetTranslationKeyForCardStatushelper inCardUtilsmaps state → label, following the existinggetTranslationKeyForLimitTypepattern:STATE_NOT_ISSUED(2), physical onlyNOT_ACTIVATED(4), physical onlyOPEN(3), physical + virtualSTATE_SUSPENDED(7), physical + virtualPending orderandShippedare physical-only states, so a virtual card in one of those states reads asActive. StatesSTATE_DEACTIVATED(5) andCLOSED(6) never reach this table (they're dropped byfilterInactiveCardsForWorkspace), so the default safely resolves toActive.The column is sortable (mirroring
limitTypesorting) and, like the other middle columns, is hidden on narrow/medium screens via the existing!shouldUseNarrowTableLayoutgate — matching the agreed narrow-screen behavior in the issue.Files changed:
src/libs/CardUtils.ts— newgetTranslationKeyForCardStatushelper (+ export)src/components/Tables/WorkspaceExpensifyCardsTable/index.tsx— newstatuscolumn + sort branchsrc/components/Tables/WorkspaceExpensifyCardsTable/WorkspaceExpensifyCardsTableRow.tsx— status cell + accessibility labelsrc/languages/*.ts—statusPendingOrder/statusShipped/statusActive/statusInactivekeys (header reusescommon.status)tests/unit/CardUtilsTest.ts— unit tests for the new helperFixed Issues
$ #95638
PROPOSAL:
Tests
Offline tests
No offline-specific behavior; the status is derived from data already in Onyx.
QA Steps
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectionAvatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari
MacOS: Desktop