From 2c99c4ef7fe65867c479cfc0b7a5e0e09e62d518 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Mon, 11 May 2026 16:47:28 -0700 Subject: [PATCH 1/6] Add CreditCardWithPlane icon asset --- assets/images/credit-card-with-plane.svg | 1 + src/components/Icon/chunks/expensify-icons.chunk.ts | 2 ++ 2 files changed, 3 insertions(+) create mode 100644 assets/images/credit-card-with-plane.svg diff --git a/assets/images/credit-card-with-plane.svg b/assets/images/credit-card-with-plane.svg new file mode 100644 index 000000000000..430fee1b3a3d --- /dev/null +++ b/assets/images/credit-card-with-plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Icon/chunks/expensify-icons.chunk.ts b/src/components/Icon/chunks/expensify-icons.chunk.ts index 441af58e797c..655ac4c4c80b 100644 --- a/src/components/Icon/chunks/expensify-icons.chunk.ts +++ b/src/components/Icon/chunks/expensify-icons.chunk.ts @@ -70,6 +70,7 @@ import Copy from '@assets/images/copy.svg'; import CreditCardExclamation from '@assets/images/credit-card-exclamation.svg'; import CreditCardHourglass from '@assets/images/credit-card-hourglass.svg'; import CreditCardLock from '@assets/images/credit-card-lock.svg'; +import CreditCardWithPlane from '@assets/images/credit-card-with-plane.svg'; import CreditCard from '@assets/images/creditcard.svg'; import Crop from '@assets/images/crop.svg'; import Crosshair from '@assets/images/crosshair.svg'; @@ -321,6 +322,7 @@ const Expensicons = { CreditCardHourglass, CreditCardExclamation, CreditCardLock, + CreditCardWithPlane, CircleSlash, Document, DocumentMerge, From c7b95a35b900df54abdd93cdd609dd1f075a3c8d Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Mon, 11 May 2026 17:21:33 -0700 Subject: [PATCH 2/6] Use CreditCardWithPlane icon and Central Invoicing tooltip for travel invoicing expenses --- .../TransactionItemRow/DataCells/TypeCell.tsx | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/components/TransactionItemRow/DataCells/TypeCell.tsx b/src/components/TransactionItemRow/DataCells/TypeCell.tsx index 497278ff82eb..e11aa8964391 100644 --- a/src/components/TransactionItemRow/DataCells/TypeCell.tsx +++ b/src/components/TransactionItemRow/DataCells/TypeCell.tsx @@ -8,6 +8,7 @@ import useLocalize from '@hooks/useLocalize'; import useOnyx from '@hooks/useOnyx'; import useTheme from '@hooks/useTheme'; import useThemeStyles from '@hooks/useThemeStyles'; +import {isTravelCard} from '@libs/CardUtils'; import {getExpenseTypeTranslationKey, getTransactionType, isExpensifyCardTransaction, isManagedCardTransaction, isPending} from '@libs/TransactionUtils'; import variables from '@styles/variables'; import CONST from '@src/CONST'; @@ -16,13 +17,18 @@ import type IconAsset from '@src/types/utils/IconAsset'; import type TransactionDataCellProps from './TransactionDataCellProps'; const getTypeIcon = ( - icons: Record<'Car' | 'CreditCard' | 'CreditCardLock' | 'ExpensifyCard' | 'Cash' | 'Clock' | 'CalendarSolid', IconAsset>, + icons: Record<'Car' | 'CreditCard' | 'CreditCardLock' | 'CreditCardWithPlane' | 'ExpensifyCard' | 'Cash' | 'Clock' | 'CalendarSolid', IconAsset>, type?: string, isExpensifyCard?: boolean, isManagedCard?: boolean, + isTravelInvoicingCard?: boolean, ) => { switch (type) { case CONST.SEARCH.TRANSACTION_TYPE.CARD: + // Travel invoicing cards are technically Expensify-issued (bank === EXPENSIFY_CARD.BANK), so this branch must come before the isExpensifyCard branch. + if (isTravelInvoicingCard) { + return icons.CreditCardWithPlane; + } if (isExpensifyCard) { return icons.ExpensifyCard; } @@ -46,12 +52,23 @@ function TypeCell({transactionItem, shouldUseNarrowLayout, shouldShowTooltip}: T const {translate} = useLocalize(); const [card] = useOnyx(ONYXKEYS.CARD_LIST, {selector: (cardList) => (transactionItem.cardID ? cardList?.[transactionItem.cardID] : undefined)}); const theme = useTheme(); - const expensifyIcons = useMemoizedLazyExpensifyIcons(['Car', 'CreditCard', 'CreditCardLock', 'ExpensifyCard', 'ExpensifyCardHourglass', 'Cash', 'Clock', 'CalendarSolid']); + const expensifyIcons = useMemoizedLazyExpensifyIcons([ + 'Car', + 'CreditCard', + 'CreditCardLock', + 'CreditCardWithPlane', + 'ExpensifyCard', + 'ExpensifyCardHourglass', + 'Cash', + 'Clock', + 'CalendarSolid', + ]); const type = getTransactionType(transactionItem, card); const isExpensifyCard = isExpensifyCardTransaction(transactionItem); const isManagedCard = isManagedCardTransaction(transactionItem); - const isPendingExpensifyCardTransaction = isExpensifyCard && isPending(transactionItem); - const typeIcon = isPendingExpensifyCardTransaction ? expensifyIcons.ExpensifyCardHourglass : getTypeIcon(expensifyIcons, type, isExpensifyCard, isManagedCard); + const isTravelInvoicingCard = isTravelCard(card); + const isPendingExpensifyCardTransaction = isExpensifyCard && isPending(transactionItem) && !isTravelInvoicingCard; + const typeIcon = isPendingExpensifyCardTransaction ? expensifyIcons.ExpensifyCardHourglass : getTypeIcon(expensifyIcons, type, isExpensifyCard, isManagedCard, isTravelInvoicingCard); const typeText = isPendingExpensifyCardTransaction ? 'iou.pending' : getExpenseTypeTranslationKey(type); const styles = useThemeStyles(); @@ -59,6 +76,9 @@ function TypeCell({transactionItem, shouldUseNarrowLayout, shouldShowTooltip}: T if (isPendingExpensifyCardTransaction) { return translate('iou.pending'); } + if (isTravelInvoicingCard) { + return translate('cardTransactions.centralInvoicing'); + } if (isExpensifyCard) { return translate('cardTransactions.expensifyCard'); } From 666c8b92b7772e120cdf69873d25f3e6b9511e8e Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Mon, 11 May 2026 18:01:01 -0700 Subject: [PATCH 3/6] Use 'Travel Card' tooltip copy for travel invoicing expense rows --- src/components/TransactionItemRow/DataCells/TypeCell.tsx | 2 +- src/languages/en.ts | 1 + src/languages/es.ts | 1 + 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/TransactionItemRow/DataCells/TypeCell.tsx b/src/components/TransactionItemRow/DataCells/TypeCell.tsx index e11aa8964391..4a664596b3c4 100644 --- a/src/components/TransactionItemRow/DataCells/TypeCell.tsx +++ b/src/components/TransactionItemRow/DataCells/TypeCell.tsx @@ -77,7 +77,7 @@ function TypeCell({transactionItem, shouldUseNarrowLayout, shouldShowTooltip}: T return translate('iou.pending'); } if (isTravelInvoicingCard) { - return translate('cardTransactions.centralInvoicing'); + return translate('cardTransactions.travelCard'); } if (isExpensifyCard) { return translate('cardTransactions.expensifyCard'); diff --git a/src/languages/en.ts b/src/languages/en.ts index d0ea18c22157..8edcd2d6ed16 100644 --- a/src/languages/en.ts +++ b/src/languages/en.ts @@ -8223,6 +8223,7 @@ const translations = { companyCard: 'Company card', expensifyCard: 'Expensify Card', centralInvoicing: 'Central invoicing', + travelCard: 'Travel Card', }, distance: { addStop: 'Add stop', diff --git a/src/languages/es.ts b/src/languages/es.ts index df13b4beed60..6f62d1786884 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -8498,6 +8498,7 @@ ${amount} para ${merchant} - ${date}`, companyCard: 'Tarjeta corporativa', expensifyCard: 'Tarjeta Expensify', centralInvoicing: 'Facturación centralizada', + travelCard: 'Tarjeta de viaje', }, distance: { addStop: 'Añadir parada', From 1d5f6994c8f525e3fa93270da17ba3a74e4eeec0 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Mon, 11 May 2026 18:05:44 -0700 Subject: [PATCH 4/6] update translations --- src/languages/de.ts | 1 + src/languages/es.ts | 16 ---------------- src/languages/fr.ts | 1 + src/languages/it.ts | 1 + src/languages/ja.ts | 1 + src/languages/nl.ts | 1 + src/languages/pl.ts | 1 + src/languages/pt-BR.ts | 1 + src/languages/zh-hans.ts | 1 + 9 files changed, 8 insertions(+), 16 deletions(-) diff --git a/src/languages/de.ts b/src/languages/de.ts index 6086836ef955..18d0cbe2d2a9 100644 --- a/src/languages/de.ts +++ b/src/languages/de.ts @@ -8228,6 +8228,7 @@ Fügen Sie weitere Ausgabelimits hinzu, um den Cashflow Ihres Unternehmens zu sc companyCard: 'Firmenkarte', expensifyCard: 'Expensify Karte', centralInvoicing: 'Zentrale Rechnungsstellung', + travelCard: 'Reisekarte', }, distance: { addStop: 'Stopp hinzufügen', diff --git a/src/languages/es.ts b/src/languages/es.ts index 6f62d1786884..0f4251dfa7f9 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1687,10 +1687,8 @@ const translations: TranslationDeepObject = { backdropLabel: 'Fondo del Modal', }, nextStep: { - /* eslint-disable @typescript-eslint/no-unused-vars */ message: { [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_ADD_TRANSACTIONS]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que añadas gastos.`; @@ -1701,7 +1699,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_SUBMIT]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que envíes los gastos.`; @@ -1713,7 +1710,6 @@ const translations: TranslationDeepObject = { }, [CONST.NEXT_STEP.MESSAGE_KEY.NO_FURTHER_ACTION]: (_actor, _actorType, _eta, _etaType) => `¡No se requiere ninguna acción adicional!`, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_SUBMITTER_ACCOUNT]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que añadas una cuenta bancaria.`; @@ -1728,7 +1724,6 @@ const translations: TranslationDeepObject = { if (eta) { formattedETA = etaType === CONST.NEXT_STEP.ETA_TYPE.DATE_TIME ? ` el ${eta} de cada mes` : ` ${eta}`; } - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que tus gastos se envíen automáticamente${formattedETA}.`; @@ -1739,7 +1734,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_FIX_ISSUES]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que soluciones ellos problemas.`; @@ -1750,7 +1744,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_APPROVE]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que apruebes los gastos.`; @@ -1761,7 +1754,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_EXPORT]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que exportes este informe.`; @@ -1772,7 +1764,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_PAY]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que pagues los gastos.`; @@ -1783,7 +1774,6 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_POLICY_BANK_ACCOUNT]: (actor, actorType, _eta, _etaType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que termines de configurar una cuenta bancaria de empresa.`; @@ -1803,7 +1793,6 @@ const translations: TranslationDeepObject = { [CONST.NEXT_STEP.MESSAGE_KEY.SUBMITTING_TO_SELF]: (_actor, _actorType, _eta, _etaType) => `¡Ups! Parece que estás enviando el informe a ti mismo. Aprobar tus propios informes está prohibido por tu espacio de trabajo. Por favor, envía este informe a otra persona o contacta a tu administrador para cambiar la persona a la que lo envías.`, [CONST.NEXT_STEP.MESSAGE_KEY.REJECTED_REPORT]: (actor, actorType) => { - // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Este informe fue rechazado. Esperando a que corrijas los problemas y lo vuelvas a enviar manualmente.`; @@ -2458,7 +2447,6 @@ ${amount} para ${merchant} - ${date}`, two: 'º', few: 'º', other: 'º', - /* eslint-disable @typescript-eslint/naming-convention */ '1': 'Primero', '2': 'Segundo', '3': 'Tercero', @@ -2469,7 +2457,6 @@ ${amount} para ${merchant} - ${date}`, '8': 'Octavo', '9': 'Noveno', '10': 'Décimo', - /* eslint-enable @typescript-eslint/naming-convention */ }, }, approverInMultipleWorkflows: 'Este miembro ya pertenece a otro flujo de aprobación. Cualquier actualización aquí se reflejará allí también.', @@ -6923,7 +6910,6 @@ ${amount} para ${merchant} - ${date}`, restrictedDescription: 'Sólo las personas en tu espacio de trabajo pueden encontrar esta sala', privateDescription: 'Sólo las personas que están invitadas a esta sala pueden encontrarla', publicDescription: 'Cualquier persona puede unirse a esta sala', - // eslint-disable-next-line @typescript-eslint/naming-convention public_announceDescription: 'Cualquier persona puede unirse a esta sala', createRoom: 'Crea una sala de chat', roomAlreadyExistsError: 'Ya existe una sala con este nombre', @@ -6943,7 +6929,6 @@ ${amount} para ${merchant} - ${date}`, restricted: 'Espacio de trabajo', private: 'Privada', public: 'Público', - // eslint-disable-next-line @typescript-eslint/naming-convention public_announce: 'Anuncio Público', }, }, @@ -7258,7 +7243,6 @@ ${amount} para ${merchant} - ${date}`, updatedDefaultTitle: (newDefaultTitle, oldDefaultTitle) => `cambió la fórmula personalizada del nombre del informe a "${newDefaultTitle}" (previamente "${oldDefaultTitle}")`, updatedOwnership: (oldOwnerEmail, oldOwnerName, policyName) => `asumió la propiedad del espacio de trabajo ${policyName} de ${oldOwnerName} (${oldOwnerEmail})`, updatedAutoHarvesting: (enabled) => `${enabled ? 'habilitó' : 'deshabilitó'} el envío programado`, - // eslint-disable-next-line @typescript-eslint/max-params updatedIndividualBudgetNotification: ( budgetAmount, budgetFrequency, diff --git a/src/languages/fr.ts b/src/languages/fr.ts index b98594c39617..51139e4ed142 100644 --- a/src/languages/fr.ts +++ b/src/languages/fr.ts @@ -8250,6 +8250,7 @@ Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’e companyCard: 'Carte d’entreprise', expensifyCard: 'Carte Expensify', centralInvoicing: 'Facturation centralisée', + travelCard: 'Carte de voyage', }, distance: { addStop: 'Ajouter un arrêt', diff --git a/src/languages/it.ts b/src/languages/it.ts index 0b66570b8b53..058aa38ae273 100644 --- a/src/languages/it.ts +++ b/src/languages/it.ts @@ -8219,6 +8219,7 @@ Aggiungi altre regole di spesa per proteggere il flusso di cassa aziendale.`, companyCard: 'Carta aziendale', expensifyCard: 'Carta Expensify', centralInvoicing: 'Fatturazione centralizzata', + travelCard: 'Carta Viaggio', }, distance: { addStop: 'Aggiungi fermata', diff --git a/src/languages/ja.ts b/src/languages/ja.ts index 1683c08da18c..d90d8c89be68 100644 --- a/src/languages/ja.ts +++ b/src/languages/ja.ts @@ -8118,6 +8118,7 @@ ${reportName} companyCard: '会社カード', expensifyCard: 'Expensify カード', centralInvoicing: '集中請求', + travelCard: 'トラベルカード', }, distance: { addStop: '経由地を追加', diff --git a/src/languages/nl.ts b/src/languages/nl.ts index c6282c9c1c67..8449bd647cb0 100644 --- a/src/languages/nl.ts +++ b/src/languages/nl.ts @@ -8191,6 +8191,7 @@ er bestedingsregels toe om de kasstroom van het bedrijf te beschermen.`, companyCard: 'Bedrijfskaart', expensifyCard: 'Expensify Kaart', centralInvoicing: 'Gecentraliseerde facturatie', + travelCard: 'Reiskaart', }, distance: { addStop: 'Stop toevoegen', diff --git a/src/languages/pl.ts b/src/languages/pl.ts index 5851baebfa38..907beeb4b93e 100644 --- a/src/languages/pl.ts +++ b/src/languages/pl.ts @@ -8182,6 +8182,7 @@ Dodaj więcej zasad wydatków, żeby chronić płynność finansową firmy.`, companyCard: 'Karta firmowa', expensifyCard: 'Karta Expensify', centralInvoicing: 'Centralne fakturowanie', + travelCard: 'Karta podróżna', }, distance: { addStop: 'Dodaj przystanek', diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts index 7363495a4bf1..0ec02994ee10 100644 --- a/src/languages/pt-BR.ts +++ b/src/languages/pt-BR.ts @@ -8185,6 +8185,7 @@ Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`, companyCard: 'Cartão corporativo', expensifyCard: 'Cartão Expensify', centralInvoicing: 'Faturamento centralizado', + travelCard: 'Cartão de viagem', }, distance: { addStop: 'Adicionar parada', diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts index bbdbba71b06d..77282193d29c 100644 --- a/src/languages/zh-hans.ts +++ b/src/languages/zh-hans.ts @@ -7982,6 +7982,7 @@ ${reportName} companyCard: '公司卡', expensifyCard: 'Expensify 卡', centralInvoicing: '集中开票', + travelCard: '旅行卡', }, distance: { addStop: '添加站点', From 267bceb2606421f10f24938d50d3cdf7af6415f3 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Mon, 11 May 2026 18:48:37 -0700 Subject: [PATCH 5/6] Restore eslint-disable comments in es.ts nextStep block --- src/languages/es.ts | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/languages/es.ts b/src/languages/es.ts index 0f4251dfa7f9..6f62d1786884 100644 --- a/src/languages/es.ts +++ b/src/languages/es.ts @@ -1687,8 +1687,10 @@ const translations: TranslationDeepObject = { backdropLabel: 'Fondo del Modal', }, nextStep: { + /* eslint-disable @typescript-eslint/no-unused-vars */ message: { [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_ADD_TRANSACTIONS]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que añadas gastos.`; @@ -1699,6 +1701,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_SUBMIT]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que envíes los gastos.`; @@ -1710,6 +1713,7 @@ const translations: TranslationDeepObject = { }, [CONST.NEXT_STEP.MESSAGE_KEY.NO_FURTHER_ACTION]: (_actor, _actorType, _eta, _etaType) => `¡No se requiere ninguna acción adicional!`, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_SUBMITTER_ACCOUNT]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que añadas una cuenta bancaria.`; @@ -1724,6 +1728,7 @@ const translations: TranslationDeepObject = { if (eta) { formattedETA = etaType === CONST.NEXT_STEP.ETA_TYPE.DATE_TIME ? ` el ${eta} de cada mes` : ` ${eta}`; } + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que tus gastos se envíen automáticamente${formattedETA}.`; @@ -1734,6 +1739,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_FIX_ISSUES]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que soluciones ellos problemas.`; @@ -1744,6 +1750,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_APPROVE]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que apruebes los gastos.`; @@ -1754,6 +1761,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_EXPORT]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que exportes este informe.`; @@ -1764,6 +1772,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_TO_PAY]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que pagues los gastos.`; @@ -1774,6 +1783,7 @@ const translations: TranslationDeepObject = { } }, [CONST.NEXT_STEP.MESSAGE_KEY.WAITING_FOR_POLICY_BANK_ACCOUNT]: (actor, actorType, _eta, _etaType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Esperando a que termines de configurar una cuenta bancaria de empresa.`; @@ -1793,6 +1803,7 @@ const translations: TranslationDeepObject = { [CONST.NEXT_STEP.MESSAGE_KEY.SUBMITTING_TO_SELF]: (_actor, _actorType, _eta, _etaType) => `¡Ups! Parece que estás enviando el informe a ti mismo. Aprobar tus propios informes está prohibido por tu espacio de trabajo. Por favor, envía este informe a otra persona o contacta a tu administrador para cambiar la persona a la que lo envías.`, [CONST.NEXT_STEP.MESSAGE_KEY.REJECTED_REPORT]: (actor, actorType) => { + // eslint-disable-next-line default-case switch (actorType) { case CONST.NEXT_STEP.ACTOR_TYPE.CURRENT_USER: return `Este informe fue rechazado. Esperando a que corrijas los problemas y lo vuelvas a enviar manualmente.`; @@ -2447,6 +2458,7 @@ ${amount} para ${merchant} - ${date}`, two: 'º', few: 'º', other: 'º', + /* eslint-disable @typescript-eslint/naming-convention */ '1': 'Primero', '2': 'Segundo', '3': 'Tercero', @@ -2457,6 +2469,7 @@ ${amount} para ${merchant} - ${date}`, '8': 'Octavo', '9': 'Noveno', '10': 'Décimo', + /* eslint-enable @typescript-eslint/naming-convention */ }, }, approverInMultipleWorkflows: 'Este miembro ya pertenece a otro flujo de aprobación. Cualquier actualización aquí se reflejará allí también.', @@ -6910,6 +6923,7 @@ ${amount} para ${merchant} - ${date}`, restrictedDescription: 'Sólo las personas en tu espacio de trabajo pueden encontrar esta sala', privateDescription: 'Sólo las personas que están invitadas a esta sala pueden encontrarla', publicDescription: 'Cualquier persona puede unirse a esta sala', + // eslint-disable-next-line @typescript-eslint/naming-convention public_announceDescription: 'Cualquier persona puede unirse a esta sala', createRoom: 'Crea una sala de chat', roomAlreadyExistsError: 'Ya existe una sala con este nombre', @@ -6929,6 +6943,7 @@ ${amount} para ${merchant} - ${date}`, restricted: 'Espacio de trabajo', private: 'Privada', public: 'Público', + // eslint-disable-next-line @typescript-eslint/naming-convention public_announce: 'Anuncio Público', }, }, @@ -7243,6 +7258,7 @@ ${amount} para ${merchant} - ${date}`, updatedDefaultTitle: (newDefaultTitle, oldDefaultTitle) => `cambió la fórmula personalizada del nombre del informe a "${newDefaultTitle}" (previamente "${oldDefaultTitle}")`, updatedOwnership: (oldOwnerEmail, oldOwnerName, policyName) => `asumió la propiedad del espacio de trabajo ${policyName} de ${oldOwnerName} (${oldOwnerEmail})`, updatedAutoHarvesting: (enabled) => `${enabled ? 'habilitó' : 'deshabilitó'} el envío programado`, + // eslint-disable-next-line @typescript-eslint/max-params updatedIndividualBudgetNotification: ( budgetAmount, budgetFrequency, From f168c90bd745dfc4b6e9866d6a11984aadd47a52 Mon Sep 17 00:00:00 2001 From: Ben Limpich Date: Tue, 12 May 2026 09:43:38 -0700 Subject: [PATCH 6/6] Use CreditCardWithPlaneHourglass for pending travel-card expenses --- assets/images/credit-card-with-plane-hourglass.svg | 1 + src/components/Icon/chunks/expensify-icons.chunk.ts | 2 ++ src/components/TransactionItemRow/DataCells/TypeCell.tsx | 6 ++++-- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 assets/images/credit-card-with-plane-hourglass.svg diff --git a/assets/images/credit-card-with-plane-hourglass.svg b/assets/images/credit-card-with-plane-hourglass.svg new file mode 100644 index 000000000000..a9f6de384df7 --- /dev/null +++ b/assets/images/credit-card-with-plane-hourglass.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/components/Icon/chunks/expensify-icons.chunk.ts b/src/components/Icon/chunks/expensify-icons.chunk.ts index b7de0c018bb2..75f8f56a9949 100644 --- a/src/components/Icon/chunks/expensify-icons.chunk.ts +++ b/src/components/Icon/chunks/expensify-icons.chunk.ts @@ -69,6 +69,7 @@ import Copy from '@assets/images/copy.svg'; import CreditCardExclamation from '@assets/images/credit-card-exclamation.svg'; import CreditCardHourglass from '@assets/images/credit-card-hourglass.svg'; import CreditCardLock from '@assets/images/credit-card-lock.svg'; +import CreditCardWithPlaneHourglass from '@assets/images/credit-card-with-plane-hourglass.svg'; import CreditCardWithPlane from '@assets/images/credit-card-with-plane.svg'; import CreditCard from '@assets/images/creditcard.svg'; import Crop from '@assets/images/crop.svg'; @@ -321,6 +322,7 @@ const Expensicons = { CreditCardExclamation, CreditCardLock, CreditCardWithPlane, + CreditCardWithPlaneHourglass, CircleSlash, Document, DocumentMerge, diff --git a/src/components/TransactionItemRow/DataCells/TypeCell.tsx b/src/components/TransactionItemRow/DataCells/TypeCell.tsx index 4a664596b3c4..99f65de01e1c 100644 --- a/src/components/TransactionItemRow/DataCells/TypeCell.tsx +++ b/src/components/TransactionItemRow/DataCells/TypeCell.tsx @@ -57,6 +57,7 @@ function TypeCell({transactionItem, shouldUseNarrowLayout, shouldShowTooltip}: T 'CreditCard', 'CreditCardLock', 'CreditCardWithPlane', + 'CreditCardWithPlaneHourglass', 'ExpensifyCard', 'ExpensifyCardHourglass', 'Cash', @@ -67,8 +68,9 @@ function TypeCell({transactionItem, shouldUseNarrowLayout, shouldShowTooltip}: T const isExpensifyCard = isExpensifyCardTransaction(transactionItem); const isManagedCard = isManagedCardTransaction(transactionItem); const isTravelInvoicingCard = isTravelCard(card); - const isPendingExpensifyCardTransaction = isExpensifyCard && isPending(transactionItem) && !isTravelInvoicingCard; - const typeIcon = isPendingExpensifyCardTransaction ? expensifyIcons.ExpensifyCardHourglass : getTypeIcon(expensifyIcons, type, isExpensifyCard, isManagedCard, isTravelInvoicingCard); + const isPendingExpensifyCardTransaction = isExpensifyCard && isPending(transactionItem); + const pendingIcon = isTravelInvoicingCard ? expensifyIcons.CreditCardWithPlaneHourglass : expensifyIcons.ExpensifyCardHourglass; + const typeIcon = isPendingExpensifyCardTransaction ? pendingIcon : getTypeIcon(expensifyIcons, type, isExpensifyCard, isManagedCard, isTravelInvoicingCard); const typeText = isPendingExpensifyCardTransaction ? 'iou.pending' : getExpenseTypeTranslationKey(type); const styles = useThemeStyles();