Skip to content

Commit 6246cbf

Browse files
committed
Merge branch 'main' into bump-react-native-localize
2 parents 22381c9 + 65494fd commit 6246cbf

53 files changed

Lines changed: 666 additions & 203 deletions

Some content is hidden

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

src/CONST/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3778,6 +3778,7 @@ const CONST = {
37783778
SEARCH_QUERY_LIMIT: 1000,
37793779
WORKSPACE_NAME_CHARACTER_LIMIT: 80,
37803780
STATE_CHARACTER_LIMIT: 32,
3781+
REPORT_TITLE_FORMULA_LIMIT: 500,
37813782

37823783
// Test receipt data
37833784
TEST_RECEIPT: {

src/components/ReportActionItem/MoneyRequestView.tsx

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -194,12 +194,14 @@ function MoneyRequestView({
194194
const isTransactionScanning = isScanning(updatedTransaction ?? transaction);
195195
const hasRoute = hasRouteTransactionUtils(transactionBackup ?? transaction, isDistanceRequest);
196196

197+
const actualAttendees = isFromMergeTransaction && updatedTransaction ? updatedTransaction.comment?.attendees : transactionAttendees;
198+
197199
// Use the updated transaction amount in merge flow to have correct positive/negative sign
198200
const actualAmount = isFromMergeTransaction && updatedTransaction ? updatedTransaction.amount : transactionAmount;
199201
const actualCurrency = updatedTransaction ? getCurrency(updatedTransaction) : transactionCurrency;
200202
const shouldDisplayTransactionAmount = ((isDistanceRequest && hasRoute) || !!actualAmount) && actualAmount !== undefined;
201203
const formattedTransactionAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount, actualCurrency) : '';
202-
const formattedPerAttendeeAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount / (transactionAttendees?.length ?? 1), actualCurrency) : '';
204+
const formattedPerAttendeeAmount = shouldDisplayTransactionAmount ? convertToDisplayString(actualAmount / (actualAttendees?.length ?? 1), actualCurrency) : '';
203205

204206
const formattedOriginalAmount = transactionOriginalAmount && transactionOriginalCurrency && convertToDisplayString(transactionOriginalAmount, transactionOriginalCurrency);
205207
const isCardTransaction = isCardTransactionTransactionUtils(transaction);
@@ -782,9 +784,9 @@ function MoneyRequestView({
782784
<OfflineWithFeedback pendingAction={getPendingFieldAction('attendees')}>
783785
<MenuItemWithTopDescription
784786
key="attendees"
785-
title={Array.isArray(transactionAttendees) ? transactionAttendees.map((item) => item?.displayName ?? item?.login).join(', ') : ''}
787+
title={Array.isArray(actualAttendees) ? actualAttendees.map((item) => item?.displayName ?? item?.login).join(', ') : ''}
786788
description={`${translate('iou.attendees')} ${
787-
Array.isArray(transactionAttendees) && transactionAttendees.length > 1 && formattedPerAttendeeAmount
789+
Array.isArray(actualAttendees) && actualAttendees.length > 1 && formattedPerAttendeeAmount
788790
? `${CONST.DOT_SEPARATOR} ${formattedPerAttendeeAmount} ${translate('common.perPerson')}`
789791
: ''
790792
}`}

src/components/SelectionList/ListItem/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ type ListItem<K extends string | number = string> = {
111111
itemStyle?: StyleProp<ViewStyle>;
112112

113113
/** Boolean whether to display the right icon */
114-
shouldShowRightIcon?: boolean;
114+
shouldShowRightCaret?: boolean;
115115

116116
/** Whether product training tooltips can be displayed */
117117
canShowProductTrainingTooltip?: boolean;
@@ -249,6 +249,8 @@ type BaseListItemProps<TItem extends ListItem> = CommonListItemProps<TItem> & {
249249
testID?: string;
250250
/** Whether to show the default right hand side checkmark */
251251
shouldUseDefaultRightHandSideCheckmark?: boolean;
252+
/** Whether to show the right caret icon */
253+
shouldShowRightCaret?: boolean;
252254
};
253255
type RadioListItemProps<TItem extends ListItem> = ListItemProps<TItem>;
254256

src/components/SelectionListWithModal/CustomListHeader.tsx

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,10 @@ type CustomListHeaderProps = {
99
leftHeaderText?: string | undefined;
1010
rightHeaderText?: string | undefined;
1111
rightHeaderMinimumWidth?: number;
12+
shouldShowRightCaret?: boolean;
1213
};
1314

14-
function CustomListHeader({canSelectMultiple, leftHeaderText = '', rightHeaderText = '', rightHeaderMinimumWidth = 60}: CustomListHeaderProps) {
15+
function CustomListHeader({canSelectMultiple, leftHeaderText = '', rightHeaderText = '', rightHeaderMinimumWidth = 60, shouldShowRightCaret = false}: CustomListHeaderProps) {
1516
const styles = useThemeStyles();
1617
const StyleUtils = useStyleUtils();
1718

@@ -26,7 +27,7 @@ function CustomListHeader({canSelectMultiple, leftHeaderText = '', rightHeaderTe
2627
]}
2728
>
2829
<Text style={styles.textMicroSupporting}>{leftHeaderText}</Text>
29-
<View style={[StyleUtils.getMinimumWidth(rightHeaderMinimumWidth)]}>
30+
<View style={[StyleUtils.getMinimumWidth(rightHeaderMinimumWidth), shouldShowRightCaret && styles.mr6]}>
3031
<Text style={[styles.textMicroSupporting, styles.textAlignCenter]}>{rightHeaderText}</Text>
3132
</View>
3233
</View>

src/components/SelectionListWithSections/BaseListItem.tsx

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ function BaseListItem<TItem extends ListItem>({
4242
testID,
4343
shouldUseDefaultRightHandSideCheckmark = true,
4444
forwardedFSClass,
45+
shouldShowRightCaret = false,
4546
}: BaseListItemProps<TItem>) {
4647
const theme = useTheme();
4748
const styles = useThemeStyles();
@@ -152,6 +153,17 @@ function BaseListItem<TItem extends ListItem>({
152153
)}
153154

154155
{rightHandSideComponentRender()}
156+
{shouldShowRightCaret && (
157+
<View style={[styles.justifyContentCenter, styles.alignItemsCenter, styles.ml2]}>
158+
<Icon
159+
src={Expensicons.ArrowRight}
160+
fill={theme.icon}
161+
additionalStyles={[styles.alignSelfCenter, !hovered && styles.opacitySemiTransparent]}
162+
isButtonIcon
163+
medium
164+
/>
165+
</View>
166+
)}
155167
</View>
156168
{FooterComponent}
157169
</PressableWithFeedback>

src/components/SelectionListWithSections/BaseSelectionListItemRenderer.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ function BaseSelectionListItemRenderer<TItem extends ListItem>({
5555
isUserValidated,
5656
personalDetails,
5757
userBillingFundID,
58+
shouldShowRightCaret,
5859
}: BaseSelectionListItemRendererProps<TItem>) {
5960
const handleOnCheckboxPress = () => {
6061
if (isTransactionGroupListItemType(item)) {
@@ -111,6 +112,7 @@ function BaseSelectionListItemRenderer<TItem extends ListItem>({
111112
personalDetails={personalDetails}
112113
userBillingFundID={userBillingFundID}
113114
index={index}
115+
shouldShowRightCaret={shouldShowRightCaret}
114116
/>
115117
{item.footerContent && item.footerContent}
116118
</>

src/components/SelectionListWithSections/BaseSelectionListWithSections.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ function BaseSelectionListWithSections<TItem extends ListItem>({
149149
isSelected,
150150
canShowProductTrainingTooltip,
151151
renderScrollComponent,
152+
shouldShowRightCaret,
152153
ref,
153154
}: SelectionListProps<TItem>) {
154155
const styles = useThemeStyles();
@@ -680,6 +681,7 @@ function BaseSelectionListWithSections<TItem extends ListItem>({
680681
singleExecution={singleExecution}
681682
titleContainerStyles={listItemTitleContainerStyles}
682683
canShowProductTrainingTooltip={canShowProductTrainingTooltipMemo}
684+
shouldShowRightCaret={shouldShowRightCaret}
683685
/>
684686
</View>
685687
);

src/components/SelectionListWithSections/TableListItem.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ function TableListItem<TItem extends ListItem>({
2828
shouldSyncFocus,
2929
titleContainerStyles,
3030
shouldUseDefaultRightHandSideCheckmark,
31+
shouldShowRightCaret,
3132
}: TableListItemProps<TItem>) {
3233
const styles = useThemeStyles();
3334
const theme = useTheme();
@@ -82,6 +83,7 @@ function TableListItem<TItem extends ListItem>({
8283
shouldSyncFocus={shouldSyncFocus}
8384
hoverStyle={item.isSelected && styles.activeComponentBG}
8485
shouldUseDefaultRightHandSideCheckmark={shouldUseDefaultRightHandSideCheckmark}
86+
shouldShowRightCaret={shouldShowRightCaret}
8587
>
8688
{(hovered) => (
8789
<>

src/components/SelectionListWithSections/types.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,9 @@ type CommonListItemProps<TItem extends ListItem> = {
108108

109109
/** Callback to fire when the item is long pressed */
110110
onLongPressRow?: (item: TItem) => void;
111+
112+
/** Whether to show the right caret */
113+
shouldShowRightCaret?: boolean;
111114
} & TRightHandSideComponent<TItem>;
112115

113116
type ListItemFocusEventHandler = (event: NativeSyntheticEvent<ExtendedTargetedEvent>) => void;
@@ -910,6 +913,9 @@ type SelectionListProps<TItem extends ListItem> = Partial<ChildrenProps> & {
910913

911914
/** Custom scroll component to use instead of the default ScrollView */
912915
renderScrollComponent?: (props: ScrollViewProps) => ReactElement<ScrollViewProps, string | JSXElementConstructor<unknown>>;
916+
917+
/** Whether to show the right caret icon */
918+
shouldShowRightCaret?: boolean;
913919
} & TRightHandSideComponent<TItem>;
914920

915921
type SelectionListHandle = {

src/languages/de.ts

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,8 @@ const translations = {
659659
reschedule: 'Verschieben',
660660
general: 'Allgemein',
661661
workspacesTabTitle: 'Arbeitsbereiche',
662+
getTheApp: 'App herunterladen',
663+
scanReceiptsOnTheGo: 'Scannen Sie Belege mit Ihrem Telefon',
662664
headsUp: 'Achtung!',
663665
submitTo: 'Einreichen an',
664666
forwardTo: 'Weiterleiten an',
@@ -1046,6 +1048,10 @@ const translations = {
10461048
receipt: {
10471049
upload: 'Beleg hochladen',
10481050
uploadMultiple: 'Belege hochladen',
1051+
dragReceiptBeforeEmail: 'Ziehen Sie eine Quittung auf diese Seite oder leiten Sie eine Quittung weiter an',
1052+
dragReceiptsBeforeEmail: 'Ziehen Sie Belege auf diese Seite oder leiten Sie Belege weiter an',
1053+
dragReceiptAfterEmail: 'oder wählen Sie eine Datei zum Hochladen aus.',
1054+
dragReceiptsAfterEmail: 'oder wählen Sie Dateien zum Hochladen unten aus.',
10491055
desktopSubtitleSingle: `oder hierher ziehen und ablegen`,
10501056
desktopSubtitleMultiple: `oder hierher ziehen und ablegen`,
10511057
chooseReceipt: 'Wählen Sie eine Quittung zum Hochladen aus oder leiten Sie eine Quittung weiter an',
@@ -1493,6 +1499,7 @@ const translations = {
14931499
pageTitle: 'Wähle die Details, die du behalten möchtest:',
14941500
noDifferences: 'Keine Unterschiede zwischen den Transaktionen gefunden',
14951501
pleaseSelectError: ({field}: {field: string}) => `Bitte wähle ein(e) ${field}`,
1502+
pleaseSelectAttendees: 'Bitte wähle teilnehmer',
14961503
selectAllDetailsError: 'Wähle alle Details, bevor du fortfährst.',
14971504
},
14981505
confirmationPage: {
@@ -1562,10 +1569,7 @@ const translations = {
15621569
subtitle: 'Aktivieren Sie die Zwei-Faktor-Authentifizierung, um Ihr Konto zu schützen.',
15631570
goToSecurity: 'Zurück zur Sicherheitsseite',
15641571
},
1565-
shareCodePage: {
1566-
title: 'Ihr Code',
1567-
subtitle: 'Laden Sie Mitglieder zu Expensify ein, indem Sie Ihren persönlichen QR-Code oder Empfehlungslink teilen.',
1568-
},
1572+
shareCodePage: {title: 'Ihr Code', subtitle: 'Laden Sie Mitglieder zu Expensify ein, indem Sie Ihren persönlichen QR-Code oder Empfehlungslink teilen.'},
15691573
pronounsPage: {
15701574
pronouns: 'Pronomen',
15711575
isShownOnProfile: 'Ihre Pronomen werden in Ihrem Profil angezeigt.',
@@ -1576,8 +1580,8 @@ const translations = {
15761580
contactMethods: 'Kontaktmethoden',
15771581
featureRequiresValidate: 'Diese Funktion erfordert, dass Sie Ihr Konto verifizieren.',
15781582
validateAccount: 'Bestätigen Sie Ihr Konto',
1579-
helpTextBeforeEmail: 'Fügen Sie weitere Möglichkeiten hinzu, damit Leute Sie finden können, und leiten Sie Belege weiter an',
1580-
helpTextAfterEmail: 'von mehreren E-Mail-Adressen.',
1583+
helpTextBeforeEmail: 'Fügen Sie weitere Möglichkeiten hinzu, Belege zu senden. Leiten Sie sie weiter an',
1584+
helpTextAfterEmail: 'oder senden Sie ihnen eine SMS an 47777 (nur US-Nummern).',
15811585
pleaseVerify: 'Bitte überprüfen Sie diese Kontaktmethode',
15821586
getInTouch: 'Wann immer wir mit Ihnen in Kontakt treten müssen, werden wir diese Kontaktmethode verwenden.',
15831587
enterMagicCode: ({contactMethod}: EnterMagicCodeParams) =>
@@ -2024,6 +2028,8 @@ const translations = {
20242028
workflowsPage: {
20252029
workflowTitle: 'Ausgaben',
20262030
workflowDescription: 'Konfigurieren Sie einen Workflow ab dem Moment, in dem Ausgaben anfallen, einschließlich Genehmigung und Zahlung.',
2031+
delaySubmissionTitle: 'Einreichungen verzögern',
2032+
delaySubmissionDescription: 'Wählen Sie einen benutzerdefinierten Zeitplan für die Einreichung von Ausgaben oder lassen Sie dies aus, um Echtzeit-Updates über Ausgaben zu erhalten.',
20272033
submissionFrequency: 'Einreichungshäufigkeit',
20282034
submissionFrequencyDescription: 'Wählen Sie eine Häufigkeit für die Übermittlung von Ausgaben.',
20292035
submissionFrequencyDateOfMonth: 'Datum des Monats',
@@ -2077,6 +2083,7 @@ const translations = {
20772083
},
20782084
},
20792085
workflowsDelayedSubmissionPage: {
2086+
autoReportingErrorMessage: 'Die verspätete Einreichung konnte nicht geändert werden. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support.',
20802087
autoReportingFrequencyErrorMessage: 'Die Einreichungshäufigkeit konnte nicht geändert werden. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support.',
20812088
monthlyOffsetErrorMessage: 'Die monatliche Frequenz konnte nicht geändert werden. Bitte versuchen Sie es erneut oder kontaktieren Sie den Support.',
20822089
},
@@ -6252,6 +6259,7 @@ const translations = {
62526259
groupBy: 'Gruppe nach',
62536260
moneyRequestReport: {
62546261
emptyStateTitle: 'Dieser Bericht enthält keine Ausgaben.',
6262+
emptyStateSubtitle: 'Sie können Ausgaben zu diesem Bericht hinzufügen, indem Sie die Schaltfläche unten oder die Option "Ausgabe hinzufügen" im Menü "Mehr" oben verwenden.',
62556263
},
62566264
noCategory: 'Keine Kategorie',
62576265
noTag: 'Kein Tag',

0 commit comments

Comments
 (0)