Conversation
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
This comment has been minimized.
🦜 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 e8746515..d90913c6 100644
--- a/src/languages/de.ts
+++ b/src/languages/de.ts
@@ -6647,6 +6647,24 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
title: 'Spesenrichtlinie',
cardSubtitle: 'Hier ist die Spesenrichtlinie deines Teams hinterlegt, damit alle denselben Stand haben, was abgedeckt ist.',
},
+ spendRules: {
+ title: 'Ausgaben',
+ subtitle: 'Genehmigen oder lehnen Sie Expensify Karten-Transaktionen in Echtzeit ab.',
+ defaultRuleDescription: 'Alle Karten',
+ block: 'Block',
+ defaultRuleTitle: 'Kategorien: Dienste für Erwachsene, Geldautomaten, Glücksspiel, Geldüberweisungen',
+ builtInProtectionModal: {
+ title: 'Expensify Karten bieten integrierten Schutz – jederzeit',
+ description: `Expensify lehnt diese Belastungen immer ab:
+
+ • Dienstleistungen für Erwachsene
+ • Geldautomaten (ATMs)
+ • Glücksspiel
+ • Geldüberweisungen
+
+Fügen Sie weitere Ausgabenregeln hinzu, um den Cashflow des Unternehmens zu schützen.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7445,7 +7463,14 @@ Fordern Sie Spesendetails wie Belege und Beschreibungen an, legen Sie Limits und
searchIn: 'Suchen in',
searchPlaceholder: 'Nach etwas suchen',
suggestions: 'Vorschläge',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Vorschläge verfügbar${query ? ` für ${query}` : ''}. ${count} Ergebnis.`,
other: (resultCount: number) => `Vorschläge verfügbar${query ? ` für ${query}` : ''}. ${resultCount} Ergebnisse.`,
}),
diff --git a/src/languages/fr.ts b/src/languages/fr.ts
index ef75542d..b95aede4 100644
--- a/src/languages/fr.ts
+++ b/src/languages/fr.ts
@@ -6671,6 +6671,24 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
title: 'Politique de dépenses',
cardSubtitle: 'C’est ici que se trouve la politique de dépenses de votre équipe, pour que tout le monde soit d’accord sur ce qui est couvert.',
},
+ spendRules: {
+ title: 'Dépenser',
+ subtitle: 'Approuvez ou refusez les transactions Carte Expensify en temps réel.',
+ defaultRuleDescription: 'Toutes les cartes',
+ block: 'Bloquer',
+ defaultRuleTitle: 'Catégories : services pour adultes, DAB, jeux d’argent, transferts d’argent',
+ builtInProtectionModal: {
+ title: 'Les Cartes Expensify offrent une protection intégrée – en permanence',
+ description: `Expensify refuse toujours ces types de dépenses :
+
+ • Services pour adultes
+ • DAB
+ • Jeux d’argent
+ • Transferts d’argent
+
+Ajoutez davantage de règles de dépenses pour protéger la trésorerie de l’entreprise.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7469,7 +7487,14 @@ Rendez obligatoires des informations de dépense comme les reçus et les descrip
searchIn: 'Rechercher dans',
searchPlaceholder: 'Rechercher quelque chose',
suggestions: 'Suggestions',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Suggestions disponibles${query ? ` pour ${query}` : ''}. ${count} résultat.`,
other: (resultCount: number) => `Suggestions disponibles${query ? ` pour ${query}` : ''}. ${resultCount} résultats.`,
}),
diff --git a/src/languages/it.ts b/src/languages/it.ts
index edc37919..c43330d9 100644
--- a/src/languages/it.ts
+++ b/src/languages/it.ts
@@ -6634,6 +6634,24 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
title: 'Politica di spesa',
cardSubtitle: 'Qui trovi il regolamento spese del tuo team, così tutti sono allineati su cosa è coperto.',
},
+ spendRules: {
+ title: 'Spesa',
+ subtitle: 'Approva o rifiuta le transazioni della Carta Expensify in tempo reale.',
+ defaultRuleDescription: 'Tutte le carte',
+ block: 'Blocca',
+ defaultRuleTitle: 'Categorie: Servizi per adulti, Bancomat, gioco d’azzardo, trasferimenti di denaro',
+ builtInProtectionModal: {
+ title: 'Le Carte Expensify offrono una protezione integrata, sempre',
+ description: `Expensify rifiuta sempre queste spese:
+
+ • Servizi per adulti
+ • Bancomat
+ • Gioco d’azzardo
+ • Trasferimenti di denaro
+
+Aggiungi altre regole di spesa per proteggere il flusso di cassa dell’azienda.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7433,7 +7451,14 @@ Richiedi dettagli sulle spese come ricevute e descrizioni, imposta limiti e valo
searchIn: 'Cerca in',
searchPlaceholder: 'Cerca qualcosa',
suggestions: 'Suggerimenti',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Suggerimenti disponibili${query ? ` per ${query}` : ''}. ${count} risultato.`,
other: (resultCount: number) => `Suggerimenti disponibili${query ? ` per ${query}` : ''}. ${resultCount} risultati.`,
}),
diff --git a/src/languages/ja.ts b/src/languages/ja.ts
index 348b4b72..d8e7379c 100644
--- a/src/languages/ja.ts
+++ b/src/languages/ja.ts
@@ -6560,6 +6560,24 @@ ${reportName}
title: '経費ポリシー',
cardSubtitle: 'ここはチームの経費ポリシーが保存されている場所です。何が対象になるか、全員が同じ認識を持てます。',
},
+ spendRules: {
+ title: '支出',
+ subtitle: 'Expensify カードの取引をリアルタイムで承認または却下できます。',
+ defaultRuleDescription: 'すべてのカード',
+ block: 'ブロック',
+ defaultRuleTitle: 'カテゴリ:アダルトサービス、ATM、ギャンブル、送金',
+ builtInProtectionModal: {
+ title: 'Expensify カードは、常に組み込みの保護機能を備えています',
+ description: `Expensify は常に次の利用を拒否します。
+
+ ・アダルトサービス
+ ・ATM
+ ・ギャンブル
+ ・送金
+
+会社のキャッシュフローを守るために、支出ルールをさらに追加しましょう。`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7341,7 +7359,14 @@ ${reportName}
searchIn: '検索対象',
searchPlaceholder: '何かを検索',
suggestions: '提案',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `候補があります${query ? `: ${query}` : ''}。${count}件の結果。`,
other: (resultCount: number) => `候補があります${query ? `: ${query}` : ''}。${resultCount}件の結果。`,
}),
diff --git a/src/languages/nl.ts b/src/languages/nl.ts
index 538619e0..924b4583 100644
--- a/src/languages/nl.ts
+++ b/src/languages/nl.ts
@@ -6613,6 +6613,24 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
title: 'Declaratiebeleid',
cardSubtitle: 'Hier staat het declaratiebeleid van je team, zodat iedereen hetzelfde beeld heeft van wat er wordt vergoed.',
},
+ spendRules: {
+ title: 'Uitgaven',
+ subtitle: 'Keur transacties met de Expensify Kaart in realtime goed of wijs ze af.',
+ defaultRuleDescription: 'Alle kaarten',
+ block: 'Blokkeren',
+ defaultRuleTitle: 'Categorieën: Diensten voor volwassenen, geldautomaten, gokken, geldoverdrachten',
+ builtInProtectionModal: {
+ title: 'Expensify Kaarten bieden altijd ingebouwde bescherming',
+ description: `Expensify wijst deze transacties altijd af:
+
+ • Seksdiensten
+ • Geldautomaten (ATM's)
+ • Gokken
+ • Geldoverschrijvingen
+
+Voeg meer bestedingsregels toe om de cashflow van je bedrijf te beschermen.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7399,7 +7417,14 @@ Vereis onkostendetails zoals bonnen en beschrijvingen, stel limieten en standaar
searchIn: 'Zoeken in',
searchPlaceholder: 'Zoek iets',
suggestions: 'Suggesties',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Suggesties beschikbaar${query ? ` voor ${query}` : ''}. ${count} resultaat.`,
other: (resultCount: number) => `Suggesties beschikbaar${query ? ` voor ${query}` : ''}. ${resultCount} resultaten.`,
}),
diff --git a/src/languages/pl.ts b/src/languages/pl.ts
index 84265236..0577802a 100644
--- a/src/languages/pl.ts
+++ b/src/languages/pl.ts
@@ -6608,6 +6608,24 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
title: 'Polityka wydatków',
cardSubtitle: 'To tutaj znajduje się polityka wydatków Twojego zespołu, aby wszyscy mieli jasność co do tego, co jest objęte.',
},
+ spendRules: {
+ title: 'Wydatki',
+ subtitle: 'Zatwierdzaj lub odrzucaj transakcje Kartą Expensify w czasie rzeczywistym.',
+ defaultRuleDescription: 'Wszystkie karty',
+ block: 'Zablokuj',
+ defaultRuleTitle: 'Kategorie: usługi dla dorosłych, bankomaty, hazard, przelewy pieniężne',
+ builtInProtectionModal: {
+ title: 'Karty Expensify zapewniają wbudowaną ochronę – zawsze',
+ description: `Expensify zawsze odrzuca te obciążenia:
+
+ • Usługi dla dorosłych
+ • Bankomaty
+ • Hazard
+ • Przelewy pieniężne
+
+Dodaj więcej zasad wydatków, żeby chronić przepływy pieniężne firmy.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7400,7 +7418,14 @@ Wymagaj szczegółów wydatków, takich jak paragony i opisy, ustawiaj limity i
searchIn: 'Szukaj w',
searchPlaceholder: 'Wyszukaj coś',
suggestions: 'Sugestie',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Dostępne sugestie${query ? ` dla ${query}` : ''}. ${count} wynik.`,
other: (resultCount: number) => `Dostępne sugestie${query ? ` dla ${query}` : ''}. ${resultCount} wyniki.`,
}),
diff --git a/src/languages/pt-BR.ts b/src/languages/pt-BR.ts
index 80ba6a31..efd53c34 100644
--- a/src/languages/pt-BR.ts
+++ b/src/languages/pt-BR.ts
@@ -6612,6 +6612,24 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
title: 'Política de despesas',
cardSubtitle: 'Aqui é onde fica a política de despesas da sua equipe, para que todo mundo esteja alinhado sobre o que é coberto.',
},
+ spendRules: {
+ title: 'Gasto',
+ subtitle: 'Aprove ou recuse transações do Cartão Expensify em tempo real.',
+ defaultRuleDescription: 'Todos os cartões',
+ block: 'Bloquear',
+ defaultRuleTitle: 'Categorias: Serviços adultos, caixas eletrônicos, jogos de azar, transferências de dinheiro',
+ builtInProtectionModal: {
+ title: 'Os Cartões Expensify oferecem proteção integrada — sempre',
+ description: `A Expensify sempre recusa estas cobranças:
+
+ • Serviços adultos
+ • Caixas eletrônicos (ATMs)
+ • Jogos de azar
+ • Transferências de dinheiro
+
+Adicione mais regras de gasto para proteger o fluxo de caixa da empresa.`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7387,7 +7405,14 @@ Exija dados de despesas como recibos e descrições, defina limites e padrões e
searchIn: 'Pesquisar em',
searchPlaceholder: 'Pesquisar algo',
suggestions: 'Sugestões',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `Sugestões disponíveis${query ? ` para ${query}` : ''}. ${count} resultado.`,
other: (resultCount: number) => `Sugestões disponíveis${query ? ` para ${query}` : ''}. ${resultCount} resultados.`,
}),
diff --git a/src/languages/zh-hans.ts b/src/languages/zh-hans.ts
index f1ffd1b9..20a0343b 100644
--- a/src/languages/zh-hans.ts
+++ b/src/languages/zh-hans.ts
@@ -6448,6 +6448,24 @@ ${reportName}
title: '报销政策',
cardSubtitle: '这是你们团队的报销政策所在之处,让所有人都清楚哪些内容在报销范围之内。',
},
+ spendRules: {
+ title: '支出',
+ subtitle: '实时批准或拒绝 Expensify 卡交易。',
+ defaultRuleDescription: '所有卡片',
+ block: '屏蔽',
+ defaultRuleTitle: '类别:成人服务、自动取款机、赌博、转账',
+ builtInProtectionModal: {
+ title: 'Expensify 卡提供始终内置的保护',
+ description: `Expensify 始终会拒绝以下消费:
+
+ • 成人服务
+ • 自动取款机(ATM)
+ • 赌博
+ • 转账汇款
+
+添加更多消费规则,保护公司的现金流。`,
+ },
+ },
},
planTypePage: {
planTypes: {
@@ -7217,7 +7235,14 @@ ${reportName}
searchIn: '搜索范围',
searchPlaceholder: '搜索内容',
suggestions: '建议',
- suggestionsAvailable: ({count}: {count: number}, query = '') => ({
+ suggestionsAvailable: (
+ {
+ count,
+ }: {
+ count: number;
+ },
+ query = '',
+ ) => ({
one: `有可用建议${query ? `:${query}` : ''}。共${count}条结果。`,
other: (resultCount: number) => `有可用建议${query ? `:${query}` : ''}。共${resultCount}条结果。`,
}),
Note You can apply these changes to your branch by copying the patch to your clipboard, then running |
Codecov Report❌ Looks like you've decreased code coverage for some files. Please write tests to increase, or at least maintain, the existing level of code coverage. See our documentation here for how to interpret this table.
|
|
@codex review |
|
Codex Review: Didn't find any major issues. Delightful! ℹ️ About Codex in GitHubCodex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
If Codex has suggestions, it will comment; otherwise it will react with 👍. When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback". |
|
@jayeshmangwani 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] |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 7965f36d87
ℹ️ About Codex in GitHub
Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".
Explanation of Change
Adds the new
Spendsection to rules. For now this section only shows the default rules that apply to all Expensify cards. Clicking the rule opens a modal with further clarification.Fixed Issues
$ #86520
Tests
Pre-requisite:
Workspace > RulesSpendat the bottom of the pageAll cardsrule shows a modalGot itOffline tests
N/A
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)src/languages/*files and using the translation methodSTYLE.md) were followedAvatar, 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.ScrollViewcomponent to make it scrollable when more elements are added to the page.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps./** comment above it */thisproperly so there are no scoping issues (i.e. foronClick={this.submit}the methodthis.submitshould be bound tothisin the constructor)thisare necessary to be bound (i.e. avoidthis.submit = this.submit.bind(this);ifthis.submitis never passed to a component event handler likeonClick)Screenshots/Videos
Screen.Recording.2026-03-27.at.2.15.46.PM.mov
Screen.Recording.2026-03-27.at.2.16.40.PM.mov
Android: Native
Android: mWeb Chrome
iOS: Native
iOS: mWeb Safari
MacOS: Chrome / Safari