Skip to content

Commit 110e327

Browse files
committed
fix: resolve conflicts
2 parents 16754f8 + 3392aec commit 110e327

373 files changed

Lines changed: 3838 additions & 3394 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/generateTranslations.yml

Lines changed: 48 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,35 +5,55 @@ on:
55
types: [opened, synchronize]
66
paths: ['src/languages/en.ts']
77

8+
workflow_dispatch:
9+
inputs:
10+
PULL_REQUEST_URL:
11+
description: 'The full URL of the E/App pull request'
12+
required: true
13+
type: string
14+
815
jobs:
916
generateTranslations:
1017
runs-on: ubuntu-latest
11-
if: ${{ !github.event.pull_request.head.repo.fork }}
18+
if: ${{ github.event_name == 'workflow_dispatch' || !github.event.pull_request.head.repo.fork }}
1219
steps:
20+
- name: Get PR details
21+
id: pr-data
22+
run: |
23+
if [ "${{ github.event_name }}" == "workflow_dispatch" ]; then
24+
echo "::notice::🔧 Manual workflow dispatch triggered"
25+
PR_INFO=$(gh pr view "${{ inputs.PULL_REQUEST_URL }}" --json number,baseRefName,headRefOid)
26+
{
27+
echo "PR_NUMBER=$(echo "$PR_INFO" | jq -r '.number')"
28+
echo "BASE_REF=$(echo "$PR_INFO" | jq -r '.baseRefName')"
29+
echo "HEAD_SHA=$(echo "$PR_INFO" | jq -r '.headRefOid')"
30+
} >> "$GITHUB_OUTPUT"
31+
echo "::notice::✅ Processing PR #$(echo "$PR_INFO" | jq -r '.number')"
32+
else
33+
echo "::notice::🤖 Automatic PR trigger activated"
34+
{
35+
echo "PR_NUMBER=${{ github.event.pull_request.number }}"
36+
echo "BASE_REF=${{ github.event.pull_request.base.ref }}"
37+
echo "HEAD_SHA=${{ github.event.pull_request.head.sha }}"
38+
} >> "$GITHUB_OUTPUT"
39+
echo "::notice::✅ Processing PR #${{ github.event.pull_request.number }}"
40+
fi
41+
env:
42+
GITHUB_TOKEN: ${{ github.token }}
43+
1344
# v4
1445
- name: Checkout
1546
uses: actions/checkout@8ade135a41bc03ea155e62e844d188df1ea18608
1647
with:
17-
ref: ${{ github.event.pull_request.head.sha }}
48+
ref: ${{ steps.pr-data.outputs.HEAD_SHA }}
1849

1950
- name: Setup Node
2051
uses: ./.github/actions/composite/setupNode
2152

2253
- name: Check if English translations were modified
2354
id: check-en-changes
2455
run: |
25-
if [[ "${{ github.event.action }}" == "opened" ]]; then
26-
# For newly opened PRs, check if en.ts was changed in the entire PR
27-
echo "🆕 PR was just opened - checking entire PR for en.ts changes"
28-
if gh pr diff ${{ github.event.pull_request.number }} --name-only | grep -q "^src/languages/en\.ts$"; then
29-
echo "EN_CHANGED=true" >> "$GITHUB_OUTPUT"
30-
echo "✅ English translations were modified in this PR - will generate translations"
31-
else
32-
echo "EN_CHANGED=false" >> "$GITHUB_OUTPUT"
33-
echo "⏭️ English translations were not modified in this PR - skipping translation generation"
34-
fi
35-
else
36-
# For synchronize events, only check the new commits that were just pushed
56+
if [[ "${{ github.event.action }}" == "synchronize" ]]; then
3757
echo "🔄 PR was updated - checking only the new commits for en.ts changes"
3858
git fetch --no-tags --depth=1 --no-recurse-submodules origin ${{ github.event.before }}
3959
if git diff --name-only ${{ github.event.before }} ${{ github.event.after }} | grep -q "^src/languages/en\.ts$"; then
@@ -43,17 +63,26 @@ jobs:
4363
echo "EN_CHANGED=false" >> "$GITHUB_OUTPUT"
4464
echo "⏭️ English translations were not modified in the new commits - skipping translation generation"
4565
fi
66+
else
67+
echo "🆕|🔧 Newly opened PR or manually dispatched, so checking entire PR for en.ts changes"
68+
if gh pr diff ${{ steps.pr-data.outputs.PR_NUMBER }} --name-only | grep -q "^src/languages/en\.ts$"; then
69+
echo "EN_CHANGED=true" >> "$GITHUB_OUTPUT"
70+
echo "✅ English translations were modified in this PR - will generate translations"
71+
else
72+
echo "EN_CHANGED=false" >> "$GITHUB_OUTPUT"
73+
echo "⏭️ English translations were not modified in this PR - skipping translation generation"
74+
fi
4675
fi
4776
env:
4877
GITHUB_TOKEN: ${{ github.token }}
4978

5079
- name: Fetch base ref
5180
if: steps.check-en-changes.outputs.EN_CHANGED == 'true'
52-
run: git fetch --no-tags --depth=1 --no-recurse-submodules origin +refs/heads/${{ github.event.pull_request.base.ref }}:refs/heads/${{ github.event.pull_request.base.ref }}
81+
run: git fetch --no-tags --depth=1 --no-recurse-submodules origin +refs/heads/${{ steps.pr-data.outputs.BASE_REF }}:refs/heads/${{ steps.pr-data.outputs.BASE_REF }}
5382

5483
- name: Run generateTranslations for added translations
5584
if: steps.check-en-changes.outputs.EN_CHANGED == 'true'
56-
run: npx ts-node ./scripts/generateTranslations.ts --verbose --compare-ref=${{ github.event.pull_request.base.ref }}
85+
run: npx ts-node ./scripts/generateTranslations.ts --verbose --compare-ref=${{ steps.pr-data.outputs.BASE_REF }}
5786
env:
5887
GITHUB_TOKEN: ${{ github.token }}
5988
OPENAI_API_KEY: ${{ secrets.PROPOSAL_POLICE_API_KEY }}
@@ -74,7 +103,7 @@ jobs:
74103
continue-on-error: true
75104
if: steps.check-en-changes.outputs.EN_CHANGED == 'true' && steps.checkDiff.outputs.HAS_DIFF == 'true'
76105
run: |
77-
EXISTING_COMMENTS="$(gh pr view ${{ github.event.pull_request.number }} --json comments --jq '.comments[] | select(.body | startswith("## 🦜 Polyglot Parrot! 🦜")) | .id')"
106+
EXISTING_COMMENTS="$(gh pr view ${{ steps.pr-data.outputs.PR_NUMBER }} --json comments --jq '.comments[] | select(.body | startswith("## 🦜 Polyglot Parrot! 🦜")) | .id')"
78107
if [[ -z "$EXISTING_COMMENTS" ]]; then
79108
echo "🦗 No existing Polyglot Parrot comments found"
80109
else
@@ -140,7 +169,7 @@ jobs:
140169
else
141170
# Large diff - upload as gist and link
142171
echo "📁 Creating gist for large diff..."
143-
GIST_URL=$(gh gist create "$TEMP_PATCH_FILE" --desc "🦜 Polyglot Parrot translations for PR #${{ github.event.pull_request.number }}" --filename "translations.patch")
172+
GIST_URL=$(gh gist create "$TEMP_PATCH_FILE" --desc "🦜 Polyglot Parrot translations for PR #${{ steps.pr-data.outputs.PR_NUMBER }}" --filename "translations.patch")
144173
{
145174
echo "$PARROT_HEADER"
146175
echo
@@ -155,7 +184,7 @@ jobs:
155184
fi
156185
157186
# Post comment using the temp file
158-
gh pr comment ${{ github.event.pull_request.number }} --body-file "$TEMP_COMMENT_FILE"
187+
gh pr comment ${{ steps.pr-data.outputs.PR_NUMBER }} --body-file "$TEMP_COMMENT_FILE"
159188
env:
160189
# Use OS_BOTIFY_TOKEN so that we can create a gist
161190
GITHUB_TOKEN: ${{ secrets.OS_BOTIFY_TOKEN }}

Mobile-Expensify

android/app/build.gradle

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ android {
114114
minSdkVersion rootProject.ext.minSdkVersion
115115
targetSdkVersion rootProject.ext.targetSdkVersion
116116
multiDexEnabled rootProject.ext.multiDexEnabled
117-
versionCode 1009021803
118-
versionName "9.2.18-3"
117+
versionCode 1009021806
118+
versionName "9.2.18-6"
119119
// Supported language variants must be declared here to avoid from being removed during the compilation.
120120
// This also helps us to not include unnecessary language variants in the APK.
121121
resConfigs "en", "es"

contributingGuides/philosophies/INTERNATIONALIZATION.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,14 @@ All translations are stored in language files in [src/languages](https://github.
2929
### - Common phrases SHOULD be shared when used in multiple places
3030
A common rule of thumb is to move a common word/phrase to be shared when it's used in 3 or more places.
3131

32-
### - Complex translation strings MUST use arrow function format
33-
Always prefer longer and more complex strings in the translation files. For example, if you need to generate the text `User has sent $20.00 to you on Oct 25th at 10:05am`, add just one key to the translation file and use the arrow function version:
32+
### - Complex translation strings MUST NOT be split up for formatting or value injection
33+
Always prefer to use arrow functions and/or HTML to produce rich text in translation files. For example, if you need to generate the text `User has sent $20.00 to you on Oct 25th at 10:05am`, add just one key to the translation file and use the arrow function version:
3434

3535
```javascript
36-
nameOfTheKey: ({amount, dateTime}) => `User has sent ${amount} to you on ${datetime}`,
36+
nameOfTheKey: ({amount, dateTime}) => `User has sent <strong>${amount}</strong> to you on <a>${datetime}</a>`,
3737
```
3838

39-
This is because the order of phrases might vary from one language to another.
39+
This is because the order of phrases might vary from one language to another, and LLMs will be able to produce better translations will the full context of the phrase. If rich formatting is needed, use HTML in the string and render it with react-native-render-html.
4040

4141
### - Plural forms MUST be handled correctly using plural translation objects
4242
When working with translations that involve plural forms, it's important to handle different cases correctly:

cspell.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -668,6 +668,7 @@
668668
"unapproves",
669669
"unassigning",
670670
"Unassigning",
671+
"unassignment",
671672
"unassigns",
672673
"uncategorized",
673674
"Undelete",
Lines changed: 39 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,75 @@
11
---
22
title: Delete Expenses
3-
description: Learn how to delete expenses from reports in New Expensify, including rules for personal and company card expenses.
3+
description: Learn how to delete personal or company card expenses in New Expensify, including rules for submitted reports and admin-only deletion cases.
44
keywords: [New Expensify, delete expenses, remove expense, company card, undo submit, draft expense, report expense, expense deletion]
55
---
66

7+
<div id="new-expensify" markdown="1">
78

8-
Do you need to remove an expense in New Expensify? The steps differ depending on whether the expense is still open or already submitted. This guide covers how to remove company card and personal expenses.
9+
Need to delete an expense in New Expensify? Whether it’s a personal expense, a company card transaction, or one on a submitted report, this guide walks through your options.
910

10-
# Delete an Individual Expense
11+
# Delete an individual expense
1112

12-
1. From the navigation tabs (on the left on web, and at the bottom on mobile), head to **Reports > Expenses**.
13+
1. In the left-hand menu, select **Reports > Expenses**.
1314
2. Check the box next to the expense(s).
1415
3. Click the green **Selected** button and choose **Delete**.
1516

16-
---
17-
18-
# Delete an Expense on an Open Expense Report
17+
# Delete an expense on an open expense report
1918

20-
You can delete any out-of-pocket expense that hasn’t been submitted yet:
19+
You can delete any personal (out-of-pocket) expense that hasn’t been submitted yet:
2120

22-
1. From the navigation tabs (on the left on web, and at the bottom on mobile), head to **Reports > Reports**.
21+
1. In the left-hand menu, select **Reports > Expense Reports**.
2322
2. Open the report containing the expense.
24-
3. Select the checkbox next to the expense you want to delete.
25-
4. Choose **Delete** from the drop-down menu.
26-
27-
---
23+
3. Check the box next to the expense you want to remove.
24+
4. Click the green **Selected** button and choose **Delete**.
2825

29-
# The Expense Report is Submitted or Marked as "Done"
26+
# The report is submitted or marked as "Done"
3027

31-
You’ll need to reopen the report first:
28+
To delete an expense on a submitted report, you'll need to reopen it first:
3229

33-
1. Tap **Undo submit** or **Undo close**.
34-
2. Once reopened, follow the steps above to delete any eligible expenses.
30+
1. Click **Undo submit** or **Undo close**.
31+
2. Then follow the deletion steps above.
3532

3633
**Note:** You can only undo reports that are in the **Closed** or **Processing** state. Reports that are **Approved** or **Paid** cannot be reopened.
3734

38-
---
35+
# Deleting company card expenses
36+
37+
Some company card expenses can’t be deleted if the card settings don’t allow it. This typically happens if the card was imported without the **Allow deleting transactions** setting enabled.
3938

40-
# Deleting Company Card Expenses
39+
To delete future expenses:
40+
- Ask your Domain Admin to enable **Allow deleting transactions** in the company card settings.
4141

42-
Some company card expenses can’t be deleted if the card settings don’t allow it. This usually happens when the card was imported without the **Allow Deleting Transactions** setting enabled. Once **Allow Deleting Transactions** is enabled, any future imported expenses can be deleted normally.
42+
To delete **existing draft** company card expenses:
4343

44-
To delete existing company card draft expenses:
45-
1. From the navigation tabs (on the left on web, and at the bottom on mobile), go to **Workspaces > [Workspace Name] > Company cards**.
44+
1. From the left-hand menu, select **Workspaces > [Workspace Name] > Company cards**.
4645
2. Unassign the card connected to the expenses you want to delete.
4746
3. All **draft expenses** from that card will be removed automatically.
4847

49-
**Note:** Submitted expenses will stay attached to reports and cannot be deleted by unassigning the card.
48+
**Note:** Expenses that are already submitted will stay attached to reports and cannot be deleted through unassignment.
5049

51-
⚠️ **Warning:** Unassigning a company card will permanently delete **all draft expenses** imported from that card. Submitted expenses will not be affected.
52-
53-
---
50+
⚠️ **Warning:** Unassigning a company card will permanently delete **all draft expenses** from that card. Submitted expenses are not affected.
5451

5552
# FAQ
5653

5754
## Why can't I delete certain expenses?
5855

59-
Expenses tied to company cards without the **Allow deleting transactions** setting enabled cannot be deleted unless the card is unassigned.
56+
Company card expenses can’t be deleted if **Allow deleting transactions** is disabled for that card. If that's the case, only a Domain Admin can enable this setting—or unassign the card to remove draft expenses.
6057

6158
## Can I reopen a report after it’s been approved or paid?
6259

63-
No, once a report is approved or paid, it cannot be reopened. Only reports in a **Closed** or **Processing** state can be reopened to delete the expenses.
60+
No, reports in **Approved** or **Paid** status can’t be reopened. Only reports in a **Closed** or **Processing** state can be reopened to allow expense deletion.
61+
62+
## Can Expensify permanently delete expenses for me?
63+
64+
In rare cases where you can't delete expenses yourself—like locked company card transactions on restricted domains—or if there are too many to remove individually, Expensify can help. Here's how it works:
65+
66+
- Only **Workspace Admins** or **Domain Admins** can request manual deletion.
67+
- Expenses must be **unreported** or on a **draft report**.
68+
- The request must include the **report IDs**.
69+
- If possible, add all expenses you want deleted to a single report, or mark them clearly in the **expense description** (e.g. “Delete this expense”).
70+
- If eligible, Expensify Support will use a secure internal tool to delete them.
71+
72+
If you're an Admin and need help deleting unwanted expenses, reach out to Concierge with the relevant expense and report details. Once deleted, expenses can't be recovered.
73+
6474

75+
</div>

ios/NewExpensify/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@
4444
</dict>
4545
</array>
4646
<key>CFBundleVersion</key>
47-
<string>9.2.18.3</string>
47+
<string>9.2.18.6</string>
4848
<key>FullStory</key>
4949
<dict>
5050
<key>OrgId</key>

ios/NotificationServiceExtension/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.2.18</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.2.18.3</string>
16+
<string>9.2.18.6</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionPointIdentifier</key>

ios/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2193,7 +2193,7 @@ PODS:
21932193
- ReactCommon/turbomodule/bridging
21942194
- ReactCommon/turbomodule/core
21952195
- Yoga
2196-
- react-native-plaid-link-sdk (12.4.0):
2196+
- react-native-plaid-link-sdk (12.5.3):
21972197
- DoubleConversion
21982198
- glog
21992199
- hermes-engine
@@ -3879,7 +3879,7 @@ SPEC CHECKSUMS:
38793879
react-native-pager-view: 12c1b7b6f50efb3e5d57d62ea5c601cba0585bfd
38803880
react-native-pdf: 1fee221a1bdb66bb5dc14718e0687dd34f33a823
38813881
react-native-performance: ed312c0ee791c50077b7ad22b01685fe5a0e3db6
3882-
react-native-plaid-link-sdk: f4838d6095aab8f12bd4194682f779c9f0927082
3882+
react-native-plaid-link-sdk: 017d025be9fdb05151e03453bb191e0518e3fe6a
38833883
react-native-release-profiler: 3c899b04a88a63735e74beb1d1010ec8c8616347
38843884
react-native-safe-area-context: 6cec90ce53951d3b52dc73e873323a4a7662fc0c
38853885
react-native-view-shot: 70a8e604c289cc67324011554c63ee87dca04a06

ios/ShareViewController/Info.plist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
<key>CFBundleShortVersionString</key>
1414
<string>9.2.18</string>
1515
<key>CFBundleVersion</key>
16-
<string>9.2.18.3</string>
16+
<string>9.2.18.6</string>
1717
<key>NSExtension</key>
1818
<dict>
1919
<key>NSExtensionAttributes</key>

0 commit comments

Comments
 (0)